UNPKG

@wener/console

Version:

Base console UI toolkit

228 lines (227 loc) 6.61 kB
// import { useCallback, useEffect, useRef, type FC, type ReactNode } from 'react'; // import { useStore } from 'zustand'; // import { LoadingIndicator } from '../loader'; // import { AuthStatus, type AppStore } from '../state'; // import { getAppStore } from './container'; // // interface Storage { // getItem: (key: string) => string | null; // setItem: (key: string, value: string) => void; // removeItem?: (key: string) => void; // } // // export interface AppActions { // refresh: (o: { accessToken: string; refreshToken?: string }) => Promise<{ // accessToken: string; // refreshToken?: string; // expiresAt: Date | string; // }>; // ping: () => Promise<any>; // } // // export const AppActor: FC<{ // store?: AppStore; // actions: AppActions; // storage?: Storage; // }> = ({ store = getAppStore(), actions: { refresh, ping }, storage = globalThis.localStorage }) => { // useNetworkStatusWatch(store); // // const authStatus = useStore(store, (s) => s.auth.status); // const networkOnline = useStore(store, (s) => s.network.online); // const serverOnline = useStore(store, (s) => s.server.online); // // const doServerCheck = async () => { // if (!store.getState().network.online) { // store.setState((s) => { // s.server.online = false; // }); // return; // } // // let start = Date.now(); // let online = false; // try { // await ping(); // online = true; // } catch (e) { // console.error('Failed to ping server', e); // } finally { // store.setState((s) => { // s.server.online = false; // s.server.latency = Date.now() - start; // }); // } // return online; // }; // // const checkAuth = async () => { // const accessToken = storage.getItem('accessToken'); // const refreshToken = storage.getItem('refreshToken') ?? undefined; // if (accessToken) { // try { // const out = await refresh({ accessToken, refreshToken }); // store.getState().setAuth(out); // return true; // } catch (e) { // console.error('Failed to refresh token', e); // // // server offline, check later // if (!(await doServerCheck())) { // return; // } // } // } // // not authenticated // store.setState((s) => { // s.auth.status = AuthStatus.Unauthenticated; // }); // return false; // }; // // let authRef = useRef<Promise<any>>(); // const doAuthCheck = () => { // // skip // let state = store.getState(); // // only check for init and authenticated // if (!state.network.online || !state.server.online || state.auth.status === AuthStatus.Unauthenticated) { // return; // } // // avoid race // let current = authRef.current; // if (current) { // current.then((v) => { // // authed, skip for now, will check for next // if (v) { // authRef.current = undefined; // } else { // // check again // return (current = checkAuth()); // } // return v; // }); // } else { // authRef.current = checkAuth().then((v) => { // // done // authRef.current = undefined; // return v; // }); // } // }; // // // auth check // useEffect(() => { // if (!serverOnline) { // return; // } // doAuthCheck(); // let timer = setInterval(doAuthCheck, 5 * 60 * 1000); // return () => { // clearInterval(timer); // }; // }, [store, authStatus, networkOnline, serverOnline]); // // useAuthTokenPersist(store, storage); // useServerStatusWatch(store, doServerCheck); // return null; // }; // // function deleteItem(s: any, key: string) { // if ('removeItem' in s) { // s.removeItem(key); // } else { // delete s[key]; // } // } // // function useAuthTokenPersist(store: AppStore, storage: Storage) { // let ref = useRef(storage); // ref.current = storage; // // persist token // useEffect(() => { // return store.subscribe((s) => { // if (s.auth.status !== AuthStatus.Authenticated) { // return; // } // const { accessToken = '', refreshToken } = s.auth; // // const storage = ref.current; // if ((storage.getItem('accessToken') ?? '') === accessToken) { // return; // } // // accessToken ? storage.setItem('accessToken', accessToken) : deleteItem(storage, 'accessToken'); // refreshToken ? storage.setItem('refreshToken', refreshToken) : deleteItem(storage, 'refreshToken'); // }); // }, [store]); // } // // function useNetworkStatusWatch(store: AppStore) { // const setNetworkOnline = (online: boolean) => { // store.setState((s) => { // s.network.online = online; // s.server.online = online; // }); // }; // // useEffect(() => { // setNetworkOnline(navigator.onLine); // // let handleOffline = () => { // setNetworkOnline(false); // }; // let handleOnline = () => { // setNetworkOnline(true); // }; // // window.addEventListener('offline', handleOffline); // window.addEventListener('online', handleOnline); // return () => { // window.removeEventListener('offline', handleOffline); // window.removeEventListener('online', handleOnline); // }; // }, [store]); // } // // function useServerStatusWatch(store: AppStore, checkServer: () => Promise<any>) { // const serverOnline = useStore(store, (s) => s.server.online); // // // ping server if server offline // useEffect(() => { // if (serverOnline) { // return; // } // let wait = 5 * 1000; // const nextWait = () => { // let v = wait; // // log increase wait // wait = Math.min(60 * 1000, wait * 2); // return v; // }; // // const handleCheck = async () => { // await checkServer(); // timer = setTimeout(handleCheck, nextWait()); // }; // let timer = setTimeout(handleCheck, nextWait()); // return () => { // clearTimeout(timer); // }; // }, [serverOnline]); // } // // export const AuthReady: FC<{ children?: ReactNode }> = ({ children }) => { // const ready = useStore( // getAppStore(), // useCallback((s) => s.auth.status !== AuthStatus.Init, []), // ); // if (ready) { // return children; // } // return <LoadingIndicator />; // }; // // export function clearAuthToken(storage: Storage = localStorage) { // deleteItem(storage, 'accessToken'); // } export { }; //# sourceMappingURL=AppActor.js.map