Stringsaeed / react-native-tooltiplize

react native tooltip like never before, using leading packages like react-native-reanimated v2, framer-motion, and @gorhom/portal
MIT License
35 stars 1 forks source link
android ios popover react-native tooltip tooltiplize

react-native-tooltiplize

react native tooltip like never before, using leading packages like react-native-reanimated v2, framer-motion, and @gorhom/portal

Preview

With Overlay (iOS) Without Overlay (iOS) Without Overlay (Android) With Overlay (Android)
With Overlay (iOS) With Overlay With Overlay With Overlay

Features

Installation

yarn add react-native-tooltiplize

Peer Dependencies

This library needs some peer dependencies to work properly. You need to install them in your project.

npx expo install react-native-reanimated @gorhom/portal

Usage

you first need to wrap your app with PortalProvider from @gorhom/portal to provide a context for the Portal.

import { PortalProvider } from '@gorhom/portal';

const App = () => {
  return (
    <PortalProvider>
      <App />
    </PortalProvider>
  );
};

then you can use the Tooltip component

import React from 'react';
import Tooltip from 'react-native-tooltiplize';
import { PortalProvider } from '@gorhom/portal';
import { View, TouchableOpacity, StyleSheet, Text } from 'react-native';

const App = () => {
  const [isVisible, toggle] = React.useReducer((state) => !state, false);

  const renderContent = React.useCallback(() => {
    return (
      <TouchableOpacity style={styles.tooltipContainer} onPress={toggle}>
        <Text style={styles.tooltipText}>
          Welcome to React Native Tooltiplize πŸ₯³
        </Text>
      </TouchableOpacity>
    );
  }, []);

  return (
    <View style={styles.container}>
      <Tooltip
        position="top"
        offset={8}
        renderContent={renderContent}
        isVisible={isVisible}
        withOverlay
        onDismiss={toggle}
        pointerStyle={styles.pointer}
        pointerColor="green"
      >
        <TouchableOpacity onPress={toggle} style={styles.newFeature}>
          <Text style={styles.newFeatureText}>This is new cool feature</Text>
        </TouchableOpacity>
      </Tooltip>
    </View>
  );
};

export default App;

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
  tooltipContainer: {
    paddingHorizontal: 16,
    paddingVertical: 8,
    borderRadius: 8,
    shadowColor: '#000',
    shadowOffset: {
      width: 0,
      height: 2,
    },
    shadowOpacity: 0.1,
    shadowRadius: 12,
    elevation: 5,
    backgroundColor: 'green',
  },
  tooltipText: {
    fontSize: 12,
    color: 'white',
  },
  pointer: { width: 16, height: 8 },
  newFeature: {
    backgroundColor: 'white',
    padding: 16,
    borderRadius: 8,
  },
  newFeatureText: {
    fontSize: 16,
  },
});

Props

? Name Type Default Description
βœ… isVisible boolean undefined Determines whether the tooltip is visible or not.
βœ… renderContent () => ReactNode undefined the content of the tooltip
βœ… children ReactNode undefined the children component that the tooltip will point to
❌ withOverlay boolean undefined whether or not to render overlay behind the children and the Tooltip
❌ onDismiss () => void undefined a function to be called when the user presses on the overlay
❌ overlayStyle ViewStyle undefined a style object to customize how Overlay looks
❌ offset number 0 a distance added between the Tooltip and the children, Please note that the Pointer size is calculated separately
❌ pointerStyle ViewStyle undefined a style object to customize Pointer looks,
Please note: the only available styles in only width and height
❌ pointerColor string "#000000" The Pointer's color
❌ position string top top, bottom, left, and right, to control the placement of the Tooltip
❌ timingConfig WithTimingConfig { duration: 300 } the timing config for animating opening and closing of the Tooltip and Overlay,
Please note: that is from react-native-reanimated
❌ childrenStyle ViewStyle undefined the style of children
❌ renderPointer (props: PointerProps) => ReactNode undefined a render function for the pointer component takes the pointer props that you pass them as a props

TODO:

Big Thanks πŸ™

this package is heavily inspired from:

Contributing

See the contributing guide to learn how to contribute to the repository and the development workflow.

License

MIT


Made with create-react-native-library