@solidxai/core-ui 0.1.8-beta.19 → 0.1.8-beta.20

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 (302) hide show
  1. package/dist/adapters/auth/getSession.d.ts.map +1 -1
  2. package/dist/adapters/auth/getSession.js +1 -1
  3. package/dist/adapters/auth/getSession.js.map +1 -1
  4. package/dist/adapters/auth/getSession.ts +1 -0
  5. package/dist/adapters/auth/helper.d.ts.map +1 -1
  6. package/dist/adapters/auth/helper.js +1 -0
  7. package/dist/adapters/auth/helper.js.map +1 -1
  8. package/dist/adapters/auth/helper.ts +3 -1
  9. package/dist/adapters/auth/signIn.d.ts.map +1 -1
  10. package/dist/adapters/auth/signIn.js +1 -0
  11. package/dist/adapters/auth/signIn.js.map +1 -1
  12. package/dist/adapters/auth/signIn.ts +3 -1
  13. package/dist/adapters/auth/signInWithOAuthAccessCode.d.ts +1 -0
  14. package/dist/adapters/auth/signInWithOAuthAccessCode.d.ts.map +1 -1
  15. package/dist/adapters/auth/signInWithOAuthAccessCode.js +10 -9
  16. package/dist/adapters/auth/signInWithOAuthAccessCode.js.map +1 -1
  17. package/dist/adapters/auth/signInWithOAuthAccessCode.ts +6 -3
  18. package/dist/adapters/auth/signOut.d.ts.map +1 -1
  19. package/dist/adapters/auth/signOut.js +7 -1
  20. package/dist/adapters/auth/signOut.js.map +1 -1
  21. package/dist/adapters/auth/signOut.ts +7 -1
  22. package/dist/adapters/auth/types.d.ts +1 -0
  23. package/dist/adapters/auth/types.d.ts.map +1 -1
  24. package/dist/adapters/auth/types.js.map +1 -1
  25. package/dist/adapters/auth/types.ts +1 -0
  26. package/dist/components/auth/AuthLayout.d.ts.map +1 -1
  27. package/dist/components/auth/AuthLayout.js +2 -1
  28. package/dist/components/auth/AuthLayout.js.map +1 -1
  29. package/dist/components/auth/AuthLayout.tsx +2 -1
  30. package/dist/components/auth/FacebookAuthChecking.d.ts +2 -0
  31. package/dist/components/auth/FacebookAuthChecking.d.ts.map +1 -0
  32. package/dist/components/auth/FacebookAuthChecking.js +103 -0
  33. package/dist/components/auth/FacebookAuthChecking.js.map +1 -0
  34. package/dist/components/auth/FacebookAuthChecking.tsx +64 -0
  35. package/dist/components/auth/GoogleAuthChecking.js +0 -1
  36. package/dist/components/auth/GoogleAuthChecking.js.map +1 -1
  37. package/dist/components/auth/GoogleAuthChecking.tsx +1 -1
  38. package/dist/components/auth/MicrosoftAuthChecking.d.ts +2 -0
  39. package/dist/components/auth/MicrosoftAuthChecking.d.ts.map +1 -0
  40. package/dist/components/auth/MicrosoftAuthChecking.js +103 -0
  41. package/dist/components/auth/MicrosoftAuthChecking.js.map +1 -0
  42. package/dist/components/auth/MicrosoftAuthChecking.tsx +64 -0
  43. package/dist/components/auth/SolidInitialLoginOtp.js +0 -1
  44. package/dist/components/auth/SolidInitialLoginOtp.js.map +1 -1
  45. package/dist/components/auth/SolidInitialLoginOtp.tsx +1 -1
  46. package/dist/components/auth/SolidInitiateRegisterOtp.d.ts.map +1 -1
  47. package/dist/components/auth/SolidInitiateRegisterOtp.js +28 -12
  48. package/dist/components/auth/SolidInitiateRegisterOtp.js.map +1 -1
  49. package/dist/components/auth/SolidInitiateRegisterOtp.tsx +26 -11
  50. package/dist/components/auth/SolidLogin.d.ts.map +1 -1
  51. package/dist/components/auth/SolidLogin.js +7 -4
  52. package/dist/components/auth/SolidLogin.js.map +1 -1
  53. package/dist/components/auth/SolidLogin.tsx +15 -3
  54. package/dist/components/auth/SolidRegister.d.ts.map +1 -1
  55. package/dist/components/auth/SolidRegister.js +48 -17
  56. package/dist/components/auth/SolidRegister.js.map +1 -1
  57. package/dist/components/auth/SolidRegister.tsx +87 -30
  58. package/dist/components/common/AuthBanner.js.map +1 -1
  59. package/dist/components/common/GeneralSettings.d.ts.map +1 -1
  60. package/dist/components/common/GeneralSettings.js +228 -146
  61. package/dist/components/common/GeneralSettings.js.map +1 -1
  62. package/dist/components/common/GeneralSettings.tsx +1103 -772
  63. package/dist/components/common/SettingsComponent.d.ts +2 -0
  64. package/dist/components/common/SettingsComponent.d.ts.map +1 -0
  65. package/dist/components/common/SettingsComponent.js +351 -0
  66. package/dist/components/common/SettingsComponent.js.map +1 -0
  67. package/dist/components/common/SettingsComponent.module.css +421 -0
  68. package/dist/components/common/SettingsComponent.tsx +582 -0
  69. package/dist/components/common/SocialMediaLogin.d.ts +8 -1
  70. package/dist/components/common/SocialMediaLogin.d.ts.map +1 -1
  71. package/dist/components/common/SocialMediaLogin.js +6 -13
  72. package/dist/components/common/SocialMediaLogin.js.map +1 -1
  73. package/dist/components/common/SocialMediaLogin.tsx +120 -58
  74. package/dist/components/common/SolidExport.d.ts.map +1 -1
  75. package/dist/components/common/SolidExport.js +1 -1
  76. package/dist/components/common/SolidExport.js.map +1 -1
  77. package/dist/components/common/SolidExport.tsx +2 -1
  78. package/dist/components/common/SolidFormStepper.d.ts.map +1 -1
  79. package/dist/components/common/SolidFormStepper.js +2 -1
  80. package/dist/components/common/SolidFormStepper.js.map +1 -1
  81. package/dist/components/common/SolidFormStepper.tsx +2 -1
  82. package/dist/components/common/solid-export.css +26 -0
  83. package/dist/components/core/card/SolidCardView.d.ts.map +1 -1
  84. package/dist/components/core/card/SolidCardView.js +24 -25
  85. package/dist/components/core/card/SolidCardView.js.map +1 -1
  86. package/dist/components/core/card/SolidCardView.tsx +22 -27
  87. package/dist/components/core/card/SolidCardViewConfigure.js +1 -1
  88. package/dist/components/core/card/SolidCardViewConfigure.js.map +1 -1
  89. package/dist/components/core/card/SolidCardViewConfigure.tsx +1 -1
  90. package/dist/components/core/chatter/SolidChatter.d.ts.map +1 -1
  91. package/dist/components/core/chatter/SolidChatter.js +39 -9
  92. package/dist/components/core/chatter/SolidChatter.js.map +1 -1
  93. package/dist/components/core/chatter/SolidChatter.tsx +42 -7
  94. package/dist/components/core/chatter/SolidChatterAuditMessage.d.ts.map +1 -1
  95. package/dist/components/core/chatter/SolidChatterAuditMessage.js +19 -1
  96. package/dist/components/core/chatter/SolidChatterAuditMessage.js.map +1 -1
  97. package/dist/components/core/chatter/SolidChatterAuditMessage.tsx +22 -1
  98. package/dist/components/core/chatter/SolidChatterMessageBox.d.ts +3 -0
  99. package/dist/components/core/chatter/SolidChatterMessageBox.d.ts.map +1 -1
  100. package/dist/components/core/chatter/SolidChatterMessageBox.js +68 -4
  101. package/dist/components/core/chatter/SolidChatterMessageBox.js.map +1 -1
  102. package/dist/components/core/chatter/SolidChatterMessageBox.tsx +45 -3
  103. package/dist/components/core/chatter/chatter.module.css +0 -3
  104. package/dist/components/core/common/SolidAccountSettings/SolidAccountSettings.d.ts.map +1 -1
  105. package/dist/components/core/common/SolidAccountSettings/SolidAccountSettings.js +3 -1
  106. package/dist/components/core/common/SolidAccountSettings/SolidAccountSettings.js.map +1 -1
  107. package/dist/components/core/common/SolidAccountSettings/SolidAccountSettings.tsx +3 -1
  108. package/dist/components/core/common/SolidAccountSettings/SolidNotifications.d.ts.map +1 -1
  109. package/dist/components/core/common/SolidAccountSettings/SolidNotifications.js +9 -8
  110. package/dist/components/core/common/SolidAccountSettings/SolidNotifications.js.map +1 -1
  111. package/dist/components/core/common/SolidAccountSettings/SolidNotifications.tsx +4 -2
  112. package/dist/components/core/extension/solid-core/settings/solidXGenAiCodeBuilderConfigWidget.d.ts +3 -0
  113. package/dist/components/core/extension/solid-core/settings/solidXGenAiCodeBuilderConfigWidget.d.ts.map +1 -0
  114. package/dist/components/core/extension/solid-core/settings/solidXGenAiCodeBuilderConfigWidget.js +81 -0
  115. package/dist/components/core/extension/solid-core/settings/solidXGenAiCodeBuilderConfigWidget.js.map +1 -0
  116. package/dist/components/core/extension/solid-core/settings/solidXGenAiCodeBuilderConfigWidget.tsx +114 -0
  117. package/dist/components/core/form/SolidFormActionHeader.d.ts +1 -1
  118. package/dist/components/core/form/SolidFormActionHeader.d.ts.map +1 -1
  119. package/dist/components/core/form/SolidFormActionHeader.js +5 -3
  120. package/dist/components/core/form/SolidFormActionHeader.js.map +1 -1
  121. package/dist/components/core/form/SolidFormActionHeader.tsx +27 -1
  122. package/dist/components/core/form/SolidFormView.d.ts.map +1 -1
  123. package/dist/components/core/form/SolidFormView.js +67 -27
  124. package/dist/components/core/form/SolidFormView.js.map +1 -1
  125. package/dist/components/core/form/SolidFormView.tsx +54 -7
  126. package/dist/components/core/form/fields/SolidComputedField.d.ts +25 -0
  127. package/dist/components/core/form/fields/SolidComputedField.d.ts.map +1 -0
  128. package/dist/components/core/form/fields/SolidComputedField.js +128 -0
  129. package/dist/components/core/form/fields/SolidComputedField.js.map +1 -0
  130. package/dist/components/core/form/fields/SolidComputedField.tsx +134 -0
  131. package/dist/components/core/form/fields/SolidSelectionDynamicField.d.ts.map +1 -1
  132. package/dist/components/core/form/fields/SolidSelectionDynamicField.js +11 -3
  133. package/dist/components/core/form/fields/SolidSelectionDynamicField.js.map +1 -1
  134. package/dist/components/core/form/fields/SolidSelectionDynamicField.tsx +13 -4
  135. package/dist/components/core/kanban/KanbanBoard.js +1 -1
  136. package/dist/components/core/kanban/KanbanBoard.js.map +1 -1
  137. package/dist/components/core/kanban/KanbanBoard.tsx +1 -1
  138. package/dist/components/core/kanban/SolidKanbanView.d.ts.map +1 -1
  139. package/dist/components/core/kanban/SolidKanbanView.js +216 -102
  140. package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
  141. package/dist/components/core/kanban/SolidKanbanView.tsx +204 -72
  142. package/dist/components/core/kanban/SolidKanbanViewConfigure.js +1 -1
  143. package/dist/components/core/kanban/SolidKanbanViewConfigure.js.map +1 -1
  144. package/dist/components/core/kanban/SolidKanbanViewConfigure.tsx +1 -1
  145. package/dist/components/core/kanban/SolidManyToOneFilterElement.d.ts.map +1 -1
  146. package/dist/components/core/kanban/SolidManyToOneFilterElement.js.map +1 -1
  147. package/dist/components/core/kanban/SolidManyToOneFilterElement.tsx +1 -2
  148. package/dist/components/core/kanban/kanban-fields/SolidMediaMultipleKanbanField.d.ts.map +1 -1
  149. package/dist/components/core/kanban/kanban-fields/SolidMediaMultipleKanbanField.js +2 -2
  150. package/dist/components/core/kanban/kanban-fields/SolidMediaMultipleKanbanField.js.map +1 -1
  151. package/dist/components/core/kanban/kanban-fields/SolidMediaMultipleKanbanField.tsx +21 -10
  152. package/dist/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.d.ts.map +1 -1
  153. package/dist/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.js +2 -2
  154. package/dist/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.js.map +1 -1
  155. package/dist/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.tsx +18 -10
  156. package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.d.ts.map +1 -1
  157. package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.js +3 -6
  158. package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.js.map +1 -1
  159. package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.tsx +30 -24
  160. package/dist/components/core/kanban/kanban-fields/relations/SolidRelationManyToOneKanbanField.js.map +1 -1
  161. package/dist/components/core/kanban/kanban-fields/relations/SolidRelationManyToOneKanbanField.tsx +2 -2
  162. package/dist/components/core/list/SolidDataTablePagination.d.ts +15 -0
  163. package/dist/components/core/list/SolidDataTablePagination.d.ts.map +1 -0
  164. package/dist/components/core/list/SolidDataTablePagination.js +22 -0
  165. package/dist/components/core/list/SolidDataTablePagination.js.map +1 -0
  166. package/dist/components/core/list/SolidDataTablePagination.tsx +71 -0
  167. package/dist/components/core/list/SolidListView.d.ts.map +1 -1
  168. package/dist/components/core/list/SolidListView.js +58 -61
  169. package/dist/components/core/list/SolidListView.js.map +1 -1
  170. package/dist/components/core/list/SolidListView.tsx +42 -46
  171. package/dist/components/core/list/SolidListViewConfigure.js +1 -1
  172. package/dist/components/core/list/SolidListViewConfigure.js.map +1 -1
  173. package/dist/components/core/list/SolidListViewConfigure.tsx +1 -1
  174. package/dist/components/core/list/SolidListViewRowButtonContextMenu.d.ts +1 -1
  175. package/dist/components/core/list/SolidListViewRowButtonContextMenu.d.ts.map +1 -1
  176. package/dist/components/core/list/SolidListViewRowButtonContextMenu.js +6 -7
  177. package/dist/components/core/list/SolidListViewRowButtonContextMenu.js.map +1 -1
  178. package/dist/components/core/list/SolidListViewRowButtonContextMenu.tsx +9 -10
  179. package/dist/components/layout/user-profile-menu.d.ts.map +1 -1
  180. package/dist/components/layout/user-profile-menu.js +15 -14
  181. package/dist/components/layout/user-profile-menu.js.map +1 -1
  182. package/dist/components/layout/user-profile-menu.tsx +8 -6
  183. package/dist/components/shad-cn-ui/SolidDialog.d.ts +1 -1
  184. package/dist/components/shad-cn-ui/SolidDialog.d.ts.map +1 -1
  185. package/dist/components/shad-cn-ui/SolidDialog.js.map +1 -1
  186. package/dist/components/shad-cn-ui/SolidDialog.tsx +1 -1
  187. package/dist/components/shad-cn-ui/SolidIcon.d.ts +2 -2
  188. package/dist/components/shad-cn-ui/SolidIcon.d.ts.map +1 -1
  189. package/dist/components/shad-cn-ui/SolidIcon.js +3 -4
  190. package/dist/components/shad-cn-ui/SolidIcon.js.map +1 -1
  191. package/dist/components/shad-cn-ui/SolidIcon.tsx +12 -15
  192. package/dist/components/shad-cn-ui/SolidRichTextEditor.d.ts.map +1 -1
  193. package/dist/components/shad-cn-ui/SolidRichTextEditor.js +9 -1
  194. package/dist/components/shad-cn-ui/SolidRichTextEditor.js.map +1 -1
  195. package/dist/components/shad-cn-ui/SolidRichTextEditor.tsx +8 -1
  196. package/dist/components/shad-cn-ui/SolidTabs.d.ts +2 -1
  197. package/dist/components/shad-cn-ui/SolidTabs.d.ts.map +1 -1
  198. package/dist/components/shad-cn-ui/SolidTabs.js +2 -2
  199. package/dist/components/shad-cn-ui/SolidTabs.js.map +1 -1
  200. package/dist/components/shad-cn-ui/SolidTabs.tsx +12 -1
  201. package/dist/components/solid-ui/SolidButton.d.ts +14 -0
  202. package/dist/components/solid-ui/SolidButton.d.ts.map +1 -0
  203. package/dist/components/solid-ui/SolidButton.js +36 -0
  204. package/dist/components/solid-ui/SolidButton.js.map +1 -0
  205. package/dist/components/solid-ui/SolidButton.tsx +54 -0
  206. package/dist/components/solid-ui/SolidTabs.d.ts +18 -0
  207. package/dist/components/solid-ui/SolidTabs.d.ts.map +1 -0
  208. package/dist/components/solid-ui/SolidTabs.js +22 -0
  209. package/dist/components/solid-ui/SolidTabs.js.map +1 -0
  210. package/dist/components/solid-ui/SolidTabs.tsx +73 -0
  211. package/dist/components/solid-ui/index.d.ts +3 -0
  212. package/dist/components/solid-ui/index.d.ts.map +1 -0
  213. package/dist/components/solid-ui/index.js +3 -0
  214. package/dist/components/solid-ui/index.js.map +1 -0
  215. package/dist/components/solid-ui/index.ts +2 -0
  216. package/dist/helpers/registry.d.ts +2 -2
  217. package/dist/helpers/registry.d.ts.map +1 -1
  218. package/dist/helpers/registry.js +4 -0
  219. package/dist/helpers/registry.js.map +1 -1
  220. package/dist/helpers/registry.ts +5 -3
  221. package/dist/helpers/settingsPayload.d.ts +32 -0
  222. package/dist/helpers/settingsPayload.d.ts.map +1 -0
  223. package/dist/helpers/settingsPayload.js +72 -0
  224. package/dist/helpers/settingsPayload.js.map +1 -0
  225. package/dist/helpers/settingsPayload.ts +125 -0
  226. package/dist/index.d.ts +4 -0
  227. package/dist/index.d.ts.map +1 -1
  228. package/dist/index.js +4 -0
  229. package/dist/index.js.map +1 -1
  230. package/dist/index.ts +4 -0
  231. package/dist/redux/api/solidChatterMessageApi.d.ts +2 -1
  232. package/dist/redux/api/solidChatterMessageApi.d.ts.map +1 -1
  233. package/dist/redux/api/solidChatterMessageApi.js +11 -1
  234. package/dist/redux/api/solidChatterMessageApi.js.map +1 -1
  235. package/dist/redux/api/solidChatterMessageApi.ts +10 -1
  236. package/dist/redux/store/defaultStoreConfig.d.ts +1 -0
  237. package/dist/redux/store/defaultStoreConfig.d.ts.map +1 -1
  238. package/dist/resources/globals.css +5 -1
  239. package/dist/resources/shadcn-base.css +242 -81
  240. package/dist/resources/solid-responsive.css +22 -4
  241. package/dist/routes/AppEventListener.js +1 -1
  242. package/dist/routes/AppEventListener.js.map +1 -1
  243. package/dist/routes/AppEventListener.tsx +1 -1
  244. package/dist/routes/pages/admin/core/SettingsPage.js +2 -2
  245. package/dist/routes/pages/admin/core/SettingsPage.js.map +1 -1
  246. package/dist/routes/pages/admin/core/SettingsPage.tsx +2 -2
  247. package/dist/routes/pages/auth/InitiateFacebookOauthPage.d.ts +2 -0
  248. package/dist/routes/pages/auth/InitiateFacebookOauthPage.d.ts.map +1 -0
  249. package/dist/routes/pages/auth/InitiateFacebookOauthPage.js +6 -0
  250. package/dist/routes/pages/auth/InitiateFacebookOauthPage.js.map +1 -0
  251. package/dist/routes/pages/auth/InitiateFacebookOauthPage.tsx +5 -0
  252. package/dist/routes/pages/auth/InitiateMicrosoftOauthPage.d.ts +2 -0
  253. package/dist/routes/pages/auth/InitiateMicrosoftOauthPage.d.ts.map +1 -0
  254. package/dist/routes/pages/auth/InitiateMicrosoftOauthPage.js +6 -0
  255. package/dist/routes/pages/auth/InitiateMicrosoftOauthPage.js.map +1 -0
  256. package/dist/routes/pages/auth/InitiateMicrosoftOauthPage.tsx +5 -0
  257. package/dist/routes/solidRoutes.d.ts.map +1 -1
  258. package/dist/routes/solidRoutes.js +5 -1
  259. package/dist/routes/solidRoutes.js.map +1 -1
  260. package/dist/routes/solidRoutes.tsx +5 -1
  261. package/dist/routes/types.d.ts +1 -1
  262. package/dist/routes/types.d.ts.map +1 -1
  263. package/dist/routes/types.js.map +1 -1
  264. package/dist/routes/types.ts +2 -0
  265. package/dist/types/extension-registry.d.ts +1 -0
  266. package/dist/types/extension-registry.d.ts.map +1 -1
  267. package/dist/types/extension-registry.js +1 -0
  268. package/dist/types/extension-registry.js.map +1 -1
  269. package/dist/types/extension-registry.ts +1 -0
  270. package/dist/types/index.d.ts +2 -0
  271. package/dist/types/solid-core.d.ts +10 -0
  272. package/package.json +1 -1
  273. package/dist/components/auth/SolidOTPVerify.d.ts +0 -3
  274. package/dist/components/auth/SolidOTPVerify.d.ts.map +0 -1
  275. package/dist/components/auth/SolidOTPVerify.js +0 -67
  276. package/dist/components/auth/SolidOTPVerify.js.map +0 -1
  277. package/dist/components/auth/SolidOTPVerify.tsx +0 -133
  278. package/dist/components/core/common/LoadDynamicJsxComponent.d.ts +0 -2
  279. package/dist/components/core/common/LoadDynamicJsxComponent.d.ts.map +0 -1
  280. package/dist/components/core/common/LoadDynamicJsxComponent.js +0 -50
  281. package/dist/components/core/common/LoadDynamicJsxComponent.js.map +0 -1
  282. package/dist/components/core/common/LoadDynamicJsxComponent.tsx +0 -70
  283. package/dist/nextAuth/authProviders.d.ts +0 -4
  284. package/dist/nextAuth/authProviders.d.ts.map +0 -1
  285. package/dist/nextAuth/authProviders.js +0 -198
  286. package/dist/nextAuth/authProviders.js.map +0 -1
  287. package/dist/nextAuth/authProviders.tsx +0 -232
  288. package/dist/nextAuth/handleLogout.d.ts +0 -2
  289. package/dist/nextAuth/handleLogout.d.ts.map +0 -1
  290. package/dist/nextAuth/handleLogout.js +0 -36
  291. package/dist/nextAuth/handleLogout.js.map +0 -1
  292. package/dist/nextAuth/handleLogout.tsx +0 -39
  293. package/dist/nextAuth/refreshAccessToken.d.ts +0 -2
  294. package/dist/nextAuth/refreshAccessToken.d.ts.map +0 -1
  295. package/dist/nextAuth/refreshAccessToken.js +0 -24
  296. package/dist/nextAuth/refreshAccessToken.js.map +0 -1
  297. package/dist/nextAuth/refreshAccessToken.tsx +0 -28
  298. package/dist/redux/features/settingsSlice.d.ts +0 -20
  299. package/dist/redux/features/settingsSlice.d.ts.map +0 -1
  300. package/dist/redux/features/settingsSlice.js +0 -39
  301. package/dist/redux/features/settingsSlice.js.map +0 -1
  302. package/dist/redux/features/settingsSlice.ts +0 -60
