Skip to content

Commit 9da90a1

Browse files
committed
🚀(frontend) Adds api caching
Query-results are automatically stored in localstorage. This leverages caching in a controlled way, improves render-blocking loading times and unnecessary repeated requests. - Adds @tanstack/react-query-persist-client - Adds @tanstack/query-sync-storage-persister - Updates @tanstack/react-query Signed-off-by: Robin Weber <[email protected]>
1 parent 5848f43 commit 9da90a1

File tree

4 files changed

+63
-15
lines changed

4 files changed

+63
-15
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ and this project adheres to
1010

1111
## Added
1212

13+
- 🚀(frontend) Adds api caching #961
1314
- ✨(back) allow theme customnization using a configuration file #948
1415
- ✨ Add a custom callout block to the editor #892
1516
- 🚩(frontend) version MIT only #911

src/frontend/apps/impress/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@
3131
"@openfun/cunningham-react": "3.0.0",
3232
"@react-pdf/renderer": "4.3.0",
3333
"@sentry/nextjs": "9.15.0",
34-
"@tanstack/react-query": "5.75.4",
34+
"@tanstack/query-sync-storage-persister": "5.76.0",
35+
"@tanstack/react-query": "5.75.5",
36+
"@tanstack/react-query-persist-client": "5.76.0",
3537
"canvg": "4.0.3",
3638
"clsx": "2.1.1",
3739
"cmdk": "1.1.1",

src/frontend/apps/impress/src/core/AppProvider.tsx

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
import { CunninghamProvider } from '@openfun/cunningham-react';
2-
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
2+
import { createSyncStoragePersister } from '@tanstack/query-sync-storage-persister';
3+
import { QueryClient } from '@tanstack/react-query';
4+
import type { Persister } from '@tanstack/react-query-persist-client';
5+
import { PersistQueryClientProvider } from '@tanstack/react-query-persist-client';
6+
import debug from 'debug';
37
import { useRouter } from 'next/router';
4-
import { useEffect } from 'react';
8+
import { useEffect, useMemo } from 'react';
59

