@shipfox/client-auth 17.0.0 → 21.0.0
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 +19 -0
- package/dist/pages/workspace-onboarding-page.d.ts.map +1 -1
- package/dist/pages/workspace-onboarding-page.js +82 -75
- package/dist/pages/workspace-onboarding-page.js.map +1 -1
- package/dist/routes/index.d.ts +3 -0
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +3 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/login.d.ts +3 -0
- package/dist/routes/login.js +3 -0
- package/dist/routes/login.js.map +1 -1
- package/dist/routes/logout.d.ts +3 -0
- package/dist/routes/logout.js +3 -0
- package/dist/routes/logout.js.map +1 -1
- package/dist/routes/reset.d.ts +3 -0
- package/dist/routes/reset.js +3 -0
- package/dist/routes/reset.js.map +1 -1
- package/dist/routes/signup.d.ts +3 -0
- package/dist/routes/signup.js +3 -0
- package/dist/routes/signup.js.map +1 -1
- package/dist/routes/workspace-onboarding.d.ts +3 -0
- package/dist/routes/workspace-onboarding.d.ts.map +1 -1
- package/dist/routes/workspace-onboarding.js +3 -0
- package/dist/routes/workspace-onboarding.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/src/pages/workspace-onboarding-page.test.tsx +16 -6
- package/src/pages/workspace-onboarding-page.tsx +100 -92
- package/src/routes/index.tsx +1 -0
- package/src/routes/login.tsx +1 -0
- package/src/routes/logout.tsx +5 -1
- package/src/routes/reset.tsx +1 -0
- package/src/routes/signup.tsx +1 -0
- package/src/routes/workspace-onboarding.tsx +1 -0
- package/tsconfig.build.tsbuildinfo +1 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
$ shipfox-swc
|
|
2
|
-
Successfully compiled: 42 files with swc (
|
|
2
|
+
Successfully compiled: 42 files with swc (82.74ms)
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @shipfox/client-auth
|
|
2
2
|
|
|
3
|
+
## 21.0.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [0f4abe4]
|
|
8
|
+
- Updated dependencies [71d0c44]
|
|
9
|
+
- Updated dependencies [9c21429]
|
|
10
|
+
- Updated dependencies [30beb8f]
|
|
11
|
+
- Updated dependencies [16733a7]
|
|
12
|
+
- Updated dependencies [163c40a]
|
|
13
|
+
- Updated dependencies [c4376a1]
|
|
14
|
+
- Updated dependencies [6703982]
|
|
15
|
+
- Updated dependencies [f1d127e]
|
|
16
|
+
- Updated dependencies [0e860d7]
|
|
17
|
+
- @shipfox/react-ui@2.0.0
|
|
18
|
+
- @shipfox/client-shell@21.0.0
|
|
19
|
+
- @shipfox/client-invitations@21.0.0
|
|
20
|
+
- @shipfox/client-ui@21.0.0
|
|
21
|
+
|
|
3
22
|
## 17.0.0
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-onboarding-page.d.ts","sourceRoot":"","sources":["../../src/pages/workspace-onboarding-page.tsx"],"names":[],"mappings":"AAwCA,wBAAgB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"workspace-onboarding-page.d.ts","sourceRoot":"","sources":["../../src/pages/workspace-onboarding-page.tsx"],"names":[],"mappings":"AAwCA,wBAAgB,uBAAuB,gCAqNtC"}
|
|
@@ -4,9 +4,9 @@ import { createWorkspaceBodySchema } from '@shipfox/api-workspaces-dto';
|
|
|
4
4
|
import { displayNameFieldError, SlugField } from '@shipfox/client-ui';
|
|
5
5
|
import { Button } from '@shipfox/react-ui/button';
|
|
6
6
|
import { Callout } from '@shipfox/react-ui/callout';
|
|
7
|
-
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@shipfox/react-ui/card';
|
|
8
7
|
import { FormField, FormFieldInput, fieldError } from '@shipfox/react-ui/form-field';
|
|
9
8
|
import { Icon } from '@shipfox/react-ui/icon';
|
|
9
|
+
import { Panel, PanelBody, PanelHeader, PanelTitle } from '@shipfox/react-ui/panel';
|
|
10
10
|
import { toast } from '@shipfox/react-ui/toast';
|
|
11
11
|
import { Text } from '@shipfox/react-ui/typography';
|
|
12
12
|
import { useForm } from '@tanstack/react-form';
|
|
@@ -124,9 +124,9 @@ export function WorkspaceOnboardingPage() {
|
|
|
124
124
|
}
|
|
125
125
|
});
|
|
126
126
|
return /*#__PURE__*/ _jsx("main", {
|
|
127
|
-
className: "min-h-screen
|
|
127
|
+
className: "min-h-screen px-frame py-frame max-[520px]:px-row",
|
|
128
128
|
children: /*#__PURE__*/ _jsxs("div", {
|
|
129
|
-
className: "mx-auto flex min-h-[calc(100vh-64px)] w-full
|
|
129
|
+
className: "mx-auto flex min-h-[calc(100vh-64px)] w-full flex-col gap-section",
|
|
130
130
|
children: [
|
|
131
131
|
/*#__PURE__*/ _jsx("header", {
|
|
132
132
|
className: "flex items-center justify-between",
|
|
@@ -160,94 +160,101 @@ export function WorkspaceOnboardingPage() {
|
|
|
160
160
|
event.stopPropagation();
|
|
161
161
|
void form.handleSubmit();
|
|
162
162
|
},
|
|
163
|
-
children: /*#__PURE__*/ _jsxs(
|
|
164
|
-
className: "gap-section p-panel shadow-button-neutral",
|
|
163
|
+
children: /*#__PURE__*/ _jsxs(Panel, {
|
|
165
164
|
children: [
|
|
166
|
-
/*#__PURE__*/ _jsxs(
|
|
167
|
-
|
|
165
|
+
/*#__PURE__*/ _jsxs(PanelHeader, {
|
|
166
|
+
variant: "plain",
|
|
167
|
+
className: "flex-col items-start gap-inline",
|
|
168
168
|
children: [
|
|
169
|
-
/*#__PURE__*/ _jsx(
|
|
169
|
+
/*#__PURE__*/ _jsx(PanelTitle, {
|
|
170
170
|
id: "workspace-onboarding-title",
|
|
171
171
|
variant: "h1",
|
|
172
172
|
children: "Create your workspace"
|
|
173
173
|
}),
|
|
174
|
-
/*#__PURE__*/ _jsx(
|
|
174
|
+
/*#__PURE__*/ _jsx(Text, {
|
|
175
|
+
size: "sm",
|
|
176
|
+
className: "text-foreground-neutral-muted",
|
|
175
177
|
children: "Give your team a place to collaborate."
|
|
176
178
|
})
|
|
177
179
|
]
|
|
178
180
|
}),
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
type: "error",
|
|
182
|
-
children: formError
|
|
183
|
-
}) : null,
|
|
184
|
-
/*#__PURE__*/ _jsxs(CardContent, {
|
|
185
|
-
className: "flex flex-col gap-inline",
|
|
181
|
+
/*#__PURE__*/ _jsxs(PanelBody, {
|
|
182
|
+
className: "flex flex-col gap-section p-panel",
|
|
186
183
|
children: [
|
|
187
|
-
/*#__PURE__*/ _jsx(
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
184
|
+
formError ? /*#__PURE__*/ _jsx(Callout, {
|
|
185
|
+
role: "alert",
|
|
186
|
+
type: "error",
|
|
187
|
+
children: formError
|
|
188
|
+
}) : null,
|
|
189
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
190
|
+
className: "flex flex-col gap-inline",
|
|
191
|
+
children: [
|
|
192
|
+
/*#__PURE__*/ _jsx(form.Field, {
|
|
193
|
+
name: "name",
|
|
194
|
+
validators: {
|
|
195
|
+
onBlur: ({ value })=>displayNameFieldError(value, 'Workspace name', createWorkspaceBodySchema.shape.name),
|
|
196
|
+
onSubmit: ({ value })=>displayNameFieldError(value, 'Workspace name', createWorkspaceBodySchema.shape.name)
|
|
197
|
+
},
|
|
198
|
+
children: (field)=>/*#__PURE__*/ _jsx(FormField, {
|
|
199
|
+
label: "Workspace name",
|
|
200
|
+
id: "workspace-name",
|
|
201
|
+
error: fieldError(field),
|
|
202
|
+
children: /*#__PURE__*/ _jsx(FormFieldInput, {
|
|
203
|
+
autoComplete: "organization",
|
|
204
|
+
name: "name",
|
|
205
|
+
placeholder: "Acme",
|
|
206
|
+
type: "text",
|
|
207
|
+
value: field.state.value,
|
|
208
|
+
onChange: (event)=>{
|
|
209
|
+
const name = event.target.value;
|
|
210
|
+
field.handleChange(name);
|
|
211
|
+
if (!slugTouched) {
|
|
212
|
+
form.setFieldValue('slug', name ? slugifyName(name, {
|
|
213
|
+
fallback: 'workspace'
|
|
214
|
+
}) : '');
|
|
215
|
+
}
|
|
216
|
+
},
|
|
217
|
+
onBlur: field.handleBlur
|
|
218
|
+
})
|
|
219
|
+
})
|
|
220
|
+
}),
|
|
221
|
+
/*#__PURE__*/ _jsx(form.Field, {
|
|
225
222
|
name: "slug",
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
field.handleChange(value);
|
|
223
|
+
validators: {
|
|
224
|
+
onBlur: createWorkspaceBodySchema.shape.slug,
|
|
225
|
+
onSubmit: createWorkspaceBodySchema.shape.slug
|
|
230
226
|
},
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
227
|
+
children: (field)=>/*#__PURE__*/ _jsx(SlugField, {
|
|
228
|
+
id: "workspace-slug",
|
|
229
|
+
label: "Workspace slug",
|
|
230
|
+
name: "slug",
|
|
231
|
+
value: field.state.value,
|
|
232
|
+
onChange: (value)=>{
|
|
233
|
+
setSlugTouched(true);
|
|
234
|
+
field.handleChange(value);
|
|
235
|
+
},
|
|
236
|
+
onBlur: field.handleBlur,
|
|
237
|
+
error: fieldError(field),
|
|
238
|
+
description: /*#__PURE__*/ _jsx("span", {
|
|
239
|
+
className: "break-all font-code",
|
|
240
|
+
children: `${window.location.origin}/w/${field.state.value || 'acme'}`
|
|
241
|
+
}),
|
|
242
|
+
placeholder: "acme",
|
|
243
|
+
checkEnabled: slugTouched,
|
|
244
|
+
isValid: isSlugValid,
|
|
245
|
+
checkAvailability: checkWorkspaceSlugAvailability
|
|
246
|
+
})
|
|
241
247
|
})
|
|
248
|
+
]
|
|
249
|
+
}),
|
|
250
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
251
|
+
className: "w-full",
|
|
252
|
+
iconRight: "chevronRight",
|
|
253
|
+
isLoading: createWorkspace.isPending,
|
|
254
|
+
type: "submit",
|
|
255
|
+
children: createWorkspace.isPending ? 'Creating workspace...' : 'Create workspace'
|
|
242
256
|
})
|
|
243
257
|
]
|
|
244
|
-
}),
|
|
245
|
-
/*#__PURE__*/ _jsx(Button, {
|
|
246
|
-
className: "w-full",
|
|
247
|
-
iconRight: "chevronRight",
|
|
248
|
-
isLoading: createWorkspace.isPending,
|
|
249
|
-
type: "submit",
|
|
250
|
-
children: createWorkspace.isPending ? 'Creating workspace...' : 'Create workspace'
|
|
251
258
|
})
|
|
252
259
|
]
|
|
253
260
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/pages/workspace-onboarding-page.tsx"],"sourcesContent":["import {slugifyName, slugSchema} from '@shipfox/api-common-dto';\nimport {createWorkspaceBodySchema} from '@shipfox/api-workspaces-dto';\nimport {displayNameFieldError, SlugField} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {Card, CardContent, CardDescription, CardHeader, CardTitle} from '@shipfox/react-ui/card';\nimport {FormField, FormFieldInput, fieldError} from '@shipfox/react-ui/form-field';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {toast} from '@shipfox/react-ui/toast';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {useForm} from '@tanstack/react-form';\nimport {useNavigate} from '@tanstack/react-router';\nimport {useSetAtom} from 'jotai';\nimport {useState} from 'react';\nimport {checkWorkspaceSlugAvailability, useCreateWorkspaceAuth} from '#hooks/api/workspace-auth.js';\nimport {useAuthState} from '#hooks/use-auth-state.js';\nimport {lastWorkspaceIdAtom, rememberLastWorkspaceId} from '#state/last-workspace.js';\nimport {workspaceOnboardingErrorToFormError} from './form-errors.js';\n\nconst previewMetrics = [\n {label: 'Runs', value: '--'},\n {label: 'Passed', value: '--'},\n {label: 'Failed', value: '--'},\n {label: 'Duration', value: '--'},\n];\nconst previewBars = [\n {id: 'runs-start', height: 32},\n {id: 'runs-mid-low', height: 48},\n {id: 'runs-dip', height: 28},\n {id: 'runs-mid-high', height: 66},\n {id: 'runs-mid', height: 54},\n {id: 'runs-peak', height: 82},\n {id: 'runs-late-low', height: 44},\n {id: 'runs-late-high', height: 74},\n];\n\nfunction isSlugValid(value: string): boolean {\n return slugSchema.safeParse(value).success;\n}\n\nexport function WorkspaceOnboardingPage() {\n const createWorkspace = useCreateWorkspaceAuth();\n const {user} = useAuthState();\n const navigate = useNavigate();\n const setLastWorkspaceId = useSetAtom(lastWorkspaceIdAtom);\n const [formError, setFormError] = useState<string | undefined>();\n const [slugTouched, setSlugTouched] = useState(false);\n\n const form = useForm({\n defaultValues: {name: '', slug: ''},\n onSubmit: async ({value}) => {\n setFormError(undefined);\n try {\n const command = createWorkspaceBodySchema.parse({name: value.name, slug: value.slug});\n const created = await createWorkspace.mutateAsync(command);\n toast.success('Workspace created.');\n // Pin the new workspace as the last-active one so a page refresh and\n // future visits to `/` land on it.\n try {\n setLastWorkspaceId(created.id);\n if (user?.id) rememberLastWorkspaceId(user.id, created.id);\n } catch {\n // localStorage may throw in private browsing or quota-exceeded.\n }\n await navigate({to: '/w/$workspaceSlug', params: {workspaceSlug: created.slug}});\n } catch (error) {\n const mapped = workspaceOnboardingErrorToFormError(error);\n if (mapped.kind === 'field') {\n form.setFieldMeta(mapped.field, (previous) => ({\n ...previous,\n errorMap: {...previous.errorMap, onServer: mapped.message},\n }));\n } else {\n setFormError(mapped.message);\n }\n }\n },\n });\n\n return (\n <main className=\"min-h-screen bg-background-subtle-base px-frame py-frame max-[520px]:px-row\">\n <div className=\"mx-auto flex min-h-[calc(100vh-64px)] w-full max-w-[1120px] flex-col gap-section\">\n <header className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-inline\">\n <div className=\"flex size-36 items-center justify-center rounded-8 border border-border-neutral-base bg-background-neutral-base shadow-button-neutral\">\n <Icon name=\"shipfox\" className=\"size-24 text-background-highlight-interactive\" />\n </div>\n <Text size=\"md\" bold>\n Shipfox\n </Text>\n </div>\n </header>\n\n <section className=\"grid flex-1 items-center gap-region lg:grid-cols-[minmax(0,440px)_minmax(0,1fr)]\">\n <form\n className=\"relative z-10 w-full\"\n noValidate\n aria-labelledby=\"workspace-onboarding-title\"\n onSubmit={(event) => {\n event.preventDefault();\n event.stopPropagation();\n void form.handleSubmit();\n }}\n >\n <Card className=\"gap-section p-panel shadow-button-neutral\">\n <CardHeader className=\"gap-inline\">\n <CardTitle id=\"workspace-onboarding-title\" variant=\"h1\">\n Create your workspace\n </CardTitle>\n <CardDescription>Give your team a place to collaborate.</CardDescription>\n </CardHeader>\n\n {formError ? (\n <Callout role=\"alert\" type=\"error\">\n {formError}\n </Callout>\n ) : null}\n\n <CardContent className=\"flex flex-col gap-inline\">\n <form.Field\n name=\"name\"\n validators={{\n onBlur: ({value}) =>\n displayNameFieldError(\n value,\n 'Workspace name',\n createWorkspaceBodySchema.shape.name,\n ),\n onSubmit: ({value}) =>\n displayNameFieldError(\n value,\n 'Workspace name',\n createWorkspaceBodySchema.shape.name,\n ),\n }}\n >\n {(field) => (\n <FormField label=\"Workspace name\" id=\"workspace-name\" error={fieldError(field)}>\n <FormFieldInput\n autoComplete=\"organization\"\n name=\"name\"\n placeholder=\"Acme\"\n type=\"text\"\n value={field.state.value}\n onChange={(event) => {\n const name = event.target.value;\n field.handleChange(name);\n if (!slugTouched) {\n form.setFieldValue(\n 'slug',\n name ? slugifyName(name, {fallback: 'workspace'}) : '',\n );\n }\n }}\n onBlur={field.handleBlur}\n />\n </FormField>\n )}\n </form.Field>\n <form.Field\n name=\"slug\"\n validators={{\n onBlur: createWorkspaceBodySchema.shape.slug,\n onSubmit: createWorkspaceBodySchema.shape.slug,\n }}\n >\n {(field) => (\n <SlugField\n id=\"workspace-slug\"\n label=\"Workspace slug\"\n name=\"slug\"\n value={field.state.value}\n onChange={(value) => {\n setSlugTouched(true);\n field.handleChange(value);\n }}\n onBlur={field.handleBlur}\n error={fieldError(field)}\n description={\n <span className=\"break-all font-code\">\n {`${window.location.origin}/w/${field.state.value || 'acme'}`}\n </span>\n }\n placeholder=\"acme\"\n checkEnabled={slugTouched}\n isValid={isSlugValid}\n checkAvailability={checkWorkspaceSlugAvailability}\n />\n )}\n </form.Field>\n </CardContent>\n\n <Button\n className=\"w-full\"\n iconRight=\"chevronRight\"\n isLoading={createWorkspace.isPending}\n type=\"submit\"\n >\n {createWorkspace.isPending ? 'Creating workspace...' : 'Create workspace'}\n </Button>\n </Card>\n </form>\n\n <div className=\"hidden flex-col gap-group lg:flex\" aria-hidden=\"true\">\n <div className=\"grid grid-cols-4 gap-cluster\">\n {previewMetrics.map((metric) => (\n <div\n className=\"rounded-8 border border-border-neutral-base bg-background-neutral-base p-panel-compact shadow-button-neutral\"\n key={metric.label}\n >\n <Text size=\"xs\" className=\"text-foreground-neutral-muted\">\n {metric.label}\n </Text>\n <Text size=\"xl\" bold>\n {metric.value}\n </Text>\n </div>\n ))}\n </div>\n <div className=\"grid grid-cols-2 gap-group\">\n <PreviewPanel title=\"Performance over time\" />\n <PreviewPanel title=\"Duration distribution\" bars />\n </div>\n <div className=\"flex flex-col gap-cluster rounded-8 border border-border-neutral-base bg-background-neutral-base p-panel-compact shadow-button-neutral\">\n <Text size=\"sm\" bold>\n Jobs breakdown\n </Text>\n <div className=\"flex flex-col gap-inline\">\n {[0, 1, 2, 3].map((row) => (\n <div\n className=\"grid grid-cols-[1fr_80px_80px] gap-cluster border-t border-border-neutral-base pt-[10px]\"\n key={row}\n >\n <div className=\"h-12 rounded-full bg-background-neutral-disabled\" />\n <div className=\"h-12 rounded-full bg-background-neutral-disabled\" />\n <div className=\"h-12 rounded-full bg-background-neutral-disabled\" />\n </div>\n ))}\n </div>\n </div>\n </div>\n </section>\n </div>\n </main>\n );\n}\n\nfunction PreviewPanel({title, bars = false}: {title: string; bars?: boolean}) {\n return (\n <div className=\"flex flex-col gap-group rounded-8 border border-border-neutral-base bg-background-neutral-base p-panel-compact shadow-button-neutral\">\n <Text size=\"sm\" bold>\n {title}\n </Text>\n <div className=\"flex h-[220px] items-end gap-inline border-b border-l border-border-neutral-base px-row pb-[10px]\">\n {previewBars.map((bar) => (\n <div\n className={\n bars\n ? 'w-full rounded-t-4 bg-background-neutral-disabled'\n : 'w-full rounded-full bg-background-neutral-disabled'\n }\n key={`${title}-${bar.id}`}\n style={{height: `${bar.height}%`}}\n />\n ))}\n </div>\n </div>\n );\n}\n"],"names":["slugifyName","slugSchema","createWorkspaceBodySchema","displayNameFieldError","SlugField","Button","Callout","Card","CardContent","CardDescription","CardHeader","CardTitle","FormField","FormFieldInput","fieldError","Icon","toast","Text","useForm","useNavigate","useSetAtom","useState","checkWorkspaceSlugAvailability","useCreateWorkspaceAuth","useAuthState","lastWorkspaceIdAtom","rememberLastWorkspaceId","workspaceOnboardingErrorToFormError","previewMetrics","label","value","previewBars","id","height","isSlugValid","safeParse","success","WorkspaceOnboardingPage","createWorkspace","user","navigate","setLastWorkspaceId","formError","setFormError","slugTouched","setSlugTouched","form","defaultValues","name","slug","onSubmit","undefined","command","parse","created","mutateAsync","to","params","workspaceSlug","error","mapped","kind","setFieldMeta","field","previous","errorMap","onServer","message","main","className","div","header","size","bold","section","noValidate","aria-labelledby","event","preventDefault","stopPropagation","handleSubmit","variant","role","type","Field","validators","onBlur","shape","autoComplete","placeholder","state","onChange","target","handleChange","setFieldValue","fallback","handleBlur","description","span","window","location","origin","checkEnabled","isValid","checkAvailability","iconRight","isLoading","isPending","aria-hidden","map","metric","PreviewPanel","title","bars","row","bar","style"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/pages/workspace-onboarding-page.tsx"],"sourcesContent":["import {slugifyName, slugSchema} from '@shipfox/api-common-dto';\nimport {createWorkspaceBodySchema} from '@shipfox/api-workspaces-dto';\nimport {displayNameFieldError, SlugField} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {FormField, FormFieldInput, fieldError} from '@shipfox/react-ui/form-field';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {Panel, PanelBody, PanelHeader, PanelTitle} from '@shipfox/react-ui/panel';\nimport {toast} from '@shipfox/react-ui/toast';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {useForm} from '@tanstack/react-form';\nimport {useNavigate} from '@tanstack/react-router';\nimport {useSetAtom} from 'jotai';\nimport {useState} from 'react';\nimport {checkWorkspaceSlugAvailability, useCreateWorkspaceAuth} from '#hooks/api/workspace-auth.js';\nimport {useAuthState} from '#hooks/use-auth-state.js';\nimport {lastWorkspaceIdAtom, rememberLastWorkspaceId} from '#state/last-workspace.js';\nimport {workspaceOnboardingErrorToFormError} from './form-errors.js';\n\nconst previewMetrics = [\n {label: 'Runs', value: '--'},\n {label: 'Passed', value: '--'},\n {label: 'Failed', value: '--'},\n {label: 'Duration', value: '--'},\n];\nconst previewBars = [\n {id: 'runs-start', height: 32},\n {id: 'runs-mid-low', height: 48},\n {id: 'runs-dip', height: 28},\n {id: 'runs-mid-high', height: 66},\n {id: 'runs-mid', height: 54},\n {id: 'runs-peak', height: 82},\n {id: 'runs-late-low', height: 44},\n {id: 'runs-late-high', height: 74},\n];\n\nfunction isSlugValid(value: string): boolean {\n return slugSchema.safeParse(value).success;\n}\n\nexport function WorkspaceOnboardingPage() {\n const createWorkspace = useCreateWorkspaceAuth();\n const {user} = useAuthState();\n const navigate = useNavigate();\n const setLastWorkspaceId = useSetAtom(lastWorkspaceIdAtom);\n const [formError, setFormError] = useState<string | undefined>();\n const [slugTouched, setSlugTouched] = useState(false);\n\n const form = useForm({\n defaultValues: {name: '', slug: ''},\n onSubmit: async ({value}) => {\n setFormError(undefined);\n try {\n const command = createWorkspaceBodySchema.parse({name: value.name, slug: value.slug});\n const created = await createWorkspace.mutateAsync(command);\n toast.success('Workspace created.');\n // Pin the new workspace as the last-active one so a page refresh and\n // future visits to `/` land on it.\n try {\n setLastWorkspaceId(created.id);\n if (user?.id) rememberLastWorkspaceId(user.id, created.id);\n } catch {\n // localStorage may throw in private browsing or quota-exceeded.\n }\n await navigate({to: '/w/$workspaceSlug', params: {workspaceSlug: created.slug}});\n } catch (error) {\n const mapped = workspaceOnboardingErrorToFormError(error);\n if (mapped.kind === 'field') {\n form.setFieldMeta(mapped.field, (previous) => ({\n ...previous,\n errorMap: {...previous.errorMap, onServer: mapped.message},\n }));\n } else {\n setFormError(mapped.message);\n }\n }\n },\n });\n\n return (\n <main className=\"min-h-screen px-frame py-frame max-[520px]:px-row\">\n <div className=\"mx-auto flex min-h-[calc(100vh-64px)] w-full flex-col gap-section\">\n <header className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-inline\">\n <div className=\"flex size-36 items-center justify-center rounded-8 border border-border-neutral-base bg-background-neutral-base shadow-button-neutral\">\n <Icon name=\"shipfox\" className=\"size-24 text-background-highlight-interactive\" />\n </div>\n <Text size=\"md\" bold>\n Shipfox\n </Text>\n </div>\n </header>\n\n <section className=\"grid flex-1 items-center gap-region lg:grid-cols-[minmax(0,440px)_minmax(0,1fr)]\">\n <form\n className=\"relative z-10 w-full\"\n noValidate\n aria-labelledby=\"workspace-onboarding-title\"\n onSubmit={(event) => {\n event.preventDefault();\n event.stopPropagation();\n void form.handleSubmit();\n }}\n >\n <Panel>\n <PanelHeader variant=\"plain\" className=\"flex-col items-start gap-inline\">\n <PanelTitle id=\"workspace-onboarding-title\" variant=\"h1\">\n Create your workspace\n </PanelTitle>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Give your team a place to collaborate.\n </Text>\n </PanelHeader>\n\n <PanelBody className=\"flex flex-col gap-section p-panel\">\n {formError ? (\n <Callout role=\"alert\" type=\"error\">\n {formError}\n </Callout>\n ) : null}\n\n <div className=\"flex flex-col gap-inline\">\n <form.Field\n name=\"name\"\n validators={{\n onBlur: ({value}) =>\n displayNameFieldError(\n value,\n 'Workspace name',\n createWorkspaceBodySchema.shape.name,\n ),\n onSubmit: ({value}) =>\n displayNameFieldError(\n value,\n 'Workspace name',\n createWorkspaceBodySchema.shape.name,\n ),\n }}\n >\n {(field) => (\n <FormField\n label=\"Workspace name\"\n id=\"workspace-name\"\n error={fieldError(field)}\n >\n <FormFieldInput\n autoComplete=\"organization\"\n name=\"name\"\n placeholder=\"Acme\"\n type=\"text\"\n value={field.state.value}\n onChange={(event) => {\n const name = event.target.value;\n field.handleChange(name);\n if (!slugTouched) {\n form.setFieldValue(\n 'slug',\n name ? slugifyName(name, {fallback: 'workspace'}) : '',\n );\n }\n }}\n onBlur={field.handleBlur}\n />\n </FormField>\n )}\n </form.Field>\n <form.Field\n name=\"slug\"\n validators={{\n onBlur: createWorkspaceBodySchema.shape.slug,\n onSubmit: createWorkspaceBodySchema.shape.slug,\n }}\n >\n {(field) => (\n <SlugField\n id=\"workspace-slug\"\n label=\"Workspace slug\"\n name=\"slug\"\n value={field.state.value}\n onChange={(value) => {\n setSlugTouched(true);\n field.handleChange(value);\n }}\n onBlur={field.handleBlur}\n error={fieldError(field)}\n description={\n <span className=\"break-all font-code\">\n {`${window.location.origin}/w/${field.state.value || 'acme'}`}\n </span>\n }\n placeholder=\"acme\"\n checkEnabled={slugTouched}\n isValid={isSlugValid}\n checkAvailability={checkWorkspaceSlugAvailability}\n />\n )}\n </form.Field>\n </div>\n\n <Button\n className=\"w-full\"\n iconRight=\"chevronRight\"\n isLoading={createWorkspace.isPending}\n type=\"submit\"\n >\n {createWorkspace.isPending ? 'Creating workspace...' : 'Create workspace'}\n </Button>\n </PanelBody>\n </Panel>\n </form>\n\n <div className=\"hidden flex-col gap-group lg:flex\" aria-hidden=\"true\">\n <div className=\"grid grid-cols-4 gap-cluster\">\n {previewMetrics.map((metric) => (\n <div\n className=\"rounded-8 border border-border-neutral-base bg-background-neutral-base p-panel-compact shadow-button-neutral\"\n key={metric.label}\n >\n <Text size=\"xs\" className=\"text-foreground-neutral-muted\">\n {metric.label}\n </Text>\n <Text size=\"xl\" bold>\n {metric.value}\n </Text>\n </div>\n ))}\n </div>\n <div className=\"grid grid-cols-2 gap-group\">\n <PreviewPanel title=\"Performance over time\" />\n <PreviewPanel title=\"Duration distribution\" bars />\n </div>\n <div className=\"flex flex-col gap-cluster rounded-8 border border-border-neutral-base bg-background-neutral-base p-panel-compact shadow-button-neutral\">\n <Text size=\"sm\" bold>\n Jobs breakdown\n </Text>\n <div className=\"flex flex-col gap-inline\">\n {[0, 1, 2, 3].map((row) => (\n <div\n className=\"grid grid-cols-[1fr_80px_80px] gap-cluster border-t border-border-neutral-base pt-[10px]\"\n key={row}\n >\n <div className=\"h-12 rounded-full bg-background-neutral-disabled\" />\n <div className=\"h-12 rounded-full bg-background-neutral-disabled\" />\n <div className=\"h-12 rounded-full bg-background-neutral-disabled\" />\n </div>\n ))}\n </div>\n </div>\n </div>\n </section>\n </div>\n </main>\n );\n}\n\nfunction PreviewPanel({title, bars = false}: {title: string; bars?: boolean}) {\n return (\n <div className=\"flex flex-col gap-group rounded-8 border border-border-neutral-base bg-background-neutral-base p-panel-compact shadow-button-neutral\">\n <Text size=\"sm\" bold>\n {title}\n </Text>\n <div className=\"flex h-[220px] items-end gap-inline border-b border-l border-border-neutral-base px-row pb-[10px]\">\n {previewBars.map((bar) => (\n <div\n className={\n bars\n ? 'w-full rounded-t-4 bg-background-neutral-disabled'\n : 'w-full rounded-full bg-background-neutral-disabled'\n }\n key={`${title}-${bar.id}`}\n style={{height: `${bar.height}%`}}\n />\n ))}\n </div>\n </div>\n );\n}\n"],"names":["slugifyName","slugSchema","createWorkspaceBodySchema","displayNameFieldError","SlugField","Button","Callout","FormField","FormFieldInput","fieldError","Icon","Panel","PanelBody","PanelHeader","PanelTitle","toast","Text","useForm","useNavigate","useSetAtom","useState","checkWorkspaceSlugAvailability","useCreateWorkspaceAuth","useAuthState","lastWorkspaceIdAtom","rememberLastWorkspaceId","workspaceOnboardingErrorToFormError","previewMetrics","label","value","previewBars","id","height","isSlugValid","safeParse","success","WorkspaceOnboardingPage","createWorkspace","user","navigate","setLastWorkspaceId","formError","setFormError","slugTouched","setSlugTouched","form","defaultValues","name","slug","onSubmit","undefined","command","parse","created","mutateAsync","to","params","workspaceSlug","error","mapped","kind","setFieldMeta","field","previous","errorMap","onServer","message","main","className","div","header","size","bold","section","noValidate","aria-labelledby","event","preventDefault","stopPropagation","handleSubmit","variant","role","type","Field","validators","onBlur","shape","autoComplete","placeholder","state","onChange","target","handleChange","setFieldValue","fallback","handleBlur","description","span","window","location","origin","checkEnabled","isValid","checkAvailability","iconRight","isLoading","isPending","aria-hidden","map","metric","PreviewPanel","title","bars","row","bar","style"],"mappings":"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"}
|
package/dist/routes/index.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { RouterContext } from '@shipfox/client-shell/runtime';
|
|
2
2
|
import { FullPageLoader } from '@shipfox/react-ui/loader';
|
|
3
3
|
declare const _default: import("@shipfox/client-shell/runtime").RouteImpl<{
|
|
4
|
+
readonly staticData: {
|
|
5
|
+
readonly frame: "focused";
|
|
6
|
+
};
|
|
4
7
|
readonly beforeLoad: ({ context }: {
|
|
5
8
|
context: RouterContext;
|
|
6
9
|
}) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/routes/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,+BAA+B,CAAC;AAEjE,OAAO,EAAC,cAAc,EAAC,MAAM,0BAA0B,CAAC
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/routes/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,+BAA+B,CAAC;AAEjE,OAAO,EAAC,cAAc,EAAC,MAAM,0BAA0B,CAAC;;;;;uCAK9B;QAAC,OAAO,EAAE,aAAa,CAAA;KAAC"}
|
package/dist/routes/index.js
CHANGED
|
@@ -2,6 +2,9 @@ import { defineRoute, getLastWorkspaceId } from '@shipfox/client-shell/runtime';
|
|
|
2
2
|
import { FullPageLoader } from '@shipfox/react-ui/loader';
|
|
3
3
|
import { redirect } from '@tanstack/react-router';
|
|
4
4
|
export default defineRoute({
|
|
5
|
+
staticData: {
|
|
6
|
+
frame: 'focused'
|
|
7
|
+
},
|
|
5
8
|
beforeLoad: ({ context })=>{
|
|
6
9
|
const auth = context.auth;
|
|
7
10
|
if (!auth || auth.isLoading) return;
|
package/dist/routes/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/routes/index.tsx"],"sourcesContent":["import type {RouterContext} from '@shipfox/client-shell/runtime';\nimport {defineRoute, getLastWorkspaceId} from '@shipfox/client-shell/runtime';\nimport {FullPageLoader} from '@shipfox/react-ui/loader';\nimport {redirect} from '@tanstack/react-router';\n\nexport default defineRoute({\n beforeLoad: ({context}: {context: RouterContext}) => {\n const auth = context.auth;\n if (!auth || auth.isLoading) return;\n if (!auth.isAuthenticated) throw redirect({to: '/auth/login'});\n const [first, ...rest] = auth.workspaces;\n if (!first) throw redirect({to: '/setup/workspaces/new'});\n const principalId = auth.user?.id;\n const target = principalId\n ? [first, ...rest].find((workspace) => workspace.id === getLastWorkspaceId(principalId))\n : undefined;\n throw redirect({\n to: '/w/$workspaceSlug',\n params: {workspaceSlug: (target ?? first).slug},\n });\n },\n component: FullPageLoader,\n});\n"],"names":["defineRoute","getLastWorkspaceId","FullPageLoader","redirect","beforeLoad","context","auth","isLoading","isAuthenticated","to","first","rest","workspaces","principalId","user","id","target","find","workspace","undefined","params","workspaceSlug","slug","component"],"mappings":"AACA,SAAQA,WAAW,EAAEC,kBAAkB,QAAO,gCAAgC;AAC9E,SAAQC,cAAc,QAAO,2BAA2B;AACxD,SAAQC,QAAQ,QAAO,yBAAyB;AAEhD,eAAeH,YAAY;IACzBI,YAAY,CAAC,EAACC,OAAO,EAA2B;QAC9C,MAAMC,OAAOD,QAAQC,IAAI;QACzB,IAAI,CAACA,QAAQA,KAAKC,SAAS,EAAE;QAC7B,IAAI,CAACD,KAAKE,eAAe,EAAE,
|
|
1
|
+
{"version":3,"sources":["../../src/routes/index.tsx"],"sourcesContent":["import type {RouterContext} from '@shipfox/client-shell/runtime';\nimport {defineRoute, getLastWorkspaceId} from '@shipfox/client-shell/runtime';\nimport {FullPageLoader} from '@shipfox/react-ui/loader';\nimport {redirect} from '@tanstack/react-router';\n\nexport default defineRoute({\n staticData: {frame: 'focused'},\n beforeLoad: ({context}: {context: RouterContext}) => {\n const auth = context.auth;\n if (!auth || auth.isLoading) return;\n if (!auth.isAuthenticated) throw redirect({to: '/auth/login'});\n const [first, ...rest] = auth.workspaces;\n if (!first) throw redirect({to: '/setup/workspaces/new'});\n const principalId = auth.user?.id;\n const target = principalId\n ? [first, ...rest].find((workspace) => workspace.id === getLastWorkspaceId(principalId))\n : undefined;\n throw redirect({\n to: '/w/$workspaceSlug',\n params: {workspaceSlug: (target ?? first).slug},\n });\n },\n component: FullPageLoader,\n});\n"],"names":["defineRoute","getLastWorkspaceId","FullPageLoader","redirect","staticData","frame","beforeLoad","context","auth","isLoading","isAuthenticated","to","first","rest","workspaces","principalId","user","id","target","find","workspace","undefined","params","workspaceSlug","slug","component"],"mappings":"AACA,SAAQA,WAAW,EAAEC,kBAAkB,QAAO,gCAAgC;AAC9E,SAAQC,cAAc,QAAO,2BAA2B;AACxD,SAAQC,QAAQ,QAAO,yBAAyB;AAEhD,eAAeH,YAAY;IACzBI,YAAY;QAACC,OAAO;IAAS;IAC7BC,YAAY,CAAC,EAACC,OAAO,EAA2B;QAC9C,MAAMC,OAAOD,QAAQC,IAAI;QACzB,IAAI,CAACA,QAAQA,KAAKC,SAAS,EAAE;QAC7B,IAAI,CAACD,KAAKE,eAAe,EAAE,MAAMP,SAAS;YAACQ,IAAI;QAAa;QAC5D,MAAM,CAACC,OAAO,GAAGC,KAAK,GAAGL,KAAKM,UAAU;QACxC,IAAI,CAACF,OAAO,MAAMT,SAAS;YAACQ,IAAI;QAAuB;QACvD,MAAMI,cAAcP,KAAKQ,IAAI,EAAEC;QAC/B,MAAMC,SAASH,cACX;YAACH;eAAUC;SAAK,CAACM,IAAI,CAAC,CAACC,YAAcA,UAAUH,EAAE,KAAKhB,mBAAmBc,gBACzEM;QACJ,MAAMlB,SAAS;YACbQ,IAAI;YACJW,QAAQ;gBAACC,eAAe,AAACL,CAAAA,UAAUN,KAAI,EAAGY,IAAI;YAAA;QAChD;IACF;IACAC,WAAWvB;AACb,GAAG"}
|
package/dist/routes/login.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { validateRedirectSearch } from './inputs.js';
|
|
2
2
|
declare const _default: import("@shipfox/client-shell/runtime").RouteImpl<{
|
|
3
|
+
readonly staticData: {
|
|
4
|
+
readonly frame: "focused";
|
|
5
|
+
};
|
|
3
6
|
readonly validateSearch: typeof validateRedirectSearch;
|
|
4
7
|
readonly component: () => import("react").JSX.Element;
|
|
5
8
|
}>;
|
package/dist/routes/login.js
CHANGED
|
@@ -4,6 +4,9 @@ import { GuestGuard } from '#components/auth-guard.js';
|
|
|
4
4
|
import { LoginPage } from '#pages/login-page.js';
|
|
5
5
|
import { validateRedirectSearch } from './inputs.js';
|
|
6
6
|
export default defineRoute({
|
|
7
|
+
staticData: {
|
|
8
|
+
frame: 'focused'
|
|
9
|
+
},
|
|
7
10
|
validateSearch: validateRedirectSearch,
|
|
8
11
|
component: ()=>/*#__PURE__*/ _jsx(GuestGuard, {
|
|
9
12
|
children: /*#__PURE__*/ _jsx(LoginPage, {})
|
package/dist/routes/login.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/routes/login.tsx"],"sourcesContent":["import {defineRoute} from '@shipfox/client-shell/runtime';\nimport {GuestGuard} from '#components/auth-guard.js';\nimport {LoginPage} from '#pages/login-page.js';\nimport {validateRedirectSearch} from './inputs.js';\n\nexport default defineRoute({\n validateSearch: validateRedirectSearch,\n component: () => (\n <GuestGuard>\n <LoginPage />\n </GuestGuard>\n ),\n});\n"],"names":["defineRoute","GuestGuard","LoginPage","validateRedirectSearch","validateSearch","component"],"mappings":";AAAA,SAAQA,WAAW,QAAO,gCAAgC;AAC1D,SAAQC,UAAU,QAAO,4BAA4B;AACrD,SAAQC,SAAS,QAAO,uBAAuB;AAC/C,SAAQC,sBAAsB,QAAO,cAAc;AAEnD,eAAeH,YAAY;IACzBI,
|
|
1
|
+
{"version":3,"sources":["../../src/routes/login.tsx"],"sourcesContent":["import {defineRoute} from '@shipfox/client-shell/runtime';\nimport {GuestGuard} from '#components/auth-guard.js';\nimport {LoginPage} from '#pages/login-page.js';\nimport {validateRedirectSearch} from './inputs.js';\n\nexport default defineRoute({\n staticData: {frame: 'focused'},\n validateSearch: validateRedirectSearch,\n component: () => (\n <GuestGuard>\n <LoginPage />\n </GuestGuard>\n ),\n});\n"],"names":["defineRoute","GuestGuard","LoginPage","validateRedirectSearch","staticData","frame","validateSearch","component"],"mappings":";AAAA,SAAQA,WAAW,QAAO,gCAAgC;AAC1D,SAAQC,UAAU,QAAO,4BAA4B;AACrD,SAAQC,SAAS,QAAO,uBAAuB;AAC/C,SAAQC,sBAAsB,QAAO,cAAc;AAEnD,eAAeH,YAAY;IACzBI,YAAY;QAACC,OAAO;IAAS;IAC7BC,gBAAgBH;IAChBI,WAAW,kBACT,KAACN;sBACC,cAAA,KAACC;;AAGP,GAAG"}
|
package/dist/routes/logout.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { LogoutPage } from '#pages/logout-page.js';
|
|
2
2
|
import { validateRedirectSearch } from './inputs.js';
|
|
3
3
|
declare const _default: import("@shipfox/client-shell/runtime").RouteImpl<{
|
|
4
|
+
readonly staticData: {
|
|
5
|
+
readonly frame: "focused";
|
|
6
|
+
};
|
|
4
7
|
readonly validateSearch: typeof validateRedirectSearch;
|
|
5
8
|
readonly component: typeof LogoutPage;
|
|
6
9
|
}>;
|
package/dist/routes/logout.js
CHANGED
|
@@ -2,6 +2,9 @@ import { defineRoute } from '@shipfox/client-shell/runtime';
|
|
|
2
2
|
import { LogoutPage } from '#pages/logout-page.js';
|
|
3
3
|
import { validateRedirectSearch } from './inputs.js';
|
|
4
4
|
export default defineRoute({
|
|
5
|
+
staticData: {
|
|
6
|
+
frame: 'focused'
|
|
7
|
+
},
|
|
5
8
|
validateSearch: validateRedirectSearch,
|
|
6
9
|
component: LogoutPage
|
|
7
10
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/routes/logout.tsx"],"sourcesContent":["import {defineRoute} from '@shipfox/client-shell/runtime';\nimport {LogoutPage} from '#pages/logout-page.js';\nimport {validateRedirectSearch} from './inputs.js';\n\nexport default defineRoute({validateSearch: validateRedirectSearch
|
|
1
|
+
{"version":3,"sources":["../../src/routes/logout.tsx"],"sourcesContent":["import {defineRoute} from '@shipfox/client-shell/runtime';\nimport {LogoutPage} from '#pages/logout-page.js';\nimport {validateRedirectSearch} from './inputs.js';\n\nexport default defineRoute({\n staticData: {frame: 'focused'},\n validateSearch: validateRedirectSearch,\n component: LogoutPage,\n});\n"],"names":["defineRoute","LogoutPage","validateRedirectSearch","staticData","frame","validateSearch","component"],"mappings":"AAAA,SAAQA,WAAW,QAAO,gCAAgC;AAC1D,SAAQC,UAAU,QAAO,wBAAwB;AACjD,SAAQC,sBAAsB,QAAO,cAAc;AAEnD,eAAeF,YAAY;IACzBG,YAAY;QAACC,OAAO;IAAS;IAC7BC,gBAAgBH;IAChBI,WAAWL;AACb,GAAG"}
|
package/dist/routes/reset.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { validatePasswordResetSearch } from './inputs.js';
|
|
2
2
|
declare const _default: import("@shipfox/client-shell/runtime").RouteImpl<{
|
|
3
|
+
readonly staticData: {
|
|
4
|
+
readonly frame: "focused";
|
|
5
|
+
};
|
|
3
6
|
readonly validateSearch: typeof validatePasswordResetSearch;
|
|
4
7
|
readonly component: () => import("react").JSX.Element;
|
|
5
8
|
}>;
|
package/dist/routes/reset.js
CHANGED
|
@@ -4,6 +4,9 @@ import { GuestGuard } from '#components/auth-guard.js';
|
|
|
4
4
|
import { PasswordResetPage } from '#pages/password-reset-page.js';
|
|
5
5
|
import { validatePasswordResetSearch } from './inputs.js';
|
|
6
6
|
export default defineRoute({
|
|
7
|
+
staticData: {
|
|
8
|
+
frame: 'focused'
|
|
9
|
+
},
|
|
7
10
|
validateSearch: validatePasswordResetSearch,
|
|
8
11
|
component: ()=>/*#__PURE__*/ _jsx(GuestGuard, {
|
|
9
12
|
children: /*#__PURE__*/ _jsx(PasswordResetPage, {})
|
package/dist/routes/reset.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/routes/reset.tsx"],"sourcesContent":["import {defineRoute} from '@shipfox/client-shell/runtime';\nimport {GuestGuard} from '#components/auth-guard.js';\nimport {PasswordResetPage} from '#pages/password-reset-page.js';\nimport {validatePasswordResetSearch} from './inputs.js';\n\nexport default defineRoute({\n validateSearch: validatePasswordResetSearch,\n component: () => (\n <GuestGuard>\n <PasswordResetPage />\n </GuestGuard>\n ),\n});\n"],"names":["defineRoute","GuestGuard","PasswordResetPage","validatePasswordResetSearch","validateSearch","component"],"mappings":";AAAA,SAAQA,WAAW,QAAO,gCAAgC;AAC1D,SAAQC,UAAU,QAAO,4BAA4B;AACrD,SAAQC,iBAAiB,QAAO,gCAAgC;AAChE,SAAQC,2BAA2B,QAAO,cAAc;AAExD,eAAeH,YAAY;IACzBI,
|
|
1
|
+
{"version":3,"sources":["../../src/routes/reset.tsx"],"sourcesContent":["import {defineRoute} from '@shipfox/client-shell/runtime';\nimport {GuestGuard} from '#components/auth-guard.js';\nimport {PasswordResetPage} from '#pages/password-reset-page.js';\nimport {validatePasswordResetSearch} from './inputs.js';\n\nexport default defineRoute({\n staticData: {frame: 'focused'},\n validateSearch: validatePasswordResetSearch,\n component: () => (\n <GuestGuard>\n <PasswordResetPage />\n </GuestGuard>\n ),\n});\n"],"names":["defineRoute","GuestGuard","PasswordResetPage","validatePasswordResetSearch","staticData","frame","validateSearch","component"],"mappings":";AAAA,SAAQA,WAAW,QAAO,gCAAgC;AAC1D,SAAQC,UAAU,QAAO,4BAA4B;AACrD,SAAQC,iBAAiB,QAAO,gCAAgC;AAChE,SAAQC,2BAA2B,QAAO,cAAc;AAExD,eAAeH,YAAY;IACzBI,YAAY;QAACC,OAAO;IAAS;IAC7BC,gBAAgBH;IAChBI,WAAW,kBACT,KAACN;sBACC,cAAA,KAACC;;AAGP,GAAG"}
|
package/dist/routes/signup.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { validateRedirectSearch } from './inputs.js';
|
|
2
2
|
declare const _default: import("@shipfox/client-shell/runtime").RouteImpl<{
|
|
3
|
+
readonly staticData: {
|
|
4
|
+
readonly frame: "focused";
|
|
5
|
+
};
|
|
3
6
|
readonly validateSearch: typeof validateRedirectSearch;
|
|
4
7
|
readonly component: () => import("react").JSX.Element;
|
|
5
8
|
}>;
|
package/dist/routes/signup.js
CHANGED
|
@@ -4,6 +4,9 @@ import { GuestGuard } from '#components/auth-guard.js';
|
|
|
4
4
|
import { SignupPage } from '#pages/signup-page.js';
|
|
5
5
|
import { validateRedirectSearch } from './inputs.js';
|
|
6
6
|
export default defineRoute({
|
|
7
|
+
staticData: {
|
|
8
|
+
frame: 'focused'
|
|
9
|
+
},
|
|
7
10
|
validateSearch: validateRedirectSearch,
|
|
8
11
|
component: ()=>/*#__PURE__*/ _jsx(GuestGuard, {
|
|
9
12
|
children: /*#__PURE__*/ _jsx(SignupPage, {})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/routes/signup.tsx"],"sourcesContent":["import {defineRoute} from '@shipfox/client-shell/runtime';\nimport {GuestGuard} from '#components/auth-guard.js';\nimport {SignupPage} from '#pages/signup-page.js';\nimport {validateRedirectSearch} from './inputs.js';\n\nexport default defineRoute({\n validateSearch: validateRedirectSearch,\n component: () => (\n <GuestGuard>\n <SignupPage />\n </GuestGuard>\n ),\n});\n"],"names":["defineRoute","GuestGuard","SignupPage","validateRedirectSearch","validateSearch","component"],"mappings":";AAAA,SAAQA,WAAW,QAAO,gCAAgC;AAC1D,SAAQC,UAAU,QAAO,4BAA4B;AACrD,SAAQC,UAAU,QAAO,wBAAwB;AACjD,SAAQC,sBAAsB,QAAO,cAAc;AAEnD,eAAeH,YAAY;IACzBI,
|
|
1
|
+
{"version":3,"sources":["../../src/routes/signup.tsx"],"sourcesContent":["import {defineRoute} from '@shipfox/client-shell/runtime';\nimport {GuestGuard} from '#components/auth-guard.js';\nimport {SignupPage} from '#pages/signup-page.js';\nimport {validateRedirectSearch} from './inputs.js';\n\nexport default defineRoute({\n staticData: {frame: 'focused'},\n validateSearch: validateRedirectSearch,\n component: () => (\n <GuestGuard>\n <SignupPage />\n </GuestGuard>\n ),\n});\n"],"names":["defineRoute","GuestGuard","SignupPage","validateRedirectSearch","staticData","frame","validateSearch","component"],"mappings":";AAAA,SAAQA,WAAW,QAAO,gCAAgC;AAC1D,SAAQC,UAAU,QAAO,4BAA4B;AACrD,SAAQC,UAAU,QAAO,wBAAwB;AACjD,SAAQC,sBAAsB,QAAO,cAAc;AAEnD,eAAeH,YAAY;IACzBI,YAAY;QAACC,OAAO;IAAS;IAC7BC,gBAAgBH;IAChBI,WAAW,kBACT,KAACN;sBACC,cAAA,KAACC;;AAGP,GAAG"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { RouterContext } from '@shipfox/client-shell/runtime';
|
|
2
2
|
import { WorkspaceOnboardingPage } from '#pages/workspace-onboarding-page.js';
|
|
3
3
|
declare const _default: import("@shipfox/client-shell/runtime").RouteImpl<{
|
|
4
|
+
readonly staticData: {
|
|
5
|
+
readonly frame: "focused";
|
|
6
|
+
};
|
|
4
7
|
readonly beforeLoad: ({ context, location }: {
|
|
5
8
|
context: RouterContext;
|
|
6
9
|
location: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-onboarding.d.ts","sourceRoot":"","sources":["../../src/routes/workspace-onboarding.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,+BAA+B,CAAC;AAGjE,OAAO,EAAC,uBAAuB,EAAC,MAAM,qCAAqC,CAAC
|
|
1
|
+
{"version":3,"file":"workspace-onboarding.d.ts","sourceRoot":"","sources":["../../src/routes/workspace-onboarding.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,+BAA+B,CAAC;AAGjE,OAAO,EAAC,uBAAuB,EAAC,MAAM,qCAAqC,CAAC;;;;;iDAIxC;QAAC,OAAO,EAAE,aAAa,CAAC;QAAC,QAAQ,EAAE;YAAC,IAAI,EAAE,MAAM,CAAA;SAAC,CAAA;KAAC"}
|
|
@@ -2,6 +2,9 @@ import { defineRoute } from '@shipfox/client-shell/runtime';
|
|
|
2
2
|
import { redirect } from '@tanstack/react-router';
|
|
3
3
|
import { WorkspaceOnboardingPage } from '#pages/workspace-onboarding-page.js';
|
|
4
4
|
export default defineRoute({
|
|
5
|
+
staticData: {
|
|
6
|
+
frame: 'focused'
|
|
7
|
+
},
|
|
5
8
|
beforeLoad: ({ context, location })=>{
|
|
6
9
|
const auth = context.auth;
|
|
7
10
|
if (!auth || auth.isLoading) return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/routes/workspace-onboarding.tsx"],"sourcesContent":["import type {RouterContext} from '@shipfox/client-shell/runtime';\nimport {defineRoute} from '@shipfox/client-shell/runtime';\nimport {redirect} from '@tanstack/react-router';\nimport {WorkspaceOnboardingPage} from '#pages/workspace-onboarding-page.js';\n\nexport default defineRoute({\n beforeLoad: ({context, location}: {context: RouterContext; location: {href: string}}) => {\n const auth = context.auth;\n if (!auth || auth.isLoading) return;\n if (!auth.isAuthenticated)\n throw redirect({to: '/auth/login', search: {redirect: location.href}});\n },\n component: WorkspaceOnboardingPage,\n});\n"],"names":["defineRoute","redirect","WorkspaceOnboardingPage","beforeLoad","context","location","auth","isLoading","isAuthenticated","to","search","href","component"],"mappings":"AACA,SAAQA,WAAW,QAAO,gCAAgC;AAC1D,SAAQC,QAAQ,QAAO,yBAAyB;AAChD,SAAQC,uBAAuB,QAAO,sCAAsC;AAE5E,eAAeF,YAAY;IACzBG,YAAY,CAAC,EAACC,OAAO,EAAEC,QAAQ,EAAqD;QAClF,MAAMC,OAAOF,QAAQE,IAAI;QACzB,IAAI,CAACA,QAAQA,KAAKC,SAAS,EAAE;QAC7B,IAAI,CAACD,KAAKE,eAAe,EACvB,
|
|
1
|
+
{"version":3,"sources":["../../src/routes/workspace-onboarding.tsx"],"sourcesContent":["import type {RouterContext} from '@shipfox/client-shell/runtime';\nimport {defineRoute} from '@shipfox/client-shell/runtime';\nimport {redirect} from '@tanstack/react-router';\nimport {WorkspaceOnboardingPage} from '#pages/workspace-onboarding-page.js';\n\nexport default defineRoute({\n staticData: {frame: 'focused'},\n beforeLoad: ({context, location}: {context: RouterContext; location: {href: string}}) => {\n const auth = context.auth;\n if (!auth || auth.isLoading) return;\n if (!auth.isAuthenticated)\n throw redirect({to: '/auth/login', search: {redirect: location.href}});\n },\n component: WorkspaceOnboardingPage,\n});\n"],"names":["defineRoute","redirect","WorkspaceOnboardingPage","staticData","frame","beforeLoad","context","location","auth","isLoading","isAuthenticated","to","search","href","component"],"mappings":"AACA,SAAQA,WAAW,QAAO,gCAAgC;AAC1D,SAAQC,QAAQ,QAAO,yBAAyB;AAChD,SAAQC,uBAAuB,QAAO,sCAAsC;AAE5E,eAAeF,YAAY;IACzBG,YAAY;QAACC,OAAO;IAAS;IAC7BC,YAAY,CAAC,EAACC,OAAO,EAAEC,QAAQ,EAAqD;QAClF,MAAMC,OAAOF,QAAQE,IAAI;QACzB,IAAI,CAACA,QAAQA,KAAKC,SAAS,EAAE;QAC7B,IAAI,CAACD,KAAKE,eAAe,EACvB,MAAMT,SAAS;YAACU,IAAI;YAAeC,QAAQ;gBAACX,UAAUM,SAASM,IAAI;YAAA;QAAC;IACxE;IACAC,WAAWZ;AACb,GAAG"}
|