59 lines
1.6 KiB
JavaScript
59 lines
1.6 KiB
JavaScript
import useLocalStorageState from 'use-local-storage-state'
|
|
|
|
/*
|
|
* Make it possible to always check for account.username and account.ux
|
|
*/
|
|
const noAccount = { username: false, ux: 3 }
|
|
|
|
/*
|
|
* The useAccount hook
|
|
*/
|
|
export function useAccount(Swizzled) {
|
|
// (persisted) State (saved to local storage)
|
|
const [account, setAccount] = useLocalStorageState('fs-account', { defaultValue: noAccount })
|
|
const [admin, setAdmin] = useLocalStorageState('fs-admin', { defaultValue: noAccount })
|
|
const [token, setToken] = useLocalStorageState('fs-token', { defaultValue: null })
|
|
const [seenUser, setSeenUser] = useLocalStorageState('fs-seen-user', { defaultValue: false })
|
|
|
|
// Clear user data. This gets called when signing out
|
|
const signOut = () => {
|
|
setAccount(noAccount)
|
|
setToken(null)
|
|
}
|
|
|
|
// Impersonate a user.
|
|
// Only admins can do this but that is enforced at the backend.
|
|
const impersonate = (data) => {
|
|
setAdmin({ token, account })
|
|
const newAccount = {
|
|
...data.account,
|
|
impersonatingAdmin: { id: account.id, username: account.username },
|
|
}
|
|
setAdmin({ token, account: { ...account } })
|
|
setAccount(newAccount)
|
|
setToken(data.token)
|
|
}
|
|
|
|
const stopImpersonating = () => {
|
|
setAccount(admin.account)
|
|
setToken(admin.token)
|
|
clearAdmin()
|
|
}
|
|
|
|
const clearAdmin = () => setAdmin(noAccount)
|
|
|
|
return {
|
|
account,
|
|
setAccount,
|
|
token,
|
|
setToken,
|
|
seenUser,
|
|
setSeenUser,
|
|
signOut,
|
|
admin,
|
|
clearAdmin,
|
|
impersonate,
|
|
stopImpersonating,
|
|
ux: account?.control || account?.ux || Swizzled.config.defaultUx,
|
|
}
|
|
}
|