610
import { useCunninghamTheme } from '@/cunningham';
711
import { Auth, KEY_AUTH, setAuthUrl } from '@/features/auth';
@@ -18,6 +22,7 @@ import { ConfigProvider } from './config/';
1822
*/
1923
const defaultOptions = {
2024
queries: {
25+
staleTime: debug.enabled('no-cache') ? 0 : 1000 * 60 * 3, // 3 minutes
2126
staleTime: 1000 * 60 * 3,
2227
retry: 1,
2328
},
@@ -29,11 +34,21 @@ const queryClient = new QueryClient({
2934
export function AppProvider({ children }: { children: React.ReactNode }) {
3035
const { theme } = useCunninghamTheme();
3136
const { replace } = useRouter();
32-
3337
const initializeResizeListener = useResponsiveStore(
3438
(state) => state.initializeResizeListener,
3539
);
3640

41+
const persister = useMemo(() => {
42+
// Create persister only when the browser is available
43+
if (typeof window !== 'undefined') {
44+
return createSyncStoragePersister({
45+
storage: window.localStorage,
46+
});
47+
}
48+
// Return undefined otherwise (PersistQueryClientProvider handles undefined persister gracefully)
49+
return undefined;
50+
}, []);
51+
3752
useEffect(() => {
3853
return initializeResizeListener();
3954
}, [initializeResizeListener]);
@@ -60,12 +75,15 @@ export function AppProvider({ children }: { children: React.ReactNode }) {
6075
}, [replace]);
6176

6277
return (
63-
<QueryClientProvider client={queryClient}>
78+
<PersistQueryClientProvider
79+
client={queryClient}
80+
persistOptions={{ persister: persister as Persister }}
81+
>
6482
<CunninghamProvider theme={theme}>
6583
<ConfigProvider>
6684
<Auth>{children}</Auth>
6785
</ConfigProvider>
6886
</CunninghamProvider>
69-
</QueryClientProvider>
87+
</PersistQueryClientProvider>
7088
);
7189
}

src/frontend/yarn.lock

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4881,29 +4881,56 @@
48814881
dependencies:
48824882
"@typescript-eslint/utils" "^8.18.1"
48834883

4884-
"@tanstack/[email protected]":
4885-
version "5.75.4"
4886-
resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.75.4.tgz#e05f2fe4145fb5354271ad19e63eec61f6ce3012"
4887-
integrity sha512-pcqOUgWG9oGlzkfRQQMMsEFmtQu0wq81A414CtELZGq+ztVwSTAaoB3AZRAXQJs88LmNMk2YpUKuQbrvzNDyRg==
4884+
"@tanstack/[email protected]":
4885+
version "5.75.5"
4886+
resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.75.5.tgz#198c27c21b5d15aad09167af8a021f214e194d4b"
4887+
integrity sha512-kPDOxtoMn2Ycycb76Givx2fi+2pzo98F9ifHL/NFiahEDpDwSVW6o12PRuQ0lQnBOunhRG5etatAhQij91M3MQ==
4888+
4889+
"@tanstack/[email protected]":
4890+
version "5.76.0"
4891+
resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.76.0.tgz#3b4d5d34ce307ba0cf7d1a3e90d7adcdc6c46be0"
4892+
integrity sha512-FN375hb8ctzfNAlex5gHI6+WDXTNpe0nbxp/d2YJtnP+IBM6OUm7zcaoCW6T63BawGOYZBbKC0iPvr41TteNVg==
48884893

48894894
"@tanstack/[email protected]":
48904895
version "5.74.7"
48914896
resolved "https://registry.yarnpkg.com/@tanstack/query-devtools/-/query-devtools-5.74.7.tgz#c9b022b386ac86e6395228b5d6912e6444b3b971"
48924897
integrity sha512-nSNlfuGdnHf4yB0S+BoNYOE1o3oAH093weAYZolIHfS2stulyA/gWfSk/9H4ZFk5mAAHb5vNqAeJOmbdcGPEQw==
48934898

4899+
"@tanstack/[email protected]":
4900+
version "5.76.0"
4901+
resolved "https://registry.yarnpkg.com/@tanstack/query-persist-client-core/-/query-persist-client-core-5.76.0.tgz#a3bcdd687384dc6b5b61b402bef153ad54515321"
4902+
integrity sha512-xcTZjILf4q49Nsl6wcnhBYZ4O0gpnuNwV6vPIEWIrwTuSNWz2zd/g9bc8SxnXy7xCV8SM1H0IJn8KjLQIUb2ag==
4903+
dependencies:
4904+
"@tanstack/query-core" "5.76.0"
4905+
4906+
"@tanstack/[email protected]":
4907+
version "5.76.0"
4908+
resolved "https://registry.yarnpkg.com/@tanstack/query-sync-storage-persister/-/query-sync-storage-persister-5.76.0.tgz#29643062f1a424873afb22032ce70ee72436bb9b"
4909+
integrity sha512-N8d8voY61XkM+jfXTySduLrevD6wRM3pwQ1kG0syLiWWx/sX2+CpaTMSPr0GggjQuhmjhUPo83LaV+e449tizA==
4910+
dependencies:
4911+
"@tanstack/query-core" "5.76.0"
4912+
"@tanstack/query-persist-client-core" "5.76.0"
4913+
48944914
"@tanstack/[email protected]":
48954915
version "5.75.4"
48964916
resolved "https://registry.yarnpkg.com/@tanstack/react-query-devtools/-/react-query-devtools-5.75.4.tgz#89614363d63c997ade81ade4a18e90b57512d4d8"
48974917
integrity sha512-CSJZWa316EFtLZtr6RQLAnqWb1MESzyZ7j0bMQjuhYas5FDp/3MA7G6RE4hWauqCCDsNIfIm2Rnm1zJTZVye/w==
48984918
dependencies:
48994919
"@tanstack/query-devtools" "5.74.7"
49004920

4901-
"@tanstack/[email protected]":
4902-
version "5.75.4"
4903-
resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.75.4.tgz#721e1cdf7debb110671f558dc2b6276f637554a5"
4904-
integrity sha512-Vf65pzYRkf8fk9SP1ncIZjvaXszBhtsvpf+h45Y/9kOywOrVZfBGUpCdffdsVzbmBzmz6TCFes9bM0d3pRrIsA==
4921+
"@tanstack/[email protected]":
4922+
version "5.76.0"
4923+
resolved "https://registry.yarnpkg.com/@tanstack/react-query-persist-client/-/react-query-persist-client-5.76.0.tgz#97718fec844708cb98a5902d4b1eeb72adea555b"
4924+
integrity sha512-QPKgkHX1yC1Ec21FTQHBTbQcHYI+6157DgsmxABp94H7/ZUJ3szZ7wdpdBPQyZ9VxBXlKRN+aNZkOPC90+r/uA==
4925+
dependencies:
4926+
"@tanstack/query-persist-client-core" "5.76.0"
4927+
4928+
"@tanstack/[email protected]":
4929+
version "5.75.5"
4930+
resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.75.5.tgz#650a6b58c7bcd4c33062426e05c4467571148a4f"
4931+
integrity sha512-QrLCJe40BgBVlWdAdf2ZEVJ0cISOuEy/HKupId1aTKU6gPJZVhSvZpH+Si7csRflCJphzlQ77Yx6gUxGW9o0XQ==
49054932
dependencies:
4906-
"@tanstack/query-core" "5.75.4"
4933+
"@tanstack/query-core" "5.75.5"
49074934

49084935
"@tanstack/[email protected]":
49094936
version "8.20.6"

0 commit comments

Comments
 (0)