studiocms 0.2.0 → 0.4.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 (293) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/dist/cli/add/index.d.ts +2 -2
  3. package/dist/cli/add/index.js +4 -3
  4. package/dist/cli/add/npm-utils.d.ts +6 -6
  5. package/dist/cli/add/tryToInstallPlugins.d.ts +1 -1
  6. package/dist/cli/add/tryToInstallPlugins.js +6 -5
  7. package/dist/cli/add/updateStudioCMSConfig.d.ts +1 -1
  8. package/dist/cli/add/updateStudioCMSConfig.js +3 -4
  9. package/dist/cli/add/validatePlugins.d.ts +1 -2
  10. package/dist/cli/add/validatePlugins.js +15 -9
  11. package/dist/cli/crypto/genJWT/index.d.ts +1 -1
  12. package/dist/cli/crypto/genJWT/index.js +8 -9
  13. package/dist/cli/crypto/index.d.ts +1 -1
  14. package/dist/cli/init/steps/env.js +14 -4
  15. package/dist/cli/init/steps/next.d.ts +1 -1
  16. package/dist/cli/init/steps/next.js +6 -5
  17. package/dist/cli/migrator/index.d.ts +1 -1
  18. package/dist/cli/migrator/index.js +2 -2
  19. package/dist/cli/users/index.d.ts +1 -1
  20. package/dist/cli/users/shared.js +2 -2
  21. package/dist/cli/users/steps/createUsers.js +7 -7
  22. package/dist/cli/users/steps/modifyUsers.js +2 -2
  23. package/dist/cli/users/steps/next.d.ts +1 -1
  24. package/dist/cli/utils/checkRequiredEnvVars.js +2 -2
  25. package/dist/cli/utils/context.d.ts +2 -4
  26. package/dist/cli/utils/context.js +1 -3
  27. package/dist/cli/utils/getCliDbClient.d.ts +1 -1
  28. package/dist/cli/utils/intro.d.ts +1 -1
  29. package/dist/cli/utils/loadConfig.d.ts +54 -49
  30. package/dist/cli/utils/loadConfig.js +5 -8
  31. package/dist/cli/utils/logger.js +3 -3
  32. package/dist/cli/utils/user-utils.d.ts +1 -1
  33. package/dist/cli/utils/user-utils.js +4 -3
  34. package/dist/client/apiClient.d.ts +4923 -0
  35. package/dist/client/apiClient.js +72 -0
  36. package/dist/config.d.ts +1734 -1
  37. package/dist/consts.d.ts +5 -5
  38. package/dist/consts.js +3 -2
  39. package/dist/db/plugins.d.ts +1 -1
  40. package/dist/db/plugins.js +5 -8
  41. package/dist/handlers/frontend/routes.d.ts +4 -18
  42. package/dist/handlers/frontend/routes.js +13 -152
  43. package/dist/handlers/frontend/types.d.ts +1 -1
  44. package/dist/handlers/frontend/utils.js +0 -18
  45. package/dist/handlers/pluginHandler.d.ts +34 -257
  46. package/dist/handlers/pluginHandler.js +92 -46
  47. package/dist/handlers/routeHandler.js +32 -11
  48. package/dist/handlers/setupDbStudio.d.ts +3 -1
  49. package/dist/handlers/setupDbStudio.js +19 -10
  50. package/dist/handlers/storage-manager/core/effectify-astro-context.d.ts +25 -0
  51. package/dist/handlers/storage-manager/core/effectify-astro-context.js +78 -0
  52. package/dist/handlers/storage-manager/no-op.d.ts +2 -2
  53. package/dist/handlers/storage-manager/no-op.js +2 -3
  54. package/dist/index.d.ts +0 -1
  55. package/dist/index.js +10 -20
  56. package/dist/integrations/robots/index.d.ts +2 -2
  57. package/dist/integrations/robots/index.js +1 -3
  58. package/dist/integrations/robots/schema.d.ts +102 -273
  59. package/dist/integrations/robots/schema.js +220 -209
  60. package/dist/plugins/analytics/assets/schemas.d.ts +14 -9
  61. package/dist/plugins/analytics/assets/schemas.js +25 -17
  62. package/dist/plugins/analytics/db-client.d.ts +1 -1
  63. package/dist/plugins/analytics/index.d.ts +823 -3
  64. package/dist/plugins/analytics/index.js +4 -5
  65. package/dist/plugins/analytics/schemas.d.ts +54 -62
  66. package/dist/plugins/analytics/schemas.js +64 -13
  67. package/dist/plugins/analytics/table.d.ts +1 -1
  68. package/dist/plugins.d.ts +0 -1
  69. package/dist/schemas/config/api.d.ts +17 -0
  70. package/dist/schemas/config/api.js +14 -0
  71. package/dist/schemas/config/auth.d.ts +55 -59
  72. package/dist/schemas/config/auth.js +34 -11
  73. package/dist/schemas/config/dashboard.d.ts +43 -79
  74. package/dist/schemas/config/dashboard.js +43 -12
  75. package/dist/schemas/config/db.d.ts +15 -17
  76. package/dist/schemas/config/db.js +13 -5
  77. package/dist/schemas/config/developer.d.ts +33 -45
  78. package/dist/schemas/config/developer.js +22 -5
  79. package/dist/schemas/config/index.d.ts +398 -521
  80. package/dist/schemas/config/index.js +115 -57
  81. package/dist/schemas/config/sdk.d.ts +50 -196
  82. package/dist/schemas/config/sdk.js +61 -73
  83. package/dist/schemas/custom.d.ts +40 -0
  84. package/dist/schemas/custom.js +41 -0
  85. package/dist/schemas/external-schemas.d.ts +171 -0
  86. package/dist/schemas/external-schemas.js +179 -0
  87. package/dist/schemas/index.d.ts +2 -0
  88. package/dist/schemas/index.js +2 -0
  89. package/dist/schemas/plugins/i18n.d.ts +59 -39
  90. package/dist/schemas/plugins/i18n.js +42 -5
  91. package/dist/schemas/plugins/index.d.ts +7126 -10296
  92. package/dist/schemas/plugins/index.js +260 -276
  93. package/dist/schemas/plugins/shared.d.ts +1293 -3718
  94. package/dist/schemas/plugins/shared.js +320 -329
  95. package/dist/test-utils.d.ts +15 -4
  96. package/dist/test-utils.js +27 -11
  97. package/dist/toolbar/db-viewer/db-shared-types.d.ts +6 -6
  98. package/dist/toolbar/db-viewer/studio/connection.d.ts +8 -4
  99. package/dist/toolbar/db-viewer/studio/connection.js +2 -28
  100. package/dist/toolbar/db-viewer/studio/env/libsql.d.ts +7 -0
  101. package/dist/toolbar/db-viewer/studio/env/libsql.js +17 -0
  102. package/dist/toolbar/db-viewer/studio/env/mysql.d.ts +7 -0
  103. package/dist/toolbar/db-viewer/studio/env/mysql.js +23 -0
  104. package/dist/toolbar/db-viewer/studio/env/postgres.d.ts +7 -0
  105. package/dist/toolbar/db-viewer/studio/env/postgres.js +23 -0
  106. package/dist/toolbar/db-viewer/studio/index.js +20 -56
  107. package/dist/toolbar/db-viewer/studio/type.d.ts +1 -2
  108. package/dist/toolbar/db-viewer/studio/virtual-connection/libsql.d.ts +3 -0
  109. package/dist/toolbar/db-viewer/studio/virtual-connection/libsql.js +24 -0
  110. package/dist/toolbar/db-viewer/studio/virtual-connection/mysql.d.ts +3 -0
  111. package/dist/toolbar/db-viewer/studio/virtual-connection/mysql.js +9 -0
  112. package/dist/toolbar/db-viewer/studio/virtual-connection/postgres.d.ts +3 -0
  113. package/dist/toolbar/db-viewer/studio/virtual-connection/postgres.js +9 -0
  114. package/dist/toolbar/db-viewer/viewer.js +20 -21
  115. package/dist/types.d.ts +30 -0
  116. package/dist/utils/effects/smtp.d.ts +1 -1
  117. package/dist/utils/lang-helper.d.ts +10 -2
  118. package/dist/virtual.d.ts +35 -28
  119. package/dist/virtuals/auth/core.d.ts +5 -5
  120. package/dist/virtuals/auth/verify-email.d.ts +6 -6
  121. package/dist/virtuals/components/Generator.astro +2 -2
  122. package/dist/virtuals/components/Renderer.astro +9 -1
  123. package/dist/virtuals/components/renderFn.d.ts +3 -1
  124. package/dist/virtuals/components/renderFn.js +18 -0
  125. package/dist/virtuals/lib/headDefaults.d.ts +4 -2
  126. package/dist/virtuals/lib/headDefaults.js +0 -2
  127. package/dist/virtuals/lib/routeMap.d.ts +0 -12
  128. package/dist/virtuals/lib/routeMap.js +2 -14
  129. package/dist/virtuals/mailer/index.d.ts +3 -3
  130. package/dist/virtuals/notifier/index.d.ts +5 -5
  131. package/dist/virtuals/plugins/dashboard-pages.d.ts +2 -64
  132. package/dist/virtuals/scripts/StorageFileBrowser.d.ts +1 -172
  133. package/dist/virtuals/scripts/StorageFileBrowser.js +216 -119
  134. package/dist/virtuals/template-engine/index.d.ts +4 -4
  135. package/frontend/components/dashboard/configuration/ConfigForm.astro +218 -110
  136. package/frontend/components/dashboard/content-mgmt/ContentSearch.astro +21 -22
  137. package/frontend/components/dashboard/content-mgmt/CreateFolder.astro +66 -54
  138. package/frontend/components/dashboard/content-mgmt/CreatePage.astro +58 -104
  139. package/frontend/components/dashboard/content-mgmt/EditFolder.astro +65 -67
  140. package/frontend/components/dashboard/content-mgmt/EditPage.astro +86 -134
  141. package/frontend/components/dashboard/content-mgmt/InnerSidebarElement.astro +0 -1
  142. package/frontend/components/dashboard/content-mgmt/PageHeader.astro +33 -52
  143. package/frontend/components/dashboard/content-mgmt/PageTypeHandler.astro +2 -2
  144. package/frontend/components/dashboard/profile/APITokens.astro +219 -158
  145. package/frontend/components/dashboard/profile/BasicInfo.astro +165 -106
  146. package/frontend/components/dashboard/profile/Notifications.astro +27 -18
  147. package/frontend/components/dashboard/profile/UpdatePassword.astro +134 -94
  148. package/frontend/components/dashboard/sidebar/VersionCheck.astro +31 -16
  149. package/frontend/components/dashboard/sidebar/VersionCheckChangelog.astro +18 -11
  150. package/frontend/components/dashboard/sidebar-modals/VersionModal.astro +2 -2
  151. package/frontend/components/dashboard/smtp-config/TemplateEditor.astro +14 -14
  152. package/frontend/components/dashboard/taxonomy/InnerSidebarElement.astro +0 -1
  153. package/frontend/components/dashboard/taxonomy/MetaContainer.astro +0 -2
  154. package/frontend/components/dashboard/taxonomy/PageHeader.astro +16 -24
  155. package/frontend/components/dashboard/taxonomy/TaxonomySearch.astro +23 -27
  156. package/frontend/components/dashboard/user-mgmt/InnerSidebarElement.astro +111 -104
  157. package/frontend/components/dashboard/user-mgmt/UserListItem.astro +9 -22
  158. package/frontend/components/dashboard/user-mgmt/UserListItems.astro +18 -0
  159. package/frontend/components/first-time-setup/snippets/{opt2-studiocms.config.diff → studiocms.config.diff} +1 -0
  160. package/frontend/components/shared/Code.astro +1 -4
  161. package/frontend/components/shared/DynamicSettingsRenderer.astro +1 -1
  162. package/frontend/components/shared/SSRUser.astro +2 -4
  163. package/frontend/components/shared/foldertree/FolderTreeNode.astro +0 -6
  164. package/frontend/components/shared/storage-manager/StorageCopyOutput.astro +0 -1
  165. package/frontend/components/shared/taxonomy/TaxonomyTreeNode.astro +0 -6
  166. package/frontend/layouts/DashboardLayout.astro +1 -10
  167. package/frontend/layouts/TaxonomyLayout.astro +0 -1
  168. package/frontend/middleware/index.ts +102 -61
  169. package/frontend/pages/404.astro +5 -9
  170. package/frontend/pages/[dashboard]/[...pluginPage].astro +10 -1
  171. package/frontend/pages/[dashboard]/configuration.astro +10 -1
  172. package/frontend/pages/[dashboard]/content-management/createfolder.astro +10 -1
  173. package/frontend/pages/[dashboard]/content-management/createpage.astro +10 -1
  174. package/frontend/pages/[dashboard]/content-management/diff.astro +39 -14
  175. package/frontend/pages/[dashboard]/content-management/editfolder.astro +10 -1
  176. package/frontend/pages/[dashboard]/content-management/editpage.astro +10 -1
  177. package/frontend/pages/[dashboard]/content-management/index.astro +10 -1
  178. package/frontend/pages/[dashboard]/index.astro +10 -1
  179. package/frontend/pages/[dashboard]/login.astro +86 -25
  180. package/frontend/pages/[dashboard]/password-reset.astro +22 -16
  181. package/frontend/pages/[dashboard]/plugins/[plugin].astro +10 -1
  182. package/frontend/pages/[dashboard]/profile.astro +10 -1
  183. package/frontend/pages/[dashboard]/signup.astro +153 -52
  184. package/frontend/pages/[dashboard]/smtp-configuration.astro +77 -75
  185. package/frontend/pages/[dashboard]/system-management.astro +10 -1
  186. package/frontend/pages/[dashboard]/taxonomy/categories.astro +30 -41
  187. package/frontend/pages/[dashboard]/taxonomy/index.astro +10 -0
  188. package/frontend/pages/[dashboard]/taxonomy/tags.astro +33 -43
  189. package/frontend/pages/[dashboard]/unverified-email.astro +29 -21
  190. package/frontend/pages/[dashboard]/user-management/edit.astro +170 -90
  191. package/frontend/pages/[dashboard]/user-management/index.astro +10 -1
  192. package/frontend/pages/studiocms_api/[...all].ts +106 -0
  193. package/frontend/pages/studiocms_api/_handlers/_utils/auth.ts +26 -0
  194. package/frontend/pages/studiocms_api/_handlers/_utils/changelog.ts +147 -0
  195. package/frontend/pages/studiocms_api/_handlers/_utils/db-studio-driver.ts +46 -0
  196. package/frontend/pages/studiocms_api/_handlers/_utils/parseLogLevel.ts +27 -0
  197. package/frontend/pages/studiocms_api/_handlers/auth/auth.ts +459 -0
  198. package/frontend/pages/studiocms_api/_handlers/auth/index.ts +17 -0
  199. package/frontend/pages/studiocms_api/_handlers/auth/oauth.ts +91 -0
  200. package/frontend/pages/studiocms_api/_handlers/dashboard/_shared.ts +57 -0
  201. package/frontend/pages/studiocms_api/_handlers/dashboard/apiTokens.ts +134 -0
  202. package/frontend/pages/studiocms_api/_handlers/dashboard/config.ts +64 -0
  203. package/frontend/pages/studiocms_api/_handlers/dashboard/content.ts +741 -0
  204. package/frontend/pages/studiocms_api/_handlers/dashboard/create.ts +480 -0
  205. package/frontend/pages/studiocms_api/_handlers/dashboard/emailNotifications.ts +49 -0
  206. package/frontend/pages/studiocms_api/_handlers/dashboard/index.ts +45 -0
  207. package/frontend/pages/studiocms_api/_handlers/dashboard/mailer.ts +136 -0
  208. package/frontend/pages/studiocms_api/_handlers/dashboard/plugins.ts +80 -0
  209. package/frontend/pages/studiocms_api/_handlers/dashboard/profile.ts +275 -0
  210. package/frontend/pages/studiocms_api/_handlers/dashboard/resetPassword.ts +140 -0
  211. package/frontend/pages/studiocms_api/_handlers/dashboard/search.ts +63 -0
  212. package/frontend/pages/studiocms_api/_handlers/dashboard/taxonomy.ts +285 -0
  213. package/frontend/pages/studiocms_api/_handlers/dashboard/templates.ts +75 -0
  214. package/frontend/pages/studiocms_api/_handlers/dashboard/users.ts +312 -0
  215. package/frontend/pages/studiocms_api/_handlers/dashboard/verifyEndpoints.ts +307 -0
  216. package/frontend/pages/studiocms_api/_handlers/integration/dbStudio.ts +98 -0
  217. package/frontend/pages/studiocms_api/_handlers/integration/index.ts +17 -0
  218. package/frontend/pages/studiocms_api/_handlers/integration/storageManager.ts +107 -0
  219. package/frontend/pages/studiocms_api/_handlers/rest-api/index.ts +8 -0
  220. package/frontend/pages/studiocms_api/_handlers/rest-api/v1/_shared.ts +41 -0
  221. package/frontend/pages/studiocms_api/_handlers/rest-api/v1/index.ts +17 -0
  222. package/frontend/pages/studiocms_api/_handlers/rest-api/v1/public.ts +195 -0
  223. package/frontend/pages/studiocms_api/_handlers/rest-api/v1/secure.ts +1726 -0
  224. package/frontend/pages/studiocms_api/_handlers/sdk.ts +129 -0
  225. package/frontend/pages/studiocms_api/_middleware/astroLocals.ts +36 -0
  226. package/frontend/pages/studiocms_api/_middleware/restApi.ts +56 -0
  227. package/frontend/pages/studiocms_api/integrations/[...all].ts +8 -0
  228. package/frontend/scripts/formdata.ts +219 -0
  229. package/frontend/setup-pages/3-done.astro +4 -20
  230. package/frontend/setup-pages/studiocms_api/dashboard/step-2.ts +3 -6
  231. package/frontend/styles/dashboard-base.css +0 -1
  232. package/frontend/web-vitals/endpoint.ts +2 -1
  233. package/package.json +35 -31
  234. package/dist/global.d.ts +0 -9
  235. package/frontend/components/dashboard/LoginChecker.astro +0 -68
  236. package/frontend/components/dashboard/user-mgmt/RankCheck.astro +0 -57
  237. package/frontend/components/first-time-setup/snippets/opt1-astro.config.diff +0 -14
  238. package/frontend/components/first-time-setup/snippets/opt2-astro.config.diff +0 -9
  239. package/frontend/middleware/_authmap.ts +0 -63
  240. package/frontend/pages/studiocms_api/auth/[path].ts +0 -390
  241. package/frontend/pages/studiocms_api/auth/[provider]/[...id].ts +0 -64
  242. package/frontend/pages/studiocms_api/auth/[provider]/_effects/index.ts +0 -101
  243. package/frontend/pages/studiocms_api/auth/_shared.ts +0 -52
  244. package/frontend/pages/studiocms_api/dashboard/api-tokens.ts +0 -115
  245. package/frontend/pages/studiocms_api/dashboard/config.ts +0 -74
  246. package/frontend/pages/studiocms_api/dashboard/content/diff.ts +0 -73
  247. package/frontend/pages/studiocms_api/dashboard/content/folder.ts +0 -220
  248. package/frontend/pages/studiocms_api/dashboard/content/page.ts +0 -359
  249. package/frontend/pages/studiocms_api/dashboard/create-reset-link.ts +0 -77
  250. package/frontend/pages/studiocms_api/dashboard/create-user-invite.ts +0 -231
  251. package/frontend/pages/studiocms_api/dashboard/create-user.ts +0 -186
  252. package/frontend/pages/studiocms_api/dashboard/email-notification-settings-site.ts +0 -74
  253. package/frontend/pages/studiocms_api/dashboard/mailer/check-email.ts +0 -75
  254. package/frontend/pages/studiocms_api/dashboard/mailer/config.ts +0 -136
  255. package/frontend/pages/studiocms_api/dashboard/plugins/[plugin].ts +0 -80
  256. package/frontend/pages/studiocms_api/dashboard/profile.ts +0 -245
  257. package/frontend/pages/studiocms_api/dashboard/resend-verify-email.ts +0 -77
  258. package/frontend/pages/studiocms_api/dashboard/reset-password.ts +0 -124
  259. package/frontend/pages/studiocms_api/dashboard/search-list.ts +0 -59
  260. package/frontend/pages/studiocms_api/dashboard/taxonomy-search.ts +0 -47
  261. package/frontend/pages/studiocms_api/dashboard/taxonomy.ts +0 -230
  262. package/frontend/pages/studiocms_api/dashboard/templates.ts +0 -74
  263. package/frontend/pages/studiocms_api/dashboard/update-user-notifications.ts +0 -86
  264. package/frontend/pages/studiocms_api/dashboard/users.ts +0 -236
  265. package/frontend/pages/studiocms_api/dashboard/verify-email.ts +0 -83
  266. package/frontend/pages/studiocms_api/dashboard/verify-session.ts +0 -187
  267. package/frontend/pages/studiocms_api/integrations/[type]/[...id].ts +0 -15
  268. package/frontend/pages/studiocms_api/integrations/[type]/_routes/db-studio.ts +0 -173
  269. package/frontend/pages/studiocms_api/integrations/[type]/_routes/storage.ts +0 -88
  270. package/frontend/pages/studiocms_api/partials/editor.astro +0 -74
  271. package/frontend/pages/studiocms_api/partials/render.astro +0 -39
  272. package/frontend/pages/studiocms_api/partials/user-list-items.astro +0 -43
  273. package/frontend/pages/studiocms_api/rest/utils/auth-token.ts +0 -59
  274. package/frontend/pages/studiocms_api/rest/v1/[type]/[...id].ts +0 -23
  275. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/categories.ts +0 -267
  276. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/folders.ts +0 -283
  277. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/pages.ts +0 -505
  278. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/settings.ts +0 -100
  279. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/tags.ts +0 -229
  280. package/frontend/pages/studiocms_api/rest/v1/[type]/_routes/users.ts +0 -553
  281. package/frontend/pages/studiocms_api/rest/v1/public/[type]/[...id].ts +0 -19
  282. package/frontend/pages/studiocms_api/rest/v1/public/[type]/_routes/categories.ts +0 -74
  283. package/frontend/pages/studiocms_api/rest/v1/public/[type]/_routes/folders.ts +0 -85
  284. package/frontend/pages/studiocms_api/rest/v1/public/[type]/_routes/pages.ts +0 -103
  285. package/frontend/pages/studiocms_api/rest/v1/public/[type]/_routes/tags.ts +0 -67
  286. package/frontend/pages/studiocms_api/sdk/[...path].ts +0 -97
  287. package/frontend/pages/studiocms_api/sdk/utils/changelog.ts +0 -119
  288. package/frontend/scripts/auth/formListener.ts +0 -81
  289. package/frontend/scripts/formdata-utils.ts +0 -116
  290. package/frontend/utils/build-partial-schema.ts +0 -46
  291. package/frontend/utils/errors.ts +0 -6
  292. package/frontend/utils/param-extractor.ts +0 -83
  293. package/frontend/utils/rest-router.ts +0 -444
