From 54d7eec47999191ce312d76c16eb51d1a8af0ad5 Mon Sep 17 00:00:00 2001 From: James Pearce Date: Fri, 13 Sep 2024 13:41:10 -0500 Subject: [PATCH] Persister spinners --- client/bun.lockb | Bin 211153 -> 212190 bytes client/package.json | 16 +++++------ client/public/favicon.svg | 2 +- client/src/index.css.ts | 2 +- client/src/stores/IssuesStore.tsx | 12 ++++++-- client/src/stores/RepoStore.tsx | 24 ++++++++++++---- client/src/stores/ReposStore.tsx | 13 +++++++-- client/src/ui/Repo/Issues/IssueList/index.tsx | 11 ++------ client/src/ui/Repo/Issues/index.css.ts | 2 +- client/src/ui/Repo/Issues/index.tsx | 26 ++++++++++++++++-- client/src/ui/Repo/RepoHeader/index.css.ts | 2 +- client/src/ui/Title/index.css.ts | 9 +++++- client/src/ui/Title/index.tsx | 17 ++++++++++-- 13 files changed, 99 insertions(+), 37 deletions(-) diff --git a/client/bun.lockb b/client/bun.lockb index 73c2ffc504852c29c4502057d3daa546d02992f9..bbbcc0f69a8d8c6a79e5bfc8d8484588baec78e7 100755 GIT binary patch delta 36918 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 delta 36460 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

