import { View, Text } from "react-native"; import { StyleSheet, useUnistyles } from "react-native-unistyles"; import Animated, { useAnimatedStyle, withTiming, useSharedValue } from "react-native-reanimated"; import { useEffect } from "react"; import { Upload } from "lucide-react-native"; import { useFileDropZone } from "@/hooks/use-file-drop-zone"; import type { ImageAttachment } from "./message-input"; import { isWeb } from "@/constants/platform"; interface FileDropZoneProps { children: React.ReactNode; onFilesDropped: (files: ImageAttachment[]) => void; disabled?: boolean; } const IS_WEB = isWeb; export function FileDropZone({ children, onFilesDropped, disabled = false }: FileDropZoneProps) { const { theme } = useUnistyles(); const { isDragging, containerRef } = useFileDropZone({ onFilesDropped, disabled, }); const overlayOpacity = useSharedValue(0); useEffect(() => { overlayOpacity.value = withTiming(isDragging ? 1 : 0, { duration: 150 }); }, [isDragging, overlayOpacity]); const overlayAnimatedStyle = useAnimatedStyle(() => ({ opacity: overlayOpacity.value, pointerEvents: overlayOpacity.value > 0 ? "auto" : "none", })); // On non-web platforms, just render children if (!IS_WEB) { return <>{children}; } return ( } style={styles.container} > {children} {/* Drop overlay */} {/* Backdrop */} {/* Content */} Drop images here ); } const styles = StyleSheet.create((theme) => ({ container: { flex: 1, position: "relative", }, overlay: { ...StyleSheet.absoluteFillObject, alignItems: "center", justifyContent: "center", zIndex: 1000, }, backdrop: { ...StyleSheet.absoluteFillObject, backgroundColor: theme.colors.surface0, opacity: 0.7, }, overlayContent: { alignItems: "center", gap: theme.spacing[2], }, overlayText: { fontSize: theme.fontSize.base, fontWeight: theme.fontWeight.medium, color: theme.colors.foreground, }, }));