enzostvs HF staff commited on
Commit
63bd9dc
1 Parent(s): ca3be8c

hugging face sign in + save generation with user.sub

Browse files
app/api/auth/route.ts CHANGED
@@ -24,7 +24,6 @@ export async function POST(req: Request) {
24
  .json()
25
  .catch(() => ({}));
26
 
27
- console.log(response)
28
  if (response.error) return Response.json({ status: 401, ok: false, message: response.error_description });
29
 
30
  return Response.json(
 
24
  .json()
25
  .catch(() => ({}));
26
 
 
27
  if (response.error) return Response.json({ status: 401, ok: false, message: response.error_description });
28
 
29
  return Response.json(
app/api/collections/route.ts CHANGED
@@ -3,15 +3,15 @@ import { PrismaClient } from '@prisma/client'
3
  const prisma = new PrismaClient()
4
 
5
  export async function POST(request: Request) {
6
- const { ids, page } = await request.json()
7
 
8
  const collections = await prisma.collection.findMany({
9
  orderBy: {
10
  id: 'desc'
11
  },
12
  where: {
13
- id: {
14
- in: ids,
15
  }
16
  },
17
  take: 15,
 
3
  const prisma = new PrismaClient()
4
 
5
  export async function POST(request: Request) {
6
+ const { userId, page } = await request.json()
7
 
8
  const collections = await prisma.collection.findMany({
9
  orderBy: {
10
  id: 'desc'
11
  },
12
  where: {
13
+ userId: {
14
+ equals: userId
15
  }
16
  },
17
  take: 15,
app/api/route.ts CHANGED
@@ -16,7 +16,7 @@ export async function POST(
16
  ['x-use-cache']: "0"
17
  }
18
 
19
- const { inputs, style } = await request.json()
20
  const findStyle = list_styles.find((item) => item.name === style)
21
 
22
  const textIsNSFW = await isTextNSFW(inputs, global_headers)
@@ -48,6 +48,7 @@ export async function POST(
48
  data: {
49
  prompt: inputs,
50
  file_name: name,
 
51
  },
52
  })
53
 
 
16
  ['x-use-cache']: "0"
17
  }
18
 
19
+ const { inputs, style, userId } = await request.json()
20
  const findStyle = list_styles.find((item) => item.name === style)
21
 
22
  const textIsNSFW = await isTextNSFW(inputs, global_headers)
 
48
  data: {
49
  prompt: inputs,
50
  file_name: name,
51
+ userId: userId ?? "",
52
  },
53
  })
54
 
components/input-generation.tsx CHANGED
@@ -23,7 +23,7 @@ export const InputGeneration: React.FC = () => {
23
  value={value}
24
  type="text"
25
  className="h-full text-lg placeholder:text-gray-400 text-gray-900 font-medium w-full outline-none truncate"
26
- placeholder="A thug cat riding his small bike"
27
  onChange={(e) => setValue(e.target.value)}
28
  onBlur={() => setPrompt(value)}
29
  onKeyDown={(e) => {
 
23
  value={value}
24
  type="text"
25
  className="h-full text-lg placeholder:text-gray-400 text-gray-900 font-medium w-full outline-none truncate"
26
+ placeholder="A red car, forest in the background"
27
  onChange={(e) => setValue(e.target.value)}
28
  onBlur={() => setPrompt(value)}
29
  onKeyDown={(e) => {
components/login/index.tsx CHANGED
@@ -1,30 +1,53 @@
1
  "use client";
2
 
3
- import { useMount } from "react-use";
4
  import Image from "next/image";
5
  import { FaUserAstronaut } from "react-icons/fa";
6
 
7
  import { useUser } from "@/utils/useUser";
8
  import HFLogo from "@/assets/images/hf-logo.svg";
 
 
9
 
10
  export const Login = ({ code }: { code?: string }) => {
11
- const { getAuthorization } = useUser();
12
 
13
- // useMount(() => getAuthorization(code as string));
 
 
 
 
 
 
 
 
14
 
15
  return (
16
  <div className="p-6 min-h-screen flex items-center justify-center">
17
  <div className="mx-auto bg-white w-full max-w-sm rounded-3xl p-6">
18
- <p className="text-center text-gray-400 uppercase font-bold text-sm">
19
- Retrieving your information...
 
 
 
 
 
 
 
 
 
20
  </p>
21
  <div className="flex items-center justify-evenly mt-3">
22
  <Image src={HFLogo} alt="HF Logo" width={100} height={100} />
23
- <div className="loading-dots grey translate-y-[5px]">
24
- <span />
25
- <span />
26
- <span />
27
- </div>
 
 
 
 
28
  <div className="w-[80px] h-[80px] rounded-full ring-4 ring-indigo-200 border-2 border-white bg-indigo-50 p-3">
29
  <FaUserAstronaut className="w-full h-full text-indigo-500" />
30
  </div>
 
1
  "use client";
2
 
3
+ import { useMount, useUpdateEffect } from "react-use";
4
  import Image from "next/image";
5
  import { FaUserAstronaut } from "react-icons/fa";
6
 
7
  import { useUser } from "@/utils/useUser";
8
  import HFLogo from "@/assets/images/hf-logo.svg";
9
+ import classNames from "classnames";
10
+ import { HiCheckBadge } from "react-icons/hi2";
11
 
12
  export const Login = ({ code }: { code?: string }) => {
13
+ const { getAuthorization, user } = useUser();
14
 
15
+ useMount(() => getAuthorization(code as string));
16
+
17
+ useUpdateEffect(() => {
18
+ if (user) {
19
+ setTimeout(() => {
20
+ window.location.href = "/";
21
+ }, 2000);
22
+ }
23
+ }, [user]);
24
 
25
  return (
26
  <div className="p-6 min-h-screen flex items-center justify-center">
27
  <div className="mx-auto bg-white w-full max-w-sm rounded-3xl p-6">
28
+ <p
29
+ className={classNames(
30
+ "text-center text-gray-400 uppercase font-bold text-sm whitespace-pre-line",
31
+ {
32
+ "!text-green-600": user,
33
+ }
34
+ )}
35
+ >
36
+ {user
37
+ ? "You have been logged in successfully. \nRedirecting..."
38
+ : "Retrieving your information..."}
39
  </p>
40
  <div className="flex items-center justify-evenly mt-3">
41
  <Image src={HFLogo} alt="HF Logo" width={100} height={100} />
42
+ {user ? (
43
+ <HiCheckBadge className="w-[30px] h-[30px] text-green-500" />
44
+ ) : (
45
+ <div className="loading-dots grey translate-y-[5px]">
46
+ <span />
47
+ <span />
48
+ <span />
49
+ </div>
50
+ )}
51
  <div className="w-[80px] h-[80px] rounded-full ring-4 ring-indigo-200 border-2 border-white bg-indigo-50 p-3">
52
  <FaUserAstronaut className="w-full h-full text-indigo-500" />
53
  </div>
components/main/hooks/useCollections.ts CHANGED
@@ -3,8 +3,11 @@ import { useQuery, useQueryClient } from "@tanstack/react-query";
3
  import { useLocalStorage, useUpdateEffect } from "react-use";
4
  import _ from "lodash";
5
 
 
 
6
  export const useCollections = (category: string) => {
7
  const [loading, setLoading] = useState(false);
 
8
  const [myGenerationsId] = useLocalStorage<any>('my-own-generations', []);
9
 
10
  const client = useQueryClient();
@@ -19,7 +22,7 @@ export const useCollections = (category: string) => {
19
  const response = await fetch("/api/collections", {
20
  method: "POST",
21
  body: JSON.stringify({
22
- ids: category === 'my-own' ? myGenerationsId : undefined,
23
  page: 0,
24
  }),
25
  })
 
3
  import { useLocalStorage, useUpdateEffect } from "react-use";
4
  import _ from "lodash";
5
 
6
+ import { useUser } from "@/utils/useUser";
7
+
8
  export const useCollections = (category: string) => {
9
  const [loading, setLoading] = useState(false);
10
+ const { user } = useUser();
11
  const [myGenerationsId] = useLocalStorage<any>('my-own-generations', []);
12
 
13
  const client = useQueryClient();
 
22
  const response = await fetch("/api/collections", {
23
  method: "POST",
24
  body: JSON.stringify({
25
+ userId: category === 'my-own' ? user?.sub : undefined,
26
  page: 0,
27
  }),
28
  })
components/main/hooks/useInputGeneration.ts CHANGED
@@ -5,9 +5,11 @@ import { useLocalStorage } from 'react-use';
5
  import { Image } from "@/utils/type"
6
  import list_styles from "@/assets/list_styles.json"
7
  import { useCollection } from "@/components/modal/useCollection";
 
8
 
9
  export const useInputGeneration = () => {
10
  const { setOpen } = useCollection();
 
11
  const [myGenerationsId, setGenerationsId] = useLocalStorage<any>('my-own-generations', []);
12
 
13
  const { data: prompt } = useQuery(["prompt"], () => {
@@ -57,6 +59,7 @@ export const useInputGeneration = () => {
57
  body: JSON.stringify({
58
  inputs: prompt,
59
  style,
 
60
  }),
61
  })
62
  const data = await response.json()
 
5
  import { Image } from "@/utils/type"
6
  import list_styles from "@/assets/list_styles.json"
7
  import { useCollection } from "@/components/modal/useCollection";
8
+ import { useUser } from "@/utils/useUser";
9
 
10
  export const useInputGeneration = () => {
11
  const { setOpen } = useCollection();
12
+ const { user } = useUser();
13
  const [myGenerationsId, setGenerationsId] = useLocalStorage<any>('my-own-generations', []);
14
 
15
  const { data: prompt } = useQuery(["prompt"], () => {
 
59
  body: JSON.stringify({
60
  inputs: prompt,
61
  style,
62
+ userId: user?.sub,
63
  }),
64
  })
65
  const data = await response.json()
components/main/index.tsx CHANGED
@@ -40,6 +40,7 @@ export const Main = () => {
40
  {categories.map(({ key, label, icon, isLogged }) =>
41
  isLogged && !user ? (
42
  <img
 
43
  src="https://huggingface.co/datasets/huggingface/badges/resolve/main/sign-in-with-huggingface-xl.svg"
44
  className="cursor-pointer hover:-translate-y-1 transition-all duration-200"
45
  onClick={openWindowLogin}
 
40
  {categories.map(({ key, label, icon, isLogged }) =>
41
  isLogged && !user ? (
42
  <img
43
+ key={key}
44
  src="https://huggingface.co/datasets/huggingface/badges/resolve/main/sign-in-with-huggingface-xl.svg"
45
  className="cursor-pointer hover:-translate-y-1 transition-all duration-200"
46
  onClick={openWindowLogin}
prisma/schema.prisma CHANGED
@@ -4,7 +4,7 @@ generator client {
4
 
5
  datasource db {
6
  provider = "sqlite"
7
- url = "file://data/dev.db"
8
  }
9
 
10
  model Collection {
@@ -12,4 +12,5 @@ model Collection {
12
  prompt String
13
  file_name String
14
  createdAt DateTime @default(now())
 
15
  }
 
4
 
5
  datasource db {
6
  provider = "sqlite"
7
+ url = "file:../data/dev.db"
8
  }
9
 
10
  model Collection {
 
12
  prompt String
13
  file_name String
14
  createdAt DateTime @default(now())
15
+ userId String? @default("")
16
  }
utils/useUser.ts CHANGED
@@ -29,7 +29,7 @@ export const useUser = () => {
29
  clear();
30
  return null;
31
  }
32
- return res;
33
  },
34
  {
35
  refetchOnWindowFocus: false,
@@ -52,7 +52,6 @@ export const useUser = () => {
52
  };
53
 
54
  const getAuthorization = async (code: string) => {
55
- console.log(code)
56
  const request = await fetch("/api/auth", {
57
  method: "POST",
58
  body: JSON.stringify({
@@ -64,7 +63,6 @@ export const useUser = () => {
64
  setValue(res.access_token, {
65
  expires: res.experes_in,
66
  });
67
- window.location.href = "/";
68
  }
69
 
70
  return {
 
29
  clear();
30
  return null;
31
  }
32
+ return res?.user;
33
  },
34
  {
35
  refetchOnWindowFocus: false,
 
52
  };
53
 
54
  const getAuthorization = async (code: string) => {
 
55
  const request = await fetch("/api/auth", {
56
  method: "POST",
57
  body: JSON.stringify({
 
63
  setValue(res.access_token, {
64
  expires: res.experes_in,
65
  });
 
66
  }
67
 
68
  return {