From 0a7ddbbb5e21cd37bb97458ae844581fc10fcd69 Mon Sep 17 00:00:00 2001 From: duskflower Date: Fri, 24 Jan 2025 18:10:00 +0100 Subject: [PATCH] feat: add new progress display for parallel loading --- src/pages/home.tsx | 56 +++++++++++++++++----------------------------- 1 file changed, 21 insertions(+), 35 deletions(-) diff --git a/src/pages/home.tsx b/src/pages/home.tsx index 125426a..4d79e75 100644 --- a/src/pages/home.tsx +++ b/src/pages/home.tsx @@ -1,16 +1,14 @@ -import { useNavigate, type RouteSectionProps } from "@solidjs/router"; -import { createSignal, type JSX, Show, type Component } from "solid-js"; - +import { createDropzone, createFileUploader } from "@solid-primitives/upload"; import { Title } from "@solidjs/meta"; +import { type RouteSectionProps, useNavigate } from "@solidjs/router"; +import { type Component, type JSX, Show, createSignal } from "solid-js"; import { Portal } from "solid-js/web"; +import { Button } from "~/components/ui/button"; import { Flex } from "~/components/ui/flex"; - import { Progress, ProgressLabel, ProgressValueLabel } from "~/components/ui/progress"; +import { TextField, TextFieldInput, TextFieldLabel } from "~/components/ui/text-field"; import { loadDb } from "~/db"; import { decryptBackup } from "~/lib/backup-decryptor"; -import { createDropzone, createFileUploader } from "@solid-primitives/upload"; -import { Button } from "~/components/ui/button"; -import { TextField, TextFieldInput, TextFieldLabel } from "~/components/ui/text-field"; export const Home: Component = () => { const navigate = useNavigate(); @@ -34,8 +32,8 @@ export const Home: Component = () => { const [backupFile, setBackupFile] = createSignal(); const [decryptionProgress, setDecryptionProgress] = createSignal(); - const [loadingProgress, setLoadingProgress] = createSignal(); - // const [isLoadingDatabase, setIsLoadingDatabase] = createSignal(false); + const [totalStatements, setTotalStatements] = createSignal(0); + const [executedStatements, setExecutedStatements] = createSignal(0); const onSubmit: JSX.EventHandler = (event) => { event.preventDefault(); @@ -44,31 +42,21 @@ export const Home: Component = () => { const currentPassphrase = passphrase(); if (currentBackupFile && currentPassphrase) { - // const hashChunk = await currentBackupFile.slice(-1000).text(); - // const hash = hashString(hashChunk); - - // if (hash === dbHash()) { - // return; - // } - - // setDbHash(hash); - console.time(); decryptBackup(currentBackupFile, currentPassphrase, setDecryptionProgress, async (statements) => { - await loadDb(statements); + const length = statements.length; + setTotalStatements((oldValue) => oldValue + length); + + await loadDb(statements, (progress) => { + setExecutedStatements((oldValue) => Math.round(oldValue + (progress / 100) * length)); + }); + + setExecutedStatements((oldValue) => oldValue + length); }) .then(() => { umami.track("Decrypt backup"); - setDecryptionProgress(undefined); - // setIsLoadingDatabase(true); - // setLoadingProgress(0); - - // await loadDb(decrypted.database_statements, setLoadingProgress); umami.track("Load database"); - // setIsLoadingDatabase(false); - // setLoadingProgress(undefined); - console.timeEnd(); navigate("/overview"); }) @@ -88,7 +76,7 @@ export const Home: Component = () => { class="fixed inset-0 gap-y-8 backdrop-blur-lg backdrop-filter" classList={{ // hidden: decryptionProgress() === undefined && !isLoadingDatabase(), - hidden: decryptionProgress() === undefined && loadingProgress() === undefined, + hidden: decryptionProgress() === undefined && totalStatements() === 0, }} > @@ -101,20 +89,18 @@ export const Home: Component = () => { class="w-[300px] space-y-1" >
- Processing... + Decrypting...
- - {/*

Loading database

-

This can take some time

*/} +

Loading database

`${value}%`} + maxValue={totalStatements()} + getValueLabel={({ value, max }) => `${value} of ${max}`} class="w-[300px] space-y-1" >