Skip to content

Commit 8be6215

Browse files
committed
fix: camera upload parent dir fetching
1 parent 4770604 commit 8be6215

File tree

9 files changed

+92
-125
lines changed

9 files changed

+92
-125
lines changed

app/(app)/drive/[uuid].tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
import { useLocalSearchParams } from "expo-router"
2-
import { memo, Fragment, useMemo } from "react"
1+
import { useLocalSearchParams, useFocusEffect } from "expo-router"
2+
import { memo, Fragment, useMemo, useCallback } from "react"
33
import DriveList from "@/components/drive/list"
44
import useSDKConfig from "@/hooks/useSDKConfig"
55
import Header from "@/components/drive/header"
66
import { validate as validateUUID } from "uuid"
7+
import { foregroundCameraUpload } from "@/lib/cameraUpload"
78

89
export const Drive = memo(() => {
910
const { uuid, scrollToUUID } = useLocalSearchParams()
@@ -22,6 +23,20 @@ export const Drive = memo(() => {
2223
return typeof scrollToUUID === "string" && validateUUID(scrollToUUID) ? scrollToUUID : undefined
2324
}, [scrollToUUID])
2425

26+
useFocusEffect(
27+
useCallback(() => {
28+
if (queryParams.parent === baseFolderUUID) {
29+
foregroundCameraUpload.run().catch(console.error)
30+
}
31+
32+
return () => {
33+
if (queryParams.parent === baseFolderUUID) {
34+
foregroundCameraUpload.run().catch(console.error)
35+
}
36+
}
37+
}, [queryParams.parent, baseFolderUUID])
38+
)
39+
2540
return (
2641
<Fragment>
2742
<Header queryParams={queryParams} />

app/(app)/home/index.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { memo, useState, Fragment, useMemo, useCallback, useEffect } from "react"
1+
import { memo, useState, Fragment, useMemo, useCallback } from "react"
22
import { Button } from "@/components/nativewindui/Button"
33
import { LargeTitleHeader } from "@/components/nativewindui/LargeTitleHeader"
44
import { useColorScheme } from "@/lib/useColorScheme"
@@ -405,16 +405,16 @@ export const Home = memo(() => {
405405
trashQuery.status
406406
])
407407

408-
useEffect(() => {
409-
foregroundCameraUpload.run().catch(console.error)
410-
}, [])
411-
412408
useFocusEffect(
413409
useCallback(() => {
414410
useDriveStore.getState().setSelectedItems([])
415411

412+
foregroundCameraUpload.run().catch(console.error)
413+
416414
return () => {
417415
useDriveStore.getState().setSelectedItems([])
416+
417+
foregroundCameraUpload.run().catch(console.error)
418418
}
419419
}, [])
420420
)

app/(app)/photos/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,8 @@ export const Photos = memo(() => {
441441

442442
return () => {
443443
usePhotosStore.getState().setSelectedItems([])
444+
445+
foregroundCameraUpload.run().catch(console.error)
444446
}
445447
}, [])
446448
)

app/_layout.tsx

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -170,14 +170,6 @@ export default function RootLayout() {
170170
name="selectTrackPlayerPlaylists"
171171
options={SCREEN_OPTIONS.modal}
172172
/>
173-
<Stack.Screen
174-
name="settings"
175-
options={SCREEN_OPTIONS.base}
176-
/>
177-
<Stack.Screen
178-
name="photosSettings"
179-
options={SCREEN_OPTIONS.base}
180-
/>
181173
</Stack>
182174
<Listeners />
183175
{isAuthed && (

app/photosSettings/index.tsx

Lines changed: 39 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { memo, useCallback, useMemo } from "react"
22
import { Settings as SettingsComponent, IconView } from "@/components/settings"
33
import { Toggle } from "@/components/nativewindui/Toggle"
4-
import useCameraUpload from "@/hooks/useCameraUpload"
5-
import { useRouter, useFocusEffect } from "expo-router"
4+
import useCameraUpload, { setCameraUploadState } from "@/hooks/useCameraUpload"
5+
import { useRouter } from "expo-router"
66
import driveService from "@/services/drive.service"
77
import nodeWorker from "@/lib/nodeWorker"
88
import alerts from "@/lib/alerts"
@@ -15,7 +15,7 @@ import { foregroundCameraUpload } from "@/lib/cameraUpload"
1515
import { View } from "react-native"
1616

1717
export const Settings = memo(() => {
18-
const [cameraUpload, setCameraUpload] = useCameraUpload()
18+
const [cameraUpload] = useCameraUpload()
1919
const { push: routerPush } = useRouter()
2020

2121
const [permissions, requestPermissions] = MediaLibrary.usePermissions({
@@ -35,103 +35,68 @@ export const Settings = memo(() => {
3535
return cameraUploadParentQuery.data !== null
3636
}, [cameraUploadParentQuery.data, cameraUploadParentQuery.status, cameraUpload.enabled])
3737

38-
const toggleEnabled = useCallback(
39-
async (enable: boolean) => {
40-
setCameraUpload(prev => ({
41-
...prev,
42-
enabled: enable,
43-
version: (prev.version ?? 0) + 1,
44-
onlyDeltasAfterActivationTimestamp:
45-
enable && (prev.onlyDeltasAfterActivation ?? false) ? Date.now() : prev.onlyDeltasAfterActivationTimestamp
46-
}))
38+
const toggleEnabled = useCallback(async (enable: boolean) => {
39+
setCameraUploadState(prev => ({
40+
...prev,
41+
enabled: enable,
42+
version: (prev.version ?? 0) + 1,
43+
enabledTimestamp: Date.now()
44+
}))
4745

48-
if (enable) {
49-
setTimeout(() => {
50-
cameraUploadParentQuery.refetch().catch(console.error)
51-
foregroundCameraUpload.run().catch(console.error)
52-
}, 1000)
53-
}
54-
},
55-
[setCameraUpload, cameraUploadParentQuery]
56-
)
46+
if (enable) {
47+
setTimeout(() => {
48+
foregroundCameraUpload.run().catch(console.error)
49+
}, 1000)
50+
}
51+
}, [])
5752

5853
const toggleCellular = useCallback(() => {
59-
setCameraUpload(prev => ({
54+
setCameraUploadState(prev => ({
6055
...prev,
6156
cellular: !prev.cellular,
6257
version: (prev.version ?? 0) + 1
6358
}))
64-
65-
setTimeout(() => {
66-
cameraUploadParentQuery.refetch().catch(console.error)
67-
foregroundCameraUpload.run().catch(console.error)
68-
}, 1000)
69-
}, [setCameraUpload, cameraUploadParentQuery])
59+
}, [])
7060

7161
const toggleCompress = useCallback(() => {
72-
setCameraUpload(prev => ({
62+
setCameraUploadState(prev => ({
7363
...prev,
7464
compress: !prev.compress,
7565
version: (prev.version ?? 0) + 1
7666
}))
77-
78-
setTimeout(() => {
79-
cameraUploadParentQuery.refetch().catch(console.error)
80-
foregroundCameraUpload.run().catch(console.error)
81-
}, 1000)
82-
}, [setCameraUpload, cameraUploadParentQuery])
67+
}, [])
8368

8469
const toggleBackground = useCallback(() => {
85-
setCameraUpload(prev => ({
70+
setCameraUploadState(prev => ({
8671
...prev,
8772
background: !prev.background
8873
}))
89-
90-
setTimeout(() => {
91-
cameraUploadParentQuery.refetch().catch(console.error)
92-
foregroundCameraUpload.run().catch(console.error)
93-
}, 1000)
94-
}, [setCameraUpload, cameraUploadParentQuery])
74+
}, [])
9575

9676
const toggleLowBattery = useCallback(() => {
97-
setCameraUpload(prev => ({
77+
setCameraUploadState(prev => ({
9878
...prev,
9979
lowBattery: !prev.lowBattery,
10080
version: (prev.version ?? 0) + 1
10181
}))
102-
103-
setTimeout(() => {
104-
cameraUploadParentQuery.refetch().catch(console.error)
105-
foregroundCameraUpload.run().catch(console.error)
106-
}, 1000)
107-
}, [setCameraUpload, cameraUploadParentQuery])
82+
}, [])
10883

10984
const toggleVideos = useCallback(() => {
110-
setCameraUpload(prev => ({
85+
setCameraUploadState(prev => ({
11186
...prev,
11287
videos: !prev.videos,
11388
version: (prev.version ?? 0) + 1
11489
}))
90+
}, [])
11591

116-
setTimeout(() => {
117-
cameraUploadParentQuery.refetch().catch(console.error)
118-
foregroundCameraUpload.run().catch(console.error)
119-
}, 1000)
120-
}, [setCameraUpload, cameraUploadParentQuery])
121-
122-
const toggleOnlyDeltasAfterActivation = useCallback(() => {
123-
setCameraUpload(prev => ({
92+
const toggleOnlyDeltasAfterEnabled = useCallback(() => {
93+
setCameraUploadState(prev => ({
12494
...prev,
125-
onlyDeltasAfterActivation: !prev.onlyDeltasAfterActivation,
126-
onlyDeltasAfterActivationTimestamp: !prev.onlyDeltasAfterActivation ? Date.now() : undefined,
95+
onlyDeltasAfterEnabled: !prev.onlyDeltasAfterEnabled,
96+
enabledTimestamp: Date.now(),
12797
version: (prev.version ?? 0) + 1
12898
}))
129-
130-
setTimeout(() => {
131-
cameraUploadParentQuery.refetch().catch(console.error)
132-
foregroundCameraUpload.run().catch(console.error)
133-
}, 1000)
134-
}, [setCameraUpload, cameraUploadParentQuery])
99+
}, [])
135100

136101
const selectRemoteDirectory = useCallback(async () => {
137102
const selectDriveItemsResponse = await driveService.selectDriveItems({
@@ -155,7 +120,7 @@ export const Settings = memo(() => {
155120
uuid: directory.uuid
156121
})
157122

158-
setCameraUpload(prev => ({
123+
setCameraUploadState(prev => ({
159124
...prev,
160125
version: (prev.version ?? 0) + 1,
161126
remote: {
@@ -164,8 +129,9 @@ export const Settings = memo(() => {
164129
}
165130
}))
166131

132+
cameraUploadParentQuery.refetch().catch(console.error)
133+
167134
setTimeout(() => {
168-
cameraUploadParentQuery.refetch().catch(console.error)
169135
foregroundCameraUpload.run().catch(console.error)
170136
}, 1000)
171137
} catch (e) {
@@ -175,7 +141,7 @@ export const Settings = memo(() => {
175141
alerts.error(e.message)
176142
}
177143
}
178-
}, [setCameraUpload, cameraUploadParentQuery])
144+
}, [cameraUploadParentQuery])
179145

180146
const items = useMemo(() => {
181147
if (permissions && !permissions.granted) {
@@ -216,7 +182,7 @@ export const Settings = memo(() => {
216182
rightView: (
217183
<View testID="photos.settings.enabled">
218184
<Toggle
219-
value={cameraUpload.enabled}
185+
value={cameraUpload.enabled && permissions?.granted && cameraUploadParentExists}
220186
onValueChange={toggleEnabled}
221187
/>
222188
</View>
@@ -353,10 +319,8 @@ export const Settings = memo(() => {
353319
),
354320
rightView: (
355321
<Toggle
356-
value={
357-
(cameraUpload.onlyDeltasAfterActivation ?? false) && (cameraUpload.onlyDeltasAfterActivationTimestamp ?? 0) > 0
358-
}
359-
onValueChange={toggleOnlyDeltasAfterActivation}
322+
value={cameraUpload.onlyDeltasAfterEnabled ?? false}
323+
onValueChange={toggleOnlyDeltasAfterEnabled}
360324
/>
361325
)
362326
}
@@ -374,17 +338,9 @@ export const Settings = memo(() => {
374338
permissions,
375339
requestPermissions,
376340
cameraUploadParentExists,
377-
toggleOnlyDeltasAfterActivation
341+
toggleOnlyDeltasAfterEnabled
378342
])
379343

380-
useFocusEffect(
381-
useCallback(() => {
382-
setTimeout(() => {
383-
foregroundCameraUpload.run().catch(console.error)
384-
}, 1000)
385-
}, [])
386-
)
387-
388344
return (
389345
<RequireInternet>
390346
<SettingsComponent

hooks/useCameraUpload.tsx

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ export type CameraUpload = {
1414
lowBattery: boolean
1515
videos: boolean
1616
compress: boolean
17-
onlyDeltasAfterActivation?: boolean
18-
onlyDeltasAfterActivationTimestamp?: number
17+
onlyDeltasAfterEnabled?: boolean
18+
enabledTimestamp?: number
1919
// The version value is used to determine if the state has changed and we need to abort any running uploads
2020
// This is useful for when the user changes settings, like enabling/disabling camera upload
2121
version?: number
@@ -54,7 +54,7 @@ export function setCameraUploadState(fn: CameraUpload | ((prev: CameraUpload) =>
5454
}
5555

5656
export default function useCameraUpload(): [CameraUpload, (value: CameraUpload | ((prevValue: CameraUpload) => CameraUpload)) => void] {
57-
const [cameraUpload] = useMMKVObject<CameraUpload>(CAMERA_UPLOAD_MMKV_KEY, mmkvInstance)
57+
const [cameraUpload, setCameraUpload] = useMMKVObject<CameraUpload>(CAMERA_UPLOAD_MMKV_KEY, mmkvInstance)
5858

5959
const state = useMemo((): CameraUpload => {
6060
if (!cameraUpload) {
@@ -64,9 +64,18 @@ export default function useCameraUpload(): [CameraUpload, (value: CameraUpload |
6464
return cameraUpload
6565
}, [cameraUpload])
6666

67-
const setState = useCallback((fn: CameraUpload | ((prev: CameraUpload) => CameraUpload)) => {
68-
setCameraUploadState(fn)
69-
}, [])
67+
const setState = useCallback(
68+
(fn: CameraUpload | ((prev: CameraUpload) => CameraUpload)) => {
69+
if (typeof fn === "function") {
70+
setCameraUpload(prev => fn(prev ?? EMPTY_STATE))
71+
72+
return
73+
}
74+
75+
setCameraUpload(fn)
76+
},
77+
[setCameraUpload]
78+
)
7079

7180
return [state, setState]
7281
}

lib/cameraUpload.ts

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -203,10 +203,7 @@ export class CameraUpload {
203203
const items: Tree = {}
204204
const existingPaths: Record<string, true> = {}
205205
const existingAssetIds: Record<string, true> = {}
206-
const afterTimestamp =
207-
state.onlyDeltasAfterActivation && (state.onlyDeltasAfterActivationTimestamp ?? 0) > 0
208-
? state.onlyDeltasAfterActivationTimestamp ?? 0
209-
: 0
206+
const afterTimestamp = state.onlyDeltasAfterEnabled && (state.enabledTimestamp ?? 0) > 0 ? state.enabledTimestamp ?? 0 : 0
210207

211208
await Promise.all(
212209
state.albums.map(async album => {
@@ -663,18 +660,16 @@ export class CameraUpload {
663660
throw new Error("Aborted")
664661
}
665662

666-
const exists =
663+
const remotePath =
667664
this.type === "foreground"
668-
? await nodeWorker.proxy("directoryExists", {
669-
name: state.remote.name,
670-
parent: state.remote.parent
665+
? await nodeWorker.proxy("directoryUUIDToPath", {
666+
uuid: state.remote.uuid
671667
})
672-
: await getSDK().cloud().directoryExists({
673-
name: state.remote.name,
674-
parent: state.remote.parent
668+
: await getSDK().cloud().directoryUUIDToPath({
669+
uuid: state.remote.uuid
675670
})
676671

677-
if (!exists.exists || exists.uuid !== state.remote.uuid) {
672+
if (!remotePath || remotePath !== state.remote.path) {
678673
return
679674
}
680675

0 commit comments

Comments
 (0)