UNPKG

react-native-copilot

Version:

Make an interactive step by step tour guide for you react-native app

1 lines 57 kB
{"version":3,"sources":["../src/components/style.ts","../src/components/SvgMask.tsx","../src/components/ViewMask.tsx","../src/components/default-ui/StepNumber.tsx","../src/contexts/CopilotProvider.tsx","../src/components/CopilotModal.tsx","../src/components/default-ui/Tooltip.tsx","../src/components/default-ui/Button.tsx","../src/hooks/useStateWithAwait.ts","../src/hooks/useStepsMap.ts","../src/hocs/walkthroughable.tsx","../src/components/CopilotStep.tsx","../src/index.ts"],"sourcesContent":["import { StyleSheet } from \"react-native\";\n\nexport const STEP_NUMBER_RADIUS: number = 14;\nexport const STEP_NUMBER_DIAMETER: number = STEP_NUMBER_RADIUS * 2;\nexport const ZINDEX: number = 100;\nexport const MARGIN: number = 13;\nexport const OFFSET_WIDTH: number = 4;\nexport const ARROW_SIZE: number = 6;\n\nexport const styles = StyleSheet.create({\n container: {\n position: \"absolute\",\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n zIndex: ZINDEX,\n },\n arrow: {\n position: \"absolute\",\n borderWidth: ARROW_SIZE,\n },\n tooltip: {\n position: \"absolute\",\n paddingTop: 15,\n paddingHorizontal: 15,\n backgroundColor: \"#fff\",\n borderRadius: 3,\n overflow: \"hidden\",\n },\n tooltipText: {},\n tooltipContainer: {\n flex: 1,\n },\n stepNumberContainer: {\n position: \"absolute\",\n width: STEP_NUMBER_DIAMETER,\n height: STEP_NUMBER_DIAMETER,\n overflow: \"hidden\",\n zIndex: ZINDEX + 1,\n },\n stepNumber: {\n flex: 1,\n alignItems: \"center\",\n justifyContent: \"center\",\n borderWidth: 2,\n borderRadius: STEP_NUMBER_RADIUS,\n borderColor: \"#FFFFFF\",\n backgroundColor: \"#27ae60\",\n },\n stepNumberText: {\n fontSize: 10,\n backgroundColor: \"transparent\",\n color: \"#FFFFFF\",\n },\n button: {\n padding: 10,\n },\n buttonText: {\n color: \"#27ae60\",\n },\n bottomBar: {\n marginTop: 10,\n flexDirection: \"row\",\n justifyContent: \"flex-end\",\n },\n overlayRectangle: {\n position: \"absolute\",\n backgroundColor: \"rgba(0,0,0,0.2)\",\n left: 0,\n top: 0,\n bottom: 0,\n right: 0,\n },\n overlayContainer: {\n position: \"absolute\",\n left: 0,\n top: 0,\n bottom: 0,\n right: 0,\n },\n});\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n Animated,\n Dimensions,\n Easing,\n View,\n type LayoutChangeEvent,\n} from \"react-native\";\nimport Svg, { Path } from \"react-native-svg\";\n\nimport type { MaskProps, SvgMaskPathFunction, ValueXY } from \"../types\";\n\nconst AnimatedSvgPath = Animated.createAnimatedComponent(Path);\nconst windowDimensions = Dimensions.get(\"window\");\n\nconst defaultSvgPath: SvgMaskPathFunction = ({\n size,\n position,\n canvasSize,\n}): string => {\n const positionX = (position.x as any)._value as number;\n const positionY = (position.y as any)._value as number;\n const sizeX = (size.x as any)._value as number;\n const sizeY = (size.y as any)._value as number;\n\n return `M0,0H${canvasSize.x}V${canvasSize.y}H0V0ZM${positionX},${positionY}H${\n positionX + sizeX\n }V${positionY + sizeY}H${positionX}V${positionY}Z`;\n};\n\nexport const SvgMask = ({\n size,\n position,\n style,\n easing = Easing.linear,\n animationDuration = 300,\n animated,\n backdropColor,\n svgMaskPath = defaultSvgPath,\n onClick,\n currentStep,\n}: MaskProps) => {\n const [canvasSize, setCanvasSize] = useState<ValueXY>({\n x: windowDimensions.width,\n y: windowDimensions.height,\n });\n const sizeValue = useRef<Animated.ValueXY>(\n new Animated.ValueXY(size)\n ).current;\n const positionValue = useRef<Animated.ValueXY>(\n new Animated.ValueXY(position)\n ).current;\n const maskRef = useRef<any>(null);\n\n const animationListener = useCallback(() => {\n const d: string = svgMaskPath({\n size: sizeValue,\n position: positionValue,\n canvasSize,\n step: currentStep,\n });\n\n if (maskRef.current) {\n maskRef.current.setNativeProps({ d });\n }\n }, [canvasSize, currentStep, svgMaskPath, positionValue, sizeValue]);\n\n const animate = useCallback(\n (toSize: ValueXY = size, toPosition: ValueXY = position) => {\n if (animated) {\n Animated.parallel([\n Animated.timing(sizeValue, {\n toValue: toSize,\n duration: animationDuration,\n easing,\n useNativeDriver: false,\n }),\n Animated.timing(positionValue, {\n toValue: toPosition,\n duration: animationDuration,\n easing,\n useNativeDriver: false,\n }),\n ]).start();\n } else {\n sizeValue.setValue(toSize);\n positionValue.setValue(toPosition);\n }\n },\n [\n animated,\n animationDuration,\n easing,\n positionValue,\n position,\n size,\n sizeValue,\n ]\n );\n\n useEffect(() => {\n const id = positionValue.addListener(animationListener);\n return () => {\n positionValue.removeListener(id);\n };\n }, [animationListener, positionValue]);\n\n useEffect(() => {\n if (size && position) {\n animate(size, position);\n }\n }, [animate, position, size]);\n\n const handleLayout = ({\n nativeEvent: {\n layout: { width, height },\n },\n }: LayoutChangeEvent) => {\n setCanvasSize({\n x: width,\n y: height,\n });\n };\n\n return (\n <View\n style={style}\n onLayout={handleLayout}\n onStartShouldSetResponder={onClick}\n >\n {canvasSize ? (\n <Svg pointerEvents=\"none\" width={canvasSize.x} height={canvasSize.y}>\n <AnimatedSvgPath\n ref={maskRef}\n fill={backdropColor}\n fillRule=\"evenodd\"\n strokeWidth={1}\n d={svgMaskPath({\n size: sizeValue,\n position: positionValue,\n canvasSize,\n step: currentStep,\n })}\n />\n </Svg>\n ) : null}\n </View>\n );\n};\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { Animated, View } from \"react-native\";\nimport { styles } from \"./style\";\n\nimport type { MaskProps, ValueXY } from \"../types\";\n\nexport const ViewMask = (props: MaskProps) => {\n const sizeValue = useRef<Animated.ValueXY>(\n new Animated.ValueXY(props.size)\n ).current;\n const positionValue = useRef<Animated.ValueXY>(\n new Animated.ValueXY(props.position)\n ).current;\n const [animated, setAnimated] = useState(false);\n\n const animate = useCallback(\n (size: ValueXY = props.size, position: ValueXY = props.position): void => {\n if (animated) {\n Animated.parallel([\n Animated.timing(sizeValue, {\n toValue: size,\n duration: props.animationDuration,\n easing: props.easing,\n useNativeDriver: false,\n }),\n Animated.timing(positionValue, {\n toValue: position,\n duration: props.animationDuration,\n easing: props.easing,\n useNativeDriver: false,\n }),\n ]).start();\n } else {\n sizeValue.setValue(size);\n positionValue.setValue(position);\n setAnimated(props.animated);\n }\n },\n [\n animated,\n positionValue,\n props.animated,\n props.animationDuration,\n props.easing,\n props.position,\n props.size,\n sizeValue,\n ]\n );\n\n useEffect(() => {\n if (props.position || props.size) {\n animate(props.size, props.position);\n }\n }, [animate, props.position, props.size]);\n\n const width = props.layout ? props.layout.width : 500;\n const height = props.layout ? props.layout.height : 500;\n\n const leftOverlayRight = Animated.add(\n width,\n Animated.multiply(positionValue.x, -1)\n );\n const rightOverlayLeft = Animated.add(sizeValue.x, positionValue.x);\n const bottomOverlayTopBoundary = Animated.add(sizeValue.y, positionValue.y);\n const topOverlayBottomBoundary = Animated.add(\n height,\n Animated.multiply(-1, positionValue.y)\n );\n const verticalOverlayLeftBoundary = positionValue.x;\n const verticalOverlayRightBoundary = Animated.add(\n width,\n Animated.multiply(-1, rightOverlayLeft)\n );\n\n return (\n <View style={props.style} onStartShouldSetResponder={props.onClick}>\n {[\n {\n right: leftOverlayRight,\n backgroundColor: props.backdropColor,\n },\n {\n left: rightOverlayLeft,\n backgroundColor: props.backdropColor,\n },\n {\n top: bottomOverlayTopBoundary,\n left: verticalOverlayLeftBoundary,\n right: verticalOverlayRightBoundary,\n backgroundColor: props.backdropColor,\n },\n {\n bottom: topOverlayBottomBoundary,\n left: verticalOverlayLeftBoundary,\n right: verticalOverlayRightBoundary,\n backgroundColor: props.backdropColor,\n },\n ].map((style, index) => (\n <Animated.View key={index} style={[styles.overlayRectangle, style]} />\n ))}\n </View>\n );\n};\n","import React, { type FunctionComponent } from \"react\";\nimport { Text, View } from \"react-native\";\nimport { useCopilot } from \"../../contexts/CopilotProvider\";\n\nimport { styles } from \"../style\";\n\nexport const StepNumber: FunctionComponent<unknown> = () => {\n const { currentStepNumber } = useCopilot();\n\n return (\n <View style={styles.stepNumber}>\n <Text style={styles.stepNumberText}>{currentStepNumber}</Text>\n </View>\n );\n};\n","import mitt, { type Emitter } from \"mitt\";\nimport React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n type PropsWithChildren,\n} from \"react\";\nimport { findNodeHandle, type ScrollView } from \"react-native\";\nimport {\n CopilotModal,\n type CopilotModalHandle,\n} from \"../components/CopilotModal\";\nimport { OFFSET_WIDTH } from \"../components/style\";\nimport { useStateWithAwait } from \"../hooks/useStateWithAwait\";\nimport { useStepsMap } from \"../hooks/useStepsMap\";\nimport { type CopilotOptions, type Step } from \"../types\";\n\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\ntype Events = {\n start: undefined;\n stop: undefined;\n stepChange: Step | undefined;\n};\n\ninterface CopilotContextType {\n registerStep: (step: Step) => void;\n unregisterStep: (stepName: string) => void;\n currentStep: Step | undefined;\n start: (\n fromStep?: string,\n suppliedScrollView?: ScrollView | null\n ) => Promise<void>;\n stop: () => Promise<void>;\n goToNext: () => Promise<void>;\n goToNth: (n: number) => Promise<void>;\n goToPrev: () => Promise<void>;\n visible: boolean;\n copilotEvents: Emitter<Events>;\n isFirstStep: boolean;\n isLastStep: boolean;\n currentStepNumber: number;\n totalStepsNumber: number;\n}\n\n/*\nThis is the maximum wait time for the steps to be registered before starting the tutorial\nAt 60fps means 2 seconds\n*/\nconst MAX_START_TRIES = 120;\n\nconst CopilotContext = createContext<CopilotContextType | undefined>(undefined);\n\nexport const CopilotProvider = ({\n verticalOffset = 0,\n children,\n ...rest\n}: PropsWithChildren<CopilotOptions>) => {\n const startTries = useRef(0);\n const copilotEvents = useRef(mitt<Events>()).current;\n const modal = useRef<CopilotModalHandle | null>(null);\n\n const [visible, setVisibility] = useStateWithAwait(false);\n const [scrollView, setScrollView] = useState<ScrollView | null>(null);\n\n const {\n currentStep,\n currentStepNumber,\n totalStepsNumber,\n getFirstStep,\n getPrevStep,\n getNextStep,\n getNthStep,\n isFirstStep,\n isLastStep,\n setCurrentStepState,\n steps,\n registerStep,\n unregisterStep,\n } = useStepsMap();\n\n const moveModalToStep = useCallback(\n async (step: Step) => {\n const size = await step?.measure();\n\n if (!size) {\n return;\n }\n\n await modal.current?.animateMove({\n width: size.width + OFFSET_WIDTH,\n height: size.height + OFFSET_WIDTH,\n x: size.x - OFFSET_WIDTH / 2,\n y: size.y - OFFSET_WIDTH / 2 + verticalOffset,\n });\n },\n [verticalOffset]\n );\n\n const setCurrentStep = useCallback(\n async (step?: Step, move: boolean = true) => {\n setCurrentStepState(step);\n copilotEvents.emit(\"stepChange\", step);\n\n if (scrollView != null) {\n const nodeHandle = findNodeHandle(scrollView);\n if (nodeHandle) {\n step?.wrapperRef.current?.measureLayout(\n nodeHandle,\n (_x, y, _w, h) => {\n const yOffset = y > 0 ? y - h / 2 : 0;\n scrollView.scrollTo({ y: yOffset, animated: false });\n }\n );\n }\n }\n\n setTimeout(\n () => {\n if (move && step) {\n void moveModalToStep(step);\n }\n },\n scrollView != null ? 100 : 0\n );\n },\n [copilotEvents, moveModalToStep, scrollView, setCurrentStepState]\n );\n\n const start = useCallback(\n async (fromStep?: string, suppliedScrollView: ScrollView | null = null) => {\n if (scrollView == null) {\n setScrollView(suppliedScrollView);\n }\n\n const currentStep = fromStep ? steps[fromStep] : getFirstStep();\n\n if (startTries.current > MAX_START_TRIES) {\n startTries.current = 0;\n return;\n }\n\n if (currentStep == null) {\n startTries.current += 1;\n requestAnimationFrame(() => {\n void start(fromStep);\n });\n } else {\n copilotEvents.emit(\"start\");\n await setCurrentStep(currentStep);\n await moveModalToStep(currentStep);\n await setVisibility(true);\n startTries.current = 0;\n }\n },\n [\n copilotEvents,\n getFirstStep,\n moveModalToStep,\n scrollView,\n setCurrentStep,\n setVisibility,\n steps,\n ]\n );\n\n const stop = useCallback(async () => {\n await setVisibility(false);\n copilotEvents.emit(\"stop\");\n }, [copilotEvents, setVisibility]);\n\n const next = useCallback(async () => {\n await setCurrentStep(getNextStep());\n }, [getNextStep, setCurrentStep]);\n\n const nth = useCallback(\n async (n: number) => {\n await setCurrentStep(getNthStep(n));\n },\n [getNthStep, setCurrentStep]\n );\n\n const prev = useCallback(async () => {\n await setCurrentStep(getPrevStep());\n }, [getPrevStep, setCurrentStep]);\n\n const value = useMemo(\n () => ({\n registerStep,\n unregisterStep,\n currentStep,\n start,\n stop,\n visible,\n copilotEvents,\n goToNext: next,\n goToNth: nth,\n goToPrev: prev,\n isFirstStep,\n isLastStep,\n currentStepNumber,\n totalStepsNumber,\n }),\n [\n registerStep,\n unregisterStep,\n currentStep,\n start,\n stop,\n visible,\n copilotEvents,\n next,\n nth,\n prev,\n isFirstStep,\n isLastStep,\n currentStepNumber,\n totalStepsNumber,\n ]\n );\n\n return (\n <CopilotContext.Provider value={value}>\n <>\n <CopilotModal\n ref={modal}\n {...rest}\n />\n {children}\n </>\n </CopilotContext.Provider>\n );\n};\n\nexport const useCopilot = () => {\n const value = useContext(CopilotContext);\n if (value == null) {\n throw new Error(\"You must wrap your app inside CopilotProvider\");\n }\n\n return value;\n};\n","import React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\nimport {\n Animated,\n Easing,\n Modal,\n NativeModules,\n Platform,\n StatusBar,\n View,\n type LayoutChangeEvent,\n type LayoutRectangle,\n type ViewStyle,\n} from \"react-native\";\nimport { useCopilot } from \"../contexts/CopilotProvider\";\nimport type { CopilotOptions } from \"../types\";\nimport { StepNumber } from \"./default-ui/StepNumber\";\nimport { Tooltip } from \"./default-ui/Tooltip\";\nimport {\n ARROW_SIZE,\n MARGIN,\n STEP_NUMBER_DIAMETER,\n STEP_NUMBER_RADIUS,\n styles,\n} from \"./style\";\n\ntype Props = CopilotOptions;\n\nconst noop = () => {};\n\nconst makeDefaultLayout = (): LayoutRectangle => ({\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n});\n\nexport interface CopilotModalHandle {\n animateMove: (obj: LayoutRectangle) => Promise<void>;\n}\n\nexport const CopilotModal = forwardRef<CopilotModalHandle, Props>(\n function CopilotModal(\n {\n easing = Easing.elastic(0.7),\n animationDuration = 400,\n tooltipComponent: TooltipComponent = Tooltip,\n tooltipStyle = {},\n stepNumberComponent: StepNumberComponent = StepNumber,\n overlay = typeof NativeModules.RNSVGSvgViewManager !== \"undefined\"\n ? \"svg\"\n : \"view\",\n animated = typeof NativeModules.RNSVGSvgViewManager !== \"undefined\",\n androidStatusBarVisible = false,\n backdropColor = \"rgba(0, 0, 0, 0.4)\",\n labels = {\n finish: \"Finish\",\n next: \"Next\",\n previous: \"Previous\",\n skip: \"Skip\",\n },\n svgMaskPath,\n stopOnOutsideClick = false,\n arrowColor = \"#fff\",\n arrowSize = ARROW_SIZE,\n margin = MARGIN,\n },\n ref,\n ) {\n const { stop, currentStep, visible } = useCopilot();\n const [tooltipStyles, setTooltipStyles] = useState({});\n const [arrowStyles, setArrowStyles] = useState({});\n const [animatedValues] = useState({\n top: new Animated.Value(0),\n stepNumberLeft: new Animated.Value(0),\n });\n const layoutRef = useRef(makeDefaultLayout());\n const [layout, setLayout] = useState<LayoutRectangle | undefined>(\n undefined,\n );\n const [maskRect, setMaskRect] = useState<LayoutRectangle | undefined>();\n\n const [isAnimated, setIsAnimated] = useState(false);\n const [containerVisible, setContainerVisible] = useState(false);\n\n useEffect(() => {\n if (visible) {\n setContainerVisible(true);\n }\n }, [visible]);\n\n useEffect(() => {\n if (!visible) {\n reset();\n }\n }, [visible]);\n\n const handleLayoutChange = ({\n nativeEvent: { layout: newLayout },\n }: LayoutChangeEvent) => {\n layoutRef.current = newLayout;\n };\n\n const measure = async (): Promise<LayoutRectangle> => {\n return await new Promise((resolve) => {\n const updateLayout = () => {\n if (layoutRef.current.width !== 0) {\n resolve(layoutRef.current);\n } else {\n requestAnimationFrame(updateLayout);\n }\n };\n\n updateLayout();\n });\n };\n\n const _animateMove = useCallback(\n async (rect: LayoutRectangle) => {\n const newMeasuredLayout = await measure();\n if (!androidStatusBarVisible && Platform.OS === \"android\") {\n rect.y -= StatusBar.currentHeight ?? 0;\n }\n\n let stepNumberLeft = rect.x - STEP_NUMBER_RADIUS;\n\n if (stepNumberLeft < 0) {\n stepNumberLeft = rect.x + rect.width - STEP_NUMBER_RADIUS;\n if (stepNumberLeft > newMeasuredLayout.width - STEP_NUMBER_DIAMETER) {\n stepNumberLeft = newMeasuredLayout.width - STEP_NUMBER_DIAMETER;\n }\n }\n\n const center = {\n x: rect.x + rect.width / 2,\n y: rect.y + rect.height / 2,\n };\n\n const relativeToLeft = center.x;\n const relativeToTop = center.y;\n const relativeToBottom = Math.abs(center.y - newMeasuredLayout.height);\n const relativeToRight = Math.abs(center.x - newMeasuredLayout.width);\n\n const verticalPosition =\n relativeToBottom > relativeToTop ? \"bottom\" : \"top\";\n const horizontalPosition =\n relativeToLeft > relativeToRight ? \"left\" : \"right\";\n\n const tooltip: ViewStyle = {};\n const arrow: ViewStyle = {};\n\n arrow.position = \"absolute\";\n\n if (verticalPosition === \"bottom\") {\n tooltip.top = rect.y + rect.height + margin;\n arrow.borderBottomColor = arrowColor;\n arrow.borderTopColor = \"transparent\";\n arrow.borderLeftColor = \"transparent\";\n arrow.borderRightColor = \"transparent\";\n arrow.top = tooltip.top - arrowSize * 2;\n } else {\n tooltip.bottom = newMeasuredLayout.height - (rect.y - margin);\n arrow.borderTopColor = arrowColor;\n arrow.borderLeftColor = \"transparent\";\n arrow.borderRightColor = \"transparent\";\n arrow.borderBottomColor = \"transparent\";\n arrow.bottom = tooltip.bottom - arrowSize * 2;\n }\n\n if (horizontalPosition === \"left\") {\n tooltip.right = Math.max(\n newMeasuredLayout.width - (rect.x + rect.width),\n 0,\n );\n tooltip.right =\n tooltip.right === 0 ? tooltip.right + margin : tooltip.right;\n tooltip.maxWidth = newMeasuredLayout.width - tooltip.right - margin;\n arrow.right = tooltip.right + margin;\n } else {\n tooltip.left = Math.max(rect.x, 0);\n tooltip.left =\n tooltip.left === 0 ? tooltip.left + margin : tooltip.left;\n tooltip.maxWidth = newMeasuredLayout.width - tooltip.left - margin;\n arrow.left = tooltip.left + margin;\n }\n\n sanitize(arrow);\n sanitize(tooltip);\n sanitize(rect);\n\n const animate = [\n [\"top\", rect.y],\n [\"stepNumberLeft\", stepNumberLeft],\n ] as const;\n\n if (isAnimated) {\n Animated.parallel(\n animate.map(([key, value]) => {\n return Animated.timing(animatedValues[key], {\n toValue: value,\n duration: animationDuration,\n easing,\n useNativeDriver: false,\n });\n }),\n ).start();\n } else {\n animate.forEach(([key, value]) => {\n animatedValues[key].setValue(value);\n });\n }\n\n setTooltipStyles(tooltip);\n setArrowStyles(arrow);\n setLayout(newMeasuredLayout);\n setMaskRect({\n width: rect.width,\n height: rect.height,\n x: Math.floor(Math.max(rect.x, 0)),\n y: Math.floor(Math.max(rect.y, 0)),\n });\n },\n [\n androidStatusBarVisible,\n animatedValues,\n animationDuration,\n arrowColor,\n easing,\n isAnimated,\n arrowSize,\n margin,\n ],\n );\n\n const animateMove = useCallback<CopilotModalHandle[\"animateMove\"]>(\n async (rect) => {\n await new Promise<void>((resolve) => {\n const frame = async () => {\n await _animateMove(rect);\n resolve();\n };\n\n setContainerVisible(true);\n requestAnimationFrame(() => {\n void frame();\n });\n });\n },\n [_animateMove],\n );\n\n const reset = () => {\n setIsAnimated(false);\n setContainerVisible(false);\n setLayout(undefined);\n };\n\n const handleStop = () => {\n reset();\n void stop();\n };\n\n const handleMaskClick = () => {\n if (stopOnOutsideClick) {\n handleStop();\n }\n };\n\n useImperativeHandle(\n ref,\n () => {\n return {\n animateMove,\n };\n },\n [animateMove],\n );\n\n const modalVisible = containerVisible || visible;\n const contentVisible = layout != null && containerVisible;\n\n if (!modalVisible) {\n return null;\n }\n\n return (\n <Modal\n animationType=\"none\"\n visible\n onRequestClose={noop}\n transparent\n supportedOrientations={[\"portrait\", \"landscape\"]}\n >\n <View style={styles.container} onLayout={handleLayoutChange}>\n {contentVisible && renderMask()}\n {contentVisible && renderTooltip()}\n </View>\n </Modal>\n );\n\n function renderMask() {\n const MaskComponent =\n overlay === \"svg\"\n ? // eslint-disable-next-line @typescript-eslint/no-var-requires\n require(\"./SvgMask\").SvgMask\n : // eslint-disable-next-line @typescript-eslint/no-var-requires\n require(\"./ViewMask\").ViewMask;\n\n const size = maskRect && {\n x: maskRect.width,\n y: maskRect.height,\n };\n\n const position = maskRect;\n\n return (\n <MaskComponent\n animated={animated}\n layout={layout}\n style={styles.overlayContainer}\n size={size}\n position={position}\n easing={easing}\n animationDuration={animationDuration}\n backdropColor={backdropColor}\n svgMaskPath={svgMaskPath}\n onClick={handleMaskClick}\n currentStep={currentStep}\n />\n );\n }\n\n function renderTooltip() {\n if (!currentStep) {\n return null;\n }\n return (\n <>\n <Animated.View\n key=\"stepNumber\"\n style={[\n styles.stepNumberContainer,\n {\n left: animatedValues.stepNumberLeft,\n top: Animated.add(animatedValues.top, -STEP_NUMBER_RADIUS),\n },\n ]}\n >\n <StepNumberComponent />\n </Animated.View>\n {!!arrowSize && (\n <Animated.View key=\"arrow\" style={[styles.arrow, arrowStyles]} />\n )}\n <Animated.View\n key=\"tooltip\"\n style={[styles.tooltip, tooltipStyles, tooltipStyle]}\n >\n <TooltipComponent labels={labels} />\n </Animated.View>\n </>\n );\n }\n },\n);\n\nconst floorify = (obj: Record<string, any>) => {\n Object.keys(obj).forEach((key) => {\n if (typeof obj[key] === \"number\") {\n obj[key] = Math.floor(obj[key]);\n }\n });\n};\n\nconst removeNan = (obj: Record<string, any>) => {\n Object.keys(obj).forEach((key) => {\n if (typeof obj[key] === \"number\" && isNaN(obj[key])) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete obj[key];\n }\n });\n};\n\nconst sanitize = (obj: Record<any, any>) => {\n floorify(obj);\n removeNan(obj);\n};\n","import React from \"react\";\nimport { Text, TouchableOpacity, View } from \"react-native\";\n\nimport { Button } from \"./Button\";\n\nimport { styles } from \"../style\";\n\nimport type { TooltipProps } from \"../../types\";\nimport { useCopilot } from \"../../contexts/CopilotProvider\";\n\nexport const Tooltip = ({ labels }: TooltipProps) => {\n const { goToNext, goToPrev, stop, currentStep, isFirstStep, isLastStep } =\n useCopilot();\n\n const handleStop = () => {\n void stop();\n };\n const handleNext = () => {\n void goToNext();\n };\n\n const handlePrev = () => {\n void goToPrev();\n };\n\n return (\n <View>\n <View style={styles.tooltipContainer}>\n <Text testID=\"stepDescription\" style={styles.tooltipText}>\n {currentStep?.text}\n </Text>\n </View>\n <View style={[styles.bottomBar]}>\n {!isLastStep ? (\n <TouchableOpacity onPress={handleStop}>\n <Button>{labels.skip}</Button>\n </TouchableOpacity>\n ) : null}\n {!isFirstStep ? (\n <TouchableOpacity onPress={handlePrev}>\n <Button>{labels.previous}</Button>\n </TouchableOpacity>\n ) : null}\n {!isLastStep ? (\n <TouchableOpacity onPress={handleNext}>\n <Button>{labels.next}</Button>\n </TouchableOpacity>\n ) : (\n <TouchableOpacity onPress={handleStop}>\n <Button>{labels.finish}</Button>\n </TouchableOpacity>\n )}\n </View>\n </View>\n );\n};\n","import React from \"react\";\nimport {\n View,\n Text,\n type StyleProp,\n type ViewStyle,\n type TextStyle,\n type TextProps,\n} from \"react-native\";\n\nimport { styles } from \"../style\";\n\ntype Props = {\n wrapperStyle?: StyleProp<ViewStyle>;\n style?: StyleProp<TextStyle>;\n} & Omit<TextProps, \"style\">;\n\nexport const Button = ({ wrapperStyle, style, ...rest }: Props) => (\n <View style={[styles.button, wrapperStyle]}>\n <Text style={[styles.buttonText, style]} {...rest} />\n </View>\n);\n","import { useEffect, useRef, useState } from \"react\";\n\n/**\n * A hook like useState that allows you to use await the setter\n */\nexport const useStateWithAwait = <T = any>(\n initialState: T\n): [T, (newValue: T) => Promise<void>] => {\n const endPending = useRef(() => {});\n const newDesiredValue = useRef(initialState);\n\n const [state, setState] = useState(initialState);\n\n const setStateWithAwait = async (newState: T) => {\n const pending = new Promise<void>((resolve) => {\n endPending.current = resolve;\n });\n newDesiredValue.current = newState;\n setState(newState);\n await pending;\n };\n\n useEffect(() => {\n if (state === newDesiredValue.current) {\n endPending.current();\n }\n }, [state]);\n\n return [state, setStateWithAwait];\n};\n","import { useCallback, useMemo, useReducer, useState } from \"react\";\nimport { type Step, type StepsMap } from \"../types\";\n\ntype Action =\n | {\n type: \"register\";\n step: Step;\n }\n | {\n type: \"unregister\";\n stepName: string;\n };\n\nexport const useStepsMap = () => {\n const [currentStep, setCurrentStepState] = useState<Step | undefined>(\n undefined\n );\n const [steps, dispatch] = useReducer((state: StepsMap, action: Action) => {\n switch (action.type) {\n case \"register\":\n return {\n ...state,\n [action.step.name]: action.step,\n };\n case \"unregister\": {\n const { [action.stepName]: _, ...rest } = state;\n return rest;\n }\n default:\n return state;\n }\n }, {});\n\n const orderedSteps = useMemo(\n () => Object.values(steps).sort((a, b) => a.order - b.order),\n [steps]\n );\n\n const stepIndex = useCallback(\n (step = currentStep) =>\n step\n ? orderedSteps.findIndex(\n (stepCandidate) => stepCandidate.order === step.order\n )\n : -1,\n [currentStep, orderedSteps]\n );\n\n const currentStepNumber = useMemo(\n (step = currentStep) => stepIndex(step) + 1,\n [currentStep, stepIndex]\n );\n\n const totalStepsNumber = useMemo(() => orderedSteps.length, [orderedSteps]);\n\n const getFirstStep = useCallback(() => orderedSteps[0], [orderedSteps]);\n\n const getLastStep = useCallback(\n () => orderedSteps[orderedSteps.length - 1],\n [orderedSteps]\n );\n\n const getPrevStep = useCallback(\n (step = currentStep) => step && orderedSteps[stepIndex(step) - 1],\n [currentStep, stepIndex, orderedSteps]\n );\n\n const getNextStep = useCallback(\n (step = currentStep) => step && orderedSteps[stepIndex(step) + 1],\n [currentStep, stepIndex, orderedSteps]\n );\n\n const getNthStep = useCallback(\n (n: number) => orderedSteps[n - 1],\n [orderedSteps]\n );\n\n const isFirstStep = useMemo(\n () => currentStep === getFirstStep(),\n [currentStep, getFirstStep]\n );\n\n const isLastStep = useMemo(\n () => currentStep === getLastStep(),\n [currentStep, getLastStep]\n );\n\n const registerStep = useCallback((step: Step) => {\n dispatch({ type: \"register\", step });\n }, []);\n\n const unregisterStep = useCallback((stepName: string) => {\n dispatch({ type: \"unregister\", stepName });\n }, []);\n\n return {\n currentStepNumber,\n totalStepsNumber,\n getFirstStep,\n getLastStep,\n getPrevStep,\n getNextStep,\n getNthStep,\n isFirstStep,\n isLastStep,\n currentStep,\n setCurrentStepState,\n steps,\n registerStep,\n unregisterStep,\n };\n};\n","import React, { type FunctionComponent } from \"react\";\nimport { type NativeMethods } from \"react-native/types\";\n\ninterface CopilotType {\n ref?: React.RefObject<NativeMethods>;\n onLayout?: () => void;\n}\n\nexport function walkthroughable<P = any>(\n WrappedComponent: React.ComponentType<P>,\n) {\n const Component: FunctionComponent<P> = (props: P) => {\n const { copilot, ...rest } = props as { copilot: CopilotType } & P;\n return <WrappedComponent {...copilot} {...(rest as any)} />;\n };\n\n Component.displayName = \"Walkthroughable\";\n\n return Component;\n}\n","import React, { useEffect, useMemo, useRef } from \"react\";\nimport { type NativeMethods } from \"react-native\";\n\nimport { useCopilot } from \"../contexts/CopilotProvider\";\n\ninterface Props {\n name: string;\n order: number;\n text: string;\n children: React.ReactElement<any>;\n active?: boolean;\n}\n\nexport const CopilotStep = ({\n name,\n order,\n text,\n children,\n active = true,\n}: Props) => {\n const registeredName = useRef<string | null>(null);\n const { registerStep, unregisterStep } = useCopilot();\n const wrapperRef = React.useRef<NativeMethods | null>(null);\n\n const measure = async () => {\n return await new Promise<{\n x: number;\n y: number;\n width: number;\n height: number;\n }>((resolve) => {\n const measure = () => {\n // Wait until the wrapper element appears\n if (wrapperRef.current != null && \"measure\" in wrapperRef.current) {\n wrapperRef.current.measure((_ox, _oy, width, height, x, y) => {\n resolve({\n x,\n y,\n width,\n height,\n });\n });\n } else {\n requestAnimationFrame(measure);\n }\n };\n\n measure();\n });\n };\n\n useEffect(() => {\n if (active) {\n if (registeredName.current && registeredName.current !== name) {\n unregisterStep(registeredName.current);\n }\n registerStep({\n name,\n text,\n order,\n measure,\n wrapperRef,\n visible: true,\n });\n registeredName.current = name;\n }\n }, [name, order, text, registerStep, unregisterStep, active]);\n\n useEffect(() => {\n if (active) {\n return () => {\n if (registeredName.current) {\n unregisterStep(registeredName.current);\n }\n };\n }\n }, [name, unregisterStep, active]);\n\n const copilotProps = useMemo(\n () => ({\n ref: wrapperRef,\n onLayout: () => {}, // Android hack\n }),\n []\n );\n\n return React.cloneElement(children, { copilot: copilotProps });\n};\n","import { StepNumber } from \"./components/default-ui/StepNumber\";\nimport { Tooltip } from \"./components/default-ui/Tooltip\";\nexport { walkthroughable } from \"./hocs/walkthroughable\";\nexport { CopilotStep } from \"./components/CopilotStep\";\nexport { CopilotProvider, useCopilot } from \"./contexts/CopilotProvider\";\nexport type { CopilotOptions as CopilotProps, TooltipProps } from \"./types\";\n\nexport const DefaultUI = {\n StepNumber,\n Tooltip,\n};\n"],"mappings":"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