-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAtoms.ts
63 lines (57 loc) · 1.83 KB
/
Atoms.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import { atom, useAtomValue, useAtom } from "jotai";
import { supabase } from "./utils/supabase";
export type AuthUser = {
uid: string | null;
email: string | null;
};
type AuthUserOrNull = AuthUser | null;
const authUserState = atom<Promise<AuthUserOrNull> | AuthUserOrNull>(null);
authUserState.onMount = (setAtom) => {
// a: 最初の認証状態を取得した時に解決するPromiseを初期値に設定
let resolvePromise: (value: AuthUserOrNull) => void;
const initialValue = new Promise<AuthUserOrNull>((resolve) => {
resolvePromise = resolve;
});
setAtom(initialValue);
const { data: authListener } = supabase.auth.onAuthStateChange(
(event: any, session: any) => {
if (event === "SIGNED_IN") {
const { id, email } = session?.user!;
const authUser = {
uid: id ?? null,
email: email ?? null,
};
resolvePromise(authUser);
setAtom(authUser);
console.log("signed in");
} else {
// reload時にsessionが残っている場合は、sessionからauthUserを取得する
supabase.auth.getSession().then((res) => {
if (res.error) {
console.log(res.error);
} else {
console.log("session: ");
console.log(res.data);
const { id, email } = res?.data?.session?.user!;
const authUser = {
uid: id ?? null,
email: email ?? null,
};
resolvePromise(authUser);
setAtom(authUser);
}
});
}
}
);
// d: 監視を終了する関数を返す
// return () => {
// authListener.subscription.unsubscribe;
// };
return;
};
// e: atomの値をサブスクライブするフック
export function useAuthUser() {
// useStateのValueのみ返す
return useAtom(authUserState);
}