@mehul214/react-native-flash-toast 1.0.0 → 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.
@@ -1 +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","Text","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, Text, 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 = 22,\n color = '#FFFFFF',\n}) => {\n const containerStyle = [\n styles.circle,\n {\n width: size,\n height: size,\n borderRadius: size / 2,\n borderColor: color,\n },\n ];\n\n switch (type) {\n case 'success':\n return (\n <View style={containerStyle}>\n <Text style={[styles.symbol, { color, fontSize: size * 0.65 }]}>✓</Text>\n </View>\n );\n case 'danger':\n return (\n <View style={containerStyle}>\n <Text style={[styles.symbol, { color, fontSize: size * 0.65 }]}>✕</Text>\n </View>\n );\n case 'warning':\n return (\n <View style={containerStyle}>\n <Text style={[styles.symbol, { color, fontSize: size * 0.65 }]}>!</Text>\n </View>\n );\n case 'info':\n return (\n <View style={containerStyle}>\n <Text style={[styles.symbol, { color, fontSize: size * 0.65 }]}>ℹ</Text>\n </View>\n );\n case 'default':\n default:\n return (\n <View style={containerStyle}>\n <Text style={[styles.symbol, { color, fontSize: size * 0.6 }]}>●</Text>\n </View>\n );\n }\n};\n\nconst styles = StyleSheet.create({\n circle: {\n borderWidth: 1.5,\n justifyContent: 'center',\n alignItems: 'center',\n },\n symbol: {\n fontWeight: '800',\n textAlign: 'center',\n includeFontPadding: false,\n lineHeight: 22,\n },\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.18,\n shadowRadius: 12,\n },\n android: {\n elevation: 8,\n },\n web: {\n boxShadow: '0 10px 25px -5px rgba(0, 0, 0, 0.2), 0 8px 10px -6px rgba(0, 0, 0, 0.1)',\n } as any,\n }),\n },\n floatingContainer: {\n marginHorizontal: 16,\n borderRadius: 14,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: 'rgba(255, 255, 255, 0.15)',\n },\n edgeToEdgeContainer: {\n marginHorizontal: 0,\n borderRadius: 0,\n },\n contentWrapper: {\n flex: 1,\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: 14,\n paddingHorizontal: 16,\n },\n iconContainer: {\n marginRight: 12,\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 color: '#FFFFFF',\n },\n descriptionText: {\n fontSize: 13,\n fontWeight: '400',\n color: 'rgba(255, 255, 255, 0.88)',\n marginTop: 2,\n lineHeight: 18,\n },\n actionButton: {\n marginLeft: 10,\n paddingHorizontal: 12,\n paddingVertical: 6,\n borderRadius: 8,\n backgroundColor: 'rgba(255, 255, 255, 0.2)',\n },\n actionButtonText: {\n fontSize: 13,\n fontWeight: '700',\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.25)',\n },\n progressBarFill: {\n height: '100%',\n backgroundColor: '#FFFFFF',\n },\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 // 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 position = currentMessage?.position ?? defaultPosition;\n const isTop = position === 'top';\n const isBottom = position === 'bottom';\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 targetY = isTop ? -180 : isBottom ? 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 if (currentMessage?.onHide) {\n currentMessage.onHide();\n }\n setCurrentMessage(null);\n callback?.();\n });\n },\n [clearTimers, isTop, isBottom, opacity, translateY, currentMessage]\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, // width needs layout or scaleX\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 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 ? options.duration ?? defaultDuration : 0;\n if (dur > 0) {\n startAutoHideTimer(dur);\n }\n },\n [clearTimers, defaultDuration, defaultPosition, opacity, progress, startAutoHideTimer, translateY]\n );\n\n // Register with manager and imperative ref\n useImperativeHandle(\n ref,\n () => ({\n showMessage: show,\n hideMessage: () => animateHide(),\n }),\n [show, animateHide]\n );\n\n useEffect(() => {\n const instanceRef: FlashMessageRef = {\n showMessage: show,\n hideMessage: () => animateHide(),\n };\n flashManager.register(instanceRef);\n return () => {\n flashManager.unregister();\n clearTimers();\n };\n }, [show, animateHide, clearTimers]);\n\n // PanResponder for smooth swipe-to-dismiss gesture\n const panResponder = useRef(\n PanResponder.create({\n onStartShouldSetPanResponder: () => true,\n onMoveShouldSetPanResponder: (_, gestureState) => {\n return Math.abs(gestureState.dy) > 5;\n },\n onPanResponderGrant: () => {\n if (currentMessage?.pauseOnPress ?? true) {\n pauseTimer();\n }\n },\n onPanResponderMove: (_, gestureState) => {\n if (!(currentMessage?.swipeToDismiss ?? true)) return;\n\n // Only allow dragging upwards for top, downwards for bottom\n if (isTop && gestureState.dy < 0) {\n translateY.setValue(gestureState.dy);\n } else if (isBottom && gestureState.dy > 0) {\n translateY.setValue(gestureState.dy);\n }\n },\n onPanResponderRelease: (_, gestureState) => {\n const swipeThreshold = 30;\n const isDismissGesture =\n (isTop && gestureState.dy < -swipeThreshold) ||\n (isBottom && gestureState.dy > swipeThreshold);\n\n if (isDismissGesture && (currentMessage?.swipeToDismiss ?? true)) {\n animateHide();\n } else {\n // Spring back to center\n Animated.spring(translateY, {\n toValue: 0,\n tension: 80,\n friction: 8,\n useNativeDriver: true,\n }).start();\n\n if (currentMessage?.pauseOnPress ?? true) {\n resumeTimer();\n }\n }\n },\n })\n ).current;\n\n if (!isVisible || !currentMessage) {\n return null;\n }\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 {currentMessage.icon({ size: 22, color: textColor })}\n </View>\n );\n }\n\n if (React.isValidElement(currentMessage.icon)) {\n return <View style={styles.iconContainer}>{currentMessage.icon}</View>;\n }\n\n const iconType = typeof currentMessage.icon === 'string' ? currentMessage.icon : type;\n return (\n <View style={styles.iconContainer}>\n <BuiltInIcon type={iconType as any} color={textColor} size={22} />\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 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"]}
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,6 @@
1
1
  {
2
2
  "name": "@mehul214/react-native-flash-toast",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
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
5
  "publishConfig": {
6
6
  "access": "public"
@@ -36,6 +36,9 @@ export const FlashMessage = React.forwardRef<FlashMessageRef, FlashMessageContai
36
36
  const [currentMessage, setCurrentMessage] = useState<FlashMessageOptions | null>(null);
37
37
  const [isVisible, setIsVisible] = useState(false);
38
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
+
39
42
  // Animation values
40
43
  const translateY = useRef(new Animated.Value(-150)).current;
41
44
  const opacity = useRef(new Animated.Value(0)).current;
@@ -49,10 +52,6 @@ export const FlashMessage = React.forwardRef<FlashMessageRef, FlashMessageContai
49
52
 
50
53
  const safeInsets = getDefaultSafeAreaInsets();
51
54
 
52
- const position = currentMessage?.position ?? defaultPosition;
53
- const isTop = position === 'top';
54
- const isBottom = position === 'bottom';
55
-
56
55
  const clearTimers = useCallback(() => {
57
56
  if (hideTimeoutRef.current) {
58
57
  clearTimeout(hideTimeoutRef.current);
@@ -68,7 +67,8 @@ export const FlashMessage = React.forwardRef<FlashMessageRef, FlashMessageContai
68
67
  (callback?: () => void) => {
69
68
  clearTimers();
70
69
 
71
- const targetY = isTop ? -180 : isBottom ? 180 : 0;
70
+ const pos = currentMessageRef.current?.position ?? defaultPosition;
71
+ const targetY = pos === 'top' ? -180 : pos === 'bottom' ? 180 : 0;
72
72
 
73
73
  Animated.parallel([
74
74
  Animated.timing(translateY, {
@@ -83,14 +83,16 @@ export const FlashMessage = React.forwardRef<FlashMessageRef, FlashMessageContai
83
83
  }),
84
84
  ]).start(() => {
85
85
  setIsVisible(false);
86
- if (currentMessage?.onHide) {
87
- currentMessage.onHide();
88
- }
86
+ const onHide = currentMessageRef.current?.onHide;
87
+ currentMessageRef.current = null;
89
88
  setCurrentMessage(null);
89
+ if (onHide) {
90
+ onHide();
91
+ }
90
92
  callback?.();
91
93
  });
92
94
  },
93
- [clearTimers, isTop, isBottom, opacity, translateY, currentMessage]
95
+ [clearTimers, defaultPosition, opacity, translateY]
94
96
  );
95
97
 
96
98
  const startAutoHideTimer = useCallback(
@@ -106,7 +108,7 @@ export const FlashMessage = React.forwardRef<FlashMessageRef, FlashMessageContai
106
108
  progressAnimationRef.current = Animated.timing(progress, {
107
109
  toValue: 0,
108
110
  duration: durationMs,
109
- useNativeDriver: false, // width needs layout or scaleX
111
+ useNativeDriver: false,
110
112
  });
111
113
  progressAnimationRef.current.start();
112
114
 
@@ -138,6 +140,7 @@ export const FlashMessage = React.forwardRef<FlashMessageRef, FlashMessageContai
138
140
  const show = useCallback(
139
141
  (options: FlashMessageOptions) => {
140
142
  clearTimers();
143
+ currentMessageRef.current = options;
141
144
  setCurrentMessage(options);
142
145
  setIsVisible(true);
143
146
 
@@ -167,7 +170,12 @@ export const FlashMessage = React.forwardRef<FlashMessageRef, FlashMessageContai
167
170
  });
168
171
 
169
172
  const shouldAutoHide = options.autoHide ?? true;
170
- const dur = shouldAutoHide ? options.duration ?? defaultDuration : 0;
173
+ const dur = shouldAutoHide
174
+ ? options.duration !== undefined
175
+ ? options.duration
176
+ : defaultDuration
177
+ : 0;
178
+
171
179
  if (dur > 0) {
172
180
  startAutoHideTimer(dur);
173
181
  }
@@ -175,60 +183,68 @@ export const FlashMessage = React.forwardRef<FlashMessageRef, FlashMessageContai
175
183
  [clearTimers, defaultDuration, defaultPosition, opacity, progress, startAutoHideTimer, translateY]
176
184
  );
177
185
 
178
- // Register with manager and imperative ref
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
179
193
  useImperativeHandle(
180
194
  ref,
181
195
  () => ({
182
- showMessage: show,
183
- hideMessage: () => animateHide(),
196
+ showMessage: (options: FlashMessageOptions) => showRef.current(options),
197
+ hideMessage: () => animateHideRef.current(),
184
198
  }),
185
- [show, animateHide]
199
+ []
186
200
  );
187
201
 
202
+ // Register with manager ON MOUNT only; only clean up on UNMOUNT
188
203
  useEffect(() => {
189
204
  const instanceRef: FlashMessageRef = {
190
- showMessage: show,
191
- hideMessage: () => animateHide(),
205
+ showMessage: (options: FlashMessageOptions) => showRef.current(options),
206
+ hideMessage: () => animateHideRef.current(),
192
207
  };
193
208
  flashManager.register(instanceRef);
194
209
  return () => {
195
210
  flashManager.unregister();
196
211
  clearTimers();
197
212
  };
198
- }, [show, animateHide, clearTimers]);
213
+ }, [clearTimers]);
199
214
 
200
215
  // PanResponder for smooth swipe-to-dismiss gesture
201
216
  const panResponder = useRef(
202
217
  PanResponder.create({
203
- onStartShouldSetPanResponder: () => true,
218
+ onStartShouldSetPanResponder: () => false,
204
219
  onMoveShouldSetPanResponder: (_, gestureState) => {
205
- return Math.abs(gestureState.dy) > 5;
220
+ const swipeEnabled = currentMessageRef.current?.swipeToDismiss ?? true;
221
+ return swipeEnabled && Math.abs(gestureState.dy) > 8;
206
222
  },
207
223
  onPanResponderGrant: () => {
208
- if (currentMessage?.pauseOnPress ?? true) {
224
+ if (currentMessageRef.current?.pauseOnPress ?? true) {
209
225
  pauseTimer();
210
226
  }
211
227
  },
212
228
  onPanResponderMove: (_, gestureState) => {
213
- if (!(currentMessage?.swipeToDismiss ?? true)) return;
229
+ if (!(currentMessageRef.current?.swipeToDismiss ?? true)) return;
230
+ const pos = currentMessageRef.current?.position ?? defaultPosition;
214
231
 
215
- // Only allow dragging upwards for top, downwards for bottom
216
- if (isTop && gestureState.dy < 0) {
232
+ if (pos === 'top' && gestureState.dy < 0) {
217
233
  translateY.setValue(gestureState.dy);
218
- } else if (isBottom && gestureState.dy > 0) {
234
+ } else if (pos === 'bottom' && gestureState.dy > 0) {
219
235
  translateY.setValue(gestureState.dy);
220
236
  }
221
237
  },
222
238
  onPanResponderRelease: (_, gestureState) => {
239
+ const pos = currentMessageRef.current?.position ?? defaultPosition;
223
240
  const swipeThreshold = 30;
224
241
  const isDismissGesture =
225
- (isTop && gestureState.dy < -swipeThreshold) ||
226
- (isBottom && gestureState.dy > swipeThreshold);
242
+ (pos === 'top' && gestureState.dy < -swipeThreshold) ||
243
+ (pos === 'bottom' && gestureState.dy > swipeThreshold);
227
244
 
228
- if (isDismissGesture && (currentMessage?.swipeToDismiss ?? true)) {
245
+ if (isDismissGesture && (currentMessageRef.current?.swipeToDismiss ?? true)) {
229
246
  animateHide();
230
247
  } else {
231
- // Spring back to center
232
248
  Animated.spring(translateY, {
233
249
  toValue: 0,
234
250
  tension: 80,
@@ -236,7 +252,7 @@ export const FlashMessage = React.forwardRef<FlashMessageRef, FlashMessageContai
236
252
  useNativeDriver: true,
237
253
  }).start();
238
254
 
239
- if (currentMessage?.pauseOnPress ?? true) {
255
+ if (currentMessageRef.current?.pauseOnPress ?? true) {
240
256
  resumeTimer();
241
257
  }
242
258
  }
@@ -248,6 +264,10 @@ export const FlashMessage = React.forwardRef<FlashMessageRef, FlashMessageContai
248
264
  return null;
249
265
  }
250
266
 
267
+ const position = currentMessage.position ?? defaultPosition;
268
+ const isTop = position === 'top';
269
+ const isBottom = position === 'bottom';
270
+
251
271
  const type = currentMessage.type ?? 'default';
252
272
  const typeColors = COLORS[type];
253
273
  const backgroundColor = currentMessage.backgroundColor ?? typeColors.background;
@@ -274,19 +294,27 @@ export const FlashMessage = React.forwardRef<FlashMessageRef, FlashMessageContai
274
294
  if (typeof currentMessage.icon === 'function') {
275
295
  return (
276
296
  <View style={styles.iconContainer}>
277
- {currentMessage.icon({ size: 22, color: textColor })}
297
+ <View style={styles.iconBadge}>
298
+ {currentMessage.icon({ size: 18, color: textColor })}
299
+ </View>
278
300
  </View>
279
301
  );
280
302
  }
281
303
 
282
304
  if (React.isValidElement(currentMessage.icon)) {
283
- return <View style={styles.iconContainer}>{currentMessage.icon}</View>;
305
+ return (
306
+ <View style={styles.iconContainer}>
307
+ <View style={styles.iconBadge}>{currentMessage.icon}</View>
308
+ </View>
309
+ );
284
310
  }
285
311
 
286
312
  const iconType = typeof currentMessage.icon === 'string' ? currentMessage.icon : type;
287
313
  return (
288
314
  <View style={styles.iconContainer}>
289
- <BuiltInIcon type={iconType as any} color={textColor} size={22} />
315
+ <View style={styles.iconBadge}>
316
+ <BuiltInIcon type={iconType as any} color={textColor} size={18} />
317
+ </View>
290
318
  </View>
291
319
  );
292
320
  };
@@ -328,6 +356,16 @@ export const FlashMessage = React.forwardRef<FlashMessageRef, FlashMessageContai
328
356
  ) : (
329
357
  <Pressable
330
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
+ }}
331
369
  onLongPress={currentMessage.onLongPress}
332
370
  style={styles.contentWrapper}
333
371
  >
package/src/icons.tsx CHANGED
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { View, Text, StyleSheet } from 'react-native';
2
+ import { View, StyleSheet } from 'react-native';
3
3
  import type { FlashMessageType } from './types';
4
4
 
5
5
  interface BuiltInIconProps {
@@ -10,65 +10,145 @@ interface BuiltInIconProps {
10
10
 
11
11
  export const BuiltInIcon: React.FC<BuiltInIconProps> = ({
12
12
  type,
13
- size = 22,
13
+ size = 18,
14
14
  color = '#FFFFFF',
15
15
  }) => {
16
- const containerStyle = [
17
- styles.circle,
18
- {
19
- width: size,
20
- height: size,
21
- borderRadius: size / 2,
22
- borderColor: color,
23
- },
24
- ];
25
-
26
16
  switch (type) {
27
- case 'success':
17
+ case 'success': {
18
+ // Crisp pixel-perfect checkmark
19
+ const checkWidth = size * 0.36;
20
+ const checkHeight = size * 0.65;
21
+ const stroke = Math.max(2, size * 0.12);
28
22
  return (
29
- <View style={containerStyle}>
30
- <Text style={[styles.symbol, { color, fontSize: size * 0.65 }]}>✓</Text>
23
+ <View style={[styles.center, { width: size, height: size }]}>
24
+ <View
25
+ style={{
26
+ width: checkWidth,
27
+ height: checkHeight,
28
+ borderColor: color,
29
+ borderBottomWidth: stroke,
30
+ borderRightWidth: stroke,
31
+ borderRadius: 1,
32
+ transform: [{ rotate: '45deg' }, { translateY: -size * 0.08 }],
33
+ }}
34
+ />
31
35
  </View>
32
36
  );
33
- case 'danger':
37
+ }
38
+
39
+ case 'danger': {
40
+ // Crisp pixel-perfect cross
41
+ const crossThickness = Math.max(2, size * 0.12);
42
+ const crossLength = size * 0.72;
34
43
  return (
35
- <View style={containerStyle}>
36
- <Text style={[styles.symbol, { color, fontSize: size * 0.65 }]}>✕</Text>
44
+ <View style={[styles.center, { width: size, height: size }]}>
45
+ <View
46
+ style={[
47
+ styles.crossBar,
48
+ {
49
+ width: crossLength,
50
+ height: crossThickness,
51
+ backgroundColor: color,
52
+ borderRadius: crossThickness / 2,
53
+ transform: [{ rotate: '45deg' }],
54
+ },
55
+ ]}
56
+ />
57
+ <View
58
+ style={[
59
+ styles.crossBar,
60
+ {
61
+ width: crossLength,
62
+ height: crossThickness,
63
+ backgroundColor: color,
64
+ borderRadius: crossThickness / 2,
65
+ transform: [{ rotate: '-45deg' }],
66
+ },
67
+ ]}
68
+ />
37
69
  </View>
38
70
  );
39
- case 'warning':
71
+ }
72
+
73
+ case 'warning': {
74
+ // Modern clean exclamation mark
75
+ const warnThickness = Math.max(2, size * 0.13);
76
+ const dotSize = warnThickness * 1.1;
40
77
  return (
41
- <View style={containerStyle}>
42
- <Text style={[styles.symbol, { color, fontSize: size * 0.65 }]}>!</Text>
78
+ <View style={[styles.center, { width: size, height: size }]}>
79
+ <View
80
+ style={{
81
+ width: warnThickness,
82
+ height: size * 0.46,
83
+ backgroundColor: color,
84
+ borderRadius: warnThickness / 2,
85
+ marginBottom: size * 0.14,
86
+ }}
87
+ />
88
+ <View
89
+ style={{
90
+ width: dotSize,
91
+ height: dotSize,
92
+ borderRadius: dotSize / 2,
93
+ backgroundColor: color,
94
+ }}
95
+ />
43
96
  </View>
44
97
  );
45
- case 'info':
98
+ }
99
+
100
+ case 'info': {
101
+ // Modern clean info icon: top dot, bottom stem (no double circle!)
102
+ const infoThickness = Math.max(2, size * 0.13);
103
+ const infoDotSize = infoThickness * 1.1;
46
104
  return (
47
- <View style={containerStyle}>
48
- <Text style={[styles.symbol, { color, fontSize: size * 0.65 }]}>ℹ</Text>
105
+ <View style={[styles.center, { width: size, height: size }]}>
106
+ <View
107
+ style={{
108
+ width: infoDotSize,
109
+ height: infoDotSize,
110
+ borderRadius: infoDotSize / 2,
111
+ backgroundColor: color,
112
+ marginBottom: size * 0.14,
113
+ }}
114
+ />
115
+ <View
116
+ style={{
117
+ width: infoThickness,
118
+ height: size * 0.46,
119
+ backgroundColor: color,
120
+ borderRadius: infoThickness / 2,
121
+ }}
122
+ />
49
123
  </View>
50
124
  );
125
+ }
126
+
51
127
  case 'default':
52
- default:
128
+ default: {
129
+ const defaultDot = size * 0.44;
53
130
  return (
54
- <View style={containerStyle}>
55
- <Text style={[styles.symbol, { color, fontSize: size * 0.6 }]}>●</Text>
131
+ <View style={[styles.center, { width: size, height: size }]}>
132
+ <View
133
+ style={{
134
+ width: defaultDot,
135
+ height: defaultDot,
136
+ borderRadius: defaultDot / 2,
137
+ backgroundColor: color,
138
+ }}
139
+ />
56
140
  </View>
57
141
  );
142
+ }
58
143
  }
59
144
  };
60
145
 
61
146
  const styles = StyleSheet.create({
62
- circle: {
63
- borderWidth: 1.5,
147
+ center: {
64
148
  justifyContent: 'center',
65
149
  alignItems: 'center',
66
150
  },
67
- symbol: {
68
- fontWeight: '800',
69
- textAlign: 'center',
70
- includeFontPadding: false,
71
- lineHeight: 22,
151
+ crossBar: {
152
+ position: 'absolute',
72
153
  },
73
154
  });
74
-