@elyx-code/editor-ui 0.0.2

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 (452) hide show
  1. package/README.md +2 -0
  2. package/package.json +109 -0
  3. package/src/App.tsx +31 -0
  4. package/src/Router.tsx +115 -0
  5. package/src/__mocks__/defaultModuleMock.ts +1 -0
  6. package/src/__mocks__/fileMock.ts +1 -0
  7. package/src/__mocks__/styleMock.ts +1 -0
  8. package/src/assets/Clock-11.1s-18px.svg +16 -0
  9. package/src/assets/Clock-11.1s-28px.svg +16 -0
  10. package/src/assets/authentication.svg +1 -0
  11. package/src/assets/canvas-backdrop-0.png +0 -0
  12. package/src/assets/canvas-backdrop-1.png +0 -0
  13. package/src/assets/canvas-backdrop-2.png +0 -0
  14. package/src/assets/canvas-backdrop-3.png +0 -0
  15. package/src/assets/canvas-backdrop-4.png +0 -0
  16. package/src/assets/canvas-backdrop-5.png +0 -0
  17. package/src/assets/canvas-backdrop.png +0 -0
  18. package/src/assets/checkmark-animation.gif +0 -0
  19. package/src/assets/checkmark-animation.mp4 +0 -0
  20. package/src/assets/code-formatting/format-black.svg +6 -0
  21. package/src/assets/code-formatting/format-dark-grey.svg +6 -0
  22. package/src/assets/code-formatting/format-light-grey.svg +6 -0
  23. package/src/assets/code-formatting/format-white.svg +6 -0
  24. package/src/assets/code-formatting/inline-black.svg +5 -0
  25. package/src/assets/code-formatting/inline-dark-grey.svg +5 -0
  26. package/src/assets/code-formatting/inline-light-grey.svg +5 -0
  27. package/src/assets/code-formatting/inline-white.svg +5 -0
  28. package/src/assets/contained-logo-full-word.png +0 -0
  29. package/src/assets/cron-job-color.png +0 -0
  30. package/src/assets/cron-job.png +0 -0
  31. package/src/assets/database-table-color.png +0 -0
  32. package/src/assets/database-table.png +0 -0
  33. package/src/assets/datatype-icons/black/any.svg +1 -0
  34. package/src/assets/datatype-icons/black/binary.svg +1 -0
  35. package/src/assets/datatype-icons/black/boolean.svg +3 -0
  36. package/src/assets/datatype-icons/black/date-time.svg +3 -0
  37. package/src/assets/datatype-icons/black/definition-entity.svg +6 -0
  38. package/src/assets/datatype-icons/black/key-file.svg +1 -0
  39. package/src/assets/datatype-icons/black/list.svg +3 -0
  40. package/src/assets/datatype-icons/black/null.svg +3 -0
  41. package/src/assets/datatype-icons/black/number.svg +13 -0
  42. package/src/assets/datatype-icons/black/project.svg +12 -0
  43. package/src/assets/datatype-icons/black/sql-program.svg +2 -0
  44. package/src/assets/datatype-icons/black/text.svg +3 -0
  45. package/src/assets/datatype-icons/black/unknown.svg +3 -0
  46. package/src/assets/datatype-icons/black/uuid.svg +4 -0
  47. package/src/assets/datatype-icons/black/void.svg +1 -0
  48. package/src/assets/datatype-icons/dark-grey/any.svg +1 -0
  49. package/src/assets/datatype-icons/dark-grey/boolean.svg +3 -0
  50. package/src/assets/datatype-icons/dark-grey/date-time.svg +3 -0
  51. package/src/assets/datatype-icons/dark-grey/definition-entity.svg +6 -0
  52. package/src/assets/datatype-icons/dark-grey/list.svg +3 -0
  53. package/src/assets/datatype-icons/dark-grey/null.svg +3 -0
  54. package/src/assets/datatype-icons/dark-grey/number.svg +13 -0
  55. package/src/assets/datatype-icons/dark-grey/project.svg +12 -0
  56. package/src/assets/datatype-icons/dark-grey/sql-program.svg +2 -0
  57. package/src/assets/datatype-icons/dark-grey/text.svg +3 -0
  58. package/src/assets/datatype-icons/dark-grey/unknown.svg +3 -0
  59. package/src/assets/datatype-icons/dark-grey/uuid.svg +4 -0
  60. package/src/assets/datatype-icons/dark-grey/void.svg +1 -0
  61. package/src/assets/datatype-icons/light-grey/any.svg +1 -0
  62. package/src/assets/datatype-icons/light-grey/boolean.svg +3 -0
  63. package/src/assets/datatype-icons/light-grey/date-time.svg +3 -0
  64. package/src/assets/datatype-icons/light-grey/definition-entity.svg +6 -0
  65. package/src/assets/datatype-icons/light-grey/list.svg +3 -0
  66. package/src/assets/datatype-icons/light-grey/null.svg +3 -0
  67. package/src/assets/datatype-icons/light-grey/number.svg +13 -0
  68. package/src/assets/datatype-icons/light-grey/project.svg +12 -0
  69. package/src/assets/datatype-icons/light-grey/sql-program.svg +2 -0
  70. package/src/assets/datatype-icons/light-grey/text.svg +3 -0
  71. package/src/assets/datatype-icons/light-grey/unknown.svg +3 -0
  72. package/src/assets/datatype-icons/light-grey/uuid.svg +4 -0
  73. package/src/assets/datatype-icons/light-grey/void.svg +1 -0
  74. package/src/assets/edit.png +0 -0
  75. package/src/assets/execution.svg +13 -0
  76. package/src/assets/favicon.svg +14 -0
  77. package/src/assets/file-search.svg +1 -0
  78. package/src/assets/http-endpoint.png +0 -0
  79. package/src/assets/image-input-placeholder.png +0 -0
  80. package/src/assets/logo-full-word-white.png +0 -0
  81. package/src/assets/logo-full-word.png +0 -0
  82. package/src/assets/password.svg +85 -0
  83. package/src/assets/pencil.png +0 -0
  84. package/src/assets/publish-project-rich-icon-2.svg +1 -0
  85. package/src/assets/publish-project-rich-icon.svg +1 -0
  86. package/src/assets/relational-database.png +0 -0
  87. package/src/assets/resources.svg +3 -0
  88. package/src/assets/resume-icon-14px.png +0 -0
  89. package/src/assets/server.png +0 -0
  90. package/src/assets/small-status/checkmark.svg +4 -0
  91. package/src/assets/small-status/error.svg +4 -0
  92. package/src/assets/small-status/loading.svg +4 -0
  93. package/src/assets/small-status/skipped.svg +11 -0
  94. package/src/assets/sql-connection-config.svg +1 -0
  95. package/src/assets/sql-row-transformer.svg +1 -0
  96. package/src/assets/ssl-certificate-config.svg +1 -0
  97. package/src/assets/sync.svg +1 -0
  98. package/src/assets/testing-logic-icon.svg +1 -0
  99. package/src/assets/versions.svg +25 -0
  100. package/src/assets/visual-programming-icon.svg +1 -0
  101. package/src/assets/warning-sign-24px.png +0 -0
  102. package/src/auth/index.ts +318 -0
  103. package/src/components/DialogLoader.tsx +94 -0
  104. package/src/components/EntityDialogHeader.tsx +110 -0
  105. package/src/components/EntityDialogSectionHeader.tsx +214 -0
  106. package/src/components/GalleryAddExternalIntegrationInfoDialog.tsx +87 -0
  107. package/src/components/GenerateProjectStartingLogicPromptDialog.tsx +281 -0
  108. package/src/components/LegacyRouteRedirector.tsx +55 -0
  109. package/src/components/ProPlanChip.tsx +23 -0
  110. package/src/components/ReportBugDialog.tsx +412 -0
  111. package/src/components/RequestIntegrationAccessDialog.tsx +261 -0
  112. package/src/components/UseTemplateProjectDialog.tsx +193 -0
  113. package/src/components/WorkspaceLayout.tsx +152 -0
  114. package/src/components/animated-svg/AnimatedCheckmark.tsx +41 -0
  115. package/src/components/animated-svg/AnimatedCrossmark.tsx +51 -0
  116. package/src/components/animated-svg/AnimatedEmailSending.tsx +38 -0
  117. package/src/components/animated-svg/AnimatedLoading.tsx +72 -0
  118. package/src/components/animated-svg/animated-svg.css +239 -0
  119. package/src/components/canvas/Canvas.tsx +16 -0
  120. package/src/components/canvas/CreateEntityMenu.tsx +2020 -0
  121. package/src/components/canvas/canvas.css +10 -0
  122. package/src/components/canvas/create-entity-menu.css +579 -0
  123. package/src/components/canvas-search/CanvasSearch.tsx +501 -0
  124. package/src/components/canvas-search/canvas-search.css +126 -0
  125. package/src/components/canvas-settings-menu/CanvasSettingsMenuButton.tsx +515 -0
  126. package/src/components/canvas-settings-menu/canvas-settings-menu.css +96 -0
  127. package/src/components/circular-image-upload/CircularImageUpload.tsx +113 -0
  128. package/src/components/circular-image-upload/circular-image-upload.css +69 -0
  129. package/src/components/costs/CostsDialog.tsx +459 -0
  130. package/src/components/data-type/DataTypeBuilder.tsx +3127 -0
  131. package/src/components/data-type/data-type-builder.css +45 -0
  132. package/src/components/dialogs/BetaAcknowledgeDialog.tsx +43 -0
  133. package/src/components/dialogs/ComplexDataDialog.tsx +458 -0
  134. package/src/components/dialogs/CronBuilderDialog.tsx +2145 -0
  135. package/src/components/dialogs/ExternalIntegrationConnections.tsx +565 -0
  136. package/src/components/dialogs/JsonEditorDialog.tsx +1392 -0
  137. package/src/components/dialogs/StringEditorDialog.tsx +268 -0
  138. package/src/components/dialogs/argument-declaration/ArgumentDeclaration.tsx +1167 -0
  139. package/src/components/dialogs/argument-declaration/ArgumentDeclarationDialogContent.tsx +128 -0
  140. package/src/components/dialogs/beta-dialog.css +165 -0
  141. package/src/components/dialogs/condition/Condition.tsx +431 -0
  142. package/src/components/dialogs/condition/ConditionDialogContent.tsx +126 -0
  143. package/src/components/dialogs/definition-entity/DefinitionEntityDialogContent.tsx +973 -0
  144. package/src/components/dialogs/function-call/FunctionCall.tsx +442 -0
  145. package/src/components/dialogs/function-call/FunctionCallDialogContent.tsx +126 -0
  146. package/src/components/dialogs/function-declaration/FunctionDeclaration.tsx +926 -0
  147. package/src/components/dialogs/function-declaration/FunctionDeclarationDialogContent.tsx +124 -0
  148. package/src/components/dialogs/generating-project-starting-logic-overlay/GeneratingProjectStartingLogicOverlay.tsx +176 -0
  149. package/src/components/dialogs/generating-project-starting-logic-overlay/generating-project-starting-logic-overlay.css +13 -0
  150. package/src/components/dialogs/global-event/GlobalEvent.tsx +475 -0
  151. package/src/components/dialogs/global-event/GlobalEventDialogContent.tsx +126 -0
  152. package/src/components/dialogs/help/HelpDialog.tsx +217 -0
  153. package/src/components/dialogs/help/HelpDilalogHomeContent.tsx +178 -0
  154. package/src/components/dialogs/help/help-dialog.css +116 -0
  155. package/src/components/dialogs/help/help-icon/HelpIconButton.tsx +41 -0
  156. package/src/components/dialogs/help/help-icon/help-icon.css +9 -0
  157. package/src/components/dialogs/input-map/InputMap.tsx +635 -0
  158. package/src/components/dialogs/input-map/InputMapDialogContent.tsx +126 -0
  159. package/src/components/dialogs/json-editor-dialog.css +4 -0
  160. package/src/components/dialogs/loop/Loop.tsx +650 -0
  161. package/src/components/dialogs/loop/LoopDialogContent.tsx +122 -0
  162. package/src/components/dialogs/operation/Operation.tsx +440 -0
  163. package/src/components/dialogs/operation/OperationDialogContent.tsx +126 -0
  164. package/src/components/dialogs/output-map/OutputMap.tsx +536 -0
  165. package/src/components/dialogs/output-map/OutputMapDialogContent.tsx +126 -0
  166. package/src/components/dialogs/property/Property.tsx +1490 -0
  167. package/src/components/dialogs/property/PropertyDialogContent.tsx +106 -0
  168. package/src/components/dialogs/search-statement/ColumnSelector.tsx +334 -0
  169. package/src/components/dialogs/search-statement/ConditionBuilder.tsx +750 -0
  170. package/src/components/dialogs/search-statement/DataAggregationSection.tsx +621 -0
  171. package/src/components/dialogs/search-statement/DataSourceSelection.tsx +734 -0
  172. package/src/components/dialogs/search-statement/EntityMetadataSection.tsx +135 -0
  173. package/src/components/dialogs/search-statement/FilterConditionsSection.tsx +151 -0
  174. package/src/components/dialogs/search-statement/InlineInputMap.tsx +153 -0
  175. package/src/components/dialogs/search-statement/LiteralValue.tsx +616 -0
  176. package/src/components/dialogs/search-statement/MainSourceAndInputsSection.tsx +271 -0
  177. package/src/components/dialogs/search-statement/NestedSearchStatementBuilder.tsx +170 -0
  178. package/src/components/dialogs/search-statement/OutputFormatSection.tsx +1779 -0
  179. package/src/components/dialogs/search-statement/ResultsSection.tsx +344 -0
  180. package/src/components/dialogs/search-statement/SearchStatementBuilder.tsx +251 -0
  181. package/src/components/dialogs/search-statement/SearchStatementDialogContent.tsx +398 -0
  182. package/src/components/dialogs/search-statement/ValueSelector.tsx +766 -0
  183. package/src/components/dialogs/search-statement/search-statement-context.tsx +1630 -0
  184. package/src/components/dialogs/search-statement/search-statement-dialog.css +56 -0
  185. package/src/components/dialogs/search-statement/test.sql +111 -0
  186. package/src/components/dialogs/value-descriptor/ValueDescriptor.tsx +824 -0
  187. package/src/components/dialogs/value-descriptor/ValueDescriptorDialogContent.tsx +124 -0
  188. package/src/components/dialogs/variable-declaration/VariableDeclaration.tsx +836 -0
  189. package/src/components/dialogs/variable-declaration/VariableDeclarationDialogContent.tsx +106 -0
  190. package/src/components/dialogs/variable-instance/VariableInstance.tsx +443 -0
  191. package/src/components/dialogs/variable-instance/VariableInstanceDialogContent.tsx +124 -0
  192. package/src/components/draggable-entity-card/ArgumentDeclaration.tsx +736 -0
  193. package/src/components/draggable-entity-card/CollapseEntityButton.tsx +170 -0
  194. package/src/components/draggable-entity-card/ConditionCard.tsx +1062 -0
  195. package/src/components/draggable-entity-card/ConnectionDeleteButton.tsx +309 -0
  196. package/src/components/draggable-entity-card/DataTypeIcon.tsx +624 -0
  197. package/src/components/draggable-entity-card/DraggableEntityCard.tsx +617 -0
  198. package/src/components/draggable-entity-card/ErrorMapProperty.tsx +464 -0
  199. package/src/components/draggable-entity-card/EventCard.tsx +700 -0
  200. package/src/components/draggable-entity-card/ExecutionInProgressValue.tsx +327 -0
  201. package/src/components/draggable-entity-card/FunctionDeclarationCard.tsx +819 -0
  202. package/src/components/draggable-entity-card/InputMapProperty.tsx +1067 -0
  203. package/src/components/draggable-entity-card/InternalCall.tsx +978 -0
  204. package/src/components/draggable-entity-card/InternalCallExecutionNode.tsx +643 -0
  205. package/src/components/draggable-entity-card/LogicScopeCallerNode.tsx +262 -0
  206. package/src/components/draggable-entity-card/LoopCard.tsx +791 -0
  207. package/src/components/draggable-entity-card/MainValueInput.tsx +523 -0
  208. package/src/components/draggable-entity-card/MainValueOutput.tsx +458 -0
  209. package/src/components/draggable-entity-card/MethodDeclaration.tsx +1088 -0
  210. package/src/components/draggable-entity-card/NestedCondition.tsx +1025 -0
  211. package/src/components/draggable-entity-card/OutputMapProperty.tsx +843 -0
  212. package/src/components/draggable-entity-card/PassthroughEntityCard.tsx +1247 -0
  213. package/src/components/draggable-entity-card/ReturnedError.tsx +549 -0
  214. package/src/components/draggable-entity-card/SmallSuccessFailureNodes.tsx +523 -0
  215. package/src/components/draggable-entity-card/SuccessFailureNodes.tsx +509 -0
  216. package/src/components/draggable-entity-card/TestEntityButton.tsx +946 -0
  217. package/src/components/draggable-entity-card/TestMenu.tsx +523 -0
  218. package/src/components/draggable-entity-card/TestMenuValidationDropdown.tsx +84 -0
  219. package/src/components/draggable-entity-card/UnreachableMarker.tsx +114 -0
  220. package/src/components/draggable-entity-card/VariableCard.tsx +1577 -0
  221. package/src/components/draggable-entity-card/VariableScopeMarker.tsx +117 -0
  222. package/src/components/draggable-entity-card/collapse-entity-button.css +44 -0
  223. package/src/components/draggable-entity-card/definition-entity/DefinitionEntityCard.tsx +1181 -0
  224. package/src/components/draggable-entity-card/definition-entity/DefinitionEntityIcon.tsx +36 -0
  225. package/src/components/draggable-entity-card/definition-entity/DefinitionEntityProperty.tsx +478 -0
  226. package/src/components/draggable-entity-card/definition-entity/DynamicFooterActions.tsx +112 -0
  227. package/src/components/draggable-entity-card/definition-entity/actions/external-integration-connection/ExportCredentialsFooterAction.tsx +461 -0
  228. package/src/components/draggable-entity-card/definition-entity/actions/external-integration-connection/RestablishConnectionFooterAction.tsx +199 -0
  229. package/src/components/draggable-entity-card/definition-entity/actions/external-integration-connection/restablish-connection-footer-action.css +85 -0
  230. package/src/components/draggable-entity-card/definition-entity/actions/google-drive/GoogleDriveFilePickerAPIFooterAction.tsx +277 -0
  231. package/src/components/draggable-entity-card/definition-entity/actions/google-drive/google-drive-file-picker-api-footer-action.css +107 -0
  232. package/src/components/draggable-entity-card/definition-entity/actions/persisted-entity/DatabaseFooterAction.tsx +452 -0
  233. package/src/components/draggable-entity-card/definition-entity/actions/persisted-entity/database-footer-action.css +86 -0
  234. package/src/components/draggable-entity-card/definition-entity/definition-entity-card.css +17 -0
  235. package/src/components/draggable-entity-card/draggable-entity-card.css +1140 -0
  236. package/src/components/draggable-entity-card/entity-locked-icon/EntityLockedIcon.tsx +133 -0
  237. package/src/components/draggable-entity-card/entity-locked-icon/entity-locked.css +8 -0
  238. package/src/components/draggable-entity-card/expand-properties-icon-button/ExpandPropertiesIconButton.tsx +84 -0
  239. package/src/components/draggable-entity-card/expand-properties-icon-button/expand-properties-icon-button.css +21 -0
  240. package/src/components/draggable-entity-card/implement-entity-icon/ImplementEntityIcon.tsx +74 -0
  241. package/src/components/draggable-entity-card/implement-entity-icon/implement-entity-icon.css +13 -0
  242. package/src/components/draggable-entity-card/logic-error/LogicErrorIconMenu.tsx +424 -0
  243. package/src/components/draggable-entity-card/logic-error/logic-error.css +23 -0
  244. package/src/components/draggable-entity-card/new-card-input-button/NewCardInputButton.tsx +193 -0
  245. package/src/components/draggable-entity-card/new-card-input-button/NewDynamicInputButton.tsx +214 -0
  246. package/src/components/draggable-entity-card/new-card-input-button/new-card-input-button.css +71 -0
  247. package/src/components/draggable-entity-card/new-card-output-button/NewCardOutputButton.tsx +192 -0
  248. package/src/components/draggable-entity-card/new-card-output-button/new-card-output-button.css +71 -0
  249. package/src/components/draggable-entity-card/termination-statement/TerminationStatementCard.tsx +1543 -0
  250. package/src/components/draggable-entity-card/termination-statement/termination-statement-card.css +17 -0
  251. package/src/components/draggable-entity-card/test-entity-button.css +55 -0
  252. package/src/components/draggable-entity-card/test-menu.css +181 -0
  253. package/src/components/draggable-entity-card/unreachable-marker.css +43 -0
  254. package/src/components/draggable-entity-card/variable-scope-marker.css +22 -0
  255. package/src/components/dynamic-value/DynamicValue.tsx +2395 -0
  256. package/src/components/dynamic-value/DynamicValueEntry.tsx +1957 -0
  257. package/src/components/dynamic-value/dynamic-value.css +230 -0
  258. package/src/components/editor/ElyxMonacoEditor.tsx +38 -0
  259. package/src/components/entity-error/EntityErrorListItem.tsx +47 -0
  260. package/src/components/entity-error/entity-error.css +198 -0
  261. package/src/components/entity-icon/EntityIcon.tsx +292 -0
  262. package/src/components/entity-icon/entity-icon.css +39 -0
  263. package/src/components/gallery-card/CreateNewProject.tsx +222 -0
  264. package/src/components/gallery-card/GalleryCard.tsx +171 -0
  265. package/src/components/gallery-card/MarketplaceCard.tsx +87 -0
  266. package/src/components/gallery-card/ProjectDuplicationCard.tsx +575 -0
  267. package/src/components/gallery-card/gallery-card.css +25 -0
  268. package/src/components/notifications/NotificationsIconButton.tsx +124 -0
  269. package/src/components/notifications/NotificationsPanel.tsx +385 -0
  270. package/src/components/notifications/notifications.css +189 -0
  271. package/src/components/online-users/LocalOnlineUsers.tsx +175 -0
  272. package/src/components/online-users/PageOnlineUsers.tsx +297 -0
  273. package/src/components/online-users/online-users.css +72 -0
  274. package/src/components/page-backdrop/PageBackdrop.tsx +8 -0
  275. package/src/components/page-backdrop/page-backdrop.css +7 -0
  276. package/src/components/project-configuration/DeleteProjectConfirmationDialog.tsx +134 -0
  277. package/src/components/project-configuration/ProjectConfigurationDialog.tsx +972 -0
  278. package/src/components/project-configuration/ProjectDataForm.tsx +121 -0
  279. package/src/components/project-configuration/UnpublishProjectConfirmationDialog.tsx +162 -0
  280. package/src/components/project-configuration/project-configuration-content.css +209 -0
  281. package/src/components/project-name/ProjectName.tsx +2025 -0
  282. package/src/components/project-name/project-name.css +599 -0
  283. package/src/components/publishing/Publication.tsx +133 -0
  284. package/src/components/publishing/history/PublicationHistoryContent.tsx +414 -0
  285. package/src/components/publishing/history/PublicationHistoryDialog.tsx +234 -0
  286. package/src/components/publishing/preview/PublicationPreviewDialog.tsx +1158 -0
  287. package/src/components/publishing/preview/PublishingPriceForecast.tsx +160 -0
  288. package/src/components/publishing/preview/PublishingResourcesDetails.tsx +91 -0
  289. package/src/components/publishing/publication-sequence/PublishingSequenceContent.tsx +375 -0
  290. package/src/components/publishing/publication-sequence/PublishingSequenceDialog.tsx +344 -0
  291. package/src/components/publishing/publishing-dialog.css +142 -0
  292. package/src/components/publishing/utils.ts +227 -0
  293. package/src/components/resources/ResourcesDialog.tsx +591 -0
  294. package/src/components/resources/UpgradeBanner.tsx +102 -0
  295. package/src/components/resources/codebase/CodebaseDetails.tsx +156 -0
  296. package/src/components/resources/cron-job/CronJobsList.tsx +532 -0
  297. package/src/components/resources/functions/FunctionsList.tsx +454 -0
  298. package/src/components/resources/http-api/HttpAPI.tsx +566 -0
  299. package/src/components/resources/http-api/HttpAPIClientModule.tsx +37 -0
  300. package/src/components/resources/logs/LogsViewer.tsx +768 -0
  301. package/src/components/resources/query.ts +74 -0
  302. package/src/components/resources/relational-database/DatabaseTable.tsx +905 -0
  303. package/src/components/resources/relational-database/RelationalDatabase.tsx +83 -0
  304. package/src/components/resources/relational-database/RelationalDatabaseSecrets.tsx +361 -0
  305. package/src/components/resources/resources-dialog.css +74 -0
  306. package/src/components/test-relational-database/DatabaseTable.tsx +913 -0
  307. package/src/components/test-relational-database/TestDatabaseDialogContent.tsx +670 -0
  308. package/src/components/test-relational-database/query.ts +74 -0
  309. package/src/components/toolbar/ToolBar.tsx +236 -0
  310. package/src/components/toolbar/toolbar.css +78 -0
  311. package/src/components/transaction-history/TransactionHistoryDialog.tsx +268 -0
  312. package/src/components/user/CurrentUserAvatar.tsx +65 -0
  313. package/src/components/user/UserChip.tsx +62 -0
  314. package/src/components/user/user.css +39 -0
  315. package/src/components/user-profile/ChangePasswordForm.tsx +67 -0
  316. package/src/components/user-profile/OwnUserProfileContent.tsx +665 -0
  317. package/src/components/user-profile/PublicUserProfileContent.tsx +99 -0
  318. package/src/components/user-profile/UserDataForm.tsx +75 -0
  319. package/src/components/user-profile/UserProfileDialog.tsx +110 -0
  320. package/src/components/user-profile/user-profile-content.css +25 -0
  321. package/src/config.ts +130 -0
  322. package/src/globals.d.ts +13 -0
  323. package/src/index.html +27 -0
  324. package/src/index.tsx +23 -0
  325. package/src/lib/badge/Badge.tsx +35 -0
  326. package/src/lib/badge/badge.css +32 -0
  327. package/src/lib/button/Button.tsx +129 -0
  328. package/src/lib/button/button.css +145 -0
  329. package/src/lib/canvas/canvas-undo-redo.ts +263 -0
  330. package/src/lib/canvas/defs.ts +170 -0
  331. package/src/lib/canvas/index.test.ts +189 -0
  332. package/src/lib/canvas/index.ts +6999 -0
  333. package/src/lib/canvas/utils.ts +59 -0
  334. package/src/lib/card/Card.tsx +62 -0
  335. package/src/lib/card/LoadingCard.tsx +82 -0
  336. package/src/lib/card/card.css +259 -0
  337. package/src/lib/chip/Chip.tsx +79 -0
  338. package/src/lib/chip/chip.css +0 -0
  339. package/src/lib/dialog/Dialog.tsx +122 -0
  340. package/src/lib/dialog/SmallDialog.tsx +61 -0
  341. package/src/lib/dialog/dialog.css +40 -0
  342. package/src/lib/display-data-structure/index.tsx +21 -0
  343. package/src/lib/dropdown/CanvasDropdownMenuCard.tsx +68 -0
  344. package/src/lib/dropdown/CanvasDropdownMenuCardOption.tsx +136 -0
  345. package/src/lib/dropdown/DropdownButton.tsx +104 -0
  346. package/src/lib/dropdown/DropdownMenuCard.tsx +324 -0
  347. package/src/lib/dropdown/DropdownMenuPopup.tsx +27 -0
  348. package/src/lib/dropdown/dropdown-button.css +76 -0
  349. package/src/lib/dropdown/dropdown-menu.css +151 -0
  350. package/src/lib/json-editor/RawJsonEditor.tsx +137 -0
  351. package/src/lib/json-editor/json-editor.css +35 -0
  352. package/src/lib/loader/Loader.tsx +120 -0
  353. package/src/lib/loader/loader.css +38 -0
  354. package/src/lib/pagination/Pagination.tsx +64 -0
  355. package/src/lib/popup/CanvasPopupBaseComponent.tsx +103 -0
  356. package/src/lib/popup/Popup.tsx +243 -0
  357. package/src/lib/popup/popup.css +16 -0
  358. package/src/lib/table/RowForm.tsx +301 -0
  359. package/src/lib/table/Table.tsx +1069 -0
  360. package/src/lib/table/table.css +249 -0
  361. package/src/lib/table/types.ts +108 -0
  362. package/src/lib/text-area/TextArea.tsx +183 -0
  363. package/src/lib/text-area/text-area.css +156 -0
  364. package/src/lib/text-field/TextField.tsx +218 -0
  365. package/src/lib/text-field/index.ts +8 -0
  366. package/src/lib/text-field/text-field.css +201 -0
  367. package/src/lib/tooltip/Tooltip.tsx +24 -0
  368. package/src/lib/tooltip/tooltip.css +17 -0
  369. package/src/localization/index.ts +47 -0
  370. package/src/main.css +343 -0
  371. package/src/pages/Auth.tsx +848 -0
  372. package/src/pages/Editor.tsx +883 -0
  373. package/src/pages/ErrorPage.tsx +179 -0
  374. package/src/pages/Gallery.tsx +1693 -0
  375. package/src/pages/NewPaymentMethodCallback.tsx +53 -0
  376. package/src/pages/NotFoundPage.tsx +126 -0
  377. package/src/pages/PricingPlans.tsx +155 -0
  378. package/src/pages/auth.css +304 -0
  379. package/src/pages/gallery.css +421 -0
  380. package/src/payments/index.ts +187 -0
  381. package/src/popup-notification/index.ts +90 -0
  382. package/src/services/database/index.ts +1 -0
  383. package/src/services/database/utils.ts +1301 -0
  384. package/src/services/editor/CanvasElement.tsx +2934 -0
  385. package/src/services/editor/CanvasElementConnectionDeleteButton.ts +204 -0
  386. package/src/services/editor/CanvasPopup.tsx +749 -0
  387. package/src/services/editor/EditorService.ts +8157 -0
  388. package/src/services/editor/area.ts +1312 -0
  389. package/src/services/editor/connections.ts +1019 -0
  390. package/src/services/editor/create/condition.ts +25 -0
  391. package/src/services/editor/create/definition-entity.ts +29 -0
  392. package/src/services/editor/create/function-call.ts +25 -0
  393. package/src/services/editor/create/global-event.ts +33 -0
  394. package/src/services/editor/create/loop.ts +25 -0
  395. package/src/services/editor/create/operation.ts +30 -0
  396. package/src/services/editor/create/utils.ts +140 -0
  397. package/src/services/editor/create/variable-declaration.ts +135 -0
  398. package/src/services/editor/create/variable-instance.ts +100 -0
  399. package/src/services/editor/editor-ui-extensions-context.ts +43 -0
  400. package/src/services/editor/entities-metadata.json +9310 -0
  401. package/src/services/editor/icons.ts +1093 -0
  402. package/src/services/editor/index.ts +1 -0
  403. package/src/services/editor/layout.ts +102 -0
  404. package/src/services/editor/modules/built-in-function-implementations/base.ts +14 -0
  405. package/src/services/editor/modules/built-in-function-implementations/create-persisted-entity/index.ts +56 -0
  406. package/src/services/editor/modules/built-in-function-implementations/delete-persisted-entity/index.ts +55 -0
  407. package/src/services/editor/modules/built-in-function-implementations/index.ts +4 -0
  408. package/src/services/editor/modules/built-in-function-implementations/update-persisted-entity/index.ts +56 -0
  409. package/src/services/editor/modules/operations-implementations/external-integrations/google-drive/get-files.ts +183 -0
  410. package/src/services/editor/modules/operations-implementations/external-integrations/google-drive/list-drives.ts +124 -0
  411. package/src/services/editor/modules/operations-implementations/external-integrations/google-drive/list-root-folders.ts +125 -0
  412. package/src/services/editor/modules/operations-implementations/external-integrations/google-drive/smart-fetch-document.ts +702 -0
  413. package/src/services/editor/modules/operations-implementations/external-integrations/google-drive/upload-document.ts +535 -0
  414. package/src/services/editor/modules/operations-implementations/external-integrations/google-gemini/generate-content.ts +193 -0
  415. package/src/services/editor/modules/operations-implementations/external-integrations/google-mail/get-emails.ts +586 -0
  416. package/src/services/editor/modules/operations-implementations/external-integrations/google-mail/send-email.ts +386 -0
  417. package/src/services/editor/modules/operations-implementations/external-integrations/index.ts +12 -0
  418. package/src/services/editor/modules/operations-implementations/external-integrations/slack/channels.ts +240 -0
  419. package/src/services/editor/modules/operations-implementations/external-integrations/slack/messages.ts +210 -0
  420. package/src/services/editor/modules/operations-implementations/external-integrations/slack/replies.ts +200 -0
  421. package/src/services/editor/modules/operations-implementations/external-integrations/slack/send-message.ts +177 -0
  422. package/src/services/editor/modules/operations-implementations/index.ts +1 -0
  423. package/src/services/editor/modules/search-node-implementation/index.ts +42 -0
  424. package/src/services/editor/modules/sql-migrations-generation.tsx +1054 -0
  425. package/src/services/editor/publication/publication.ts +578 -0
  426. package/src/services/editor/ui.ts +1348 -0
  427. package/src/services/editor/utils.ts +5868 -0
  428. package/src/services/editor/value-store.ts +619 -0
  429. package/src/services/execution/built-in-function-implementations.ts +422 -0
  430. package/src/services/execution/index.ts +4747 -0
  431. package/src/services/execution/logic.ts +121 -0
  432. package/src/services/execution/test-instance.tsx +2296 -0
  433. package/src/services/execution/utils.ts +33 -0
  434. package/src/services/execution/value-resolution.test.ts +424 -0
  435. package/src/services/execution/value-resolution.ts +4087 -0
  436. package/src/services/integrations/ExternalIntegrationsService.ts +439 -0
  437. package/src/services/integrations/api.ts +175 -0
  438. package/src/services/local-relational-database/idb_helper.ts +66 -0
  439. package/src/services/local-relational-database/index.ts +3308 -0
  440. package/src/services/local-relational-database/utils.ts +403 -0
  441. package/src/services/notifications/index.ts +525 -0
  442. package/src/services/user/index.ts +144 -0
  443. package/src/setupTests.ts +1 -0
  444. package/src/socket/socket.ts +248 -0
  445. package/src/socket/utils.ts +10 -0
  446. package/src/store/workspace.ts +12 -0
  447. package/src/theme.ts +19 -0
  448. package/src/utils/DOM.ts +39 -0
  449. package/src/utils/date.ts +169 -0
  450. package/src/utils/index.ts +158 -0
  451. package/src/utils/react.tsx +679 -0
  452. package/src/utils/testing.ts +103 -0
