Esteves Enzo commited on
Commit
03ce1cf
1 Parent(s): 741554a

add post function

Browse files
components/editor/main/endpoint.tsx CHANGED
@@ -41,7 +41,9 @@ export const Endpoint = ({
41
  onChange={(value) => handleChange(value, i)}
42
  />
43
  ) : (
44
- <p className="text-slate-300">{p}</p>
 
 
45
  );
46
  })}
47
  </div>
 
41
  onChange={(value) => handleChange(value, i)}
42
  />
43
  ) : (
44
+ <p key={i} className="text-slate-300">
45
+ {p}
46
+ </p>
47
  );
48
  })}
49
  </div>
components/editor/main/hooks/useRequest.ts CHANGED
@@ -1,19 +1,19 @@
1
  import { useState } from "react"
2
 
3
  import axios from "@/utils/axios";
4
- import { ApiRoute } from "@/utils/type";
5
 
6
- export const useRequest = (endpoint: string, params: any) => {
7
  const [loading, setLoading] = useState<boolean>(false)
8
  const [data, setData] = useState<any>(null)
9
 
10
  const submit = async () => {
11
  setLoading(true);
12
- console.log(endpoint)
13
  const url = new URL(endpoint, process.env.NEXT_PUBLIC_APP_APIURL);
14
  if (params) {
15
  const parameters = Object.entries(params).filter(
16
- ([key, value]) =>
17
  value !== "" &&
18
  value !== null &&
19
  value !== undefined &&
@@ -24,19 +24,29 @@ export const useRequest = (endpoint: string, params: any) => {
24
  });
25
  }
26
 
27
- axios
28
- .get(url.pathname, {
29
- params: url.searchParams,
30
- })
31
- .then((res: any) => {
32
- if (res.ok) {
33
- setData(res.data);
34
- }
35
- })
36
- .catch((err) => {
37
- setData(err.data);
38
- })
39
- .finally(() => setLoading(false));
 
 
 
 
 
 
 
 
 
 
40
  };
41
 
42
  return {
 
1
  import { useState } from "react"
2
 
3
  import axios from "@/utils/axios";
4
+ import { Options } from "redaxios";
5
 
6
+ export const useRequest = (method: "post" | "put" | "patch" | "delete" | "get", endpoint: string, params: Options, body: Options | undefined) => {
7
  const [loading, setLoading] = useState<boolean>(false)
8
  const [data, setData] = useState<any>(null)
9
 
10
  const submit = async () => {
11
  setLoading(true);
12
+
13
  const url = new URL(endpoint, process.env.NEXT_PUBLIC_APP_APIURL);
14
  if (params) {
15
  const parameters = Object.entries(params).filter(
16
+ ([_, value]) =>
17
  value !== "" &&
18
  value !== null &&
19
  value !== undefined &&
 
24
  });
25
  }
26
 
27
+ console.log(
28
+ "Requesting",
29
+ method,
30
+ url.pathname,
31
+ url.searchParams.toString(),
32
+ body
33
+ )
34
+
35
+ const needBody = ["post", "put", "patch"].includes(method);
36
+
37
+ axios[method](url.pathname, needBody ? body : {
38
+ params: url.searchParams
39
+ })
40
+ .then((res: any) => {
41
+ if (res.ok) {
42
+ setData(res.data);
43
+ }
44
+ })
45
+ .catch((err) => {
46
+ setData(err.data);
47
+ })
48
+ .finally(() => setLoading(false));
49
+
50
  };
51
 
52
  return {
components/editor/main/index.tsx CHANGED
@@ -1,5 +1,7 @@
1
  "use client";
2
  import { useState } from "react";
 
 
3
 
4
  import { ApiRoute } from "@/utils/type";
5
 
@@ -7,7 +9,6 @@ import { Endpoint } from "./endpoint";
7
  import { Request } from "./request";
8
  import { Response } from "./response";
9
  import { useRequest } from "./hooks/useRequest";
10
- import { useMount, useUpdateEffect } from "react-use";
11
 
12
  export const EditorMain = ({ endpoint }: { endpoint: ApiRoute }) => {
13
  const [formattedEndpoint, setFormattedEndpoint] = useState<string>(
@@ -16,9 +17,18 @@ export const EditorMain = ({ endpoint }: { endpoint: ApiRoute }) => {
16
  const [formattedParameters, setFormattedParameters] = useState(
17
  endpoint?.parameters ? { ...endpoint.parameters } : undefined
18
  );
 
 
19
  const { loading, submit, data } = useRequest(
 
 
 
 
 
 
20
  formattedEndpoint,
21
- formattedParameters
 
22
  );
23
 
24
  useMount(() => {
@@ -37,12 +47,15 @@ export const EditorMain = ({ endpoint }: { endpoint: ApiRoute }) => {
37
  <div className="h-full grid grid-cols-1 xl:grid-cols-3">
38
  <Request
39
  parameters={formattedParameters}
40
- onChange={(k: string, v: string | boolean) => {
 
 
41
  setFormattedParameters({
42
  ...formattedParameters,
43
  [k]: v,
44
  });
45
  }}
 
46
  >
47
  <Endpoint endpoint={endpoint} onChange={setFormattedEndpoint}>
48
  <button
 
1
  "use client";
2
  import { useState } from "react";
3
+ import { useMount } from "react-use";
4
+ import { Options } from "redaxios";
5
 
6
  import { ApiRoute } from "@/utils/type";
7
 
 
9
  import { Request } from "./request";
10
  import { Response } from "./response";
11
  import { useRequest } from "./hooks/useRequest";
 
12
 
13
  export const EditorMain = ({ endpoint }: { endpoint: ApiRoute }) => {
14
  const [formattedEndpoint, setFormattedEndpoint] = useState<string>(
 
17
  const [formattedParameters, setFormattedParameters] = useState(
18
  endpoint?.parameters ? { ...endpoint.parameters } : undefined
19
  );
20
+ const [formattedBody, setFormattedBody] = useState<Options>();
21
+
22
  const { loading, submit, data } = useRequest(
23
+ endpoint.method.toLocaleLowerCase() as
24
+ | "post"
25
+ | "put"
26
+ | "patch"
27
+ | "delete"
28
+ | "get",
29
  formattedEndpoint,
30
+ formattedParameters,
31
+ formattedBody
32
  );
33
 
34
  useMount(() => {
 
47
  <div className="h-full grid grid-cols-1 xl:grid-cols-3">
48
  <Request
49
  parameters={formattedParameters}
50
+ body={endpoint?.body}
51
+ formattedBody={formattedBody}
52
+ onParamsChange={(k: string, v: string | boolean) => {
53
  setFormattedParameters({
54
  ...formattedParameters,
55
  [k]: v,
56
  });
57
  }}
58
+ onBodyChange={(b: Options) => setFormattedBody(b)}
59
  >
60
  <Endpoint endpoint={endpoint} onChange={setFormattedEndpoint}>
61
  <button
components/editor/main/request.tsx CHANGED
@@ -1,21 +1,36 @@
1
  "use client";
 
 
 
2
  import { Toggle } from "@/components/input/toggle";
3
  import { TextInput } from "@/components/input/input";
4
  import { usePersistentState } from "@/utils/usePersistentState";
 
 
5
 
6
  export const Request = ({
7
  parameters,
 
 
 
8
  children,
9
- onChange,
10
  }: {
11
  parameters: any;
12
  children: React.ReactElement;
13
- onChange: (key: string, value: string | boolean) => void;
 
 
 
14
  }) => {
15
  const [headers, setHeaders] = usePersistentState("headers", {
16
  Authorization: "hf_api_key",
17
  });
18
 
 
 
 
 
19
  return (
20
  <div className="h-full bg-slate-900 px-4 xl:px-6 py-5">
21
  {children}
@@ -35,7 +50,7 @@ export const Request = ({
35
  <Toggle
36
  checked={value}
37
  label={key}
38
- onChange={(e) => onChange(key, e)}
39
  />
40
  </div>
41
  ) : (
@@ -43,7 +58,42 @@ export const Request = ({
43
  value={value as string}
44
  label={key}
45
  placeholder="value"
46
- onChange={(e) => onChange(key, e)}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  />
48
  )}
49
  </div>
 
1
  "use client";
2
+ import { useState } from "react";
3
+ import { Options } from "redaxios";
4
+
5
  import { Toggle } from "@/components/input/toggle";
6
  import { TextInput } from "@/components/input/input";
7
  import { usePersistentState } from "@/utils/usePersistentState";
8
+ import { Body } from "@/utils/type";
9
+ import { useUpdateEffect } from "react-use";
10
 
11
  export const Request = ({
12
  parameters,
13
+ body,
14
+ formattedBody,
15
+ onBodyChange,
16
  children,
17
+ onParamsChange,
18
  }: {
19
  parameters: any;
20
  children: React.ReactElement;
21
+ body: Array<Body> | undefined;
22
+ formattedBody: Options | undefined;
23
+ onBodyChange: (o: Options) => void;
24
+ onParamsChange: (key: string, value: string | boolean) => void;
25
  }) => {
26
  const [headers, setHeaders] = usePersistentState("headers", {
27
  Authorization: "hf_api_key",
28
  });
29
 
30
+ const [bodyForm, setBodyForm] = useState<Options>({});
31
+
32
+ useUpdateEffect(() => onBodyChange(bodyForm), [bodyForm]);
33
+
34
  return (
35
  <div className="h-full bg-slate-900 px-4 xl:px-6 py-5">
36
  {children}
 
50
  <Toggle
51
  checked={value}
52
  label={key}
53
+ onChange={(e) => onParamsChange(key, e)}
54
  />
55
  </div>
56
  ) : (
 
58
  value={value as string}
59
  label={key}
60
  placeholder="value"
61
+ onChange={(e) => onParamsChange(key, e)}
62
+ />
63
+ )}
64
+ </div>
65
+ ))}
66
+ </div>
67
+ )}
68
+ {body?.length && (
69
+ <div className="mt-6 grid grid-cols-2 gap-6 w-full">
70
+ <p className="text-slate-200 uppercase text-xs font-semibold col-span-2">
71
+ Body
72
+ </p>
73
+ {body?.length &&
74
+ body.map((b, key) => (
75
+ <div
76
+ key={key}
77
+ className="flex items-center justify-between gap-2"
78
+ >
79
+ {typeof b.defaultValue === "boolean" ? (
80
+ <div>
81
+ <Toggle
82
+ checked={b.defaultValue}
83
+ label={b.key}
84
+ onChange={(e) => setBodyForm({ ...bodyForm, [b.key]: e })}
85
+ />
86
+ </div>
87
+ ) : (
88
+ <TextInput
89
+ value={
90
+ (formattedBody?.[
91
+ b.key as keyof typeof formattedBody
92
+ ] as string) ?? (b.defaultValue as string)
93
+ }
94
+ label={b.key}
95
+ placeholder="value"
96
+ onChange={(e) => setBodyForm({ ...bodyForm, [b.key]: e })}
97
  />
98
  )}
99
  </div>
utils/datas/api_collections.ts CHANGED
@@ -70,22 +70,46 @@ export const API_COLLECTIONS: Array<ApiCollection> = [{
70
  path: '/api/metrics'
71
  }],
72
  },
73
- // {
74
- // key: 'repo',
75
- // endpoints: [{
76
- // method: 'POST',
77
- // path: '/api/repos/create',
78
- // }, {
79
- // method: 'DELETE',
80
- // path: '/api/repos/delete'
81
- // }, {
82
- // method: 'PUT',
83
- // path: '/api/repos/{repo_type}/{repo_id}/settings'
84
- // }, {
85
- // method: 'POST',
86
- // path: '/api/repos/move'
87
- // }],
88
- // },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
  {
90
  key: 'user',
91
  endpoints: [{
 
70
  path: '/api/metrics'
71
  }],
72
  },
73
+ {
74
+ key: 'repo',
75
+ endpoints: [{
76
+ method: 'POST',
77
+ path: '/api/repos/create',
78
+ body: [
79
+ {
80
+ label: "Type of repo (dataset or space; model by default)",
81
+ defaultValue: "model",
82
+ key: "type",
83
+ required: true,
84
+ },
85
+ {
86
+ label: "Name of repo",
87
+ key: "name",
88
+ required: true,
89
+ },
90
+ {
91
+ label: "Name of organization (optional)",
92
+ required: true,
93
+ key: "organization",
94
+ },
95
+ {
96
+ label: "Whether the repo is private",
97
+ required: true,
98
+ key: "private",
99
+ defaultValue: false,
100
+ },
101
+ ]
102
+ }, {
103
+ method: 'DELETE',
104
+ path: '/api/repos/delete'
105
+ }, {
106
+ method: 'PUT',
107
+ path: '/api/repos/{repo_type}/{repo_id}/settings'
108
+ }, {
109
+ method: 'POST',
110
+ path: '/api/repos/move'
111
+ }],
112
+ },
113
  {
114
  key: 'user',
115
  endpoints: [{
utils/type.ts CHANGED
@@ -6,5 +6,13 @@ export interface ApiCollection {
6
  export interface ApiRoute {
7
  method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'
8
  path: string,
9
- parameters?: any
 
 
 
 
 
 
 
 
10
  }
 
6
  export interface ApiRoute {
7
  method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'
8
  path: string,
9
+ parameters?: any,
10
+ body?: Array<Body>
11
+ }
12
+
13
+ export interface Body {
14
+ key: string
15
+ label: string
16
+ required?: boolean
17
+ defaultValue?: any
18
  }