@mehul214/react-native-flash-toast 0.0.0-stage → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/FlashMessageManager.ts","../src/icons.tsx","../src/styles.ts","../src/utils/safeArea.ts","../src/FlashMessage.tsx","../src/FlashMessageProvider.tsx","../src/index.ts"],"names":["styles","StyleSheet","Platform","jsx","View","jsxs"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { FlashMessageOptions, FlashMessageRef } from './types';\n\nclass FlashMessageManager {\n private defaultInstance: FlashMessageRef | null = null;\n private instances: Map<string, FlashMessageRef> = new Map();\n private pendingQueue: FlashMessageOptions[] = [];\n\n public register(ref: FlashMessageRef, id: string = 'default'): void {\n this.instances.set(id, ref);\n if (!this.defaultInstance || id === 'default') {\n this.defaultInstance = ref;\n }\n\n // Flush any pending messages that arrived before mount\n if (this.pendingQueue.length > 0) {\n const next = this.pendingQueue.shift();\n if (next) {\n ref.showMessage(next);\n }\n }\n }\n\n public unregister(id: string = 'default'): void {\n this.instances.delete(id);\n if (this.defaultInstance === this.instances.get(id)) {\n this.defaultInstance = this.instances.values().next().value || null;\n }\n }\n\n public showMessage(options: FlashMessageOptions, targetId?: string): void {\n const target = targetId ? this.instances.get(targetId) : this.defaultInstance;\n\n if (target) {\n target.showMessage(options);\n } else {\n // Buffer if component hasn't mounted yet\n this.pendingQueue.push(options);\n }\n }\n\n public hideMessage(targetId?: string): void {\n const target = targetId ? this.instances.get(targetId) : this.defaultInstance;\n if (target) {\n target.hideMessage();\n }\n }\n}\n\nexport const flashManager = new FlashMessageManager();\n\n/**\n * Imperative helper to trigger a flash message from anywhere in the app\n * (services, Zustand, Redux, API handlers, navigation screens).\n */\nexport function showMessage(options: FlashMessageOptions): void {\n flashManager.showMessage(options);\n}\n\n/**\n * Imperative helper to dismiss the currently displayed flash message.\n */\nexport function hideMessage(): void {\n flashManager.hideMessage();\n}\n\n/**\n * Modern alias for showMessage\n */\nexport const flash = showMessage;\nexport const dismissFlash = hideMessage;\n\n","import React from 'react';\nimport { View, StyleSheet } from 'react-native';\nimport type { FlashMessageType } from './types';\n\ninterface BuiltInIconProps {\n type: FlashMessageType;\n size?: number;\n color?: string;\n}\n\nexport const BuiltInIcon: React.FC<BuiltInIconProps> = ({\n type,\n size = 18,\n color = '#FFFFFF',\n}) => {\n switch (type) {\n case 'success': {\n // Crisp pixel-perfect checkmark\n const checkWidth = size * 0.36;\n const checkHeight = size * 0.65;\n const stroke = Math.max(2, size * 0.12);\n return (\n <View style={[styles.center, { width: size, height: size }]}>\n <View\n style={{\n width: checkWidth,\n height: checkHeight,\n borderColor: color,\n borderBottomWidth: stroke,\n borderRightWidth: stroke,\n borderRadius: 1,\n transform: [{ rotate: '45deg' }, { translateY: -size * 0.08 }],\n }}\n />\n </View>\n );\n }\n\n case 'danger': {\n // Crisp pixel-perfect cross\n const crossThickness = Math.max(2, size * 0.12);\n const crossLength = size * 0.72;\n return (\n <View style={[styles.center, { width: size, height: size }]}>\n <View\n style={[\n styles.crossBar,\n {\n width: crossLength,\n height: crossThickness,\n backgroundColor: color,\n borderRadius: crossThickness / 2,\n transform: [{ rotate: '45deg' }],\n },\n ]}\n />\n <View\n style={[\n styles.crossBar,\n {\n width: crossLength,\n height: crossThickness,\n backgroundColor: color,\n borderRadius: crossThickness / 2,\n transform: [{ rotate: '-45deg' }],\n },\n ]}\n />\n </View>\n );\n }\n\n case 'warning': {\n // Modern clean exclamation mark\n const warnThickness = Math.max(2, size * 0.13);\n const dotSize = warnThickness * 1.1;\n return (\n <View style={[styles.center, { width: size, height: size }]}>\n <View\n style={{\n width: warnThickness,\n height: size * 0.46,\n backgroundColor: color,\n borderRadius: warnThickness / 2,\n marginBottom: size * 0.14,\n }}\n />\n <View\n style={{\n width: dotSize,\n height: dotSize,\n borderRadius: dotSize / 2,\n backgroundColor: color,\n }}\n />\n </View>\n );\n }\n\n case 'info': {\n // Modern clean info icon: top dot, bottom stem (no double circle!)\n const infoThickness = Math.max(2, size * 0.13);\n const infoDotSize = infoThickness * 1.1;\n return (\n <View style={[styles.center, { width: size, height: size }]}>\n <View\n style={{\n width: infoDotSize,\n height: infoDotSize,\n borderRadius: infoDotSize / 2,\n backgroundColor: color,\n marginBottom: size * 0.14,\n }}\n />\n <View\n style={{\n width: infoThickness,\n height: size * 0.46,\n backgroundColor: color,\n borderRadius: infoThickness / 2,\n }}\n />\n </View>\n );\n }\n\n case 'default':\n default: {\n const defaultDot = size * 0.44;\n return (\n <View style={[styles.center, { width: size, height: size }]}>\n <View\n style={{\n width: defaultDot,\n height: defaultDot,\n borderRadius: defaultDot / 2,\n backgroundColor: color,\n }}\n />\n </View>\n );\n }\n }\n};\n\nconst styles = StyleSheet.create({\n center: {\n justifyContent: 'center',\n alignItems: 'center',\n },\n crossBar: {\n position: 'absolute',\n },\n});\n","import { StyleSheet, Platform } from 'react-native';\nimport type { FlashMessageType } from './types';\n\nexport const COLORS: Record<FlashMessageType, { background: string; text: string; icon: string }> = {\n default: {\n background: '#1F2937', // Slate 800\n text: '#FFFFFF',\n icon: '#9CA3AF',\n },\n success: {\n background: '#059669', // Emerald 600\n text: '#FFFFFF',\n icon: '#D1FAE5',\n },\n danger: {\n background: '#DC2626', // Red 600\n text: '#FFFFFF',\n icon: '#FEE2E2',\n },\n warning: {\n background: '#D97706', // Amber 600\n text: '#FFFFFF',\n icon: '#FEF3C7',\n },\n info: {\n background: '#2563EB', // Blue 600\n text: '#FFFFFF',\n icon: '#DBEAFE',\n },\n};\n\nexport const styles = StyleSheet.create({\n rootOverlay: {\n position: 'absolute',\n left: 0,\n right: 0,\n zIndex: 99999,\n elevation: 99999,\n },\n rootTop: {\n top: 0,\n },\n rootBottom: {\n bottom: 0,\n },\n rootCenter: {\n top: 0,\n bottom: 0,\n justifyContent: 'center',\n alignItems: 'center',\n },\n toastContainer: {\n flexDirection: 'row',\n alignItems: 'center',\n overflow: 'hidden',\n ...Platform.select({\n ios: {\n shadowColor: '#000000',\n shadowOffset: { width: 0, height: 6 },\n shadowOpacity: 0.2,\n shadowRadius: 14,\n },\n android: {\n elevation: 8,\n },\n web: {\n boxShadow: '0 10px 25px -5px rgba(0, 0, 0, 0.25), 0 8px 10px -6px rgba(0, 0, 0, 0.15)',\n } as any,\n }),\n },\n floatingContainer: {\n marginHorizontal: 16,\n borderRadius: 16,\n borderWidth: 1,\n borderColor: 'rgba(255, 255, 255, 0.16)',\n },\n edgeToEdgeContainer: {\n marginHorizontal: 0,\n borderRadius: 0,\n },\n contentWrapper: {\n flex: 1,\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: 13,\n paddingHorizontal: 16,\n },\n iconContainer: {\n marginRight: 12,\n justifyContent: 'center',\n alignItems: 'center',\n },\n iconBadge: {\n width: 32,\n height: 32,\n borderRadius: 16,\n backgroundColor: 'rgba(255, 255, 255, 0.22)',\n justifyContent: 'center',\n alignItems: 'center',\n },\n textContainer: {\n flex: 1,\n justifyContent: 'center',\n },\n titleText: {\n fontSize: 15,\n fontWeight: '600',\n letterSpacing: -0.2,\n lineHeight: 20,\n color: '#FFFFFF',\n },\n descriptionText: {\n fontSize: 13,\n fontWeight: '400',\n color: 'rgba(255, 255, 255, 0.9)',\n marginTop: 2,\n lineHeight: 18,\n },\n actionButton: {\n marginLeft: 12,\n paddingHorizontal: 12,\n paddingVertical: 6,\n borderRadius: 8,\n backgroundColor: 'rgba(255, 255, 255, 0.22)',\n borderWidth: 1,\n borderColor: 'rgba(255, 255, 255, 0.2)',\n },\n actionButtonText: {\n fontSize: 13,\n fontWeight: '600',\n color: '#FFFFFF',\n },\n progressBarContainer: {\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: 3,\n backgroundColor: 'rgba(255, 255, 255, 0.2)',\n },\n progressBarFill: {\n height: '100%',\n backgroundColor: 'rgba(255, 255, 255, 0.9)',\n },\n});\n","import { Platform, StatusBar, Dimensions } from 'react-native';\n\nexport interface EdgeInsets {\n top: number;\n bottom: number;\n left: number;\n right: number;\n}\n\n/**\n * Returns safe default insets when react-native-safe-area-context is not present.\n * If the user's app wraps FlashMessage in SafeAreaProvider, safe-area context takes precedence.\n */\nexport function getDefaultSafeAreaInsets(): EdgeInsets {\n const { width, height } = Dimensions.get('window');\n const isLandscape = width > height;\n\n if (Platform.OS === 'android') {\n return {\n top: StatusBar.currentHeight ?? 24,\n bottom: 16,\n left: 0,\n right: 0,\n };\n }\n\n if (Platform.OS === 'ios') {\n // Dynamic island & modern notch iPhones typically have 47-59pt top inset\n const isModernIphone = !Platform.isPad && !Platform.isTV && (height >= 812 || width >= 812);\n return {\n top: isModernIphone ? (isLandscape ? 0 : 50) : 20,\n bottom: isModernIphone ? 34 : 0,\n left: 0,\n right: 0,\n };\n }\n\n return {\n top: 16,\n bottom: 16,\n left: 0,\n right: 0,\n };\n}\n\n","import React, {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport {\n Animated,\n PanResponder,\n Pressable,\n Text,\n View,\n} from 'react-native';\nimport { flashManager } from './FlashMessageManager';\nimport { BuiltInIcon } from './icons';\nimport { COLORS, styles } from './styles';\nimport type {\n FlashMessageContainerProps,\n FlashMessageOptions,\n FlashMessageRef,\n} from './types';\nimport { getDefaultSafeAreaInsets } from './utils/safeArea';\n\nexport const FlashMessage = React.forwardRef<FlashMessageRef, FlashMessageContainerProps>(\n (props, ref) => {\n const {\n position: defaultPosition = 'top',\n duration: defaultDuration = 3000,\n floating: defaultFloating = true,\n statusBarOffset,\n bottomOffset,\n style: containerCustomStyle,\n } = props;\n\n const [currentMessage, setCurrentMessage] = useState<FlashMessageOptions | null>(null);\n const [isVisible, setIsVisible] = useState(false);\n\n // Keep active message in a mutable ref so callbacks always access the latest values without re-creating functions\n const currentMessageRef = useRef<FlashMessageOptions | null>(null);\n\n // Animation values\n const translateY = useRef(new Animated.Value(-150)).current;\n const opacity = useRef(new Animated.Value(0)).current;\n const progress = useRef(new Animated.Value(1)).current;\n\n // Timers & gesture tracking\n const hideTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const progressAnimationRef = useRef<Animated.CompositeAnimation | null>(null);\n const remainingTimeRef = useRef<number>(0);\n const timerStartedAtRef = useRef<number>(0);\n\n const safeInsets = getDefaultSafeAreaInsets();\n\n const clearTimers = useCallback(() => {\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n if (progressAnimationRef.current) {\n progressAnimationRef.current.stop();\n progressAnimationRef.current = null;\n }\n }, []);\n\n const animateHide = useCallback(\n (callback?: () => void) => {\n clearTimers();\n\n const pos = currentMessageRef.current?.position ?? defaultPosition;\n const targetY = pos === 'top' ? -180 : pos === 'bottom' ? 180 : 0;\n\n Animated.parallel([\n Animated.timing(translateY, {\n toValue: targetY,\n duration: 220,\n useNativeDriver: true,\n }),\n Animated.timing(opacity, {\n toValue: 0,\n duration: 200,\n useNativeDriver: true,\n }),\n ]).start(() => {\n setIsVisible(false);\n const onHide = currentMessageRef.current?.onHide;\n currentMessageRef.current = null;\n setCurrentMessage(null);\n if (onHide) {\n onHide();\n }\n callback?.();\n });\n },\n [clearTimers, defaultPosition, opacity, translateY]\n );\n\n const startAutoHideTimer = useCallback(\n (durationMs: number) => {\n clearTimers();\n if (durationMs <= 0) return;\n\n remainingTimeRef.current = durationMs;\n timerStartedAtRef.current = Date.now();\n\n // Start progress bar animation\n progress.setValue(1);\n progressAnimationRef.current = Animated.timing(progress, {\n toValue: 0,\n duration: durationMs,\n useNativeDriver: false,\n });\n progressAnimationRef.current.start();\n\n hideTimeoutRef.current = setTimeout(() => {\n animateHide();\n }, durationMs);\n },\n [animateHide, clearTimers, progress]\n );\n\n const pauseTimer = useCallback(() => {\n if (hideTimeoutRef.current && timerStartedAtRef.current > 0) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n const elapsed = Date.now() - timerStartedAtRef.current;\n remainingTimeRef.current = Math.max(0, remainingTimeRef.current - elapsed);\n if (progressAnimationRef.current) {\n progressAnimationRef.current.stop();\n }\n }\n }, []);\n\n const resumeTimer = useCallback(() => {\n if (remainingTimeRef.current > 0) {\n startAutoHideTimer(remainingTimeRef.current);\n }\n }, [startAutoHideTimer]);\n\n const show = useCallback(\n (options: FlashMessageOptions) => {\n clearTimers();\n currentMessageRef.current = options;\n setCurrentMessage(options);\n setIsVisible(true);\n\n const pos = options.position ?? defaultPosition;\n const initialY = pos === 'top' ? -150 : pos === 'bottom' ? 150 : 0;\n\n translateY.setValue(initialY);\n opacity.setValue(0);\n progress.setValue(1);\n\n Animated.parallel([\n Animated.spring(translateY, {\n toValue: 0,\n tension: 70,\n friction: 9,\n useNativeDriver: true,\n }),\n Animated.timing(opacity, {\n toValue: 1,\n duration: 200,\n useNativeDriver: true,\n }),\n ]).start(() => {\n if (options.onShow) {\n options.onShow();\n }\n });\n\n const shouldAutoHide = options.autoHide ?? true;\n const dur = shouldAutoHide\n ? options.duration !== undefined\n ? options.duration\n : defaultDuration\n : 0;\n\n if (dur > 0) {\n startAutoHideTimer(dur);\n }\n },\n [clearTimers, defaultDuration, defaultPosition, opacity, progress, startAutoHideTimer, translateY]\n );\n\n // Mutable ref wrappers so external callers always invoke the latest logic\n const showRef = useRef(show);\n const animateHideRef = useRef(animateHide);\n showRef.current = show;\n animateHideRef.current = animateHide;\n\n // Register with imperative ref\n useImperativeHandle(\n ref,\n () => ({\n showMessage: (options: FlashMessageOptions) => showRef.current(options),\n hideMessage: () => animateHideRef.current(),\n }),\n []\n );\n\n // Register with manager ON MOUNT only; only clean up on UNMOUNT\n useEffect(() => {\n const instanceRef: FlashMessageRef = {\n showMessage: (options: FlashMessageOptions) => showRef.current(options),\n hideMessage: () => animateHideRef.current(),\n };\n flashManager.register(instanceRef);\n return () => {\n flashManager.unregister();\n clearTimers();\n };\n }, [clearTimers]);\n\n // PanResponder for smooth swipe-to-dismiss gesture\n const panResponder = useRef(\n PanResponder.create({\n onStartShouldSetPanResponder: () => false,\n onMoveShouldSetPanResponder: (_, gestureState) => {\n const swipeEnabled = currentMessageRef.current?.swipeToDismiss ?? true;\n return swipeEnabled && Math.abs(gestureState.dy) > 8;\n },\n onPanResponderGrant: () => {\n if (currentMessageRef.current?.pauseOnPress ?? true) {\n pauseTimer();\n }\n },\n onPanResponderMove: (_, gestureState) => {\n if (!(currentMessageRef.current?.swipeToDismiss ?? true)) return;\n const pos = currentMessageRef.current?.position ?? defaultPosition;\n\n if (pos === 'top' && gestureState.dy < 0) {\n translateY.setValue(gestureState.dy);\n } else if (pos === 'bottom' && gestureState.dy > 0) {\n translateY.setValue(gestureState.dy);\n }\n },\n onPanResponderRelease: (_, gestureState) => {\n const pos = currentMessageRef.current?.position ?? defaultPosition;\n const swipeThreshold = 30;\n const isDismissGesture =\n (pos === 'top' && gestureState.dy < -swipeThreshold) ||\n (pos === 'bottom' && gestureState.dy > swipeThreshold);\n\n if (isDismissGesture && (currentMessageRef.current?.swipeToDismiss ?? true)) {\n animateHide();\n } else {\n Animated.spring(translateY, {\n toValue: 0,\n tension: 80,\n friction: 8,\n useNativeDriver: true,\n }).start();\n\n if (currentMessageRef.current?.pauseOnPress ?? true) {\n resumeTimer();\n }\n }\n },\n })\n ).current;\n\n if (!isVisible || !currentMessage) {\n return null;\n }\n\n const position = currentMessage.position ?? defaultPosition;\n const isTop = position === 'top';\n const isBottom = position === 'bottom';\n\n const type = currentMessage.type ?? 'default';\n const typeColors = COLORS[type];\n const backgroundColor = currentMessage.backgroundColor ?? typeColors.background;\n const textColor = currentMessage.color ?? typeColors.text;\n const floating = currentMessage.floating ?? defaultFloating;\n\n const topInset =\n currentMessage.statusBarHeight ??\n statusBarOffset ??\n (isTop ? safeInsets.top + (floating ? 8 : 0) : 0);\n\n const bottomInset =\n bottomOffset ?? (isBottom ? safeInsets.bottom + (floating ? 8 : 0) : 0);\n\n const rootPositionStyle = isTop\n ? [styles.rootTop, { paddingTop: topInset }]\n : isBottom\n ? [styles.rootBottom, { paddingBottom: bottomInset }]\n : styles.rootCenter;\n\n const renderIcon = () => {\n if (currentMessage.icon === 'none') return null;\n\n if (typeof currentMessage.icon === 'function') {\n return (\n <View style={styles.iconContainer}>\n <View style={styles.iconBadge}>\n {currentMessage.icon({ size: 18, color: textColor })}\n </View>\n </View>\n );\n }\n\n if (React.isValidElement(currentMessage.icon)) {\n return (\n <View style={styles.iconContainer}>\n <View style={styles.iconBadge}>{currentMessage.icon}</View>\n </View>\n );\n }\n\n const iconType = typeof currentMessage.icon === 'string' ? currentMessage.icon : type;\n return (\n <View style={styles.iconContainer}>\n <View style={styles.iconBadge}>\n <BuiltInIcon type={iconType as any} color={textColor} size={18} />\n </View>\n </View>\n );\n };\n\n const handlePress = () => {\n if (currentMessage.onPress) {\n currentMessage.onPress();\n }\n if (currentMessage.hideOnPress ?? true) {\n animateHide();\n }\n };\n\n const progressWidthInterpolation = progress.interpolate({\n inputRange: [0, 1],\n outputRange: ['0%', '100%'],\n });\n\n return (\n <View\n pointerEvents=\"box-none\"\n style={[styles.rootOverlay, rootPositionStyle, containerCustomStyle]}\n >\n <Animated.View\n {...panResponder.panHandlers}\n style={[\n styles.toastContainer,\n floating ? styles.floatingContainer : styles.edgeToEdgeContainer,\n { backgroundColor },\n currentMessage.style,\n {\n transform: [{ translateY }],\n opacity,\n },\n ]}\n >\n {currentMessage.customComponent ? (\n currentMessage.customComponent(currentMessage, () => animateHide())\n ) : (\n <Pressable\n onPress={handlePress}\n onPressIn={() => {\n if (currentMessage.pauseOnPress ?? true) {\n pauseTimer();\n }\n }}\n onPressOut={() => {\n if (currentMessage.pauseOnPress ?? true) {\n resumeTimer();\n }\n }}\n onLongPress={currentMessage.onLongPress}\n style={styles.contentWrapper}\n >\n {renderIcon()}\n\n <View style={styles.textContainer}>\n {typeof currentMessage.message === 'string' ? (\n <Text\n style={[styles.titleText, { color: textColor }, currentMessage.titleStyle]}\n numberOfLines={2}\n >\n {currentMessage.message}\n </Text>\n ) : (\n currentMessage.message\n )}\n\n {currentMessage.description ? (\n typeof currentMessage.description === 'string' ? (\n <Text\n style={[\n styles.descriptionText,\n { color: textColor },\n currentMessage.textStyle,\n ]}\n numberOfLines={3}\n >\n {currentMessage.description}\n </Text>\n ) : (\n currentMessage.description\n )\n ) : null}\n </View>\n\n {currentMessage.action ? (\n <Pressable\n onPress={() => {\n currentMessage.action?.onPress();\n animateHide();\n }}\n style={[styles.actionButton, currentMessage.action.style]}\n >\n <Text style={[styles.actionButtonText, currentMessage.action.textStyle]}>\n {currentMessage.action.label}\n </Text>\n </Pressable>\n ) : null}\n </Pressable>\n )}\n\n {currentMessage.showProgressBar && (\n <View style={styles.progressBarContainer}>\n <Animated.View\n style={[\n styles.progressBarFill,\n { width: progressWidthInterpolation },\n ]}\n />\n </View>\n )}\n </Animated.View>\n </View>\n );\n }\n);\n\nFlashMessage.displayName = 'FlashMessage';\n","import React, { createContext, useContext, useMemo } from 'react';\nimport { FlashMessage } from './FlashMessage';\nimport { flashManager } from './FlashMessageManager';\nimport type { FlashMessageContainerProps, FlashMessageOptions } from './types';\n\ninterface FlashMessageContextValue {\n show: (options: FlashMessageOptions) => void;\n hide: () => void;\n}\n\nconst FlashMessageContext = createContext<FlashMessageContextValue | null>(null);\n\nexport interface FlashMessageProviderProps extends FlashMessageContainerProps {\n children: React.ReactNode;\n}\n\nexport const FlashMessageProvider: React.FC<FlashMessageProviderProps> = ({\n children,\n ...containerProps\n}) => {\n const contextValue = useMemo<FlashMessageContextValue>(\n () => ({\n show: (options: FlashMessageOptions) => flashManager.showMessage(options),\n hide: () => flashManager.hideMessage(),\n }),\n []\n );\n\n return (\n <FlashMessageContext.Provider value={contextValue}>\n {children}\n <FlashMessage {...containerProps} />\n </FlashMessageContext.Provider>\n );\n};\n\nexport function useFlashMessage(): FlashMessageContextValue {\n const context = useContext(FlashMessageContext);\n if (!context) {\n // Graceful fallback to global manager even if Provider is omitted\n return {\n show: (options: FlashMessageOptions) => flashManager.showMessage(options),\n hide: () => flashManager.hideMessage(),\n };\n }\n return context;\n}\n\n","import { FlashMessage } from './FlashMessage';\n\nexport { FlashMessage };\nexport default FlashMessage;\n\nexport {\n flashManager,\n showMessage,\n hideMessage,\n flash,\n dismissFlash,\n} from './FlashMessageManager';\n\nexport {\n FlashMessageProvider,\n useFlashMessage,\n} from './FlashMessageProvider';\n\nexport { BuiltInIcon } from './icons';\nexport { COLORS, styles } from './styles';\n\nexport type {\n FlashMessageAction,\n FlashMessageContainerProps,\n FlashMessageIcon,\n FlashMessageOptions,\n FlashMessagePosition,\n FlashMessageRef,\n FlashMessageTransition,\n FlashMessageType,\n} from './types';\n"]}
package/package.json CHANGED
@@ -1,6 +1,89 @@
1
1
  {
2
2
  "name": "@mehul214/react-native-flash-toast",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.1",
4
+ "description": "Next-generation, highly customizable flash message and toast banner for React Native & Expo. 100% Fabric / New Architecture ready with swipe-to-dismiss gestures.",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "main": "dist/index.js",
9
+ "module": "dist/index.mjs",
10
+ "types": "dist/index.d.ts",
11
+ "react-native": "src/index.ts",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/index.mjs",
16
+ "require": "./dist/index.js"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "src",
22
+ "README.md",
23
+ "LICENSE"
24
+ ],
25
+ "scripts": {
26
+ "build": "tsup",
27
+ "dev": "tsup --watch",
28
+ "test": "node test/smoke.test.js",
29
+ "typecheck": "tsc --noEmit",
30
+ "prepublishOnly": "npm run typecheck && npm test && npm run build"
31
+ },
32
+ "keywords": [
33
+ "react-native",
34
+ "react-native-flash-message",
35
+ "flash-message",
36
+ "toast",
37
+ "banner",
38
+ "notification",
39
+ "alert",
40
+ "snackbar",
41
+ "fabric",
42
+ "new-architecture",
43
+ "expo",
44
+ "swipe-to-dismiss",
45
+ "ios",
46
+ "android"
47
+ ],
48
+ "funding": [
49
+ {
50
+ "type": "github",
51
+ "url": "https://github.com/sponsors/Mehul214"
52
+ },
53
+ {
54
+ "type": "buy-me-a-coffee",
55
+ "url": "https://buymeacoffee.com/mehulreshac"
56
+ },
57
+ {
58
+ "type": "individual",
59
+ "url": "https://github.com/Mehul214/react-native-flash-toast#-support-via-upi"
60
+ }
61
+ ],
62
+ "author": "Mehul",
63
+ "license": "MIT",
64
+ "homepage": "https://github.com/Mehul214/react-native-flash-toast#readme",
65
+ "repository": {
66
+ "type": "git",
67
+ "url": "git+https://github.com/Mehul214/react-native-flash-toast.git"
68
+ },
69
+ "bugs": {
70
+ "url": "https://github.com/Mehul214/react-native-flash-toast/issues"
71
+ },
72
+ "peerDependencies": {
73
+ "react": ">=17.0.0",
74
+ "react-native": ">=0.68.0"
75
+ },
76
+ "peerDependenciesMeta": {
77
+ "react-native-safe-area-context": {
78
+ "optional": true
79
+ }
80
+ },
81
+ "devDependencies": {
82
+ "@types/react": "^19.0.0",
83
+ "@types/react-native": "^0.73.0",
84
+ "react": "^19.0.0",
85
+ "react-native": "^0.78.0",
86
+ "tsup": "^8.3.0",
87
+ "typescript": "^5.7.3"
88
+ }
89
+ }
@@ -0,0 +1,436 @@
1
+ import React, {
2
+ useCallback,
3
+ useEffect,
4
+ useImperativeHandle,
5
+ useRef,
6
+ useState,
7
+ } from 'react';
8
+ import {
9
+ Animated,
10
+ PanResponder,
11
+ Pressable,
12
+ Text,
13
+ View,
14
+ } from 'react-native';
15
+ import { flashManager } from './FlashMessageManager';
16
+ import { BuiltInIcon } from './icons';
17
+ import { COLORS, styles } from './styles';
18
+ import type {
19
+ FlashMessageContainerProps,
20
+ FlashMessageOptions,
21
+ FlashMessageRef,
22
+ } from './types';
23
+ import { getDefaultSafeAreaInsets } from './utils/safeArea';
24
+
25
+ export const FlashMessage = React.forwardRef<FlashMessageRef, FlashMessageContainerProps>(
26
+ (props, ref) => {
27
+ const {
28
+ position: defaultPosition = 'top',
29
+ duration: defaultDuration = 3000,
30
+ floating: defaultFloating = true,
31
+ statusBarOffset,
32
+ bottomOffset,
33
+ style: containerCustomStyle,
34
+ } = props;
35
+
36
+ const [currentMessage, setCurrentMessage] = useState<FlashMessageOptions | null>(null);
37
+ const [isVisible, setIsVisible] = useState(false);
38
+
39
+ // Keep active message in a mutable ref so callbacks always access the latest values without re-creating functions
40
+ const currentMessageRef = useRef<FlashMessageOptions | null>(null);
41
+
42
+ // Animation values
43
+ const translateY = useRef(new Animated.Value(-150)).current;
44
+ const opacity = useRef(new Animated.Value(0)).current;
45
+ const progress = useRef(new Animated.Value(1)).current;
46
+
47
+ // Timers & gesture tracking
48
+ const hideTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
49
+ const progressAnimationRef = useRef<Animated.CompositeAnimation | null>(null);
50
+ const remainingTimeRef = useRef<number>(0);
51
+ const timerStartedAtRef = useRef<number>(0);
52
+
53
+ const safeInsets = getDefaultSafeAreaInsets();
54
+
55
+ const clearTimers = useCallback(() => {
56
+ if (hideTimeoutRef.current) {
57
+ clearTimeout(hideTimeoutRef.current);
58
+ hideTimeoutRef.current = null;
59
+ }
60
+ if (progressAnimationRef.current) {
61
+ progressAnimationRef.current.stop();
62
+ progressAnimationRef.current = null;
63
+ }
64
+ }, []);
65
+
66
+ const animateHide = useCallback(
67
+ (callback?: () => void) => {
68
+ clearTimers();
69
+
70
+ const pos = currentMessageRef.current?.position ?? defaultPosition;
71
+ const targetY = pos === 'top' ? -180 : pos === 'bottom' ? 180 : 0;
72
+
73
+ Animated.parallel([
74
+ Animated.timing(translateY, {
75
+ toValue: targetY,
76
+ duration: 220,
77
+ useNativeDriver: true,
78
+ }),
79
+ Animated.timing(opacity, {
80
+ toValue: 0,
81
+ duration: 200,
82
+ useNativeDriver: true,
83
+ }),
84
+ ]).start(() => {
85
+ setIsVisible(false);
86
+ const onHide = currentMessageRef.current?.onHide;
87
+ currentMessageRef.current = null;
88
+ setCurrentMessage(null);
89
+ if (onHide) {
90
+ onHide();
91
+ }
92
+ callback?.();
93
+ });
94
+ },
95
+ [clearTimers, defaultPosition, opacity, translateY]
96
+ );
97
+
98
+ const startAutoHideTimer = useCallback(
99
+ (durationMs: number) => {
100
+ clearTimers();
101
+ if (durationMs <= 0) return;
102
+
103
+ remainingTimeRef.current = durationMs;
104
+ timerStartedAtRef.current = Date.now();
105
+
106
+ // Start progress bar animation
107
+ progress.setValue(1);
108
+ progressAnimationRef.current = Animated.timing(progress, {
109
+ toValue: 0,
110
+ duration: durationMs,
111
+ useNativeDriver: false,
112
+ });
113
+ progressAnimationRef.current.start();
114
+
115
+ hideTimeoutRef.current = setTimeout(() => {
116
+ animateHide();
117
+ }, durationMs);
118
+ },
119
+ [animateHide, clearTimers, progress]
120
+ );
121
+
122
+ const pauseTimer = useCallback(() => {
123
+ if (hideTimeoutRef.current && timerStartedAtRef.current > 0) {
124
+ clearTimeout(hideTimeoutRef.current);
125
+ hideTimeoutRef.current = null;
126
+ const elapsed = Date.now() - timerStartedAtRef.current;
127
+ remainingTimeRef.current = Math.max(0, remainingTimeRef.current - elapsed);
128
+ if (progressAnimationRef.current) {
129
+ progressAnimationRef.current.stop();
130
+ }
131
+ }
132
+ }, []);
133
+
134
+ const resumeTimer = useCallback(() => {
135
+ if (remainingTimeRef.current > 0) {
136
+ startAutoHideTimer(remainingTimeRef.current);
137
+ }
138
+ }, [startAutoHideTimer]);
139
+
140
+ const show = useCallback(
141
+ (options: FlashMessageOptions) => {
142
+ clearTimers();
143
+ currentMessageRef.current = options;
144
+ setCurrentMessage(options);
145
+ setIsVisible(true);
146
+
147
+ const pos = options.position ?? defaultPosition;
148
+ const initialY = pos === 'top' ? -150 : pos === 'bottom' ? 150 : 0;
149
+
150
+ translateY.setValue(initialY);
151
+ opacity.setValue(0);
152
+ progress.setValue(1);
153
+
154
+ Animated.parallel([
155
+ Animated.spring(translateY, {
156
+ toValue: 0,
157
+ tension: 70,
158
+ friction: 9,
159
+ useNativeDriver: true,
160
+ }),
161
+ Animated.timing(opacity, {
162
+ toValue: 1,
163
+ duration: 200,
164
+ useNativeDriver: true,
165
+ }),
166
+ ]).start(() => {
167
+ if (options.onShow) {
168
+ options.onShow();
169
+ }
170
+ });
171
+
172
+ const shouldAutoHide = options.autoHide ?? true;
173
+ const dur = shouldAutoHide
174
+ ? options.duration !== undefined
175
+ ? options.duration
176
+ : defaultDuration
177
+ : 0;
178
+
179
+ if (dur > 0) {
180
+ startAutoHideTimer(dur);
181
+ }
182
+ },
183
+ [clearTimers, defaultDuration, defaultPosition, opacity, progress, startAutoHideTimer, translateY]
184
+ );
185
+
186
+ // Mutable ref wrappers so external callers always invoke the latest logic
187
+ const showRef = useRef(show);
188
+ const animateHideRef = useRef(animateHide);
189
+ showRef.current = show;
190
+ animateHideRef.current = animateHide;
191
+
192
+ // Register with imperative ref
193
+ useImperativeHandle(
194
+ ref,
195
+ () => ({
196
+ showMessage: (options: FlashMessageOptions) => showRef.current(options),
197
+ hideMessage: () => animateHideRef.current(),
198
+ }),
199
+ []
200
+ );
201
+
202
+ // Register with manager ON MOUNT only; only clean up on UNMOUNT
203
+ useEffect(() => {
204
+ const instanceRef: FlashMessageRef = {
205
+ showMessage: (options: FlashMessageOptions) => showRef.current(options),
206
+ hideMessage: () => animateHideRef.current(),
207
+ };
208
+ flashManager.register(instanceRef);
209
+ return () => {
210
+ flashManager.unregister();
211
+ clearTimers();
212
+ };
213
+ }, [clearTimers]);
214
+
215
+ // PanResponder for smooth swipe-to-dismiss gesture
216
+ const panResponder = useRef(
217
+ PanResponder.create({
218
+ onStartShouldSetPanResponder: () => false,
219
+ onMoveShouldSetPanResponder: (_, gestureState) => {
220
+ const swipeEnabled = currentMessageRef.current?.swipeToDismiss ?? true;
221
+ return swipeEnabled && Math.abs(gestureState.dy) > 8;
222
+ },
223
+ onPanResponderGrant: () => {
224
+ if (currentMessageRef.current?.pauseOnPress ?? true) {
225
+ pauseTimer();
226
+ }
227
+ },
228
+ onPanResponderMove: (_, gestureState) => {
229
+ if (!(currentMessageRef.current?.swipeToDismiss ?? true)) return;
230
+ const pos = currentMessageRef.current?.position ?? defaultPosition;
231
+
232
+ if (pos === 'top' && gestureState.dy < 0) {
233
+ translateY.setValue(gestureState.dy);
234
+ } else if (pos === 'bottom' && gestureState.dy > 0) {
235
+ translateY.setValue(gestureState.dy);
236
+ }
237
+ },
238
+ onPanResponderRelease: (_, gestureState) => {
239
+ const pos = currentMessageRef.current?.position ?? defaultPosition;
240
+ const swipeThreshold = 30;
241
+ const isDismissGesture =
242
+ (pos === 'top' && gestureState.dy < -swipeThreshold) ||
243
+ (pos === 'bottom' && gestureState.dy > swipeThreshold);
244
+
245
+ if (isDismissGesture && (currentMessageRef.current?.swipeToDismiss ?? true)) {
246
+ animateHide();
247
+ } else {
248
+ Animated.spring(translateY, {
249
+ toValue: 0,
250
+ tension: 80,
251
+ friction: 8,
252
+ useNativeDriver: true,
253
+ }).start();
254
+
255
+ if (currentMessageRef.current?.pauseOnPress ?? true) {
256
+ resumeTimer();
257
+ }
258
+ }
259
+ },
260
+ })
261
+ ).current;
262
+
263
+ if (!isVisible || !currentMessage) {
264
+ return null;
265
+ }
266
+
267
+ const position = currentMessage.position ?? defaultPosition;
268
+ const isTop = position === 'top';
269
+ const isBottom = position === 'bottom';
270
+
271
+ const type = currentMessage.type ?? 'default';
272
+ const typeColors = COLORS[type];
273
+ const backgroundColor = currentMessage.backgroundColor ?? typeColors.background;
274
+ const textColor = currentMessage.color ?? typeColors.text;
275
+ const floating = currentMessage.floating ?? defaultFloating;
276
+
277
+ const topInset =
278
+ currentMessage.statusBarHeight ??
279
+ statusBarOffset ??
280
+ (isTop ? safeInsets.top + (floating ? 8 : 0) : 0);
281
+
282
+ const bottomInset =
283
+ bottomOffset ?? (isBottom ? safeInsets.bottom + (floating ? 8 : 0) : 0);
284
+
285
+ const rootPositionStyle = isTop
286
+ ? [styles.rootTop, { paddingTop: topInset }]
287
+ : isBottom
288
+ ? [styles.rootBottom, { paddingBottom: bottomInset }]
289
+ : styles.rootCenter;
290
+
291
+ const renderIcon = () => {
292
+ if (currentMessage.icon === 'none') return null;
293
+
294
+ if (typeof currentMessage.icon === 'function') {
295
+ return (
296
+ <View style={styles.iconContainer}>
297
+ <View style={styles.iconBadge}>
298
+ {currentMessage.icon({ size: 18, color: textColor })}
299
+ </View>
300
+ </View>
301
+ );
302
+ }
303
+
304
+ if (React.isValidElement(currentMessage.icon)) {
305
+ return (
306
+ <View style={styles.iconContainer}>
307
+ <View style={styles.iconBadge}>{currentMessage.icon}</View>
308
+ </View>
309
+ );
310
+ }
311
+
312
+ const iconType = typeof currentMessage.icon === 'string' ? currentMessage.icon : type;
313
+ return (
314
+ <View style={styles.iconContainer}>
315
+ <View style={styles.iconBadge}>
316
+ <BuiltInIcon type={iconType as any} color={textColor} size={18} />
317
+ </View>
318
+ </View>
319
+ );
320
+ };
321
+
322
+ const handlePress = () => {
323
+ if (currentMessage.onPress) {
324
+ currentMessage.onPress();
325
+ }
326
+ if (currentMessage.hideOnPress ?? true) {
327
+ animateHide();
328
+ }
329
+ };
330
+
331
+ const progressWidthInterpolation = progress.interpolate({
332
+ inputRange: [0, 1],
333
+ outputRange: ['0%', '100%'],
334
+ });
335
+
336
+ return (
337
+ <View
338
+ pointerEvents="box-none"
339
+ style={[styles.rootOverlay, rootPositionStyle, containerCustomStyle]}
340
+ >
341
+ <Animated.View
342
+ {...panResponder.panHandlers}
343
+ style={[
344
+ styles.toastContainer,
345
+ floating ? styles.floatingContainer : styles.edgeToEdgeContainer,
346
+ { backgroundColor },
347
+ currentMessage.style,
348
+ {
349
+ transform: [{ translateY }],
350
+ opacity,
351
+ },
352
+ ]}
353
+ >
354
+ {currentMessage.customComponent ? (
355
+ currentMessage.customComponent(currentMessage, () => animateHide())
356
+ ) : (
357
+ <Pressable
358
+ onPress={handlePress}
359
+ onPressIn={() => {
360
+ if (currentMessage.pauseOnPress ?? true) {
361
+ pauseTimer();
362
+ }
363
+ }}
364
+ onPressOut={() => {
365
+ if (currentMessage.pauseOnPress ?? true) {
366
+ resumeTimer();
367
+ }
368
+ }}
369
+ onLongPress={currentMessage.onLongPress}
370
+ style={styles.contentWrapper}
371
+ >
372
+ {renderIcon()}
373
+
374
+ <View style={styles.textContainer}>
375
+ {typeof currentMessage.message === 'string' ? (
376
+ <Text
377
+ style={[styles.titleText, { color: textColor }, currentMessage.titleStyle]}
378
+ numberOfLines={2}
379
+ >
380
+ {currentMessage.message}
381
+ </Text>
382
+ ) : (
383
+ currentMessage.message
384
+ )}
385
+
386
+ {currentMessage.description ? (
387
+ typeof currentMessage.description === 'string' ? (
388
+ <Text
389
+ style={[
390
+ styles.descriptionText,
391
+ { color: textColor },
392
+ currentMessage.textStyle,
393
+ ]}
394
+ numberOfLines={3}
395
+ >
396
+ {currentMessage.description}
397
+ </Text>
398
+ ) : (
399
+ currentMessage.description
400
+ )
401
+ ) : null}
402
+ </View>
403
+
404
+ {currentMessage.action ? (
405
+ <Pressable
406
+ onPress={() => {
407
+ currentMessage.action?.onPress();
408
+ animateHide();
409
+ }}
410
+ style={[styles.actionButton, currentMessage.action.style]}
411
+ >
412
+ <Text style={[styles.actionButtonText, currentMessage.action.textStyle]}>
413
+ {currentMessage.action.label}
414
+ </Text>
415
+ </Pressable>
416
+ ) : null}
417
+ </Pressable>
418
+ )}
419
+
420
+ {currentMessage.showProgressBar && (
421
+ <View style={styles.progressBarContainer}>
422
+ <Animated.View
423
+ style={[
424
+ styles.progressBarFill,
425
+ { width: progressWidthInterpolation },
426
+ ]}
427
+ />
428
+ </View>
429
+ )}
430
+ </Animated.View>
431
+ </View>
432
+ );
433
+ }
434
+ );
435
+
436
+ FlashMessage.displayName = 'FlashMessage';