1
- import { Spinner } from "@/components/ui/Spinner/Spinner" ;
2
- import { Button } from "@/components/ui/button" ;
3
- import {
4
- Form ,
5
- FormControl ,
6
- FormDescription ,
7
- FormField ,
8
- FormItem ,
9
- FormLabel ,
10
- FormMessage ,
11
- } from "@/components/ui/form" ;
12
- import { Input } from "@/components/ui/input" ;
13
- import { cn } from "@/lib/utils" ;
14
- import { zodResolver } from "@hookform/resolvers/zod" ;
15
- import { useForm } from "react-hook-form" ;
16
1
import { toast } from "sonner" ;
17
- import type { z } from "zod" ;
18
- import type { Ecosystem } from "../../../../../types" ;
19
- import { partnerFormSchema } from "../../constants" ;
2
+ import type { Ecosystem , Partner } from "../../../../../types" ;
20
3
import { useAddPartner } from "../../hooks/use-add-partner" ;
4
+ import { PartnerForm , type PartnerFormValues } from "./partner-form.client" ;
21
5
22
6
export function AddPartnerForm ( {
23
7
ecosystem,
24
8
onPartnerAdded,
25
9
authToken,
26
- } : { authToken : string ; ecosystem : Ecosystem ; onPartnerAdded : ( ) => void } ) {
27
- const form = useForm < z . input < typeof partnerFormSchema > > ( {
28
- resolver : zodResolver ( partnerFormSchema ) ,
29
- } ) ;
30
-
10
+ } : {
11
+ authToken : string ;
12
+ ecosystem : Ecosystem ;
13
+ onPartnerAdded : ( ) => void ;
14
+ } ) {
31
15
const { mutateAsync : addPartner , isPending } = useAddPartner (
32
16
{
33
17
authToken,
@@ -46,95 +30,28 @@ export function AddPartnerForm({
46
30
} ,
47
31
) ;
48
32
49
- return (
50
- < Form { ...form } >
51
- < form
52
- onSubmit = { form . handleSubmit ( ( values ) => {
53
- addPartner ( {
54
- ecosystem,
55
- name : values . name ,
56
- allowlistedDomains : values . domains
57
- . split ( / , | / )
58
- . filter ( ( d ) => d . length > 0 ) ,
59
- allowlistedBundleIds : values . bundleIds
60
- . split ( / , | / )
61
- . filter ( ( d ) => d . length > 0 ) ,
62
- } ) ;
63
- } ) }
64
- className = "flex flex-col gap-6"
65
- >
66
- < div className = "flex flex-col gap-4" >
67
- < FormField
68
- control = { form . control }
69
- name = "name"
70
- defaultValue = "" // Note: you *must* provide a default value here or the field won't reset
71
- render = { ( { field } ) => (
72
- < FormItem >
73
- < FormLabel > App Name </ FormLabel >
74
- < FormControl >
75
- < Input
76
- placeholder = "App name"
77
- { ...field }
78
- value = { field . value }
79
- />
80
- </ FormControl >
81
- < FormDescription
82
- className = { cn (
83
- "text-xs transition-all" ,
84
- form . formState . errors . name ?. message
85
- ? "block translate-y-0 text-destructive opacity-100"
86
- : "lg:-translate-y-4 hidden opacity-0" ,
87
- ) }
88
- >
89
- { form . formState . errors . name ?. message }
90
- </ FormDescription >
91
- </ FormItem >
92
- ) }
93
- />
94
- < FormField
95
- control = { form . control }
96
- name = "domains"
97
- defaultValue = "" // Note: you *must* provide a default value here or the field won't reset
98
- render = { ( { field } ) => (
99
- < FormItem >
100
- < FormLabel > Domains </ FormLabel >
101
- < FormControl >
102
- < Input placeholder = "Domains" className = "peer" { ...field } />
103
- </ FormControl >
104
-
105
- < FormDescription >
106
- Space or comma-separated list of regex domains (e.g.
107
- *.example.com)
108
- </ FormDescription >
109
- </ FormItem >
110
- ) }
111
- />
112
- < FormField
113
- control = { form . control }
114
- name = "bundleIds"
115
- defaultValue = "" // Note: you *must* provide a default value here or the field won't reset
116
- render = { ( { field } ) => (
117
- < FormItem >
118
- < FormLabel > Bundle ID </ FormLabel >
119
- < FormControl >
120
- < Input placeholder = "Bundle ID" className = "peer" { ...field } />
121
- </ FormControl >
33
+ const handleSubmit = (
34
+ values : PartnerFormValues ,
35
+ finalAccessControl : Partner [ "accessControl" ] | null ,
36
+ ) => {
37
+ addPartner ( {
38
+ ecosystem,
39
+ name : values . name ,
40
+ allowlistedDomains : values . domains
41
+ . split ( / , | / )
42
+ . filter ( ( d ) => d . length > 0 ) ,
43
+ allowlistedBundleIds : values . bundleIds
44
+ . split ( / , | / )
45
+ . filter ( ( d ) => d . length > 0 ) ,
46
+ accessControl : finalAccessControl ,
47
+ } ) ;
48
+ } ;
122
49
123
- < FormDescription >
124
- Space or comma-separated list of bundle IDs
125
- </ FormDescription >
126
-
127
- < FormMessage />
128
- </ FormItem >
129
- ) }
130
- />
131
- </ div >
132
-
133
- < Button disabled = { isPending } type = "submit" className = "w-full gap-2" >
134
- { isPending && < Spinner className = "size-4" /> }
135
- Add
136
- </ Button >
137
- </ form >
138
- </ Form >
50
+ return (
51
+ < PartnerForm
52
+ onSubmit = { handleSubmit }
53
+ isSubmitting = { isPending }
54
+ submitLabel = "Add"
55
+ />
139
56
) ;
140
57
}
0 commit comments