@@ -18,8 +18,7 @@ import { useDispatch, useSelector } from 'react-redux';
18
18
  import { ERROR_MESSAGES } from '../../constants/error-messages';
19
19
  import { useBulkUpdateSolidSettingsMutation, useLazyGetSolidSettingsQuery } from '../../redux/api/solidSettingsApi';
20
20
  import { env } from "../../adapters/env";
21
- import { showToast } from '../../redux/features/toastSlice';
22
-
21
+ import { showToast } from "../../redux/features/toastSlice";
23
22
 
24
23
  export const GeneralSettings = () => {
25
24
  const { data: session } = useSession();
@@ -30,7 +29,7 @@ export const GeneralSettings = () => {
30
29
  const [authScreenCenterBackgroundImagePreview, setAuthScreenCenterBackgroundImagePreview] = useState<string | null>(null);
31
30
  const dispatch = useDispatch()
32
31
 
33
- const [trigger, { data: solidSettingsData }] = useLazyGetSolidSettingsQuery();
32
+ const [trigger, { data: solidSettingsData }] = useLazyGetSolidSettingsQuery();
34
33
 
35
34
  useEffect(() => {
36
35
  trigger("") // Fetch settings on mount
@@ -47,6 +46,9 @@ export const GeneralSettings = () => {
47
46
  passwordLessAuth: solidSettingsData?.data?.passwordLessAuth ?? false,
48
47
  activateUserOnRegistration: solidSettingsData?.data?.activateUserOnRegistration ?? false,
49
48
  iamGoogleOAuthEnabled: solidSettingsData?.data?.iamGoogleOAuthEnabled ?? false,
49
+ iamMicrosoftOAuthEnabled: solidSettingsData?.data?.iamMicrosoftOAuthEnabled ?? false,
50
+ iamFacebookOAuthEnabled: solidSettingsData?.data?.iamFacebookOAuthEnabled ?? false,
51
+ iamAppleOAuthEnabled: solidSettingsData?.data?.iamAppleOAuthEnabled ?? false,
50
52
  // shouldQueueEmails: solidSettingsData?.data?.shouldQueueEmails ?? false,
51
53
  // shouldQueueSms: solidSettingsData?.data?.shouldQueueSms ?? false,
52
54
  authPagesLayout: solidSettingsData?.data?.authPagesLayout ?? "center",
@@ -102,788 +104,1117 @@ export const GeneralSettings = () => {
102
104
  const updatedSettingsArray: Array<{ key: string; value: string; type: string }> = [];
103
105
  const currentSettings = solidSettingsData?.data || {};
104
106
 
105
- const formData = new FormData();
107
+ const formData = new FormData();
106
108
 
107
- // Compare changed fields
108
- Object.entries(values).forEach(([key, value]) => {
109
- const currentValue = currentSettings[key];
109
+ // Compare changed fields
110
+ Object.entries(values).forEach(([key, value]) => {
111
+ const currentValue = currentSettings[key];
110
112
 
111
113
  const wasCleared = currentValue != null && currentValue !== "" && (value === null || value === "");
112
114
  const isFile = value instanceof File;
113
- const normalizedCurrent = currentValue ?? "";
114
- const normalizedValue = value ?? "";
115
- const changed = isFile || wasCleared || normalizedCurrent !== normalizedValue;
116
-
117
- if (changed) {
118
- if (isFile) {
119
- formData.append(key, value as File);
120
- updatedSettingsArray.push({
121
- key,
122
- value: "",
123
- type: "system",
124
- });
125
- } else {
126
- updatedSettingsArray.push({
127
- key,
128
- value: value === null || value === undefined ? "" : (typeof value === "string" ? value : JSON.stringify(value)),
129
- type: "system",
130
- });
131
- }
132
- }
133
- });
134
-
135
- if (updatedSettingsArray.length === 0) {
136
- dispatch(showToast({ severity: "success", summary: "No Changes", detail: "No settings were updated" }));
137
- return;
138
- }
139
-
140
- // Append settings array to formData
141
- formData.append("settings", JSON.stringify(updatedSettingsArray));
142
-
143
- // Call API
144
- const response = await bulkUpdateSolidSettings({ data: formData }).unwrap();
145
-
146
- if (response.statusCode === 200) {
147
- dispatch(showToast({ severity: "success", summary: "Updated", detail: "Settings updated" }));
148
- trigger("")
149
- }
150
-
151
- } catch (error: any) {
152
- console.log("Error updating settings:", error);
153
- dispatch(showToast({ severity: "error", summary: ERROR_MESSAGES.FAILED, detail: error?.data?.message || ERROR_MESSAGES.SOMETHING_WRONG }));
154
- }
155
- },
156
- });
157
-
158
- const showError = async () => {
159
- const errors = await formik.validateForm();
160
- const errorMessages = Object.values(errors);
161
-
162
- if (errorMessages.length > 0) {
163
- dispatch(showToast({ severity: 'error', summary: 'Error', detail: Array.isArray(errorMessages) ? errorMessages.join(', ') : errorMessages }));
164
- }
165
- }
166
- useEffect(() => {
167
-
168
- }, [pathname])
169
-
170
- const positionMap: Record<'left' | 'center' | 'right', string> = {
171
- left: 'The form will appear on the left side of the screen, while the banner will be positioned on the right side',
172
- center: 'The form will be centered in the middle of the screen for balanced alignment',
173
- right: 'The form will appear on the right side of the screen, and the banner will be positioned on the left side'
174
- };
175
-
176
- const onAppLogoDrop = useCallback(
177
- (acceptedFiles: File[]) => {
178
- const file = acceptedFiles[0];
179
- if (file) {
180
- if (file.size > 2 * 1024 * 1024) {
181
- dispatch(showToast({ severity: "error", summary: "File too large", detail: "Maximum file size is 2MB" }));
182
- return;
183
- }
184
- formik.setFieldValue("appLogo", file);
185
- setAppLogoPreview(URL.createObjectURL(file));
186
- }
187
- },
188
- [formik]
189
- );
190
-
191
- const onCompanyLogoDrop = useCallback((acceptedFiles: File[]) => {
192
- const file = acceptedFiles[0];
193
- if (file) {
194
- if (file.size > 2 * 1024 * 1024) {
195
- dispatch(showToast({ severity: "error", summary: "File too large", detail: "Maximum file size is 2MB" }));
196
- return;
115
+ const normalizedCurrent = currentValue ?? "";
116
+ const normalizedValue = value ?? "";
117
+ const changed = isFile || wasCleared || normalizedCurrent !== normalizedValue;
118
+
119
+ if (changed) {
120
+ if (isFile) {
121
+ formData.append(key, value as File);
122
+ updatedSettingsArray.push({
123
+ key,
124
+ value: "",
125
+ type: "system",
126
+ });
127
+ } else {
128
+ updatedSettingsArray.push({
129
+ key,
130
+ value:
131
+ value === null || value === undefined ? "" : (typeof value === "string" ? value : JSON.stringify(value)),
132
+ type: "system",
133
+ });
197
134
  }
198
- formik.setFieldValue("companylogo", file);
199
- setCompanyLogoPreview(URL.createObjectURL(file));
200
- }
201
- }, [formik]);
202
-
203
- const {
204
- getRootProps: getAppLogoRootProps,
205
- getInputProps: getAppLogoInputProps,
206
- isDragActive: isAppLogoDragActive
207
- } = useDropzone({
208
- accept: {
209
- 'image/png': ['.png'],
210
- 'image/jpeg': ['.jpeg', '.jpg'],
211
- 'image/svg+xml': ['.svg'],
212
- 'image/webp': ['.webp']
213
- },
214
- multiple: false,
215
- onDrop: onAppLogoDrop
216
- });
217
- const {
218
- getRootProps: getCompanyLogoRootProps,
219
- getInputProps: getCompanyLogoInputProps,
220
- isDragActive: isCompanyLogoDragActive
221
- } = useDropzone({
222
- accept: {
223
- 'image/png': ['.png'],
224
- 'image/jpeg': ['.jpeg', '.jpg'],
225
- 'image/svg+xml': ['.svg'],
226
- 'image/webp': ['.webp']
227
- },
228
- multiple: false,
229
- onDrop: onCompanyLogoDrop
230
- });
231
-
232
- const removeAppLogo = () => {
233
- formik.setFieldValue("appLogo", null);
234
- if (appLogoPreview) {
235
- URL.revokeObjectURL(appLogoPreview);
236
- setAppLogoPreview(null);
135
+ }
136
+ });
137
+
138
+ if (updatedSettingsArray.length === 0) {
139
+ dispatch(
140
+ showToast({
141
+ severity: "success",
142
+ summary: "No Changes",
143
+ detail: "No settings were updated",
144
+ }),
145
+ );
146
+ return;
237
147
  }
238
- };
239
148
 
240
- const removeCompanyLogo = () => {
241
- formik.setFieldValue("companylogo", null);
242
- if (companyLogoPreview) {
243
- URL.revokeObjectURL(companyLogoPreview);
244
- setCompanyLogoPreview(null);
149
+ // Append settings array to formData
150
+ formData.append("settings", JSON.stringify(updatedSettingsArray));
151
+
152
+ // Call API
153
+ const response = await bulkUpdateSolidSettings({
154
+ data: formData,
155
+ }).unwrap();
156
+
157
+ if (response.statusCode === 200) {
158
+ dispatch(
159
+ showToast({
160
+ severity: "success",
161
+ summary: "Updated",
162
+ detail: "Settings updated",
163
+ }),
164
+ );
165
+ trigger("");
245
166
  }
246
- };
247
-
248
-
249
- const onAuthScreenRightBackgroundImageDrop = useCallback(
250
- (acceptedFiles: File[]) => {
251
- const file = acceptedFiles[0];
252
- if (file) {
253
- if (file.size > 2 * 1024 * 1024) {
254
- dispatch(showToast({ severity: "error", summary: ERROR_MESSAGES.FILE_LARGE, detail: ERROR_MESSAGES.MAX_FILE_SIZE }));
255
- return;
256
- }
257
- formik.setFieldValue("authScreenRightBackgroundImage", file);
258
- setAuthScreenRightBackgroundImagePreview(URL.createObjectURL(file));
259
- }
260
- },
261
- [formik]
262
- );
263
-
264
- const onAuthScreenLeftBackgroundImageDrop = useCallback((acceptedFiles: File[]) => {
265
- const file = acceptedFiles[0];
266
- if (file) {
267
- if (file.size > 2 * 1024 * 1024) {
268
- dispatch(showToast({ severity: "error", summary: ERROR_MESSAGES.FILE_LARGE, detail: ERROR_MESSAGES.MAX_FILE_SIZE }));
269
- return;
270
- }
271
- formik.setFieldValue("authScreenLeftBackgroundImage", file);
272
- setAuthScreenLeftBackgroundImagePreview(URL.createObjectURL(file));
167
+ } catch (error: any) {
168
+ console.log("Error updating settings:", error);
169
+ dispatch(
170
+ showToast({
171
+ severity: "error",
172
+ summary: ERROR_MESSAGES.FAILED,
173
+ detail: error?.data?.message || ERROR_MESSAGES.SOMETHING_WRONG,
174
+ }),
175
+ );
176
+ }
177
+ },
178
+ });
179
+
180
+ const showError = async () => {
181
+ const errors = await formik.validateForm();
182
+ const errorMessages = Object.values(errors);
183
+
184
+ if (errorMessages.length > 0) {
185
+ dispatch(
186
+ showToast({
187
+ severity: "error",
188
+ summary: "Error",
189
+ detail: Array.isArray(errorMessages)
190
+ ? errorMessages.join(", ")
191
+ : errorMessages,
192
+ }),
193
+ );
194
+ }
195
+ };
196
+ useEffect(() => {}, [pathname]);
197
+
198
+ const positionMap: Record<"left" | "center" | "right", string> = {
199
+ left: "The form will appear on the left side of the screen, while the banner will be positioned on the right side",
200
+ center:
201
+ "The form will be centered in the middle of the screen for balanced alignment",
202
+ right:
203
+ "The form will appear on the right side of the screen, and the banner will be positioned on the left side",
204
+ };
205
+
206
+ const onAppLogoDrop = useCallback(
207
+ (acceptedFiles: File[]) => {
208
+ const file = acceptedFiles[0];
209
+ if (file) {
210
+ if (file.size > 2 * 1024 * 1024) {
211
+ dispatch(
212
+ showToast({
213
+ severity: "error",
214
+ summary: "File too large",
215
+ detail: "Maximum file size is 2MB",
216
+ }),
217
+ );
218
+ return;
273
219
  }
274
- }, [formik]);
275
-
276
- const onAuthScreenCenterBackgroundImageDrop = useCallback((acceptedFiles: File[]) => {
277
- const file = acceptedFiles[0];
278
- if (file) {
279
- if (file.size > 2 * 1024 * 1024) {
280
- dispatch(showToast({ severity: "error", summary: ERROR_MESSAGES.FILE_LARGE, detail: ERROR_MESSAGES.MAX_FILE_SIZE }));
281
- return;
282
- }
283
- formik.setFieldValue("authScreenCenterBackgroundImage", file);
284
- setAuthScreenCenterBackgroundImagePreview(URL.createObjectURL(file));
220
+ formik.setFieldValue("appLogo", file);
221
+ setAppLogoPreview(URL.createObjectURL(file));
222
+ }
223
+ },
224
+ [formik],
225
+ );
226
+
227
+ const onCompanyLogoDrop = useCallback(
228
+ (acceptedFiles: File[]) => {
229
+ const file = acceptedFiles[0];
230
+ if (file) {
231
+ if (file.size > 2 * 1024 * 1024) {
232
+ dispatch(
233
+ showToast({
234
+ severity: "error",
235
+ summary: "File too large",
236
+ detail: "Maximum file size is 2MB",
237
+ }),
238
+ );
239
+ return;
285
240
  }
286
- }, [formik]);
287
-
288
- const {
289
- getRootProps: getAuthScreenRightBackgroundImageRootProps,
290
- getInputProps: getAuthScreenRightBackgroundImageInputProps,
291
- isDragActive: isAuthScreenRightBackgroundImageDragActive
292
- } = useDropzone({
293
- accept: {
294
- 'image/png': ['.png'],
295
- 'image/jpeg': ['.jpeg', '.jpg'],
296
- 'image/svg+xml': ['.svg'],
297
- 'image/webp': ['.webp']
298
- },
299
- multiple: false,
300
- onDrop: onAuthScreenRightBackgroundImageDrop
301
- });
302
-
303
- const {
304
- getRootProps: getAuthScreenLeftBackgroundImageRootProps,
305
- getInputProps: getAuthScreenLeftBackgroundImageInputProps,
306
- isDragActive: isAuthScreenLeftBackgroundImageDragActive
307
- } = useDropzone({
308
- accept: {
309
- 'image/png': ['.png'],
310
- 'image/jpeg': ['.jpeg', '.jpg'],
311
- 'image/svg+xml': ['.svg'],
312
- 'image/webp': ['.webp']
313
- },
314
- multiple: false,
315
- onDrop: onAuthScreenLeftBackgroundImageDrop
316
- });
317
-
318
- const {
319
- getRootProps: getAuthScreenCenterBackgroundImageRootProps,
320
- getInputProps: getAuthScreenCenterBackgroundImageInputProps,
321
- isDragActive: isAuthScreenCenterBackgroundImageDragActive
322
- } = useDropzone({
323
- accept: {
324
- 'image/png': ['.png'],
325
- 'image/jpeg': ['.jpeg', '.jpg'],
326
- 'image/svg+xml': ['.svg'],
327
- 'image/webp': ['.webp']
328
- },
329
- multiple: false,
330
- onDrop: onAuthScreenCenterBackgroundImageDrop
331
- });
241
+ formik.setFieldValue("companylogo", file);
242
+ setCompanyLogoPreview(URL.createObjectURL(file));
243
+ }
244
+ },
245
+ [formik],
246
+ );
247
+
248
+ const {
249
+ getRootProps: getAppLogoRootProps,
250
+ getInputProps: getAppLogoInputProps,
251
+ isDragActive: isAppLogoDragActive,
252
+ } = useDropzone({
253
+ accept: {
254
+ "image/png": [".png"],
255
+ "image/jpeg": [".jpeg", ".jpg"],
256
+ "image/svg+xml": [".svg"],
257
+ "image/webp": [".webp"],
258
+ },
259
+ multiple: false,
260
+ onDrop: onAppLogoDrop,
261
+ });
262
+ const {
263
+ getRootProps: getCompanyLogoRootProps,
264
+ getInputProps: getCompanyLogoInputProps,
265
+ isDragActive: isCompanyLogoDragActive,
266
+ } = useDropzone({
267
+ accept: {
268
+ 'image/png': ['.png'],
269
+ 'image/jpeg': ['.jpeg', '.jpg'],
270
+ 'image/svg+xml': ['.svg'],
271
+ 'image/webp': ['.webp'],
272
+ },
273
+ multiple: false,
274
+ onDrop: onCompanyLogoDrop,
275
+ });
276
+
277
+ const removeAppLogo = () => {
278
+ formik.setFieldValue("appLogo", null);
279
+ if (appLogoPreview) {
280
+ URL.revokeObjectURL(appLogoPreview);
281
+ setAppLogoPreview(null);
282
+ }
283
+ };
332
284
 
333
- const removeAuthScreenRightBackgroundImage = () => {
334
- formik.setFieldValue("authScreenRightBackgroundImage", null);
335
- if (authScreenRightBackgroundImagePreview) {
336
- URL.revokeObjectURL(authScreenRightBackgroundImagePreview);
337
- setAuthScreenRightBackgroundImagePreview(null);
285
+ const removeCompanyLogo = () => {
286
+ formik.setFieldValue("companylogo", null);
287
+ if (companyLogoPreview) {
288
+ URL.revokeObjectURL(companyLogoPreview);
289
+ setCompanyLogoPreview(null);
290
+ }
291
+ };
292
+
293
+ const onAuthScreenRightBackgroundImageDrop = useCallback(
294
+ (acceptedFiles: File[]) => {
295
+ const file = acceptedFiles[0];
296
+ if (file) {
297
+ if (file.size > 2 * 1024 * 1024) {
298
+ dispatch(
299
+ showToast({
300
+ severity: "error",
301
+ summary: ERROR_MESSAGES.FILE_LARGE,
302
+ detail: ERROR_MESSAGES.MAX_FILE_SIZE,
303
+ }),
304
+ );
305
+ return;
338
306
  }
339
- };
340
-
341
- const removeAuthScreenLeftBackgroundImage = () => {
342
- formik.setFieldValue("authScreenLeftBackgroundImage", null);
343
- if (authScreenLeftBackgroundImagePreview) {
344
- URL.revokeObjectURL(authScreenLeftBackgroundImagePreview);
345
- setAuthScreenLeftBackgroundImagePreview(null);
307
+ formik.setFieldValue("authScreenRightBackgroundImage", file);
308
+ setAuthScreenRightBackgroundImagePreview(URL.createObjectURL(file));
309
+ }
310
+ },
311
+ [formik],
312
+ );
313
+
314
+ const onAuthScreenLeftBackgroundImageDrop = useCallback(
315
+ (acceptedFiles: File[]) => {
316
+ const file = acceptedFiles[0];
317
+ if (file) {
318
+ if (file.size > 2 * 1024 * 1024) {
319
+ dispatch(
320
+ showToast({
321
+ severity: "error",
322
+ summary: ERROR_MESSAGES.FILE_LARGE,
323
+ detail: ERROR_MESSAGES.MAX_FILE_SIZE,
324
+ }),
325
+ );
326
+ return;
346
327
  }
347
- };
348
-
349
- const removeAuthScreenCenterBackgroundImage = () => {
350
- formik.setFieldValue("authScreenCenterBackgroundImage", null);
351
- if (authScreenCenterBackgroundImagePreview) {
352
- URL.revokeObjectURL(authScreenCenterBackgroundImagePreview);
353
- setAuthScreenCenterBackgroundImagePreview(null);
328
+ formik.setFieldValue("authScreenLeftBackgroundImage", file);
329
+ setAuthScreenLeftBackgroundImagePreview(URL.createObjectURL(file));
330
+ }
331
+ },
332
+ [formik],
333
+ );
334
+
335
+ const onAuthScreenCenterBackgroundImageDrop = useCallback(
336
+ (acceptedFiles: File[]) => {
337
+ const file = acceptedFiles[0];
338
+ if (file) {
339
+ if (file.size > 2 * 1024 * 1024) {
340
+ dispatch(
341
+ showToast({
342
+ severity: "error",
343
+ summary: ERROR_MESSAGES.FILE_LARGE,
344
+ detail: ERROR_MESSAGES.MAX_FILE_SIZE,
345
+ }),
346
+ );
347
+ return;
354
348
  }
355
- };
356
-
357
-
358
-
359
- const handleAiConfigChange = (newConfig: SolidAiConfig) => {
360
- formik.setFieldValue("solidXGenAiCodeBuilderConfig", newConfig);
361
- };
349
+ formik.setFieldValue("authScreenCenterBackgroundImage", file);
350
+ setAuthScreenCenterBackgroundImagePreview(URL.createObjectURL(file));
351
+ }
352
+ },
353
+ [formik],
354
+ );
355
+
356
+ const {
357
+ getRootProps: getAuthScreenRightBackgroundImageRootProps,
358
+ getInputProps: getAuthScreenRightBackgroundImageInputProps,
359
+ isDragActive: isAuthScreenRightBackgroundImageDragActive,
360
+ } = useDropzone({
361
+ accept: {
362
+ 'image/png': ['.png'],
363
+ 'image/jpeg': ['.jpeg', '.jpg'],
364
+ 'image/svg+xml': ['.svg'],
365
+ 'image/webp': ['.webp'],
366
+ },
367
+ multiple: false,
368
+ onDrop: onAuthScreenRightBackgroundImageDrop,
369
+ });
370
+
371
+ const {
372
+ getRootProps: getAuthScreenLeftBackgroundImageRootProps,
373
+ getInputProps: getAuthScreenLeftBackgroundImageInputProps,
374
+ isDragActive: isAuthScreenLeftBackgroundImageDragActive,
375
+ } = useDropzone({
376
+ accept: {
377
+ 'image/png': ['.png'],
378
+ 'image/jpeg': ['.jpeg', '.jpg'],
379
+ 'image/svg+xml': ['.svg'],
380
+ 'image/webp': ['.webp']
381
+ },
382
+ multiple: false,
383
+ onDrop: onAuthScreenLeftBackgroundImageDrop
384
+ });
385
+
386
+ const {
387
+ getRootProps: getAuthScreenCenterBackgroundImageRootProps,
388
+ getInputProps: getAuthScreenCenterBackgroundImageInputProps,
389
+ isDragActive: isAuthScreenCenterBackgroundImageDragActive
390
+ } = useDropzone({
391
+ accept: {
392
+ 'image/png': ['.png'],
393
+ 'image/jpeg': ['.jpeg', '.jpg'],
394
+ 'image/svg+xml': ['.svg'],
395
+ 'image/webp': ['.webp']
396
+ },
397
+ multiple: false,
398
+ onDrop: onAuthScreenCenterBackgroundImageDrop
399
+ });
400
+
401
+ const removeAuthScreenRightBackgroundImage = () => {
402
+ formik.setFieldValue("authScreenRightBackgroundImage", null);
403
+ if (authScreenRightBackgroundImagePreview) {
404
+ URL.revokeObjectURL(authScreenRightBackgroundImagePreview);
405
+ setAuthScreenRightBackgroundImagePreview(null);
406
+ }
407
+ };
362
408
 
409
+ const removeAuthScreenLeftBackgroundImage = () => {
410
+ formik.setFieldValue("authScreenLeftBackgroundImage", null);
411
+ if (authScreenLeftBackgroundImagePreview) {
412
+ URL.revokeObjectURL(authScreenLeftBackgroundImagePreview);
413
+ setAuthScreenLeftBackgroundImagePreview(null);
414
+ }
415
+ };
363
416
 
364
- return (
365
- <div className="page-parent-wrapper">
366
- <div className="solid-form-wrapper">
367
- <div className="solid-form-section">
368
- <form onSubmit={formik.handleSubmit}>
369
- <div className="page-header secondary-border-bottom">
370
- <div className="form-wrapper-title ">Settings</div>
371
- <div className="gap-3 flex">
372
- {formik.dirty && (
373
- <SolidButton size="sm" type="submit" loading={formik.isSubmitting} onClick={() => showError()}>
374
- Save
375
- </SolidButton>
376
- )}
377
- {/* <CancelButton /> */}
417
+ const removeAuthScreenCenterBackgroundImage = () => {
418
+ formik.setFieldValue("authScreenCenterBackgroundImage", null);
419
+ if (authScreenCenterBackgroundImagePreview) {
420
+ URL.revokeObjectURL(authScreenCenterBackgroundImagePreview);
421
+ setAuthScreenCenterBackgroundImagePreview(null);
422
+ }
423
+ };
424
+
425
+ const handleAiConfigChange = (newConfig: SolidAiConfig) => {
426
+ formik.setFieldValue("solidXGenAiCodeBuilderConfig", newConfig);
427
+ };
428
+
429
+ return (
430
+ <div className="page-parent-wrapper">
431
+ <div className="solid-form-wrapper">
432
+ <div className="solid-form-section">
433
+ <form onSubmit={formik.handleSubmit}>
434
+ <div className="page-header secondary-border-bottom">
435
+ <div className="form-wrapper-title ">Settings</div>
436
+ <div className="gap-3 flex">
437
+ {formik.dirty && (
438
+ <SolidButton
439
+ size="sm"
440
+ type="submit"
441
+ loading={formik.isSubmitting}
442
+ onClick={() => showError()}
443
+ >
444
+ Save
445
+ </SolidButton>
446
+ )}
447
+ {/* <CancelButton /> */}
448
+ </div>
449
+ </div>
450
+ <div className="px-4 py-3 md:p-4 solid-form-content">
451
+ {pathname.includes("app-settings") && (
452
+ <>
453
+ <div className="formgrid grid">
454
+ <div className="col-12 lg:col-10 xl:col-8">
455
+ <div className="formgrid grid">
456
+ <div className="col-12 md:col-6">
457
+ <p className="solid-settings-subheading">App Logo</p>
458
+ <div>
459
+ <div
460
+ {...getAppLogoRootProps()}
461
+ className="solid-dropzone-wrapper"
462
+ style={{ borderRadius: 8 }}
463
+ >
464
+ <input {...getAppLogoInputProps()} />
465
+ {/* {isAppLogoDragActive && */}
466
+ <SettingDropzoneActivePlaceholder />
467
+ {/* } */}
378
468
  </div>
469
+ <div className="mt-2">
470
+ {(() => {
471
+ const logoSrc =
472
+ (SolidLogo as any).src || SolidLogo;
473
+
474
+ let src = appLogoPreview
475
+ ? appLogoPreview
476
+ : formik.values.appLogo
477
+ ? formik.values.appLogo
478
+ : logoSrc;
479
+
480
+ const isBlobOrAbsolute =
481
+ src?.startsWith("blob:") ||
482
+ src?.startsWith("http");
483
+
484
+ if (!isBlobOrAbsolute && !src.startsWith("/")) {
485
+ src = `${env("API_URL")}/${src}`;
486
+ }
487
+ return (
488
+ <SolidUploadedImage
489
+ src={src}
490
+ className="solid-app-logo"
491
+ />
492
+ );
493
+ })()}
494
+ </div>
495
+ {formik.values.appLogo && (
496
+ <SettingsImageRemoveButton
497
+ onClick={removeAppLogo}
498
+ />
499
+ )}
500
+ </div>
379
501
  </div>
380
- <div className="px-4 py-3 md:p-4 solid-form-content">
381
- {pathname.includes("app-settings") &&
382
- <>
383
- <div className='formgrid grid'>
384
- <div className='col-12 lg:col-10 xl:col-8'>
385
- <div className="formgrid grid">
386
- <div className="col-12 md:col-6">
387
- <p className="solid-settings-subheading">App Logo</p>
388
- <div>
389
- <div {...getAppLogoRootProps()} className="solid-dropzone-wrapper" style={{ borderRadius: 8 }}>
390
- <input {...getAppLogoInputProps()} />
391
- {/* {isAppLogoDragActive && */}
392
- <SettingDropzoneActivePlaceholder />
393
- {/* } */}
394
- </div>
395
- <div className="mt-2">
396
- {(() => {
397
- const logoSrc = (SolidLogo as any).src || SolidLogo;
398
-
399
- let src = appLogoPreview
400
- ? appLogoPreview
401
- : formik.values.appLogo
402
- ? formik.values.appLogo
403
- : logoSrc
404
-
405
- const isBlobOrAbsolute = src?.startsWith("blob:") || src?.startsWith("http");
406
-
407
- if (!isBlobOrAbsolute && !src.startsWith("/")) {
408
- src = `${env("API_URL")}/${src}`;
409
- }
410
- return (
411
- <SolidUploadedImage src={src} className='solid-app-logo' />
412
- );
413
- })()}
414
- </div>
415
- {formik.values.appLogo && (
416
- <SettingsImageRemoveButton onClick={removeAppLogo} />
417
- )}
418
- </div>
419
- </div>
420
- <div className="col-12 md:col-6">
421
- <p className="solid-settings-subheading">Company Logo</p>
422
- <div>
423
- <div {...getCompanyLogoRootProps()} className="solid-dropzone-wrapper" style={{ borderRadius: 8 }}>
424
- <input {...getCompanyLogoInputProps()} />
425
- {/* {isCompanyLogoDragActive && */}
426
- <SettingDropzoneActivePlaceholder />
427
- {/* } */}
428
- </div>
429
- <div className="mt-2">
430
- {(() => {
431
- const logoSrc = (SolidLogo as any).src || SolidLogo;
432
-
433
- let src = companyLogoPreview
434
- ? companyLogoPreview
435
- : formik.values.companylogo
436
- ? formik.values.companylogo
437
- : logoSrc
438
-
439
- const isBlobOrAbsolute = src?.startsWith("blob:") || src?.startsWith("http");
440
-
441
- if (!isBlobOrAbsolute && !src.startsWith("/")) {
442
- src = `${env("API_URL")}/${src}`;
443
- }
444
-
445
- return (
446
- <SolidUploadedImage src={src} className='solid-compony-logo' />
447
- );
448
- })()}
449
- </div>
450
- {formik.values.companylogo && (
451
- <SettingsImageRemoveButton onClick={removeCompanyLogo} />
452
- )}
453
- </div>
454
- </div>
455
- </div>
456
- </div>
457
- </div>
458
- <p className="solid-settings-heading">App Logo Position</p>
459
- <div className='formgrid grid'>
460
- <div className='col-12 lg:col-10 xl:col-8'>
461
- <div className="flex">
462
- <SolidSegmentedControl
463
- className="solid-settings-segmented"
464
- value={formik.values.appLogoPosition}
465
- options={[
466
- { value: "in_form_view", label: "In Form View" },
467
- { value: "in_image_view", label: "In Image View" },
468
- ]}
469
- onChange={(value) => formik.setFieldValue("appLogoPosition", value)}
470
- />
471
- </div>
472
- </div>
473
- </div>
474
- <SolidDivider className="my-4" />
475
- <p className="solid-settings-heading">Title & Description Details</p>
502
+ <div className="col-12 md:col-6">
503
+ <p className="solid-settings-subheading">
504
+ Company Logo
505
+ </p>
506
+ <div>
507
+ <div
508
+ {...getCompanyLogoRootProps()}
509
+ className="solid-dropzone-wrapper"
510
+ style={{ borderRadius: 8 }}
511
+ >
512
+ <input {...getCompanyLogoInputProps()} />
513
+ {/* {isCompanyLogoDragActive && */}
514
+ <SettingDropzoneActivePlaceholder />
515
+ {/* } */}
516
+ </div>
517
+ <div className="mt-2">
518
+ {(() => {
519
+ const logoSrc =
520
+ (SolidLogo as any).src || SolidLogo;
521
+
522
+ let src = companyLogoPreview
523
+ ? companyLogoPreview
524
+ : formik.values.companylogo
525
+ ? formik.values.companylogo
526
+ : logoSrc;
527
+
528
+ const isBlobOrAbsolute =
529
+ src?.startsWith("blob:") ||
530
+ src?.startsWith("http");
531
+
532
+ if (!isBlobOrAbsolute && !src.startsWith("/")) {
533
+ src = `${env("API_URL")}/${src}`;
534
+ }
535
+
536
+ return (
537
+ <SolidUploadedImage
538
+ src={src}
539
+ className="solid-compony-logo"
540
+ />
541
+ );
542
+ })()}
543
+ </div>
544
+ {formik.values.companylogo && (
545
+ <SettingsImageRemoveButton
546
+ onClick={removeCompanyLogo}
547
+ />
548
+ )}
549
+ </div>
550
+ </div>
551
+ </div>
552
+ </div>
553
+ </div>
554
+ <p className="solid-settings-heading">App Logo Position</p>
555
+ <div className="formgrid grid">
556
+ <div className="col-12 lg:col-10 xl:col-8">
557
+ <div className="flex">
558
+ <SolidSegmentedControl
559
+ className="solid-settings-segmented"
560
+ value={formik.values.appLogoPosition}
561
+ options={[
562
+ { value: "in_form_view", label: "In Form View" },
563
+ { value: "in_image_view", label: "In Image View" },
564
+ ]}
565
+ onChange={(value) => formik.setFieldValue("appLogoPosition", value)}
566
+ />
567
+ </div>
568
+ </div>
569
+ </div>
570
+ <SolidDivider className="my-4" />
571
+ <p className="solid-settings-heading">Title & Description Details</p>
476
572
  <div className='formgrid grid'>
477
573
  <div className='col-12 lg:col-10 xl:col-8'>
478
- <div className="formgrid grid">
479
- <div className="col-12 md:col-6">
480
- <div className="formgrid grid align-items-center">
481
- <div className="col-10 sm:col-9 lg:col-5 pb-2 md:pb-0">
574
+ <div className="formgrid grid">
575
+ <div className="col-12 md:col-6">
576
+ <div className="formgrid grid align-items-center">
577
+ <div className="col-10 sm:col-9 lg:col-5 pb-2 md:pb-0">
482
578
  <label className="form-field-label">Show Details on Authentication Screen</label>
483
- </div>
484
- <div className="col-2 sm:col-3 lg:col-7">
485
- <SolidSwitch
486
- name="showAuthContent"
487
- checked={formik.values.showAuthContent}
488
- onChange={(checked) => formik.setFieldValue("showAuthContent", checked)}
489
- />
490
- </div>
491
- </div>
492
- </div>
493
- <div className="col-12 md:col-6">
494
- <div className="formgrid grid align-items-center">
495
- <div className="col-12 md:col-5 pb-2 md:pb-0">
496
- <label className="form-field-label">App Title</label>
497
- </div>
498
- <div className="col-12 md:col-7">
499
- <SolidInput
500
- type="text"
501
- id="appTitle"
502
- name="appTitle"
503
- onChange={formik.handleChange}
504
- value={formik.values.appTitle ?? ''}
505
- className='w-full'
506
- />
507
- </div>
508
- </div>
509
- </div>
510
- <div className="col-12 md:col-6 mt-4">
511
- <div className="formgrid grid align-items-center">
512
- <div className="col-12 md:col-5 pb-2 md:pb-0">
513
- <label className="form-field-label">App Subtitle</label>
514
- </div>
515
- <div className="col-12 md:col-7">
516
- <SolidInput
517
- type="text"
518
- id="appSubtitle"
519
- name="appSubtitle"
520
- onChange={formik.handleChange}
521
- value={formik.values.appSubtitle ?? ''}
522
- className='w-full'
523
- />
524
- </div>
525
- </div>
526
- </div>
527
- <div className="col-12 md:col-6 mt-4">
528
- <div className="formgrid grid align-items-start">
529
- <div className="col-12 md:col-5 pb-2 md:pb-0">
530
- <label className="form-field-label">Description</label>
531
- </div>
532
- <div className="col-12 md:col-7">
533
- <SolidTextarea
534
- rows={3}
535
- id="appDescription"
536
- name="appDescription"
537
- onChange={formik.handleChange}
538
- value={formik.values.appDescription ?? ''}
539
- className='w-full'
540
- />
541
- </div>
542
- </div>
543
- </div>
544
- <div className="col-12 md:col-6 mt-4">
545
- <div className="formgrid grid align-items-start">
546
- <div className="col-12 md:col-5 pb-2 md:pb-0">
547
- <label className="form-field-label">Copyright</label>
548
- </div>
549
- <div className="col-12 md:col-7">
550
- <SolidTextarea
551
- rows={3}
552
- id="copyright"
553
- name="copyright"
554
- onChange={formik.handleChange}
555
- value={formik.values.copyright ?? ''}
556
- className='w-full'
557
- />
558
- </div>
559
- </div>
560
- </div>
561
- </div>
562
- </div>
563
- </div>
564
- <SolidDivider className="my-4" />
565
-
566
- <p className="solid-settings-heading">Legal Links</p>
567
- <div className='formgrid grid'>
568
- <div className='col-12 lg:col-10 xl:col-8'>
569
- <div className="formgrid grid">
570
- <div className="col-12 md:col-6">
571
- <div className="formgrid grid align-items-center">
572
- <div className="col-10 sm:col-9 lg:col-5">
573
- <label className="form-field-label">Show Legal Links</label>
574
- </div>
575
- <div className="col-2 sm:col-3 lg:col-7">
576
- <SolidSwitch
577
- name="showLegalLinks"
578
- checked={formik.values.showLegalLinks}
579
- onChange={(checked) => formik.setFieldValue("showLegalLinks", checked)}
580
- />
581
- </div>
582
- </div>
583
- </div>
584
- <div className="col-12 md:col-6">
585
- <div className="formgrid grid align-items-center">
586
- <div className="col-12 md:col-5 py-2 md:py-0">
587
- <label className="form-field-label">Terms and Conditions Link</label>
588
- </div>
589
- <div className="col-12 md:col-7">
590
- <SolidInput
591
- type="text"
592
- id="appTnc"
593
- name="appTnc"
594
- onChange={formik.handleChange}
595
- value={formik.values.appTnc ?? ''}
596
- className='w-full'
597
- />
598
- </div>
599
- </div>
600
- </div>
601
- <div className="col-12 md:col-6 mt-3">
602
- <div className="formgrid grid align-items-center">
603
- <div className="col-12 md:col-5 pb-2 md:pb-0">
604
- <label className="form-field-label">Privacy Policy Link</label>
605
- </div>
606
- <div className="col-12 md:col-7">
607
- <SolidInput
608
- type="text"
609
- id="appPrivacyPolicy"
610
- name="appPrivacyPolicy"
611
- onChange={formik.handleChange}
612
- value={formik.values.appPrivacyPolicy ?? ''}
613
- className='w-full'
614
- />
615
- </div>
616
- </div>
617
- </div>
618
- </div>
619
- </div>
620
- </div>
621
- <SolidDivider className="my-4" />
622
- <p className="solid-settings-heading">Theme</p>
623
- <div className='formgrid grid'>
624
- <div className='col-12 lg:col-10 xl:col-8'>
625
- <div className="formgrid grid">
626
- <div className="col-12 md:col-6">
627
- <div className="formgrid grid align-items-center">
628
- <div className="col-10 sm:col-10 lg:col-5">
629
- <label className="form-field-label">Enable Dark Mode</label>
630
- </div>
631
- <div className="col-2 sm:col-3 lg:col-7">
632
- <SolidSwitch
633
- name="enableDarkMode"
634
- checked={formik.values.enableDarkMode}
635
- onChange={(checked) => formik.setFieldValue("enableDarkMode", checked)}
636
- />
637
- </div>
638
- </div>
639
- </div>
640
- </div>
641
- </div>
642
- </div>
643
- </>
644
- }
645
- {pathname.includes("authentication-settings") &&
646
- <>
647
- <p className="solid-settings-heading">User Authentication</p>
648
- <div className='formgrid grid'>
649
- <div className='col-12 lg:col-10 xl:col-8'>
650
- <div className="formgrid grid">
651
- <div className="col-12">
652
- <div className="formgrid grid align-items-center">
653
- <div className="col-10 sm:col-9 lg:col-5">
654
- <label className="form-field-label">Public Registration</label>
655
- </div>
656
- <div className="col-2 sm:col-3 lg:col-7">
657
- <SolidSwitch
658
- name="allowPublicRegistration"
659
- checked={formik.values.allowPublicRegistration}
660
- onChange={(checked) => formik.setFieldValue("allowPublicRegistration", checked)}
661
- />
662
- </div>
663
- </div>
664
- </div>
665
- <div className="col-12 mt-3">
666
- <div className="formgrid grid align-items-center">
667
- <div className="col-10 sm:col-9 lg:col-5">
668
- <label className="form-field-label">Password Based Authentication</label>
669
- </div>
670
- <div className="col-2 sm:col-3 lg:col-7">
671
- <SolidSwitch
672
- name="passwordBasedAuth"
673
- checked={formik.values.passwordBasedAuth}
674
- onChange={(checked) => formik.setFieldValue("passwordBasedAuth", checked)}
675
- />
676
- </div>
677
- </div>
678
- </div>
679
- <div className="col-12 mt-3">
680
- <div className="formgrid grid align-items-center">
681
- <div className="col-10 sm:col-9 lg:col-5">
682
- <label className="form-field-label">Password Less Authentication</label>
683
- </div>
684
- <div className="col-2 sm:col-3 lg:col-7">
685
- <SolidSwitch
686
- name="passwordLessAuth"
687
- checked={formik.values.passwordLessAuth}
688
- onChange={(checked) => formik.setFieldValue("passwordLessAuth", checked)}
689
- />
690
- </div>
691
- </div>
692
- </div>
693
- <div className="col-12 mt-3">
694
- <div className="formgrid grid align-items-center">
695
- <div className="col-10 sm:col-9 lg:col-5">
696
- <label className="form-field-label">Auto Activate User on Registration </label>
697
- </div>
698
- <div className="col-2 sm:col-3 lg:col-7">
699
- <SolidSwitch
700
- name="activateUserOnRegistration"
701
- checked={formik.values.activateUserOnRegistration}
702
- onChange={(checked) => formik.setFieldValue("activateUserOnRegistration", checked)}
703
- />
704
- </div>
705
- </div>
706
- </div>
707
- <div className="col-12 mt-3">
708
- <div className="formgrid grid align-items-center">
709
- <div className="col-10 sm:col-9 lg:col-5">
710
- <label className="form-field-label">Allow Login/ Signup with Google </label>
711
- </div>
712
- <div className="col-2 sm:col-3 lg:col-7">
713
- <SolidSwitch
714
- name="iamGoogleOAuthEnabled"
715
- checked={formik.values.iamGoogleOAuthEnabled}
716
- onChange={(checked) => formik.setFieldValue("iamGoogleOAuthEnabled", checked)}
717
- />
718
- </div>
719
- </div>
720
- </div>
721
- <div className="col-12 mt-3">
722
- <div className="formgrid grid align-items-center">
723
- <div className="col-10 sm:col-9 lg:col-5">
724
- <label className="form-field-label">Force Password change on first Login </label>
725
- </div>
726
- <div className="col-2 sm:col-3 lg:col-7">
727
- <SolidSwitch
728
- name="forceChangePasswordOnFirstLogin"
729
- checked={formik.values.forceChangePasswordOnFirstLogin}
730
- onChange={(checked) => formik.setFieldValue("forceChangePasswordOnFirstLogin", checked)}
731
- />
732
- </div>
733
- </div>
734
- </div>
735
- {formik.values.passwordLessAuth === true &&
736
- <div className="col-12 mt-3">
737
- <div className="formgrid grid align-items-center">
738
- <div className="col-12 sm:col-12 lg:col-5 xl:col-5">
739
- <label className="form-field-label">Password Less Registration Method</label>
740
- </div>
741
- <div className='col-12 sm:col-12 lg:col-6 xl:col-6'>
742
- <SolidSegmentedControl
743
- className="solid-settings-segmented mt-3 lg:mt-0"
744
- value={formik.values.passwordlessRegistrationValidateWhat}
745
- options={[
746
- { value: "email", label: "Email" },
747
- { value: "mobile", label: "Mobile" },
748
- ]}
749
- onChange={(value) => formik.setFieldValue("passwordlessRegistrationValidateWhat", value)}
750
- />
751
- </div>
752
- </div>
753
- </div>
754
- }
755
- {formik.values.passwordLessAuth === true &&
756
- <div className="col-12 mt-3">
757
- <div className="formgrid grid align-items-center">
758
- <div className="col-12 sm:col-12 lg:col-5 xl:col-5">
759
- <label className="form-field-label">Password Less Login Method</label>
760
- </div>
761
- <div className='col-12 sm:col-12 lg:col-6 xl:col-6'>
762
- <SolidSegmentedControl
763
- className="solid-settings-segmented mt-3 lg:mt-0"
764
- value={formik.values.passwordlessLoginValidateWhat}
765
- options={[
766
- { value: "email", label: "Email" },
767
- { value: "mobile", label: "Mobile" },
768
- { value: "selectable", label: "Selectable" },
769
- ]}
770
- onChange={(value) => formik.setFieldValue("passwordlessLoginValidateWhat", value)}
771
- />
772
- </div>
773
- </div>
774
- </div>
775
- }
776
- </div>
777
- </div>
778
- </div>
779
- <SolidDivider className="my-4" />
780
- <p className="solid-settings-heading">Authentication Screen Layout</p>
781
- <div className='formgrid grid'>
782
- <div className='col-12 lg:col-10 xl:col-8'>
783
- <SolidSegmentedControl
784
- className="solid-settings-segmented"
785
- value={formik.values.authPagesLayout}
786
- options={[
787
- { value: "left", label: "Left" },
788
- { value: "center", label: "Center" },
789
- { value: "right", label: "Right" },
790
- ]}
791
- onChange={(value) => formik.setFieldValue("authPagesLayout", value)}
792
- />
793
- <p className="mt-3 text-sm font-bold">Note : {positionMap[formik.values.authPagesLayout as 'left' | 'center' | 'right']}</p>
794
- </div>
795
- </div>
796
- {formik.values.authPagesLayout === "center" && <></>}
797
- <div className='formgrid grid'>
798
- <div className='col-12 lg:col-10 xl:col-8'>
799
- <div className="formgrid grid">
800
- <div className="col-12 md:col-8 lg:col-6">
801
- <p className="solid-settings-subheading">
802
- {formik.values.authPagesLayout === "center" ? "Background" : "Banner"} Image
803
- </p>
804
- {formik.values.authPagesLayout === "left" &&
805
- <div>
806
- <div {...getAuthScreenLeftBackgroundImageRootProps()} className="solid-dropzone-wrapper" style={{ borderRadius: 8 }}>
807
- <input {...getAuthScreenLeftBackgroundImageInputProps()} />
808
- {/* {isAuthScreenLeftBackgroundImageDragActive && */}
809
- <SettingDropzoneActivePlaceholder note={"Recommended: 724×724px | Aspect ratio: 1:1"} />
810
- {/* } */}
811
- </div>
812
- <div className="mt-2">
813
- {(() => {
814
- const logoSrc = (AuthScreenLeftBackgroundImage as any).src || AuthScreenLeftBackgroundImage;
815
-
816
- let src = authScreenLeftBackgroundImagePreview
817
- ? authScreenLeftBackgroundImagePreview
818
- : formik.values.authScreenLeftBackgroundImage
819
- ? formik.values.authScreenLeftBackgroundImage
820
- : logoSrc
821
-
822
- const isBlobOrAbsolute = src?.startsWith("blob:") || src?.startsWith("http");
823
-
824
- if (!isBlobOrAbsolute && !src.startsWith("/")) {
825
- src = `${env("API_URL")}/${src}`;
826
- }
827
- return (
828
- <SolidUploadedImage src={src} height={400} width={400} maxHeight={400} />
829
- );
830
- })()}
831
- </div>
832
- {formik.values.authScreenLeftBackgroundImage && (
833
- <SettingsImageRemoveButton onClick={removeAuthScreenLeftBackgroundImage} />
834
- )}
835
- </div>
836
- }
837
- {formik.values.authPagesLayout === "right" &&
838
- <div>
839
- <div {...getAuthScreenRightBackgroundImageRootProps()} className="solid-dropzone-wrapper" style={{ borderRadius: 8 }}>
840
- <input {...getAuthScreenRightBackgroundImageInputProps()} />
841
- {/* {isAuthScreenRightBackgroundImageDragActive && */}
842
- <SettingDropzoneActivePlaceholder note={"Recommended: 724×724px | Aspect ratio: 1:1"} />
843
- {/* } */}
844
- </div>
845
- <div className="mt-2">
846
- {(() => {
847
- const logoSrc = (AuthScreenRightBackgroundImage as any).src || AuthScreenRightBackgroundImage;
848
-
849
- let src = authScreenRightBackgroundImagePreview
850
- ? authScreenRightBackgroundImagePreview
851
- : formik.values.authScreenRightBackgroundImage
852
- ? formik.values.authScreenRightBackgroundImage
853
- : logoSrc
854
-
855
- const isBlobOrAbsolute = src?.startsWith("blob:") || src?.startsWith("http");
856
-
857
- if (!isBlobOrAbsolute && !src.startsWith("/")) {
858
- src = `${env("API_URL")}/${src}`;
859
- }
860
- return (
861
- <SolidUploadedImage src={src} height={400} width={400} maxHeight={400} />
862
- );
863
- })()}
864
- </div>
865
- {formik.values.authScreenRightBackgroundImage && (
866
- <SettingsImageRemoveButton onClick={removeAuthScreenRightBackgroundImage} />
867
- )}
868
- </div>
869
- }
870
- {formik.values.authPagesLayout === "center" &&
871
- <div>
872
- <div {...getAuthScreenCenterBackgroundImageRootProps()} className="solid-dropzone-wrapper" style={{ borderRadius: 8 }}>
873
- <input {...getAuthScreenCenterBackgroundImageInputProps()} />
874
- <SettingDropzoneActivePlaceholder note={"Recommended: 1440px × 724px | Aspect ratio: 2:1"} />
875
- </div>
876
- <div className="mt-2">
877
- {(() => {
878
- const logoSrc = (AuthScreenCenterBackgroundImage as any).src || AuthScreenCenterBackgroundImage;
879
-
880
- let src = authScreenCenterBackgroundImagePreview
881
- ? authScreenCenterBackgroundImagePreview
882
- : formik.values.authScreenCenterBackgroundImage
883
- ? formik.values.authScreenCenterBackgroundImage
884
- : logoSrc
885
-
886
- const isBlobOrAbsolute = src?.startsWith("blob:") || src?.startsWith("http");
579
+ </div>
580
+ <div className="col-2 sm:col-3 lg:col-7">
581
+ <SolidSwitch
582
+ name="showAuthContent"
583
+ checked={formik.values.showAuthContent}
584
+ onChange={(checked) =>
585
+ formik.setFieldValue(
586
+ "showAuthContent",
587
+ checked,
588
+ )
589
+ }
590
+ />
591
+ </div>
592
+ </div>
593
+ </div>
594
+ <div className="col-12 md:col-6">
595
+ <div className="formgrid grid align-items-center">
596
+ <div className="col-12 md:col-5 pb-2 md:pb-0">
597
+ <label className="form-field-label">
598
+ App Title
599
+ </label>
600
+ </div>
601
+ <div className="col-12 md:col-7">
602
+ <SolidInput
603
+ type="text"
604
+ id="appTitle"
605
+ name="appTitle"
606
+ onChange={formik.handleChange}
607
+ value={formik.values.appTitle ?? ''}
608
+ className="w-full"
609
+ />
610
+ </div>
611
+ </div>
612
+ </div>
613
+ <div className="col-12 md:col-6 mt-4">
614
+ <div className="formgrid grid align-items-center">
615
+ <div className="col-12 md:col-5 pb-2 md:pb-0">
616
+ <label className="form-field-label">
617
+ App Subtitle
618
+ </label>
619
+ </div>
620
+ <div className="col-12 md:col-7">
621
+ <SolidInput
622
+ type="text"
623
+ id="appSubtitle"
624
+ name="appSubtitle"
625
+ onChange={formik.handleChange}
626
+ value={formik.values.appSubtitle ?? ''}
627
+ className="w-full"
628
+ />
629
+ </div>
630
+ </div>
631
+ </div>
632
+ <div className="col-12 md:col-6 mt-4">
633
+ <div className="formgrid grid align-items-start">
634
+ <div className="col-12 md:col-5 pb-2 md:pb-0">
635
+ <label className="form-field-label">
636
+ Description
637
+ </label>
638
+ </div>
639
+ <div className="col-12 md:col-7">
640
+ <SolidTextarea
641
+ rows={3}
642
+ id="appDescription"
643
+ name="appDescription"
644
+ onChange={formik.handleChange}
645
+ value={formik.values.appDescription ?? ''}
646
+ className='w-full'
647
+ />
648
+ </div>
649
+ </div>
650
+ </div>
651
+ <div className="col-12 md:col-6 mt-4">
652
+ <div className="formgrid grid align-items-start">
653
+ <div className="col-12 md:col-5 pb-2 md:pb-0">
654
+ <label className="form-field-label">Copyright</label>
655
+ </div>
656
+ <div className="col-12 md:col-7">
657
+ <SolidTextarea
658
+ rows={3}
659
+ id="copyright"
660
+ name="copyright"
661
+ onChange={formik.handleChange}
662
+ value={formik.values.copyright ?? ''}
663
+ className='w-full'
664
+ />
665
+ </div>
666
+ </div>
667
+ </div>
668
+ </div>
669
+ </div>
670
+ </div>
671
+ <SolidDivider className="my-4" />
672
+
673
+ <p className="solid-settings-heading">Legal Links</p>
674
+ <div className='formgrid grid'>
675
+ <div className='col-12 lg:col-10 xl:col-8'>
676
+ <div className="formgrid grid">
677
+ <div className="col-12 md:col-6">
678
+ <div className="formgrid grid align-items-center">
679
+ <div className="col-10 sm:col-9 lg:col-5">
680
+ <label className="form-field-label">Show Legal Links</label>
681
+ </div>
682
+ <div className="col-2 sm:col-3 lg:col-7">
683
+ <SolidSwitch
684
+ name="showLegalLinks"
685
+ checked={formik.values.showLegalLinks}
686
+ onChange={(checked) => formik.setFieldValue("showLegalLinks", checked)}
687
+ />
688
+ </div>
689
+ </div>
690
+ </div>
691
+ <div className="col-12 md:col-6">
692
+ <div className="formgrid grid align-items-center">
693
+ <div className="col-12 md:col-5 py-2 md:py-0">
694
+ <label className="form-field-label">
695
+ Terms and Conditions Link
696
+ </label>
697
+ </div>
698
+ <div className="col-12 md:col-7">
699
+ <SolidInput
700
+ type="text"
701
+ id="appTnc"
702
+ name="appTnc"
703
+ onChange={formik.handleChange}
704
+ value={formik.values.appTnc ?? ""}
705
+ className="w-full"
706
+ />
707
+ </div>
708
+ </div>
709
+ </div>
710
+ <div className="col-12 md:col-6 mt-3">
711
+ <div className="formgrid grid align-items-center">
712
+ <div className="col-12 md:col-5 pb-2 md:pb-0">
713
+ <label className="form-field-label">
714
+ Privacy Policy Link
715
+ </label>
716
+ </div>
717
+ <div className="col-12 md:col-7">
718
+ <SolidInput
719
+ type="text"
720
+ id="appPrivacyPolicy"
721
+ name="appPrivacyPolicy"
722
+ onChange={formik.handleChange}
723
+ value={formik.values.appPrivacyPolicy ?? ""}
724
+ className="w-full"
725
+ />
726
+ </div>
727
+ </div>
728
+ </div>
729
+ </div>
730
+ </div>
731
+ </div>
732
+ <SolidDivider className="my-4" />
733
+ <p className="solid-settings-heading">Theme</p>
734
+ <div className="formgrid grid">
735
+ <div className="col-12 lg:col-10 xl:col-8">
736
+ <div className="formgrid grid">
737
+ <div className="col-12 md:col-6">
738
+ <div className="formgrid grid align-items-center">
739
+ <div className="col-10 sm:col-10 lg:col-5">
740
+ <label className="form-field-label">
741
+ Enable Dark Mode
742
+ </label>
743
+ </div>
744
+ <div className="col-2 sm:col-3 lg:col-7">
745
+ <SolidSwitch
746
+ name="enableDarkMode"
747
+ checked={formik.values.enableDarkMode}
748
+ onChange={(checked) => formik.setFieldValue("enableDarkMode",checked)}
749
+ />
750
+ </div>
751
+ </div>
752
+ </div>
753
+ </div>
754
+ </div>
755
+ </div>
756
+ </>
757
+ )}
758
+ {pathname.includes("authentication-settings") && (
759
+ <>
760
+ <p className="solid-settings-heading">User Authentication</p>
761
+ <div className="formgrid grid">
762
+ <div className="col-12 lg:col-10 xl:col-8">
763
+ <div className="formgrid grid">
764
+ <div className="col-12">
765
+ <div className="formgrid grid align-items-center">
766
+ <div className="col-10 sm:col-9 lg:col-5">
767
+ <label className="form-field-label">
768
+ Public Registration
769
+ </label>
770
+ </div>
771
+ <div className="col-2 sm:col-3 lg:col-7">
772
+ <SolidSwitch
773
+ name="allowPublicRegistration"
774
+ checked={formik.values.allowPublicRegistration}
775
+ onChange={(checked) =>
776
+ formik.setFieldValue(
777
+ "allowPublicRegistration",
778
+ checked,
779
+ )
780
+ }
781
+ />
782
+ </div>
783
+ </div>
784
+ </div>
785
+ <div className="col-12 mt-3">
786
+ <div className="formgrid grid align-items-center">
787
+ <div className="col-10 sm:col-9 lg:col-5">
788
+ <label className="form-field-label">
789
+ Password Based Authentication
790
+ </label>
791
+ </div>
792
+ <div className="col-2 sm:col-3 lg:col-7">
793
+ <SolidSwitch
794
+ name="passwordBasedAuth"
795
+ checked={formik.values.passwordBasedAuth}
796
+ onChange={(checked) =>
797
+ formik.setFieldValue(
798
+ "passwordBasedAuth",
799
+ checked,
800
+ )
801
+ }
802
+ />
803
+ </div>
804
+ </div>
805
+ </div>
806
+ <div className="col-12 mt-3">
807
+ <div className="formgrid grid align-items-center">
808
+ <div className="col-10 sm:col-9 lg:col-5">
809
+ <label className="form-field-label">
810
+ Password Less Authentication
811
+ </label>
812
+ </div>
813
+ <div className="col-2 sm:col-3 lg:col-7">
814
+ <SolidSwitch
815
+ name="passwordLessAuth"
816
+ checked={formik.values.passwordLessAuth}
817
+ onChange={(checked) =>
818
+ formik.setFieldValue(
819
+ "passwordLessAuth",
820
+ checked,
821
+ )
822
+ }
823
+ />
824
+ </div>
825
+ </div>
826
+ </div>
827
+ <div className="col-12 mt-3">
828
+ <div className="formgrid grid align-items-center">
829
+ <div className="col-10 sm:col-9 lg:col-5">
830
+ <label className="form-field-label">
831
+ Auto Activate User on Registration{" "}
832
+ </label>
833
+ </div>
834
+ <div className="col-2 sm:col-3 lg:col-7">
835
+ <SolidSwitch
836
+ name="activateUserOnRegistration"
837
+ checked={
838
+ formik.values.activateUserOnRegistration
839
+ }
840
+ onChange={(checked) =>
841
+ formik.setFieldValue(
842
+ "activateUserOnRegistration",
843
+ checked,
844
+ )
845
+ }
846
+ />
847
+ </div>
848
+ </div>
849
+ </div>
850
+ <div className="col-12 mt-3">
851
+ <div className="formgrid grid align-items-center">
852
+ <div className="col-10 sm:col-9 lg:col-5">
853
+ <label className="form-field-label">
854
+ Allow Login/ Signup with Google{" "}
855
+ </label>
856
+ </div>
857
+ <div className="col-2 sm:col-3 lg:col-7">
858
+ <SolidSwitch
859
+ name="iamGoogleOAuthEnabled"
860
+ checked={formik.values.iamGoogleOAuthEnabled}
861
+ onChange={(checked) =>
862
+ formik.setFieldValue(
863
+ "iamGoogleOAuthEnabled",
864
+ checked,
865
+ )
866
+ }
867
+ />
868
+ </div>
869
+ </div>
870
+ </div>
871
+ <div className="col-12 mt-3">
872
+ <div className="formgrid grid align-items-center">
873
+ <div className="col-10 sm:col-9 lg:col-5">
874
+ <label className="form-field-label">
875
+ Allow Login/ Signup with Microsoft{" "}
876
+ </label>
877
+ </div>
878
+ <div className="col-2 sm:col-3 lg:col-7">
879
+ <SolidSwitch
880
+ name="iamMicrosoftOAuthEnabled"
881
+ checked={formik.values.iamMicrosoftOAuthEnabled}
882
+ onChange={(checked) =>
883
+ formik.setFieldValue(
884
+ "iamMicrosoftOAuthEnabled",
885
+ checked,
886
+ )
887
+ }
888
+ />
889
+ </div>
890
+ </div>
891
+ </div>
892
+ <div className="col-12 mt-3">
893
+ <div className="formgrid grid align-items-center">
894
+ <div className="col-10 sm:col-9 lg:col-5">
895
+ <label className="form-field-label">
896
+ Allow Login/ Signup with Facebook{" "}
897
+ </label>
898
+ </div>
899
+ <div className="col-2 sm:col-3 lg:col-7">
900
+ <SolidSwitch
901
+ name="iamFacebookOAuthEnabled"
902
+ checked={formik.values.iamFacebookOAuthEnabled}
903
+ onChange={(checked) =>
904
+ formik.setFieldValue(
905
+ "iamFacebookOAuthEnabled",
906
+ checked,
907
+ )
908
+ }
909
+ />
910
+ </div>
911
+ </div>
912
+ </div>
913
+ <div className="col-12 mt-3">
914
+ <div className="formgrid grid align-items-center">
915
+ <div className="col-10 sm:col-9 lg:col-5">
916
+ <label className="form-field-label">
917
+ Allow Login/ Signup with Apple{" "}
918
+ </label>
919
+ </div>
920
+ <div className="col-2 sm:col-3 lg:col-7">
921
+ <SolidSwitch
922
+ name="iamAppleOAuthEnabled"
923
+ checked={formik.values.iamAppleOAuthEnabled}
924
+ onChange={(checked) =>
925
+ formik.setFieldValue(
926
+ "iamAppleOAuthEnabled",
927
+ checked,
928
+ )
929
+ }
930
+ />
931
+ </div>
932
+ </div>
933
+ </div>
934
+ <div className="col-12 mt-3">
935
+ <div className="formgrid grid align-items-center">
936
+ <div className="col-10 sm:col-9 lg:col-5">
937
+ <label className="form-field-label">
938
+ Force Password change on first Login{" "}
939
+ </label>
940
+ </div>
941
+ <div className="col-2 sm:col-3 lg:col-7">
942
+ <SolidSwitch
943
+ name="forceChangePasswordOnFirstLogin"
944
+ checked={
945
+ formik.values.forceChangePasswordOnFirstLogin
946
+ }
947
+ onChange={(checked) =>
948
+ formik.setFieldValue(
949
+ "forceChangePasswordOnFirstLogin",
950
+ checked,
951
+ )
952
+ }
953
+ />
954
+ </div>
955
+ </div>
956
+ </div>
957
+ {formik.values.passwordLessAuth === true && (
958
+ <div className="col-12 mt-3">
959
+ <div className="formgrid grid align-items-center">
960
+ <div className="col-12 sm:col-12 lg:col-5 xl:col-5">
961
+ <label className="form-field-label">
962
+ Password Less Registration Method
963
+ </label>
964
+ </div>
965
+ <div className="col-12 sm:col-12 lg:col-6 xl:col-6">
966
+ <SolidSegmentedControl
967
+ className="solid-settings-segmented mt-3 lg:mt-0"
968
+ value={
969
+ formik.values
970
+ .passwordlessRegistrationValidateWhat
971
+ }
972
+ options={[
973
+ { value: "email", label: "Email" },
974
+ { value: "mobile", label: "Mobile" },
975
+ ]}
976
+ onChange={(value) =>
977
+ formik.setFieldValue(
978
+ "passwordlessRegistrationValidateWhat",
979
+ value,
980
+ )
981
+ }
982
+ />
983
+ </div>
984
+ </div>
985
+ </div>
986
+ )}
987
+ {formik.values.passwordLessAuth === true && (
988
+ <div className="col-12 mt-3">
989
+ <div className="formgrid grid align-items-center">
990
+ <div className="col-12 sm:col-12 lg:col-5 xl:col-5">
991
+ <label className="form-field-label">
992
+ Password Less Login Method
993
+ </label>
994
+ </div>
995
+ <div className="col-12 sm:col-12 lg:col-6 xl:col-6">
996
+ <SolidSegmentedControl
997
+ className="solid-settings-segmented mt-3 lg:mt-0"
998
+ value={
999
+ formik.values.passwordlessLoginValidateWhat
1000
+ }
1001
+ options={[
1002
+ { value: "email", label: "Email" },
1003
+ { value: "mobile", label: "Mobile" },
1004
+ {
1005
+ value: "selectable",
1006
+ label: "Selectable",
1007
+ },
1008
+ ]}
1009
+ onChange={(value) =>
1010
+ formik.setFieldValue(
1011
+ "passwordlessLoginValidateWhat",
1012
+ value,
1013
+ )
1014
+ }
1015
+ />
1016
+ </div>
1017
+ </div>
1018
+ </div>
1019
+ )}
1020
+ </div>
1021
+ </div>
1022
+ </div>
1023
+ <SolidDivider className="my-4" />
1024
+ <p className="solid-settings-heading">
1025
+ Authentication Screen Layout
1026
+ </p>
1027
+ <div className="formgrid grid">
1028
+ <div className="col-12 lg:col-10 xl:col-8">
1029
+ <SolidSegmentedControl
1030
+ className="solid-settings-segmented"
1031
+ value={formik.values.authPagesLayout}
1032
+ options={[
1033
+ { value: "left", label: "Left" },
1034
+ { value: "center", label: "Center" },
1035
+ { value: "right", label: "Right" },
1036
+ ]}
1037
+ onChange={(value) =>
1038
+ formik.setFieldValue("authPagesLayout", value)
1039
+ }
1040
+ />
1041
+ <p className="mt-3 text-sm font-bold">
1042
+ Note :{" "}
1043
+ {
1044
+ positionMap[
1045
+ formik.values.authPagesLayout as
1046
+ | "left"
1047
+ | "center"
1048
+ | "right"
1049
+ ]
1050
+ }
1051
+ </p>
1052
+ </div>
1053
+ </div>
1054
+ {formik.values.authPagesLayout === "center" && <></>}
1055
+ <div className="formgrid grid">
1056
+ <div className="col-12 lg:col-10 xl:col-8">
1057
+ <div className="formgrid grid">
1058
+ <div className="col-12 md:col-8 lg:col-6">
1059
+ <p className="solid-settings-subheading">
1060
+ {formik.values.authPagesLayout === "center"
1061
+ ? "Background"
1062
+ : "Banner"}{" "}
1063
+ Image
1064
+ </p>
1065
+ {formik.values.authPagesLayout === "left" && (
1066
+ <div>
1067
+ <div
1068
+ {...getAuthScreenLeftBackgroundImageRootProps()}
1069
+ className="solid-dropzone-wrapper"
1070
+ style={{ borderRadius: 8 }}
1071
+ >
1072
+ <input
1073
+ {...getAuthScreenLeftBackgroundImageInputProps()}
1074
+ />
1075
+ {/* {isAuthScreenLeftBackgroundImageDragActive && */}
1076
+ <SettingDropzoneActivePlaceholder
1077
+ note={
1078
+ "Recommended: 724×724px | Aspect ratio: 1:1"
1079
+ }
1080
+ />
1081
+ {/* } */}
1082
+ </div>
1083
+ <div className="mt-2">
1084
+ {(() => {
1085
+ const logoSrc =
1086
+ (AuthScreenLeftBackgroundImage as any)
1087
+ .src || AuthScreenLeftBackgroundImage;
1088
+
1089
+ let src = authScreenLeftBackgroundImagePreview
1090
+ ? authScreenLeftBackgroundImagePreview
1091
+ : formik.values
1092
+ .authScreenLeftBackgroundImage
1093
+ ? formik.values
1094
+ .authScreenLeftBackgroundImage
1095
+ : logoSrc;
1096
+
1097
+ const isBlobOrAbsolute =
1098
+ src?.startsWith("blob:") ||
1099
+ src?.startsWith("http");
1100
+
1101
+ if (
1102
+ !isBlobOrAbsolute &&
1103
+ !src.startsWith("/")
1104
+ ) {
1105
+ src = `${env("API_URL")}/${src}`;
1106
+ }
1107
+ return (
1108
+ <SolidUploadedImage
1109
+ src={src}
1110
+ height={400}
1111
+ width={400}
1112
+ maxHeight={400}
1113
+ />
1114
+ );
1115
+ })()}
1116
+ </div>
1117
+ {formik.values.authScreenLeftBackgroundImage && (
1118
+ <SettingsImageRemoveButton
1119
+ onClick={removeAuthScreenLeftBackgroundImage}
1120
+ />
1121
+ )}
1122
+ </div>
1123
+ )}
1124
+ {formik.values.authPagesLayout === "right" && (
1125
+ <div>
1126
+ <div
1127
+ {...getAuthScreenRightBackgroundImageRootProps()}
1128
+ className="solid-dropzone-wrapper"
1129
+ style={{ borderRadius: 8 }}
1130
+ >
1131
+ <input
1132
+ {...getAuthScreenRightBackgroundImageInputProps()}
1133
+ />
1134
+ {/* {isAuthScreenRightBackgroundImageDragActive && */}
1135
+ <SettingDropzoneActivePlaceholder
1136
+ note={
1137
+ "Recommended: 724×724px | Aspect ratio: 1:1"
1138
+ }
1139
+ />
1140
+ {/* } */}
1141
+ </div>
1142
+ <div className="mt-2">
1143
+ {(() => {
1144
+ const logoSrc =
1145
+ (AuthScreenRightBackgroundImage as any)
1146
+ .src || AuthScreenRightBackgroundImage;
1147
+
1148
+ let src =
1149
+ authScreenRightBackgroundImagePreview
1150
+ ? authScreenRightBackgroundImagePreview
1151
+ : formik.values
1152
+ .authScreenRightBackgroundImage
1153
+ ? formik.values
1154
+ .authScreenRightBackgroundImage
1155
+ : logoSrc;
1156
+
1157
+ const isBlobOrAbsolute =
1158
+ src?.startsWith("blob:") ||
1159
+ src?.startsWith("http");
1160
+
1161
+ if (
1162
+ !isBlobOrAbsolute &&
1163
+ !src.startsWith("/")
1164
+ ) {
1165
+ src = `${env("API_URL")}/${src}`;
1166
+ }
1167
+ return (
1168
+ <SolidUploadedImage
1169
+ src={src}
1170
+ height={400}
1171
+ width={400}
1172
+ maxHeight={400}
1173
+ />
1174
+ );
1175
+ })()}
1176
+ </div>
1177
+ {formik.values.authScreenRightBackgroundImage && (
1178
+ <SettingsImageRemoveButton
1179
+ onClick={removeAuthScreenRightBackgroundImage}
1180
+ />
1181
+ )}
1182
+ </div>
1183
+ )}
1184
+ {formik.values.authPagesLayout === "center" && (
1185
+ <div>
1186
+ <div
1187
+ {...getAuthScreenCenterBackgroundImageRootProps()}
1188
+ className="solid-dropzone-wrapper"
1189
+ style={{ borderRadius: 8 }}
1190
+ >
1191
+ <input
1192
+ {...getAuthScreenCenterBackgroundImageInputProps()}
1193
+ />
1194
+ <SettingDropzoneActivePlaceholder
1195
+ note={
1196
+ "Recommended: 1440px × 724px | Aspect ratio: 2:1"
1197
+ }
1198
+ />
1199
+ </div>
1200
+ <div className="mt-2">
1201
+ {(() => {
1202
+ const logoSrc =
1203
+ (AuthScreenCenterBackgroundImage as any)
1204
+ .src || AuthScreenCenterBackgroundImage;
1205
+
1206
+ let src =
1207
+ authScreenCenterBackgroundImagePreview
1208
+ ? authScreenCenterBackgroundImagePreview
1209
+ : formik.values
1210
+ .authScreenCenterBackgroundImage
1211
+ ? formik.values
1212
+ .authScreenCenterBackgroundImage
1213
+ : logoSrc;
1214
+
1215
+ const isBlobOrAbsolute =
1216
+ src?.startsWith("blob:") ||
1217
+ src?.startsWith("http");
887
1218
 
888
1219
  if (!isBlobOrAbsolute && !src.startsWith("/")) {
889
1220
  src = `${env("API_URL")}/${src}`;
@@ -897,18 +1228,18 @@ export const GeneralSettings = () => {
897
1228
  <SettingsImageRemoveButton onClick={removeAuthScreenCenterBackgroundImage} />
898
1229
  )}
899
1230
  </div>
900
- }
1231
+ )}
901
1232
  </div>
902
1233
  </div>
903
1234
  </div>
904
1235
  </div>
905
1236
  <SolidDivider className="my-4" />
906
1237
  </>
907
- }
1238
+ )}
908
1239
 
909
- {pathname.includes("misc-settings") &&
910
- <>
911
- {/*
1240
+ {pathname.includes("misc-settings") && (
1241
+ <>
1242
+ {/*
912
1243
  <p className='font-bold' style={{ fontSize: 16, color: 'var(--solid-setting-title)' }}>Misc Details</p>
913
1244
  <div className='formgrid grid'>
914
1245
  <div className='col-12 lg:col-10 xl:col-8'>
@@ -988,7 +1319,7 @@ export const GeneralSettings = () => {
988
1319
  </div>
989
1320
  </div>
990
1321
  </>
991
- }
1322
+ )}
992
1323
  {pathname.includes("ai-settings") &&
993
1324
  <AiSettingsSection
994
1325
  aiConfig={formik.values.solidXGenAiCodeBuilderConfig as SolidAiConfig}
@@ -1010,8 +1341,8 @@ export const GeneralSettings = () => {
1010
1341
  }
1011
1342
 
1012
1343
  interface AiSettingsSectionProps {
1013
- aiConfig: SolidAiConfig;
1014
- onAiConfigChange: (config: SolidAiConfig) => void;
1344
+ aiConfig: SolidAiConfig;
1345
+ onAiConfigChange: (config: SolidAiConfig) => void;
1015
1346
  }
1016
1347
 
1017
1348
  const DEFAULT_BEHAVIOR: ModelBehavior = { streaming: false, custom: "" };