FLCpW};zznLmWRcI4^Q zA%3PuVN+Ma4r7-dQVnJ4F!0vSNc}Z7I67eB?g$w0Z;!N7R1^K=4_o)^W_nY^GW^yE zd27e6CbWue{>#DLE-;|Fq4Hm{3K)prPhhpOL|X^#+|~o98%&!!eRmu$1I|91z=B}m zt)2Ahx4qe>i?`jqcvf&zI}6tEc>v#AgUL%|r=32#pl;5^!LQEf6g&8fw+NV3HlFlp$JPGneC_&ASr4o6 zj9{Q0Xxkue@}Q-AALS#4))YK&x;l{!$;LF&j=)`**)Zkau+4R0f&Bn21=U$0GRGH0 z8zJnqBXm!1-n*~qs428$P-|n{g|lB^;H{mxyJvawvrQc?H-iBUC~TFrQ+Y>@`~Ax6 zpMHPEi-3Dmn9CUCjdOgJ2NrWoC$kFsImd7VwA5M_4+H!%a3X|*b`CI;rfgi1VNOq@ z$Org(brSn@40=O5IXEP(`N2kCPhZM&!fe#e7H)Ib+2OQV(h8myS4A84lAO>EB^K9= zxIS}w`+q4(+f#3ZFpsftq92QZuuq(<{E{Kh`{;SI0i&kS6GmzZC3pZ(Xv&*sgJS z=*h2$4%z{}pFL}Iaem$>X^4SJmZHn4eQr=+UKj1xt@y>^&!%Oh+1 zwzf|;*J|L472BAH+_ck=JJs80YPe;Tauj~8AgH`NjT9cv=1$VFiS>oileF*oSS z=d!^wu|oD`rQ~xGbDRQ^!>*Awi@kub*G?vmnXr2QqxwH@R=uI8ImemXB-kl6t=|L# zz4El=&OQ70j4Y79&}`jxzb{}IiMFUGJg~tNlt&BLwn<`F{3`9qB+>sbMcbJ9=+sOb zdt-WPM=<|;rfPNAXOr=0M$OpFou^d3#pm@=y2wuaaS`h?1s9foe{VvW9~h~sA+l0h zxf@>Ppr`6R+zzd@J8_tvV&Qo-jrBgPoZ6`wtDcL^Ohe|6MzuF}Q}<10qBoold${a3 zzM7(oRX6{~?>X7NTs&_1pK2@qSFnh+F<6+(x=hC)-N16Ec+ z)($&ST{+q(XeVwLUJ4Voor#-CyF}%7U8kMNEnfa$Qqe3=Y@M~3tLt^TCa79kqX!3m zJm13aO^kM)cZuVbV?S;S#ti|zJ5_E2J#= z_qM8=xqts%=<W-Te8bsQ$=7qZs zA2v1fz^+Pb`@iWGj5OUlyG3by2c_{*(%Ub$SqndIWSc+4SDd^WfA8!&yH;tVzi+*F zegmtFu6O$C>Q2>oXF*Ceu)$!nMSpwkQ1|_F9){Grn{)Kd#W zEK5F%UCtC=yv*X^j#omO(kxLYOO2peA{B_=vC!{l>#@u^;t>4TK4<2LZo(WU6o_se zx{Otqm}4Jq`}1(G-fR0pr@QOx+0#tc!^1AcLaz&b&8R`MM|A7t;7&hi!k?e-t_=m4 zmbg`JH&5)!THFwuu)=wG&gkj4Yuh|A3^BX@oG<>XHM8C$cA_^5clFyN`a04}hP&qd zB-V?oPP@MBkrS9;FtcTce9TS=UaY`iHiT6i5}UCDP0XsXFAZjvtckCgwaWGJH49?j x`kHNj+eDfxTC&4_W_2qwz2<}8zTfjRoA$OTI6d3c!K`LwMD<-)JD9x^{tvxEFbDtu diff --git a/client/package.json b/client/package.json index e6d5573..b84fe2d 100644 --- a/client/package.json +++ b/client/package.json @@ -17,29 +17,29 @@ "@types/bun": "latest", "@types/react": "^18.3.5", "@types/react-dom": "^18.3.0", - "@typescript-eslint/eslint-plugin": "^8.4.0", - "@typescript-eslint/parser": "^8.4.0", + "@typescript-eslint/eslint-plugin": "^8.5.0", + "@typescript-eslint/parser": "^8.5.0", "@vanilla-extract/css": "^1.15.5", "@vanilla-extract/vite-plugin": "^4.0.15", "@vitejs/plugin-react": "^4.3.1", "cspell": "^8.14.2", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-react": "^7.35.2", + "eslint-plugin-react": "^7.36.1", "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-react-refresh": "^0.4.11", "prettier": "^3.3.3", - "typescript": "^5.5.4", - "vite": "^5.4.3", + "typescript": "^5.6.2", + "vite": "^5.4.5", "vite-plugin-minify": "^2.0.0" }, "dependencies": { "@icons-pack/react-simple-icons": "^10.0.0", - "lucide-react": "^0.439.0", + "lucide-react": "^0.441.0", "octokit": "^4.0.2", "react": "^18.3.1", "react-dom": "^18.3.1", - "tinybase": "^5.3.0-beta.2", - "tinywidgets": "^0.0.6" + "tinybase": "^5.3.0", + "tinywidgets": "^0.0.11" } } \ No newline at end of file diff --git a/client/public/favicon.svg b/client/public/favicon.svg index b721e38..e6c84f5 100644 --- a/client/public/favicon.svg +++ b/client/public/favicon.svg @@ -1,5 +1,5 @@ - + = Exclude; const STORE_ID = 'issues'; const TABLE_ID = 'issues'; +const PERSISTER_ID = 'issues'; + const TABLES_SCHEMA = { issues: { title: {type: 'string', default: ''}, @@ -28,8 +30,10 @@ const { useProvideStore, useCreatePersister, useCell, + useProvidePersister, useSetCellCallback, useSortedRowIds, + usePersisterStatus, } = UiReact as UiReact.WithSchemas; type TableIds = keyof typeof TABLES_SCHEMA; type CellIds = AsId< @@ -58,12 +62,16 @@ export const useIssuesSortedRowIds = ( ) => useSortedRowIds(TABLE_ID, cellId, descending, undefined, undefined, STORE_ID); +export const useIssuesPersisterStatus = () => usePersisterStatus(PERSISTER_ID); + export const IssuesStore = () => { const currentRepoId = useUiValue('repoId'); const issuesStore = useCreateStore( () => createStore().setTablesSchema(TABLES_SCHEMA), [currentRepoId], ); + useProvideStore(STORE_ID, issuesStore); + useCreatePersister( issuesStore, (issuesStore) => { @@ -82,7 +90,7 @@ export const IssuesStore = () => { [], ); - useCreatePersister( + const issuesPersister = useCreatePersister( issuesStore, (issuesStore) => { if (currentRepoId) { @@ -95,8 +103,8 @@ export const IssuesStore = () => { }, [], ); + useProvidePersister(PERSISTER_ID, issuesPersister); - useProvideStore(STORE_ID, issuesStore); return null; }; diff --git a/client/src/stores/RepoStore.tsx b/client/src/stores/RepoStore.tsx index 66fe27c..cbafce0 100644 --- a/client/src/stores/RepoStore.tsx +++ b/client/src/stores/RepoStore.tsx @@ -30,6 +30,8 @@ type RepoData = { const STORE_ID = 'repo'; +const PERSISTER_ID = 'repo'; + const VALUES_SCHEMA = { id: {type: 'string', default: ''}, owner: {type: 'string', default: ''}, @@ -52,19 +54,29 @@ const VALUES_SCHEMA = { visibility: {type: 'string', default: ''}, } as const; type Schemas = [NoTablesSchema, typeof VALUES_SCHEMA]; -const {useCreateStore, useProvideStore, useCreatePersister, useValue} = - UiReact as UiReact.WithSchemas; +const { + useCreateStore, + useProvideStore, + useCreatePersister, + usePersisterStatus, + useValue, + useProvidePersister, +} = UiReact as UiReact.WithSchemas; type ValueIds = keyof typeof VALUES_SCHEMA; export const useRepoValue = (valueId: ValueId) => useValue(valueId, STORE_ID); +export const useRepoPersisterStatus = () => usePersisterStatus(PERSISTER_ID); + export const RepoStore = () => { const currentRepoId = useUiValue('repoId'); const repoStore = useCreateStore( () => createStore().setValuesSchema(VALUES_SCHEMA), [currentRepoId], ); + useProvideStore(STORE_ID, repoStore); + useCreatePersister( repoStore, (repoStore) => { @@ -80,7 +92,7 @@ export const RepoStore = () => { [], ); - useCreatePersister( + const repoPersister = useCreatePersister( repoStore, (repoStore) => { if (repoStore) { @@ -88,11 +100,13 @@ export const RepoStore = () => { } }, [currentRepoId], - async (persister) => await persister?.load(), + async (persister) => { + await persister?.load(); + }, [], ); + useProvidePersister(PERSISTER_ID, repoPersister); - useProvideStore(STORE_ID, repoStore); return null; }; diff --git a/client/src/stores/ReposStore.tsx b/client/src/stores/ReposStore.tsx index 294c63c..2a4e4bc 100644 --- a/client/src/stores/ReposStore.tsx +++ b/client/src/stores/ReposStore.tsx @@ -33,6 +33,8 @@ const TABLE_ID = 'repos'; const INDEXES_ID = 'repos'; const INDEX_ID = 'reposByGroup'; +const PERSISTER_ID = 'repos'; + const TABLES_SCHEMA = { repos: { group: {type: 'string', default: ''}, @@ -53,8 +55,10 @@ const { useCreateStore, useProvideStore, useCreateIndexes, + useProvidePersister, useProvideIndexes, useSliceRowIds, + usePersisterStatus, useSliceIds, } = UiReact as UiReact.WithSchemas; type TableIds = keyof typeof TABLES_SCHEMA; @@ -72,10 +76,13 @@ export const useGroupIds = () => useSliceIds(INDEX_ID, INDEXES_ID); export const useGroupRepoIds = (group: string) => useSliceRowIds(INDEX_ID, group, INDEXES_ID); +export const useReposPersisterStatus = () => usePersisterStatus(PERSISTER_ID); + export const ReposStore = () => { const reposStore = useCreateStore(() => createStore().setTablesSchema(TABLES_SCHEMA), ); + useProvideStore(STORE_ID, reposStore); const reposSortCell = useSettingsValue('reposSortCell') as CellIds< typeof TABLE_ID @@ -95,6 +102,7 @@ export const ReposStore = () => { ), [reposSortCell], ); + useProvideIndexes(INDEXES_ID, reposIndexes!); useCreatePersister( reposStore, @@ -106,7 +114,7 @@ export const ReposStore = () => { }, ); - useCreatePersister( + const reposPersister = useCreatePersister( reposStore, (reposStore) => { return createGithubReposLoadingPersister(reposStore); @@ -117,9 +125,8 @@ export const ReposStore = () => { }, [], ); + useProvidePersister(PERSISTER_ID, reposPersister); - useProvideStore(STORE_ID, reposStore); - useProvideIndexes(INDEXES_ID, reposIndexes!); return null; }; diff --git a/client/src/ui/Repo/Issues/IssueList/index.tsx b/client/src/ui/Repo/Issues/IssueList/index.tsx index 750777c..b6848b3 100644 --- a/client/src/ui/Repo/Issues/IssueList/index.tsx +++ b/client/src/ui/Repo/Issues/IssueList/index.tsx @@ -2,21 +2,14 @@ import {IssueLink} from './IssueLink'; import {createElement} from '../../../../common'; -import {useIssuesSortedRowIds} from '../../../../stores/IssuesStore'; -import {useSettingsValue} from '../../../../stores/SettingsStore'; export const IssueList = ({ currentIssueId, + issueIds, }: { readonly currentIssueId: string; + readonly issueIds: string[]; }) => { - const issuesSortCell = useSettingsValue('issuesSortCell'); - const issuesSortAscending = issuesSortCell == 'title'; - const issueIds = useIssuesSortedRowIds( - issuesSortCell as any, - !issuesSortAscending, - ); - return issueIds.map((issueId) => ( { const repoId = useUiValue('repoId'); const issueId = useUiValue('issueId'); + + const issuesSortCell = useSettingsValue('issuesSortCell'); + const issuesSortAscending = issuesSortCell == 'title'; + const issueIds = useIssuesSortedRowIds( + issuesSortCell as any, + !issuesSortAscending, + ); + + const setIssueId = useSetUiValueCallback( + 'issueId', + (issueId: string) => issueId, + ); + useEffect(() => { + if (issueIds.length > 0 && (issueId == '' || !issueIds.includes(issueId))) { + setIssueId(issueIds[0]); + } + }, [issueIds, issueId, setIssueId]); + return ( { } > - + {useIssueCell(issueId, 'title') ? ( diff --git a/client/src/ui/Repo/RepoHeader/index.css.ts b/client/src/ui/Repo/RepoHeader/index.css.ts index 79faa41..ad98210 100644 --- a/client/src/ui/Repo/RepoHeader/index.css.ts +++ b/client/src/ui/Repo/RepoHeader/index.css.ts @@ -1,4 +1,4 @@ -import {large} from 'tinywidgets/media'; +import {large} from 'tinywidgets/utils'; import {style} from '@vanilla-extract/css'; export const repoHeader = style([ diff --git a/client/src/ui/Title/index.css.ts b/client/src/ui/Title/index.css.ts index bb76ecf..db2f853 100644 --- a/client/src/ui/Title/index.css.ts +++ b/client/src/ui/Title/index.css.ts @@ -1,9 +1,16 @@ -import {small} from 'tinywidgets/media'; +import {small} from 'tinywidgets/utils'; import {style} from '@vanilla-extract/css'; export const logo = style({ width: '2rem', height: '2rem', + transition: 'transform 1s', + transform: 'rotate(0deg)', +}); + +export const spinning = style({ + transition: 'transform 3s', + transform: 'rotate(360deg)', }); export const button = style({ diff --git a/client/src/ui/Title/index.tsx b/client/src/ui/Title/index.tsx index 6d653ff..d9b627a 100644 --- a/client/src/ui/Title/index.tsx +++ b/client/src/ui/Title/index.tsx @@ -2,14 +2,27 @@ /** @jsxFrag Fragment */ import {Fragment, createElement} from '../../common.ts'; -import {button, logo} from './index.css.ts'; +import {button, logo, spinning} from './index.css.ts'; import {Button} from 'tinywidgets'; import {CircleHelp} from 'lucide-react'; +import {classNames} from 'tinywidgets/utils'; +import {useIssuesPersisterStatus} from '../../stores/IssuesStore.tsx'; +import {useRepoPersisterStatus} from '../../stores/RepoStore.tsx'; +import {useReposPersisterStatus} from '../../stores/ReposStore.tsx'; export const Title = () => { + const persisterStatus = + useReposPersisterStatus() + + useRepoPersisterStatus() + + useIssuesPersisterStatus(); + return ( <> - TinyHub logo + TinyHub logo 0 && spinning)} + />

TinyHub