|
3 | 3 | import { Label } from "@/components/ui/label"; |
4 | 4 | import { ScrollArea } from "@/components/ui/scroll-area"; |
5 | 5 | import type { UnkeyPermission } from "@unkey/rbac"; |
6 | | -import { Button, FormInput } from "@unkey/ui"; |
| 6 | +import { Button } from "@unkey/ui"; |
| 7 | +import { FormInput } from "@unkey/ui"; |
7 | 8 | import dynamic from "next/dynamic"; |
8 | 9 | import { PermissionBadgeList } from "./components/permission-badge-list"; |
9 | 10 | import { PermissionSheet } from "./components/permission-sheet"; |
@@ -72,101 +73,110 @@ export const RootKeyDialog = ({ |
72 | 73 | const removePermission = (permission: UnkeyPermission) => |
73 | 74 | handlePermissionChange(selectedPermissions.filter((p) => p !== permission)); |
74 | 75 |
|
75 | | - return ( |
| 76 | + const dialogContent = ( |
76 | 77 | <> |
77 | | - <DynamicDialogContainer |
78 | | - isOpen={isOpen} |
79 | | - onOpenChange={onOpenChange} |
80 | | - title={title} |
81 | | - contentClassName="p-0 mb-0 gap-0" |
82 | | - className="max-w-[460px]" |
83 | | - subTitle={subTitle} |
84 | | - footer={ |
85 | | - <div className="w-full flex flex-col gap-2 items-center justify-center"> |
| 78 | + <div className="flex flex-col p-6 gap-4"> |
| 79 | + <div className="flex flex-col"> |
| 80 | + <FormInput |
| 81 | + name="name" |
| 82 | + label={ROOT_KEY_MESSAGES.DESCRIPTIONS.KEY_NAME_LABEL} |
| 83 | + description={ROOT_KEY_MESSAGES.DESCRIPTIONS.KEY_NAME_DESCRIPTION} |
| 84 | + placeholder={ROOT_KEY_MESSAGES.PLACEHOLDERS.KEY_NAME} |
| 85 | + value={name} |
| 86 | + onChange={(e) => setName(e.target.value)} |
| 87 | + /> |
| 88 | + </div> |
| 89 | + <div className="flex flex-col gap-2 mr-0"> |
| 90 | + <Label className="text-[13px] font-regular text-gray-10"> |
| 91 | + {ROOT_KEY_MESSAGES.DESCRIPTIONS.PERMISSIONS} |
| 92 | + </Label> |
| 93 | + <PermissionSheet |
| 94 | + selectedPermissions={selectedPermissions} |
| 95 | + apis={allApis} |
| 96 | + onChange={handlePermissionChange} |
| 97 | + loadMore={fetchMoreApis} |
| 98 | + hasNextPage={hasNextPage} |
| 99 | + isFetchingNextPage={isFetchingNextPage} |
| 100 | + editMode={editMode} |
| 101 | + > |
86 | 102 | <Button |
87 | | - variant="primary" |
88 | | - size="xlg" |
89 | | - className="w-full rounded-lg" |
90 | | - disabled={!hasChanges || isMutating || !selectedPermissions.length} |
91 | | - onClick={handleCreateKey} |
92 | | - loading={isBusy} |
| 103 | + type="button" |
| 104 | + variant="outline" |
| 105 | + size="lg" |
| 106 | + className="rounded-lg font-light text-grayA-8 text-[13px] border border-gray-5 hover:border-gray-8 bg-gray-2 dark:bg-black focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-5 focus-visible:ring-offset-0" |
| 107 | + disabled={isBusy} |
93 | 108 | > |
94 | | - {editMode |
95 | | - ? ROOT_KEY_MESSAGES.UI.UPDATE_ROOT_KEY |
96 | | - : ROOT_KEY_MESSAGES.UI.CREATE_ROOT_KEY} |
| 109 | + {isBusy |
| 110 | + ? ROOT_KEY_MESSAGES.UI.LOADING |
| 111 | + : editMode |
| 112 | + ? ROOT_KEY_MESSAGES.UI.EDIT_PERMISSIONS |
| 113 | + : ROOT_KEY_MESSAGES.UI.SELECT_PERMISSIONS} |
97 | 114 | </Button> |
98 | | - <div className="text-gray-9 text-xs"> |
99 | | - {editMode |
100 | | - ? ROOT_KEY_MESSAGES.DESCRIPTIONS.IMMEDIATE_UPDATE |
101 | | - : ROOT_KEY_MESSAGES.DESCRIPTIONS.IMMEDIATE_CREATE} |
102 | | - </div> |
103 | | - </div> |
104 | | - } |
105 | | - > |
106 | | - <div className="flex flex-col p-6 gap-4"> |
107 | | - <div className="flex flex-col"> |
108 | | - <FormInput |
109 | | - name="name" |
110 | | - label={ROOT_KEY_MESSAGES.DESCRIPTIONS.KEY_NAME_LABEL} |
111 | | - description={ROOT_KEY_MESSAGES.DESCRIPTIONS.KEY_NAME_DESCRIPTION} |
112 | | - placeholder={ROOT_KEY_MESSAGES.PLACEHOLDERS.KEY_NAME} |
113 | | - value={name} |
114 | | - onChange={(e) => setName(e.target.value)} |
115 | | - /> |
116 | | - </div> |
117 | | - <div className="flex flex-col gap-2 mr-0"> |
118 | | - <Label className="text-[13px] font-regular text-gray-10"> |
119 | | - {ROOT_KEY_MESSAGES.DESCRIPTIONS.PERMISSIONS} |
120 | | - </Label> |
121 | | - <PermissionSheet |
122 | | - selectedPermissions={selectedPermissions} |
123 | | - apis={allApis} |
124 | | - onChange={handlePermissionChange} |
125 | | - loadMore={fetchMoreApis} |
126 | | - hasNextPage={hasNextPage} |
127 | | - isFetchingNextPage={isFetchingNextPage} |
128 | | - editMode={editMode} |
129 | | - > |
130 | | - <Button |
131 | | - type="button" |
132 | | - variant="outline" |
133 | | - size="lg" |
134 | | - className="rounded-lg font-light text-grayA-8 text-[13px] border border-gray-5 hover:border-gray-8 bg-gray-2 dark:bg-black focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-5 focus-visible:ring-offset-0" |
135 | | - disabled={isBusy} |
136 | | - > |
137 | | - {isBusy |
138 | | - ? ROOT_KEY_MESSAGES.UI.LOADING |
139 | | - : editMode |
140 | | - ? ROOT_KEY_MESSAGES.UI.EDIT_PERMISSIONS |
141 | | - : ROOT_KEY_MESSAGES.UI.SELECT_PERMISSIONS} |
142 | | - </Button> |
143 | | - </PermissionSheet> |
144 | | - </div> |
| 115 | + </PermissionSheet> |
145 | 116 | </div> |
146 | | - <ScrollArea className="w-full overflow-y-auto pt-0 mb-4"> |
147 | | - <div className="flex flex-col px-6 py-0 gap-3"> |
| 117 | + </div> |
| 118 | + <ScrollArea className="w-full overflow-y-auto pt-0 mb-4"> |
| 119 | + <div className="flex flex-col px-6 py-0 gap-3"> |
| 120 | + <PermissionBadgeList |
| 121 | + selectedPermissions={selectedPermissions} |
| 122 | + apiId={ROOT_KEY_CONSTANTS.WORKSPACE} |
| 123 | + title="Selected from" |
| 124 | + name="Workspace" |
| 125 | + expandCount={ROOT_KEY_CONSTANTS.EXPAND_COUNT} |
| 126 | + removePermission={removePermission} |
| 127 | + /> |
| 128 | + {allApis.map((api) => ( |
148 | 129 | <PermissionBadgeList |
| 130 | + key={api.id} |
149 | 131 | selectedPermissions={selectedPermissions} |
150 | | - apiId={ROOT_KEY_CONSTANTS.WORKSPACE} |
151 | | - title="Selected from" |
152 | | - name="Workspace" |
| 132 | + apiId={api.id} |
| 133 | + title="from" |
| 134 | + name={api.name} |
153 | 135 | expandCount={ROOT_KEY_CONSTANTS.EXPAND_COUNT} |
154 | 136 | removePermission={removePermission} |
155 | 137 | /> |
156 | | - {allApis.map((api) => ( |
157 | | - <PermissionBadgeList |
158 | | - key={api.id} |
159 | | - selectedPermissions={selectedPermissions} |
160 | | - apiId={api.id} |
161 | | - title="from" |
162 | | - name={api.name} |
163 | | - expandCount={ROOT_KEY_CONSTANTS.EXPAND_COUNT} |
164 | | - removePermission={removePermission} |
165 | | - /> |
166 | | - ))} |
167 | | - </div> |
168 | | - </ScrollArea> |
169 | | - </DynamicDialogContainer> |
| 138 | + ))} |
| 139 | + </div> |
| 140 | + </ScrollArea> |
| 141 | + </> |
| 142 | + ); |
| 143 | + |
| 144 | + const footerContent = ( |
| 145 | + <div className="w-full flex flex-col gap-2 items-center justify-center"> |
| 146 | + <Button |
| 147 | + variant="primary" |
| 148 | + size="xlg" |
| 149 | + className="w-full rounded-lg" |
| 150 | + disabled={!hasChanges || isMutating || !selectedPermissions.length} |
| 151 | + onClick={handleCreateKey} |
| 152 | + loading={isBusy} |
| 153 | + > |
| 154 | + {editMode ? ROOT_KEY_MESSAGES.UI.UPDATE_ROOT_KEY : ROOT_KEY_MESSAGES.UI.CREATE_ROOT_KEY} |
| 155 | + </Button> |
| 156 | + <div className="text-gray-9 text-xs"> |
| 157 | + {editMode |
| 158 | + ? ROOT_KEY_MESSAGES.DESCRIPTIONS.IMMEDIATE_UPDATE |
| 159 | + : ROOT_KEY_MESSAGES.DESCRIPTIONS.IMMEDIATE_CREATE} |
| 160 | + </div> |
| 161 | + </div> |
| 162 | + ); |
| 163 | + |
| 164 | + return ( |
| 165 | + <> |
| 166 | + {/* Only show creation dialog if no key has been created yet */} |
| 167 | + {!key.data?.key && ( |
| 168 | + <DynamicDialogContainer |
| 169 | + isOpen={isOpen} |
| 170 | + onOpenChange={onOpenChange} |
| 171 | + title={title} |
| 172 | + contentClassName="p-0 mb-0 gap-0" |
| 173 | + className="max-w-[460px]" |
| 174 | + subTitle={subTitle} |
| 175 | + footer={footerContent} |
| 176 | + > |
| 177 | + {dialogContent} |
| 178 | + </DynamicDialogContainer> |
| 179 | + )} |
170 | 180 | <RootKeySuccess keyValue={key.data?.key} onClose={handleClose} /> |
171 | 181 | </> |
172 | 182 | ); |
|
0 commit comments