insforge 1.3.0 → 1.4.8

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 (269) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/auth/package.json +5 -3
  3. package/auth/src/lib/broadcastService.ts +115 -117
  4. package/auth/src/lib/insforge.ts +8 -0
  5. package/auth/src/main.tsx +2 -4
  6. package/auth/src/pages/SignInPage.tsx +60 -60
  7. package/auth/src/pages/SignUpPage.tsx +60 -60
  8. package/auth/src/pages/VerifyEmailPage.tsx +18 -0
  9. package/auth/tsconfig.json +2 -1
  10. package/backend/package.json +10 -6
  11. package/backend/src/api/middlewares/rate-limiters.ts +127 -127
  12. package/backend/src/api/routes/ai/index.routes.ts +475 -468
  13. package/backend/src/api/routes/auth/index.routes.ts +85 -32
  14. package/backend/src/api/routes/auth/oauth.routes.ts +11 -6
  15. package/backend/src/api/routes/database/index.routes.ts +2 -0
  16. package/backend/src/api/routes/database/records.routes.ts +39 -175
  17. package/backend/src/api/routes/database/rpc.routes.ts +69 -0
  18. package/backend/src/api/routes/deployments/index.routes.ts +192 -0
  19. package/backend/src/api/routes/docs/index.routes.ts +3 -2
  20. package/backend/src/api/routes/email/index.routes.ts +35 -35
  21. package/backend/src/api/routes/functions/index.routes.ts +3 -3
  22. package/backend/src/api/routes/metadata/index.routes.ts +26 -0
  23. package/backend/src/api/routes/webhooks/index.routes.ts +109 -0
  24. package/backend/src/infra/database/database.manager.ts +0 -10
  25. package/backend/src/infra/database/migrations/018_schema-rework.sql +441 -0
  26. package/backend/src/infra/database/migrations/019_create-deployments-table.sql +36 -0
  27. package/backend/src/infra/database/migrations/020_add-audio-modality.sql +11 -0
  28. package/backend/src/infra/database/migrations/bootstrap/bootstrap-migrations.js +103 -0
  29. package/backend/src/infra/security/token.manager.ts +1 -4
  30. package/backend/src/providers/ai/openrouter.provider.ts +12 -3
  31. package/backend/src/providers/database/base.provider.ts +39 -0
  32. package/backend/src/providers/database/cloud.provider.ts +159 -0
  33. package/backend/src/providers/deployments/vercel.provider.ts +516 -0
  34. package/backend/src/server.ts +19 -7
  35. package/backend/src/services/ai/ai-config.service.ts +6 -6
  36. package/backend/src/services/ai/ai-model.service.ts +60 -60
  37. package/backend/src/services/ai/ai-usage.service.ts +7 -7
  38. package/backend/src/services/ai/chat-completion.service.ts +415 -220
  39. package/backend/src/services/ai/helpers.ts +64 -64
  40. package/backend/src/services/ai/index.ts +13 -13
  41. package/backend/src/services/auth/auth-config.service.ts +4 -4
  42. package/backend/src/services/auth/auth-otp.service.ts +6 -6
  43. package/backend/src/services/auth/auth.service.ts +134 -74
  44. package/backend/src/services/auth/index.ts +4 -4
  45. package/backend/src/services/auth/oauth-config.service.ts +12 -12
  46. package/backend/src/services/database/database-advance.service.ts +19 -55
  47. package/backend/src/services/database/database-table.service.ts +38 -85
  48. package/backend/src/services/database/postgrest-proxy.service.ts +165 -0
  49. package/backend/src/services/deployments/deployment.service.ts +693 -0
  50. package/backend/src/services/functions/function.service.ts +61 -41
  51. package/backend/src/services/logs/audit.service.ts +10 -10
  52. package/backend/src/services/secrets/secret.service.ts +101 -27
  53. package/backend/src/services/storage/storage.service.ts +30 -30
  54. package/backend/src/services/usage/usage.service.ts +6 -6
  55. package/backend/src/types/ai.ts +8 -0
  56. package/backend/src/types/auth.ts +5 -1
  57. package/backend/src/types/database.ts +2 -0
  58. package/backend/src/types/deployments.ts +33 -0
  59. package/backend/src/types/storage.ts +1 -1
  60. package/backend/src/types/webhooks.ts +45 -0
  61. package/backend/src/utils/cookies.ts +34 -35
  62. package/backend/src/utils/environment.ts +0 -14
  63. package/backend/src/utils/s3-config-loader.ts +64 -64
  64. package/backend/src/utils/seed.ts +334 -301
  65. package/backend/src/utils/sql-parser.ts +126 -0
  66. package/backend/src/utils/utils.ts +114 -114
  67. package/backend/src/utils/validations.ts +10 -10
  68. package/backend/tests/local/test-rpc.sh +141 -0
  69. package/backend/tests/local/test-secrets.sh +1 -1
  70. package/backend/tests/manual/test-ai-model-plugins.sh +258 -0
  71. package/backend/tests/manual/test-rawsql-modes.sh +24 -24
  72. package/backend/tests/unit/database-advance.test.ts +326 -0
  73. package/backend/tests/unit/helpers.test.ts +2 -2
  74. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +13 -10
  75. package/docker-compose.prod.yml +1 -1
  76. package/docker-compose.yml +1 -1
  77. package/docs/agent-docs/deployment.md +79 -0
  78. package/docs/changelog.mdx +165 -72
  79. package/docs/core-concepts/ai/architecture.mdx +1 -23
  80. package/docs/core-concepts/ai/sdk.mdx +26 -1
  81. package/docs/core-concepts/authentication/architecture.mdx +6 -8
  82. package/docs/core-concepts/authentication/sdk.mdx +387 -91
  83. package/docs/core-concepts/authentication/ui-components/customization.mdx +460 -256
  84. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +50 -24
  85. package/docs/core-concepts/authentication/ui-components/react-router.mdx +18 -19
  86. package/docs/core-concepts/authentication/ui-components/react.mdx +26 -19
  87. package/docs/core-concepts/database/architecture.mdx +58 -21
  88. package/docs/core-concepts/database/pgvector.mdx +138 -0
  89. package/docs/core-concepts/database/sdk.mdx +17 -17
  90. package/docs/core-concepts/deployments/architecture.mdx +152 -0
  91. package/docs/core-concepts/email/architecture.mdx +4 -2
  92. package/docs/core-concepts/functions/architecture.mdx +1 -1
  93. package/docs/core-concepts/functions/sdk.mdx +0 -1
  94. package/docs/core-concepts/realtime/architecture.mdx +1 -1
  95. package/docs/core-concepts/storage/architecture.mdx +1 -1
  96. package/docs/core-concepts/storage/sdk.mdx +25 -25
  97. package/docs/docs.json +14 -6
  98. package/docs/favicon.png +0 -0
  99. package/docs/favicon.svg +3 -18
  100. package/docs/images/changelog/dec-2025/apple-oauth.mp4 +0 -0
  101. package/docs/images/changelog/dec-2025/moreModels.png +0 -0
  102. package/docs/images/changelog/dec-2025/multi-region.webp +0 -0
  103. package/docs/images/changelog/dec-2025/postgres-connection.webp +0 -0
  104. package/docs/images/changelog/dec-2025/realtime2.png +0 -0
  105. package/docs/images/mcp-setup/CC-MCP-1.mp4 +0 -0
  106. package/docs/images/mcp-setup/CC-MCP-2.mp4 +0 -0
  107. package/docs/images/mcp-setup/Cursor-MCP-1.mp4 +0 -0
  108. package/docs/images/mcp-setup/Cursor-MCP-2.mp4 +0 -0
  109. package/docs/images/mcp-setup/Cursor-MCP-3.mp4 +0 -0
  110. package/docs/images/mcp-setup/claude-code-connect.png +0 -0
  111. package/docs/images/mcp-setup/cline-1.png +0 -0
  112. package/docs/images/mcp-setup/cline-2.png +0 -0
  113. package/docs/images/mcp-setup/cline-3.png +0 -0
  114. package/docs/images/mcp-setup/connect-project.png +0 -0
  115. package/docs/images/mcp-setup/copilot-1.png +0 -0
  116. package/docs/images/mcp-setup/copilot-2.png +0 -0
  117. package/docs/images/mcp-setup/copilot-3.png +0 -0
  118. package/docs/images/mcp-setup/mcp-json-1.png +0 -0
  119. package/docs/images/mcp-setup/mcp-json-2.png +0 -0
  120. package/docs/images/mcp-setup/qoder-1.png +0 -0
  121. package/docs/images/mcp-setup/qoder-2.png +0 -0
  122. package/docs/images/mcp-setup/roocode-1.png +0 -0
  123. package/docs/images/mcp-setup/roocode-2.png +0 -0
  124. package/docs/images/mcp-setup/trae-1.png +0 -0
  125. package/docs/images/mcp-setup/trae-2.png +0 -0
  126. package/docs/images/mcp-setup/trae-3.png +0 -0
  127. package/docs/images/mcp-setup/trae-4.png +0 -0
  128. package/docs/images/mcp-setup/trae-5.png +0 -0
  129. package/docs/images/mcp-setup/windsurf-1.png +0 -0
  130. package/docs/images/mcp-setup/windsurf-2.png +0 -0
  131. package/docs/insforge-instructions-sdk.md +7 -3
  132. package/docs/introduction.mdx +9 -8
  133. package/docs/mcp-setup.mdx +332 -0
  134. package/docs/oauth-server.mdx +563 -0
  135. package/docs/partnership.mdx +79 -10
  136. package/docs/quickstart.mdx +1 -1
  137. package/docs/vscode-extension.mdx +74 -0
  138. package/eslint.config.js +1 -0
  139. package/examples/response-examples.md +1 -1
  140. package/frontend/package.json +1 -1
  141. package/frontend/src/App.tsx +8 -3
  142. package/frontend/src/assets/logos/antigravity.svg +1 -0
  143. package/frontend/src/assets/logos/copilot.svg +10 -0
  144. package/frontend/src/assets/logos/deepseek.svg +139 -0
  145. package/frontend/src/assets/logos/kiro.svg +9 -0
  146. package/frontend/src/assets/logos/qoder.svg +4 -0
  147. package/frontend/src/assets/logos/qwen.svg +15 -0
  148. package/frontend/src/components/CodeBlock.tsx +2 -2
  149. package/frontend/src/components/ConnectCTA.tsx +3 -2
  150. package/frontend/src/components/datagrid/DataGrid.tsx +90 -62
  151. package/frontend/src/components/datagrid/datagridTypes.tsx +2 -1
  152. package/frontend/src/components/datagrid/index.ts +1 -1
  153. package/frontend/src/components/index.ts +0 -1
  154. package/frontend/src/components/layout/AppHeader.tsx +4 -27
  155. package/frontend/src/components/layout/AppSidebar.tsx +85 -100
  156. package/frontend/src/components/layout/Layout.tsx +34 -32
  157. package/frontend/src/components/layout/PrimaryMenu.tsx +12 -4
  158. package/frontend/src/components/radix/Select.tsx +151 -151
  159. package/frontend/src/features/ai/components/AIConfigCard.tsx +200 -200
  160. package/frontend/src/features/ai/components/AIEmptyState.tsx +23 -23
  161. package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +102 -101
  162. package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -135
  163. package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -51
  164. package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -118
  165. package/frontend/src/features/ai/components/index.ts +6 -6
  166. package/frontend/src/features/ai/helpers.ts +147 -141
  167. package/frontend/src/features/ai/pages/AIPage.tsx +166 -166
  168. package/frontend/src/features/auth/components/AuthPreview.tsx +96 -96
  169. package/frontend/src/features/auth/components/UsersDataGrid.tsx +55 -31
  170. package/frontend/src/features/auth/components/index.ts +5 -5
  171. package/frontend/src/features/auth/pages/AuthMethodsPage.tsx +275 -275
  172. package/frontend/src/features/dashboard/pages/DashboardPage.tsx +1 -1
  173. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +0 -2
  174. package/frontend/src/features/database/components/ForeignKeyCell.tsx +38 -11
  175. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +18 -8
  176. package/frontend/src/features/database/components/LinkRecordModal.tsx +61 -13
  177. package/frontend/src/features/database/components/RecordFormField.tsx +1 -1
  178. package/frontend/src/features/database/components/TableSidebar.tsx +0 -3
  179. package/frontend/src/features/database/components/TablesEmptyState.tsx +1 -1
  180. package/frontend/src/features/database/components/TemplatePreview.tsx +1 -2
  181. package/frontend/src/features/database/constants.ts +16 -28
  182. package/frontend/src/features/database/hooks/useCSVImport.ts +3 -2
  183. package/frontend/src/features/database/hooks/useRawSQL.ts +3 -2
  184. package/frontend/src/features/database/hooks/useTables.ts +5 -7
  185. package/frontend/src/features/database/pages/FunctionsPage.tsx +0 -5
  186. package/frontend/src/features/database/pages/IndexesPage.tsx +0 -5
  187. package/frontend/src/features/database/pages/PoliciesPage.tsx +0 -5
  188. package/frontend/src/features/database/pages/SQLEditorPage.tsx +2 -2
  189. package/frontend/src/features/database/pages/TriggersPage.tsx +0 -5
  190. package/frontend/src/features/database/services/advance.service.ts +1 -15
  191. package/frontend/src/features/database/services/record.service.ts +4 -20
  192. package/frontend/src/features/database/services/table.service.ts +1 -4
  193. package/frontend/src/features/database/templates/ai-chatbot.ts +6 -6
  194. package/frontend/src/features/database/templates/ecommerce-platform.ts +2 -2
  195. package/frontend/src/features/database/templates/instagram-clone.ts +10 -10
  196. package/frontend/src/features/database/templates/notion-clone.ts +8 -8
  197. package/frontend/src/features/database/templates/reddit-clone.ts +10 -10
  198. package/frontend/src/features/deployments/components/DeploymentRow.tsx +93 -0
  199. package/frontend/src/features/deployments/components/DeploymentsEmptyState.tsx +15 -0
  200. package/frontend/src/features/deployments/hooks/useDeployments.ts +157 -0
  201. package/frontend/src/features/deployments/pages/DeploymentsPage.tsx +318 -0
  202. package/frontend/src/features/deployments/services/deployments.service.ts +63 -0
  203. package/frontend/src/features/functions/components/FunctionRow.tsx +72 -72
  204. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -56
  205. package/frontend/src/features/functions/components/SecretRow.tsx +3 -3
  206. package/frontend/src/features/functions/components/index.ts +5 -5
  207. package/frontend/src/features/functions/hooks/useFunctions.ts +5 -4
  208. package/frontend/src/features/functions/hooks/useSecrets.ts +6 -9
  209. package/frontend/src/features/functions/pages/SecretsPage.tsx +118 -118
  210. package/frontend/src/features/functions/services/function.service.ts +8 -25
  211. package/frontend/src/features/functions/services/secret.service.ts +23 -41
  212. package/frontend/src/features/login/pages/CloudLoginPage.tsx +125 -118
  213. package/frontend/src/features/logs/components/LogDetailPanel.tsx +41 -0
  214. package/frontend/src/features/logs/components/LogsDataGrid.tsx +32 -1
  215. package/frontend/src/features/logs/components/index.ts +1 -0
  216. package/frontend/src/features/logs/pages/LogsPage.tsx +36 -6
  217. package/frontend/src/features/onboard/components/ApiCredentialsSection.tsx +59 -0
  218. package/frontend/src/features/onboard/components/ConnectionStringSection.tsx +180 -0
  219. package/frontend/src/features/onboard/components/McpConnectionSection.tsx +159 -0
  220. package/frontend/src/features/onboard/components/OnboardingController.tsx +68 -0
  221. package/frontend/src/features/onboard/components/OnboardingModal.tsx +121 -267
  222. package/frontend/src/features/onboard/components/ShowPasswordButton.tsx +21 -0
  223. package/frontend/src/features/onboard/components/index.ts +9 -4
  224. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +1 -1
  225. package/frontend/src/features/onboard/components/mcp/QoderDeeplinkGenerator.tsx +36 -0
  226. package/frontend/src/features/onboard/components/mcp/helpers.tsx +123 -98
  227. package/frontend/src/features/onboard/components/mcp/index.ts +4 -3
  228. package/frontend/src/features/onboard/index.ts +17 -13
  229. package/frontend/src/features/settings/pages/SettingsPage.tsx +349 -0
  230. package/frontend/src/features/visualizer/components/AuthNode.tsx +4 -4
  231. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +21 -8
  232. package/frontend/src/features/visualizer/pages/VisualizerPage.tsx +10 -1
  233. package/frontend/src/index.css +249 -249
  234. package/frontend/src/lib/contexts/ModalContext.tsx +35 -0
  235. package/frontend/src/lib/hooks/useMetadata.ts +45 -1
  236. package/frontend/src/lib/hooks/useModal.tsx +2 -0
  237. package/frontend/src/lib/routing/AppRoutes.tsx +103 -99
  238. package/frontend/src/lib/services/metadata.service.ts +20 -3
  239. package/frontend/src/lib/utils/menuItems.ts +223 -207
  240. package/frontend/src/lib/utils/utils.ts +196 -196
  241. package/functions/server.ts +315 -315
  242. package/functions/worker-template.js +1 -1
  243. package/openapi/ai.yaml +115 -5
  244. package/openapi/auth.yaml +97 -17
  245. package/openapi/logs.yaml +0 -2
  246. package/openapi/metadata.yaml +0 -2
  247. package/openapi/records.yaml +21 -21
  248. package/openapi/tables.yaml +1 -2
  249. package/package.json +1 -1
  250. package/shared-schemas/package.json +1 -1
  251. package/shared-schemas/src/ai-api.schema.ts +251 -143
  252. package/shared-schemas/src/ai.schema.ts +63 -63
  253. package/shared-schemas/src/auth-api.schema.ts +34 -6
  254. package/shared-schemas/src/auth.schema.ts +17 -10
  255. package/shared-schemas/src/cloud-events.schema.ts +26 -0
  256. package/shared-schemas/src/deployments-api.schema.ts +55 -0
  257. package/shared-schemas/src/deployments.schema.ts +30 -0
  258. package/shared-schemas/src/docs.schema.ts +8 -2
  259. package/shared-schemas/src/email-api.schema.ts +30 -30
  260. package/shared-schemas/src/functions-api.schema.ts +13 -4
  261. package/shared-schemas/src/functions.schema.ts +1 -1
  262. package/shared-schemas/src/index.ts +22 -18
  263. package/shared-schemas/src/metadata.schema.ts +30 -4
  264. package/shared-schemas/src/secrets-api.schema.ts +44 -0
  265. package/shared-schemas/src/secrets.schema.ts +15 -0
  266. package/zeabur/README.md +13 -0
  267. package/zeabur/template.yml +20 -51
  268. package/backend/src/types/profile.ts +0 -55
  269. package/frontend/src/components/ProjectInfoModal.tsx +0 -128