@@ -0,0 +1,848 @@
1
+ import React, { useState, useEffect, useCallback, useRef } from 'react';
2
+ import { useNavigate, useParams, useLocation } from 'react-router-dom';
3
+ import './auth.css';
4
+ import {
5
+ confirmSignUp,
6
+ // createGoogleSocialSignInButtons,
7
+ forgotPassword,
8
+ forgotPasswordSubmit,
9
+ getCurrentSession,
10
+ // initGoogleSocialSignIn,
11
+ resendConfirmationCode,
12
+ signIn,
13
+ signUp,
14
+ } from '../auth';
15
+ import AnimatedEmailSending from '../components/animated-svg/AnimatedEmailSending';
16
+ import AnimatedLoading from '../components/animated-svg/AnimatedLoading';
17
+ import AnimatedCheckmark from '../components/animated-svg/AnimatedCheckmark';
18
+ import AnimatedCrossmark from '../components/animated-svg/AnimatedCrossmark';
19
+ import Logo from '../assets/logo-full-word.png';
20
+
21
+ // MUI Imports for the password toggle
22
+ import IconButton from '@mui/material/IconButton';
23
+ import Visibility from '@mui/icons-material/Visibility';
24
+ import VisibilityOff from '@mui/icons-material/VisibilityOff';
25
+
26
+ enum CONTENT_TYPE {
27
+ SIGN_IN = 'sign-in',
28
+ SIGN_UP = 'sign-up',
29
+ CONFIRMATION_EMAIL_SENT = 'confirmation-email-sent',
30
+ FORGOT_PASSWORD = 'forgot-password',
31
+ EMAIL_CONFIRMATION = 'email-confirmation',
32
+ PASSWORD_RESET = 'password-reset',
33
+ PASSWORD_RESET_EMAIL_SENT = 'password-reset-email-sent',
34
+ }
35
+
36
+ // Since the initial value is true, it means that the first content is on the left
37
+ let nextContentIsLeft = true;
38
+ let nextContentToRender: CONTENT_TYPE;
39
+
40
+ const sanitizeErrorMessage = (error: { message: string }): string => {
41
+ let resolvedErrorMessage = error.message;
42
+ resolvedErrorMessage = resolvedErrorMessage.replace(
43
+ 'Password did not conform with policy: ',
44
+ '',
45
+ );
46
+ resolvedErrorMessage = resolvedErrorMessage.replace(
47
+ 'Username',
48
+ 'Email address',
49
+ );
50
+ resolvedErrorMessage = resolvedErrorMessage.replace(
51
+ 'username',
52
+ 'email address',
53
+ );
54
+ return resolvedErrorMessage;
55
+ };
56
+
57
+ const Auth: React.FC = () => {
58
+ const [emailConfirmationSuccess, setEmailConfirmationSuccess] = useState<
59
+ null | object
60
+ >(null);
61
+ const [emailConfirmationError, setEmailConfirmationError] = useState<
62
+ null | object
63
+ >(null);
64
+ const [activeContent, setActiveContent] = useState<CONTENT_TYPE>(
65
+ CONTENT_TYPE.SIGN_UP,
66
+ );
67
+
68
+ // New state for toggling password visibility
69
+ const [showPassword, setShowPassword] = useState(false);
70
+
71
+ const rootElementRef = useRef<HTMLDivElement>(null);
72
+ const navigate = useNavigate();
73
+ const { action } = useParams<{ action: string }>();
74
+ const location = useLocation();
75
+
76
+ // Extract the target redirect URL, defaulting to '/gallery'
77
+ const redirectTo =
78
+ new URLSearchParams(location.search).get('redirectTo') || '/gallery';
79
+
80
+ // While we're verifying whether the user already has a session, we keep
81
+ // the form unmounted to avoid a flash of the sign-in UI before the
82
+ // redirect kicks in. Set to `true` once we've confirmed the user is NOT
83
+ // signed in (or once we've decided we shouldn't redirect anyway).
84
+ const [sessionCheckComplete, setSessionCheckComplete] = useState(false);
85
+
86
+ // Email-confirmation and password-reset are the two flows a signed-in
87
+ // user might legitimately need to complete (the link comes from email,
88
+ // they may already have an active session on this device, etc.). For
89
+ // everything else — sign-in, sign-up, forgot-password, the "email sent"
90
+ // confirmation screens — being on /auth/* while authenticated is
91
+ // pointless, so we bounce to `redirectTo` (or /gallery by default).
92
+ const SHOULD_NEVER_AUTO_REDIRECT_ACTIONS: string[] = [
93
+ CONTENT_TYPE.EMAIL_CONFIRMATION,
94
+ CONTENT_TYPE.PASSWORD_RESET,
95
+ ];
96
+
97
+ useEffect(() => {
98
+ let cancelled = false;
99
+
100
+ const checkExistingSession = async () => {
101
+ // Don't bounce flows that legitimately need to run while signed in
102
+ // (clicking an email-confirmation or password-reset link from a
103
+ // device that already has an active session).
104
+ if (action && SHOULD_NEVER_AUTO_REDIRECT_ACTIONS.includes(action)) {
105
+ if (!cancelled) setSessionCheckComplete(true);
106
+ return;
107
+ }
108
+
109
+ const currentUser = await getCurrentSession();
110
+
111
+ if (cancelled) return;
112
+
113
+ if (currentUser) {
114
+ // `replace: true` so the back button doesn't drop the user
115
+ // back onto /auth/* — they didn't mean to be there.
116
+ navigate(redirectTo, { replace: true });
117
+ return;
118
+ }
119
+
120
+ setSessionCheckComplete(true);
121
+ };
122
+
123
+ checkExistingSession();
124
+
125
+ return () => {
126
+ cancelled = true;
127
+ };
128
+ // `redirectTo` is derived from `location.search`, so depending on it
129
+ // also covers the case where the user arrives with a different
130
+ // `?redirectTo=...` while the component is still mounted.
131
+ }, [action, redirectTo, navigate]);
132
+
133
+ const handleURLParams = useCallback(async () => {
134
+ const searchParams = new URLSearchParams(location.search);
135
+ const code = searchParams.get('code');
136
+ const email = searchParams.get('email');
137
+
138
+ if (!code || !email) {
139
+ const currentUser = await getCurrentSession();
140
+ if (currentUser) {
141
+ navigate('/');
142
+ } else {
143
+ navigate(`/auth/${CONTENT_TYPE.SIGN_UP}`);
144
+ }
145
+ return { code: '', email: '' };
146
+ }
147
+
148
+ return { code, email };
149
+ }, [location.search, navigate]);
150
+
151
+ const submitSignIn = async (event: React.FormEvent<HTMLFormElement>) => {
152
+ event.preventDefault();
153
+ const errorMessageElement = document.getElementById(
154
+ `${CONTENT_TYPE.SIGN_IN}-error`,
155
+ );
156
+ try {
157
+ errorMessageElement!.textContent = ' ';
158
+
159
+ const formData = new FormData(event.currentTarget);
160
+ const email = formData.get('email') as string;
161
+ const password = formData.get('password') as string;
162
+
163
+ await signIn(email, password);
164
+ // Navigate to the requested page or fallback to gallery
165
+ navigate(redirectTo);
166
+ } catch (error) {
167
+ errorMessageElement!.textContent = sanitizeErrorMessage(error as any);
168
+ }
169
+ };
170
+
171
+ const submitForgotPassword = async (
172
+ event: React.FormEvent<HTMLFormElement>,
173
+ ) => {
174
+ event.preventDefault();
175
+ const errorMessageElement = document.getElementById(
176
+ `${CONTENT_TYPE.FORGOT_PASSWORD}-error`,
177
+ );
178
+ try {
179
+ errorMessageElement!.textContent = ' ';
180
+
181
+ const formData = new FormData(event.currentTarget);
182
+ const email = formData.get('email') as string;
183
+
184
+ await forgotPassword(email);
185
+ transition(CONTENT_TYPE.PASSWORD_RESET_EMAIL_SENT);
186
+ } catch (error) {
187
+ errorMessageElement!.textContent = sanitizeErrorMessage(error as any);
188
+ }
189
+ };
190
+
191
+ const submitSignUp = async (event: React.FormEvent<HTMLFormElement>) => {
192
+ event.preventDefault();
193
+ const errorMessageElement = document.getElementById(
194
+ `${CONTENT_TYPE.SIGN_UP}-error`,
195
+ );
196
+ try {
197
+ errorMessageElement!.textContent = ' ';
198
+
199
+ const formData = new FormData(event.currentTarget);
200
+ const email = formData.get('email') as string;
201
+ const password = formData.get('password') as string;
202
+
203
+ await signUp(email, password);
204
+
205
+ const emailElement = document.getElementById('current-email');
206
+ emailElement!.textContent = email;
207
+
208
+ transition(CONTENT_TYPE.CONFIRMATION_EMAIL_SENT);
209
+ } catch (error) {
210
+ errorMessageElement!.textContent = sanitizeErrorMessage(error as any);
211
+ }
212
+ };
213
+
214
+ const submitConfirmationCode = async (email: string, code: string) => {
215
+ try {
216
+ await confirmSignUp(email, code);
217
+ setEmailConfirmationSuccess({ message: 'Email confirmed' });
218
+ } catch (error: any) {
219
+ setEmailConfirmationError(error);
220
+ }
221
+ };
222
+
223
+ const submitNewPassword = async (event: React.FormEvent<HTMLFormElement>) => {
224
+ event.preventDefault();
225
+ const errorMessageElement = document.getElementById(
226
+ `${CONTENT_TYPE.PASSWORD_RESET}-error`,
227
+ );
228
+ try {
229
+ errorMessageElement!.textContent = ' ';
230
+
231
+ const formData = new FormData(event.currentTarget);
232
+ const password = formData.get('password') as string;
233
+
234
+ const { code, email } = await handleURLParams();
235
+ await forgotPasswordSubmit(email, code, password);
236
+
237
+ await signIn(email, password);
238
+ // Navigate to the requested page or fallback to gallery
239
+ navigate(redirectTo);
240
+ } catch (error) {
241
+ errorMessageElement!.textContent = sanitizeErrorMessage(error as any);
242
+
243
+ if ((error as any).__type === 'ExpiredCodeException') {
244
+ document.getElementById('save-new-password')!.style.display = 'none';
245
+ document
246
+ .getElementById('resend-password-recovery')!
247
+ .classList.add('active');
248
+ }
249
+ }
250
+ };
251
+
252
+ const handleResendConfirmationCode = async () => {
253
+ try {
254
+ const { email } = await handleURLParams();
255
+ await resendConfirmationCode(email);
256
+ transition(CONTENT_TYPE.CONFIRMATION_EMAIL_SENT);
257
+ } catch (error) {
258
+ // Handle error
259
+ }
260
+ };
261
+
262
+ const transition = (nextContent: CONTENT_TYPE) => {
263
+ nextContentToRender = nextContent;
264
+ const container = document.getElementById('container');
265
+
266
+ const previousActiveContent = rootElementRef.current.querySelector(
267
+ `.content-container.active-content`,
268
+ );
269
+ const previousActiveOverlay = rootElementRef.current.querySelector(
270
+ `.overlay .overlay-panel.active-content`,
271
+ );
272
+
273
+ // Remove the active-content class from all elements that have it
274
+ if (previousActiveOverlay) {
275
+ previousActiveOverlay.classList.remove(
276
+ 'active-content',
277
+ 'overlay-right',
278
+ 'overlay-left',
279
+ );
280
+ }
281
+ if (previousActiveContent) {
282
+ previousActiveContent.classList.remove(
283
+ 'active-content',
284
+ 'left-content-container',
285
+ 'right-content-container',
286
+ );
287
+ }
288
+
289
+ const nextActiveContent = rootElementRef.current.querySelector(
290
+ `.content-container.${nextContentToRender}`,
291
+ );
292
+ const nextActiveOverlay = rootElementRef.current.querySelector(
293
+ `.overlay .${nextContentToRender}`,
294
+ );
295
+
296
+ const nextContentActiveClass = nextContentIsLeft
297
+ ? 'left-content-container'
298
+ : 'right-content-container';
299
+ const nextOverlayActiveClass = nextContentIsLeft
300
+ ? 'overlay-right'
301
+ : 'overlay-left';
302
+
303
+ if (nextContentIsLeft) {
304
+ container.classList.remove('right-panel-active');
305
+ nextContentIsLeft = false;
306
+ } else {
307
+ container.classList.add('right-panel-active');
308
+ nextContentIsLeft = true;
309
+ }
310
+
311
+ if (nextActiveOverlay) {
312
+ nextActiveOverlay.classList.add('active-content', nextOverlayActiveClass);
313
+ }
314
+ if (nextActiveContent) {
315
+ nextActiveContent.classList.add('active-content', nextContentActiveClass);
316
+ }
317
+
318
+ const manuallyAnimatedElements = rootElementRef.current.querySelectorAll(
319
+ '.animated-svg-container-manual-trigger',
320
+ );
321
+
322
+ manuallyAnimatedElements.forEach((element) => {
323
+ element?.classList.remove('transitioned');
324
+ });
325
+
326
+ setTimeout(() => {
327
+ manuallyAnimatedElements.forEach((element) => {
328
+ element?.classList.add('transitioned');
329
+ });
330
+ }, 600);
331
+
332
+ // Reset password visibility when transitioning screens
333
+ setShowPassword(false);
334
+ };
335
+
336
+ useEffect(() => {
337
+ // Wait for the session check to finish before running any of the
338
+ // per-action initialization — otherwise `handleURLParams` would
339
+ // independently navigate based on its own session check (the
340
+ // `getCurrentSession()` it already does inside) and could race with
341
+ // the redirect we're about to issue above.
342
+ if (!sessionCheckComplete) {
343
+ return;
344
+ }
345
+
346
+ const initialize = async () => {
347
+ // initGoogleSocialSignIn();
348
+
349
+ if (action) {
350
+ if (
351
+ action === CONTENT_TYPE.EMAIL_CONFIRMATION ||
352
+ action === CONTENT_TYPE.PASSWORD_RESET
353
+ ) {
354
+ const { code, email } = await handleURLParams();
355
+
356
+ if (action === CONTENT_TYPE.EMAIL_CONFIRMATION) {
357
+ await submitConfirmationCode(email, code);
358
+ transition(action as CONTENT_TYPE);
359
+ } else if (action === CONTENT_TYPE.PASSWORD_RESET) {
360
+ transition(action as CONTENT_TYPE);
361
+ }
362
+ } else {
363
+ transition(action as CONTENT_TYPE);
364
+ }
365
+ } else {
366
+ transition(CONTENT_TYPE.SIGN_UP);
367
+ }
368
+ };
369
+
370
+ initialize();
371
+ }, [action, handleURLParams, sessionCheckComplete]);
372
+
373
+ // Suppress the auth UI until the session check finishes. If the user IS
374
+ // signed in we've already kicked off a `navigate(redirectTo)` above and
375
+ // rendering the sign-in form in the meantime would flicker the page.
376
+ if (!sessionCheckComplete) {
377
+ return null;
378
+ }
379
+
380
+ return (
381
+ <div className='auth-page' ref={rootElementRef}>
382
+ <div className='container' id='container'>
383
+ {/* Sign Up */}
384
+ <div
385
+ className={`content-container ${CONTENT_TYPE.SIGN_UP} ${
386
+ activeContent === CONTENT_TYPE.SIGN_UP ? 'active-content' : ''
387
+ }`}
388
+ >
389
+ <form
390
+ className='auth-centered-card-content'
391
+ action='#'
392
+ onSubmit={submitSignUp}
393
+ >
394
+ <h1>Create Account</h1>
395
+ <div className='social-container'>
396
+ {/* <div
397
+ className='google-social-sign-in-button'
398
+ id='google-sign-up-button'
399
+ /> */}
400
+ </div>
401
+ <input
402
+ type='email'
403
+ placeholder='Email'
404
+ name='email'
405
+ autoComplete='current-email'
406
+ />
407
+ <div style={{ position: 'relative', width: '100%' }}>
408
+ <input
409
+ type={showPassword ? 'text' : 'password'}
410
+ placeholder='Password'
411
+ name='password'
412
+ autoComplete='new-password'
413
+ style={{
414
+ width: '100%',
415
+ paddingRight: '45px',
416
+ boxSizing: 'border-box',
417
+ }}
418
+ />
419
+ <IconButton
420
+ onClick={() => setShowPassword(!showPassword)}
421
+ style={{
422
+ position: 'absolute',
423
+ right: '5px',
424
+ top: '50%',
425
+ transform: 'translateY(-50%)',
426
+ }}
427
+ size='small'
428
+ className='input-button'
429
+ >
430
+ {showPassword ? (
431
+ <VisibilityOff fontSize='small' />
432
+ ) : (
433
+ <Visibility fontSize='small' />
434
+ )}
435
+ </IconButton>
436
+ </div>
437
+ <p
438
+ className='auth-form-error-messages'
439
+ id={`${CONTENT_TYPE.SIGN_UP}-error`}
440
+ >
441
+ {' '}
442
+ </p>
443
+ <br />
444
+ <button>Sign Up</button>
445
+ </form>
446
+ </div>
447
+
448
+ {/* Email Confirmation */}
449
+ <div
450
+ className={`content-container ${CONTENT_TYPE.EMAIL_CONFIRMATION} ${
451
+ activeContent === CONTENT_TYPE.EMAIL_CONFIRMATION
452
+ ? 'active-content'
453
+ : ''
454
+ }`}
455
+ >
456
+ {/* ... keeping the rest exactly the same ... */}
457
+ <div className='auth-centered-card-content'>
458
+ <h1>Email confirmation</h1>
459
+ <br />
460
+ <div>
461
+ Email:{' '}
462
+ {location.search.includes('email=')
463
+ ? new URLSearchParams(location.search).get('email')
464
+ : ''}
465
+ </div>
466
+ {!emailConfirmationError && !emailConfirmationSuccess && (
467
+ <div>
468
+ <AnimatedLoading />
469
+ <br />
470
+ <span>Confirming your email...</span>
471
+ <br />
472
+ <br />
473
+ <br />
474
+ <div style={{ height: '40px' }} />
475
+ </div>
476
+ )}
477
+ {!!emailConfirmationSuccess && (
478
+ <div>
479
+ <AnimatedCheckmark />
480
+ <br />
481
+ <span>Your email has been confirmed!</span>
482
+ <br />
483
+ <br />
484
+ <br />
485
+ <button onClick={() => transition(CONTENT_TYPE.SIGN_IN)}>
486
+ Sign in
487
+ </button>
488
+ </div>
489
+ )}
490
+ {!!emailConfirmationError && (
491
+ <div>
492
+ <AnimatedCrossmark />
493
+ <br />
494
+ <span>Email confirmation failed!</span>
495
+ <br />
496
+ <br />
497
+ <br />
498
+ <button onClick={handleResendConfirmationCode}>
499
+ Resend code
500
+ </button>
501
+ </div>
502
+ )}
503
+ </div>
504
+ </div>
505
+
506
+ {/* Sign In */}
507
+ <div
508
+ className={`content-container ${CONTENT_TYPE.SIGN_IN} ${
509
+ activeContent === CONTENT_TYPE.SIGN_IN ? 'active-content' : ''
510
+ }`}
511
+ >
512
+ <form
513
+ className='auth-centered-card-content'
514
+ action='#'
515
+ onSubmit={submitSignIn}
516
+ >
517
+ <h1>Sign in</h1>
518
+ <div className='social-container'></div>
519
+ <input
520
+ type='email'
521
+ name='email'
522
+ placeholder='Email'
523
+ autoComplete='current-email'
524
+ />
525
+ <div style={{ position: 'relative', width: '100%' }}>
526
+ <input
527
+ type={showPassword ? 'text' : 'password'}
528
+ name='password'
529
+ placeholder='Password'
530
+ autoComplete='current-password'
531
+ style={{
532
+ width: '100%',
533
+ paddingRight: '45px',
534
+ boxSizing: 'border-box',
535
+ }}
536
+ />
537
+ <IconButton
538
+ onClick={() => setShowPassword(!showPassword)}
539
+ style={{
540
+ position: 'absolute',
541
+ right: '5px',
542
+ top: '50%',
543
+ transform: 'translateY(-50%)',
544
+ }}
545
+ size='small'
546
+ className='input-button'
547
+ >
548
+ {showPassword ? (
549
+ <VisibilityOff fontSize='small' />
550
+ ) : (
551
+ <Visibility fontSize='small' />
552
+ )}
553
+ </IconButton>
554
+ </div>
555
+ <p
556
+ className='auth-form-error-messages'
557
+ id={`${CONTENT_TYPE.SIGN_IN}-error`}
558
+ >
559
+ {' '}
560
+ </p>
561
+ <a
562
+ href='#'
563
+ onClick={(e) => {
564
+ e.preventDefault();
565
+ transition(CONTENT_TYPE.FORGOT_PASSWORD);
566
+ }}
567
+ >
568
+ Forgot your password?
569
+ </a>
570
+ <button>Sign In</button>
571
+ </form>
572
+ </div>
573
+
574
+ {/* Confirmation Email Sent */}
575
+ <div
576
+ className={`content-container ${
577
+ CONTENT_TYPE.CONFIRMATION_EMAIL_SENT
578
+ } ${
579
+ activeContent === CONTENT_TYPE.CONFIRMATION_EMAIL_SENT
580
+ ? 'active-content'
581
+ : ''
582
+ }`}
583
+ >
584
+ <div className='auth-centered-card-content'>
585
+ <h1>Email sent</h1>
586
+ <br />
587
+ <div id='current-email'>Email: </div>
588
+ <div>
589
+ <AnimatedEmailSending />
590
+ <br />
591
+ <span>You can close this page now.</span>
592
+ <br />
593
+ <br />
594
+ <br />
595
+ <div style={{ height: '40px' }} />
596
+ </div>
597
+ </div>
598
+ </div>
599
+
600
+ {/* Password Reset Email Sent */}
601
+ <div
602
+ className={`content-container ${
603
+ CONTENT_TYPE.PASSWORD_RESET_EMAIL_SENT
604
+ } ${
605
+ activeContent === CONTENT_TYPE.PASSWORD_RESET_EMAIL_SENT
606
+ ? 'active-content'
607
+ : ''
608
+ }`}
609
+ >
610
+ <div className='auth-centered-card-content'>
611
+ <h1>Email sent</h1>
612
+ <br />
613
+ <div id='current-email'>Email: </div>
614
+ <div>
615
+ <AnimatedEmailSending />
616
+ <br />
617
+ <span>You can close this page now.</span>
618
+ <br />
619
+ <br />
620
+ <br />
621
+ <div style={{ height: '40px' }} />
622
+ </div>
623
+ </div>
624
+ </div>
625
+
626
+ {/* Forgot Password */}
627
+ <div
628
+ className={`content-container ${CONTENT_TYPE.FORGOT_PASSWORD} ${
629
+ activeContent === CONTENT_TYPE.FORGOT_PASSWORD
630
+ ? 'active-content'
631
+ : ''
632
+ }`}
633
+ >
634
+ <form
635
+ className='auth-centered-card-content'
636
+ action='#'
637
+ onSubmit={submitForgotPassword}
638
+ >
639
+ <h1>Reset password</h1>
640
+ <br />
641
+ <span>Get a password recovery email</span>
642
+ <input
643
+ type='email'
644
+ placeholder='Email'
645
+ name='email'
646
+ autoComplete='current-email'
647
+ />
648
+ <p
649
+ className='auth-form-error-messages'
650
+ id={`${CONTENT_TYPE.FORGOT_PASSWORD}-error`}
651
+ >
652
+ {' '}
653
+ </p>
654
+ <br />
655
+ <button>Send recovery email</button>
656
+ </form>
657
+ </div>
658
+
659
+ {/* Password Reset */}
660
+ <div
661
+ className={`content-container ${CONTENT_TYPE.PASSWORD_RESET} ${
662
+ activeContent === CONTENT_TYPE.PASSWORD_RESET
663
+ ? 'active-content'
664
+ : ''
665
+ }`}
666
+ >
667
+ <form
668
+ className='auth-centered-card-content'
669
+ action='#'
670
+ onSubmit={submitNewPassword}
671
+ >
672
+ <h1>Reset password</h1>
673
+ <br />
674
+ <div id='current-email'>
675
+ Email:{' '}
676
+ {location.search.includes('email=')
677
+ ? new URLSearchParams(location.search).get('email')
678
+ : ''}
679
+ </div>
680
+ <br />
681
+ <div style={{ position: 'relative', width: '100%' }}>
682
+ <input
683
+ type={showPassword ? 'text' : 'password'}
684
+ placeholder='New password'
685
+ name='password'
686
+ autoComplete='new-password'
687
+ style={{
688
+ width: '100%',
689
+ paddingRight: '45px',
690
+ boxSizing: 'border-box',
691
+ }}
692
+ />
693
+ <IconButton
694
+ onClick={() => setShowPassword(!showPassword)}
695
+ style={{
696
+ position: 'absolute',
697
+ right: '5px',
698
+ top: '50%',
699
+ transform: 'translateY(-50%)',
700
+ }}
701
+ size='small'
702
+ className='input-button'
703
+ >
704
+ {showPassword ? (
705
+ <VisibilityOff fontSize='small' />
706
+ ) : (
707
+ <Visibility fontSize='small' />
708
+ )}
709
+ </IconButton>
710
+ </div>
711
+ <p
712
+ className='auth-form-error-messages'
713
+ id={`${CONTENT_TYPE.PASSWORD_RESET}-error`}
714
+ >
715
+ {' '}
716
+ </p>
717
+ <br />
718
+ <button id='save-new-password'>Save password</button>
719
+ <button
720
+ id='resend-password-recovery'
721
+ // @ts-ignore
722
+ onClick={submitForgotPassword}
723
+ >
724
+ Resend code
725
+ </button>
726
+ </form>
727
+ </div>
728
+
729
+ {/* Overlay */}
730
+ <div className='overlay-container'>
731
+ <div className='overlay'>
732
+ <div
733
+ className={`overlay-panel ${CONTENT_TYPE.SIGN_UP} ${
734
+ activeContent === CONTENT_TYPE.SIGN_UP ? 'active-content' : ''
735
+ }`}
736
+ >
737
+ <h1>Welcome Back!</h1>
738
+ <p>
739
+ To keep connected with us please login with your personal info
740
+ </p>
741
+ <button
742
+ className='ghost'
743
+ id='to-sign-in'
744
+ onClick={() => transition(CONTENT_TYPE.SIGN_IN)}
745
+ >
746
+ Sign In
747
+ </button>
748
+ </div>
749
+ <div
750
+ className={`overlay-panel ${CONTENT_TYPE.SIGN_IN} ${
751
+ activeContent === CONTENT_TYPE.SIGN_IN ? 'active-content' : ''
752
+ }`}
753
+ >
754
+ <h1>Hello, Friend!</h1>
755
+ <p>Enter your personal details and start journey with us</p>
756
+ <button
757
+ className='ghost'
758
+ id='to-sign-up'
759
+ onClick={() => transition(CONTENT_TYPE.SIGN_UP)}
760
+ >
761
+ Sign Up
762
+ </button>
763
+ </div>
764
+ <div
765
+ className={`overlay-panel ${
766
+ CONTENT_TYPE.CONFIRMATION_EMAIL_SENT
767
+ } ${
768
+ activeContent === CONTENT_TYPE.CONFIRMATION_EMAIL_SENT
769
+ ? 'active-content'
770
+ : ''
771
+ }`}
772
+ >
773
+ <h1>Check your email!</h1>
774
+ <p>You will receive an email with a confirmation link</p>
775
+ </div>
776
+ <div
777
+ className={`overlay-panel ${
778
+ CONTENT_TYPE.PASSWORD_RESET_EMAIL_SENT
779
+ } ${
780
+ activeContent === CONTENT_TYPE.PASSWORD_RESET_EMAIL_SENT
781
+ ? 'active-content'
782
+ : ''
783
+ }`}
784
+ >
785
+ <h1>Check your email!</h1>
786
+ <p>You will receive an email with a password recovery link</p>
787
+ </div>
788
+ <div
789
+ className={`overlay-panel ${CONTENT_TYPE.FORGOT_PASSWORD} ${
790
+ activeContent === CONTENT_TYPE.FORGOT_PASSWORD
791
+ ? 'active-content'
792
+ : ''
793
+ }`}
794
+ >
795
+ <h1>Hello, Friend!</h1>
796
+ <p>Enter your personal details and start journey with us</p>
797
+ <button
798
+ className='ghost'
799
+ id='to-sign-up'
800
+ onClick={() => transition(CONTENT_TYPE.SIGN_UP)}
801
+ >
802
+ Sign Up
803
+ </button>
804
+ </div>
805
+ <div
806
+ className={`overlay-panel ${CONTENT_TYPE.PASSWORD_RESET} ${
807
+ activeContent === CONTENT_TYPE.PASSWORD_RESET
808
+ ? 'active-content'
809
+ : ''
810
+ }`}
811
+ >
812
+ <h1>Hello, Friend!</h1>
813
+ <p>Enter your personal details and start journey with us</p>
814
+ <button
815
+ className='ghost'
816
+ id='to-sign-up'
817
+ onClick={() => transition(CONTENT_TYPE.SIGN_UP)}
818
+ >
819
+ Sign Up
820
+ </button>
821
+ </div>
822
+ <div
823
+ className={`overlay-panel ${CONTENT_TYPE.EMAIL_CONFIRMATION} ${
824
+ activeContent === CONTENT_TYPE.EMAIL_CONFIRMATION
825
+ ? 'active-content'
826
+ : ''
827
+ }`}
828
+ >
829
+ <h1>Hello, Friend!</h1>
830
+ <p>Confirm your email to continue using our services</p>
831
+ </div>
832
+ </div>
833
+ </div>
834
+ </div>
835
+ <a
836
+ href='/'
837
+ onClick={(e) => {
838
+ e.preventDefault();
839
+ navigate('/');
840
+ }}
841
+ >
842
+ <img className='auth-page-logo' src={Logo} alt='Logo' />
843
+ </a>
844
+ </div>
845
+ );
846
+ };
847
+
848
+ export default Auth;