@@ -17,156 +17,216 @@ const lang = Astro.locals.StudioCMS.defaultLang;
17
17
  const t = useTranslations(lang, '@studiocms/dashboard:profile');
18
18
  ---
19
19
 
20
- <Card fullWidth as="form" id="basic-info-form" class="basic-info-form" action={Astro.locals.StudioCMS.routeMap.endpointLinks.profile}>
21
-
20
+ <Card
21
+ fullWidth
22
+ as="form"
23
+ id="basic-info-form"
24
+ class="basic-info-form"
25
+ >
22
26
  <div slot="header">
23
27
  <h2>
24
- <t-profile-basic key="basic-info-header">{t('basic-info-header')}</t-profile-basic>
28
+ <t-profile-basic key="basic-info-header"
29
+ >{t("basic-info-header")}</t-profile-basic
30
+ >
25
31
  </h2>
26
-
32
+
27
33
  <div class="form-header">
28
34
  <Group>
29
- <Button id="refresh-avatar" size='sm' variant={'outlined'} color={'info'} data-url={Astro.locals.StudioCMS.routeMap.endpointLinks.profile}>
30
- <Icon slot="start-content" name="heroicons:user-circle" width={24} height={24} />
35
+ <Button
36
+ id="refresh-avatar"
37
+ size="sm"
38
+ variant={"outlined"}
39
+ color={"info"}
40
+ >
41
+ <Icon
42
+ slot="start-content"
43
+ name="heroicons:user-circle"
44
+ width={24}
45
+ height={24}
46
+ />
31
47
  <t-profile-basic key="sync-with-libravatar">