@@ -1,96 +1,96 @@
1
- import { useState, useEffect } from 'react';
2
- import { SignInForm, SignUpForm, ForgotPasswordForm } from '@insforge/react';
3
- import { useAuthConfig } from '../hooks/useAuthConfig';
4
- import { useOAuthConfig } from '../hooks/useOAuthConfig';
5
-
6
- type AuthView = 'sign-in' | 'sign-up' | 'forgot-password';
7
-
8
- export function AuthPreview() {
9
- const { config } = useAuthConfig();
10
- const { configs: oAuthConfigs } = useOAuthConfig();
11
- const [view, setView] = useState<AuthView>('sign-in');
12
- const [email, setEmail] = useState('');
13
- const [password, setPassword] = useState('');
14
-
15
- // Listen to hash changes
16
- useEffect(() => {
17
- const handleHashChange = () => {
18
- const hash = window.location.hash.slice(1); // Remove the #
19
- if (
20
- hash === 'preview=sign-in' ||
21
- hash === 'preview=sign-up' ||
22
- hash === 'preview=forgot-password'
23
- ) {
24
- setView(hash.replace('preview=', '') as AuthView);
25
- }
26
- };
27
-
28
- // Set initial view from hash
29
- handleHashChange();
30
-
31
- // Listen for hash changes
32
- window.addEventListener('hashchange', handleHashChange);
33
- return () => window.removeEventListener('hashchange', handleHashChange);
34
- }, []);
35
-
36
- const authConfig = {
37
- oAuthProviders: oAuthConfigs.map((provider) => provider.provider) ?? [],
38
- passwordMinLength: config?.passwordMinLength ?? 6,
39
- requireEmailVerification: !!config?.requireEmailVerification,
40
- requireLowercase: !!config?.requireLowercase,
41
- requireNumber: !!config?.requireNumber,
42
- requireSpecialChar: !!config?.requireSpecialChar,
43
- requireUppercase: !!config?.requireUppercase,
44
- resetPasswordMethod: config?.resetPasswordMethod ?? ('code' as const),
45
- verifyEmailMethod: config?.verifyEmailMethod ?? ('code' as const),
46
- };
47
-
48
- const handleSubmit = (e: React.FormEvent) => {
49
- e.preventDefault();
50
- // Preview mode - do nothing
51
- };
52
-
53
- const handleOAuthClick = () => {
54
- // Preview mode - do nothing
55
- };
56
-
57
- return (
58
- <div className="w-[400px]">
59
- {view === 'sign-in' && (
60
- <SignInForm
61
- email={email}
62
- password={password}
63
- onEmailChange={setEmail}
64
- onPasswordChange={setPassword}
65
- onSubmit={handleSubmit}
66
- authConfig={authConfig}
67
- onOAuthClick={handleOAuthClick}
68
- forgotPasswordUrl="#preview=forgot-password"
69
- signUpUrl="#preview=sign-up"
70
- />
71
- )}
72
-
73
- {view === 'sign-up' && (
74
- <SignUpForm
75
- email={email}
76
- password={password}
77
- onEmailChange={setEmail}
78
- onPasswordChange={setPassword}
79
- onSubmit={handleSubmit}
80
- authConfig={authConfig}
81
- onOAuthClick={handleOAuthClick}
82
- signInUrl="#preview=sign-in"
83
- />
84
- )}
85
-
86
- {view === 'forgot-password' && (
87
- <ForgotPasswordForm
88
- email={email}
89
- onEmailChange={setEmail}
90
- onSubmit={handleSubmit}
91
- backToSignInUrl="#preview=sign-in"
92
- />
93
- )}
94
- </div>
95
- );
96
- }
1
+ import { useState, useEffect } from 'react';
2
+ import { SignInForm, SignUpForm, ForgotPasswordForm } from '@insforge/react';
3
+ import { useAuthConfig } from '../hooks/useAuthConfig';
4
+ import { useOAuthConfig } from '../hooks/useOAuthConfig';
5
+
6
+ type AuthView = 'sign-in' | 'sign-up' | 'forgot-password';
7
+
8
+ export function AuthPreview() {
9
+ const { config } = useAuthConfig();
10
+ const { configs: oAuthConfigs } = useOAuthConfig();
11
+ const [view, setView] = useState<AuthView>('sign-in');
12
+ const [email, setEmail] = useState('');
13
+ const [password, setPassword] = useState('');
14
+
15
+ // Listen to hash changes
16
+ useEffect(() => {
17
+ const handleHashChange = () => {
18
+ const hash = window.location.hash.slice(1); // Remove the #
19
+ if (
20
+ hash === 'preview=sign-in' ||
21
+ hash === 'preview=sign-up' ||
22
+ hash === 'preview=forgot-password'
23
+ ) {
24
+ setView(hash.replace('preview=', '') as AuthView);
25
+ }
26
+ };
27
+
28
+ // Set initial view from hash
29
+ handleHashChange();
30
+
31
+ // Listen for hash changes
32
+ window.addEventListener('hashchange', handleHashChange);
33
+ return () => window.removeEventListener('hashchange', handleHashChange);
34
+ }, []);
35
+
36
+ const authConfig = {
37
+ oAuthProviders: oAuthConfigs.map((provider) => provider.provider) ?? [],
38
+ passwordMinLength: config?.passwordMinLength ?? 6,
39
+ requireEmailVerification: !!config?.requireEmailVerification,
40
+ requireLowercase: !!config?.requireLowercase,
41
+ requireNumber: !!config?.requireNumber,
42
+ requireSpecialChar: !!config?.requireSpecialChar,
43
+ requireUppercase: !!config?.requireUppercase,
44
+ resetPasswordMethod: config?.resetPasswordMethod ?? ('code' as const),
45
+ verifyEmailMethod: config?.verifyEmailMethod ?? ('code' as const),
46
+ };
47
+
48
+ const handleSubmit = (e: React.FormEvent) => {
49
+ e.preventDefault();
50
+ // Preview mode - do nothing
51
+ };
52
+
53
+ const handleOAuthClick = () => {
54
+ // Preview mode - do nothing
55
+ };
56
+
57
+ return (
58
+ <div className="w-[400px]">
59
+ {view === 'sign-in' && (
60
+ <SignInForm
61
+ email={email}
62
+ password={password}
63
+ onEmailChange={setEmail}
64
+ onPasswordChange={setPassword}
65
+ onSubmit={handleSubmit}
66
+ authConfig={authConfig}
67
+ onOAuthClick={handleOAuthClick}
68
+ forgotPasswordUrl="#preview=forgot-password"
69
+ signUpUrl="#preview=sign-up"
70
+ />
71
+ )}
72
+
73
+ {view === 'sign-up' && (
74
+ <SignUpForm
75
+ email={email}
76
+ password={password}
77
+ onEmailChange={setEmail}
78
+ onPasswordChange={setPassword}
79
+ onSubmit={handleSubmit}
80
+ authConfig={authConfig}
81
+ onOAuthClick={handleOAuthClick}
82
+ signInUrl="#preview=sign-in"
83
+ />
84
+ )}
85
+
86
+ {view === 'forgot-password' && (
87
+ <ForgotPasswordForm
88
+ email={email}
89
+ onEmailChange={setEmail}
90
+ onSubmit={handleSubmit}
91
+ backToSignInUrl="#preview=sign-in"
92
+ />
93
+ )}
94
+ </div>
95
+ );
96
+ }
@@ -1,18 +1,23 @@
1
1
  import { useMemo } from 'react';
