@shipfox/client-runners 5.0.0 → 6.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +49 -0
- package/dist/components/create-manual-registration-token-form.d.ts +3 -3
- package/dist/components/create-manual-registration-token-form.d.ts.map +1 -1
- package/dist/components/create-manual-registration-token-form.js +8 -23
- package/dist/components/create-manual-registration-token-form.js.map +1 -1
- package/dist/components/create-provisioner-token-form.d.ts +3 -3
- package/dist/components/create-provisioner-token-form.d.ts.map +1 -1
- package/dist/components/create-provisioner-token-form.js +8 -23
- package/dist/components/create-provisioner-token-form.js.map +1 -1
- package/dist/components/manual-registration-token-errors.d.ts.map +1 -1
- package/dist/components/manual-registration-token-errors.js +0 -1
- package/dist/components/manual-registration-token-errors.js.map +1 -1
- package/dist/components/manual-registration-token-format.d.ts +0 -2
- package/dist/components/manual-registration-token-format.d.ts.map +1 -1
- package/dist/components/manual-registration-token-format.js +0 -3
- package/dist/components/manual-registration-token-format.js.map +1 -1
- package/dist/components/manual-registration-token-list.d.ts +2 -2
- package/dist/components/manual-registration-token-list.d.ts.map +1 -1
- package/dist/components/manual-registration-token-list.js +12 -19
- package/dist/components/manual-registration-token-list.js.map +1 -1
- package/dist/components/manual-registration-tokens-settings-section.d.ts.map +1 -1
- package/dist/components/manual-registration-tokens-settings-section.js +1 -1
- package/dist/components/manual-registration-tokens-settings-section.js.map +1 -1
- package/dist/components/provisioner-token-errors.d.ts.map +1 -1
- package/dist/components/provisioner-token-errors.js +0 -1
- package/dist/components/provisioner-token-errors.js.map +1 -1
- package/dist/components/provisioner-token-format.d.ts +0 -18
- package/dist/components/provisioner-token-format.d.ts.map +1 -1
- package/dist/components/provisioner-token-format.js +0 -25
- package/dist/components/provisioner-token-format.js.map +1 -1
- package/dist/components/provisioner-token-list.d.ts +2 -2
- package/dist/components/provisioner-token-list.d.ts.map +1 -1
- package/dist/components/provisioner-token-list.js +9 -19
- package/dist/components/provisioner-token-list.js.map +1 -1
- package/dist/components/provisioner-tokens-settings-section.js +2 -2
- package/dist/components/provisioner-tokens-settings-section.js.map +1 -1
- package/dist/components/token-expiration-select.d.ts +7 -0
- package/dist/components/token-expiration-select.d.ts.map +1 -1
- package/dist/components/token-expiration-select.js +8 -0
- package/dist/components/token-expiration-select.js.map +1 -1
- package/dist/components/token-settings-sections.stories.d.ts.map +1 -1
- package/dist/components/token-settings-sections.stories.js +66 -23
- package/dist/components/token-settings-sections.stories.js.map +1 -1
- package/dist/core/token.d.ts +66 -0
- package/dist/core/token.d.ts.map +1 -0
- package/dist/core/token.js +37 -0
- package/dist/core/token.js.map +1 -0
- package/dist/feature.d.ts +13 -0
- package/dist/feature.d.ts.map +1 -1
- package/dist/feature.js +17 -16
- package/dist/feature.js.map +1 -1
- package/dist/hooks/api/manual-registration-tokens.d.ts +13 -71
- package/dist/hooks/api/manual-registration-tokens.d.ts.map +1 -1
- package/dist/hooks/api/manual-registration-tokens.js +40 -19
- package/dist/hooks/api/manual-registration-tokens.js.map +1 -1
- package/dist/hooks/api/provisioner-tokens.d.ts +17 -115
- package/dist/hooks/api/provisioner-tokens.d.ts.map +1 -1
- package/dist/hooks/api/provisioner-tokens.js +59 -32
- package/dist/hooks/api/provisioner-tokens.js.map +1 -1
- package/dist/hooks/api/token-mapper.d.ts +12 -0
- package/dist/hooks/api/token-mapper.d.ts.map +1 -0
- package/dist/hooks/api/token-mapper.js +61 -0
- package/dist/hooks/api/token-mapper.js.map +1 -0
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +9 -9
- package/src/components/create-manual-registration-token-form.tsx +11 -21
- package/src/components/create-provisioner-token-form.tsx +11 -21
- package/src/components/form-errors.test.ts +2 -2
- package/src/components/manual-registration-token-errors.ts +0 -1
- package/src/components/manual-registration-token-format.test.ts +4 -4
- package/src/components/manual-registration-token-format.ts +0 -7
- package/src/components/manual-registration-token-list.tsx +13 -22
- package/src/components/manual-registration-tokens-settings-section.tsx +3 -5
- package/src/components/provisioner-token-errors.ts +0 -1
- package/src/components/provisioner-token-form-errors.test.ts +2 -2
- package/src/components/provisioner-token-format.test.ts +15 -14
- package/src/components/provisioner-token-format.ts +0 -29
- package/src/components/provisioner-token-list.tsx +14 -23
- package/src/components/provisioner-tokens-settings-section.tsx +4 -4
- package/src/components/token-expiration-select.test.ts +15 -0
- package/src/components/token-expiration-select.tsx +6 -0
- package/src/components/token-settings-sections.stories.tsx +72 -23
- package/src/core/token.test.ts +30 -0
- package/src/core/token.ts +83 -0
- package/src/feature.ts +19 -17
- package/src/hooks/api/manual-registration-tokens.test.ts +8 -5
- package/src/hooks/api/manual-registration-tokens.ts +71 -24
- package/src/hooks/api/provisioner-tokens.test.ts +10 -7
- package/src/hooks/api/provisioner-tokens.ts +100 -36
- package/src/hooks/api/token-mapper.test.ts +161 -0
- package/src/hooks/api/token-mapper.ts +79 -0
- package/tsconfig.build.tsbuildinfo +1 -1
- package/vercel.json +5 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
$ shipfox-swc
|
|
2
|
-
Successfully compiled:
|
|
2
|
+
Successfully compiled: 24 files with swc (405.43ms)
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,54 @@
|
|
|
1
1
|
# @shipfox/client-runners
|
|
2
2
|
|
|
3
|
+
## 6.0.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [4b85404]
|
|
8
|
+
- Updated dependencies [102c5f4]
|
|
9
|
+
- @shipfox/api-runners-dto@9.0.2
|
|
10
|
+
- @shipfox/react-ui@0.3.7
|
|
11
|
+
- @shipfox/client-ui@6.0.2
|
|
12
|
+
- @shipfox/client-shell@6.0.2
|
|
13
|
+
|
|
14
|
+
## 6.0.1
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- 475ce59: Republishes all public packages after restoring release authorization.
|
|
19
|
+
- Updated dependencies [475ce59]
|
|
20
|
+
- Updated dependencies [3f8f1cb]
|
|
21
|
+
- @shipfox/api-runners-dto@9.0.1
|
|
22
|
+
- @shipfox/client-api@6.0.1
|
|
23
|
+
- @shipfox/client-shell@6.0.1
|
|
24
|
+
- @shipfox/client-ui@6.0.1
|
|
25
|
+
- @shipfox/react-ui@0.3.6
|
|
26
|
+
|
|
27
|
+
## 6.0.0
|
|
28
|
+
|
|
29
|
+
### Major Changes
|
|
30
|
+
|
|
31
|
+
- 32d4392: Converges manual-registration-token and provisioner-token client state on package-owned camelCase models validated at the transport boundary, replacing raw wire DTOs in the public hooks and mutation signatures.
|
|
32
|
+
|
|
33
|
+
### Minor Changes
|
|
34
|
+
|
|
35
|
+
- 401b583: Exposes typed feature-owned navigation and settings contributions and enforces coordinator-owned client composition.
|
|
36
|
+
|
|
37
|
+
### Patch Changes
|
|
38
|
+
|
|
39
|
+
- Updated dependencies [401b583]
|
|
40
|
+
- Updated dependencies [82eda45]
|
|
41
|
+
- Updated dependencies [cd90c19]
|
|
42
|
+
- Updated dependencies [24be269]
|
|
43
|
+
- Updated dependencies [c56c124]
|
|
44
|
+
- Updated dependencies [4a6d124]
|
|
45
|
+
- Updated dependencies [c02ac42]
|
|
46
|
+
- @shipfox/client-shell@6.0.0
|
|
47
|
+
- @shipfox/client-api@6.0.0
|
|
48
|
+
- @shipfox/api-runners-dto@7.0.1
|
|
49
|
+
- @shipfox/client-ui@6.0.0
|
|
50
|
+
- @shipfox/react-ui@0.3.5
|
|
51
|
+
|
|
3
52
|
## 5.0.0
|
|
4
53
|
|
|
5
54
|
### Patch Changes
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CreatedManualRegistrationToken } from '#core/token.js';
|
|
2
2
|
export declare const CREATE_MANUAL_REGISTRATION_TOKEN_FORM_ID = "create-manual-registration-token-form";
|
|
3
3
|
export declare function CreateManualRegistrationTokenForm({ workspaceId, onCreated, }: {
|
|
4
4
|
workspaceId: string;
|
|
5
|
-
onCreated: (token:
|
|
5
|
+
onCreated: (token: CreatedManualRegistrationToken) => void;
|
|
6
6
|
}): import("react").JSX.Element;
|
|
7
7
|
export declare function CreatedManualRegistrationTokenPanel({ token, }: {
|
|
8
|
-
token:
|
|
8
|
+
token: CreatedManualRegistrationToken;
|
|
9
9
|
}): import("react").JSX.Element;
|
|
10
10
|
//# sourceMappingURL=create-manual-registration-token-form.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-manual-registration-token-form.d.ts","sourceRoot":"","sources":["../../src/components/create-manual-registration-token-form.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-manual-registration-token-form.d.ts","sourceRoot":"","sources":["../../src/components/create-manual-registration-token-form.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAC,8BAA8B,EAAC,MAAM,gBAAgB,CAAC;AAWnE,eAAO,MAAM,wCAAwC,0CAA0C,CAAC;AAEhG,wBAAgB,iCAAiC,CAAC,EAChD,WAAW,EACX,SAAS,GACV,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,CAAC,KAAK,EAAE,8BAA8B,KAAK,IAAI,CAAC;CAC5D,+BAwGA;AAED,wBAAgB,mCAAmC,CAAC,EAClD,KAAK,GACN,EAAE;IACD,KAAK,EAAE,8BAA8B,CAAC;CACvC,+BAiDA"}
|
|
@@ -6,15 +6,14 @@ import { useCopyToClipboard } from '@shipfox/react-ui/hooks';
|
|
|
6
6
|
import { ModalBody, ModalFooter } from '@shipfox/react-ui/modal';
|
|
7
7
|
import { Code, Text } from '@shipfox/react-ui/typography';
|
|
8
8
|
import { useForm } from '@tanstack/react-form';
|
|
9
|
-
import { useQueryClient } from '@tanstack/react-query';
|
|
10
9
|
import { useState } from 'react';
|
|
11
|
-
import {
|
|
10
|
+
import { createTokenCommand } from '#core/token.js';
|
|
11
|
+
import { useCreateManualRegistrationTokenMutation } from '#hooks/api/manual-registration-tokens.js';
|
|
12
12
|
import { manualRegistrationTokenCreateErrorToFormError } from './form-errors.js';
|
|
13
|
-
import { ExpirationSelect, expirationHint } from './token-expiration-select.js';
|
|
13
|
+
import { ExpirationSelect, expirationCommand, expirationHint } from './token-expiration-select.js';
|
|
14
14
|
export const CREATE_MANUAL_REGISTRATION_TOKEN_FORM_ID = 'create-manual-registration-token-form';
|
|
15
15
|
export function CreateManualRegistrationTokenForm({ workspaceId, onCreated }) {
|
|
16
|
-
const
|
|
17
|
-
const createToken = useCreateManualRegistrationTokenMutation();
|
|
16
|
+
const createToken = useCreateManualRegistrationTokenMutation(workspaceId);
|
|
18
17
|
const [formError, setFormError] = useState();
|
|
19
18
|
const form = useForm({
|
|
20
19
|
defaultValues: {
|
|
@@ -23,23 +22,9 @@ export function CreateManualRegistrationTokenForm({ workspaceId, onCreated }) {
|
|
|
23
22
|
},
|
|
24
23
|
onSubmit: async ({ value })=>{
|
|
25
24
|
setFormError(undefined);
|
|
26
|
-
const
|
|
27
|
-
const body = {
|
|
28
|
-
...trimmedName ? {
|
|
29
|
-
name: trimmedName
|
|
30
|
-
} : {},
|
|
31
|
-
...value.expiration === 'never' ? {} : {
|
|
32
|
-
ttl_seconds: Number(value.expiration)
|
|
33
|
-
}
|
|
34
|
-
};
|
|
25
|
+
const command = createTokenCommand(value.name, expirationCommand(value.expiration));
|
|
35
26
|
try {
|
|
36
|
-
const token = await createToken.mutateAsync(
|
|
37
|
-
workspaceId,
|
|
38
|
-
body
|
|
39
|
-
});
|
|
40
|
-
await queryClient.invalidateQueries({
|
|
41
|
-
queryKey: manualRegistrationTokenQueryKeys.list(workspaceId)
|
|
42
|
-
});
|
|
27
|
+
const token = await createToken.mutateAsync(command);
|
|
43
28
|
onCreated(token);
|
|
44
29
|
} catch (error) {
|
|
45
30
|
const mapped = manualRegistrationTokenCreateErrorToFormError(error);
|
|
@@ -143,7 +128,7 @@ export function CreateManualRegistrationTokenForm({ workspaceId, onCreated }) {
|
|
|
143
128
|
export function CreatedManualRegistrationTokenPanel({ token }) {
|
|
144
129
|
const [copyState, setCopyState] = useState('idle');
|
|
145
130
|
const { copy } = useCopyToClipboard({
|
|
146
|
-
text: token.
|
|
131
|
+
text: token.token,
|
|
147
132
|
onCopy: ()=>{
|
|
148
133
|
setCopyState('copied');
|
|
149
134
|
window.setTimeout(()=>setCopyState('idle'), 1500);
|
|
@@ -182,7 +167,7 @@ export function CreatedManualRegistrationTokenPanel({ token }) {
|
|
|
182
167
|
/*#__PURE__*/ _jsx(Code, {
|
|
183
168
|
variant: "paragraph",
|
|
184
169
|
className: "min-w-0 flex-1 break-all",
|
|
185
|
-
children: token.
|
|
170
|
+
children: token.token
|
|
186
171
|
}),
|
|
187
172
|
/*#__PURE__*/ _jsx(Button, {
|
|
188
173
|
size: "sm",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/create-manual-registration-token-form.tsx"],"sourcesContent":["import type {CreateManualRegistrationTokenResponseDto} from '@shipfox/api-runners-dto';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout, CalloutContent, CalloutDescription, CalloutTitle} from '@shipfox/react-ui/callout';\nimport {FormField, FormFieldInput, fieldError} from '@shipfox/react-ui/form-field';\nimport {useCopyToClipboard} from '@shipfox/react-ui/hooks';\nimport {ModalBody, ModalFooter} from '@shipfox/react-ui/modal';\nimport {Code, Text} from '@shipfox/react-ui/typography';\nimport {useForm} from '@tanstack/react-form';\nimport {useQueryClient} from '@tanstack/react-query';\nimport {useState} from 'react';\nimport {\n manualRegistrationTokenQueryKeys,\n useCreateManualRegistrationTokenMutation,\n} from '#hooks/api/manual-registration-tokens.js';\nimport {manualRegistrationTokenCreateErrorToFormError} from './form-errors.js';\nimport {\n ExpirationSelect,\n expirationHint,\n type TokenExpirationOption,\n} from './token-expiration-select.js';\n\nexport const CREATE_MANUAL_REGISTRATION_TOKEN_FORM_ID = 'create-manual-registration-token-form';\n\nexport function CreateManualRegistrationTokenForm({\n workspaceId,\n onCreated,\n}: {\n workspaceId: string;\n onCreated: (token: CreateManualRegistrationTokenResponseDto) => void;\n}) {\n const queryClient = useQueryClient();\n const createToken = useCreateManualRegistrationTokenMutation();\n const [formError, setFormError] = useState<string | undefined>();\n\n const form = useForm({\n defaultValues: {name: '', expiration: '86400' as TokenExpirationOption},\n onSubmit: async ({value}) => {\n setFormError(undefined);\n const trimmedName = value.name.trim();\n const body = {\n ...(trimmedName ? {name: trimmedName} : {}),\n ...(value.expiration === 'never' ? {} : {ttl_seconds: Number(value.expiration)}),\n };\n\n try {\n const token = await createToken.mutateAsync({workspaceId, body});\n await queryClient.invalidateQueries({\n queryKey: manualRegistrationTokenQueryKeys.list(workspaceId),\n });\n onCreated(token);\n } catch (error) {\n const mapped = manualRegistrationTokenCreateErrorToFormError(error);\n setFormError(mapped.message);\n }\n },\n });\n\n return (\n <>\n <ModalBody className=\"gap-16\">\n <form\n id={CREATE_MANUAL_REGISTRATION_TOKEN_FORM_ID}\n className=\"flex w-full flex-col gap-8\"\n noValidate\n onSubmit={(event) => {\n event.preventDefault();\n event.stopPropagation();\n void form.handleSubmit();\n }}\n >\n <div className=\"flex w-full items-end gap-16 max-[640px]:flex-col max-[640px]:items-stretch\">\n <form.Field\n name=\"name\"\n validators={{\n onBlur: ({value}) =>\n value.length <= 80 ? undefined : 'Token name must be 80 characters or fewer.',\n }}\n >\n {(field) => (\n <FormField\n className=\"flex-1\"\n label=\"Token name\"\n id=\"manual-registration-token-name\"\n error={fieldError(field)}\n >\n <FormFieldInput\n placeholder=\"Local runner\"\n maxLength={80}\n value={field.state.value}\n onChange={(event) => field.handleChange(event.target.value)}\n onBlur={field.handleBlur}\n />\n </FormField>\n )}\n </form.Field>\n <form.Field name=\"expiration\">\n {(field) => (\n <FormField\n className=\"flex-1\"\n label=\"Expires\"\n id=\"manual-registration-token-expiration\"\n error={fieldError(field)}\n >\n <ExpirationSelect\n value={field.state.value}\n onValueChange={(next) => field.handleChange(next)}\n />\n </FormField>\n )}\n </form.Field>\n </div>\n <form.Subscribe selector={(state) => state.values.expiration}>\n {(expiration) => (\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n {expirationHint(expiration)}\n </Text>\n )}\n </form.Subscribe>\n </form>\n {formError ? (\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex flex-col gap-8\">\n <Text size=\"sm\" bold>\n Could not create token\n </Text>\n <Text size=\"sm\">{formError}</Text>\n </div>\n </Callout>\n ) : null}\n </ModalBody>\n <ModalFooter>\n <Button\n type=\"submit\"\n form={CREATE_MANUAL_REGISTRATION_TOKEN_FORM_ID}\n isLoading={createToken.isPending}\n >\n Create token\n </Button>\n </ModalFooter>\n </>\n );\n}\n\nexport function CreatedManualRegistrationTokenPanel({\n token,\n}: {\n token: CreateManualRegistrationTokenResponseDto;\n}) {\n const [copyState, setCopyState] = useState<'idle' | 'copied' | 'failed'>('idle');\n const {copy} = useCopyToClipboard({\n text: token.raw_token,\n onCopy: () => {\n setCopyState('copied');\n window.setTimeout(() => setCopyState('idle'), 1500);\n },\n });\n\n async function handleCopy() {\n try {\n await copy();\n } catch {\n setCopyState('failed');\n window.setTimeout(() => setCopyState('idle'), 2500);\n }\n }\n\n return (\n <Callout type=\"success\" variant=\"secondary\" icon={null}>\n <CalloutContent className=\"flex flex-col gap-12\">\n <div className=\"flex flex-col gap-2\">\n <CalloutTitle className=\"mb-0\">Token created</CalloutTitle>\n <CalloutDescription>\n Copy this registration token now. It will not be shown again.\n </CalloutDescription>\n </div>\n <div className=\"flex items-center gap-8 max-[640px]:flex-col max-[640px]:items-stretch\">\n <Code variant=\"paragraph\" className=\"min-w-0 flex-1 break-all\">\n {token.raw_token}\n </Code>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n iconLeft=\"fileCopyLine\"\n onClick={() => void handleCopy()}\n >\n {copyState === 'copied' ? 'Copied' : 'Copy'}\n </Button>\n </div>\n {copyState === 'failed' ? (\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Copy failed: select and copy manually.\n </Text>\n ) : null}\n </CalloutContent>\n </Callout>\n );\n}\n"],"names":["Button","Callout","CalloutContent","CalloutDescription","CalloutTitle","FormField","FormFieldInput","fieldError","useCopyToClipboard","ModalBody","ModalFooter","Code","Text","useForm","useQueryClient","useState","manualRegistrationTokenQueryKeys","useCreateManualRegistrationTokenMutation","manualRegistrationTokenCreateErrorToFormError","ExpirationSelect","expirationHint","CREATE_MANUAL_REGISTRATION_TOKEN_FORM_ID","CreateManualRegistrationTokenForm","workspaceId","onCreated","queryClient","createToken","formError","setFormError","form","defaultValues","name","expiration","onSubmit","value","undefined","trimmedName","trim","body","ttl_seconds","Number","token","mutateAsync","invalidateQueries","queryKey","list","error","mapped","message","className","id","noValidate","event","preventDefault","stopPropagation","handleSubmit","div","Field","validators","onBlur","length","field","label","placeholder","maxLength","state","onChange","handleChange","target","handleBlur","onValueChange","next","Subscribe","selector","values","size","role","type","bold","isLoading","isPending","CreatedManualRegistrationTokenPanel","copyState","setCopyState","copy","text","raw_token","onCopy","window","setTimeout","handleCopy","variant","icon","iconLeft","onClick"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/components/create-manual-registration-token-form.tsx"],"sourcesContent":["import {Button} from '@shipfox/react-ui/button';\nimport {Callout, CalloutContent, CalloutDescription, CalloutTitle} from '@shipfox/react-ui/callout';\nimport {FormField, FormFieldInput, fieldError} from '@shipfox/react-ui/form-field';\nimport {useCopyToClipboard} from '@shipfox/react-ui/hooks';\nimport {ModalBody, ModalFooter} from '@shipfox/react-ui/modal';\nimport {Code, Text} from '@shipfox/react-ui/typography';\nimport {useForm} from '@tanstack/react-form';\nimport {useState} from 'react';\nimport type {CreatedManualRegistrationToken} from '#core/token.js';\nimport {createTokenCommand} from '#core/token.js';\nimport {useCreateManualRegistrationTokenMutation} from '#hooks/api/manual-registration-tokens.js';\nimport {manualRegistrationTokenCreateErrorToFormError} from './form-errors.js';\nimport {\n ExpirationSelect,\n expirationCommand,\n expirationHint,\n type TokenExpirationOption,\n} from './token-expiration-select.js';\n\nexport const CREATE_MANUAL_REGISTRATION_TOKEN_FORM_ID = 'create-manual-registration-token-form';\n\nexport function CreateManualRegistrationTokenForm({\n workspaceId,\n onCreated,\n}: {\n workspaceId: string;\n onCreated: (token: CreatedManualRegistrationToken) => void;\n}) {\n const createToken = useCreateManualRegistrationTokenMutation(workspaceId);\n const [formError, setFormError] = useState<string | undefined>();\n\n const form = useForm({\n defaultValues: {name: '', expiration: '86400' as TokenExpirationOption},\n onSubmit: async ({value}) => {\n setFormError(undefined);\n const command = createTokenCommand(value.name, expirationCommand(value.expiration));\n\n try {\n const token = await createToken.mutateAsync(command);\n onCreated(token);\n } catch (error) {\n const mapped = manualRegistrationTokenCreateErrorToFormError(error);\n setFormError(mapped.message);\n }\n },\n });\n\n return (\n <>\n <ModalBody className=\"gap-16\">\n <form\n id={CREATE_MANUAL_REGISTRATION_TOKEN_FORM_ID}\n className=\"flex w-full flex-col gap-8\"\n noValidate\n onSubmit={(event) => {\n event.preventDefault();\n event.stopPropagation();\n void form.handleSubmit();\n }}\n >\n <div className=\"flex w-full items-end gap-16 max-[640px]:flex-col max-[640px]:items-stretch\">\n <form.Field\n name=\"name\"\n validators={{\n onBlur: ({value}) =>\n value.length <= 80 ? undefined : 'Token name must be 80 characters or fewer.',\n }}\n >\n {(field) => (\n <FormField\n className=\"flex-1\"\n label=\"Token name\"\n id=\"manual-registration-token-name\"\n error={fieldError(field)}\n >\n <FormFieldInput\n placeholder=\"Local runner\"\n maxLength={80}\n value={field.state.value}\n onChange={(event) => field.handleChange(event.target.value)}\n onBlur={field.handleBlur}\n />\n </FormField>\n )}\n </form.Field>\n <form.Field name=\"expiration\">\n {(field) => (\n <FormField\n className=\"flex-1\"\n label=\"Expires\"\n id=\"manual-registration-token-expiration\"\n error={fieldError(field)}\n >\n <ExpirationSelect\n value={field.state.value}\n onValueChange={(next) => field.handleChange(next)}\n />\n </FormField>\n )}\n </form.Field>\n </div>\n <form.Subscribe selector={(state) => state.values.expiration}>\n {(expiration) => (\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n {expirationHint(expiration)}\n </Text>\n )}\n </form.Subscribe>\n </form>\n {formError ? (\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex flex-col gap-8\">\n <Text size=\"sm\" bold>\n Could not create token\n </Text>\n <Text size=\"sm\">{formError}</Text>\n </div>\n </Callout>\n ) : null}\n </ModalBody>\n <ModalFooter>\n <Button\n type=\"submit\"\n form={CREATE_MANUAL_REGISTRATION_TOKEN_FORM_ID}\n isLoading={createToken.isPending}\n >\n Create token\n </Button>\n </ModalFooter>\n </>\n );\n}\n\nexport function CreatedManualRegistrationTokenPanel({\n token,\n}: {\n token: CreatedManualRegistrationToken;\n}) {\n const [copyState, setCopyState] = useState<'idle' | 'copied' | 'failed'>('idle');\n const {copy} = useCopyToClipboard({\n text: token.token,\n onCopy: () => {\n setCopyState('copied');\n window.setTimeout(() => setCopyState('idle'), 1500);\n },\n });\n\n async function handleCopy() {\n try {\n await copy();\n } catch {\n setCopyState('failed');\n window.setTimeout(() => setCopyState('idle'), 2500);\n }\n }\n\n return (\n <Callout type=\"success\" variant=\"secondary\" icon={null}>\n <CalloutContent className=\"flex flex-col gap-12\">\n <div className=\"flex flex-col gap-2\">\n <CalloutTitle className=\"mb-0\">Token created</CalloutTitle>\n <CalloutDescription>\n Copy this registration token now. It will not be shown again.\n </CalloutDescription>\n </div>\n <div className=\"flex items-center gap-8 max-[640px]:flex-col max-[640px]:items-stretch\">\n <Code variant=\"paragraph\" className=\"min-w-0 flex-1 break-all\">\n {token.token}\n </Code>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n iconLeft=\"fileCopyLine\"\n onClick={() => void handleCopy()}\n >\n {copyState === 'copied' ? 'Copied' : 'Copy'}\n </Button>\n </div>\n {copyState === 'failed' ? (\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Copy failed: select and copy manually.\n </Text>\n ) : null}\n </CalloutContent>\n </Callout>\n );\n}\n"],"names":["Button","Callout","CalloutContent","CalloutDescription","CalloutTitle","FormField","FormFieldInput","fieldError","useCopyToClipboard","ModalBody","ModalFooter","Code","Text","useForm","useState","createTokenCommand","useCreateManualRegistrationTokenMutation","manualRegistrationTokenCreateErrorToFormError","ExpirationSelect","expirationCommand","expirationHint","CREATE_MANUAL_REGISTRATION_TOKEN_FORM_ID","CreateManualRegistrationTokenForm","workspaceId","onCreated","createToken","formError","setFormError","form","defaultValues","name","expiration","onSubmit","value","undefined","command","token","mutateAsync","error","mapped","message","className","id","noValidate","event","preventDefault","stopPropagation","handleSubmit","div","Field","validators","onBlur","length","field","label","placeholder","maxLength","state","onChange","handleChange","target","handleBlur","onValueChange","next","Subscribe","selector","values","size","role","type","bold","isLoading","isPending","CreatedManualRegistrationTokenPanel","copyState","setCopyState","copy","text","onCopy","window","setTimeout","handleCopy","variant","icon","iconLeft","onClick"],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CreatedProvisionerToken } from '#core/token.js';
|
|
2
2
|
export declare const CREATE_PROVISIONER_TOKEN_FORM_ID = "create-provisioner-token-form";
|
|
3
3
|
export declare function CreateProvisionerTokenForm({ workspaceId, onCreated, }: {
|
|
4
4
|
workspaceId: string;
|
|
5
|
-
onCreated: (token:
|
|
5
|
+
onCreated: (token: CreatedProvisionerToken) => void;
|
|
6
6
|
}): import("react").JSX.Element;
|
|
7
7
|
export declare function CreatedProvisionerTokenPanel({ token }: {
|
|
8
|
-
token:
|
|
8
|
+
token: CreatedProvisionerToken;
|
|
9
9
|
}): import("react").JSX.Element;
|
|
10
10
|
//# sourceMappingURL=create-provisioner-token-form.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-provisioner-token-form.d.ts","sourceRoot":"","sources":["../../src/components/create-provisioner-token-form.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-provisioner-token-form.d.ts","sourceRoot":"","sources":["../../src/components/create-provisioner-token-form.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,gBAAgB,CAAC;AAW5D,eAAO,MAAM,gCAAgC,kCAAkC,CAAC;AAEhF,wBAAgB,0BAA0B,CAAC,EACzC,WAAW,EACX,SAAS,GACV,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,CAAC;CACrD,+BAwGA;AAED,wBAAgB,4BAA4B,CAAC,EAAC,KAAK,EAAC,EAAE;IAAC,KAAK,EAAE,uBAAuB,CAAA;CAAC,+BAiDrF"}
|
|
@@ -6,15 +6,14 @@ import { useCopyToClipboard } from '@shipfox/react-ui/hooks';
|
|
|
6
6
|
import { ModalBody, ModalFooter } from '@shipfox/react-ui/modal';
|
|
7
7
|
import { Code, Text } from '@shipfox/react-ui/typography';
|
|
8
8
|
import { useForm } from '@tanstack/react-form';
|
|
9
|
-
import { useQueryClient } from '@tanstack/react-query';
|
|
10
9
|
import { useState } from 'react';
|
|
11
|
-
import {
|
|
10
|
+
import { createTokenCommand } from '#core/token.js';
|
|
11
|
+
import { useCreateProvisionerTokenMutation } from '#hooks/api/provisioner-tokens.js';
|
|
12
12
|
import { provisionerTokenCreateErrorToFormError } from './provisioner-token-form-errors.js';
|
|
13
|
-
import { ExpirationSelect, expirationHint } from './token-expiration-select.js';
|
|
13
|
+
import { ExpirationSelect, expirationCommand, expirationHint } from './token-expiration-select.js';
|
|
14
14
|
export const CREATE_PROVISIONER_TOKEN_FORM_ID = 'create-provisioner-token-form';
|
|
15
15
|
export function CreateProvisionerTokenForm({ workspaceId, onCreated }) {
|
|
16
|
-
const
|
|
17
|
-
const createToken = useCreateProvisionerTokenMutation();
|
|
16
|
+
const createToken = useCreateProvisionerTokenMutation(workspaceId);
|
|
18
17
|
const [formError, setFormError] = useState();
|
|
19
18
|
const form = useForm({
|
|
20
19
|
defaultValues: {
|
|
@@ -23,23 +22,9 @@ export function CreateProvisionerTokenForm({ workspaceId, onCreated }) {
|
|
|
23
22
|
},
|
|
24
23
|
onSubmit: async ({ value })=>{
|
|
25
24
|
setFormError(undefined);
|
|
26
|
-
const
|
|
27
|
-
const body = {
|
|
28
|
-
...trimmedName ? {
|
|
29
|
-
name: trimmedName
|
|
30
|
-
} : {},
|
|
31
|
-
...value.expiration === 'never' ? {} : {
|
|
32
|
-
ttl_seconds: Number(value.expiration)
|
|
33
|
-
}
|
|
34
|
-
};
|
|
25
|
+
const command = createTokenCommand(value.name, expirationCommand(value.expiration));
|
|
35
26
|
try {
|
|
36
|
-
const token = await createToken.mutateAsync(
|
|
37
|
-
workspaceId,
|
|
38
|
-
body
|
|
39
|
-
});
|
|
40
|
-
await queryClient.invalidateQueries({
|
|
41
|
-
queryKey: provisionerTokenQueryKeys.list(workspaceId)
|
|
42
|
-
});
|
|
27
|
+
const token = await createToken.mutateAsync(command);
|
|
43
28
|
onCreated(token);
|
|
44
29
|
} catch (error) {
|
|
45
30
|
const mapped = provisionerTokenCreateErrorToFormError(error);
|
|
@@ -143,7 +128,7 @@ export function CreateProvisionerTokenForm({ workspaceId, onCreated }) {
|
|
|
143
128
|
export function CreatedProvisionerTokenPanel({ token }) {
|
|
144
129
|
const [copyState, setCopyState] = useState('idle');
|
|
145
130
|
const { copy } = useCopyToClipboard({
|
|
146
|
-
text: token.
|
|
131
|
+
text: token.token,
|
|
147
132
|
onCopy: ()=>{
|
|
148
133
|
setCopyState('copied');
|
|
149
134
|
window.setTimeout(()=>setCopyState('idle'), 1500);
|
|
@@ -182,7 +167,7 @@ export function CreatedProvisionerTokenPanel({ token }) {
|
|
|
182
167
|
/*#__PURE__*/ _jsx(Code, {
|
|
183
168
|
variant: "paragraph",
|
|
184
169
|
className: "min-w-0 flex-1 break-all",
|
|
185
|
-
children: token.
|
|
170
|
+
children: token.token
|
|
186
171
|
}),
|
|
187
172
|
/*#__PURE__*/ _jsx(Button, {
|
|
188
173
|
size: "sm",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/create-provisioner-token-form.tsx"],"sourcesContent":["import type {CreateProvisionerTokenResponseDto} from '@shipfox/api-runners-dto';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout, CalloutContent, CalloutDescription, CalloutTitle} from '@shipfox/react-ui/callout';\nimport {FormField, FormFieldInput, fieldError} from '@shipfox/react-ui/form-field';\nimport {useCopyToClipboard} from '@shipfox/react-ui/hooks';\nimport {ModalBody, ModalFooter} from '@shipfox/react-ui/modal';\nimport {Code, Text} from '@shipfox/react-ui/typography';\nimport {useForm} from '@tanstack/react-form';\nimport {useQueryClient} from '@tanstack/react-query';\nimport {useState} from 'react';\nimport {\n provisionerTokenQueryKeys,\n useCreateProvisionerTokenMutation,\n} from '#hooks/api/provisioner-tokens.js';\nimport {provisionerTokenCreateErrorToFormError} from './provisioner-token-form-errors.js';\nimport {\n ExpirationSelect,\n expirationHint,\n type TokenExpirationOption,\n} from './token-expiration-select.js';\n\nexport const CREATE_PROVISIONER_TOKEN_FORM_ID = 'create-provisioner-token-form';\n\nexport function CreateProvisionerTokenForm({\n workspaceId,\n onCreated,\n}: {\n workspaceId: string;\n onCreated: (token: CreateProvisionerTokenResponseDto) => void;\n}) {\n const queryClient = useQueryClient();\n const createToken = useCreateProvisionerTokenMutation();\n const [formError, setFormError] = useState<string | undefined>();\n\n const form = useForm({\n defaultValues: {name: '', expiration: '86400' as TokenExpirationOption},\n onSubmit: async ({value}) => {\n setFormError(undefined);\n const trimmedName = value.name.trim();\n const body = {\n ...(trimmedName ? {name: trimmedName} : {}),\n ...(value.expiration === 'never' ? {} : {ttl_seconds: Number(value.expiration)}),\n };\n\n try {\n const token = await createToken.mutateAsync({workspaceId, body});\n await queryClient.invalidateQueries({\n queryKey: provisionerTokenQueryKeys.list(workspaceId),\n });\n onCreated(token);\n } catch (error) {\n const mapped = provisionerTokenCreateErrorToFormError(error);\n setFormError(mapped.message);\n }\n },\n });\n\n return (\n <>\n <ModalBody className=\"gap-16\">\n <form\n id={CREATE_PROVISIONER_TOKEN_FORM_ID}\n className=\"flex w-full flex-col gap-8\"\n noValidate\n onSubmit={(event) => {\n event.preventDefault();\n event.stopPropagation();\n void form.handleSubmit();\n }}\n >\n <div className=\"flex w-full items-end gap-16 max-[640px]:flex-col max-[640px]:items-stretch\">\n <form.Field\n name=\"name\"\n validators={{\n onBlur: ({value}) =>\n value.length <= 80 ? undefined : 'Token name must be 80 characters or fewer.',\n }}\n >\n {(field) => (\n <FormField\n className=\"flex-1\"\n label=\"Token name\"\n id=\"provisioner-token-name\"\n error={fieldError(field)}\n >\n <FormFieldInput\n placeholder=\"Docker provisioner\"\n maxLength={80}\n value={field.state.value}\n onChange={(event) => field.handleChange(event.target.value)}\n onBlur={field.handleBlur}\n />\n </FormField>\n )}\n </form.Field>\n <form.Field name=\"expiration\">\n {(field) => (\n <FormField\n className=\"flex-1\"\n label=\"Expires\"\n id=\"provisioner-token-expiration\"\n error={fieldError(field)}\n >\n <ExpirationSelect\n value={field.state.value}\n onValueChange={(next) => field.handleChange(next)}\n />\n </FormField>\n )}\n </form.Field>\n </div>\n <form.Subscribe selector={(state) => state.values.expiration}>\n {(expiration) => (\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n {expirationHint(expiration)}\n </Text>\n )}\n </form.Subscribe>\n </form>\n {formError ? (\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex flex-col gap-8\">\n <Text size=\"sm\" bold>\n Could not create token\n </Text>\n <Text size=\"sm\">{formError}</Text>\n </div>\n </Callout>\n ) : null}\n </ModalBody>\n <ModalFooter>\n <Button\n type=\"submit\"\n form={CREATE_PROVISIONER_TOKEN_FORM_ID}\n isLoading={createToken.isPending}\n >\n Create token\n </Button>\n </ModalFooter>\n </>\n );\n}\n\nexport function CreatedProvisionerTokenPanel({token}: {token: CreateProvisionerTokenResponseDto}) {\n const [copyState, setCopyState] = useState<'idle' | 'copied' | 'failed'>('idle');\n const {copy} = useCopyToClipboard({\n text: token.raw_token,\n onCopy: () => {\n setCopyState('copied');\n window.setTimeout(() => setCopyState('idle'), 1500);\n },\n });\n\n async function handleCopy() {\n try {\n await copy();\n } catch {\n setCopyState('failed');\n window.setTimeout(() => setCopyState('idle'), 2500);\n }\n }\n\n return (\n <Callout type=\"success\" variant=\"secondary\" icon={null}>\n <CalloutContent className=\"flex flex-col gap-12\">\n <div className=\"flex flex-col gap-2\">\n <CalloutTitle className=\"mb-0\">Token created</CalloutTitle>\n <CalloutDescription>\n Copy this provisioner token now. It will not be shown again.\n </CalloutDescription>\n </div>\n <div className=\"flex items-center gap-8 max-[640px]:flex-col max-[640px]:items-stretch\">\n <Code variant=\"paragraph\" className=\"min-w-0 flex-1 break-all\">\n {token.raw_token}\n </Code>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n iconLeft=\"fileCopyLine\"\n onClick={() => void handleCopy()}\n >\n {copyState === 'copied' ? 'Copied' : 'Copy'}\n </Button>\n </div>\n {copyState === 'failed' ? (\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Copy failed: select and copy manually.\n </Text>\n ) : null}\n </CalloutContent>\n </Callout>\n );\n}\n"],"names":["Button","Callout","CalloutContent","CalloutDescription","CalloutTitle","FormField","FormFieldInput","fieldError","useCopyToClipboard","ModalBody","ModalFooter","Code","Text","useForm","useQueryClient","useState","provisionerTokenQueryKeys","useCreateProvisionerTokenMutation","provisionerTokenCreateErrorToFormError","ExpirationSelect","expirationHint","CREATE_PROVISIONER_TOKEN_FORM_ID","CreateProvisionerTokenForm","workspaceId","onCreated","queryClient","createToken","formError","setFormError","form","defaultValues","name","expiration","onSubmit","value","undefined","trimmedName","trim","body","ttl_seconds","Number","token","mutateAsync","invalidateQueries","queryKey","list","error","mapped","message","className","id","noValidate","event","preventDefault","stopPropagation","handleSubmit","div","Field","validators","onBlur","length","field","label","placeholder","maxLength","state","onChange","handleChange","target","handleBlur","onValueChange","next","Subscribe","selector","values","size","role","type","bold","isLoading","isPending","CreatedProvisionerTokenPanel","copyState","setCopyState","copy","text","raw_token","onCopy","window","setTimeout","handleCopy","variant","icon","iconLeft","onClick"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/components/create-provisioner-token-form.tsx"],"sourcesContent":["import {Button} from '@shipfox/react-ui/button';\nimport {Callout, CalloutContent, CalloutDescription, CalloutTitle} from '@shipfox/react-ui/callout';\nimport {FormField, FormFieldInput, fieldError} from '@shipfox/react-ui/form-field';\nimport {useCopyToClipboard} from '@shipfox/react-ui/hooks';\nimport {ModalBody, ModalFooter} from '@shipfox/react-ui/modal';\nimport {Code, Text} from '@shipfox/react-ui/typography';\nimport {useForm} from '@tanstack/react-form';\nimport {useState} from 'react';\nimport type {CreatedProvisionerToken} from '#core/token.js';\nimport {createTokenCommand} from '#core/token.js';\nimport {useCreateProvisionerTokenMutation} from '#hooks/api/provisioner-tokens.js';\nimport {provisionerTokenCreateErrorToFormError} from './provisioner-token-form-errors.js';\nimport {\n ExpirationSelect,\n expirationCommand,\n expirationHint,\n type TokenExpirationOption,\n} from './token-expiration-select.js';\n\nexport const CREATE_PROVISIONER_TOKEN_FORM_ID = 'create-provisioner-token-form';\n\nexport function CreateProvisionerTokenForm({\n workspaceId,\n onCreated,\n}: {\n workspaceId: string;\n onCreated: (token: CreatedProvisionerToken) => void;\n}) {\n const createToken = useCreateProvisionerTokenMutation(workspaceId);\n const [formError, setFormError] = useState<string | undefined>();\n\n const form = useForm({\n defaultValues: {name: '', expiration: '86400' as TokenExpirationOption},\n onSubmit: async ({value}) => {\n setFormError(undefined);\n const command = createTokenCommand(value.name, expirationCommand(value.expiration));\n\n try {\n const token = await createToken.mutateAsync(command);\n onCreated(token);\n } catch (error) {\n const mapped = provisionerTokenCreateErrorToFormError(error);\n setFormError(mapped.message);\n }\n },\n });\n\n return (\n <>\n <ModalBody className=\"gap-16\">\n <form\n id={CREATE_PROVISIONER_TOKEN_FORM_ID}\n className=\"flex w-full flex-col gap-8\"\n noValidate\n onSubmit={(event) => {\n event.preventDefault();\n event.stopPropagation();\n void form.handleSubmit();\n }}\n >\n <div className=\"flex w-full items-end gap-16 max-[640px]:flex-col max-[640px]:items-stretch\">\n <form.Field\n name=\"name\"\n validators={{\n onBlur: ({value}) =>\n value.length <= 80 ? undefined : 'Token name must be 80 characters or fewer.',\n }}\n >\n {(field) => (\n <FormField\n className=\"flex-1\"\n label=\"Token name\"\n id=\"provisioner-token-name\"\n error={fieldError(field)}\n >\n <FormFieldInput\n placeholder=\"Docker provisioner\"\n maxLength={80}\n value={field.state.value}\n onChange={(event) => field.handleChange(event.target.value)}\n onBlur={field.handleBlur}\n />\n </FormField>\n )}\n </form.Field>\n <form.Field name=\"expiration\">\n {(field) => (\n <FormField\n className=\"flex-1\"\n label=\"Expires\"\n id=\"provisioner-token-expiration\"\n error={fieldError(field)}\n >\n <ExpirationSelect\n value={field.state.value}\n onValueChange={(next) => field.handleChange(next)}\n />\n </FormField>\n )}\n </form.Field>\n </div>\n <form.Subscribe selector={(state) => state.values.expiration}>\n {(expiration) => (\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n {expirationHint(expiration)}\n </Text>\n )}\n </form.Subscribe>\n </form>\n {formError ? (\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex flex-col gap-8\">\n <Text size=\"sm\" bold>\n Could not create token\n </Text>\n <Text size=\"sm\">{formError}</Text>\n </div>\n </Callout>\n ) : null}\n </ModalBody>\n <ModalFooter>\n <Button\n type=\"submit\"\n form={CREATE_PROVISIONER_TOKEN_FORM_ID}\n isLoading={createToken.isPending}\n >\n Create token\n </Button>\n </ModalFooter>\n </>\n );\n}\n\nexport function CreatedProvisionerTokenPanel({token}: {token: CreatedProvisionerToken}) {\n const [copyState, setCopyState] = useState<'idle' | 'copied' | 'failed'>('idle');\n const {copy} = useCopyToClipboard({\n text: token.token,\n onCopy: () => {\n setCopyState('copied');\n window.setTimeout(() => setCopyState('idle'), 1500);\n },\n });\n\n async function handleCopy() {\n try {\n await copy();\n } catch {\n setCopyState('failed');\n window.setTimeout(() => setCopyState('idle'), 2500);\n }\n }\n\n return (\n <Callout type=\"success\" variant=\"secondary\" icon={null}>\n <CalloutContent className=\"flex flex-col gap-12\">\n <div className=\"flex flex-col gap-2\">\n <CalloutTitle className=\"mb-0\">Token created</CalloutTitle>\n <CalloutDescription>\n Copy this provisioner token now. It will not be shown again.\n </CalloutDescription>\n </div>\n <div className=\"flex items-center gap-8 max-[640px]:flex-col max-[640px]:items-stretch\">\n <Code variant=\"paragraph\" className=\"min-w-0 flex-1 break-all\">\n {token.token}\n </Code>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n iconLeft=\"fileCopyLine\"\n onClick={() => void handleCopy()}\n >\n {copyState === 'copied' ? 'Copied' : 'Copy'}\n </Button>\n </div>\n {copyState === 'failed' ? (\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Copy failed: select and copy manually.\n </Text>\n ) : null}\n </CalloutContent>\n </Callout>\n );\n}\n"],"names":["Button","Callout","CalloutContent","CalloutDescription","CalloutTitle","FormField","FormFieldInput","fieldError","useCopyToClipboard","ModalBody","ModalFooter","Code","Text","useForm","useState","createTokenCommand","useCreateProvisionerTokenMutation","provisionerTokenCreateErrorToFormError","ExpirationSelect","expirationCommand","expirationHint","CREATE_PROVISIONER_TOKEN_FORM_ID","CreateProvisionerTokenForm","workspaceId","onCreated","createToken","formError","setFormError","form","defaultValues","name","expiration","onSubmit","value","undefined","command","token","mutateAsync","error","mapped","message","className","id","noValidate","event","preventDefault","stopPropagation","handleSubmit","div","Field","validators","onBlur","length","field","label","placeholder","maxLength","state","onChange","handleChange","target","handleBlur","onValueChange","next","Subscribe","selector","values","size","role","type","bold","isLoading","isPending","CreatedProvisionerTokenPanel","copyState","setCopyState","copy","text","onCopy","window","setTimeout","handleCopy","variant","icon","iconLeft","onClick"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manual-registration-token-errors.d.ts","sourceRoot":"","sources":["../../src/components/manual-registration-token-errors.ts"],"names":[],"mappings":"AAEA,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"manual-registration-token-errors.d.ts","sourceRoot":"","sources":["../../src/components/manual-registration-token-errors.ts"],"names":[],"mappings":"AAEA,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAS1E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/manual-registration-token-errors.ts"],"sourcesContent":["import {ApiError} from '@shipfox/client-api';\n\nexport function manualRegistrationTokenErrorMessage(error: unknown): string {\n if (error instanceof ApiError) {\n // `network-error` carries the raw request URL in its message; never surface it.\n if (error.code === 'network-error') {\n return \"We couldn't reach the server. Check your connection and try again.\";\n }\n return error.message;\n }\n
|
|
1
|
+
{"version":3,"sources":["../../src/components/manual-registration-token-errors.ts"],"sourcesContent":["import {ApiError} from '@shipfox/client-api';\n\nexport function manualRegistrationTokenErrorMessage(error: unknown): string {\n if (error instanceof ApiError) {\n // `network-error` carries the raw request URL in its message; never surface it.\n if (error.code === 'network-error') {\n return \"We couldn't reach the server. Check your connection and try again.\";\n }\n return error.message;\n }\n return 'Something went wrong. Try again.';\n}\n"],"names":["ApiError","manualRegistrationTokenErrorMessage","error","code","message"],"mappings":"AAAA,SAAQA,QAAQ,QAAO,sBAAsB;AAE7C,OAAO,SAASC,oCAAoCC,KAAc;IAChE,IAAIA,iBAAiBF,UAAU;QAC7B,gFAAgF;QAChF,IAAIE,MAAMC,IAAI,KAAK,iBAAiB;YAClC,OAAO;QACT;QACA,OAAOD,MAAME,OAAO;IACtB;IACA,OAAO;AACT"}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import type { ManualRegistrationTokenDto } from '@shipfox/api-runners-dto';
|
|
2
1
|
export declare function formatManualRegistrationTokenDate(value: string | null): string;
|
|
3
2
|
export declare function formatManualRegistrationTokenTimestamp(value: string | null): string | undefined;
|
|
4
|
-
export declare function manualRegistrationTokenDisplayName(token: Pick<ManualRegistrationTokenDto, 'name'>): string;
|
|
5
3
|
//# sourceMappingURL=manual-registration-token-format.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manual-registration-token-format.d.ts","sourceRoot":"","sources":["../../src/components/manual-registration-token-format.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"manual-registration-token-format.d.ts","sourceRoot":"","sources":["../../src/components/manual-registration-token-format.ts"],"names":[],"mappings":"AAEA,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAG9E;AAED,wBAAgB,sCAAsC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAG/F"}
|
|
@@ -7,8 +7,5 @@ export function formatManualRegistrationTokenTimestamp(value) {
|
|
|
7
7
|
if (!value) return undefined;
|
|
8
8
|
return formatTimestamp(value);
|
|
9
9
|
}
|
|
10
|
-
export function manualRegistrationTokenDisplayName(token) {
|
|
11
|
-
return token.name || 'Unnamed token';
|
|
12
|
-
}
|
|
13
10
|
|
|
14
11
|
//# sourceMappingURL=manual-registration-token-format.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/manual-registration-token-format.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../src/components/manual-registration-token-format.ts"],"sourcesContent":["import {formatDate, formatTimestamp} from '@shipfox/react-ui/utils';\n\nexport function formatManualRegistrationTokenDate(value: string | null): string {\n if (!value) return 'Never';\n return formatDate(value);\n}\n\nexport function formatManualRegistrationTokenTimestamp(value: string | null): string | undefined {\n if (!value) return undefined;\n return formatTimestamp(value);\n}\n"],"names":["formatDate","formatTimestamp","formatManualRegistrationTokenDate","value","formatManualRegistrationTokenTimestamp","undefined"],"mappings":"AAAA,SAAQA,UAAU,EAAEC,eAAe,QAAO,0BAA0B;AAEpE,OAAO,SAASC,kCAAkCC,KAAoB;IACpE,IAAI,CAACA,OAAO,OAAO;IACnB,OAAOH,WAAWG;AACpB;AAEA,OAAO,SAASC,uCAAuCD,KAAoB;IACzE,IAAI,CAACA,OAAO,OAAOE;IACnB,OAAOJ,gBAAgBE;AACzB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ManualRegistrationToken } from '#core/token.js';
|
|
2
2
|
export declare function ManualRegistrationTokenList({ workspaceId, tokens, }: {
|
|
3
3
|
workspaceId: string;
|
|
4
|
-
tokens:
|
|
4
|
+
tokens: ManualRegistrationToken[];
|
|
5
5
|
}): import("react").JSX.Element;
|
|
6
6
|
export declare function EmptyManualRegistrationTokens(): import("react").JSX.Element;
|
|
7
7
|
export declare function ManualRegistrationTokenTableSkeleton(): import("react").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manual-registration-token-list.d.ts","sourceRoot":"","sources":["../../src/components/manual-registration-token-list.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"manual-registration-token-list.d.ts","sourceRoot":"","sources":["../../src/components/manual-registration-token-list.tsx"],"names":[],"mappings":"AA4BA,OAAO,EAAC,KAAK,uBAAuB,EAAmB,MAAM,gBAAgB,CAAC;AAU9E,wBAAgB,2BAA2B,CAAC,EAC1C,WAAW,EACX,MAAM,GACP,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,uBAAuB,EAAE,CAAC;CACnC,+BA4EA;AA8FD,wBAAgB,6BAA6B,gCAQ5C;AAED,wBAAgB,oCAAoC,gCAYnD"}
|
|
@@ -7,11 +7,11 @@ import { Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, ModalTitle }
|
|
|
7
7
|
import { Skeleton } from '@shipfox/react-ui/skeleton';
|
|
8
8
|
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@shipfox/react-ui/table';
|
|
9
9
|
import { Code, Text } from '@shipfox/react-ui/typography';
|
|
10
|
-
import { useQueryClient } from '@tanstack/react-query';
|
|
11
10
|
import { useState } from 'react';
|
|
12
|
-
import {
|
|
11
|
+
import { tokenDisplayName } from '#core/token.js';
|
|
12
|
+
import { useRevokeManualRegistrationTokenMutation } from '#hooks/api/manual-registration-tokens.js';
|
|
13
13
|
import { manualRegistrationTokenErrorMessage } from './manual-registration-token-errors.js';
|
|
14
|
-
import { formatManualRegistrationTokenDate, formatManualRegistrationTokenTimestamp
|
|
14
|
+
import { formatManualRegistrationTokenDate, formatManualRegistrationTokenTimestamp } from './manual-registration-token-format.js';
|
|
15
15
|
import { TokenDate } from './token-date.js';
|
|
16
16
|
import { TokenName } from './token-name.js';
|
|
17
17
|
export function ManualRegistrationTokenList({ workspaceId, tokens }) {
|
|
@@ -52,7 +52,7 @@ export function ManualRegistrationTokenList({ workspaceId, tokens }) {
|
|
|
52
52
|
children: [
|
|
53
53
|
/*#__PURE__*/ _jsx(TableCell, {
|
|
54
54
|
children: /*#__PURE__*/ _jsx(TokenName, {
|
|
55
|
-
name:
|
|
55
|
+
name: tokenDisplayName(token)
|
|
56
56
|
})
|
|
57
57
|
}),
|
|
58
58
|
/*#__PURE__*/ _jsx(TableCell, {
|
|
@@ -64,12 +64,12 @@ export function ManualRegistrationTokenList({ workspaceId, tokens }) {
|
|
|
64
64
|
}),
|
|
65
65
|
/*#__PURE__*/ _jsx(TableCell, {
|
|
66
66
|
children: /*#__PURE__*/ _jsx(ManualRegistrationTokenDate, {
|
|
67
|
-
value: token.
|
|
67
|
+
value: token.expiresAt
|
|
68
68
|
})
|
|
69
69
|
}),
|
|
70
70
|
/*#__PURE__*/ _jsx(TableCell, {
|
|
71
71
|
children: /*#__PURE__*/ _jsx(ManualRegistrationTokenDate, {
|
|
72
|
-
value: token.
|
|
72
|
+
value: token.createdAt
|
|
73
73
|
})
|
|
74
74
|
}),
|
|
75
75
|
/*#__PURE__*/ _jsx(TableCell, {
|
|
@@ -98,7 +98,7 @@ export function ManualRegistrationTokenList({ workspaceId, tokens }) {
|
|
|
98
98
|
className: "min-w-0 flex-1",
|
|
99
99
|
children: [
|
|
100
100
|
/*#__PURE__*/ _jsx(TokenName, {
|
|
101
|
-
name:
|
|
101
|
+
name: tokenDisplayName(token)
|
|
102
102
|
}),
|
|
103
103
|
/*#__PURE__*/ _jsx(Code, {
|
|
104
104
|
variant: "paragraph",
|
|
@@ -124,7 +124,7 @@ export function ManualRegistrationTokenList({ workspaceId, tokens }) {
|
|
|
124
124
|
}),
|
|
125
125
|
/*#__PURE__*/ _jsx("dd", {
|
|
126
126
|
children: /*#__PURE__*/ _jsx(ManualRegistrationTokenDate, {
|
|
127
|
-
value: token.
|
|
127
|
+
value: token.expiresAt
|
|
128
128
|
})
|
|
129
129
|
})
|
|
130
130
|
]
|
|
@@ -137,7 +137,7 @@ export function ManualRegistrationTokenList({ workspaceId, tokens }) {
|
|
|
137
137
|
}),
|
|
138
138
|
/*#__PURE__*/ _jsx("dd", {
|
|
139
139
|
children: /*#__PURE__*/ _jsx(ManualRegistrationTokenDate, {
|
|
140
|
-
value: token.
|
|
140
|
+
value: token.createdAt
|
|
141
141
|
})
|
|
142
142
|
})
|
|
143
143
|
]
|
|
@@ -158,19 +158,12 @@ function ManualRegistrationTokenDate({ value }) {
|
|
|
158
158
|
});
|
|
159
159
|
}
|
|
160
160
|
function RevokeManualRegistrationTokenButton({ workspaceId, token }) {
|
|
161
|
-
const
|
|
162
|
-
const revokeToken = useRevokeManualRegistrationTokenMutation();
|
|
161
|
+
const revokeToken = useRevokeManualRegistrationTokenMutation(workspaceId);
|
|
163
162
|
const [open, setOpen] = useState(false);
|
|
164
|
-
const tokenName =
|
|
163
|
+
const tokenName = tokenDisplayName(token);
|
|
165
164
|
async function handleRevoke() {
|
|
166
165
|
try {
|
|
167
|
-
await revokeToken.mutateAsync(
|
|
168
|
-
workspaceId,
|
|
169
|
-
tokenId: token.id
|
|
170
|
-
});
|
|
171
|
-
await queryClient.invalidateQueries({
|
|
172
|
-
queryKey: manualRegistrationTokenQueryKeys.list(workspaceId)
|
|
173
|
-
});
|
|
166
|
+
await revokeToken.mutateAsync(token.id);
|
|
174
167
|
setOpen(false);
|
|
175
168
|
} catch {
|
|
176
169
|
// React Query stores the error for the inline modal alert.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/manual-registration-token-list.tsx"],"sourcesContent":["import type {ManualRegistrationTokenDto} from '@shipfox/api-runners-dto';\nimport {Button, IconButton} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@shipfox/react-ui/dropdown-menu';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {\n Modal,\n ModalBody,\n ModalContent,\n ModalFooter,\n ModalHeader,\n ModalTitle,\n} from '@shipfox/react-ui/modal';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@shipfox/react-ui/table';\nimport {Code, Text} from '@shipfox/react-ui/typography';\nimport {useQueryClient} from '@tanstack/react-query';\nimport {useState} from 'react';\nimport {\n manualRegistrationTokenQueryKeys,\n useRevokeManualRegistrationTokenMutation,\n} from '#hooks/api/manual-registration-tokens.js';\nimport {manualRegistrationTokenErrorMessage} from './manual-registration-token-errors.js';\nimport {\n formatManualRegistrationTokenDate,\n formatManualRegistrationTokenTimestamp,\n manualRegistrationTokenDisplayName,\n} from './manual-registration-token-format.js';\nimport {TokenDate} from './token-date.js';\nimport {TokenName} from './token-name.js';\n\nexport function ManualRegistrationTokenList({\n workspaceId,\n tokens,\n}: {\n workspaceId: string;\n tokens: ManualRegistrationTokenDto[];\n}) {\n return (\n <>\n <div className=\"max-[760px]:hidden\">\n <Table className=\"table-fixed\">\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-[34%]\">Name</TableHead>\n <TableHead>Prefix</TableHead>\n <TableHead className=\"w-128\">Expires</TableHead>\n <TableHead className=\"w-128\">Created</TableHead>\n <TableHead className=\"w-80 text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {tokens.map((token) => (\n <TableRow key={token.id}>\n <TableCell>\n <TokenName name={manualRegistrationTokenDisplayName(token)} />\n </TableCell>\n <TableCell>\n <Code variant=\"paragraph\" className=\"block truncate\">\n {token.prefix}\n </Code>\n </TableCell>\n <TableCell>\n <ManualRegistrationTokenDate value={token.expires_at} />\n </TableCell>\n <TableCell>\n <ManualRegistrationTokenDate value={token.created_at} />\n </TableCell>\n <TableCell className=\"text-right\">\n <RevokeManualRegistrationTokenButton workspaceId={workspaceId} token={token} />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n <ul\n className=\"hidden flex-col gap-10 max-[760px]:flex\"\n aria-label=\"Manual registration tokens\"\n >\n {tokens.map((token) => (\n <li\n key={token.id}\n className=\"rounded-8 border border-border-neutral-base bg-background-neutral-base p-14\"\n >\n <div className=\"flex items-start justify-between gap-12\">\n <div className=\"min-w-0 flex-1\">\n <TokenName name={manualRegistrationTokenDisplayName(token)} />\n <Code variant=\"paragraph\" className=\"block truncate text-foreground-neutral-muted\">\n {token.prefix}\n </Code>\n </div>\n <RevokeManualRegistrationTokenButton workspaceId={workspaceId} token={token} />\n </div>\n <dl className=\"mt-12 grid grid-cols-2 gap-10 text-sm\">\n <div>\n <dt className=\"text-foreground-neutral-muted\">Expires</dt>\n <dd>\n <ManualRegistrationTokenDate value={token.expires_at} />\n </dd>\n </div>\n <div>\n <dt className=\"text-foreground-neutral-muted\">Created</dt>\n <dd>\n <ManualRegistrationTokenDate value={token.created_at} />\n </dd>\n </div>\n </dl>\n </li>\n ))}\n </ul>\n </>\n );\n}\n\nfunction ManualRegistrationTokenDate({value}: {value: string | null}) {\n return (\n <TokenDate\n value={value}\n date={formatManualRegistrationTokenDate(value)}\n timestamp={formatManualRegistrationTokenTimestamp(value)}\n />\n );\n}\n\nfunction RevokeManualRegistrationTokenButton({\n workspaceId,\n token,\n}: {\n workspaceId: string;\n token: ManualRegistrationTokenDto;\n}) {\n const queryClient = useQueryClient();\n const revokeToken = useRevokeManualRegistrationTokenMutation();\n const [open, setOpen] = useState(false);\n const tokenName = manualRegistrationTokenDisplayName(token);\n\n async function handleRevoke() {\n try {\n await revokeToken.mutateAsync({workspaceId, tokenId: token.id});\n await queryClient.invalidateQueries({\n queryKey: manualRegistrationTokenQueryKeys.list(workspaceId),\n });\n setOpen(false);\n } catch {\n // React Query stores the error for the inline modal alert.\n }\n }\n\n function handleOpenChange(nextOpen: boolean) {\n setOpen(nextOpen);\n if (nextOpen) {\n revokeToken.reset();\n }\n }\n\n function openRevokeConfirmation() {\n revokeToken.reset();\n setOpen(true);\n }\n\n return (\n <>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <IconButton\n type=\"button\"\n size=\"sm\"\n variant=\"transparent\"\n icon=\"more2Line\"\n aria-label={`Open ${tokenName} registration token actions`}\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" size=\"sm\">\n <DropdownMenuItem onSelect={openRevokeConfirmation}>Revoke token</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n <Modal open={open} onOpenChange={handleOpenChange}>\n <ModalContent aria-describedby={undefined} className=\"max-w-[420px]\">\n <ModalTitle className=\"sr-only\">Revoke token</ModalTitle>\n <ModalHeader title=\"Revoke token?\" />\n <ModalBody className=\"gap-16\">\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n {tokenName} will stop creating new runner sessions. Existing sessions and job leases\n expire on their own.\n </Text>\n {revokeToken.isError ? (\n <Callout role=\"alert\" type=\"error\">\n <Text size=\"sm\">{manualRegistrationTokenErrorMessage(revokeToken.error)}</Text>\n </Callout>\n ) : null}\n </ModalBody>\n <ModalFooter>\n <Button size=\"sm\" variant=\"secondary\" onClick={() => setOpen(false)}>\n Cancel\n </Button>\n <Button\n size=\"sm\"\n variant=\"danger\"\n isLoading={revokeToken.isPending}\n onClick={handleRevoke}\n >\n Revoke\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </>\n );\n}\n\nexport function EmptyManualRegistrationTokens() {\n return (\n <EmptyState\n icon=\"key2Line\"\n title=\"No usable manual registration tokens\"\n description=\"Create a token to connect a runner to this workspace.\"\n />\n );\n}\n\nexport function ManualRegistrationTokenTableSkeleton() {\n return (\n <div\n role=\"status\"\n aria-label=\"Loading manual registration tokens\"\n className=\"flex flex-col gap-8\"\n >\n {[0, 1, 2].map((row) => (\n <Skeleton key={row} className=\"h-44 w-full\" />\n ))}\n </div>\n );\n}\n"],"names":["Button","IconButton","Callout","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","EmptyState","Modal","ModalBody","ModalContent","ModalFooter","ModalHeader","ModalTitle","Skeleton","Table","TableBody","TableCell","TableHead","TableHeader","TableRow","Code","Text","useQueryClient","useState","manualRegistrationTokenQueryKeys","useRevokeManualRegistrationTokenMutation","manualRegistrationTokenErrorMessage","formatManualRegistrationTokenDate","formatManualRegistrationTokenTimestamp","manualRegistrationTokenDisplayName","TokenDate","TokenName","ManualRegistrationTokenList","workspaceId","tokens","div","className","map","token","name","variant","prefix","ManualRegistrationTokenDate","value","expires_at","created_at","RevokeManualRegistrationTokenButton","id","ul","aria-label","li","dl","dt","dd","date","timestamp","queryClient","revokeToken","open","setOpen","tokenName","handleRevoke","mutateAsync","tokenId","invalidateQueries","queryKey","list","handleOpenChange","nextOpen","reset","openRevokeConfirmation","asChild","type","size","icon","align","onSelect","onOpenChange","aria-describedby","undefined","title","isError","role","error","onClick","isLoading","isPending","EmptyManualRegistrationTokens","description","ManualRegistrationTokenTableSkeleton","row"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/components/manual-registration-token-list.tsx"],"sourcesContent":["import {Button, IconButton} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@shipfox/react-ui/dropdown-menu';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {\n Modal,\n ModalBody,\n ModalContent,\n ModalFooter,\n ModalHeader,\n ModalTitle,\n} from '@shipfox/react-ui/modal';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@shipfox/react-ui/table';\nimport {Code, Text} from '@shipfox/react-ui/typography';\nimport {useState} from 'react';\nimport {type ManualRegistrationToken, tokenDisplayName} from '#core/token.js';\nimport {useRevokeManualRegistrationTokenMutation} from '#hooks/api/manual-registration-tokens.js';\nimport {manualRegistrationTokenErrorMessage} from './manual-registration-token-errors.js';\nimport {\n formatManualRegistrationTokenDate,\n formatManualRegistrationTokenTimestamp,\n} from './manual-registration-token-format.js';\nimport {TokenDate} from './token-date.js';\nimport {TokenName} from './token-name.js';\n\nexport function ManualRegistrationTokenList({\n workspaceId,\n tokens,\n}: {\n workspaceId: string;\n tokens: ManualRegistrationToken[];\n}) {\n return (\n <>\n <div className=\"max-[760px]:hidden\">\n <Table className=\"table-fixed\">\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-[34%]\">Name</TableHead>\n <TableHead>Prefix</TableHead>\n <TableHead className=\"w-128\">Expires</TableHead>\n <TableHead className=\"w-128\">Created</TableHead>\n <TableHead className=\"w-80 text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {tokens.map((token) => (\n <TableRow key={token.id}>\n <TableCell>\n <TokenName name={tokenDisplayName(token)} />\n </TableCell>\n <TableCell>\n <Code variant=\"paragraph\" className=\"block truncate\">\n {token.prefix}\n </Code>\n </TableCell>\n <TableCell>\n <ManualRegistrationTokenDate value={token.expiresAt} />\n </TableCell>\n <TableCell>\n <ManualRegistrationTokenDate value={token.createdAt} />\n </TableCell>\n <TableCell className=\"text-right\">\n <RevokeManualRegistrationTokenButton workspaceId={workspaceId} token={token} />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n <ul\n className=\"hidden flex-col gap-10 max-[760px]:flex\"\n aria-label=\"Manual registration tokens\"\n >\n {tokens.map((token) => (\n <li\n key={token.id}\n className=\"rounded-8 border border-border-neutral-base bg-background-neutral-base p-14\"\n >\n <div className=\"flex items-start justify-between gap-12\">\n <div className=\"min-w-0 flex-1\">\n <TokenName name={tokenDisplayName(token)} />\n <Code variant=\"paragraph\" className=\"block truncate text-foreground-neutral-muted\">\n {token.prefix}\n </Code>\n </div>\n <RevokeManualRegistrationTokenButton workspaceId={workspaceId} token={token} />\n </div>\n <dl className=\"mt-12 grid grid-cols-2 gap-10 text-sm\">\n <div>\n <dt className=\"text-foreground-neutral-muted\">Expires</dt>\n <dd>\n <ManualRegistrationTokenDate value={token.expiresAt} />\n </dd>\n </div>\n <div>\n <dt className=\"text-foreground-neutral-muted\">Created</dt>\n <dd>\n <ManualRegistrationTokenDate value={token.createdAt} />\n </dd>\n </div>\n </dl>\n </li>\n ))}\n </ul>\n </>\n );\n}\n\nfunction ManualRegistrationTokenDate({value}: {value: string | null}) {\n return (\n <TokenDate\n value={value}\n date={formatManualRegistrationTokenDate(value)}\n timestamp={formatManualRegistrationTokenTimestamp(value)}\n />\n );\n}\n\nfunction RevokeManualRegistrationTokenButton({\n workspaceId,\n token,\n}: {\n workspaceId: string;\n token: ManualRegistrationToken;\n}) {\n const revokeToken = useRevokeManualRegistrationTokenMutation(workspaceId);\n const [open, setOpen] = useState(false);\n const tokenName = tokenDisplayName(token);\n\n async function handleRevoke() {\n try {\n await revokeToken.mutateAsync(token.id);\n setOpen(false);\n } catch {\n // React Query stores the error for the inline modal alert.\n }\n }\n\n function handleOpenChange(nextOpen: boolean) {\n setOpen(nextOpen);\n if (nextOpen) {\n revokeToken.reset();\n }\n }\n\n function openRevokeConfirmation() {\n revokeToken.reset();\n setOpen(true);\n }\n\n return (\n <>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <IconButton\n type=\"button\"\n size=\"sm\"\n variant=\"transparent\"\n icon=\"more2Line\"\n aria-label={`Open ${tokenName} registration token actions`}\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" size=\"sm\">\n <DropdownMenuItem onSelect={openRevokeConfirmation}>Revoke token</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n <Modal open={open} onOpenChange={handleOpenChange}>\n <ModalContent aria-describedby={undefined} className=\"max-w-[420px]\">\n <ModalTitle className=\"sr-only\">Revoke token</ModalTitle>\n <ModalHeader title=\"Revoke token?\" />\n <ModalBody className=\"gap-16\">\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n {tokenName} will stop creating new runner sessions. Existing sessions and job leases\n expire on their own.\n </Text>\n {revokeToken.isError ? (\n <Callout role=\"alert\" type=\"error\">\n <Text size=\"sm\">{manualRegistrationTokenErrorMessage(revokeToken.error)}</Text>\n </Callout>\n ) : null}\n </ModalBody>\n <ModalFooter>\n <Button size=\"sm\" variant=\"secondary\" onClick={() => setOpen(false)}>\n Cancel\n </Button>\n <Button\n size=\"sm\"\n variant=\"danger\"\n isLoading={revokeToken.isPending}\n onClick={handleRevoke}\n >\n Revoke\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </>\n );\n}\n\nexport function EmptyManualRegistrationTokens() {\n return (\n <EmptyState\n icon=\"key2Line\"\n title=\"No usable manual registration tokens\"\n description=\"Create a token to connect a runner to this workspace.\"\n />\n );\n}\n\nexport function ManualRegistrationTokenTableSkeleton() {\n return (\n <div\n role=\"status\"\n aria-label=\"Loading manual registration tokens\"\n className=\"flex flex-col gap-8\"\n >\n {[0, 1, 2].map((row) => (\n <Skeleton key={row} className=\"h-44 w-full\" />\n ))}\n </div>\n );\n}\n"],"names":["Button","IconButton","Callout","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","EmptyState","Modal","ModalBody","ModalContent","ModalFooter","ModalHeader","ModalTitle","Skeleton","Table","TableBody","TableCell","TableHead","TableHeader","TableRow","Code","Text","useState","tokenDisplayName","useRevokeManualRegistrationTokenMutation","manualRegistrationTokenErrorMessage","formatManualRegistrationTokenDate","formatManualRegistrationTokenTimestamp","TokenDate","TokenName","ManualRegistrationTokenList","workspaceId","tokens","div","className","map","token","name","variant","prefix","ManualRegistrationTokenDate","value","expiresAt","createdAt","RevokeManualRegistrationTokenButton","id","ul","aria-label","li","dl","dt","dd","date","timestamp","revokeToken","open","setOpen","tokenName","handleRevoke","mutateAsync","handleOpenChange","nextOpen","reset","openRevokeConfirmation","asChild","type","size","icon","align","onSelect","onOpenChange","aria-describedby","undefined","title","isError","role","error","onClick","isLoading","isPending","EmptyManualRegistrationTokens","description","ManualRegistrationTokenTableSkeleton","row"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manual-registration-tokens-settings-section.d.ts","sourceRoot":"","sources":["../../src/components/manual-registration-tokens-settings-section.tsx"],"names":[],"mappings":"AAyBA,wBAAgB,gDAAgD,CAAC,EAC/D,WAAW,GACZ,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;CACrB,+
|
|
1
|
+
{"version":3,"file":"manual-registration-tokens-settings-section.d.ts","sourceRoot":"","sources":["../../src/components/manual-registration-tokens-settings-section.tsx"],"names":[],"mappings":"AAyBA,wBAAgB,gDAAgD,CAAC,EAC/D,WAAW,GACZ,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;CACrB,+BA8EA"}
|
|
@@ -12,7 +12,7 @@ export function WorkspaceManualRegistrationTokensSettingsSection({ workspaceId }
|
|
|
12
12
|
const tokensQuery = useManualRegistrationTokensQuery(workspaceId);
|
|
13
13
|
const [isModalOpen, setIsModalOpen] = useState(false);
|
|
14
14
|
const [createdToken, setCreatedToken] = useState(null);
|
|
15
|
-
const tokens = tokensQuery.data
|
|
15
|
+
const tokens = tokensQuery.data ?? [];
|
|
16
16
|
function handleOpenChange(nextOpen) {
|
|
17
17
|
setIsModalOpen(nextOpen);
|
|
18
18
|
if (!nextOpen) {
|