32
- {t('sync-with-libravatar')}
48
+ {t("sync-with-libravatar")}
33
49
  </t-profile-basic>
34
50
  </Button>
35
- <Button type='submit' size='sm' variant={'solid'} color='primary'>
36
- <Icon slot="start-content" name="heroicons:check" width={24} height={24} />
51
+ <Button
52
+ type="submit"
53
+ size="sm"
54
+ variant={"solid"}
55
+ color="primary"
56
+ >
57
+ <Icon
58
+ slot="start-content"
59
+ name="heroicons:check"
60
+ width={24}
61
+ height={24}
62
+ />
37
63
  <t-profile-basic key="basic-info-save-button">
38
- {t('basic-info-save-button')}
64
+ {t("basic-info-save-button")}
39
65
  </t-profile-basic>
40
- </Button>
66
+ </Button>
41
67
  </Group>
42
68
  </div>
43
69
  </div>
44
70
 
45
71
  <div class="form-inputs">
46
-
47
- <Input label={t('basic-info-display-name')} placeholder='John Doe' value={data?.user?.name} isRequired name='display-name' />
48
-
49
- <Input label={t('basic-info-username')} placeholder='johndoe' value={data?.user?.username} isRequired name='username' />
50
-
51
- <Input label={t('basic-info-email')} placeholder='john@doe.com' value={data?.user?.email} isRequired name='email' />
52
-
53
- <Input label={t('basic-info-website')} placeholder='https://doe.com' value={data?.user?.url} name='account-url' />
54
-
55
- <Input label={t('basic-avatar-url')} placeholder="https://seccdn.libravatar.org/avatar/..." value={data?.user?.avatar} name="avatar" />
56
-
72
+ <Input
73
+ label={t("basic-info-display-name")}
74
+ placeholder="John Doe"
75
+ value={data?.user?.name}
76
+ isRequired
77
+ name="display-name"
78
+ />
79
+
80
+ <Input
81
+ label={t("basic-info-username")}
82
+ placeholder="johndoe"
83
+ value={data?.user?.username}
84
+ isRequired
85
+ name="username"
86
+ />
87
+
88
+ <Input
89
+ label={t("basic-info-email")}
90
+ placeholder="john@doe.com"
91
+ value={data?.user?.email}
92
+ isRequired
93
+ name="email"
94
+ />
95
+
96
+ <Input
97
+ label={t("basic-info-website")}
98
+ placeholder="https://doe.com"
99
+ value={data?.user?.url}
100
+ name="account-url"
101
+ />
102
+
103
+ <Input
104
+ label={t("basic-avatar-url")}
105
+ placeholder="https://seccdn.libravatar.org/avatar/..."
106
+ value={data?.user?.avatar}
107
+ name="avatar"
108
+ />
109
+
110
+ <input type="hidden" name="email-verified" value={data?.user?.emailVerified ? "true" : "false"} />
57
111
  </div>
