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