kopia lustrzana https://gitlab.com/soapbox-pub/soapbox
Add useAuth hook, fix soapboxAuthSchema
rodzic
02d599beab
commit
d69d582a38
|
@ -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<SoapboxAuth>(() => {
|
||||
try {
|
||||
return soapboxAuthSchema.parse(raw.toJS());
|
||||
} catch {
|
||||
return { tokens: {}, users: {} };
|
||||
}
|
||||
}, [raw]);
|
||||
|
||||
const users = useMemo<AuthUser[]>(() => Object.values(data.users), []);
|
||||
const tokens = useMemo<Token[]>(() => 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,
|
||||
};
|
||||
}
|
|
@ -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<typeof authUserSchema>;
|
||||
type SoapboxAuth = z.infer<typeof soapboxAuthSchema>;
|
||||
|
||||
export { soapboxAuthSchema, SoapboxAuth };
|
||||
export { soapboxAuthSchema, SoapboxAuth, authUserSchema, AuthUser };
|
Ładowanie…
Reference in New Issue