58
-
59
112
  </Card>
60
113
 
61
114
  <script>
62
- import {
115
+ import {
63
116
  $i18n,
64
117
  baseTranslation,
65
118
  makeTranslation,
66
119
  updateElmLabel,
67
- } from 'studiocms:i18n/client';
120
+ } from "studiocms:i18n/client";
68
121
 
69
- const currentPage = '@studiocms/dashboard:profile';
122
+ const currentPage = "@studiocms/dashboard:profile";
70
123
 
71
124
  const i18n = $i18n(currentPage, baseTranslation[currentPage]);
72
-
73
- i18n.subscribe(comp => {
74
- updateElmLabel('display-name', comp['basic-info-display-name']);
75
- updateElmLabel('username', comp['basic-info-username']);
76
- updateElmLabel('email', comp['basic-info-email']);
77
- updateElmLabel('account-url', comp['basic-info-website']);
125
+
126
+ i18n.subscribe((comp) => {
127
+ updateElmLabel("display-name", comp["basic-info-display-name"]);
128
+ updateElmLabel("username", comp["basic-info-username"]);
129
+ updateElmLabel("email", comp["basic-info-email"]);
130
+ updateElmLabel("account-url", comp["basic-info-website"]);
78
131
  });
79
132
 
80
- if (!customElements.get('t-profile-basic')) {
81
- customElements.define('t-profile-basic', makeTranslation(currentPage, i18n));
133
+ if (!customElements.get("t-profile-basic")) {
134
+ customElements.define(
135
+ "t-profile-basic",
136
+ makeTranslation(currentPage, i18n),
137
+ );
82
138
  }
83
139
  </script>
84
140
 
85
-
86
141
  <script>
87
142
  import { toast } from "studiocms:ui/components/toaster/client";
143
+ import { dashboardClient, dashboardSharedCatchTags } from "studiocms:client/apiClients";
144
+ import * as Effect from "effect/Effect";
88
145
 
89
- const syncAvatar = document.getElementById('refresh-avatar') as HTMLButtonElement;
90
- const syncUrl = syncAvatar.dataset.url as string;
146
+ const syncAvatar = document.getElementById(
147
+ "refresh-avatar",
148
+ ) as HTMLButtonElement;
91
149
 
92
- syncAvatar.addEventListener('click', async (e) => {
150
+ syncAvatar.addEventListener("click", async (e) => {
93
151
  e.preventDefault();
94
152
 
95
- const response = await fetch(syncUrl, {
96
- method: 'POST',
97
- headers: {
98
- 'Content-Type': 'application/json',
99
- },
100
- body: JSON.stringify({ mode: 'avatar' })
101
- })
102
-
103
- const res = await response.json();
104
-
105
- if (response.status !== 200) {
153
+ const response = await dashboardClient.pipe(
154
+ Effect.flatMap((client) =>
155
+ client.profile.updateUserProfile({
156
+ payload: {
157
+ mode: "avatar",
158
+ },
159
+ }),
160
+ ),
161
+ Effect.catchTags(dashboardSharedCatchTags),
162
+ Effect.runPromise,
163
+ );
164
+
165
+ if ("error" in response) {
166
+ toast({
167
+ title: "Error",
168
+ description: response.error,
169
+ type: "danger",
170
+ });
171
+ } else {
106
172
  toast({
107
- title: 'Error',
108
- description: res.error,
109
- type: 'danger'
110
- })
173
+ title: "Success",
174
+ description:
175
+ response.message || "Avatar synchronized successfully",
176
+ type: "success",
177
+ });
111
178
  }
179
+ });
180
+
181
+ const basicInfoForm = document.getElementById(
182
+ "basic-info-form",
183
+ ) as HTMLFormElement;
184
+
185
+ basicInfoForm.addEventListener("submit", async (e) => {
186
+ e.preventDefault();
112
187
 
113
- if (response.status === 200) {
188
+ const formData = new FormData(basicInfoForm);
189
+
190
+ const response = await dashboardClient.pipe(
191
+ Effect.flatMap((client) =>
192
+ client.profile.updateUserProfile({
193
+ payload: {
194
+ mode: "basic",
195
+ data: {
196
+ name: formData.get("display-name") as string,
197
+ username: formData.get("username") as string,
198
+ email: formData.get("email") as string,
199
+ url: (formData.get("account-url") ?? null) as string | null,
200
+ avatar: (formData.get("avatar") ?? null) as string | null,
201
+ emailVerified: formData.get("email-verified") === "true",
202
+ createdAt: undefined,
203
+ updatedAt: new Date().toISOString(),
204
+ },
205
+ },
206
+ }),
207
+ ),
208
+ Effect.catchTags(dashboardSharedCatchTags),
209
+ Effect.runPromise,
210
+ );
211
+
212
+ if ("error" in response) {
213
+ toast({
214
+ title: "Error",
215
+ description: response.error,
216
+ type: "danger",
217
+ });
218
+ } else {
114
219
  toast({
115
- title: 'Success',
116
- description: res.message,
117
- type: 'success'
118
- })
220
+ title: "Success",
221
+ description:
222
+ response.message || "Profile updated successfully",
223
+ type: "success",
224
+ });
119
225
  }
120
- })
121
-
122
- const basicInfoForm = document.getElementById('basic-info-form') as HTMLFormElement;
123
- basicInfoForm.addEventListener('submit', async (e) => {
124
- e.preventDefault();
125
-
126
- const formData = new FormData(basicInfoForm);
127
-
128
- const data = {
129
- mode: 'basic',
130
- data: {
131
- name: formData.get('display-name') as string,
132
- username: formData.get('username') as string,
133
- email: formData.get('email') as string,
134
- url: formData.get('account-url') ?? null,
135
- avatar: formData.get('avatar') ?? null,
136
- }
137
- }
138
-
139
- const response = await fetch(basicInfoForm.action, {
140
- method: 'POST',
141
- headers: {
142
- 'Content-Type': 'application/json',
143
- },
144
- body: JSON.stringify(data)
145
- })
146
-
147
- const res = await response.json();
148
-
149
- if (response.status !== 200) {
150
- toast({
151
- title: 'Error',
152
- description: res.error,
153
- type: 'danger'
154
- })
155
- }
156
-
157
- if (response.status === 200) {
158
- toast({
159
- title: 'Success',
160
- description: res.message,
161
- type: 'success'
162
- })
163
- }
164
-
165
- });
226
+ });
166
227
  </script>
167
228
 
168
229
  <style>
169
-
170
230
  .basic-info-form {
171
231
  position: relative;
172
232
  }
@@ -187,5 +247,4 @@ const t = useTranslations(lang, '@studiocms/dashboard:profile');
187
247
  top: 1rem;
188
248
  right: 1rem;
189
249
  }
