From 470474011d969e298bd3590d6e17c72655350915 Mon Sep 17 00:00:00 2001 From: m Date: Wed, 29 Jul 2026 21:58:52 +0200 Subject: [PATCH] display folders --- backend/internal/handler/handler.go | 1 + backend/internal/handler/resource.go | 3 + mobile/App.tsx | 2 + mobile/app.json | 3 +- mobile/app/folder.tsx | 215 +++++++- mobile/app/index.tsx | 103 ++-- mobile/components/FileThumbnail.tsx | 11 +- mobile/components/SelectionPanel.tsx | 205 +++++++ mobile/contexts/SseContext.tsx | 31 +- mobile/hooks/useFiles.ts | 36 +- mobile/hooks/useSSEResource.ts | 17 + mobile/metro.config.js | 7 + mobile/package-lock.json | 793 ++++++++++++++------------- mobile/package.json | 18 +- mobile/services/fileStore/index.ts | 12 +- 15 files changed, 961 insertions(+), 496 deletions(-) create mode 100644 mobile/components/SelectionPanel.tsx create mode 100644 mobile/hooks/useSSEResource.ts create mode 100644 mobile/metro.config.js diff --git a/backend/internal/handler/handler.go b/backend/internal/handler/handler.go index fbf4e0e..3c18699 100644 --- a/backend/internal/handler/handler.go +++ b/backend/internal/handler/handler.go @@ -33,6 +33,7 @@ func New( urls: urlSvc, ocr: ocrSvc, conversion: conversionSvc, + broker: eventBroker, }, OCR: &OCRHandler{ocr: ocrSvc, resources: resourceSvc}, Health: &HealthHandler{ocr: ocrSvc}, diff --git a/backend/internal/handler/resource.go b/backend/internal/handler/resource.go index 4af5cb1..25b9aa0 100644 --- a/backend/internal/handler/resource.go +++ b/backend/internal/handler/resource.go @@ -18,6 +18,7 @@ type ResourceHandler struct { urls *service.URLService ocr *service.OCRService conversion *service.ConversionService + broker *service.EventBroker } func (h *ResourceHandler) Upload(c *gin.Context) { @@ -57,6 +58,8 @@ func (h *ResourceHandler) Upload(c *gin.Context) { "id": result.ID, "name": result.Name, }) + + h.broker.Publish("resource.created", result.ID) } api.Success(c, results) diff --git a/mobile/App.tsx b/mobile/App.tsx index 5dd9364..2d7de82 100644 --- a/mobile/App.tsx +++ b/mobile/App.tsx @@ -10,6 +10,7 @@ import { AuthProvider, useAuth } from './contexts/AuthContext'; import { DeviceProvider, useDevice } from './contexts/DeviceContext'; import { SseProvider } from './contexts/SseContext'; import { SseOcrListener } from './hooks/usePollOcr'; +import { SseResourceListener } from './hooks/useSSEResource'; import { registerBackgroundUpload } from './services/backgroundUpload'; import { LoginScreen } from './app/login'; import { RegisterScreen } from './app/register'; @@ -114,6 +115,7 @@ function AppContent() { + diff --git a/mobile/app.json b/mobile/app.json index 4a4fadc..d57b684 100644 --- a/mobile/app.json +++ b/mobile/app.json @@ -47,7 +47,8 @@ ], "expo-image", "expo-sqlite", - "expo-background-task" + "expo-background-task", + "expo-status-bar" ] } } diff --git a/mobile/app/folder.tsx b/mobile/app/folder.tsx index 00a186e..bd7dd01 100644 --- a/mobile/app/folder.tsx +++ b/mobile/app/folder.tsx @@ -1,9 +1,14 @@ import React, { useMemo, useState, useCallback, useEffect } from 'react'; -import { View, FlatList, StyleSheet, TouchableOpacity, Text, Dimensions, Alert } from 'react-native'; +import { View, FlatList, StyleSheet, TouchableOpacity, Text, Dimensions, Alert, Modal, TextInput } from 'react-native'; import { useRoute, useNavigation, RouteProp } from '@react-navigation/native'; import { NativeStackNavigationProp } from '@react-navigation/native-stack'; import { MaterialIcons } from '@expo/vector-icons'; -import { useDeleteFile, useFiles, useFreeLocalSpace } from '../hooks/useFiles'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; +import { + useDeleteFile, useFiles, useFreeLocalSpace, + useAddTags, useMoveResources, useFolders, useCreateFolder, +} from '../hooks/useFiles'; +import { SelectionPanel } from '../components/SelectionPanel'; import { UnifiedFileItem } from '../types'; import { isFolder } from '../types'; import { FileThumbnail } from '../components/FileThumbnail'; @@ -21,6 +26,7 @@ const ITEM_SIZE = (SCREEN_WIDTH - 16 * 2 - (NUM_COLUMNS - 1) * 6) / NUM_COLUMNS; type RootStackParamList = { Folder: { folderId: string; folderName: string }; FileDetail: { fileIds: string[]; initialIndex: number }; + FileEdit: { fileIds: string[] }; }; type NavigationProp = NativeStackNavigationProp; @@ -51,6 +57,7 @@ function FolderGridItem({ file, onPress, onLongPress, selected, onFolderPress }: fileName={file.name} size={ITEM_SIZE} syncStatus={file.syncStatus} + isFolder={file.isFolder} /> {selected && ( @@ -74,6 +81,17 @@ export function FolderScreen() { const queryClient = useQueryClient(); const [selectedIds, setSelectedIds] = useState>(new Set()); + const addTags = useAddTags(); + const moveFiles = useMoveResources(); + const createFolder = useCreateFolder(); + const { data: foldersData } = useFolders(); + const insets = useSafeAreaInsets(); + + const [tagModalVisible, setTagModalVisible] = useState(false); + const [tagModalMode, setTagModalMode] = useState<'tag' | 'folder'>('tag'); + const [tagInput, setTagInput] = useState(''); + const [moveModalVisible, setMoveModalVisible] = useState(false); + const selectionMode = selectedIds.size > 0; useEffect(() => { @@ -153,6 +171,50 @@ export function FolderScreen() { Alert.alert('Supprimer', `Supprimer ${label} ?`, options); }, [selectedIds, files, deleteFile, freeLocalSpace, queryClient]); + const handleEdit = useCallback(() => { + const ids = Array.from(selectedIds); + if (ids.length === 0) return; + navigation.navigate('FileEdit', { fileIds: ids }); + setSelectedIds(new Set()); + }, [selectedIds, navigation]); + + const openTagModal = useCallback((mode: 'tag' | 'folder') => { + setTagModalMode(mode); + setTagInput(''); + setTagModalVisible(true); + }, []); + + const handleAddTag = useCallback(async () => { + const name = tagInput.trim(); + if (!name) return; + const ids = Array.from(selectedIds); + for (const id of ids) { + await addTags.mutateAsync({ fileId: id, tags: [name] }); + } + setTagModalVisible(false); + setSelectedIds(new Set()); + }, [tagInput, selectedIds, addTags]); + + const handleCreateFolderFromModal = useCallback(async () => { + const name = tagInput.trim(); + if (!name) return; + const ids = Array.from(selectedIds); + try { + const newFolder = await createFolder.mutateAsync(name); + await moveFiles.mutateAsync({ resourceIds: ids, parentResourceId: newFolder.id }); + setTagModalVisible(false); + setSelectedIds(new Set()); + navigation.navigate('Folder', { folderId: newFolder.id, folderName: newFolder.name }); + } catch {} + }, [tagInput, selectedIds, createFolder, moveFiles, navigation]); + + const handleMove = useCallback(async (folderId: string | null) => { + const ids = Array.from(selectedIds); + await moveFiles.mutateAsync({ resourceIds: ids, parentResourceId: folderId }); + setMoveModalVisible(false); + setSelectedIds(new Set()); + }, [selectedIds, moveFiles]); + const handleItemPress = useCallback((file: UnifiedFileItem) => { if (selectionMode) { toggleSelection(file.id); @@ -202,21 +264,74 @@ export function FolderScreen() { /> {selectionMode && ( - - - - - - - {selectedIds.size} sélectionnée{selectedIds.size > 1 ? 's' : ''} - - - - - Supprimer - - + openTagModal('tag')} + onFolder={() => openTagModal('folder')} + onMove={() => setMoveModalVisible(true)} + insetsBottom={insets.bottom} + /> )} + + setTagModalVisible(false)}> + setTagModalVisible(false)}> + {}}> + + {tagModalMode === 'folder' ? 'Créer un dossier' : 'Ajouter un tag'} + + + + setTagModalVisible(false)}> + Annuler + + + {tagModalMode === 'folder' ? 'Créer' : 'Ajouter'} + + + + + + + setMoveModalVisible(false)}> + setMoveModalVisible(false)}> + {}}> + Déplacer vers... + handleMove(null)} + > + + Racine + + {(foldersData ?? []).map((folder) => ( + handleMove(folder.id)} + > + + {folder.name} + + ))} + + + ); } @@ -313,4 +428,72 @@ const styles = StyleSheet.create({ fontWeight: '600', color: '#F44336', }, + modalOverlay: { + flex: 1, + backgroundColor: 'rgba(0,0,0,0.4)', + justifyContent: 'center', + alignItems: 'center', + }, + modalContent: { + backgroundColor: '#fff', + borderRadius: 12, + padding: 20, + width: '80%', + }, + modalTitle: { + fontSize: 18, + fontWeight: '700', + color: '#333', + marginBottom: 16, + }, + modalInput: { + borderWidth: 1, + borderColor: '#ddd', + borderRadius: 8, + paddingHorizontal: 12, + paddingVertical: 10, + fontSize: 16, + color: '#333', + marginBottom: 16, + }, + modalActions: { + flexDirection: 'row', + justifyContent: 'flex-end', + gap: 12, + }, + modalCancelBtn: { + paddingHorizontal: 16, + paddingVertical: 8, + }, + modalCancelText: { + fontSize: 15, + color: '#666', + }, + modalConfirmBtn: { + paddingHorizontal: 16, + paddingVertical: 8, + backgroundColor: '#1976D2', + borderRadius: 8, + }, + modalConfirmDisabled: { + backgroundColor: '#ccc', + }, + modalConfirmText: { + fontSize: 15, + color: '#fff', + fontWeight: '600', + }, + folderOption: { + flexDirection: 'row', + alignItems: 'center', + paddingVertical: 12, + paddingHorizontal: 8, + gap: 10, + borderBottomWidth: 1, + borderBottomColor: '#f0f0f0', + }, + folderOptionText: { + fontSize: 16, + color: '#333', + }, }); diff --git a/mobile/app/index.tsx b/mobile/app/index.tsx index d7542a8..e90104c 100644 --- a/mobile/app/index.tsx +++ b/mobile/app/index.tsx @@ -1,12 +1,13 @@ import React, { useState, useMemo, useEffect, useCallback, useRef } from 'react'; -import { View, FlatList, StyleSheet, TouchableOpacity, Text, Dimensions, KeyboardAvoidingView, Platform, Keyboard, Alert, Modal, TextInput, ScrollView, RefreshControl, ActivityIndicator } from 'react-native'; +import { View, FlatList, StyleSheet, TouchableOpacity, Text, Dimensions, KeyboardAvoidingView, Platform, Keyboard, Alert, Modal, TextInput, ActivityIndicator } from 'react-native'; import { useNavigation } from '@react-navigation/native'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { NativeStackNavigationProp } from '@react-navigation/native-stack'; import { MaterialIcons } from '@expo/vector-icons'; import { Gesture, GestureDetector } from 'react-native-gesture-handler'; import Animated, { runOnJS, useSharedValue, useAnimatedStyle, withSpring } from 'react-native-reanimated'; -import { useAddTags, useMoveResources, useFolders, useFiles, useFreeLocalSpace } from '../hooks/useFiles'; +import { useAddTags, useMoveResources, useFolders, useFiles, useFreeLocalSpace, useCreateFolder } from '../hooks/useFiles'; +import { SelectionPanel } from '../components/SelectionPanel'; import { UnifiedFileItem, isFolder } from '../types'; import { SearchBar, SearchFilters, MediaFilter } from '../components/SearchBar'; import { FileThumbnail } from '../components/FileThumbnail'; @@ -64,6 +65,7 @@ const FileGridItem = React.memo(function FileGridItem({ file, size, onPress, onL fileName={file.name} size={size} syncStatus={file.syncStatus} + isFolder={file.isFolder} /> {selected && ( @@ -110,6 +112,7 @@ export function HomeScreen() { const [tagInput, setTagInput] = useState(''); const addTags = useAddTags(); const moveFiles = useMoveResources(); + const createFolder = useCreateFolder(); const { data: foldersData } = useFolders(); const [moveModalVisible, setMoveModalVisible] = useState(false); const [settingsModalVisible, setSettingsModalVisible] = useState(false); @@ -136,11 +139,6 @@ export function HomeScreen() { } }, [isFetching, data?.meta?.total, data?.data?.length]); - const onRefresh = useCallback(() => { - setPage(1); - refetch(); - }, [refetch]); - const totalFiles = data?.meta?.total ?? 0; const loadedFiles = data?.data?.length ?? 0; const hasMore = loadedFiles > 0 && loadedFiles < totalFiles; @@ -313,7 +311,20 @@ export function HomeScreen() { } setTagModalVisible(false); setSelectedIds(new Set()); - }, [tagInput, selectedIds, tagModalMode, addTags]); + }, [tagInput, selectedIds, addTags]); + + const handleCreateFolderFromModal = useCallback(async () => { + const name = tagInput.trim(); + if (!name) return; + const ids = Array.from(selectedIds); + try { + const newFolder = await createFolder.mutateAsync(name); + await moveFiles.mutateAsync({ resourceIds: ids, parentResourceId: newFolder.id }); + setTagModalVisible(false); + setSelectedIds(new Set()); + navigation.navigate('Folder', { folderId: newFolder.id, folderName: newFolder.name }); + } catch {} + }, [tagInput, selectedIds, createFolder, moveFiles, navigation]); const handleMove = useCallback(async (folderId: string | null) => { const ids = Array.from(selectedIds); @@ -492,14 +503,6 @@ export function HomeScreen() { contentContainerStyle={styles.list} keyboardShouldPersistTaps="handled" keyboardDismissMode="on-drag" - refreshControl={ - - } onEndReached={loadMore} onEndReachedThreshold={0.5} ListFooterComponent={ @@ -543,60 +546,16 @@ export function HomeScreen() { )} {selectionMode ? ( - - - - - - - {selectedIds.size} sélectionnée{selectedIds.size > 1 ? 's' : ''} - - - Tout - - - - - - Supprimer - - - - Éditer - - openTagModal('tag')} - > - - Tags - - openTagModal('folder')} - > - - Folder - - setMoveModalVisible(true)} - > - - Déplacer - - - + openTagModal('tag')} + onFolder={() => openTagModal('folder')} + onMove={() => setMoveModalVisible(true)} + insetsBottom={insets.bottom} + /> ) : ( {}}> @@ -636,10 +595,10 @@ export function HomeScreen() { - Ajouter + {tagModalMode === 'folder' ? 'Créer' : 'Ajouter'} diff --git a/mobile/components/FileThumbnail.tsx b/mobile/components/FileThumbnail.tsx index 527078e..f5e76d9 100644 --- a/mobile/components/FileThumbnail.tsx +++ b/mobile/components/FileThumbnail.tsx @@ -39,12 +39,21 @@ interface FileThumbnailProps { size: number; isLoading?: boolean; syncStatus?: SyncStatus; + isFolder?: boolean; } -export const FileThumbnail = React.memo(function FileThumbnail({ uri, thumbnailUrl, mimeType, fileName, size, isLoading, syncStatus }: FileThumbnailProps) { +export const FileThumbnail = React.memo(function FileThumbnail({ uri, thumbnailUrl, mimeType, fileName, size, isLoading, syncStatus, isFolder }: FileThumbnailProps) { const info = getFileInfo(mimeType, fileName); const ext = getExtension(fileName); + if (isFolder) { + return ( + + + + ); + } + if (isLoading) { return ( diff --git a/mobile/components/SelectionPanel.tsx b/mobile/components/SelectionPanel.tsx new file mode 100644 index 0000000..9955559 --- /dev/null +++ b/mobile/components/SelectionPanel.tsx @@ -0,0 +1,205 @@ +import React, { useCallback } from 'react'; +import { View, Text, StyleSheet, TouchableOpacity } from 'react-native'; +import { MaterialIcons } from '@expo/vector-icons'; +import { Gesture, GestureDetector } from 'react-native-gesture-handler'; +import Animated, { useSharedValue, useAnimatedStyle, withSpring, runOnJS } from 'react-native-reanimated'; + +const PANEL_HEIGHT = 300; +const PANEL_HEADER_VISIBLE = 80; + +interface SelectionPanelProps { + selectedCount: number; + onClose: () => void; + onDelete?: () => void; + onEdit?: () => void; + onTags?: () => void; + onFolder?: () => void; + onMove?: () => void; + insetsBottom: number; +} + +export function SelectionPanel({ + selectedCount, + onClose, + onDelete, + onEdit, + onTags, + onFolder, + onMove, + insetsBottom, +}: SelectionPanelProps) { + const panelOffset = useSharedValue(PANEL_HEIGHT - PANEL_HEADER_VISIBLE); + const panelStartY = useSharedValue(0); + const isPanelExpanded = useSharedValue(false); + const [panelExpanded, setPanelExpanded] = React.useState(false); + + const togglePanelJS = useCallback(() => { + if (isPanelExpanded.value) { + panelOffset.value = withSpring(PANEL_HEIGHT - PANEL_HEADER_VISIBLE); + isPanelExpanded.value = false; + setPanelExpanded(false); + } else { + panelOffset.value = withSpring(0); + isPanelExpanded.value = true; + setPanelExpanded(true); + } + }, []); + + const panGesture = Gesture.Pan() + .onStart(() => { + panelStartY.value = panelOffset.value; + }) + .onUpdate((event) => { + const offset = Math.max(0, Math.min(PANEL_HEIGHT - PANEL_HEADER_VISIBLE, panelStartY.value + event.translationY)); + panelOffset.value = offset; + }) + .onEnd(() => { + if (panelOffset.value > (PANEL_HEIGHT - PANEL_HEADER_VISIBLE) / 2) { + panelOffset.value = withSpring(PANEL_HEIGHT - PANEL_HEADER_VISIBLE); + isPanelExpanded.value = false; + runOnJS(setPanelExpanded)(false); + } else { + panelOffset.value = withSpring(0); + isPanelExpanded.value = true; + runOnJS(setPanelExpanded)(true); + } + }); + + const panelAnimatedStyle = useAnimatedStyle(() => ({ + transform: [{ translateY: panelOffset.value }], + })); + + return ( + + + + + + + + + + {selectedCount} sélectionnée{selectedCount > 1 ? 's' : ''} + + + Tout + + + + + + + {onDelete && ( + + + Supprimer + + )} + {onEdit && ( + + + Éditer + + )} + {onTags && ( + + + Tags + + )} + {onFolder && ( + + + Dossier + + )} + {onMove && ( + + + Déplacer + + )} + + + + + ); +} + +const styles = StyleSheet.create({ + panel: { + position: 'absolute', + bottom: 0, + left: 0, + right: 0, + backgroundColor: '#fff', + borderTopLeftRadius: 20, + borderTopRightRadius: 20, + paddingHorizontal: 20, + paddingTop: 12, + height: PANEL_HEIGHT, + shadowColor: '#000', + shadowOffset: { width: 0, height: -2 }, + shadowOpacity: 0.1, + shadowRadius: 8, + elevation: 10, + }, + panelHandle: { + width: 36, + height: 4, + borderRadius: 2, + backgroundColor: '#ddd', + alignSelf: 'center', + marginBottom: 12, + }, + panelHeader: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + marginBottom: 16, + }, + closeBtn: { + padding: 4, + }, + selectionCount: { + fontSize: 16, + fontWeight: '700', + color: '#333', + }, + selectAllBtn: { + paddingHorizontal: 8, + paddingVertical: 4, + }, + selectAllText: { + fontSize: 14, + color: '#1976D2', + fontWeight: '600', + }, + panelBody: { + flex: 1, + }, + actionsGrid: { + flexDirection: 'row', + flexWrap: 'wrap', + gap: 10, + }, + actionBtn: { + width: '47%', + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + gap: 10, + paddingVertical: 14, + borderRadius: 12, + backgroundColor: '#f5f5f5', + }, + actionLabel: { + fontSize: 15, + fontWeight: '600', + }, + deleteBtn: {}, + editBtn: {}, + tagBtn: {}, + folderBtn: {}, + moveBtn: {}, +}); diff --git a/mobile/contexts/SseContext.tsx b/mobile/contexts/SseContext.tsx index e0a9196..bd02bb9 100644 --- a/mobile/contexts/SseContext.tsx +++ b/mobile/contexts/SseContext.tsx @@ -3,18 +3,22 @@ import { apiClient } from '../api/client'; import { useAuth } from './AuthContext'; type OcrDoneCallback = (resourceId: string) => void; +type ResourceCreatedCallback = (resourceId: string) => void; interface SseContextValue { onOcrDone: (cb: OcrDoneCallback) => () => void; + onResourceCreated: (cb: ResourceCreatedCallback) => () => void; } const SseContext = createContext({ onOcrDone: () => () => {}, + onResourceCreated: () => () => {}, }); export function SseProvider({ children }: { children: React.ReactNode }) { const { user } = useAuth(); - const listenersRef = useRef>(new Set()); + const ocrListenersRef = useRef>(new Set()); + const resourceListenersRef = useRef>(new Set()); const cancelRef = useRef<() => void>(() => {}); const reconnectTimeoutRef = useRef | undefined>(undefined); @@ -28,7 +32,9 @@ export function SseProvider({ children }: { children: React.ReactNode }) { const cancel = await apiClient.subscribeEvents( (event, data) => { if (event === 'ocr_done') { - listenersRef.current.forEach((cb) => cb(data)); + ocrListenersRef.current.forEach((cb) => cb(data)); + } else if (event === 'resource.created') { + resourceListenersRef.current.forEach((cb) => cb(data)); } }, () => { @@ -62,14 +68,21 @@ export function SseProvider({ children }: { children: React.ReactNode }) { }, [connect]); const onOcrDone = useCallback((cb: OcrDoneCallback) => { - listenersRef.current.add(cb); + ocrListenersRef.current.add(cb); return () => { - listenersRef.current.delete(cb); + ocrListenersRef.current.delete(cb); + }; + }, []); + + const onResourceCreated = useCallback((cb: ResourceCreatedCallback) => { + resourceListenersRef.current.add(cb); + return () => { + resourceListenersRef.current.delete(cb); }; }, []); return ( - + {children} ); @@ -82,3 +95,11 @@ export function useOcrDone(onDone?: OcrDoneCallback) { }, [onDone, ctx]); return { onOcrDone: ctx.onOcrDone }; } + +export function useResourceCreated(onCreated?: ResourceCreatedCallback) { + const ctx = useContext(SseContext); + useEffect(() => { + if (onCreated) return ctx.onResourceCreated(onCreated); + }, [onCreated, ctx]); + return { onResourceCreated: ctx.onResourceCreated }; +} diff --git a/mobile/hooks/useFiles.ts b/mobile/hooks/useFiles.ts index 7b571c3..734cf52 100644 --- a/mobile/hooks/useFiles.ts +++ b/mobile/hooks/useFiles.ts @@ -101,11 +101,19 @@ export function useFiles(parentId?: string | null, page: number = 1, limit: numb }, placeholderData: keepPreviousData, initialData: () => { - const cached = fileStore.getRootFiles(); - if (cached.files.length === 0) return undefined; + if (!parentId) { + const cached = fileStore.getRootFiles(); + if (cached.files.length === 0) return undefined; + return { + data: cached.files.map((r) => recordToUnifiedItem(r)!).filter(Boolean), + meta: { page: 0, total: cached.total }, + }; + } + const children = fileStore.getChildrenByParent(parentId); + if (children.length === 0) return undefined; return { - data: cached.files.map((r) => recordToUnifiedItem(r)!).filter(Boolean), - meta: { page: 0, total: cached.total }, + data: children.map((r) => recordToUnifiedItem(r)!).filter(Boolean), + meta: { page: 0, total: children.length }, }; }, staleTime: 30_000, @@ -115,7 +123,10 @@ export function useFiles(parentId?: string | null, page: number = 1, limit: numb export function useFile(id: string) { return useQuery({ queryKey: ['resources', id], - queryFn: () => apiClient.get(`${ENDPOINTS.RESOURCES}/${id}?thumbnail=thumbnail_small`), + queryFn: async () => { + const res = await apiClient.get<{ data: FileItem }>(`${ENDPOINTS.RESOURCES}/${id}?thumbnail=thumbnail_small`); + return res.data; + }, enabled: !!id, }); } @@ -190,6 +201,21 @@ export function useFolders() { }); } +export function useCreateFolder() { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: async (name: string) => { + const res = await apiClient.post<{ data: FileItem }>(ENDPOINTS.FOLDERS, { name }); + return res.data; + }, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['resources'] }); + queryClient.invalidateQueries({ queryKey: ['folders'] }); + }, + }); +} + export function useFilesByParent(parentId: string) { return useFiles(parentId); } diff --git a/mobile/hooks/useSSEResource.ts b/mobile/hooks/useSSEResource.ts new file mode 100644 index 0000000..bfe7028 --- /dev/null +++ b/mobile/hooks/useSSEResource.ts @@ -0,0 +1,17 @@ +import { useEffect } from 'react'; +import { useQueryClient } from '@tanstack/react-query'; +import { useResourceCreated } from '../contexts/SseContext'; + +export function SseResourceListener() { + const queryClient = useQueryClient(); + const { onResourceCreated } = useResourceCreated(); + + useEffect(() => { + const unsub = onResourceCreated(() => { + queryClient.invalidateQueries({ queryKey: ['resources'] }); + }); + return unsub; + }, [onResourceCreated, queryClient]); + + return null; +} diff --git a/mobile/metro.config.js b/mobile/metro.config.js new file mode 100644 index 0000000..07c9fce --- /dev/null +++ b/mobile/metro.config.js @@ -0,0 +1,7 @@ +// Learn more https://docs.expo.io/guides/customizing-metro +const { getDefaultConfig } = require('expo/metro-config'); + +/** @type {import('expo/metro-config').MetroConfig} */ +const config = getDefaultConfig(__dirname); + +module.exports = config; diff --git a/mobile/package-lock.json b/mobile/package-lock.json index af10f72..d05c24b 100644 --- a/mobile/package-lock.json +++ b/mobile/package-lock.json @@ -15,18 +15,19 @@ "@tanstack/query-async-storage-persister": "^5.101.4", "@tanstack/react-query": "^5.101.2", "@tanstack/react-query-persist-client": "^5.101.4", + "babel-preset-expo": "^57.0.4", "drizzle-orm": "^0.45.2", - "expo": "~57.0.4", + "expo": "~57.0.8", "expo-background-task": "~57.0.6", - "expo-document-picker": "~57.0.0", - "expo-file-system": "~57.0.0", + "expo-document-picker": "~57.0.1", + "expo-file-system": "~57.0.1", "expo-image": "~57.0.1", - "expo-image-picker": "~57.0.2", + "expo-image-picker": "~57.0.6", "expo-media-library": "~57.0.3", - "expo-print": "~57.0.0", - "expo-secure-store": "~57.0.0", + "expo-print": "~57.0.1", + "expo-secure-store": "~57.0.1", "expo-sqlite": "~57.0.1", - "expo-status-bar": "~57.0.0", + "expo-status-bar": "~57.0.1", "expo-task-manager": "~57.0.6", "react": "19.2.3", "react-native": "0.86.0", @@ -36,11 +37,12 @@ "react-native-nitro-modules": "^0.36.1", "react-native-reanimated": "4.5.0", "react-native-safe-area-context": "~5.7.0", - "react-native-screens": "4.25.2", + "react-native-screens": "~4.26.0", "react-native-vision-camera": "^5.1.0", "react-native-worklets": "0.10.0" }, "devDependencies": { + "@expo/metro-config": "^57.0.7", "@types/react": "~19.2.2", "drizzle-kit": "^0.31.10", "typescript": "~6.0.3" @@ -2091,15 +2093,15 @@ } }, "node_modules/@expo/config": { - "version": "57.0.3", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-57.0.3.tgz", - "integrity": "sha512-IshqjjpGtT7wj86pxgsfMD1/abNMfu1wZ07ubyYO29l+PWa0eAh2TcpyLcyBaqo01IonF6646xWwrCPcdlUl3Q==", + "version": "57.0.6", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-57.0.6.tgz", + "integrity": "sha512-VpMJpB/De/fb9bBFVVBiK6Ntg9lt0kAleLH9hcZz85CYRUQ3jVFVA8rNC5f8y4cp2+FiiPNFp62+kEOFI6pDiw==", "license": "MIT", "dependencies": { - "@expo/config-plugins": "~57.0.3", - "@expo/config-types": "^57.0.1", - "@expo/json-file": "^11.0.0", - "@expo/require-utils": "^57.0.1", + "@expo/config-plugins": "~57.0.6", + "@expo/config-types": "^57.0.2", + "@expo/json-file": "^11.0.1", + "@expo/require-utils": "^57.0.4", "deepmerge": "^4.3.1", "getenv": "^2.0.0", "glob": "^13.0.0", @@ -2109,15 +2111,15 @@ } }, "node_modules/@expo/config-plugins": { - "version": "57.0.3", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-57.0.3.tgz", - "integrity": "sha512-J3P2T7FoOE9P3TuLcJXwt8jISKRxo7UntTzbJ/Qc5F7QXenNntk/4t1XndVkLucYjpnHArPd9xzDXuxxKEHVbQ==", + "version": "57.0.6", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-57.0.6.tgz", + "integrity": "sha512-7CmKrS5Rnu8aSZyNlxH2qzA7Ls1HEa4EQvEVOAkHDKPr1e4Cg/nz7I7dUl09QDTVjMvkKYDH4Th0DuAsgqASaw==", "license": "MIT", "dependencies": { - "@expo/config-types": "^57.0.1", - "@expo/json-file": "~11.0.0", - "@expo/plist": "^0.8.0", - "@expo/require-utils": "^57.0.1", + "@expo/config-types": "^57.0.2", + "@expo/json-file": "~11.0.1", + "@expo/plist": "^0.8.1", + "@expo/require-utils": "^57.0.4", "@expo/sdk-runtime-versions": "^1.0.0", "chalk": "^4.1.2", "debug": "^4.3.5", @@ -2130,9 +2132,9 @@ } }, "node_modules/@expo/config-types": { - "version": "57.0.1", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-57.0.1.tgz", - "integrity": "sha512-fo7d/Ym28uwGzdTV2leEvpsb9t+7i8YHjy471m31+cmDt4BRd/l7e94JHyrXAq4SWOBVus16S0JLqm89SRCCdw==", + "version": "57.0.2", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-57.0.2.tgz", + "integrity": "sha512-ewW08OonrcRIsRKIlFvvcmmafE5zemb1ocu3HkNwtVPyRtj2w42pZCAkMIROYpcVBaPnc3mDT9UZDzwXWC3i6g==", "license": "MIT" }, "node_modules/@expo/devcert": { @@ -2155,9 +2157,9 @@ } }, "node_modules/@expo/devtools": { - "version": "57.0.0", - "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-57.0.0.tgz", - "integrity": "sha512-i8ITQmf/wB0JNQ2gASFOKvqo1zRWCl/VfPlFRXdz6UkHen4s31NmMy0zmumS+pMpwn0+gA6oU4FF4zRDRG488Q==", + "version": "57.0.1", + "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-57.0.1.tgz", + "integrity": "sha512-GyUf+wFNkbttaX0jR7MZa9bm77U0IrLg6d2AjpxdyoXw/w4abHoXG0oFufwLMgP9zLTd5+Ct4X/ffNUTnlzZgg==", "license": "MIT", "dependencies": { "chalk": "^4.1.2" @@ -2176,9 +2178,9 @@ } }, "node_modules/@expo/env": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.4.1.tgz", - "integrity": "sha512-3c9Mg9x0HmGPEsVrGAGyEDJsNUOZ55cZvZ47/HLmXh7MHV9Zv7My73wThklKrObaBBoMfE4YqpKjYKDRzojpjQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.4.2.tgz", + "integrity": "sha512-28pqaEqwnmLduZ00Pq9HkSzE5wbj1MTwp5/n8nm8rD8MCjR9eUnVOwmNksPI3Be2ReAPO/DbPn1puy0mvoocsQ==", "license": "MIT", "dependencies": { "chalk": "^4.0.0", @@ -2190,18 +2192,18 @@ } }, "node_modules/@expo/expo-modules-macros-plugin": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@expo/expo-modules-macros-plugin/-/expo-modules-macros-plugin-0.3.0.tgz", - "integrity": "sha512-2tRq8kiIZTVZcI5uggh86HefQ7s++Zk5WkFFomNp4aUqyN5ownHHvj1jPEP9jWXaXjPDmWuf5SUZTGD5G6AKkg==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@expo/expo-modules-macros-plugin/-/expo-modules-macros-plugin-0.6.1.tgz", + "integrity": "sha512-cpsLZE4rqkc1Y3eZTkxB98jrqY1YXgetmtxFt8q89jBRmk3quRuk1BZo+VcnCSObZardjg99r1k5xijEMONFGA==", "license": "MIT" }, "node_modules/@expo/fingerprint": { - "version": "0.20.3", - "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.20.3.tgz", - "integrity": "sha512-WDV2hS87C61TsX55w4A0cPnbnN8bqdVHp2MpZsJTvB4Tv4TITgSxWYhRj/xv0pwcZvKHn05MBg6AfHPNj9o5Sw==", + "version": "0.20.6", + "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.20.6.tgz", + "integrity": "sha512-cmC/6BOPRbdKr77Mgjwszb8aM0hY2RKBpMRCmjSdn9zIcn2FGor/ic4fHVr46cQFa1G6RDGg1GyAjRw3US4CCQ==", "license": "MIT", "dependencies": { - "@expo/env": "^2.4.1", + "@expo/env": "^2.4.2", "@expo/spawn-async": "^1.8.0", "arg": "^5.0.2", "chalk": "^4.1.2", @@ -2218,12 +2220,12 @@ } }, "node_modules/@expo/image-utils": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.11.1.tgz", - "integrity": "sha512-0JueH4vdgAZQmhlSYFvTQzt4b4NO5cnByDuApw7bMUIjhwLRnT46Ki3ritMrzJMQaO2lLK2flInZbsZbOuy8nw==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.11.4.tgz", + "integrity": "sha512-pn/4770DIEOcYZr484uazuwg20FX/qaDkeMRF6J+oxejynDmEmO8wLsCudaNShFE0BhyKGQTYrs2rsRhqrqESw==", "license": "MIT", "dependencies": { - "@expo/require-utils": "^57.0.1", + "@expo/require-utils": "^57.0.4", "@expo/spawn-async": "^1.8.0", "chalk": "^4.0.0", "getenv": "^2.0.0", @@ -2233,18 +2235,18 @@ } }, "node_modules/@expo/inline-modules": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@expo/inline-modules/-/inline-modules-0.1.2.tgz", - "integrity": "sha512-wc5wH4ND647Ne/6A/ESuelcqOQUEvK8MYjjvbp5wcl59dECk7juh0cFOJjAWkpc4pLTcvqXBSRcUDpGWm5XNWg==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@expo/inline-modules/-/inline-modules-0.1.3.tgz", + "integrity": "sha512-eHSxWYfgq65mP3Qz8PclVjUkSrDIlGl3va9U7PMcTpGItOvee/i0ZzGinH5A25oARR5ouD64eESBKwtT/CwdHg==", "license": "MIT", "dependencies": { - "@expo/config-plugins": "~57.0.3" + "@expo/config-plugins": "~57.0.5" } }, "node_modules/@expo/json-file": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-11.0.0.tgz", - "integrity": "sha512-pHJCETqFL5x5BzNV6cEPwjwuECgGmnl0bNmfHIJ6LM1tlh2eVXi5HEdit3zby/JO/B8Otk5cgcqtJXgvvUat3A==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-11.0.1.tgz", + "integrity": "sha512-zxHWj4MKKMAL29ZQSY/Fssx4Thluk40JmuGNaeS078wy/NhlFhnVi+rHHunulE3xJAJ0CM73m8VK2+GkF9eRwQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.20.0", @@ -2252,12 +2254,12 @@ } }, "node_modules/@expo/local-build-cache-provider": { - "version": "57.0.2", - "resolved": "https://registry.npmjs.org/@expo/local-build-cache-provider/-/local-build-cache-provider-57.0.2.tgz", - "integrity": "sha512-/8/FoYrEBJZPG4wR8kO6REI4VRCPAStD+7wS/Ds6XXddxhmyMP3pvUJz/c3icyAoqpbqeZZkR6E1ptT5Gi5iXg==", + "version": "57.0.4", + "resolved": "https://registry.npmjs.org/@expo/local-build-cache-provider/-/local-build-cache-provider-57.0.4.tgz", + "integrity": "sha512-B/cI73shkLSYBYuFyh+zCbS+WhqJgawWPW4MPdMiNLJKv9RmV4dv1FGjsidiIiG2k4kYKerBDLK4bLbC7qERQQ==", "license": "MIT", "dependencies": { - "@expo/config": "~57.0.2", + "@expo/config": "~57.0.5", "chalk": "^4.1.2" } }, @@ -2283,10 +2285,76 @@ "metro-transform-worker": "0.84.4" } }, + "node_modules/@expo/metro-config": { + "version": "57.0.7", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-57.0.7.tgz", + "integrity": "sha512-bVfEkg4zF1cA62OqAdYXmFOooJ6TB/I+REi7Se6Ct+PbSC+89TwSqWXnYx34L08eIs4z+1ilgbATakTZpgefmQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.5", + "@expo/config": "~57.0.6", + "@expo/env": "~2.4.2", + "@expo/json-file": "~11.0.1", + "@expo/metro": "~56.0.0", + "@expo/require-utils": "^57.0.4", + "@expo/spawn-async": "^1.8.0", + "@jridgewell/gen-mapping": "^0.3.13", + "@jridgewell/remapping": "^2.3.5", + "@jridgewell/sourcemap-codec": "^1.5.5", + "browserslist": "^4.25.0", + "chalk": "^4.1.0", + "debug": "^4.3.2", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "hermes-parser": "^0.36.0", + "jsc-safe-url": "^0.2.4", + "lightningcss": "^1.30.1", + "picomatch": "^4.0.4", + "postcss": "^8.5.14", + "resolve-from": "^5.0.0" + }, + "peerDependencies": { + "expo": "*" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + } + } + }, + "node_modules/@expo/metro-config/node_modules/hermes-estree": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.36.1.tgz", + "integrity": "sha512-guv1nQ6IJ7S83NRFPWc3SA7IBZrdNC9kapwOq6uXvF4wP+sDCgjzQbKPCoyYmoyZRzztF/n/c36l/rccCZSiCw==", + "license": "MIT" + }, + "node_modules/@expo/metro-config/node_modules/hermes-parser": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.36.1.tgz", + "integrity": "sha512-GApNk4zLHi2UWoWZZkx7LNCOSzLSc5lB55pZ/PhK7ycFeg7u5LcF88p/WbpIi1XUDtE0MpHE3uRR3u3KB7TjSQ==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.36.1" + } + }, + "node_modules/@expo/metro-config/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@expo/metro-file-map": { - "version": "57.0.0", - "resolved": "https://registry.npmjs.org/@expo/metro-file-map/-/metro-file-map-57.0.0.tgz", - "integrity": "sha512-/sxwKQmwpYFYjFT6VYFpgldTwSv53OCx4/UCpLCv9iqQLVQ30hFEJsxGA9Jif8n9pacigK4P5/0ZJ2zMHm6arA==", + "version": "57.0.1", + "resolved": "https://registry.npmjs.org/@expo/metro-file-map/-/metro-file-map-57.0.1.tgz", + "integrity": "sha512-8JXfVstZN7QnP4NianZZnlTVboOWR0sG8trUDNajOjnbGlPln29vponXM84tY+3tAHapz5/TxE53L0ixUwqPtA==", "license": "MIT", "dependencies": { "debug": "^4.3.4", @@ -2298,9 +2366,9 @@ } }, "node_modules/@expo/osascript": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.7.0.tgz", - "integrity": "sha512-wKIXL8UtbuX4KwavPasIW3CUcgTbYfjzLcgUhjyKUAYDEqMaf6gmU1bqz3ffBPTokmX+G8/vFG1ZuI9etQWukA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.7.1.tgz", + "integrity": "sha512-Zn03EX6In7ts2lPUW2ESUSkEhEWQN1qqsiXjadtZMJOuZRkMiAg1ZQHuvz9DjByDWNJ2pBwAGyrts9lj9k389g==", "license": "MIT", "dependencies": { "@expo/spawn-async": "^1.8.0" @@ -2310,12 +2378,12 @@ } }, "node_modules/@expo/package-manager": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.13.0.tgz", - "integrity": "sha512-s3W3eZafJDEyVL7W/jxj2Nz3eONKxSCU604S5xj8ijrVaRz83x0DnZznLf/UXQEI1w+FyibH68nHeQyk767b1A==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.13.1.tgz", + "integrity": "sha512-y/K+CaYYpZpNGZhSX4HyLT/vyIunFjNfyoxNysPBCefeLKI/VCx6f9LNPzrxayr3rCYO5bl9O8H+HRQK265Nkg==", "license": "MIT", "dependencies": { - "@expo/json-file": "^11.0.0", + "@expo/json-file": "^11.0.1", "@expo/spawn-async": "^1.8.0", "chalk": "^4.0.0", "npm-package-arg": "^11.0.0", @@ -2324,9 +2392,9 @@ } }, "node_modules/@expo/plist": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.8.0.tgz", - "integrity": "sha512-24JlUJI4PwHN4PLydlzFEzCdiqybfaV5t04QBkOg8em3AjvHKbMgBGlKreiuOoc0rNa3DZ21ZqL+xLGMBLQNKQ==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.8.1.tgz", + "integrity": "sha512-3gTReGIUm0oRaMClsAJYxBnVPCl6fVpsl8HS+DTVxDhW4GyVyxg9E/Znm3BvcHtUJ51RJJI14pC1wvrNilCRHw==", "license": "MIT", "dependencies": { "@xmldom/xmldom": "^0.8.8", @@ -2335,27 +2403,27 @@ } }, "node_modules/@expo/prebuild-config": { - "version": "57.0.5", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-57.0.5.tgz", - "integrity": "sha512-KnKx6Iu4jppbNVtt9yTrN10OVoPZlOYYyLZuarY70u6fgUO9lYKDa06Hxv+PmIwcnygfj2CSBBl5ewBqS2bxtw==", + "version": "57.0.9", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-57.0.9.tgz", + "integrity": "sha512-8g7RoXFvO/dxvLzRE/bvphzDL4bfV0w3/4Aj6DfwvgymZ1ULz5gW2x0js94opZRoZvWw4SolH6/74hLlZT3rAA==", "license": "MIT", "dependencies": { - "@expo/config": "~57.0.2", - "@expo/config-plugins": "~57.0.3", - "@expo/config-types": "^57.0.1", - "@expo/image-utils": "^0.11.1", - "@expo/json-file": "^11.0.0", + "@expo/config": "~57.0.6", + "@expo/config-plugins": "~57.0.6", + "@expo/config-types": "^57.0.2", + "@expo/image-utils": "^0.11.4", + "@expo/json-file": "^11.0.1", "@react-native/normalize-colors": "0.86.0", "debug": "^4.3.1", - "expo-modules-autolinking": "~57.0.5", + "expo-modules-autolinking": "~57.0.9", "resolve-from": "^5.0.0", "semver": "^7.6.0" } }, "node_modules/@expo/require-utils": { - "version": "57.0.1", - "resolved": "https://registry.npmjs.org/@expo/require-utils/-/require-utils-57.0.1.tgz", - "integrity": "sha512-uXen5/4x7j60I5slShgZr5QEtJDBK8homFiNLDnDrNrxZhrRHXASo0H6JArs3/1PDzw1wahzhGWg2WKuYyZd0A==", + "version": "57.0.4", + "resolved": "https://registry.npmjs.org/@expo/require-utils/-/require-utils-57.0.4.tgz", + "integrity": "sha512-e7xbg/9BTQcsZE/oErafZXtI7kh5IgfasLJ97J5sFSzX2cA74pDvdlhW1KHVSaDkQyQv6h1LSLhsY7dEeOk7hw==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.20.0", @@ -2363,7 +2431,7 @@ "@babel/plugin-transform-modules-commonjs": "^7.24.8" }, "peerDependencies": { - "typescript": "^5.0.0 || ^5.0.0-0 || ^6.0.0" + "typescript": "^5.0.0 || ^5.0.0-0 || ^6.0.0 || ^7.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -2372,9 +2440,9 @@ } }, "node_modules/@expo/schema-utils": { - "version": "57.0.1", - "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-57.0.1.tgz", - "integrity": "sha512-IVdaqtP3+iHFRE/y22mKijQtZanLcB18q1zi2kfN6RINTCryyzM7qHGsWHc5LBJbOuj1G4avCOECs97hOJm0GQ==", + "version": "57.0.2", + "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-57.0.2.tgz", + "integrity": "sha512-fMu/jyN0l1Wzv7XkeWR4IYCx1M8ryui3FdBNGrWwbRgJ7EhxXxK8E2jxP2W3pbgUwUY0V3hG8+GyfCZwny+Lxw==", "license": "MIT" }, "node_modules/@expo/sdk-runtime-versions": { @@ -3114,9 +3182,9 @@ } }, "node_modules/agent-cli-detector": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/agent-cli-detector/-/agent-cli-detector-0.1.2.tgz", - "integrity": "sha512-qdZ/9JFORtTKJNhT/IczMeEfEUbUU0K5umYeiIQHX+AjHs+Y9SXVzSgaYlpZeyNMrvuh2HpZiOTpvS57iPfBkQ==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/agent-cli-detector/-/agent-cli-detector-0.1.4.tgz", + "integrity": "sha512-qPgevFvpaQoBaRJVKzr8R7h1WPvV3DtbgRIQlne4le66KBzXx5hNBwo/+NTw67LgkKBlhCzksrdautpUdlls0Q==", "license": "MIT", "bin": { "agent-cli-detector": "dist/cli.js" @@ -3302,6 +3370,73 @@ "@babel/plugin-syntax-flow": "^7.12.1" } }, + "node_modules/babel-preset-expo": { + "version": "57.0.4", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-57.0.4.tgz", + "integrity": "sha512-EkFcNoE23HVzQT6ZNXs/adN8+G7rqEAF6tQn6LpRPYa1YY7wmX5GxhJF0kaYMNtBndNrMTN4+0rYE17VG13KFg==", + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.20.5", + "@babel/helper-module-imports": "^7.25.9", + "@babel/plugin-proposal-decorators": "^7.12.9", + "@babel/plugin-proposal-export-default-from": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-default-from": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-transform-async-generator-functions": "^7.25.4", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.25.4", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-classes": "^7.25.4", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-flow-strip-types": "^7.25.2", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-react-display-name": "^7.24.7", + "@babel/plugin-transform-react-jsx": "^7.28.6", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.25.2", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/preset-typescript": "^7.23.0", + "@react-native/babel-plugin-codegen": "0.86.0", + "babel-plugin-react-compiler": "^1.0.0", + "babel-plugin-react-native-web": "~0.21.0", + "babel-plugin-syntax-hermes-parser": "^0.36.0", + "babel-plugin-transform-flow-enums": "^0.0.2", + "debug": "^4.3.4" + }, + "peerDependencies": { + "@babel/runtime": "^7.20.0", + "expo": "*", + "expo-widgets": "^57.0.6", + "react-refresh": ">=0.14.0 <1.0.0" + }, + "peerDependenciesMeta": { + "@babel/runtime": { + "optional": true + }, + "expo": { + "optional": true + }, + "expo-widgets": { + "optional": true + } + } + }, "node_modules/balanced-match": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", @@ -3374,15 +3509,15 @@ } }, "node_modules/brace-expansion": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", - "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz", + "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/braces": { @@ -4114,31 +4249,31 @@ } }, "node_modules/expo": { - "version": "57.0.4", - "resolved": "https://registry.npmjs.org/expo/-/expo-57.0.4.tgz", - "integrity": "sha512-5wW0SR6OnGUh+UPb3JWlFTAL22IgBcX36RqofjLAH2AuFqxAIpYIdwr9BYR9Wl3xyIe0t9lCoMQIZlAIZUNQvg==", + "version": "57.0.8", + "resolved": "https://registry.npmjs.org/expo/-/expo-57.0.8.tgz", + "integrity": "sha512-0IxxoPZbT54IH4fHL5NihkvED9HBVQx3uNdPvyv8pFUHWJ81RdFjL0aJys1IB7hbo09KTz4xW4I2aWVOXKAcJQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", - "@expo/cli": "^57.0.6", - "@expo/config": "~57.0.3", - "@expo/config-plugins": "~57.0.3", - "@expo/devtools": "~57.0.0", - "@expo/dom-webview": "~57.0.0", - "@expo/fingerprint": "^0.20.3", - "@expo/local-build-cache-provider": "^57.0.2", - "@expo/log-box": "^57.0.0", + "@expo/cli": "^57.0.10", + "@expo/config": "~57.0.6", + "@expo/config-plugins": "~57.0.6", + "@expo/devtools": "~57.0.1", + "@expo/dom-webview": "~57.0.1", + "@expo/fingerprint": "^0.20.6", + "@expo/local-build-cache-provider": "^57.0.4", + "@expo/log-box": "^57.0.1", "@expo/metro": "~56.0.0", - "@expo/metro-config": "~57.0.3", + "@expo/metro-config": "~57.0.7", "@ungap/structured-clone": "^1.3.0", - "babel-preset-expo": "~57.0.2", - "expo-asset": "~57.0.3", - "expo-constants": "~57.0.3", - "expo-file-system": "~57.0.0", - "expo-font": "~57.0.0", - "expo-keep-awake": "~57.0.0", - "expo-modules-autolinking": "~57.0.5", - "expo-modules-core": "~57.0.3", + "babel-preset-expo": "~57.0.4", + "expo-asset": "~57.0.7", + "expo-constants": "~57.0.7", + "expo-file-system": "~57.0.1", + "expo-font": "~57.0.1", + "expo-keep-awake": "~57.0.1", + "expo-modules-autolinking": "~57.0.9", + "expo-modules-core": "~57.0.7", "pretty-format": "^29.7.0", "react-refresh": "^0.14.2", "whatwg-url-minimum": "^0.1.2" @@ -4188,18 +4323,18 @@ } }, "node_modules/expo-document-picker": { - "version": "57.0.0", - "resolved": "https://registry.npmjs.org/expo-document-picker/-/expo-document-picker-57.0.0.tgz", - "integrity": "sha512-foT1pA3tD7KvcqXwjQBh4qEDjHT9U9MhZ6H2aF38VolCiHRhXDQLtKQqCeXjbHxJhSf8HC/YPV3IRxDxFTL2sA==", + "version": "57.0.1", + "resolved": "https://registry.npmjs.org/expo-document-picker/-/expo-document-picker-57.0.1.tgz", + "integrity": "sha512-qBwM5oxDZ3I9kwFD3pUE1oK/WNv9artoEKO6UpqhQgNRr0XA1ALRVWYjkF4+ge9lUNDRehjTm/jenINkzqg84g==", "license": "MIT", "peerDependencies": { "expo": "*" } }, "node_modules/expo-file-system": { - "version": "57.0.0", - "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-57.0.0.tgz", - "integrity": "sha512-G+eytNuNGMiS7dbdj1j0nAYMowXnNr1vpO+jss6nQvBlRxshcGBFMtk8xfc67ynz0MUVkzod7WwKO7Vf1iOaJw==", + "version": "57.0.1", + "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-57.0.1.tgz", + "integrity": "sha512-w7/ERvQFrGP2apTO9lDtZ+O6JQIhfakL7+Xqzh+rfMO9B4LB4qwrz+YvLgir8KFRVX64JHBnRuYBVLY1oQZcqw==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -4211,6 +4346,7 @@ "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-57.0.0.tgz", "integrity": "sha512-zF+J7WrNFjqyAADwdvDgkFEoIQv9DqcjJ57HVstNEH7/7Tx1ThPEhKraodEQOwSjMYWirP+4BYsVbdb+/Zr4QQ==", "license": "MIT", + "peer": true, "dependencies": { "fontfaceobserver": "^2.1.0" }, @@ -4241,21 +4377,21 @@ } }, "node_modules/expo-image-loader": { - "version": "57.0.0", - "resolved": "https://registry.npmjs.org/expo-image-loader/-/expo-image-loader-57.0.0.tgz", - "integrity": "sha512-EhwnoPC4T/EMdB7Nsg7qITzhO/qB0hUnmVghmtAKQwwDVaLWWYCGE4NLkes3zk9Ub451SmS/swgPp4PCPzOlnw==", + "version": "57.0.1", + "resolved": "https://registry.npmjs.org/expo-image-loader/-/expo-image-loader-57.0.1.tgz", + "integrity": "sha512-uhrZKLT/cTl2mXyR28kPpVkS5O+PK9N1QA/07IFM4f5T4g0lTW1JHT3NEWwEEsGFldPmVX4j7LwUVVZxE+woug==", "license": "MIT", "peerDependencies": { "expo": "*" } }, "node_modules/expo-image-picker": { - "version": "57.0.2", - "resolved": "https://registry.npmjs.org/expo-image-picker/-/expo-image-picker-57.0.2.tgz", - "integrity": "sha512-XW+C5weIthkOLCJZzExeRJf9pcWfaXNHSDm76gmZVhDUVIHdi9IS3eihAIF0WA0fBo9ogIfQs/iep/c6CzIMKg==", + "version": "57.0.6", + "resolved": "https://registry.npmjs.org/expo-image-picker/-/expo-image-picker-57.0.6.tgz", + "integrity": "sha512-6Of7SzyFVC+WFuFxhD4+nRTQ9joqldPhbiVWRsumg4ybttKmY8GxrnXAUSIDfa9DSk9PhgIAy2C1c5y1+CnU3g==", "license": "MIT", "dependencies": { - "expo-image-loader": "~57.0.0" + "expo-image-loader": "~57.0.1" }, "peerDependencies": { "expo": "*" @@ -4272,12 +4408,12 @@ } }, "node_modules/expo-modules-autolinking": { - "version": "57.0.5", - "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-57.0.5.tgz", - "integrity": "sha512-Vv2PVeEUN0/VW19ItkVA8LxAuH8SV8cjui0MKhJxCKrNyCAGGZU6sRsBJciYXR4uVxuXWKiepGW6E3k/c+Ytdg==", + "version": "57.0.9", + "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-57.0.9.tgz", + "integrity": "sha512-lj2nsAKMMRLXSFnGgaaQrWJ2fdSpLPc/bca6Rkiw4g8zYPn7qX4MRUJgavvzm/hBrzvMnlhXVgJtidOGuwBh+w==", "license": "MIT", "dependencies": { - "@expo/require-utils": "^57.0.1", + "@expo/require-utils": "^57.0.4", "@expo/spawn-async": "^1.8.0", "chalk": "^4.1.0", "commander": "^7.2.0" @@ -4287,13 +4423,13 @@ } }, "node_modules/expo-modules-core": { - "version": "57.0.3", - "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-57.0.3.tgz", - "integrity": "sha512-fuD3DjPQvdaldtCJm2erV2/trPMrDJvEwPdz0RuxAQnduiNwZ3yxBoi81ZEKC5GBSJauMo53YXSwogsFagjwFQ==", + "version": "57.0.7", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-57.0.7.tgz", + "integrity": "sha512-5HrbCfgYmLs0a5dzfM4GmRGelVTPIg+eYp0vmSbWnKRTOPj5DyVOfg1rHGEsuNKp07QwDxfLJfQVp8CNbuvxMQ==", "license": "MIT", "dependencies": { - "@expo/expo-modules-macros-plugin": "0.3.0", - "expo-modules-jsi": "~57.0.1", + "@expo/expo-modules-macros-plugin": "0.6.1", + "expo-modules-jsi": "~57.0.4", "invariant": "^2.2.4" }, "peerDependencies": { @@ -4308,18 +4444,18 @@ } }, "node_modules/expo-modules-jsi": { - "version": "57.0.1", - "resolved": "https://registry.npmjs.org/expo-modules-jsi/-/expo-modules-jsi-57.0.1.tgz", - "integrity": "sha512-dECN3pOFv+KrQcGrOhJKEBc1/ob7SBjTTYGRB1bc84zmQ65La0FSrAPxpvnEQf8g9giLB5y9RLqwGxHspjXigQ==", + "version": "57.0.4", + "resolved": "https://registry.npmjs.org/expo-modules-jsi/-/expo-modules-jsi-57.0.4.tgz", + "integrity": "sha512-vt7FyqUqqFXiRVnBqYD7y+GSPTgeua5Ocoy0+SYt+RSHkZEA2Fyop7If3g1TYDzQObYybPRo7TG2Rle1XLaWFw==", "license": "MIT", "peerDependencies": { "react-native": "*" } }, "node_modules/expo-print": { - "version": "57.0.0", - "resolved": "https://registry.npmjs.org/expo-print/-/expo-print-57.0.0.tgz", - "integrity": "sha512-RgZCt1up7/jB1i9DpriiStjEYpJrQlw8rIICHfs/7WUNOA2sq3CEJu0knRHZwITo3/+L3c1Pfgh5S6i5eh0OMg==", + "version": "57.0.1", + "resolved": "https://registry.npmjs.org/expo-print/-/expo-print-57.0.1.tgz", + "integrity": "sha512-cEfxM+sV5suZyqbXsOmDGRHD+UmfAh2GWabbakdkl1s70L4MFiObPtC73ATXNjeUe+mlzxLhudoTxsuyJxk8Mg==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -4327,18 +4463,18 @@ } }, "node_modules/expo-secure-store": { - "version": "57.0.0", - "resolved": "https://registry.npmjs.org/expo-secure-store/-/expo-secure-store-57.0.0.tgz", - "integrity": "sha512-vkP16rhW7b4bljW5BC4kKXBpNxQ0O1E9SpI5NIfh2biZnszLTpI/gUF4oBsvOY2nvkh7oXS2ERuUoA8cuS8FWQ==", + "version": "57.0.1", + "resolved": "https://registry.npmjs.org/expo-secure-store/-/expo-secure-store-57.0.1.tgz", + "integrity": "sha512-tLa1VmSadOq19mA/dwkl99RbHyjLE0T1qqBYMY3/OsguZTI+rlrDy/DDJjupqlVtmr95hD7o1pYqx5aL+B4YMA==", "license": "MIT", "peerDependencies": { "expo": "*" } }, "node_modules/expo-server": { - "version": "57.0.0", - "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-57.0.0.tgz", - "integrity": "sha512-18byjwFbHVFrGzI4IH1o2MZiiYwvO/y3d+JL3sq50Lg3Id1titwIRMh1fjbHbpM+wP6x14KJY0Ers1UYsjGq8Q==", + "version": "57.0.1", + "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-57.0.1.tgz", + "integrity": "sha512-sBfVDH6dmKVHZxqUxbfkzS00PZELMZt1IpnHKxcOTMZtR/t7CtRAFrbXcisG+EyzeqHSVDacZT+1tbYfZt5D8w==", "license": "MIT", "engines": { "node": ">=20.16.0" @@ -4359,9 +4495,9 @@ } }, "node_modules/expo-status-bar": { - "version": "57.0.0", - "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-57.0.0.tgz", - "integrity": "sha512-wq1fDVAjfrzCj67hOcvEkGpgRrb6xVI7oSA3bfsQ08SFk8il7vGixJq+xyEbtdcrI9CDiNKQrT3ZIjgnyGbbBA==", + "version": "57.0.1", + "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-57.0.1.tgz", + "integrity": "sha512-Xwaq1gAoVRWx5dPG5VhT5RSbnI9OilhZnO5qoPBnUaBAa5VzRzfdS8q0/bsPt0jR2DKLtGuP0bQ6efMJ4RIMDg==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -4383,30 +4519,30 @@ } }, "node_modules/expo/node_modules/@expo/cli": { - "version": "57.0.6", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-57.0.6.tgz", - "integrity": "sha512-14wEb2e8lctlxGARbinUEr+9EmrTR2jIgcaPBBkZXDFMRJmdoY0ic18JuFJPi+7CuQ4XWiGK6obN4VK2PXosLA==", + "version": "57.0.10", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-57.0.10.tgz", + "integrity": "sha512-mP+B9ZrTnRE94bxPM/kCVKPyuVuOTRvvsqbXVxdXtrAfOfF94YIZLGUtw/151cGFtdUPbsBsJ9gW02LhU+QMZA==", "license": "MIT", "dependencies": { "@expo/code-signing-certificates": "^0.0.6", - "@expo/config": "~57.0.3", - "@expo/config-plugins": "~57.0.3", + "@expo/config": "~57.0.6", + "@expo/config-plugins": "~57.0.6", "@expo/devcert": "^1.2.1", - "@expo/env": "~2.4.1", - "@expo/image-utils": "^0.11.1", - "@expo/inline-modules": "^0.1.2", - "@expo/json-file": "^11.0.0", - "@expo/log-box": "^57.0.0", + "@expo/env": "~2.4.2", + "@expo/image-utils": "^0.11.4", + "@expo/inline-modules": "^0.1.3", + "@expo/json-file": "^11.0.1", + "@expo/log-box": "^57.0.1", "@expo/metro": "~56.0.0", - "@expo/metro-config": "~57.0.3", - "@expo/metro-file-map": "^57.0.0", - "@expo/osascript": "^2.7.0", - "@expo/package-manager": "^1.13.0", - "@expo/plist": "^0.8.0", - "@expo/prebuild-config": "^57.0.5", - "@expo/require-utils": "^57.0.1", - "@expo/router-server": "^57.0.2", - "@expo/schema-utils": "^57.0.1", + "@expo/metro-config": "~57.0.7", + "@expo/metro-file-map": "^57.0.1", + "@expo/osascript": "^2.7.1", + "@expo/package-manager": "^1.13.1", + "@expo/plist": "^0.8.1", + "@expo/prebuild-config": "^57.0.9", + "@expo/require-utils": "^57.0.4", + "@expo/router-server": "^57.0.4", + "@expo/schema-utils": "^57.0.2", "@expo/spawn-async": "^1.8.0", "@expo/ws-tunnel": "^2.0.0", "@expo/xcpretty": "^4.4.4", @@ -4422,7 +4558,7 @@ "connect": "^3.7.0", "debug": "^4.3.4", "dnssd-advertise": "^1.1.4", - "expo-server": "^57.0.0", + "expo-server": "^57.0.1", "fetch-nodeshim": "^0.4.10", "getenv": "^2.0.0", "glob": "^13.0.0", @@ -4465,20 +4601,20 @@ } }, "node_modules/expo/node_modules/@expo/cli/node_modules/@expo/router-server": { - "version": "57.0.2", - "resolved": "https://registry.npmjs.org/@expo/router-server/-/router-server-57.0.2.tgz", - "integrity": "sha512-hu9qhnq2PKuwMXIoRMAa2+HUeqSut9HwiQf3a62tfGTIxPN3rKUZ10TozEEB+Pd/7WIa238sXMS5v1YhTuC9gA==", + "version": "57.0.4", + "resolved": "https://registry.npmjs.org/@expo/router-server/-/router-server-57.0.4.tgz", + "integrity": "sha512-ucqCP0hK8nZb9+S8QJYdQxNCkfRClzkKdg2RpWYDKDYgRIHyoRyxEDRgDgvbhH+q78yfY83abU8OTx8MMOrf1g==", "license": "MIT", "dependencies": { "debug": "^4.3.4" }, "peerDependencies": { - "@expo/metro-runtime": "^57.0.3", + "@expo/metro-runtime": "^57.0.7", "expo": "*", - "expo-constants": "^57.0.3", - "expo-font": "^57.0.0", + "expo-constants": "^57.0.7", + "expo-font": "^57.0.1", "expo-router": "*", - "expo-server": "^57.0.0", + "expo-server": "^57.0.1", "react": "*", "react-dom": "*", "react-server-dom-webpack": "~19.0.1 || ~19.1.2 || ~19.2.1" @@ -4499,9 +4635,9 @@ } }, "node_modules/expo/node_modules/@expo/dom-webview": { - "version": "57.0.0", - "resolved": "https://registry.npmjs.org/@expo/dom-webview/-/dom-webview-57.0.0.tgz", - "integrity": "sha512-zBZw52KnaHf9zGVp1eJk8kNfc+5ArGf+KvTL3SeMsr03K6tPJtLbgycVLjrAiLMfhzqGVjPD2G+rbNwpbLUxcg==", + "version": "57.0.1", + "resolved": "https://registry.npmjs.org/@expo/dom-webview/-/dom-webview-57.0.1.tgz", + "integrity": "sha512-lAKsME4SAq+8sf56oN0DX5TBYyruupoRxbWbD2xf9RnKY8y6x8eb9LCE5pxSN0qyWdqnp+0wmyWzDkKboThKAw==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -4510,61 +4646,22 @@ } }, "node_modules/expo/node_modules/@expo/log-box": { - "version": "57.0.0", - "resolved": "https://registry.npmjs.org/@expo/log-box/-/log-box-57.0.0.tgz", - "integrity": "sha512-tt9x76IEE8hp2FWTLPfEArrTyD7GCoUe3TpohESy+SPZ/OqkUnSXz40xnUuE0XbE132z8c5CRCfXQLM9DTEknQ==", + "version": "57.0.1", + "resolved": "https://registry.npmjs.org/@expo/log-box/-/log-box-57.0.1.tgz", + "integrity": "sha512-fuVNHhOerdRWtpq27gD6JTSVYESsfRu+SMdrNCWxW+gFnusS6dGKfx3lKGBZ4ZkMNiLWn8maBHo39YKzJNXFYQ==", "license": "MIT", "dependencies": { - "@expo/dom-webview": "^57.0.0", + "@expo/dom-webview": "^57.0.1", "anser": "^1.4.9", "stacktrace-parser": "^0.1.10" }, "peerDependencies": { - "@expo/dom-webview": "^57.0.0", + "@expo/dom-webview": "^57.0.1", "expo": "*", "react": "*", "react-native": "*" } }, - "node_modules/expo/node_modules/@expo/metro-config": { - "version": "57.0.3", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-57.0.3.tgz", - "integrity": "sha512-k7qcjTe1xDrUW15Ue86WAsJSL0ubiSluBXVNRFoe9snAWhMzBGzdZfl9XiDf4TNUV43T0L1ch+n4GmDqamvfEg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.20.0", - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.5", - "@expo/config": "~57.0.2", - "@expo/env": "~2.4.1", - "@expo/json-file": "~11.0.0", - "@expo/metro": "~56.0.0", - "@expo/require-utils": "^57.0.1", - "@expo/spawn-async": "^1.8.0", - "@jridgewell/gen-mapping": "^0.3.13", - "@jridgewell/remapping": "^2.3.5", - "@jridgewell/sourcemap-codec": "^1.5.5", - "browserslist": "^4.25.0", - "chalk": "^4.1.0", - "debug": "^4.3.2", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "hermes-parser": "^0.36.0", - "jsc-safe-url": "^0.2.4", - "lightningcss": "^1.30.1", - "picomatch": "^4.0.4", - "postcss": "^8.5.14", - "resolve-from": "^5.0.0" - }, - "peerDependencies": { - "expo": "*" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - } - } - }, "node_modules/expo/node_modules/@expo/ws-tunnel": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-2.0.0.tgz", @@ -4587,73 +4684,6 @@ "node": ">= 0.6" } }, - "node_modules/expo/node_modules/babel-preset-expo": { - "version": "57.0.2", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-57.0.2.tgz", - "integrity": "sha512-PgsWlNSlNhnSkU4UCAcvl252CaB7VU1eQuSvJoRSiqfrZDGmeqwQmMUs+PcS5VUppFwmmhVlDPwOc7kR3Qr08Q==", - "license": "MIT", - "dependencies": { - "@babel/generator": "^7.20.5", - "@babel/helper-module-imports": "^7.25.9", - "@babel/plugin-proposal-decorators": "^7.12.9", - "@babel/plugin-proposal-export-default-from": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-default-from": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-transform-async-generator-functions": "^7.25.4", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.25.4", - "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-classes": "^7.25.4", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-react-display-name": "^7.24.7", - "@babel/plugin-transform-react-jsx": "^7.28.6", - "@babel/plugin-transform-react-jsx-development": "^7.27.1", - "@babel/plugin-transform-react-pure-annotations": "^7.27.1", - "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/plugin-transform-typescript": "^7.25.2", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/preset-typescript": "^7.23.0", - "@react-native/babel-plugin-codegen": "0.86.0", - "babel-plugin-react-compiler": "^1.0.0", - "babel-plugin-react-native-web": "~0.21.0", - "babel-plugin-syntax-hermes-parser": "^0.36.0", - "babel-plugin-transform-flow-enums": "^0.0.2", - "debug": "^4.3.4" - }, - "peerDependencies": { - "@babel/runtime": "^7.20.0", - "expo": "*", - "expo-widgets": "^57.0.3", - "react-refresh": ">=0.14.0 <1.0.0" - }, - "peerDependenciesMeta": { - "@babel/runtime": { - "optional": true - }, - "expo": { - "optional": true - }, - "expo-widgets": { - "optional": true - } - } - }, "node_modules/expo/node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -4670,13 +4700,13 @@ } }, "node_modules/expo/node_modules/expo-asset": { - "version": "57.0.3", - "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-57.0.3.tgz", - "integrity": "sha512-6E08JDuYrktY5pKNn2WiFBPBfj6bvFb++ccuBTijK8BUk/afSoy6n35h583LmC2YHgHTepWHHWNfr61nYcMd8Q==", + "version": "57.0.7", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-57.0.7.tgz", + "integrity": "sha512-TA6MRQq1HL0N6KGvNMzL6djdH5tGJ/eHPIhML+6bVu52mnXldmup2swdvP37zDnvoMUUXRVGsvwVHFmvhCbW6Q==", "license": "MIT", "dependencies": { - "@expo/image-utils": "^0.11.1", - "expo-constants": "~57.0.3" + "@expo/image-utils": "^0.11.4", + "expo-constants": "~57.0.7" }, "peerDependencies": { "expo": "*", @@ -4685,43 +4715,42 @@ } }, "node_modules/expo/node_modules/expo-constants": { - "version": "57.0.3", - "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-57.0.3.tgz", - "integrity": "sha512-BghbZlzwFnA22BG0CWv6W29zx8w19FozYPfSeZ3HjMitoy4aAmF1FnFbbjYSmZz6HHXXTWOfqwobOEIaglfzxg==", + "version": "57.0.7", + "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-57.0.7.tgz", + "integrity": "sha512-ShDwaKnh3UieCQ/dG0kO8PuicTTatn3WDGmXbq/fukyzPXWhdUxf37DINVDQS6D3DDG7nfqItij+QvnDHSQhTg==", "license": "MIT", "dependencies": { - "@expo/env": "~2.4.1" + "@expo/env": "~2.4.2" }, "peerDependencies": { "expo": "*", "react-native": "*" } }, + "node_modules/expo/node_modules/expo-font": { + "version": "57.0.1", + "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-57.0.1.tgz", + "integrity": "sha512-QyS9L1Kh9sKJg4gfU6rdbpxpmH+DyzBX8z6jVvXMUDoqLr1GqmkO/Wu379KCXjL///kWbhpNlbi7AgBuj4VdIQ==", + "license": "MIT", + "dependencies": { + "fontfaceobserver": "^2.1.0" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, "node_modules/expo/node_modules/expo-keep-awake": { - "version": "57.0.0", - "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-57.0.0.tgz", - "integrity": "sha512-WqEoyDNSmUeAI9Gu7UaWKDjOhfaV+jGcms7N0hh/EAr7sqJrI2s0HpLSC3P9cWfXFUZCL1zZjd22m/NbsJYCKg==", + "version": "57.0.1", + "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-57.0.1.tgz", + "integrity": "sha512-28lkFImeXTS+bhAjuCFV7w7tW5bXg27BJVrxv+nC/nyYa86qEa0oFeHwqol6ha5k4pdVDQgBF09GM4A1k76Ssg==", "license": "MIT", "peerDependencies": { "expo": "*", "react": "*" } }, - "node_modules/expo/node_modules/hermes-estree": { - "version": "0.36.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.36.1.tgz", - "integrity": "sha512-guv1nQ6IJ7S83NRFPWc3SA7IBZrdNC9kapwOq6uXvF4wP+sDCgjzQbKPCoyYmoyZRzztF/n/c36l/rccCZSiCw==", - "license": "MIT" - }, - "node_modules/expo/node_modules/hermes-parser": { - "version": "0.36.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.36.1.tgz", - "integrity": "sha512-GApNk4zLHi2UWoWZZkx7LNCOSzLSc5lB55pZ/PhK7ycFeg7u5LcF88p/WbpIi1XUDtE0MpHE3uRR3u3KB7TjSQ==", - "license": "MIT", - "dependencies": { - "hermes-estree": "0.36.1" - } - }, "node_modules/expo/node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -4765,9 +4794,9 @@ } }, "node_modules/expo/node_modules/ws": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "version": "8.21.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz", + "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -5419,9 +5448,9 @@ "license": "MIT" }, "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", "license": "MPL-2.0", "dependencies": { "detect-libc": "^2.0.3" @@ -5434,23 +5463,23 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" } }, "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", "cpu": [ "arm64" ], @@ -5468,9 +5497,9 @@ } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", "cpu": [ "arm64" ], @@ -5488,9 +5517,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", "cpu": [ "x64" ], @@ -5508,9 +5537,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", "cpu": [ "x64" ], @@ -5528,9 +5557,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", "cpu": [ "arm" ], @@ -5548,9 +5577,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", "cpu": [ "arm64" ], @@ -5568,9 +5597,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", "cpu": [ "arm64" ], @@ -5588,9 +5617,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", "cpu": [ "x64" ], @@ -5608,9 +5637,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", "cpu": [ "x64" ], @@ -5628,9 +5657,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", "cpu": [ "arm64" ], @@ -5648,9 +5677,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", "cpu": [ "x64" ], @@ -6138,12 +6167,12 @@ } }, "node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.5" + "brace-expansion": "^5.0.8" }, "engines": { "node": "18 || 20 || >=22" @@ -6186,9 +6215,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.15", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", - "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", "funding": [ { "type": "github", @@ -6539,9 +6568,9 @@ } }, "node_modules/postcss": { - "version": "8.5.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", - "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", + "version": "8.5.25", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz", + "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==", "funding": [ { "type": "opencollective", @@ -6558,7 +6587,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.12", + "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -6851,9 +6880,9 @@ } }, "node_modules/react-native-screens": { - "version": "4.25.2", - "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.25.2.tgz", - "integrity": "sha512-1Nj1fusFd+rIMKU/qC9yGKVG+3ofh11d3OdBQKL1iVvQfKvcB8vhvTGQf2TkfxW3bamxN+hCZIXmNuU0mRkyDg==", + "version": "4.26.2", + "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.26.2.tgz", + "integrity": "sha512-2XnWsZToKj76trGtEZzx5ELD/qOICFEprEeUntImmitQFVUkea27fiWdUSITArI356Y1qynpXZINW+Unbhky/A==", "license": "MIT", "dependencies": { "react-freeze": "^1.0.0", @@ -6861,7 +6890,7 @@ }, "peerDependencies": { "react": "*", - "react-native": ">=0.82.0" + "react-native": "*" } }, "node_modules/react-native-vision-camera": { @@ -7068,9 +7097,9 @@ "license": "MIT" }, "node_modules/sax": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", - "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", + "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", "license": "BlueOak-1.0.0", "engines": { "node": ">=11.0.0" diff --git a/mobile/package.json b/mobile/package.json index 6e57aa0..dfc9e05 100644 --- a/mobile/package.json +++ b/mobile/package.json @@ -10,18 +10,19 @@ "@tanstack/query-async-storage-persister": "^5.101.4", "@tanstack/react-query": "^5.101.2", "@tanstack/react-query-persist-client": "^5.101.4", + "babel-preset-expo": "^57.0.4", "drizzle-orm": "^0.45.2", - "expo": "~57.0.4", + "expo": "~57.0.8", "expo-background-task": "~57.0.6", - "expo-document-picker": "~57.0.0", - "expo-file-system": "~57.0.0", + "expo-document-picker": "~57.0.1", + "expo-file-system": "~57.0.1", "expo-image": "~57.0.1", - "expo-image-picker": "~57.0.2", + "expo-image-picker": "~57.0.6", "expo-media-library": "~57.0.3", - "expo-print": "~57.0.0", - "expo-secure-store": "~57.0.0", + "expo-print": "~57.0.1", + "expo-secure-store": "~57.0.1", "expo-sqlite": "~57.0.1", - "expo-status-bar": "~57.0.0", + "expo-status-bar": "~57.0.1", "expo-task-manager": "~57.0.6", "react": "19.2.3", "react-native": "0.86.0", @@ -31,11 +32,12 @@ "react-native-nitro-modules": "^0.36.1", "react-native-reanimated": "4.5.0", "react-native-safe-area-context": "~5.7.0", - "react-native-screens": "4.25.2", + "react-native-screens": "~4.26.0", "react-native-vision-camera": "^5.1.0", "react-native-worklets": "0.10.0" }, "devDependencies": { + "@expo/metro-config": "^57.0.7", "@types/react": "~19.2.2", "drizzle-kit": "^0.31.10", "typescript": "~6.0.3" diff --git a/mobile/services/fileStore/index.ts b/mobile/services/fileStore/index.ts index 37e36f1..3ef5562 100644 --- a/mobile/services/fileStore/index.ts +++ b/mobile/services/fileStore/index.ts @@ -308,12 +308,12 @@ export const fileStore = { const d = getDb(); const countRow = d.select({ count: sql`count(*)` }) .from(files) - .where(and(isNull(files.parentResourceId), eq(files.isFolder, 0))) + .where(isNull(files.parentResourceId)) .get(); const total = countRow?.count ?? 0; const rows = d.select().from(files) - .where(and(isNull(files.parentResourceId), eq(files.isFolder, 0))) - .orderBy(desc(files.createdAt)) + .where(isNull(files.parentResourceId)) + .orderBy(desc(files.isFolder), desc(files.createdAt)) .all() as FileRow[]; return { files: rows.map((r) => rowToRecord(r, getTagsForFile(r.id))), @@ -327,13 +327,13 @@ export const fileStore = { const countRow = d.select({ count: sql`count(*)` }) .from(files) - .where(and(isNull(files.parentResourceId), eq(files.isFolder, 0))) + .where(isNull(files.parentResourceId)) .get(); const total = countRow?.count ?? 0; const rows = d.select().from(files) - .where(and(isNull(files.parentResourceId), eq(files.isFolder, 0))) - .orderBy(desc(files.createdAt)) + .where(isNull(files.parentResourceId)) + .orderBy(desc(files.isFolder), desc(files.createdAt)) .limit(limit) .offset(offset) .all() as FileRow[];