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 { z } from 'zod';
|
||||||
|
|
||||||
import { tokenSchema } from 'soapbox/schemas/token';
|
import { tokenSchema } from 'soapbox/schemas/token';
|
||||||
import { coerceObject, filteredArray } from 'soapbox/schemas/utils';
|
|
||||||
|
|
||||||
const authUserSchema = z.object({
|
const authUserSchema = z.object({
|
||||||
access_token: z.string(),
|
access_token: z.string(),
|
||||||
|
@ -9,12 +8,13 @@ const authUserSchema = z.object({
|
||||||
url: z.string().url(),
|
url: z.string().url(),
|
||||||
});
|
});
|
||||||
|
|
||||||
const soapboxAuthSchema = coerceObject({
|
const soapboxAuthSchema = z.object({
|
||||||
tokens: filteredArray(tokenSchema),
|
tokens: z.record(z.string(), tokenSchema),
|
||||||
users: filteredArray(authUserSchema),
|
users: z.record(z.string(), authUserSchema),
|
||||||
me: z.string().url().nullable().catch(null),
|
me: z.string().url().optional().catch(undefined),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
type AuthUser = z.infer<typeof authUserSchema>;
|
||||||
type SoapboxAuth = z.infer<typeof soapboxAuthSchema>;
|
type SoapboxAuth = z.infer<typeof soapboxAuthSchema>;
|
||||||
|
|
||||||
export { soapboxAuthSchema, SoapboxAuth };
|
export { soapboxAuthSchema, SoapboxAuth, authUserSchema, AuthUser };
|
Ładowanie…
Reference in New Issue