190
-
191
250
  </style>
@@ -53,7 +53,7 @@ const t = useTranslations(lang, '@studiocms/dashboard:profile-notifications');
53
53
 
54
54
  type TKey = Parameters<typeof t>[0];
55
55
  ---
56
- <Card fullWidth as="form" id="notifications-form" class="notifications-update-form" action={Astro.locals.StudioCMS.routeMap.endpointLinks.updateUserNotifications}>
56
+ <Card fullWidth as="form" id="notifications-form" class="notifications-update-form">
57
57
 
58
58
  <div slot="header">
59
59
  <h2><t-notifications key="header-title">{t('header-title')}</t-notifications></h2>
@@ -161,7 +161,9 @@ type TKey = Parameters<typeof t>[0];
161
161
 
162
162
  <script>
163
163
  import { toast } from 'studiocms:ui/components/toaster/client';
164
- import { getEnabledNotificationCheckboxes, formatNotificationOptions } from 'studiocms:notifier/client'
164
+ import { getEnabledNotificationCheckboxes, formatNotificationOptions } from 'studiocms:notifier/client';
165
+ import { dashboardClient, dashboardSharedCatchTags } from 'studiocms:client/apiClients';
166
+ import * as Effect from 'effect/Effect';
165
167
 
166
168
  const form = document.getElementById('notifications-form') as HTMLFormElement;
