diff --git a/src/hooks/useAuth.ts b/src/hooks/useAuth.ts new file mode 100644 index 000000000..acfdcefd6 --- /dev/null +++ b/src/hooks/useAuth.ts @@ -0,0 +1,31 @@ +import { useMemo } from 'react'; + +import { SoapboxAuth, soapboxAuthSchema, AuthUser } from 'soapbox/schemas/soapbox/soapbox-auth'; +import { Token } from 'soapbox/schemas/token'; + +import { useAppSelector } from './useAppSelector'; + +export function useAuth() { + const raw = useAppSelector((state) => state.auth); + + const data = useMemo(() => { + try { + return soapboxAuthSchema.parse(raw.toJS()); + } catch { + return { tokens: {}, users: {} }; + } + }, [raw]); + + const users = useMemo(() => Object.values(data.users), []); + const tokens = useMemo(() => Object.values(data.tokens), []); + + const user = data.me ? data.users[data.me] : undefined; + + return { + users, + tokens, + accountId: user?.id, + accountUrl: user?.url, + accessToken: user?.access_token, + }; +} \ No newline at end of file diff --git a/src/schemas/soapbox/soapbox-auth.ts b/src/schemas/soapbox/soapbox-auth.ts index d95a41603..b80d71bba 100644 --- a/src/schemas/soapbox/soapbox-auth.ts +++ b/src/schemas/soapbox/soapbox-auth.ts @@ -1,7 +1,6 @@ import { z } from 'zod'; import { tokenSchema } from 'soapbox/schemas/token'; -import { coerceObject, filteredArray } from 'soapbox/schemas/utils'; const authUserSchema = z.object({ access_token: z.string(), @@ -9,12 +8,13 @@ const authUserSchema = z.object({ url: z.string().url(), }); -const soapboxAuthSchema = coerceObject({ - tokens: filteredArray(tokenSchema), - users: filteredArray(authUserSchema), - me: z.string().url().nullable().catch(null), +const soapboxAuthSchema = z.object({ + tokens: z.record(z.string(), tokenSchema), + users: z.record(z.string(), authUserSchema), + me: z.string().url().optional().catch(undefined), }); +type AuthUser = z.infer; type SoapboxAuth = z.infer; -export { soapboxAuthSchema, SoapboxAuth }; \ No newline at end of file +export { soapboxAuthSchema, SoapboxAuth, authUserSchema, AuthUser }; \ No newline at end of file