2
+ import { User } from 'lucide-react';
2
3
  import {
4
+ Avatar,
5
+ AvatarImage,
6
+ AvatarFallback,
3
7
  Badge,
8
+ Checkbox,
4
9
  DataGrid,
5
10
  createDefaultCellRenderer,
6
11
  type DataGridProps,
7
12
  type DataGridColumn,
8
13
  type RenderCellProps,
14
+ type SelectionCellProps,
9
15
  ConvertedValue,
10
16
  } from '@/components';
11
17
  import { cn } from '@/lib/utils/utils';
12
18
  import type { UserSchema } from '@insforge/shared-schemas';
13
19
 
14
20
  // Create a type that makes UserSchema compatible with DataGrid requirements
15
- // We bypass the strict DatabaseRecord constraint since UserSchema has its own structure
16
21
  type UserDataGridRow = UserSchema & {
17
22
  [key: string]: ConvertedValue | { [key: string]: string }[];
18
23
  };
@@ -96,23 +101,18 @@ const ProviderIcon = ({ provider }: { provider: string }) => {
96
101
  );
97
102
  };
98
103
 
99
- const IdentitiesCellRenderer = ({ row }: RenderCellProps<UserDataGridRow>) => {
100
- const identities = row.identities;
104
+ const ProvidersCellRenderer = ({ row }: RenderCellProps<UserDataGridRow>) => {
105
+ const providers = row.providers;
101
106
 
102
- if (!identities || !Array.isArray(identities) || !identities.length) {
107
+ if (!providers || !Array.isArray(providers) || !providers.length) {
103
108
  return <span className="text-sm text-black dark:text-zinc-300">null</span>;
104
109
  }
105
110
 
106
111
  // Get unique providers to avoid duplicates
107
- const uniqueProviders = [
108
- ...new Set(identities.map((identity: { provider: string }) => identity.provider)),
109
- ];
112
+ const uniqueProviders = [...new Set(providers)];
110
113
 
111
114
  return (
112
- <div
113
- className="flex flex-wrap gap-1"
114
- title={identities.map((identity: { provider: string }) => identity.provider).join(', ')}
115
- >
115
+ <div className="flex flex-wrap gap-1" title={providers.join(', ')}>
116
116
  {uniqueProviders.slice(0, 2).map((provider: string, index: number) => (
117
117
  <ProviderIcon key={index} provider={provider} />
118
118
  ))}
@@ -150,28 +150,12 @@ export function createUsersColumns(): DataGridColumn<UserDataGridRow>[] {
150
150
  renderCell: cellRenderers.email,
151
151
  },
152
152
  {
153
- key: 'name',
154
- name: 'Name',
155
- width: '1fr',
156
- resizable: true,
157
- sortable: true,
158
- renderCell: cellRenderers.text,
159
- },
160
- {
161
- key: 'identities',
162
- name: 'Identities',
163
- width: '1.5fr',
164
- resizable: true,
165
- sortable: true,
166
- renderCell: IdentitiesCellRenderer,
167
- },
168
- {
169
- key: 'providerType',
170
- name: 'Provider Type',
153
+ key: 'providers',
154
+ name: 'Providers',
171
155
  width: '1fr',
172
156
  resizable: true,
173
157
  sortable: true,
174
- renderCell: cellRenderers.text,
158
+ renderCell: ProvidersCellRenderer,
175
159
  },
176
160
  {
177
161
  key: 'emailVerified',
@@ -201,7 +185,45 @@ export function createUsersColumns(): DataGridColumn<UserDataGridRow>[] {
201
185
  }
202
186
 
203
187
  // Users-specific DataGrid props
204
- export type UsersDataGridProps = Omit<DataGridProps<UserDataGridRow>, 'columns'>;
188
+ export type UsersDataGridProps = Omit<
189
+ DataGridProps<UserDataGridRow>,
190
+ 'columns' | 'selectionColumnWidth' | 'renderSelectionCell'
191
+ >;
192
+
193
+ // Custom selection cell with avatar and name
194
+ const UserSelectionCell = ({
195
+ row,
196
+ isSelected,
197
+ onToggle,
198
+ tabIndex,
199
+ }: SelectionCellProps<UserDataGridRow>) => {
200
+ const profile = row.profile as Record<string, unknown> | null;
201
+ const avatarUrl = profile?.avatar_url as string | undefined;
202
+ const name = profile?.name as string | undefined;
203
+
204
+ return (
205
+ <div className="flex items-center gap-2 w-full h-full">
206
+ <Checkbox checked={isSelected} onChange={onToggle} tabIndex={tabIndex} />
207
+ <div className="flex items-center gap-2 min-w-0 flex-1">
208
+ <Avatar className="w-6 h-6 rounded-full flex-shrink-0">
209
+ <AvatarImage src={avatarUrl} alt={name || 'User avatar'} className="object-cover" />
210
+ <AvatarFallback className="bg-gray-200 dark:bg-neutral-700 rounded-full">
211
+ <User className="w-4 h-4 text-gray-500 dark:text-neutral-400" />
212
+ </AvatarFallback>
213
+ </Avatar>
214
+ <span
215
+ className={cn(
216
+ 'text-sm truncate',
217
+ name ? 'text-black dark:text-zinc-300' : 'text-gray-400 dark:text-neutral-500'
218
+ )}
219
+ title={name || 'null'}
220
+ >
221
+ {name || 'null'}
222
+ </span>
223
+ </div>
224
+ </div>
225
+ );
226
+ };
205
227
 
206
228
  // Specialized DataGrid for users
207
229
  export function UsersDataGrid(props: UsersDataGridProps) {
@@ -214,6 +236,8 @@ export function UsersDataGrid(props: UsersDataGridProps) {
214
236
  showSelection={true}
215
237
  showPagination={true}
216
238
  showTypeBadge={false}
239
+ selectionColumnWidth={180}
240
+ renderSelectionCell={UserSelectionCell}
217
241
  />
218
242
  );
219
243
  }
@@ -1,5 +1,5 @@
1
- export { AuthPreview } from './AuthPreview';
2
- export { OAuthConfigDialog } from './OAuthConfigDialog';
3
- export { OAuthEmptyState } from './OAuthEmptyState';
4
- export { default as UserFormDialog } from './UserFormDialog';
5
- export { createUsersColumns, UsersDataGrid, type UsersDataGridProps } from './UsersDataGrid';
1
+ export { AuthPreview } from './AuthPreview';
2
+ export { OAuthConfigDialog } from './OAuthConfigDialog';
3
+ export { OAuthEmptyState } from './OAuthEmptyState';
4
+ export { default as UserFormDialog } from './UserFormDialog';
5
+ export { createUsersColumns, UsersDataGrid, type UsersDataGridProps } from './UsersDataGrid';