parent
09029d5e7b
commit
574f5e99b5
2 changed files with 61 additions and 0 deletions
@ -0,0 +1,58 @@ |
|||||||
|
import { useCallback, useEffect, useState } from 'react'; |
||||||
|
|
||||||
|
import useIsFirstRender from './useIsFirstRender'; |
||||||
|
|
||||||
|
const useCookieJar = (): { |
||||||
|
cookieJar: CookieJar; |
||||||
|
getCookie: <T>(key: string) => T | undefined; |
||||||
|
getSessionUser: () => SessionUser | undefined; |
||||||
|
} => { |
||||||
|
const isFirstRender = useIsFirstRender(); |
||||||
|
|
||||||
|
const [cookieJar, setCookieJar] = useState<CookieJar>({}); |
||||||
|
|
||||||
|
const getCookie = useCallback( |
||||||
|
<T>(key: string, prefix = 'suiapi.') => |
||||||
|
cookieJar[`${prefix}${key}`] as T | undefined, |
||||||
|
[cookieJar], |
||||||
|
); |
||||||
|
|
||||||
|
const getSessionUser = useCallback( |
||||||
|
() => getCookie<SessionUser>('user'), |
||||||
|
[getCookie], |
||||||
|
); |
||||||
|
|
||||||
|
useEffect(() => { |
||||||
|
if (isFirstRender) { |
||||||
|
const lines = document.cookie.split(/\s*;\s*/); |
||||||
|
|
||||||
|
setCookieJar( |
||||||
|
lines.reduce<CookieJar>((previous, line) => { |
||||||
|
const [key, value] = line.split('=', 2); |
||||||
|
|
||||||
|
const decoded = decodeURIComponent(value); |
||||||
|
|
||||||
|
let result: unknown; |
||||||
|
|
||||||
|
if (decoded.startsWith('j:')) { |
||||||
|
try { |
||||||
|
result = JSON.parse(decoded.substring(2)); |
||||||
|
} catch (error) { |
||||||
|
result = value; |
||||||
|
} |
||||||
|
} else { |
||||||
|
result = value; |
||||||
|
} |
||||||
|
|
||||||
|
previous[key] = result; |
||||||
|
|
||||||
|
return previous; |
||||||
|
}, {}), |
||||||
|
); |
||||||
|
} |
||||||
|
}, [isFirstRender]); |
||||||
|
|
||||||
|
return { cookieJar, getCookie, getSessionUser }; |
||||||
|
}; |
||||||
|
|
||||||
|
export default useCookieJar; |
@ -0,0 +1,3 @@ |
|||||||
|
type CookieJar = Record<string, unknown>; |
||||||
|
|
||||||
|
type SessionUser = { name: string; uuid: string }; |
Loading…
Reference in new issue