167
169
 
@@ -174,31 +176,38 @@ type TKey = Parameters<typeof t>[0];
174
176
 
175
177
  const formattedOptions = formatNotificationOptions(enabledCheckboxes);
176
178
 
177
- const data = {
178
- userId: formData.get('user_id'),
179
- notifications: formattedOptions
180
- };
179
+ const userId = formData.get('user_id')?.toString();
181
180
 
182
- const response = await fetch(form.action, {
183
- method: 'POST',
184
- headers: {
185
- 'Content-Type': 'application/json'
186
- },
187
- body: JSON.stringify(data)
188
- });
189
-
190
- const result = await response.json();
181
+ if (!userId) {
182
+ toast({
183
+ title: 'Error',
184
+ description: 'User ID is missing. Please refresh the page and try again.',
185
+ type: 'danger',
186
+ });
187
+ return;
188
+ }
191
189
 
192
- if (response.ok) {
190
+ const response = await dashboardClient.pipe(
191
+ Effect.flatMap((client) => client.users.updateUserNotifications({
192
+ payload: {
193
+ id: userId,
194
+ notifications: formattedOptions
195
+ }
196
+ })),
197
+ Effect.catchTags(dashboardSharedCatchTags),
198
+ Effect.runPromise
199
+ );
200
+
201
+ if ('message' in response) {
193
202
  toast({
194
203
  title: 'Notifications Updated',
195
- description: result.message,
204
+ description: response.message,
196
205
  type: 'success',
197
206
  })
198
207
  } else {
199
208
  toast({
200
209
  title: 'Error',
201
- description: result.error,
210
+ description: response.error,
202
211
  type: 'danger',
203
212
  })
204
213
  }
@@ -18,130 +18,170 @@ const lang = Astro.locals.StudioCMS.defaultLang;
18
18
  const t = useTranslations(lang, '@studiocms/dashboard:profile');
19
19
  ---
20
20
 
21
- <Card fullWidth as="form" id="password-update-form" class="password-update-form" action={Astro.locals.StudioCMS.routeMap.endpointLinks.profile}>
22
-
21
+ <Card
22
+ fullWidth
23
+ as="form"
24
+ id="password-update-form"
25
+ class="password-update-form"
26
+ >
23
27
  <div slot="header">
24
- <h2><t-profile-password key="user-password-header">{t('user-password-header')}</t-profile-password></h2>
25
-
28
+ <h2>
29
+ <t-profile-password key="user-password-header"
30
+ >{t("user-password-header")}</t-profile-password
31
+ >
32
+ </h2>
33
+
26
34
  <div class="form-header">
27
- <Button
28
- type='submit'
29
- variant='solid'
30
- color='primary'
35
+ <Button
36
+ type="submit"
37
+ variant="solid"
38
+ color="primary"
31
39
  disabled={userHasNoPassword}
32
- size='sm'
33
- >
34
- <Icon slot="start-content" name="heroicons:check" width={24} height={24} />
40
+ size="sm"
41
+ >
42
+ <Icon
43
+ slot="start-content"
44
+ name="heroicons:check"
45
+ width={24}
46
+ height={24}
47
+ />
35
48
  <t-profile-password key="user-password-save-button">
36
- {t('user-password-save-button')}
49
+ {t("user-password-save-button")}
37
50
  </t-profile-password>
38
- </Button>
51
+ </Button>
39
52
  </div>
40
53
  </div>
41
54
 
42
- {userHasNoPassword && (
43
- <p>
44
- <t-profile-password key="user-password-no-password">{t('user-password-no-password')}</t-profile-password>
45
- </p>
46
- )}
55
+ {
56
+ userHasNoPassword && (
57
+ <p>
58
+ <t-profile-password key="user-password-no-password">
59
+ {t("user-password-no-password")}
60
+ </t-profile-password>
61
+ </p>
62
+ )
63
+ }
47
64
 
48
65
  <div class="password-form-entries">
49
-
50
- <Input
51
- label={t('user-password-current')}
52
- type='password'
53
- placeholder='********'
66
+ <Input
67
+ label={t("user-password-current")}
68
+ type="password"
69
+ placeholder="********"
54
70
  isRequired={!userHasNoPassword}
55
71
  disabled={userHasNoPassword}
56
- name='current-password'
57
- autocomplete='current-password'
58
- />
59
-
60
- <Input
61
- label={t('user-password-new')}
62
- type='password'
63
- placeholder='********'
64
- isRequired
65
- autocomplete='password new_password'
66
- name='new-password'
67
- />
68
-
69
- <Input
70
- label={t('user-password-confirm')}
71
- type='password'
72
- placeholder='********'
73
- isRequired
74
- autocomplete='password new_password'
75
- name='confirm-new-password'
76
- />
77
-
72
+ name="current-password"
73
+ autocomplete="current-password"
74
+ />
75
+
76
+ <Input
77
+ label={t("user-password-new")}
78
+ type="password"
79
+ placeholder="********"
80
+ isRequired
81
+ autocomplete="password new_password"
82
+ name="new-password"
83
+ />
84
+
85
+ <Input
86
+ label={t("user-password-confirm")}
87
+ type="password"
88
+ placeholder="********"
89
+ isRequired
90
+ autocomplete="password new_password"
91
+ name="confirm-new-password"
92
+ />
78
93
  </div>
79
94
  </Card>
80
95
 
81
96
  <script>
82
- import {
97
+ import {
83
98
  $i18n,
84
99
  baseTranslation,
85
100
  makeTranslation,
86
101
  updateElmLabel,
87
- } from 'studiocms:i18n/client';
102
+ } from "studiocms:i18n/client";
88
103
 
89
- const currentPage = '@studiocms/dashboard:profile';
104
+ const currentPage = "@studiocms/dashboard:profile";
90
105
 
91
106
  const i18n = $i18n(currentPage, baseTranslation[currentPage]);
92
-
93
- i18n.subscribe(comp => {
94
- updateElmLabel('current-password', comp['user-password-current']);
95
- updateElmLabel('new-password', comp['user-password-new']);
96
- updateElmLabel('confirm-new-password', comp['user-password-confirm']);
107
+
108
+ i18n.subscribe((comp) => {
109
+ updateElmLabel("current-password", comp["user-password-current"]);
110
+ updateElmLabel("new-password", comp["user-password-new"]);
111
+ updateElmLabel("confirm-new-password", comp["user-password-confirm"]);
97
112
  });
98
113
 
99
- if (!customElements.get('t-profile-password')) {
100
- customElements.define('t-profile-password', makeTranslation(currentPage, i18n));
114
+ if (!customElements.get("t-profile-password")) {
115
+ customElements.define(
116
+ "t-profile-password",
117
+ makeTranslation(currentPage, i18n),
118
+ );
101
119
  }
102
120
  </script>
103
121
 
104
122
  <script>
105
123
  import { toast } from "studiocms:ui/components/toaster/client";
106
- const passwordUpdateForm = document.getElementById('password-update-form') as HTMLFormElement;
107
-
108
- passwordUpdateForm.addEventListener('submit', async (e) => {
109
- e.preventDefault();
110
-
111
- const formData = new FormData(passwordUpdateForm);
112
-
113
- const data = {
114
- currentPassword: formData.get('current-password') ?? null,
115
- newPassword: formData.get('new-password') as string,
116
- confirmNewPassword: formData.get('confirm-new-password') as string,
117
- }
118
-
119
- const response = await fetch(passwordUpdateForm.action, {
120
- method: 'POST',
121
- headers: {
122
- 'Content-Type': 'application/json',
123
- },
124
- body: JSON.stringify({ mode: 'password', data })
125
- })
126
-
127
- const res = await response.json();
128
-
129
- if (response.status !== 200) {
130
- toast({
131
- title: 'Error',
132
- description: res.error,
133
- type: 'danger'
134
- })
135
- }
136
-
137
- if (response.status === 200) {
138
- toast({
139
- title: 'Success',
140
- description: res.message,
141
- type: 'success'
142
- })
143
- }
144
- });
124
+ import { dashboardClient, dashboardSharedCatchTags } from "studiocms:client/apiClients";
125
+ import * as Effect from "effect/Effect";
126
+
127
+ const passwordUpdateForm = document.getElementById(
128
+ "password-update-form",
129
+ ) as HTMLFormElement;
130
+
131
+ passwordUpdateForm.addEventListener("submit", async (e) => {
132
+ e.preventDefault();
133
+
134
+ const formData = new FormData(passwordUpdateForm);
135
+
136
+ const data = {
137
+ currentPassword: (formData.get("current-password")?.toString() ??
138
+ null) as string | null,
139
+ newPassword: formData.get("new-password")?.toString() as string,
140
+ confirmNewPassword: formData
141
+ .get("confirm-new-password")
142
+ ?.toString() as string,
143
+ };
144
+
145
+ if (!data.newPassword || !data.confirmNewPassword) {
146
+ toast({
147
+ title: "Error",
148
+ description: "Please fill in all required fields",
149
+ type: "danger",
150
+ });
151
+
152
+ return;
153
+ }
154
+
155
+ const response = await dashboardClient.pipe(
156
+ Effect.flatMap((client) =>
157
+ client.profile.updateUserProfile({
158
+ payload: {
159
+ mode: "password",
160
+ data,
161
+ },
162
+ }),
163
+ ),
164
+ Effect.catchTags(dashboardSharedCatchTags),
165
+ Effect.runPromise,
166
+ );
167
+
168
+ if ("error" in response) {
169
+ toast({
170
+ title: "Error",
171
+ description: response.error,
172
+ type: "danger",
173
+ });
174
+ } else {
175
+ toast({
176
+ title: "Success",
177
+ description:
178
+ response.message || "Password updated successfully",
179
+ type: "success",
180
+ });
181
+
182
+ passwordUpdateForm.reset();
183
+ }
184
+ });
145
185
  </script>
146
186
 
147
187
  <style>