@kelpie/ui 0.4.0 → 0.5.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.
Files changed (140) hide show
  1. package/dist/api/resources/account.d.ts +5 -0
  2. package/dist/api/resources/account.d.ts.map +1 -1
  3. package/dist/api/resources/account.js +11 -0
  4. package/dist/api/resources/account.js.map +1 -1
  5. package/dist/api/resources/apiKeys.d.ts +15 -0
  6. package/dist/api/resources/apiKeys.d.ts.map +1 -0
  7. package/dist/api/resources/apiKeys.js +50 -0
  8. package/dist/api/resources/apiKeys.js.map +1 -0
  9. package/dist/api/resources/invites.d.ts +0 -2
  10. package/dist/api/resources/invites.d.ts.map +1 -1
  11. package/dist/api/resources/invites.js +5 -10
  12. package/dist/api/resources/invites.js.map +1 -1
  13. package/dist/api/resources/session.d.ts +17 -3
  14. package/dist/api/resources/session.d.ts.map +1 -1
  15. package/dist/api/resources/session.js +34 -6
  16. package/dist/api/resources/session.js.map +1 -1
  17. package/dist/app/KelpieApp.d.ts.map +1 -1
  18. package/dist/app/KelpieApp.js +5 -1
  19. package/dist/app/KelpieApp.js.map +1 -1
  20. package/dist/app/SessionGate.d.ts +6 -2
  21. package/dist/app/SessionGate.d.ts.map +1 -1
  22. package/dist/app/SessionGate.js +10 -3
  23. package/dist/app/SessionGate.js.map +1 -1
  24. package/dist/components/ActivitiesPanel.d.ts.map +1 -1
  25. package/dist/components/ActivitiesPanel.js +10 -7
  26. package/dist/components/ActivitiesPanel.js.map +1 -1
  27. package/dist/components/ApiKeysPanel.d.ts +20 -0
  28. package/dist/components/ApiKeysPanel.d.ts.map +1 -0
  29. package/dist/components/ApiKeysPanel.js +70 -0
  30. package/dist/components/ApiKeysPanel.js.map +1 -0
  31. package/dist/components/DecisionsPanel.d.ts.map +1 -1
  32. package/dist/components/DecisionsPanel.js +3 -1
  33. package/dist/components/DecisionsPanel.js.map +1 -1
  34. package/dist/components/NotesPanel.d.ts.map +1 -1
  35. package/dist/components/NotesPanel.js +3 -1
  36. package/dist/components/NotesPanel.js.map +1 -1
  37. package/dist/components/Shell.d.ts.map +1 -1
  38. package/dist/components/Shell.js +1 -0
  39. package/dist/components/Shell.js.map +1 -1
  40. package/dist/index.d.ts +1 -1
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +1 -1
  43. package/dist/index.js.map +1 -1
  44. package/dist/lib/dates.d.ts +25 -5
  45. package/dist/lib/dates.d.ts.map +1 -1
  46. package/dist/lib/dates.js +49 -20
  47. package/dist/lib/dates.js.map +1 -1
  48. package/dist/pages/DecisionsPage.d.ts.map +1 -1
  49. package/dist/pages/DecisionsPage.js +4 -2
  50. package/dist/pages/DecisionsPage.js.map +1 -1
  51. package/dist/pages/HiringPage.d.ts.map +1 -1
  52. package/dist/pages/HiringPage.js +3 -1
  53. package/dist/pages/HiringPage.js.map +1 -1
  54. package/dist/pages/PlanningPage.js +1 -1
  55. package/dist/pages/PlanningPage.js.map +1 -1
  56. package/dist/pages/account/AccountLayout.d.ts.map +1 -1
  57. package/dist/pages/account/AccountLayout.js +1 -0
  58. package/dist/pages/account/AccountLayout.js.map +1 -1
  59. package/dist/pages/account/PersonalApiKeysPage.d.ts +9 -0
  60. package/dist/pages/account/PersonalApiKeysPage.d.ts.map +1 -0
  61. package/dist/pages/account/PersonalApiKeysPage.js +14 -0
  62. package/dist/pages/account/PersonalApiKeysPage.js.map +1 -0
  63. package/dist/pages/account/PreferencesPage.js +1 -1
  64. package/dist/pages/account/PreferencesPage.js.map +1 -1
  65. package/dist/pages/account/SecurityPage.d.ts.map +1 -1
  66. package/dist/pages/account/SecurityPage.js +3 -2
  67. package/dist/pages/account/SecurityPage.js.map +1 -1
  68. package/dist/pages/admin/ApiKeysPage.d.ts +9 -0
  69. package/dist/pages/admin/ApiKeysPage.d.ts.map +1 -0
  70. package/dist/pages/admin/ApiKeysPage.js +20 -0
  71. package/dist/pages/admin/ApiKeysPage.js.map +1 -0
  72. package/dist/pages/admin/McpPage.d.ts.map +1 -1
  73. package/dist/pages/admin/McpPage.js +6 -3
  74. package/dist/pages/admin/McpPage.js.map +1 -1
  75. package/dist/pages/admin/WebhookDeliveries.d.ts.map +1 -1
  76. package/dist/pages/admin/WebhookDeliveries.js +4 -2
  77. package/dist/pages/admin/WebhookDeliveries.js.map +1 -1
  78. package/dist/pages/admin/WebhooksPage.d.ts.map +1 -1
  79. package/dist/pages/admin/WebhooksPage.js +5 -3
  80. package/dist/pages/admin/WebhooksPage.js.map +1 -1
  81. package/dist/pages/auth/ForgotPasswordPage.js +2 -2
  82. package/dist/pages/auth/ForgotPasswordPage.js.map +1 -1
  83. package/dist/pages/auth/SignUpPage.d.ts +5 -3
  84. package/dist/pages/auth/SignUpPage.d.ts.map +1 -1
  85. package/dist/pages/auth/SignUpPage.js +12 -6
  86. package/dist/pages/auth/SignUpPage.js.map +1 -1
  87. package/dist/pages/auth/VerifyEmailConfirmPage.d.ts +9 -0
  88. package/dist/pages/auth/VerifyEmailConfirmPage.d.ts.map +1 -0
  89. package/dist/pages/auth/VerifyEmailConfirmPage.js +58 -0
  90. package/dist/pages/auth/VerifyEmailConfirmPage.js.map +1 -0
  91. package/dist/pages/auth/VerifyEmailPendingPage.d.ts +10 -0
  92. package/dist/pages/auth/VerifyEmailPendingPage.d.ts.map +1 -0
  93. package/dist/pages/auth/VerifyEmailPendingPage.js +35 -0
  94. package/dist/pages/auth/VerifyEmailPendingPage.js.map +1 -0
  95. package/dist/pages/dashboard/DashboardPage.d.ts.map +1 -1
  96. package/dist/pages/dashboard/DashboardPage.js +6 -4
  97. package/dist/pages/dashboard/DashboardPage.js.map +1 -1
  98. package/dist/pages/dashboard/sections.d.ts +6 -3
  99. package/dist/pages/dashboard/sections.d.ts.map +1 -1
  100. package/dist/pages/dashboard/sections.js +6 -6
  101. package/dist/pages/dashboard/sections.js.map +1 -1
  102. package/dist/pages/forms/SubmissionsTable.d.ts.map +1 -1
  103. package/dist/pages/forms/SubmissionsTable.js +3 -1
  104. package/dist/pages/forms/SubmissionsTable.js.map +1 -1
  105. package/dist/pages/handbook/HandbookPage.d.ts.map +1 -1
  106. package/dist/pages/handbook/HandbookPage.js +3 -1
  107. package/dist/pages/handbook/HandbookPage.js.map +1 -1
  108. package/package.json +2 -2
  109. package/src/api/resources/account.ts +13 -0
  110. package/src/api/resources/apiKeys.ts +60 -0
  111. package/src/api/resources/invites.ts +5 -15
  112. package/src/api/resources/session.ts +42 -6
  113. package/src/app/KelpieApp.tsx +11 -2
  114. package/src/app/SessionGate.tsx +11 -3
  115. package/src/components/ActivitiesPanel.tsx +15 -4
  116. package/src/components/ApiKeysPanel.tsx +307 -0
  117. package/src/components/DecisionsPanel.tsx +5 -2
  118. package/src/components/NotesPanel.tsx +4 -1
  119. package/src/components/Shell.tsx +1 -0
  120. package/src/index.ts +0 -1
  121. package/src/lib/dates.ts +54 -20
  122. package/src/pages/DecisionsPage.tsx +6 -2
  123. package/src/pages/HiringPage.tsx +3 -1
  124. package/src/pages/PlanningPage.tsx +1 -1
  125. package/src/pages/account/AccountLayout.tsx +1 -0
  126. package/src/pages/account/PersonalApiKeysPage.tsx +27 -0
  127. package/src/pages/account/PreferencesPage.tsx +1 -1
  128. package/src/pages/account/SecurityPage.tsx +4 -1
  129. package/src/pages/admin/ApiKeysPage.tsx +43 -0
  130. package/src/pages/admin/McpPage.tsx +7 -4
  131. package/src/pages/admin/WebhookDeliveries.tsx +4 -2
  132. package/src/pages/admin/WebhooksPage.tsx +5 -3
  133. package/src/pages/auth/ForgotPasswordPage.tsx +2 -2
  134. package/src/pages/auth/SignUpPage.tsx +12 -6
  135. package/src/pages/auth/VerifyEmailConfirmPage.tsx +81 -0
  136. package/src/pages/auth/VerifyEmailPendingPage.tsx +65 -0
  137. package/src/pages/dashboard/DashboardPage.tsx +14 -4
  138. package/src/pages/dashboard/sections.tsx +9 -3
  139. package/src/pages/forms/SubmissionsTable.tsx +3 -1
  140. package/src/pages/handbook/HandbookPage.tsx +3 -1
