diff --git a/apps/client/package.json b/apps/client/package.json index 436f9493..b64d910b 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -34,6 +34,7 @@ "jotai": "^2.12.1", "jotai-optics": "^0.4.0", "js-cookie": "^3.0.5", + "jwt-decode": "^4.0.0", "katex": "0.16.21", "lowlight": "^3.2.0", "mermaid": "^11.4.1", diff --git a/apps/client/src/features/auth/queries/auth-query.tsx b/apps/client/src/features/auth/queries/auth-query.tsx index 2c1fc291..09e758e8 100644 --- a/apps/client/src/features/auth/queries/auth-query.tsx +++ b/apps/client/src/features/auth/queries/auth-query.tsx @@ -19,8 +19,8 @@ export function useCollabToken(): UseQueryResult { queryKey: ["collab-token"], queryFn: () => getCollabToken(), staleTime: 20 * 60 * 60 * 1000, //20hrs - refetchInterval: 12 * 60 * 60 * 1000, // 12hrs - refetchIntervalInBackground: true, + //refetchInterval: 12 * 60 * 60 * 1000, // 12hrs + //refetchIntervalInBackground: true, refetchOnMount: true, //@ts-ignore retry: (failureCount, error) => { diff --git a/apps/client/src/features/editor/page-editor.tsx b/apps/client/src/features/editor/page-editor.tsx index d8597e30..2853875e 100644 --- a/apps/client/src/features/editor/page-editor.tsx +++ b/apps/client/src/features/editor/page-editor.tsx @@ -52,6 +52,7 @@ import { IPage } from "@/features/page/types/page.types.ts"; import { useParams } from "react-router-dom"; import { extractPageSlugId } from "@/lib"; import { FIVE_MINUTES } from "@/lib/constants.ts"; +import { jwtDecode } from "jwt-decode"; interface PageEditorProps { pageId: string; @@ -83,7 +84,6 @@ export default function PageEditor({ const documentState = useDocumentVisibility(); const [isCollabReady, setIsCollabReady] = useState(false); const { pageSlug } = useParams(); - const collabRetryCount = useRef(0); const slugId = extractPageSlugId(pageSlug); const localProvider = useMemo(() => { @@ -105,13 +105,11 @@ export default function PageEditor({ connect: false, preserveConnection: false, onAuthenticationFailed: (auth: onAuthenticationFailedParameters) => { - collabRetryCount.current = collabRetryCount.current + 1; - refetchCollabToken().then(() => { - collabRetryCount.current = 0; - }); - - if (collabRetryCount.current > 20) { - window.location.reload(); + const payload = jwtDecode(collabQuery?.token); + const now = Date.now().valueOf() / 1000; + const isTokenExpired = now >= payload.exp; + if (isTokenExpired) { + refetchCollabToken(); } }, onStatus: (status) => { @@ -265,19 +263,13 @@ export default function PageEditor({ documentState === "visible" && remoteProvider?.status === WebSocketStatus.Disconnected ) { - const reconnectTimeout = setTimeout( - () => { - remoteProvider.connect(); - resetIdle(); - }, - collabRetryCount.current > 2 ? 3000 : 0, - ); - - setIsCollabReady(true); - - return () => clearTimeout(reconnectTimeout); + resetIdle(); + remoteProvider.connect(); + setTimeout(() => { + setIsCollabReady(true); + }, 600); } - }, [isIdle, documentState, remoteProvider?.status]); + }, [isIdle, documentState, remoteProvider]); const isSynced = isLocalSynced && isRemoteSynced; @@ -286,7 +278,7 @@ export default function PageEditor({ if ( !isCollabReady && isSynced && - remoteProvider.status === WebSocketStatus.Connected + remoteProvider?.status === WebSocketStatus.Connected ) { setIsCollabReady(true); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0a053674..70f5088b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -272,6 +272,9 @@ importers: js-cookie: specifier: ^3.0.5 version: 3.0.5 + jwt-decode: + specifier: ^4.0.0 + version: 4.0.0 katex: specifier: 0.16.21 version: 0.16.21 @@ -6612,6 +6615,10 @@ packages: jws@3.2.2: resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + jwt-decode@4.0.0: + resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} + engines: {node: '>=18'} + katex@0.16.21: resolution: {integrity: sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==} hasBin: true @@ -16534,6 +16541,8 @@ snapshots: jwa: 1.4.1 safe-buffer: 5.2.1 + jwt-decode@4.0.0: {} + katex@0.16.21: dependencies: commander: 8.3.0