0.6.0 • Published 9 months ago

react-native-press-and-hold-button v0.6.0

Weekly downloads
-
License
MIT
Repository
github
Last release
9 months ago

react-native-press-and-hold-button

A big press and hold button component for React native

Installation

If you're using expo, react-native-svg is already included with the expo client, so no need to do anything.

If you're using react-native-cli and haven't setup react-native-svg make sure to follow Installation steps first

yarn add react-native-press-and-hold-button

Or

npm install react-native-press-and-hold-button

npm NPM GitHub issues npm bundle size npm GitHub forks GitHub Repo stars

Image

PressAndHoldButton

import { StyleSheet, Text, View } from 'react-native';

import PressAndHoldButton from 'react-native-press-and-hold-button';

export default function App() {
  return (
    <View style={styles.container}>
      <PressAndHoldButton
        size={190}
        onToggle={async () => {
          // simulate long api calls waiting time
          await new Promise((resolve, _) => setTimeout(resolve, 5000));
          // error out the response
          // throw new Error('Simulate error');
        }}
        onError={(err) => console.log((err as Error).message)}
        renderChild={(isOn: boolean, isLoading: boolean) => {
          return (
            <View
              style={[
                {
                  backgroundColor: isLoading
                    ? '#B2BEB5'
                    : isOn
                      ? 'green'
                      : 'red',
                  width: 160,
                  height: 160,
                  borderRadius: 80,
                  justifyContent: 'center',
                  alignItems: 'center',
                },
              ]}
            >
              <Text style={{ color: 'white' }}>
                {isLoading
                  ? 'Loading...'
                  : isOn
                    ? 'Button is On'
                    : 'Button is Off'}
              </Text>
            </View>
          );
        }}
        circleProps={{
          strokeWidth: 5,
          strokeColor: 'black',
          strokeLineCap: 'round',
        }}
      />
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
});

Props

Prop NameTypeRequiredDescription
sizenumberYesSpecifies the size of the button.
onToggle(state: boolean) => voidYesFunction called when the button is toggled.
renderChild(state: boolean, isLoading: boolean) => ReactNodeNoOptional function to render custom child content.
containerStyleViewStyleNoStyle for the button container.
circlePropsCirclePropsNoOptional props for the circle component.
onError(err: any) => voidNoCallback for handling errors.
longPressDurationnumberNoDuration (in ms) to trigger the long press event.
loadingAnimationEnabledbooleanNoEnables or disables the loading animation.
loadingAnimation'scale' | 'bounce'NoSpecifies the type of loading animation if enabled.

CircleProps

Prop NameTypeRequiredDescription
strokeWidthnumberYesSpecifies the width of the circle's stroke.
strokeColorstringYesDefines the color of the circle's stroke.
strokeLineCap'butt' | 'round' | 'square'YesDetermines the shape of the stroke ends.

Image

PressAndHoldButtonSemiCircle

import { Dimensions, StyleSheet, Text, View } from 'react-native';

import { PressAndHoldButtonSemiCircle } from 'react-native-press-and-hold-button';
const width = Dimensions.get('window').width;

export default function App() {
  return (
    <View style={styles.container}>
      <PressAndHoldButtonSemiCircle
        width={width}
        height={100}
        onToggle={async () => {
          // simulate long api calls waiting time
          await new Promise((resolve, _) => setTimeout(resolve, 5000));
          // error out the response
          // throw new Error('Simulate error');
        }}
        onError={(err) => console.log((err as Error).message)}
        renderChild={(isOn: boolean, isLoading: boolean) => {
          return (
            <Text style={{ color: 'white' }}>
              {isLoading
                ? 'Loading...'
                : isOn
                  ? 'Button is On'
                  : 'Button is Off'}
            </Text>
          );
        }}
        circleProps={{
          strokeWidth: 5,
          strokeColor: 'black',
          strokeLineCap: 'round',
          semiCircleColor: 'red',
          semiCircleOffset: 34,
        }}
        loadingAnimation="scale"
        longPressDuration={2000}
      />
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
});

Props

Prop NameTypeRequiredDescription
widthnumberYesThe width of the semi-circle button.
heightnumberYesThe height of the semi-circle button.
onToggle() => Promise<void>YesCallback function triggered on button toggle with an async operation.
onError(err: Error) => voidNoFunction called when an error occurs.
renderChild(isOn: boolean, isLoading: boolean) => React.ReactNodeYesFunction that renders a child component based on button state and loading.
circleProps{ strokeWidth: number; strokeColor: string; strokeLineCap: 'round'; semiCircleColor: string; semiCircleOffset: number; }NoObject for customizing the circle's appearance (e.g., color, stroke).
loadingAnimation'scale' \| 'bounce' \| 'none'NoDefines the type of animation shown during loading (e.g., scale, bounce).
longPressDurationnumberNoDuration in milliseconds for how long the button should be pressed to toggle.

CircleProps

Prop NameTypeRequiredDescription
strokeWidthnumberYesThe width of the stroke around the semi-circle.
strokeColorstringYesThe color of the stroke around the semi-circle.
strokeLineCap'round' \| 'butt' \| 'square'YesThe shape of the end of the stroke line. Default is round.
semiCircleColorstringYesThe color of the semi-circle itself.
semiCircleOffsetnumberYesThe offset position of the semi-circle, adjusting its top position.

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

0.6.0

9 months ago

0.5.0

10 months ago

0.4.0

10 months ago

0.3.0

11 months ago

0.2.0

11 months ago

0.1.0

11 months ago