@@ -1 +1 @@
1
- {"version":3,"file":"HandbookPage.js","sourceRoot":"","sources":["../../../src/pages/handbook/HandbookPage.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"HandbookPage.js","sourceRoot":"","sources":["../../../src/pages/handbook/HandbookPage.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kelpie/ui",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "React UI for Kelpie: components, pages, API client, and the extension registry an assembly composes modules through.",
5
5
  "keywords": [
6
6
  "kelpie",
@@ -48,7 +48,7 @@
48
48
  "@dnd-kit/core": "^6.3.1",
49
49
  "@dnd-kit/sortable": "^10.0.0",
50
50
  "@dnd-kit/utilities": "^3.2.2",
51
- "@kelpie/schemas": "^0.4.0",
51
+ "@kelpie/schemas": "^0.5.0",
52
52
  "@tanstack/react-query": "^5.101.4",
53
53
  "react-markdown": "^10.1.0",
54
54
  "react-router": "^8.3.0",
@@ -18,11 +18,13 @@ import type {
18
18
  import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
19
19
  import { useEffect, useState } from 'react'
20
20
 
21
+ import { resolveTimezone } from '../../lib/dates.ts'
21
22
  import { applyTheme, getStoredTheme, setStoredTheme, watchSystemTheme } from '../../lib/theme.ts'
22
23
  import { useApiClient } from '../context.ts'
23
24
  import { toError } from '../errors.ts'
24
25
  import type { MutationResult } from '../resource.ts'
25
26
  import { asMutationResult } from './mutation.ts'
27
+ import { useWorkspace } from './workspace.ts'
26
28
 
27
29
  /**
28
30
  * The signed-in person, as the `/account/*` pages read and write them.
@@ -218,3 +220,14 @@ export function useTheme(): ThemeControl {
218
220
 
219
221
  return { theme, setTheme }
220
222
  }
223
+
224
+ /**
225
+ * The zone dates render in: the account's own choice, falling back to the
226
+ * workspace's while either query is still loading.
227
+ */
228
+ export function useTimezone(): string {
229
+ const { preferences } = useAccountPreferences()
230
+ const { workspace } = useWorkspace()
231
+
232
+ return resolveTimezone(preferences?.timezone, workspace?.timezone)
233
+ }
@@ -0,0 +1,60 @@
1
+ import { apiKeySchema, createApiKeyBody, createdApiKeySchema } from '@kelpie/schemas'
2
+ import type { ApiKey, ApiKeyKind, CreateApiKeyInput, CreatedApiKey } from '@kelpie/schemas'
3
+ import { useMutation, useQueryClient } from '@tanstack/react-query'
4
+
5
+ import { useApiClient } from '../context.ts'
6
+ import { createReadOnlyResourceHooks } from '../resource.ts'
7
+ import type { MutationResult, RecordListResult } from '../resource.ts'
8
+ import { asMutationResult } from './mutation.ts'
9
+
10
+ /**
11
+ * `/v1/api-keys`: workspace keys and personal keys, one endpoint told apart by
12
+ * `kind`. `kind` is required on every list request — the server answers `422`
13
+ * without it — so each page asks for exactly the one kind it manages.
14
+ */
15
+
16
+ const { useList } = createReadOnlyResourceHooks<ApiKey>({
17
+ name: 'apiKeys',
18
+ path: '/api-keys',
19
+ decode: apiKeySchema.parse,
20
+ })
21
+
22
+ export function useApiKeys(kind: ApiKeyKind): RecordListResult<ApiKey> {
23
+ return useList({ kind })
24
+ }
25
+
26
+ /**
27
+ * Mints a key.
28
+ *
29
+ * Written out rather than taken from `createResourceHooks`, because the `201`
30
+ * is the only response that ever carries the secret and the shared hook decodes
31
+ * with the schema that has no such field. The secret has to survive the decode:
32
+ * it cannot be fetched again, so a page that dropped it would have created a key
33
+ * nobody can use.
34
+ */
35
+ export function useCreateApiKey(): MutationResult<CreateApiKeyInput, CreatedApiKey> {
36
+ const client = useApiClient()
37
+ const queryClient = useQueryClient()
38
+ const mutation = useMutation({
39
+ mutationFn: (input: CreateApiKeyInput) =>
40
+ client.post('/api-keys', createApiKeyBody(input), createdApiKeySchema.parse),
41
+ onSettled: () => {
42
+ void queryClient.invalidateQueries({ queryKey: ['apiKeys', 'list'] })
43
+ },
44
+ })
45
+
46
+ return asMutationResult(mutation)
47
+ }
48
+
49
+ export function useRevokeApiKey(): MutationResult<string, void> {
50
+ const client = useApiClient()
51
+ const queryClient = useQueryClient()
52
+ const mutation = useMutation({
53
+ mutationFn: (id: string) => client.delete(`/api-keys/${id}`),
54
+ onSettled: () => {
55
+ void queryClient.invalidateQueries({ queryKey: ['apiKeys', 'list'] })
56
+ },
57
+ })
58
+
59
+ return asMutationResult(mutation)
60
+ }
@@ -1,4 +1,4 @@
1
- import { createInviteBody, inviteSchema, resendInviteBody } from '@kelpie/schemas'
1
+ import { createInviteBody, inviteSchema } from '@kelpie/schemas'
2
2
  import type { InvitableRole, Invite } from '@kelpie/schemas'
3
3
  import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
4
4
 
@@ -15,18 +15,12 @@ import { useSession } from './session.ts'
15
15
  * only renders this half for an admin, which keeps the refusal off screen
16
16
  * without the browser being what decides it.
17
17
  *
18
- * The URL the emailed link points at is built here rather than server-side: the
19
- * service knows nothing about where a browser reached it from, and `{token}` is
20
- * the placeholder it fills in.
18
+ * The URL the emailed link points at is built server-side from the deployment's
19
+ * own base URL, so nothing here sends one.
21
20
  */
22
21
 
23
22
  const INVITES_KEY = 'invites'
24
23
 
25
- /** Where an invitee lands. `JoinPage` reads the token out of the query string. */
26
- export function inviteUrlTemplate(origin: string): string {
27
- return `${origin}/join?token={token}`
28
- }
29
-
30
24
  export interface InviteListResult {
31
25
  readonly invites: readonly Invite[]
32
26
  readonly isLoading: boolean
@@ -64,7 +58,7 @@ export function useSendInvite(): MutationResult<SendInviteArguments, Invite> {
64
58
  mutationFn: ({ email, role }: SendInviteArguments) =>
65
59
  client.post(
66
60
  `/workspaces/${workspaceId}/invites`,
67
- createInviteBody({ email, role, inviteUrlTemplate: inviteUrlTemplate(window.location.origin) }),
61
+ createInviteBody({ email, role }),
68
62
  inviteSchema.parse,
69
63
  ),
70
64
  onSuccess: async () => {
@@ -83,11 +77,7 @@ export function useResendInvite(): MutationResult<string, Invite> {
83
77
  const workspaceId = session?.workspaceId ?? ''
84
78
  const mutation = useMutation({
85
79
  mutationFn: (inviteId: string) =>
86
- client.post(
87
- `/workspaces/${workspaceId}/invites/${inviteId}/resend`,
88
- resendInviteBody({ inviteUrlTemplate: inviteUrlTemplate(window.location.origin) }),
89
- inviteSchema.parse,
90
- ),
80
+ client.post(`/workspaces/${workspaceId}/invites/${inviteId}/resend`, {}, inviteSchema.parse),
91
81
  onSuccess: async () => {
92
82
  await queryClient.invalidateQueries({ queryKey: [INVITES_KEY, workspaceId] })
93
83
  },
@@ -1,4 +1,5 @@
1
1
  import {
2
+ confirmEmailVerificationBody,
2
3
  confirmPasswordResetBody,
3
4
  createWorkspaceBody,
4
5
  logInBody,
@@ -9,6 +10,7 @@ import {
9
10
  workspaceSchema,
10
11
  } from '@kelpie/schemas'
11
12
  import type {
13
+ ConfirmEmailVerificationInput,
12
14
  ConfirmPasswordResetInput,
13
15
  CreateWorkspaceInput,
14
16
  LogInInput,
@@ -63,6 +65,8 @@ export interface SessionState {
63
65
  readonly isSignedOut: boolean
64
66
  /** Signed in, but the account has no workspace yet. Every CRM endpoint answers `403` until it does. */
65
67
  readonly needsWorkspace: boolean
68
+ /** No workspace yet, and creating one will answer `403` until the account verifies its email. */
69
+ readonly needsEmailVerification: boolean
66
70
  readonly error: Error | null
67
71
  }
68
72
 
@@ -70,12 +74,14 @@ export function useSession(): SessionState {
70
74
  const client = useApiClient()
71
75
  const result = useQuery(sessionQuery(client))
72
76
  const isSignedOut = result.error instanceof ApiError && result.error.status === 401
77
+ const needsWorkspace = result.data !== undefined && result.data.workspaceId === null
73
78
 
74
79
  return {
75
80
  session: result.data,
76
81
  isLoading: result.isPending,
77
82
  isSignedOut,
78
- needsWorkspace: result.data !== undefined && result.data.workspaceId === null,
83
+ needsWorkspace,
84
+ needsEmailVerification: needsWorkspace && result.data?.emailVerified === false,
79
85
  error: isSignedOut ? null : toError(result.error),
80
86
  }
81
87
  }
@@ -132,11 +138,6 @@ export function useLogOut(): MutationResult<void, void> {
132
138
  return asMutationResult(mutation)
133
139
  }
134
140
 
135
- /** Where a reset email lands. `ResetPasswordPage` reads the token out of the query string. */
136
- export function resetUrlTemplate(origin: string): string {
137
- return `${origin}/reset-password?token={token}`
138
- }
139
-
140
141
  /**
141
142
  * Asks for a reset link.
142
143
  *
@@ -176,6 +177,41 @@ export function useConfirmPasswordReset(): MutationResult<ConfirmPasswordResetIn
176
177
  return asMutationResult(mutation)
177
178
  }
178
179
 
180
+ /**
181
+ * Asks for a fresh verification link. The same call a "resend" button makes,
182
+ * and a no-op once the account is already verified.
183
+ *
184
+ * Nothing in the cache changes: this signs nobody in or out.
185
+ */
186
+ export function useRequestEmailVerification(): MutationResult<void, void> {
187
+ const client = useApiClient()
188
+ const mutation = useMutation({
189
+ mutationFn: () => client.postEmpty('/auth/verify-email'),
190
+ })
191
+
192
+ return asMutationResult(mutation)
193
+ }
194
+
195
+ /**
196
+ * Spends a verification token from that email.
197
+ *
198
+ * Unlike a password reset this ends no session, so the caller only needs the
199
+ * session re-read: `needsEmailVerification` flips once it lands.
200
+ */
201
+ export function useConfirmEmailVerification(): MutationResult<ConfirmEmailVerificationInput, void> {
202
+ const client = useApiClient()
203
+ const queryClient = useQueryClient()
204
+ const mutation = useMutation({
205
+ mutationFn: (input: ConfirmEmailVerificationInput) =>
206
+ client.postEmpty('/auth/verify-email/confirm', confirmEmailVerificationBody(input)),
207
+ onSuccess: async () => {
208
+ await queryClient.fetchQuery(sessionQuery(client))
209
+ },
210
+ })
211
+
212
+ return asMutationResult(mutation)
213
+ }
214
+
179
215
  /**
180
216
  * Joins the workspace an invitation names.
181
217
  *
@@ -27,9 +27,11 @@ import { RaiseDetail } from '../pages/RaiseDetail.tsx'
27
27
  import { RaiseStageSettingsPage } from '../pages/RaiseStageSettingsPage.tsx'
28
28
  import { RoleDetail } from '../pages/RoleDetail.tsx'
29
29
  import { AccountLayout } from '../pages/account/AccountLayout.tsx'
30
+ import { PersonalApiKeysPage } from '../pages/account/PersonalApiKeysPage.tsx'
30
31
  import { PreferencesPage } from '../pages/account/PreferencesPage.tsx'
31
32
  import { ProfilePage } from '../pages/account/ProfilePage.tsx'
32
33
  import { SecurityPage } from '../pages/account/SecurityPage.tsx'
34
+ import { ApiKeysPage } from '../pages/admin/ApiKeysPage.tsx'
33
35
  import { DataPage } from '../pages/admin/DataPage.tsx'
34
36
  import { McpPage } from '../pages/admin/McpPage.tsx'
35
37
  import { ModulesPage } from '../pages/admin/ModulesPage.tsx'
@@ -41,6 +43,8 @@ import { JoinPage } from '../pages/auth/JoinPage.tsx'
41
43
  import { ResetPasswordPage } from '../pages/auth/ResetPasswordPage.tsx'
42
44
  import { SignInPage } from '../pages/auth/SignInPage.tsx'
43
45
  import { SignUpPage } from '../pages/auth/SignUpPage.tsx'
46
+ import { VerifyEmailConfirmPage } from '../pages/auth/VerifyEmailConfirmPage.tsx'
47
+ import { VerifyEmailPendingPage } from '../pages/auth/VerifyEmailPendingPage.tsx'
44
48
  import { DashboardPage } from '../pages/dashboard/DashboardPage.tsx'
45
49
  import { HandbookLayout } from '../pages/handbook/HandbookPage.tsx'
46
50
  import { HandbookStepPage } from '../pages/onboarding/HandbookStepPage.tsx'
@@ -110,10 +114,13 @@ function AppRoutes(): React.JSX.Element {
110
114
  <Route path="/forgot-password" element={<ForgotPasswordPage />} />
111
115
  <Route path="/reset-password" element={<ResetPasswordPage />} />
112
116
  {/* Outside the gate: an invitee may have no workspace yet, and this is how
113
- they get one. Same for the first onboarding step, which is what the
114
- gate sends an account with no workspace to. */}
117
+ they get one. Same for the first onboarding step, and for the two
118
+ verification pages, all of which are what the gate sends an account
119
+ with no workspace to. */}
115
120
  <Route path="/join" element={<JoinPage />} />
116
121
  <Route path="/onboarding/workspace" element={<WorkspaceStepPage />} />
122
+ <Route path="/verify-email" element={<VerifyEmailConfirmPage />} />
123
+ <Route path="/verify-email/pending" element={<VerifyEmailPendingPage />} />
117
124
 
118
125
  <Route element={<SessionGate />}>
119
126
  {/* Inside the gate and outside the Shell: both steps need the workspace
@@ -155,6 +162,7 @@ function AppRoutes(): React.JSX.Element {
155
162
  <Route path="admin/workspace" element={<WorkspaceSettingsPage />} />
156
163
  <Route path="admin/team" element={<TeamPage />} />
157
164
  <Route path="admin/data" element={<DataPage />} />
165
+ <Route path="admin/api-keys" element={<ApiKeysPage />} />
158
166
  <Route path="admin/mcp" element={<McpPage />} />
159
167
  <Route path="admin/webhooks" element={<WebhooksPage />} />
160
168
  <Route path="admin/modules" element={<ModulesPage />} />
@@ -164,6 +172,7 @@ function AppRoutes(): React.JSX.Element {
164
172
  <Route path="profile" element={<ProfilePage />} />
165
173
  <Route path="security" element={<SecurityPage />} />
166
174
  <Route path="preferences" element={<PreferencesPage />} />
175
+ <Route path="api-keys" element={<PersonalApiKeysPage />} />
167
176
  {accountRoutes.map((route) => (
168
177
  <Route
169
178
  key={route.path}
@@ -6,17 +6,21 @@ import { ErrorPanel, LoadingPanel } from '../components/QueryState.tsx'
6
6
  /**
7
7
  * What stands between a URL and a page that needs a workspace.
8
8
  *
9
- * Three answers, and they are not the same thing:
9
+ * Four answers, and they are not the same thing:
10
10
  *
11
11
  * - `401` means sign in. That is a redirect.
12
- * - Signed in with no workspace means create one. Also a redirect, to a
12
+ * - Signed in, no workspace, email unverified means go verify it: creating a
13
+ * workspace answers `403` until then. Checked before `needsWorkspace`,
14
+ * since both are true at once for a fresh direct signup and this is the one
15
+ * that has to happen first.
16
+ * - Signed in, no workspace, verified means create one. Also a redirect, to a
13
17
  * different place, because sending someone to a sign-in form they have
14
18
  * already passed is a loop.
15
19
  * - Anything else is the service being unreachable or broken, and redirecting
16
20
  * on that would hide it behind a sign-in form that will also fail.
17
21
  */
18
22
  export function SessionGate(): React.JSX.Element {
19
- const { isLoading, isSignedOut, needsWorkspace, error } = useSession()
23
+ const { isLoading, isSignedOut, needsWorkspace, needsEmailVerification, error } = useSession()
20
24
 
21
25
  if (isSignedOut) {
22
26
  return <Navigate to="/login" replace />
@@ -34,6 +38,10 @@ export function SessionGate(): React.JSX.Element {
34
38
  return <LoadingPanel />
35
39
  }
36
40
 
41
+ if (needsEmailVerification) {
42
+ return <Navigate to="/verify-email/pending" replace />
43
+ }
44
+
37
45
  if (needsWorkspace) {
38
46
  return <Navigate to="/onboarding/workspace" replace />
39
47
  }
@@ -1,5 +1,6 @@
1
1
  import type { Activity, ActivityKind, RecordTargetType } from '@kelpie/schemas'
2
2
 
3
+ import { useTimezone } from '../api/resources/account.ts'
3
4
  import { useActivities } from '../api/resources/activities.ts'
4
5
  import { useMembers } from '../api/resources/members.ts'
5
6
  import { formatRelativeTime, monthLabel } from '../lib/dates.ts'
@@ -55,11 +56,15 @@ interface MonthGroup {
55
56
  }
56
57
 
57
58
  /** Consecutive runs, not a map: the list is already ordered, so a month never recurs. */
58
- function groupByMonth(activities: readonly Activity[], now: Date): readonly MonthGroup[] {
59
+ function groupByMonth(
60
+ activities: readonly Activity[],
61
+ timezone: string,
62
+ now: Date,
63
+ ): readonly MonthGroup[] {
59
64
  const groups: { label: string; items: Activity[] }[] = []
60
65
 
61
66
  for (const activity of activities) {
62
- const label = monthLabel(activity.createdAt, now)
67
+ const label = monthLabel(activity.createdAt, timezone, now)
63
68
  const last = groups.at(-1)
64
69
 
65
70
  if (last?.label === label) {
@@ -78,7 +83,8 @@ export function ActivitiesPanel({
78
83
  }: ActivitiesPanelProps): React.JSX.Element {
79
84
  const activities = useActivities({ targetType, targetId })
80
85
  const members = useMembers()
81
- const groups = groupByMonth(activities.records, new Date())
86
+ const timezone = useTimezone()
87
+ const groups = groupByMonth(activities.records, timezone, new Date())
82
88
 
83
89
  return (
84
90
  <section>
@@ -104,6 +110,7 @@ export function ActivitiesPanel({
104
110
  contextType={targetType}
105
111
  contextId={targetId}
106
112
  isLast={index === group.items.length - 1}
113
+ timezone={timezone}
107
114
  />
108
115
  ))}
109
116
  </ol>
@@ -137,6 +144,7 @@ export function LatestActivity({
137
144
  }: ActivitiesPanelProps): React.JSX.Element {
138
145
  const activities = useActivities({ targetType, targetId })
139
146
  const members = useMembers()
147
+ const timezone = useTimezone()
140
148
  const latest = activities.records[0]
141
149
 
142
150
  return (
@@ -158,6 +166,7 @@ export function LatestActivity({
158
166
  contextType={targetType}
159
167
  contextId={targetId}
160
168
  isLast
169
+ timezone={timezone}
161
170
  />
162
171
  </ol>
163
172
  )}
@@ -183,12 +192,14 @@ function ActivityEvent({
183
192
  contextType,
184
193
  contextId,
185
194
  isLast,
195
+ timezone,
186
196
  }: {
187
197
  readonly activity: Activity
188
198
  readonly actorName: string
189
199
  readonly contextType: RecordTargetType
190
200
  readonly contextId: string
191
201
  readonly isLast: boolean
202
+ readonly timezone: string
192
203
  }): React.JSX.Element {
193
204
  const isRolledUp = activity.targetType !== contextType || activity.targetId !== contextId
194
205
 
@@ -218,7 +229,7 @@ function ActivityEvent({
218
229
  dateTime={activity.createdAt.toISOString()}
219
230
  className="shrink-0 text-[11px] text-ink-faint"
220
231
  >
221
- {formatRelativeTime(activity.createdAt)}
232
+ {formatRelativeTime(activity.createdAt, timezone)}
222
233
  </time>
223
234
  </div>
224
235
  {isRolledUp && (