File size: 1,759 Bytes
7d29959
 
 
 
be213e2
7d29959
31f62e8
7d29959
 
 
 
 
a1489d3
7d29959
 
 
 
 
486f5c7
7d29959
 
 
 
 
 
 
 
 
bdc3827
7d29959
 
 
 
63bd9dc
7d29959
 
 
486f5c7
 
7d29959
 
 
 
 
 
 
 
 
 
31f62e8
 
 
 
bcb1927
31f62e8
 
 
7d29959
 
 
 
 
 
 
 
63fef5b
 
 
7d29959
f05d143
 
4cc6b33
721e8fe
7d29959
 
 
31f62e8
 
7d29959
 
 
03138b9
7d29959
31f62e8
 
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
"use client";

import { useCookie, useUpdateEffect } from "react-use";
import { useQuery } from "@tanstack/react-query";
import { useState } from "react";

export const useUser = () => {
  const [value, setValue, remove] = useCookie("auth_hf_token");

  const {
    data: user,
    refetch,
    isFetching: loading,
    remove: clear,
  }: any = useQuery(
    ["user.me"],
    async () => {
      if (!value) return null;
      if (user) return user;
      const request = await fetch("/api/me", {
        method: "GET",
        headers: {
          Authorization: `Bearer ${value}`,
        },
      })

      const res = await request.clone().json().catch(() => ({}));

      if (!res.ok) {
        remove();
        clear();
        return null;
      }
      return res?.user;
    },
    {
      refetchOnWindowFocus: false,
      refetchOnMount: false,
      refetchOnReconnect: false,
    }
  );
  
  useUpdateEffect(() => {
    if (value) {
      refetch()
    }
  }
  , [value]);

  const openWindowLogin = async () => {
    const response = await fetch(`/api/login`);
    const { ok, redirect } = await response.json();
    if (ok && redirect) {
      window.open(redirect, "_blank");
    }
  };

  const getAuthorization = async (code: string) => {
    const request = await fetch("/api/auth", {
      method: "POST",
      body: JSON.stringify({
        code,
      }),
    });
    const res = await request.clone().json().catch(() => ({}));
    if (!res.ok) {
      return null;
    }
    setValue(res.access_token, {
      expires: res.experes_in,
      sameSite: "none",
      path: "/",
      secure: true,
    });
  }

  return {
    openWindowLogin,
    user,
    refetch,
    loading,
    token: `Bearer ${value}`,
    getAuthorization
  }
}