diff --git a/src/components/pages/gallery/Upload.tsx b/src/components/pages/gallery/Upload.tsx index 7d4095f0a..df694188b 100644 --- a/src/components/pages/gallery/Upload.tsx +++ b/src/components/pages/gallery/Upload.tsx @@ -134,7 +134,8 @@ export default function Upload(props: Props) { return null; } const paths: string[] = props.acceptedFiles.map((file) => file['path']); - paths.sort(); + const getCharCount = (str: string) => (str.match(/\//g) ?? []).length; + paths.sort((path1, path2) => getCharCount(path1) - getCharCount(path2)); const firstPath = paths[0]; const lastPath = paths[paths.length - 1]; const L = firstPath.length; diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 8ba26963f..5d170715b 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -479,6 +479,8 @@ type AppContextType = { sharedFiles: File[]; resetSharedFiles: () => void; setDisappearingFlashMessage: (message: FlashMessage) => void; + redirectUrl: string; + setRedirectUrl: (url: string) => void; }; export enum FLASH_MESSAGE_TYPE { @@ -508,6 +510,7 @@ export default function App({ Component, err }) { const [sharedFiles, setSharedFiles] = useState(null); const [redirectName, setRedirectName] = useState(null); const [flashMessage, setFlashMessage] = useState(null); + const [redirectUrl, setRedirectUrl] = useState(null); useEffect(() => { if ( !('serviceWorker' in navigator) || @@ -641,6 +644,8 @@ export default function App({ Component, err }) { sharedFiles, resetSharedFiles, setDisappearingFlashMessage, + redirectUrl, + setRedirectUrl, }}> {loading ? ( diff --git a/src/pages/credentials/index.tsx b/src/pages/credentials/index.tsx index 9b92b07ed..fff9be33f 100644 --- a/src/pages/credentials/index.tsx +++ b/src/pages/credentials/index.tsx @@ -75,8 +75,9 @@ export default function Credentials() { } await SaveKeyInSessionStore(SESSION_KEYS.ENCRYPTION_KEY, key); await decryptAndStoreToken(key); - - router.push(PAGES.GALLERY); + const redirectUrl = appContext.redirectUrl; + appContext.setRedirectUrl(null); + router.push(redirectUrl ?? PAGES.GALLERY); } catch (e) { logError(e, 'user entered a wrong password'); setFieldError('passphrase', constants.INCORRECT_PASSPHRASE); diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index 57ae25e43..1b2372cb0 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -211,9 +211,11 @@ export default function Gallery() { const [fixCreationTimeView, setFixCreationTimeView] = useState(false); const [fixCreationTimeAttributes, setFixCreationTimeAttributes] = useState(null); + useEffect(() => { const key = getKey(SESSION_KEYS.ENCRYPTION_KEY); if (!key) { + appContext.setRedirectUrl(router.asPath); router.push(PAGES.ROOT); return; } @@ -233,11 +235,6 @@ export default function Gallery() { setCollections(collections); setTrash(trash); await setDerivativeState(collections, files); - await checkSubscriptionPurchase( - setDialogMessage, - router, - setLoading - ); await syncWithRemote(true); setIsFirstLoad(false); setJustSignedUp(false); @@ -282,6 +279,13 @@ export default function Gallery() { router.push(href, undefined, { shallow: true }); }, [activeCollection]); + useEffect(() => { + const key = getKey(SESSION_KEYS.ENCRYPTION_KEY); + if (router.isReady && key) { + checkSubscriptionPurchase(setDialogMessage, router, setLoading); + } + }, [router.isReady]); + const syncWithRemote = async (force = false, silent = false) => { if (syncInProgress.current && !force) { resync.current = true; diff --git a/src/services/billingService.ts b/src/services/billingService.ts index 630dc0f34..7c09d5fba 100644 --- a/src/services/billingService.ts +++ b/src/services/billingService.ts @@ -134,6 +134,10 @@ class billingService { sessionID: string = null ): Promise { try { + const token = getToken(); + if (!token) { + return; + } const response = await HTTPService.post( `${ENDPOINT}/billing/verify-subscription`, { @@ -143,7 +147,7 @@ class billingService { }, null, { - 'X-Auth-Token': getToken(), + 'X-Auth-Token': token, } ); const { subscription } = response.data; diff --git a/src/services/ffmpegService.ts b/src/services/ffmpegService.ts index 2b4bf2970..1184593b4 100644 --- a/src/services/ffmpegService.ts +++ b/src/services/ffmpegService.ts @@ -19,6 +19,8 @@ class FFmpegService { this.isLoading = null; } catch (e) { logError(e, 'ffmpeg load failed'); + this.ffmpeg = null; + this.isLoading = null; throw e; } } diff --git a/src/services/upload/thumbnailService.ts b/src/services/upload/thumbnailService.ts index f4c8fd855..dd79222f3 100644 --- a/src/services/upload/thumbnailService.ts +++ b/src/services/upload/thumbnailService.ts @@ -44,7 +44,7 @@ export async function generateThumbnail( ); } catch (e) { logError(e, 'failed to generate thumbnail using ffmpeg', { - type: fileTypeInfo.exactType, + fileFormat: fileTypeInfo.exactType, }); canvas = await generateVideoThumbnail(file); } diff --git a/src/utils/billingUtil.ts b/src/utils/billingUtil.ts index 555bd9016..43e1e1924 100644 --- a/src/utils/billingUtil.ts +++ b/src/utils/billingUtil.ts @@ -191,17 +191,14 @@ export async function checkSubscriptionPurchase( router: NextRouter, setLoading: SetLoading ) { + const { session_id: sessionId, status, reason } = router.query ?? {}; try { - const urlParams = new URLSearchParams(window.location.search); - const sessionId = urlParams.get('session_id'); - const status = urlParams.get('status'); - const reason = urlParams.get('reason'); if (status === RESPONSE_STATUS.fail) { - handleFailureReason(reason, setDialogMessage, setLoading); + handleFailureReason(reason as string, setDialogMessage, setLoading); } else if (status === RESPONSE_STATUS.success) { try { const subscription = await billingService.verifySubscription( - sessionId + sessionId as string ); setDialogMessage({ title: constants.SUBSCRIPTION_PURCHASE_SUCCESS_TITLE, @@ -220,8 +217,6 @@ export async function checkSubscriptionPurchase( } } catch (e) { // ignore - } finally { - router.push('gallery', undefined, { shallow: true }); } }