synapse-react-client 4.0.40 → 4.0.42

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 (438) hide show
  1. package/dist/SWC.index.d.ts +1 -0
  2. package/dist/SWC.index.d.ts.map +1 -1
  3. package/dist/SWC.index.js +2 -1
  4. package/dist/SWC.index.js.map +1 -1
  5. package/dist/components/AccessRequirement/ImposeRestrictionDialog/ImposeRestrictionDialog.d.ts +1 -0
  6. package/dist/components/AccessRequirement/ImposeRestrictionDialog/ImposeRestrictionDialog.d.ts.map +1 -1
  7. package/dist/components/AccessRequirement/ImposeRestrictionDialog/ImposeRestrictionDialog.js +12 -12
  8. package/dist/components/AccessRequirement/ImposeRestrictionDialog/ImposeRestrictionDialog.js.map +1 -1
  9. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/AccessorRequirementHelpText.d.ts +7 -0
  10. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/AccessorRequirementHelpText.d.ts.map +1 -0
  11. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/AccessorRequirementHelpText.js +30 -0
  12. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/AccessorRequirementHelpText.js.map +1 -0
  13. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.d.ts.map +1 -1
  14. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.js +138 -244
  15. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm.js.map +1 -1
  16. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DucUploadSection.d.ts +13 -0
  17. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DucUploadSection.d.ts.map +1 -0
  18. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DucUploadSection.js +60 -0
  19. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DucUploadSection.js.map +1 -0
  20. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.d.ts +8 -2
  21. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.d.ts.map +1 -1
  22. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.js +179 -63
  23. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/EDucPreviewStep/EDucPreviewStep.js.map +1 -1
  24. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementFormWikiWrapper.d.ts +2 -0
  25. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementFormWikiWrapper.d.ts.map +1 -1
  26. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementFormWikiWrapper.js +13 -13
  27. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementFormWikiWrapper.js.map +1 -1
  28. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementItemView.d.ts +3 -2
  29. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementItemView.d.ts.map +1 -1
  30. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementItemView.js.map +1 -1
  31. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.d.ts +3 -2
  32. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.d.ts.map +1 -1
  33. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManualUploadDucStep/ManualUploadDucStep.js.map +1 -1
  34. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/PrincipalInvestigatorFields.d.ts +12 -0
  35. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/PrincipalInvestigatorFields.d.ts.map +1 -0
  36. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/PrincipalInvestigatorFields.js +50 -0
  37. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/PrincipalInvestigatorFields.js.map +1 -0
  38. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.d.ts.map +1 -1
  39. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.js +112 -143
  40. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.js.map +1 -1
  41. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.d.ts +4 -2
  42. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.d.ts.map +1 -1
  43. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.js +8 -7
  44. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewDucStep/ReviewDucStep.js.map +1 -1
  45. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.d.ts +3 -2
  46. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.d.ts.map +1 -1
  47. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.js +79 -47
  48. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.js.map +1 -1
  49. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SigningOfficialFields.d.ts +12 -0
  50. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SigningOfficialFields.d.ts.map +1 -0
  51. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SigningOfficialFields.js +51 -0
  52. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SigningOfficialFields.js.map +1 -0
  53. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/eDucSignatureUtils.d.ts +12 -0
  54. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/eDucSignatureUtils.d.ts.map +1 -0
  55. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/eDucSignatureUtils.js +24 -0
  56. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/eDucSignatureUtils.js.map +1 -0
  57. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/requestFlowTypes.d.ts +11 -0
  58. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/requestFlowTypes.d.ts.map +1 -0
  59. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/requestFlowTypes.js +0 -0
  60. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/useInitializeRequestAccessors.d.ts +22 -0
  61. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/useInitializeRequestAccessors.d.ts.map +1 -0
  62. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/useInitializeRequestAccessors.js +32 -0
  63. package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/useInitializeRequestAccessors.js.map +1 -0
  64. package/dist/components/AclEditor/AclEditor.js +20 -20
  65. package/dist/components/Aridhia/AridhiaAccessStatus.d.ts.map +1 -1
  66. package/dist/components/Aridhia/AridhiaAccessStatus.js +51 -48
  67. package/dist/components/Aridhia/AridhiaAccessStatus.js.map +1 -1
  68. package/dist/components/Authentication/Constants.d.ts +4 -0
  69. package/dist/components/Authentication/Constants.d.ts.map +1 -1
  70. package/dist/components/Authentication/Constants.js +5 -2
  71. package/dist/components/Authentication/Constants.js.map +1 -1
  72. package/dist/components/Authentication/RecoveryCodeGrid.d.ts.map +1 -1
  73. package/dist/components/Authentication/RecoveryCodeGrid.js +8 -1
  74. package/dist/components/Authentication/RecoveryCodeGrid.js.map +1 -1
  75. package/dist/components/Authentication/RegenerateBackupCodesWarning.js +4 -1
  76. package/dist/components/Authentication/RegenerateBackupCodesWarning.js.map +1 -1
  77. package/dist/components/Authentication/TOTPForm.d.ts.map +1 -1
  78. package/dist/components/Authentication/TOTPForm.js +20 -18
  79. package/dist/components/Authentication/TOTPForm.js.map +1 -1
  80. package/dist/components/Authentication/TwoFactorBackupCodes.d.ts.map +1 -1
  81. package/dist/components/Authentication/TwoFactorBackupCodes.js +41 -12
  82. package/dist/components/Authentication/TwoFactorBackupCodes.js.map +1 -1
  83. package/dist/components/Authentication/TwoFactorEnrollmentForm.d.ts.map +1 -1
  84. package/dist/components/Authentication/TwoFactorEnrollmentForm.js +90 -77
  85. package/dist/components/Authentication/TwoFactorEnrollmentForm.js.map +1 -1
  86. package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
  87. package/dist/components/DataGrid/SynapseGrid.js +244 -246
  88. package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
  89. package/dist/components/DataGrid/components/GridLoadingState.d.ts +23 -0
  90. package/dist/components/DataGrid/components/GridLoadingState.d.ts.map +1 -0
  91. package/dist/components/DataGrid/components/GridLoadingState.js +64 -0
  92. package/dist/components/DataGrid/components/GridLoadingState.js.map +1 -0
  93. package/dist/components/DataGrid/components/ReorderColumnsDialog.d.ts.map +1 -1
  94. package/dist/components/DataGrid/components/ReorderColumnsDialog.js +52 -54
  95. package/dist/components/DataGrid/components/ReorderColumnsDialog.js.map +1 -1
  96. package/dist/components/DataGrid/useDataGridWebsocket.d.ts +60 -6
  97. package/dist/components/DataGrid/useDataGridWebsocket.d.ts.map +1 -1
  98. package/dist/components/DataGrid/useDataGridWebsocket.js +71 -60
  99. package/dist/components/DataGrid/useDataGridWebsocket.js.map +1 -1
  100. package/dist/components/DataGrid/utils/getNamedColumnIndices.d.ts +11 -0
  101. package/dist/components/DataGrid/utils/getNamedColumnIndices.d.ts.map +1 -0
  102. package/dist/components/DataGrid/utils/getNamedColumnIndices.js +8 -0
  103. package/dist/components/DataGrid/utils/getNamedColumnIndices.js.map +1 -0
  104. package/dist/components/FilePreview/FileHandleContentRenderer.d.ts +6 -2
  105. package/dist/components/FilePreview/FileHandleContentRenderer.d.ts.map +1 -1
  106. package/dist/components/FilePreview/FileHandleContentRenderer.js +27 -14
  107. package/dist/components/FilePreview/FileHandleContentRenderer.js.map +1 -1
  108. package/dist/components/FilePreview/PdfPreview.d.ts +1 -1
  109. package/dist/components/FilePreview/PdfPreview.d.ts.map +1 -1
  110. package/dist/components/FilePreview/PdfPreview.js +15 -16
  111. package/dist/components/FilePreview/PdfPreview.js.map +1 -1
  112. package/dist/components/FormTemplateEditor/ChoiceOptionsEditor.d.ts +11 -0
  113. package/dist/components/FormTemplateEditor/ChoiceOptionsEditor.d.ts.map +1 -0
  114. package/dist/components/FormTemplateEditor/ChoiceOptionsEditor.js +61 -0
  115. package/dist/components/FormTemplateEditor/ChoiceOptionsEditor.js.map +1 -0
  116. package/dist/components/FormTemplateEditor/FieldDefinitionDrawer.d.ts +33 -0
  117. package/dist/components/FormTemplateEditor/FieldDefinitionDrawer.d.ts.map +1 -0
  118. package/dist/components/FormTemplateEditor/FieldDefinitionDrawer.js +190 -0
  119. package/dist/components/FormTemplateEditor/FieldDefinitionDrawer.js.map +1 -0
  120. package/dist/components/FormTemplateEditor/FieldLibrary.css +1 -0
  121. package/dist/components/FormTemplateEditor/FieldLibrary.d.ts +17 -0
  122. package/dist/components/FormTemplateEditor/FieldLibrary.d.ts.map +1 -0
  123. package/dist/components/FormTemplateEditor/FieldLibrary.js +88 -0
  124. package/dist/components/FormTemplateEditor/FieldLibrary.js.map +1 -0
  125. package/dist/components/FormTemplateEditor/FieldLibrary.module.js +5 -0
  126. package/dist/components/FormTemplateEditor/FieldLibrary.module.js.map +1 -0
  127. package/dist/components/FormTemplateEditor/FieldLibrary.module.scss +12 -0
  128. package/dist/components/FormTemplateEditor/FieldLibraryRow.d.ts +19 -0
  129. package/dist/components/FormTemplateEditor/FieldLibraryRow.d.ts.map +1 -0
  130. package/dist/components/FormTemplateEditor/FieldLibraryRow.js +115 -0
  131. package/dist/components/FormTemplateEditor/FieldLibraryRow.js.map +1 -0
  132. package/dist/components/FormTemplateEditor/FieldValidationErrorAlert.css +1 -0
  133. package/dist/components/FormTemplateEditor/FieldValidationErrorAlert.d.ts +9 -0
  134. package/dist/components/FormTemplateEditor/FieldValidationErrorAlert.d.ts.map +1 -0
  135. package/dist/components/FormTemplateEditor/FieldValidationErrorAlert.js +18 -0
  136. package/dist/components/FormTemplateEditor/FieldValidationErrorAlert.js.map +1 -0
  137. package/dist/components/FormTemplateEditor/FieldValidationErrorAlert.module.js +5 -0
  138. package/dist/components/FormTemplateEditor/FieldValidationErrorAlert.module.js.map +1 -0
  139. package/dist/components/FormTemplateEditor/FieldValidationErrorAlert.module.scss +4 -0
  140. package/dist/components/FormTemplateEditor/FormStructurePanel.d.ts +21 -0
  141. package/dist/components/FormTemplateEditor/FormStructurePanel.d.ts.map +1 -0
  142. package/dist/components/FormTemplateEditor/FormStructurePanel.js +108 -0
  143. package/dist/components/FormTemplateEditor/FormStructurePanel.js.map +1 -0
  144. package/dist/components/FormTemplateEditor/FormTemplateEditor.d.ts +10 -0
  145. package/dist/components/FormTemplateEditor/FormTemplateEditor.d.ts.map +1 -0
  146. package/dist/components/FormTemplateEditor/FormTemplateEditor.js +31 -0
  147. package/dist/components/FormTemplateEditor/FormTemplateEditor.js.map +1 -0
  148. package/dist/components/FormTemplateEditor/FormTemplateEditorForm.d.ts +15 -0
  149. package/dist/components/FormTemplateEditor/FormTemplateEditorForm.d.ts.map +1 -0
  150. package/dist/components/FormTemplateEditor/FormTemplateEditorForm.js +234 -0
  151. package/dist/components/FormTemplateEditor/FormTemplateEditorForm.js.map +1 -0
  152. package/dist/components/FormTemplateEditor/FormTemplatePreview.d.ts +14 -0
  153. package/dist/components/FormTemplateEditor/FormTemplatePreview.d.ts.map +1 -0
  154. package/dist/components/FormTemplateEditor/FormTemplatePreview.js +72 -0
  155. package/dist/components/FormTemplateEditor/FormTemplatePreview.js.map +1 -0
  156. package/dist/components/FormTemplateEditor/JsonSchemaBodyEditor.d.ts +13 -0
  157. package/dist/components/FormTemplateEditor/JsonSchemaBodyEditor.d.ts.map +1 -0
  158. package/dist/components/FormTemplateEditor/JsonSchemaBodyEditor.js +33 -0
  159. package/dist/components/FormTemplateEditor/JsonSchemaBodyEditor.js.map +1 -0
  160. package/dist/components/FormTemplateEditor/StepCard.d.ts +25 -0
  161. package/dist/components/FormTemplateEditor/StepCard.d.ts.map +1 -0
  162. package/dist/components/FormTemplateEditor/StepCard.js +203 -0
  163. package/dist/components/FormTemplateEditor/StepCard.js.map +1 -0
  164. package/dist/components/FormTemplateEditor/StepFieldRow.d.ts +34 -0
  165. package/dist/components/FormTemplateEditor/StepFieldRow.d.ts.map +1 -0
  166. package/dist/components/FormTemplateEditor/StepFieldRow.js +128 -0
  167. package/dist/components/FormTemplateEditor/StepFieldRow.js.map +1 -0
  168. package/dist/components/FormTemplateEditor/TemplateFileHandleField.d.ts +19 -0
  169. package/dist/components/FormTemplateEditor/TemplateFileHandleField.d.ts.map +1 -0
  170. package/dist/components/FormTemplateEditor/TemplateFileHandleField.js +78 -0
  171. package/dist/components/FormTemplateEditor/TemplateFileHandleField.js.map +1 -0
  172. package/dist/components/FormTemplateEditor/dragHandle.css +1 -0
  173. package/dist/components/FormTemplateEditor/dragHandle.module.js +8 -0
  174. package/dist/components/FormTemplateEditor/dragHandle.module.js.map +1 -0
  175. package/dist/components/FormTemplateEditor/dragHandle.module.scss +22 -0
  176. package/dist/components/FormTemplateEditor/dropTarget.css +1 -0
  177. package/dist/components/FormTemplateEditor/dropTarget.module.js +5 -0
  178. package/dist/components/FormTemplateEditor/dropTarget.module.js.map +1 -0
  179. package/dist/components/FormTemplateEditor/dropTarget.module.scss +14 -0
  180. package/dist/components/FormTemplateEditor/formTemplateDraftState.d.ts +48 -0
  181. package/dist/components/FormTemplateEditor/formTemplateDraftState.d.ts.map +1 -0
  182. package/dist/components/FormTemplateEditor/formTemplateDraftState.js +126 -0
  183. package/dist/components/FormTemplateEditor/formTemplateDraftState.js.map +1 -0
  184. package/dist/components/FormTemplateEditor/formTemplateSchema.d.ts +35 -0
  185. package/dist/components/FormTemplateEditor/formTemplateSchema.d.ts.map +1 -0
  186. package/dist/components/FormTemplateEditor/formTemplateSchema.js +35 -0
  187. package/dist/components/FormTemplateEditor/formTemplateSchema.js.map +1 -0
  188. package/dist/components/FormTemplateEditor/formTemplateValidation.d.ts +32 -0
  189. package/dist/components/FormTemplateEditor/formTemplateValidation.d.ts.map +1 -0
  190. package/dist/components/FormTemplateEditor/formTemplateValidation.js +75 -0
  191. package/dist/components/FormTemplateEditor/formTemplateValidation.js.map +1 -0
  192. package/dist/components/FormTemplateEditor/schemaFieldUtils.d.ts +27 -0
  193. package/dist/components/FormTemplateEditor/schemaFieldUtils.d.ts.map +1 -0
  194. package/dist/components/FormTemplateEditor/schemaFieldUtils.js +84 -0
  195. package/dist/components/FormTemplateEditor/schemaFieldUtils.js.map +1 -0
  196. package/dist/components/FormTemplateEditor/sortableIds.d.ts +23 -0
  197. package/dist/components/FormTemplateEditor/sortableIds.d.ts.map +1 -0
  198. package/dist/components/FormTemplateEditor/sortableIds.js +24 -0
  199. package/dist/components/FormTemplateEditor/sortableIds.js.map +1 -0
  200. package/dist/components/FormTemplateEditor/useFormTemplateDraft.d.ts +33 -0
  201. package/dist/components/FormTemplateEditor/useFormTemplateDraft.d.ts.map +1 -0
  202. package/dist/components/FormTemplateEditor/useFormTemplateDraft.js +59 -0
  203. package/dist/components/FormTemplateEditor/useFormTemplateDraft.js.map +1 -0
  204. package/dist/components/FormTemplateEditor/useFormTemplateDrag.d.ts +9 -0
  205. package/dist/components/FormTemplateEditor/useFormTemplateDrag.d.ts.map +1 -0
  206. package/dist/components/FormTemplateEditor/useFormTemplateDrag.js +66 -0
  207. package/dist/components/FormTemplateEditor/useFormTemplateDrag.js.map +1 -0
  208. package/dist/components/FormTemplateEditor/useSaveFormTemplate.d.ts +28 -0
  209. package/dist/components/FormTemplateEditor/useSaveFormTemplate.d.ts.map +1 -0
  210. package/dist/components/FormTemplateEditor/useSaveFormTemplate.js +54 -0
  211. package/dist/components/FormTemplateEditor/useSaveFormTemplate.js.map +1 -0
  212. package/dist/components/FormTemplateEditor/utils.d.ts +21 -0
  213. package/dist/components/FormTemplateEditor/utils.d.ts.map +1 -0
  214. package/dist/components/FormTemplateEditor/utils.js +24 -0
  215. package/dist/components/FormTemplateEditor/utils.js.map +1 -0
  216. package/dist/components/JsonSchemaForm/CustomFormContext.d.ts +1 -1
  217. package/dist/components/JsonSchemaForm/CustomFormContext.d.ts.map +1 -1
  218. package/dist/components/JsonSchemaForm/JsonSchemaForm.css +1 -1
  219. package/dist/components/JsonSchemaForm/JsonSchemaForm.module.js +1 -1
  220. package/dist/components/JsonSchemaForm/JsonSchemaForm.module.js.map +1 -1
  221. package/dist/components/JsonSchemaForm/JsonSchemaForm.module.scss +6 -1
  222. package/dist/components/JsonSchemaForm/templates/RJSFInputLabel.d.ts.map +1 -1
  223. package/dist/components/JsonSchemaForm/templates/RJSFInputLabel.js +4 -0
  224. package/dist/components/JsonSchemaForm/templates/RJSFInputLabel.js.map +1 -1
  225. package/dist/components/JsonSchemaForm/widgets/SelectWidget.d.ts +11 -0
  226. package/dist/components/JsonSchemaForm/widgets/SelectWidget.d.ts.map +1 -1
  227. package/dist/components/JsonSchemaForm/widgets/SelectWidget.js +28 -19
  228. package/dist/components/JsonSchemaForm/widgets/SelectWidget.js.map +1 -1
  229. package/dist/components/QueryBuilder/FilterConditionRow.css +1 -1
  230. package/dist/components/QueryBuilder/FilterConditionRow.d.ts +3 -0
  231. package/dist/components/QueryBuilder/FilterConditionRow.d.ts.map +1 -1
  232. package/dist/components/QueryBuilder/FilterConditionRow.js +123 -123
  233. package/dist/components/QueryBuilder/FilterConditionRow.js.map +1 -1
  234. package/dist/components/QueryBuilder/FilterConditionRow.module.js +10 -11
  235. package/dist/components/QueryBuilder/FilterConditionRow.module.js.map +1 -1
  236. package/dist/components/QueryBuilder/FilterConditionRow.module.scss +0 -5
  237. package/dist/components/QueryBuilder/FilterGroupNode.css +1 -1
  238. package/dist/components/QueryBuilder/FilterGroupNode.d.ts +4 -0
  239. package/dist/components/QueryBuilder/FilterGroupNode.d.ts.map +1 -1
  240. package/dist/components/QueryBuilder/FilterGroupNode.js +85 -51
  241. package/dist/components/QueryBuilder/FilterGroupNode.js.map +1 -1
  242. package/dist/components/QueryBuilder/FilterGroupNode.module.js +10 -9
  243. package/dist/components/QueryBuilder/FilterGroupNode.module.js.map +1 -1
  244. package/dist/components/QueryBuilder/FilterGroupNode.module.scss +9 -0
  245. package/dist/components/QueryBuilder/QBDragHandle.d.ts +10 -0
  246. package/dist/components/QueryBuilder/QBDragHandle.d.ts.map +1 -0
  247. package/dist/components/QueryBuilder/QBDragHandle.js +22 -0
  248. package/dist/components/QueryBuilder/QBDragHandle.js.map +1 -0
  249. package/dist/components/QueryBuilder/QueryBuilderControls.d.ts.map +1 -1
  250. package/dist/components/QueryBuilder/QueryBuilderControls.js +120 -108
  251. package/dist/components/QueryBuilder/QueryBuilderControls.js.map +1 -1
  252. package/dist/components/QueryBuilder/QueryBuilderInternalContext.d.ts +7 -0
  253. package/dist/components/QueryBuilder/QueryBuilderInternalContext.d.ts.map +1 -1
  254. package/dist/components/QueryBuilder/QueryBuilderInternalContext.js.map +1 -1
  255. package/dist/components/QueryBuilder/qbTreeToReadable.d.ts +2 -1
  256. package/dist/components/QueryBuilder/qbTreeToReadable.d.ts.map +1 -1
  257. package/dist/components/QueryBuilder/qbTreeToReadable.js +25 -21
  258. package/dist/components/QueryBuilder/qbTreeToReadable.js.map +1 -1
  259. package/dist/components/QueryBuilder/queryBuilderDnd.d.ts +27 -0
  260. package/dist/components/QueryBuilder/queryBuilderDnd.d.ts.map +1 -0
  261. package/dist/components/QueryBuilder/queryBuilderDnd.js +41 -0
  262. package/dist/components/QueryBuilder/queryBuilderDnd.js.map +1 -0
  263. package/dist/components/QueryBuilder/queryBuilderDrag.css +1 -0
  264. package/dist/components/QueryBuilder/queryBuilderDrag.module.js +8 -0
  265. package/dist/components/QueryBuilder/queryBuilderDrag.module.js.map +1 -0
  266. package/dist/components/QueryBuilder/queryBuilderDrag.module.scss +12 -0
  267. package/dist/components/QueryBuilder/queryBuilderMetadata.d.ts +16 -0
  268. package/dist/components/QueryBuilder/queryBuilderMetadata.d.ts.map +1 -1
  269. package/dist/components/QueryBuilder/queryBuilderMetadata.js +13 -5
  270. package/dist/components/QueryBuilder/queryBuilderMetadata.js.map +1 -1
  271. package/dist/components/QueryBuilder/queryBuilderOperations.d.ts +13 -0
  272. package/dist/components/QueryBuilder/queryBuilderOperations.d.ts.map +1 -1
  273. package/dist/components/QueryBuilder/queryBuilderOperations.js +39 -36
  274. package/dist/components/QueryBuilder/queryBuilderOperations.js.map +1 -1
  275. package/dist/components/QueryBuilder/useQBValueDisplayName.d.ts +18 -0
  276. package/dist/components/QueryBuilder/useQBValueDisplayName.d.ts.map +1 -0
  277. package/dist/components/QueryBuilder/useQBValueDisplayName.js +64 -0
  278. package/dist/components/QueryBuilder/useQBValueDisplayName.js.map +1 -0
  279. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
  280. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +46 -47
  281. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
  282. package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js +6 -6
  283. package/dist/components/SynapseTable/RowSelection/RowSelectionUI.d.ts +1 -0
  284. package/dist/components/SynapseTable/RowSelection/RowSelectionUI.d.ts.map +1 -1
  285. package/dist/components/SynapseTable/RowSelection/RowSelectionUI.js +13 -11
  286. package/dist/components/SynapseTable/RowSelection/RowSelectionUI.js.map +1 -1
  287. package/dist/components/SynapseTable/SearchV2.js +4 -4
  288. package/dist/components/ToastMessage/ToastMessage.d.ts.map +1 -1
  289. package/dist/components/ToastMessage/ToastMessage.js +25 -22
  290. package/dist/components/ToastMessage/ToastMessage.js.map +1 -1
  291. package/dist/components/dataaccess/FormTemplateEditorRoute.d.ts +7 -0
  292. package/dist/components/dataaccess/FormTemplateEditorRoute.d.ts.map +1 -0
  293. package/dist/components/dataaccess/FormTemplateEditorRoute.js +26 -0
  294. package/dist/components/dataaccess/FormTemplateEditorRoute.js.map +1 -0
  295. package/dist/components/dataaccess/FormTemplateTable.d.ts +10 -0
  296. package/dist/components/dataaccess/FormTemplateTable.d.ts.map +1 -0
  297. package/dist/components/dataaccess/FormTemplateTable.js +124 -0
  298. package/dist/components/dataaccess/FormTemplateTable.js.map +1 -0
  299. package/dist/components/dataaccess/ReviewerDashboard.d.ts.map +1 -1
  300. package/dist/components/dataaccess/ReviewerDashboard.js +80 -50
  301. package/dist/components/dataaccess/ReviewerDashboard.js.map +1 -1
  302. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.d.ts.map +1 -1
  303. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.js +2 -0
  304. package/dist/components/dataaccess/UserAccessRequestHistory/InFlightEDucSignaturesTable.js.map +1 -1
  305. package/dist/components/entity/page/title_bar/EntityPageTitleBar.d.ts +0 -1
  306. package/dist/components/entity/page/title_bar/EntityPageTitleBar.d.ts.map +1 -1
  307. package/dist/components/entity/page/title_bar/EntityPageTitleBar.js +35 -36
  308. package/dist/components/entity/page/title_bar/EntityPageTitleBar.js.map +1 -1
  309. package/dist/components/styled/LeftRightPanel.d.ts.map +1 -1
  310. package/dist/components/styled/LeftRightPanel.js +19 -2
  311. package/dist/components/styled/LeftRightPanel.js.map +1 -1
  312. package/dist/components/widgets/FileHandleLink.d.ts +12 -2
  313. package/dist/components/widgets/FileHandleLink.d.ts.map +1 -1
  314. package/dist/components/widgets/FileHandleLink.js +25 -29
  315. package/dist/components/widgets/FileHandleLink.js.map +1 -1
  316. package/dist/mocks/accessRequirement/mockFormTemplates.d.ts +4 -2
  317. package/dist/mocks/accessRequirement/mockFormTemplates.d.ts.map +1 -1
  318. package/dist/mocks/accessRequirement/mockFormTemplates.js +13 -14
  319. package/dist/mocks/accessRequirement/mockFormTemplates.js.map +1 -1
  320. package/dist/mocks/accessRequirement/mockJsonSchemas.d.ts +4 -1
  321. package/dist/mocks/accessRequirement/mockJsonSchemas.d.ts.map +1 -1
  322. package/dist/mocks/accessRequirement/mockJsonSchemas.js +24 -17
  323. package/dist/mocks/accessRequirement/mockJsonSchemas.js.map +1 -1
  324. package/dist/mocks/msw/handlers/asyncJobHandlers.d.ts +41 -14
  325. package/dist/mocks/msw/handlers/asyncJobHandlers.d.ts.map +1 -1
  326. package/dist/mocks/msw/handlers/asyncJobHandlers.js +53 -44
  327. package/dist/mocks/msw/handlers/asyncJobHandlers.js.map +1 -1
  328. package/dist/mocks/msw/handlers/authHandlers.d.ts +1 -0
  329. package/dist/mocks/msw/handlers/authHandlers.d.ts.map +1 -1
  330. package/dist/mocks/msw/handlers/authHandlers.js +6 -2
  331. package/dist/mocks/msw/handlers/authHandlers.js.map +1 -1
  332. package/dist/mocks/msw/handlers/chatHandlers.d.ts.map +1 -1
  333. package/dist/mocks/msw/handlers/chatHandlers.js +19 -13
  334. package/dist/mocks/msw/handlers/chatHandlers.js.map +1 -1
  335. package/dist/mocks/msw/handlers/dataAccessRequestHandlers.d.ts +2 -0
  336. package/dist/mocks/msw/handlers/dataAccessRequestHandlers.d.ts.map +1 -1
  337. package/dist/mocks/msw/handlers/dataAccessRequestHandlers.js +52 -46
  338. package/dist/mocks/msw/handlers/dataAccessRequestHandlers.js.map +1 -1
  339. package/dist/mocks/msw/handlers/fileHandlers.d.ts.map +1 -1
  340. package/dist/mocks/msw/handlers/fileHandlers.js +25 -21
  341. package/dist/mocks/msw/handlers/fileHandlers.js.map +1 -1
  342. package/dist/mocks/msw/handlers/formTemplateHandlers.d.ts +2 -1
  343. package/dist/mocks/msw/handlers/formTemplateHandlers.d.ts.map +1 -1
  344. package/dist/mocks/msw/handlers/formTemplateHandlers.js +18 -18
  345. package/dist/mocks/msw/handlers/formTemplateHandlers.js.map +1 -1
  346. package/dist/mocks/msw/handlers/schemaHandlers.d.ts +10 -1
  347. package/dist/mocks/msw/handlers/schemaHandlers.d.ts.map +1 -1
  348. package/dist/mocks/msw/handlers/schemaHandlers.js +30 -7
  349. package/dist/mocks/msw/handlers/schemaHandlers.js.map +1 -1
  350. package/dist/mocks/msw/handlers/searchQueryHandlers.d.ts.map +1 -1
  351. package/dist/mocks/msw/handlers/searchQueryHandlers.js +24 -18
  352. package/dist/mocks/msw/handlers/searchQueryHandlers.js.map +1 -1
  353. package/dist/mocks/msw/handlers/tableQueryHandlers.d.ts.map +1 -1
  354. package/dist/mocks/msw/handlers/tableQueryHandlers.js +35 -16
  355. package/dist/mocks/msw/handlers/tableQueryHandlers.js.map +1 -1
  356. package/dist/mocks/msw/handlers/twoFactorEnrollmentHandlers.d.ts +8 -0
  357. package/dist/mocks/msw/handlers/twoFactorEnrollmentHandlers.d.ts.map +1 -0
  358. package/dist/mocks/msw/handlers/twoFactorEnrollmentHandlers.js +19 -0
  359. package/dist/mocks/msw/handlers/twoFactorEnrollmentHandlers.js.map +1 -0
  360. package/dist/style/abstracts/_cssVariables.scss +13 -0
  361. package/dist/style/components/_toasts.scss +10 -1
  362. package/dist/style/main.css +1 -1
  363. package/dist/synapse-queries/KeyFactory.d.ts +9 -3
  364. package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
  365. package/dist/synapse-queries/KeyFactory.js +17 -7
  366. package/dist/synapse-queries/KeyFactory.js.map +1 -1
  367. package/dist/synapse-queries/auth/index.d.ts +1 -0
  368. package/dist/synapse-queries/auth/index.d.ts.map +1 -1
  369. package/dist/synapse-queries/auth/index.js +2 -1
  370. package/dist/synapse-queries/auth/useUnbindOAuthProviderIdentity.d.ts +11 -0
  371. package/dist/synapse-queries/auth/useUnbindOAuthProviderIdentity.d.ts.map +1 -0
  372. package/dist/synapse-queries/auth/useUnbindOAuthProviderIdentity.js +19 -0
  373. package/dist/synapse-queries/auth/useUnbindOAuthProviderIdentity.js.map +1 -0
  374. package/dist/synapse-queries/dataaccess/index.d.ts +0 -1
  375. package/dist/synapse-queries/dataaccess/index.d.ts.map +1 -1
  376. package/dist/synapse-queries/dataaccess/index.js +3 -4
  377. package/dist/synapse-queries/dataaccess/useEDuc.d.ts +18 -0
  378. package/dist/synapse-queries/dataaccess/useEDuc.d.ts.map +1 -1
  379. package/dist/synapse-queries/dataaccess/useEDuc.js +33 -1
  380. package/dist/synapse-queries/dataaccess/useEDuc.js.map +1 -1
  381. package/dist/synapse-queries/file/useDirectUploadToS3.js +6 -6
  382. package/dist/synapse-queries/file/useFileHandle.d.ts +8 -0
  383. package/dist/synapse-queries/file/useFileHandle.d.ts.map +1 -1
  384. package/dist/synapse-queries/file/useFileHandle.js +15 -6
  385. package/dist/synapse-queries/file/useFileHandle.js.map +1 -1
  386. package/dist/synapse-queries/index.js +260 -257
  387. package/dist/synapse-queries/jsonschema/index.js +2 -2
  388. package/dist/synapse-queries/jsonschema/useCreateJsonSchema.d.ts +9 -0
  389. package/dist/synapse-queries/jsonschema/useCreateJsonSchema.d.ts.map +1 -0
  390. package/dist/synapse-queries/jsonschema/useCreateJsonSchema.js +22 -0
  391. package/dist/synapse-queries/jsonschema/useCreateJsonSchema.js.map +1 -0
  392. package/dist/synapse-queries/jsonschema/useSchema.d.ts +5 -0
  393. package/dist/synapse-queries/jsonschema/useSchema.d.ts.map +1 -1
  394. package/dist/synapse-queries/jsonschema/useSchema.js +9 -1
  395. package/dist/synapse-queries/jsonschema/useSchema.js.map +1 -1
  396. package/dist/testutils/vitest.setup.js +18 -9
  397. package/dist/testutils/vitest.setup.js.map +1 -1
  398. package/dist/tsconfig.build.tsbuildinfo +1 -1
  399. package/dist/utils/APIConstants.d.ts +2 -0
  400. package/dist/utils/APIConstants.d.ts.map +1 -1
  401. package/dist/utils/APIConstants.js +2 -2
  402. package/dist/utils/APIConstants.js.map +1 -1
  403. package/dist/utils/appendFinalQueryParamKey.d.ts.map +1 -1
  404. package/dist/utils/appendFinalQueryParamKey.js +4 -1
  405. package/dist/utils/appendFinalQueryParamKey.js.map +1 -1
  406. package/dist/utils/featureflag/FeatureFlags.d.ts +2 -0
  407. package/dist/utils/featureflag/FeatureFlags.d.ts.map +1 -1
  408. package/dist/utils/featureflag/FeatureFlags.js +1 -1
  409. package/dist/utils/featureflag/FeatureFlags.js.map +1 -1
  410. package/dist/utils/functions/ArrayUtils.d.ts +3 -0
  411. package/dist/utils/functions/ArrayUtils.d.ts.map +1 -1
  412. package/dist/utils/functions/ArrayUtils.js +7 -1
  413. package/dist/utils/functions/ArrayUtils.js.map +1 -1
  414. package/dist/utils/functions/toPascalCase.d.ts +6 -0
  415. package/dist/utils/functions/toPascalCase.d.ts.map +1 -0
  416. package/dist/utils/functions/toPascalCase.js +8 -0
  417. package/dist/utils/functions/toPascalCase.js.map +1 -0
  418. package/dist/utils/jsonschema/generateDataAccessSchema.d.ts +26 -0
  419. package/dist/utils/jsonschema/generateDataAccessSchema.d.ts.map +1 -0
  420. package/dist/utils/jsonschema/generateDataAccessSchema.js +28 -0
  421. package/dist/utils/jsonschema/generateDataAccessSchema.js.map +1 -0
  422. package/dist/utils/jsonschema/submissionContext.d.ts +91 -0
  423. package/dist/utils/jsonschema/submissionContext.d.ts.map +1 -0
  424. package/dist/utils/jsonschema/submissionContext.js +178 -0
  425. package/dist/utils/jsonschema/submissionContext.js.map +1 -0
  426. package/package.json +13 -10
  427. package/dist/components/AccessRequirement/AddConditionsForUseButton/AddConditionsForUseButton.d.ts +0 -6
  428. package/dist/components/AccessRequirement/AddConditionsForUseButton/AddConditionsForUseButton.d.ts.map +0 -1
  429. package/dist/components/AccessRequirement/AddConditionsForUseButton/AddConditionsForUseButton.js +0 -32
  430. package/dist/components/AccessRequirement/AddConditionsForUseButton/AddConditionsForUseButton.js.map +0 -1
  431. package/dist/components/entity/page/title_bar/TitleBarProperties.d.ts +0 -9
  432. package/dist/components/entity/page/title_bar/TitleBarProperties.d.ts.map +0 -1
  433. package/dist/components/entity/page/title_bar/TitleBarProperties.js +0 -24
  434. package/dist/components/entity/page/title_bar/TitleBarProperties.js.map +0 -1
  435. package/dist/synapse-queries/dataaccess/useGenerateDataAccessSchema.d.ts +0 -21
  436. package/dist/synapse-queries/dataaccess/useGenerateDataAccessSchema.d.ts.map +0 -1
  437. package/dist/synapse-queries/dataaccess/useGenerateDataAccessSchema.js +0 -34
  438. package/dist/synapse-queries/dataaccess/useGenerateDataAccessSchema.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"TwoFactorBackupCodes.js","names":[],"sources":["../../../src/components/Authentication/TwoFactorBackupCodes.tsx"],"sourcesContent":["import {\n LeftRightPanel,\n StyledOuterContainer,\n} from '@/components/styled/LeftRightPanel'\nimport { createRecoveryCodes } from '@/synapse-client/SynapseClient'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { useMediaPrintOnly } from '@/utils/hooks/useMediaPrintOnly'\nimport {\n Alert,\n Box,\n Button,\n IconButton,\n Typography,\n useTheme,\n} from '@mui/material'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client/util/SynapseClientError'\nimport { TwoFactorAuthRecoveryCodes } from '@sage-bionetworks/synapse-types'\nimport { useMutation } from '@tanstack/react-query'\nimport { useCallback, useEffect, useState } from 'react'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { displayToast } from '../ToastMessage/ToastMessage'\nimport { RecoveryCodeGrid } from './RecoveryCodeGrid'\nimport { RegenerateBackupCodesWarning } from './RegenerateBackupCodesWarning'\nimport { copyStringToClipboard } from '@/utils/functions/StringUtils'\n\nexport type TwoFactorBackupCodesProps = {\n /* Whether to show a warning before generating new codes, to prevent users from overwriting their existing codes */\n showReplaceOldCodesWarning?: boolean\n /* Invoked when the user decides not to generate new codes, or has acknowledged new codes. */\n onClose: () => void\n}\n\nexport default function TwoFactorBackupCodes(props: TwoFactorBackupCodesProps) {\n const { showReplaceOldCodesWarning, onClose } = props\n const theme = useTheme()\n const [hasConfirmedRegeneration, setHasConfirmedRegeneration] = useState(\n !showReplaceOldCodesWarning,\n )\n\n const { accessToken } = useSynapseContext()\n\n const {\n mutate: generateCodes,\n data: recoveryCodes,\n error,\n } = useMutation<TwoFactorAuthRecoveryCodes, SynapseClientError>({\n mutationFn: () => createRecoveryCodes(accessToken),\n onMutate: () => {\n setHasConfirmedRegeneration(true)\n },\n })\n\n // Generate codes on mount if no warning is shown\n useEffect(() => {\n if (!showReplaceOldCodesWarning) {\n generateCodes()\n }\n // Run on mount only\n // oxlint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const { visibleOnPrintClassName, hiddenOnPrintClassName } =\n useMediaPrintOnly()\n\n const copyCodesToClipboard = useCallback(() => {\n const codes = (recoveryCodes?.codes || []).join('\\n')\n copyStringToClipboard(codes).then(() => {\n displayToast('Recovery codes copied to clipboard', 'success')\n })\n }, [recoveryCodes])\n\n if (showReplaceOldCodesWarning && !hasConfirmedRegeneration) {\n return (\n <StyledOuterContainer sx={{ display: 'flex', flexDirection: 'column' }}>\n <RegenerateBackupCodesWarning\n onConfirm={generateCodes}\n onCancel={onClose}\n />\n </StyledOuterContainer>\n )\n }\n\n return (\n <LeftRightPanel\n className={visibleOnPrintClassName}\n leftContent={\n <Box\n sx={{\n py: 10,\n px: 8,\n height: '100%',\n position: 'relative',\n }}\n >\n <IconButton\n type=\"button\"\n onClick={onClose}\n className={hiddenOnPrintClassName}\n sx={{\n position: 'absolute',\n top: theme.spacing(2),\n left: theme.spacing(2),\n }}\n >\n <IconSvg\n icon=\"arrowBack\"\n wrap={false}\n sx={{ height: '24px', width: '24px' }}\n />\n </IconButton>\n <Typography variant=\"headline1\" sx={{ mt: 7 }}>\n Backup codes\n </Typography>\n {showReplaceOldCodesWarning && (\n <Alert\n severity=\"warning\"\n className={hiddenOnPrintClassName}\n sx={{\n my: 2,\n }}\n icon={false}\n >\n <strong>These new codes have replaced your old codes.</strong>{' '}\n Please save these codes and use them from now on.\n </Alert>\n )}\n <RecoveryCodeGrid recoveryCodes={recoveryCodes} />\n {error && (\n <Alert severity={'error'} sx={{ my: 2 }} icon={false}>\n {error.message}\n </Alert>\n )}\n <Box\n className={hiddenOnPrintClassName}\n sx={{\n display: 'grid',\n gridTemplateColumns: '1fr 1fr',\n gap: '10px',\n mb: '10px',\n }}\n >\n <Button\n variant={'outlined'}\n onClick={copyCodesToClipboard}\n disabled={!recoveryCodes}\n >\n Copy Codes\n </Button>\n <Button\n variant={'outlined'}\n disabled={!recoveryCodes}\n onClick={window.print}\n >\n Print Codes\n </Button>\n </Box>\n <Button\n variant={'contained'}\n className={hiddenOnPrintClassName}\n fullWidth\n disabled={!recoveryCodes}\n onClick={onClose}\n >\n Done\n </Button>\n </Box>\n }\n rightContent={\n <Box\n sx={{\n py: 10,\n height: '100%',\n background: `url(https://s3.amazonaws.com/static.synapse.org/images/twofactor-graphic.svg) no-repeat right bottom`,\n backgroundSize: '100%',\n }}\n >\n <Box\n sx={{\n mt: 7,\n px: 9,\n }}\n >\n <Typography variant=\"headline1\" sx={{ mb: 2.5 }}>\n Save these codes\n </Typography>\n <Typography variant=\"body1\" sx={{ my: 2 }}>\n You can use these 10 backup codes to access your account if you\n ever lose access to your authentication device.\n </Typography>\n <Typography variant=\"body1\" sx={{ my: 2 }}>\n Each code can only be used once.\n </Typography>\n </Box>\n </Box>\n }\n />\n )\n}\n"],"mappings":";;;;;;;;;;;;;;AAgCA,SAAwB,EAAqB,GAAkC;CAC7E,IAAM,EAAE,+BAA4B,eAAY,GAC1C,IAAQ,EAAS,GACjB,CAAC,GAA0B,KAA+B,EAC9D,CAAC,CACH,GAEM,EAAE,mBAAgB,EAAkB,GAEpC,EACJ,QAAQ,GACR,MAAM,GACN,aACE,EAA4D;EAC9D,kBAAkB,EAAoB,CAAW;EACjD,gBAAgB;GACd,EAA4B,EAAI;EAClC;CACF,CAAC;CAGD,QAAgB;EACd,AAAK,KACH,EAAc;CAIlB,GAAG,CAAC,CAAC;CAEL,IAAM,EAAE,4BAAyB,8BAC/B,EAAkB,GAEd,IAAuB,QAAkB;EAE7C,GADe,GAAe,SAAS,CAAC,GAAG,KAAK,IAC1B,CAAK,EAAE,WAAW;GACtC,EAAa,sCAAsC,SAAS;EAC9D,CAAC;CACH,GAAG,CAAC,CAAa,CAAC;CAalB,OAXI,KAA8B,CAAC,IAE/B,kBAAC,GAAD;EAAsB,IAAI;GAAE,SAAS;GAAQ,eAAe;EAAS;YACnE,kBAAC,GAAD;GACE,WAAW;GACX,UAAU;EACX,CAAA;CACmB,CAAA,IAKxB,kBAAC,GAAD;EACE,WAAW;EACX,aACE,kBAAC,GAAD;GACE,IAAI;IACF,IAAI;IACJ,IAAI;IACJ,QAAQ;IACR,UAAU;GACZ;aANF;IAQE,kBAAC,GAAD;KACE,MAAK;KACL,SAAS;KACT,WAAW;KACX,IAAI;MACF,UAAU;MACV,KAAK,EAAM,QAAQ,CAAC;MACpB,MAAM,EAAM,QAAQ,CAAC;KACvB;eAEA,kBAAC,GAAD;MACE,MAAK;MACL,MAAM;MACN,IAAI;OAAE,QAAQ;OAAQ,OAAO;MAAO;KACrC,CAAA;IACS,CAAA;IACZ,kBAAC,GAAD;KAAY,SAAQ;KAAY,IAAI,EAAE,IAAI,EAAE;eAAG;IAEnC,CAAA;IACX,KACC,kBAAC,GAAD;KACE,UAAS;KACT,WAAW;KACX,IAAI,EACF,IAAI,EACN;KACA,MAAM;eANR;MAQE,kBAAC,UAAD,EAAA,UAAQ,gDAAqD,CAAA;MAAE;MAAI;KAE9D;;IAET,kBAAC,GAAD,EAAiC,iBAAgB,CAAA;IAChD,KACC,kBAAC,GAAD;KAAO,UAAU;KAAS,IAAI,EAAE,IAAI,EAAE;KAAG,MAAM;eAC5C,EAAM;IACF,CAAA;IAET,kBAAC,GAAD;KACE,WAAW;KACX,IAAI;MACF,SAAS;MACT,qBAAqB;MACrB,KAAK;MACL,IAAI;KACN;eAPF,CASE,kBAAC,GAAD;MACE,SAAS;MACT,SAAS;MACT,UAAU,CAAC;gBACZ;KAEO,CAAA,GACR,kBAAC,GAAD;MACE,SAAS;MACT,UAAU,CAAC;MACX,SAAS,OAAO;gBACjB;KAEO,CAAA,CACL;;IACL,kBAAC,GAAD;KACE,SAAS;KACT,WAAW;KACX,WAAA;KACA,UAAU,CAAC;KACX,SAAS;eACV;IAEO,CAAA;GACL;;EAEP,cACE,kBAAC,GAAD;GACE,IAAI;IACF,IAAI;IACJ,QAAQ;IACR,YAAY;IACZ,gBAAgB;GAClB;aAEA,kBAAC,GAAD;IACE,IAAI;KACF,IAAI;KACJ,IAAI;IACN;cAJF;KAME,kBAAC,GAAD;MAAY,SAAQ;MAAY,IAAI,EAAE,IAAI,IAAI;gBAAG;KAErC,CAAA;KACZ,kBAAC,GAAD;MAAY,SAAQ;MAAQ,IAAI,EAAE,IAAI,EAAE;gBAAG;KAG/B,CAAA;KACZ,kBAAC,GAAD;MAAY,SAAQ;MAAQ,IAAI,EAAE,IAAI,EAAE;gBAAG;KAE/B,CAAA;IACT;;EACF,CAAA;CAER,CAAA;AAEL"}
1
+ {"version":3,"file":"TwoFactorBackupCodes.js","names":[],"sources":["../../../src/components/Authentication/TwoFactorBackupCodes.tsx"],"sourcesContent":["import {\n LeftRightPanel,\n StyledOuterContainer,\n} from '@/components/styled/LeftRightPanel'\nimport { createRecoveryCodes } from '@/synapse-client/SynapseClient'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { useMediaPrintOnly } from '@/utils/hooks/useMediaPrintOnly'\nimport {\n Alert,\n Box,\n Button,\n IconButton,\n Typography,\n useTheme,\n} from '@mui/material'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client/util/SynapseClientError'\nimport { TwoFactorAuthRecoveryCodes } from '@sage-bionetworks/synapse-types'\nimport { useMutation } from '@tanstack/react-query'\nimport { useCallback, useEffect, useState } from 'react'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { displayToast } from '../ToastMessage/ToastMessage'\nimport { RecoveryCodeGrid } from './RecoveryCodeGrid'\nimport { RegenerateBackupCodesWarning } from './RegenerateBackupCodesWarning'\nimport { copyStringToClipboard } from '@/utils/functions/StringUtils'\n\nexport type TwoFactorBackupCodesProps = {\n /* Whether to show a warning before generating new codes, to prevent users from overwriting their existing codes */\n showReplaceOldCodesWarning?: boolean\n /* Invoked when the user decides not to generate new codes, or has acknowledged new codes. */\n onClose: () => void\n}\n\nexport default function TwoFactorBackupCodes(props: TwoFactorBackupCodesProps) {\n const { showReplaceOldCodesWarning, onClose } = props\n const theme = useTheme()\n const [hasConfirmedRegeneration, setHasConfirmedRegeneration] = useState(\n !showReplaceOldCodesWarning,\n )\n\n const { accessToken } = useSynapseContext()\n\n const {\n mutate: generateCodes,\n data: recoveryCodes,\n error,\n } = useMutation<TwoFactorAuthRecoveryCodes, SynapseClientError>({\n mutationFn: () => createRecoveryCodes(accessToken),\n onMutate: () => {\n setHasConfirmedRegeneration(true)\n },\n })\n\n // Generate codes on mount if no warning is shown\n useEffect(() => {\n if (!showReplaceOldCodesWarning) {\n generateCodes()\n }\n // Run on mount only\n // oxlint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const { visibleOnPrintClassName, hiddenOnPrintClassName } =\n useMediaPrintOnly()\n\n const copyCodesToClipboard = useCallback(() => {\n const codes = (recoveryCodes?.codes || []).join('\\n')\n copyStringToClipboard(codes).then(() => {\n displayToast('Recovery codes copied to clipboard', 'success')\n })\n }, [recoveryCodes])\n\n if (showReplaceOldCodesWarning && !hasConfirmedRegeneration) {\n return (\n <StyledOuterContainer sx={{ display: 'flex', flexDirection: 'column' }}>\n <RegenerateBackupCodesWarning\n onConfirm={generateCodes}\n onCancel={onClose}\n />\n </StyledOuterContainer>\n )\n }\n\n return (\n <LeftRightPanel\n className={visibleOnPrintClassName}\n leftContent={\n <Box\n sx={{\n py: { xs: '10px', md: 10 },\n px: { xs: '10px', md: 8 },\n height: '100%',\n }}\n >\n <IconButton\n type=\"button\"\n onClick={onClose}\n className={hiddenOnPrintClassName}\n sx={{\n position: 'absolute',\n top: { xs: 0, md: theme.spacing(2) },\n left: { xs: 0, md: theme.spacing(2) },\n }}\n >\n <IconSvg\n icon=\"arrowBack\"\n wrap={false}\n sx={{ height: '24px', width: '24px' }}\n />\n </IconButton>\n <Typography variant=\"headline1\" sx={{ mt: { xs: 0, md: 7 } }}>\n Backup codes\n </Typography>\n {showReplaceOldCodesWarning && (\n <Alert\n severity=\"warning\"\n className={hiddenOnPrintClassName}\n sx={{\n my: 2,\n }}\n icon={false}\n >\n <strong>These new codes have replaced your old codes.</strong>{' '}\n Please save these codes and use them from now on.\n </Alert>\n )}\n <RecoveryCodeGrid recoveryCodes={recoveryCodes} />\n {error && (\n <Alert severity={'error'} sx={{ my: 2 }} icon={false}>\n {error.message}\n </Alert>\n )}\n <Box\n className={hiddenOnPrintClassName}\n sx={{\n display: 'grid',\n gridTemplateColumns: '1fr 1fr',\n gap: '10px',\n mb: '10px',\n }}\n >\n <Button\n variant={'outlined'}\n onClick={copyCodesToClipboard}\n disabled={!recoveryCodes}\n >\n Copy Codes\n </Button>\n <Button\n variant={'outlined'}\n disabled={!recoveryCodes}\n onClick={window.print}\n >\n Print Codes\n </Button>\n </Box>\n <Button\n variant={'contained'}\n className={hiddenOnPrintClassName}\n fullWidth\n disabled={!recoveryCodes}\n onClick={onClose}\n >\n Done\n </Button>\n </Box>\n }\n rightContent={\n <Box\n sx={{\n padding: { xs: '60px 0 0 0', md: theme.spacing(10, 0) },\n height: '100%',\n background: {\n xs: 'none',\n md: `url(https://s3.amazonaws.com/static.synapse.org/images/twofactor-graphic.svg) no-repeat right bottom`,\n },\n backgroundSize: '100%',\n }}\n >\n <Box\n sx={{\n mt: { xs: 0, md: 7 },\n px: { xs: '10px', md: 9 },\n }}\n >\n <Typography\n variant=\"headline1\"\n sx={theme => ({\n mb: 2.5,\n [theme.breakpoints.down('md')]: { fontSize: '18px' },\n })}\n >\n Save these codes\n </Typography>\n <Typography\n variant=\"body1\"\n sx={{\n my: 2,\n }}\n >\n You can use these 10 backup codes to access your account if you\n ever lose access to your authentication device.\n </Typography>\n <Typography\n variant=\"body1\"\n sx={{\n my: 2,\n }}\n >\n Each code can only be used once.\n </Typography>\n </Box>\n </Box>\n }\n />\n )\n}\n"],"mappings":";;;;;;;;;;;;;;AAgCA,SAAwB,EAAqB,GAAkC;CAC7E,IAAM,EAAE,+BAA4B,eAAY,GAC1C,IAAQ,EAAS,GACjB,CAAC,GAA0B,KAA+B,EAC9D,CAAC,CACH,GAEM,EAAE,mBAAgB,EAAkB,GAEpC,EACJ,QAAQ,GACR,MAAM,GACN,aACE,EAA4D;EAC9D,kBAAkB,EAAoB,CAAW;EACjD,gBAAgB;GACd,EAA4B,EAAI;EAClC;CACF,CAAC;CAGD,QAAgB;EACd,AAAK,KACH,EAAc;CAIlB,GAAG,CAAC,CAAC;CAEL,IAAM,EAAE,4BAAyB,8BAC/B,EAAkB,GAEd,IAAuB,QAAkB;EAE7C,GADe,GAAe,SAAS,CAAC,GAAG,KAAK,IAC1B,CAAK,EAAE,WAAW;GACtC,EAAa,sCAAsC,SAAS;EAC9D,CAAC;CACH,GAAG,CAAC,CAAa,CAAC;CAalB,OAXI,KAA8B,CAAC,IAE/B,kBAAC,GAAD;EAAsB,IAAI;GAAE,SAAS;GAAQ,eAAe;EAAS;YACnE,kBAAC,GAAD;GACE,WAAW;GACX,UAAU;EACX,CAAA;CACmB,CAAA,IAKxB,kBAAC,GAAD;EACE,WAAW;EACX,aACE,kBAAC,GAAD;GACE,IAAI;IACF,IAAI;KAAE,IAAI;KAAQ,IAAI;IAAG;IACzB,IAAI;KAAE,IAAI;KAAQ,IAAI;IAAE;IACxB,QAAQ;GACV;aALF;IAOE,kBAAC,GAAD;KACE,MAAK;KACL,SAAS;KACT,WAAW;KACX,IAAI;MACF,UAAU;MACV,KAAK;OAAE,IAAI;OAAG,IAAI,EAAM,QAAQ,CAAC;MAAE;MACnC,MAAM;OAAE,IAAI;OAAG,IAAI,EAAM,QAAQ,CAAC;MAAE;KACtC;eAEA,kBAAC,GAAD;MACE,MAAK;MACL,MAAM;MACN,IAAI;OAAE,QAAQ;OAAQ,OAAO;MAAO;KACrC,CAAA;IACS,CAAA;IACZ,kBAAC,GAAD;KAAY,SAAQ;KAAY,IAAI,EAAE,IAAI;MAAE,IAAI;MAAG,IAAI;KAAE,EAAE;eAAG;IAElD,CAAA;IACX,KACC,kBAAC,GAAD;KACE,UAAS;KACT,WAAW;KACX,IAAI,EACF,IAAI,EACN;KACA,MAAM;eANR;MAQE,kBAAC,UAAD,EAAA,UAAQ,gDAAqD,CAAA;MAAE;MAAI;KAE9D;;IAET,kBAAC,GAAD,EAAiC,iBAAgB,CAAA;IAChD,KACC,kBAAC,GAAD;KAAO,UAAU;KAAS,IAAI,EAAE,IAAI,EAAE;KAAG,MAAM;eAC5C,EAAM;IACF,CAAA;IAET,kBAAC,GAAD;KACE,WAAW;KACX,IAAI;MACF,SAAS;MACT,qBAAqB;MACrB,KAAK;MACL,IAAI;KACN;eAPF,CASE,kBAAC,GAAD;MACE,SAAS;MACT,SAAS;MACT,UAAU,CAAC;gBACZ;KAEO,CAAA,GACR,kBAAC,GAAD;MACE,SAAS;MACT,UAAU,CAAC;MACX,SAAS,OAAO;gBACjB;KAEO,CAAA,CACL;;IACL,kBAAC,GAAD;KACE,SAAS;KACT,WAAW;KACX,WAAA;KACA,UAAU,CAAC;KACX,SAAS;eACV;IAEO,CAAA;GACL;;EAEP,cACE,kBAAC,GAAD;GACE,IAAI;IACF,SAAS;KAAE,IAAI;KAAc,IAAI,EAAM,QAAQ,IAAI,CAAC;IAAE;IACtD,QAAQ;IACR,YAAY;KACV,IAAI;KACJ,IAAI;IACN;IACA,gBAAgB;GAClB;aAEA,kBAAC,GAAD;IACE,IAAI;KACF,IAAI;MAAE,IAAI;MAAG,IAAI;KAAE;KACnB,IAAI;MAAE,IAAI;MAAQ,IAAI;KAAE;IAC1B;cAJF;KAME,kBAAC,GAAD;MACE,SAAQ;MACR,KAAI,OAAU;OACZ,IAAI;QACH,EAAM,YAAY,KAAK,IAAI,IAAI,EAAE,UAAU,OAAO;MACrD;gBACD;KAEW,CAAA;KACZ,kBAAC,GAAD;MACE,SAAQ;MACR,IAAI,EACF,IAAI,EACN;gBACD;KAGW,CAAA;KACZ,kBAAC,GAAD;MACE,SAAQ;MACR,IAAI,EACF,IAAI,EACN;gBACD;KAEW,CAAA;IACT;;EACF,CAAA;CAER,CAAA;AAEL"}
@@ -1 +1 @@
1
- {"version":3,"file":"TwoFactorEnrollmentForm.d.ts","sourceRoot":"","sources":["../../../src/components/Authentication/TwoFactorEnrollmentForm.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AAW5D;;;;GAIG;AACH,iBAAS,YAAY,CAAC,MAAM,EAAE,UAAU,UAEvC;AA6BD,eAAO,MAAM,oBAAoB,+HAC6F,CAAA;AAE9H,MAAM,MAAM,4BAA4B,GAAG;IACzC,UAAU,EAAE,UAAU,CAAA;IACtB,4BAA4B,EAAE,MAAM,IAAI,CAAA;IACxC,aAAa,EAAE,MAAM,IAAI,CAAA;CAC1B,CAAA;AAED,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAC7C,KAAK,EAAE,4BAA4B,2CAgOpC;AAED,eAAO,MAAM,yBAAyB;;CAAmB,CAAA"}
1
+ {"version":3,"file":"TwoFactorEnrollmentForm.d.ts","sourceRoot":"","sources":["../../../src/components/Authentication/TwoFactorEnrollmentForm.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AAY5D;;;;GAIG;AACH,iBAAS,YAAY,CAAC,MAAM,EAAE,UAAU,UAEvC;AAiCD,eAAO,MAAM,oBAAoB,+HAC6F,CAAA;AAE9H,MAAM,MAAM,4BAA4B,GAAG;IACzC,UAAU,EAAE,UAAU,CAAA;IACtB,4BAA4B,EAAE,MAAM,IAAI,CAAA;IACxC,aAAa,EAAE,MAAM,IAAI,CAAA;CAC1B,CAAA;AAED,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAC7C,KAAK,EAAE,4BAA4B,2CAmPpC;AAED,eAAO,MAAM,yBAAyB;;CAAmB,CAAA"}
@@ -1,27 +1,30 @@
1
- import e from "../FullWidthAlert/FullWidthAlert.js";
2
- import "./Constants.js";
3
- import { SynapseSpinner as t } from "../LoadingScreen/LoadingScreen.js";
4
- import { useFinishTwoFactorEnrollment as n } from "../../synapse-queries/auth/useTwoFactorEnrollment.js";
5
- import r from "../IconSvg/IconSvg.js";
6
- import i from "../TextField/TextField.js";
7
- import { StyledOuterContainer as a } from "../styled/LeftRightPanel.js";
8
- import o from "./TwoFactorSecretDialog.js";
9
- import { useEffect as s, useRef as c, useState as l } from "react";
10
- import { Box as u, Button as d, Divider as f, IconButton as p, Link as m, Paper as h, Stack as g, Typography as _, styled as v } from "@mui/material";
11
- import { jsx as y, jsxs as b } from "react/jsx-runtime";
12
- import * as x from "qrcode";
1
+ import { displayToast as e } from "../ToastMessage/ToastMessage.js";
2
+ import { NUMERIC_CODE_HTML_INPUT_PROPS as t } from "./Constants.js";
3
+ import { SynapseSpinner as n } from "../LoadingScreen/LoadingScreen.js";
4
+ import { useFinishTwoFactorEnrollment as r } from "../../synapse-queries/auth/useTwoFactorEnrollment.js";
5
+ import i from "../IconSvg/IconSvg.js";
6
+ import a from "../TextField/TextField.js";
7
+ import { StyledOuterContainer as o } from "../styled/LeftRightPanel.js";
8
+ import s from "./TwoFactorSecretDialog.js";
9
+ import { useEffect as c, useId as l, useRef as u, useState as d } from "react";
10
+ import { Box as f, Button as p, Divider as m, FormHelperText as h, IconButton as g, Link as _, Paper as v, Stack as y, Typography as b, styled as x } from "@mui/material";
11
+ import { jsx as S, jsxs as C } from "react/jsx-runtime";
12
+ import * as w from "qrcode";
13
13
  //#region src/components/Authentication/TwoFactorEnrollmentForm.tsx
14
- var { toCanvas: S } = x;
15
- function C(e) {
14
+ var { toCanvas: T } = w;
15
+ function E(e) {
16
16
  return `otpauth://totp/Synapse:${e.username}?secret=${e.secret}&issuer=Sage%20Bionetworks&algorithm=${e.alg}&digits=${e.digits}&period=${e.period}`;
17
17
  }
18
- var w = v((e) => /* @__PURE__ */ y(u, {
18
+ function D(e) {
19
+ return e.reason.toLowerCase().includes("invalid totp code");
20
+ }
21
+ var O = x((e) => /* @__PURE__ */ S(f, {
19
22
  sx: {
20
23
  my: 3,
21
24
  ...e.sx
22
25
  },
23
26
  ...e
24
- }), { label: "Section" })(() => ({})), T = v(u, { label: "SectionInnerGrid" })(({ theme: e }) => ({
27
+ }), { label: "Section" })(() => ({})), k = x(f, { label: "SectionInnerGrid" })(({ theme: e }) => ({
25
28
  display: "grid",
26
29
  gridTemplateColumns: "auto 200px",
27
30
  columnGap: e.spacing(5),
@@ -29,19 +32,24 @@ var w = v((e) => /* @__PURE__ */ y(u, {
29
32
  gridTemplateColumns: "1fr",
30
33
  gap: "18px"
31
34
  }
32
- })), E = "https://help.synapse.org/docs/Managing-Your-Account.2055405596.html#Adding-Two-Factor-Authentication-(2FA)-to-your-account";
33
- function D(v) {
34
- let { onTwoFactorEnrollmentSuccess: x, onBackClicked: D, totpSecret: O } = v, [k, A] = l(""), [j, M] = l(!1), [N, P] = l(!1), F = c(null), { mutate: I, isPending: L, error: R } = n({ onSuccess: x });
35
- return s(() => {
35
+ })), A = "https://help.synapse.org/docs/Managing-Your-Account.2055405596.html#Adding-Two-Factor-Authentication-(2FA)-to-your-account";
36
+ function j(x) {
37
+ let { onTwoFactorEnrollmentSuccess: w, onBackClicked: j, totpSecret: M } = x, [N, P] = d(""), [F, I] = d(!1), [L, R] = d(!1), z = u(null), B = l(), { mutate: V, isPending: H, error: U, reset: W } = r({
38
+ onSuccess: w,
39
+ onError: (t) => {
40
+ D(t) || e(t.reason, "danger");
41
+ }
42
+ }), G = U != null && D(U);
43
+ return c(() => {
36
44
  async function e() {
37
- O && F.current && (await S(F.current, C(O), {
45
+ M && z.current && (await T(z.current, E(M), {
38
46
  version: 10,
39
47
  margin: 0,
40
48
  scale: 3.5
41
- }), M(!0));
49
+ }), I(!0));
42
50
  }
43
51
  e();
44
- }, [O]), /* @__PURE__ */ y(a, { children: /* @__PURE__ */ b(h, {
52
+ }, [M]), /* @__PURE__ */ S(o, { children: /* @__PURE__ */ C(v, {
45
53
  sx: {
46
54
  position: "relative",
47
55
  width: {
@@ -53,17 +61,17 @@ function D(v) {
53
61
  mx: "auto"
54
62
  },
55
63
  children: [
56
- D && /* @__PURE__ */ y(p, {
64
+ j && /* @__PURE__ */ S(g, {
57
65
  type: "button",
58
66
  onClick: () => {
59
- D();
67
+ j();
60
68
  },
61
69
  sx: (e) => ({
62
70
  position: "absolute",
63
71
  top: e.spacing(2),
64
72
  left: e.spacing(2)
65
73
  }),
66
- children: /* @__PURE__ */ y(r, {
74
+ children: /* @__PURE__ */ S(i, {
67
75
  icon: "arrowBack",
68
76
  wrap: !1,
69
77
  sx: {
@@ -72,11 +80,11 @@ function D(v) {
72
80
  }
73
81
  })
74
82
  }),
75
- /* @__PURE__ */ b(w, { children: [/* @__PURE__ */ y(_, {
83
+ /* @__PURE__ */ C(O, { children: [/* @__PURE__ */ S(b, {
76
84
  variant: "headline2",
77
85
  sx: { mb: 3 },
78
86
  children: "Activate Two-factor Authentication"
79
- }), /* @__PURE__ */ b(_, {
87
+ }), /* @__PURE__ */ C(b, {
80
88
  variant: "body1",
81
89
  children: [
82
90
  "After setting up 2FA, you’ll use an authenticator app as part of your login process, in addition to your existing password. If you log in using your Google",
@@ -84,53 +92,53 @@ function D(v) {
84
92
  " or ORCiD account, you may need to use 2FA as part of",
85
93
  "that process as well.",
86
94
  " ",
87
- /* @__PURE__ */ y(m, {
88
- href: E,
95
+ /* @__PURE__ */ S(_, {
96
+ href: A,
89
97
  children: "Learn more about 2FA"
90
98
  }),
91
99
  "."
92
100
  ]
93
101
  })] }),
94
- /* @__PURE__ */ y(w, { children: /* @__PURE__ */ b(T, { children: [/* @__PURE__ */ b(u, { children: [/* @__PURE__ */ y(_, {
102
+ /* @__PURE__ */ S(O, { children: /* @__PURE__ */ C(k, { children: [/* @__PURE__ */ C(f, { children: [/* @__PURE__ */ S(b, {
95
103
  variant: "body1",
96
104
  sx: { fontWeight: 700 },
97
105
  children: "Step 1. Get one of these apps"
98
- }), /* @__PURE__ */ y(_, {
106
+ }), /* @__PURE__ */ S(b, {
99
107
  variant: "body1",
100
108
  children: "Download and install one of these authentication apps to set up 2FA on your mobile device, tablet, or desktop. If you have one of these apps already installed, you can skip this step."
101
- })] }), /* @__PURE__ */ b(g, {
109
+ })] }), /* @__PURE__ */ C(y, {
102
110
  sx: (e) => ({
103
111
  justifyContent: "space-between",
104
112
  flexShrink: 0,
105
113
  [e.breakpoints.down("sm")]: { gap: "20px" }
106
114
  }),
107
115
  children: [
108
- /* @__PURE__ */ y(m, {
116
+ /* @__PURE__ */ S(_, {
109
117
  href: "https://authy.com/download/",
110
118
  children: "Authy"
111
119
  }),
112
- /* @__PURE__ */ y(m, {
120
+ /* @__PURE__ */ S(_, {
113
121
  href: "https://duo.com/product/multi-factor-authentication-mfa/duo-mobile-app",
114
122
  children: "DUO Mobile"
115
123
  }),
116
- /* @__PURE__ */ y(m, {
124
+ /* @__PURE__ */ S(_, {
117
125
  href: "https://googleauthenticator.net/",
118
126
  children: "Google Authenticator"
119
127
  }),
120
- /* @__PURE__ */ y(m, {
128
+ /* @__PURE__ */ S(_, {
121
129
  href: "https://www.microsoft.com/en-us/security/mobile-authenticator-app",
122
130
  children: "Microsoft Authenticator"
123
131
  })
124
132
  ]
125
133
  })] }) }),
126
- /* @__PURE__ */ y(f, {}),
127
- /* @__PURE__ */ y(w, { children: /* @__PURE__ */ b(T, { children: [/* @__PURE__ */ b(u, { children: [
128
- /* @__PURE__ */ y(_, {
134
+ /* @__PURE__ */ S(m, {}),
135
+ /* @__PURE__ */ S(O, { children: /* @__PURE__ */ C(k, { children: [/* @__PURE__ */ C(f, { children: [
136
+ /* @__PURE__ */ S(b, {
129
137
  variant: "body1",
130
138
  sx: { fontWeight: 700 },
131
139
  children: "Step 2. Scan the QR Code"
132
140
  }),
133
- /* @__PURE__ */ b(_, {
141
+ /* @__PURE__ */ C(b, {
134
142
  component: "ol",
135
143
  variant: "body1",
136
144
  sx: {
@@ -138,81 +146,86 @@ function D(v) {
138
146
  my: 1
139
147
  },
140
148
  children: [
141
- /* @__PURE__ */ y("li", { children: "Open your authenticator app" }),
142
- /* @__PURE__ */ y("li", { children: "Tap the \"+\" button" }),
143
- /* @__PURE__ */ y("li", { children: "Use your camera to scan the image to the right" })
149
+ /* @__PURE__ */ S("li", { children: "Open your authenticator app" }),
150
+ /* @__PURE__ */ S("li", { children: "Tap the \"+\" button" }),
151
+ /* @__PURE__ */ S("li", { children: "Use your camera to scan the image to the right" })
144
152
  ]
145
153
  }),
146
- /* @__PURE__ */ y(m, {
154
+ /* @__PURE__ */ S(_, {
147
155
  onClick: () => {
148
- P(!0);
156
+ R(!0);
149
157
  },
150
158
  children: "Can't use your camera?"
151
159
  }),
152
- /* @__PURE__ */ y(o, {
153
- secret: O?.secret ?? "",
154
- open: N,
155
- onClose: () => P(!1)
160
+ /* @__PURE__ */ S(s, {
161
+ secret: M?.secret ?? "",
162
+ open: L,
163
+ onClose: () => R(!1)
156
164
  })
157
- ] }), /* @__PURE__ */ b(u, {
165
+ ] }), /* @__PURE__ */ C(f, {
158
166
  sx: {
159
167
  display: "flex",
160
168
  justifyContent: "center",
161
169
  alignItems: "middle",
162
170
  height: "auto"
163
171
  },
164
- children: [!j && /* @__PURE__ */ y(t, { size: 50 }), /* @__PURE__ */ y("canvas", {
165
- style: { display: j ? void 0 : "none" },
166
- ref: F
172
+ children: [!F && /* @__PURE__ */ S(n, { size: 50 }), /* @__PURE__ */ S("canvas", {
173
+ style: { display: F ? void 0 : "none" },
174
+ ref: z
167
175
  })]
168
176
  })] }) }),
169
- /* @__PURE__ */ y(f, {}),
170
- /* @__PURE__ */ y(w, { children: /* @__PURE__ */ b(T, { children: [/* @__PURE__ */ b(u, { children: [/* @__PURE__ */ y(_, {
177
+ /* @__PURE__ */ S(m, {}),
178
+ /* @__PURE__ */ S(O, { children: /* @__PURE__ */ C(k, { children: [/* @__PURE__ */ C(f, { children: [/* @__PURE__ */ S(b, {
171
179
  variant: "body1",
172
180
  sx: { fontWeight: 700 },
173
181
  children: "Step 3. Enter the Verification Code"
174
- }), /* @__PURE__ */ y(_, {
182
+ }), /* @__PURE__ */ S(b, {
175
183
  variant: "body1",
176
184
  children: "After scanning in the QR code in step 2, your app will provide a 6-digit code. Enter it in in the field to the right."
177
- })] }), /* @__PURE__ */ y("form", {
185
+ })] }), /* @__PURE__ */ C("form", {
178
186
  onSubmit: (e) => {
179
- e.preventDefault(), I({
180
- secretId: O.secretId,
181
- totp: k
187
+ e.preventDefault(), V({
188
+ secretId: M.secretId,
189
+ totp: N
182
190
  });
183
191
  },
184
- children: /* @__PURE__ */ b(g, {
192
+ children: [/* @__PURE__ */ C(y, {
185
193
  direction: "row",
186
194
  sx: {
187
195
  gap: 2,
188
196
  height: "48px"
189
197
  },
190
- children: [/* @__PURE__ */ y(i, {
198
+ children: [/* @__PURE__ */ S(a, {
191
199
  autoFocus: !0,
192
- slotProps: { htmlInput: { maxLength: O?.digits } },
193
- value: k,
200
+ slotProps: { htmlInput: {
201
+ ...t,
202
+ maxLength: M?.digits,
203
+ "aria-describedby": G ? B : void 0
204
+ } },
205
+ value: N,
206
+ error: G,
194
207
  onChange: (e) => {
195
- A(e.target.value);
208
+ U && W(), P(e.target.value);
196
209
  }
197
- }), /* @__PURE__ */ y(d, {
210
+ }), /* @__PURE__ */ S(p, {
198
211
  type: "submit",
199
212
  variant: "contained",
200
213
  sx: { flexShrink: 0 },
201
- disabled: L || k.length != O?.digits,
214
+ disabled: H || N.length != M?.digits,
202
215
  children: "Activate"
203
216
  })]
204
- })
205
- })] }) }),
206
- R && /* @__PURE__ */ y(e, {
207
- variant: "danger",
208
- isGlobal: !1,
209
- description: R.reason.toLowerCase().includes("invalid totp code") ? `${R.reason}. Please ensure automatic date and time is enabled in your device settings and try again.` : R.reason
210
- })
217
+ }), G && /* @__PURE__ */ S(h, {
218
+ id: B,
219
+ error: !0,
220
+ sx: { mt: 1 },
221
+ children: `${U.reason}. Please ensure automatic date and time is enabled in your device settings and try again.`
222
+ })]
223
+ })] }) })
211
224
  ]
212
225
  }) });
213
226
  }
214
- var O = { toOtpAuthUrl: C };
227
+ var M = { toOtpAuthUrl: E };
215
228
  //#endregion
216
- export { O as EXPORTED_FOR_UNIT_TESTING, E as TWO_FACTOR_DOCS_LINK, D as default };
229
+ export { M as EXPORTED_FOR_UNIT_TESTING, A as TWO_FACTOR_DOCS_LINK, j as default };
217
230
 
218
231
  //# sourceMappingURL=TwoFactorEnrollmentForm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TwoFactorEnrollmentForm.js","names":[],"sources":["../../../src/components/Authentication/TwoFactorEnrollmentForm.tsx"],"sourcesContent":["import { StyledOuterContainer } from '@/components/styled/LeftRightPanel'\nimport { TOTP_CLOCK_SKEW_ERROR_APPENDAGE } from '@/components/Authentication/Constants'\nimport { useFinishTwoFactorEnrollment } from '@/synapse-queries/auth/useTwoFactorEnrollment'\nimport { StyledComponent } from '@emotion/styled'\nimport {\n Box,\n BoxProps,\n Button,\n Divider,\n IconButton,\n Link,\n Paper,\n Stack,\n styled,\n Typography,\n} from '@mui/material'\nimport { TotpSecret } from '@sage-bionetworks/synapse-types'\nimport * as qrcode from 'qrcode'\n// qrcode is CJS-only; use namespace import for Vite dev mode CJS interop.\nconst { toCanvas } = qrcode\nimport { useEffect, useRef, useState } from 'react'\nimport FullWidthAlert from '../FullWidthAlert/FullWidthAlert'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { SynapseSpinner } from '../LoadingScreen/LoadingScreen'\nimport TextField from '../TextField/TextField'\nimport TwoFactorSecretDialog from './TwoFactorSecretDialog'\n\n/**\n * Returns a URL that can be used to generate a QR code that 2FA authenticator apps can interpret.\n * This uses the username fro TotpSecret to create the friendly name for the account in the authenticator app.\n * @param secret\n */\nfunction toOtpAuthUrl(secret: TotpSecret) {\n return `otpauth://totp/Synapse:${secret.username}?secret=${secret.secret}&issuer=Sage%20Bionetworks&algorithm=${secret.alg}&digits=${secret.digits}&period=${secret.period}`\n}\n\nconst Section: StyledComponent<BoxProps> = styled(\n (props: BoxProps) => (\n <Box\n sx={{\n my: 3,\n ...props.sx,\n }}\n {...props}\n />\n ),\n {\n label: 'Section',\n },\n)(() => ({}))\n\nconst SectionInnerGrid = styled(Box, { label: 'SectionInnerGrid' })(\n ({ theme }) => ({\n display: 'grid',\n gridTemplateColumns: 'auto 200px',\n columnGap: theme.spacing(5),\n [theme.breakpoints.down('sm')]: {\n gridTemplateColumns: '1fr',\n gap: '18px',\n },\n }),\n)\n\nexport const TWO_FACTOR_DOCS_LINK =\n 'https://help.synapse.org/docs/Managing-Your-Account.2055405596.html#Adding-Two-Factor-Authentication-(2FA)-to-your-account'\n\nexport type TwoFactorEnrollmentFormProps = {\n totpSecret: TotpSecret\n onTwoFactorEnrollmentSuccess: () => void\n onBackClicked: () => void\n}\n\nexport default function TwoFactorEnrollmentForm(\n props: TwoFactorEnrollmentFormProps,\n) {\n const { onTwoFactorEnrollmentSuccess, onBackClicked, totpSecret } = props\n\n const [totp, setTotp] = useState('')\n const [hasQrCode, setHasQrCode] = useState(false)\n const [showSecretInModal, setShowSecretInModal] = useState(false)\n const qrCodeCanvasElement = useRef<HTMLCanvasElement>(null)\n\n const {\n mutate: finishEnrollment,\n isPending: isFinishingEnrollment,\n error,\n } = useFinishTwoFactorEnrollment({\n onSuccess: onTwoFactorEnrollmentSuccess,\n })\n\n useEffect(() => {\n async function createQrCode() {\n if (totpSecret && qrCodeCanvasElement.current) {\n await toCanvas(qrCodeCanvasElement.current, toOtpAuthUrl(totpSecret), {\n version: 10,\n margin: 0,\n scale: 3.5,\n })\n setHasQrCode(true)\n }\n }\n void createQrCode()\n }, [totpSecret])\n\n return (\n <StyledOuterContainer>\n <Paper\n sx={{\n position: 'relative',\n width: { xs: '100%', md: '800px' },\n py: 6.5,\n px: 8,\n mx: 'auto',\n }}\n >\n {onBackClicked && (\n <IconButton\n type=\"button\"\n onClick={() => {\n onBackClicked()\n }}\n sx={theme => ({\n position: 'absolute',\n top: theme.spacing(2),\n left: theme.spacing(2),\n })}\n >\n <IconSvg\n icon=\"arrowBack\"\n wrap={false}\n sx={{ height: '24px', width: '24px' }}\n />\n </IconButton>\n )}\n <Section>\n <Typography variant=\"headline2\" sx={{ mb: 3 }}>\n Activate Two-factor Authentication\n </Typography>\n <Typography variant=\"body1\">\n After setting up 2FA, you’ll use an authenticator app as part of\n your login process, in addition to your existing password. If you\n log in using your Google\n {/* oxlint-disable-next-line no-constant-binary-expression -- Remove conditionality when NIH RAS login is supported */}\n {false && ', NIH RAS,'} or ORCiD account, you may need to use 2FA as\n part of\n {/*those processes*/}\n that process as well.{' '}\n <Link href={TWO_FACTOR_DOCS_LINK}>Learn more about 2FA</Link>.\n </Typography>\n </Section>\n <Section>\n <SectionInnerGrid>\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 700 }}>\n Step 1. Get one of these apps\n </Typography>\n <Typography variant=\"body1\">\n Download and install one of these authentication apps to set up\n 2FA on your mobile device, tablet, or desktop. If you have one\n of these apps already installed, you can skip this step.\n </Typography>\n </Box>\n <Stack\n sx={theme => ({\n justifyContent: 'space-between',\n flexShrink: 0,\n [theme.breakpoints.down('sm')]: {\n gap: '20px',\n },\n })}\n >\n <Link href={'https://authy.com/download/'}>Authy</Link>\n <Link\n href={\n 'https://duo.com/product/multi-factor-authentication-mfa/duo-mobile-app'\n }\n >\n DUO Mobile\n </Link>\n <Link href={'https://googleauthenticator.net/'}>\n Google Authenticator\n </Link>\n <Link\n href={\n 'https://www.microsoft.com/en-us/security/mobile-authenticator-app'\n }\n >\n Microsoft Authenticator\n </Link>\n </Stack>\n </SectionInnerGrid>\n </Section>\n <Divider />\n <Section>\n <SectionInnerGrid>\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 700 }}>\n Step 2. Scan the QR Code\n </Typography>\n <Typography component=\"ol\" variant=\"body1\" sx={{ pl: 2, my: 1 }}>\n <li>Open your authenticator app</li>\n <li>Tap the &quot;+&quot; button</li>\n <li>Use your camera to scan the image to the right</li>\n </Typography>\n <Link\n onClick={() => {\n setShowSecretInModal(true)\n }}\n >\n Can&apos;t use your camera?\n </Link>\n <TwoFactorSecretDialog\n secret={totpSecret?.secret ?? ''}\n open={showSecretInModal}\n onClose={() => setShowSecretInModal(false)}\n />\n </Box>\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'middle',\n height: 'auto',\n }}\n >\n {!hasQrCode && <SynapseSpinner size={50} />}\n <canvas\n style={{ display: hasQrCode ? undefined : 'none' }}\n ref={qrCodeCanvasElement}\n />\n </Box>\n </SectionInnerGrid>\n </Section>\n <Divider />\n <Section>\n <SectionInnerGrid>\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 700 }}>\n Step 3. Enter the Verification Code\n </Typography>\n <Typography variant=\"body1\">\n After scanning in the QR code in step 2, your app will provide a\n 6-digit code. Enter it in in the field to the right.\n </Typography>\n </Box>\n <form\n onSubmit={e => {\n e.preventDefault()\n finishEnrollment({\n secretId: totpSecret.secretId,\n totp,\n })\n }}\n >\n <Stack\n direction={'row'}\n sx={{\n gap: 2,\n height: '48px',\n }}\n >\n <TextField\n autoFocus\n slotProps={{ htmlInput: { maxLength: totpSecret?.digits } }}\n value={totp}\n onChange={e => {\n setTotp(e.target.value)\n }}\n />\n <Button\n type={'submit'}\n variant={'contained'}\n sx={{ flexShrink: 0 }}\n disabled={\n isFinishingEnrollment || totp.length != totpSecret?.digits\n }\n >\n Activate\n </Button>\n </Stack>\n </form>\n </SectionInnerGrid>\n </Section>\n {error && (\n <FullWidthAlert\n variant={'danger'}\n isGlobal={false}\n description={\n error.reason.toLowerCase().includes('invalid totp code')\n ? `${error.reason}. ${TOTP_CLOCK_SKEW_ERROR_APPENDAGE}`\n : error.reason\n }\n />\n )}\n </Paper>\n </StyledOuterContainer>\n )\n}\n\nexport const EXPORTED_FOR_UNIT_TESTING = { toOtpAuthUrl }\n"],"mappings":";;;;;;;;;;;;;AAmBA,IAAM,EAAE,gBAAa;AAarB,SAAS,EAAa,GAAoB;CACxC,OAAO,0BAA0B,EAAO,SAAS,UAAU,EAAO,OAAO,uCAAuC,EAAO,IAAI,UAAU,EAAO,OAAO,UAAU,EAAO;AACtK;AAEA,IAAM,IAAqC,GACxC,MACC,kBAAC,GAAD;CACE,IAAI;EACF,IAAI;EACJ,GAAG,EAAM;CACX;CACA,GAAI;AACL,CAAA,GAEH,EACE,OAAO,UACT,CACF,SAAS,CAAC,EAAE,GAEN,IAAmB,EAAO,GAAK,EAAE,OAAO,mBAAmB,CAAC,GAC/D,EAAE,gBAAa;CACd,SAAS;CACT,qBAAqB;CACrB,WAAW,EAAM,QAAQ,CAAC;EACzB,EAAM,YAAY,KAAK,IAAI,IAAI;EAC9B,qBAAqB;EACrB,KAAK;CACP;AACF,EACF,GAEa,IACX;AAQF,SAAwB,EACtB,GACA;CACA,IAAM,EAAE,iCAA8B,kBAAe,kBAAe,GAE9D,CAAC,GAAM,KAAW,EAAS,EAAE,GAC7B,CAAC,GAAW,KAAgB,EAAS,EAAK,GAC1C,CAAC,GAAmB,KAAwB,EAAS,EAAK,GAC1D,IAAsB,EAA0B,IAAI,GAEpD,EACJ,QAAQ,GACR,WAAW,GACX,aACE,EAA6B,EAC/B,WAAW,EACb,CAAC;CAgBD,OAdA,QAAgB;EACd,eAAe,IAAe;GAC5B,AAAI,KAAc,EAAoB,YACpC,MAAM,EAAS,EAAoB,SAAS,EAAa,CAAU,GAAG;IACpE,SAAS;IACT,QAAQ;IACR,OAAO;GACT,CAAC,GACD,EAAa,EAAI;EAErB;EACA,EAAkB;CACpB,GAAG,CAAC,CAAU,CAAC,GAGb,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EACE,IAAI;GACF,UAAU;GACV,OAAO;IAAE,IAAI;IAAQ,IAAI;GAAQ;GACjC,IAAI;GACJ,IAAI;GACJ,IAAI;EACN;YAPF;GASG,KACC,kBAAC,GAAD;IACE,MAAK;IACL,eAAe;KACb,EAAc;IAChB;IACA,KAAI,OAAU;KACZ,UAAU;KACV,KAAK,EAAM,QAAQ,CAAC;KACpB,MAAM,EAAM,QAAQ,CAAC;IACvB;cAEA,kBAAC,GAAD;KACE,MAAK;KACL,MAAM;KACN,IAAI;MAAE,QAAQ;MAAQ,OAAO;KAAO;IACrC,CAAA;GACS,CAAA;GAEd,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;IAAY,SAAQ;IAAY,IAAI,EAAE,IAAI,EAAE;cAAG;GAEnC,CAAA,GACZ,kBAAC,GAAD;IAAY,SAAQ;cAApB;KAA4B;KAKzB;KAAsB;KAEF;KACC;KACtB,kBAAC,GAAD;MAAM,MAAM;gBAAsB;KAA0B,CAAA;KAAC;IACnD;KACL,EAAA,CAAA;GACT,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;IAAY,SAAQ;IAAQ,IAAI,EAAE,YAAY,IAAI;cAAG;GAEzC,CAAA,GACZ,kBAAC,GAAD;IAAY,SAAQ;cAAQ;GAIhB,CAAA,CACT,EAAA,CAAA,GACL,kBAAC,GAAD;IACE,KAAI,OAAU;KACZ,gBAAgB;KAChB,YAAY;MACX,EAAM,YAAY,KAAK,IAAI,IAAI,EAC9B,KAAK,OACP;IACF;cAPF;KASE,kBAAC,GAAD;MAAM,MAAM;gBAA+B;KAAW,CAAA;KACtD,kBAAC,GAAD;MACE,MACE;gBAEH;KAEK,CAAA;KACN,kBAAC,GAAD;MAAM,MAAM;gBAAoC;KAE1C,CAAA;KACN,kBAAC,GAAD;MACE,MACE;gBAEH;KAEK,CAAA;IACD;KACS,EAAA,CAAA,EACX,CAAA;GACT,kBAAC,GAAD,CAAU,CAAA;GACV,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA;IACE,kBAAC,GAAD;KAAY,SAAQ;KAAQ,IAAI,EAAE,YAAY,IAAI;eAAG;IAEzC,CAAA;IACZ,kBAAC,GAAD;KAAY,WAAU;KAAK,SAAQ;KAAQ,IAAI;MAAE,IAAI;MAAG,IAAI;KAAE;eAA9D;MACE,kBAAC,MAAD,EAAA,UAAI,8BAA+B,CAAA;MACnC,kBAAC,MAAD,EAAA,UAAI,uBAAgC,CAAA;MACpC,kBAAC,MAAD,EAAA,UAAI,iDAAkD,CAAA;KAC5C;;IACZ,kBAAC,GAAD;KACE,eAAe;MACb,EAAqB,EAAI;KAC3B;eACD;IAEK,CAAA;IACN,kBAAC,GAAD;KACE,QAAQ,GAAY,UAAU;KAC9B,MAAM;KACN,eAAe,EAAqB,EAAK;IAC1C,CAAA;GACE,EAAA,CAAA,GACL,kBAAC,GAAD;IACE,IAAI;KACF,SAAS;KACT,gBAAgB;KAChB,YAAY;KACZ,QAAQ;IACV;cANF,CAQG,CAAC,KAAa,kBAAC,GAAD,EAAgB,MAAM,GAAK,CAAA,GAC1C,kBAAC,UAAD;KACE,OAAO,EAAE,SAAS,IAAY,KAAA,IAAY,OAAO;KACjD,KAAK;IACN,CAAA,CACE;KACW,EAAA,CAAA,EACX,CAAA;GACT,kBAAC,GAAD,CAAU,CAAA;GACV,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;IAAY,SAAQ;IAAQ,IAAI,EAAE,YAAY,IAAI;cAAG;GAEzC,CAAA,GACZ,kBAAC,GAAD;IAAY,SAAQ;cAAQ;GAGhB,CAAA,CACT,EAAA,CAAA,GACL,kBAAC,QAAD;IACE,WAAU,MAAK;KAEb,AADA,EAAE,eAAe,GACjB,EAAiB;MACf,UAAU,EAAW;MACrB;KACF,CAAC;IACH;cAEA,kBAAC,GAAD;KACE,WAAW;KACX,IAAI;MACF,KAAK;MACL,QAAQ;KACV;eALF,CAOE,kBAAC,GAAD;MACE,WAAA;MACA,WAAW,EAAE,WAAW,EAAE,WAAW,GAAY,OAAO,EAAE;MAC1D,OAAO;MACP,WAAU,MAAK;OACb,EAAQ,EAAE,OAAO,KAAK;MACxB;KACD,CAAA,GACD,kBAAC,GAAD;MACE,MAAM;MACN,SAAS;MACT,IAAI,EAAE,YAAY,EAAE;MACpB,UACE,KAAyB,EAAK,UAAU,GAAY;gBAEvD;KAEO,CAAA,CACH;;GACH,CAAA,CACU,EAAA,CAAA,EACX,CAAA;GACR,KACC,kBAAC,GAAD;IACE,SAAS;IACT,UAAU;IACV,aACE,EAAM,OAAO,YAAY,EAAE,SAAS,mBAAmB,IACnD,GAAG,EAAM,OAAO,6FAChB,EAAM;GAEb,CAAA;EAEE;IACa,CAAA;AAE1B;AAEA,IAAa,IAA4B,EAAE,gBAAa"}
1
+ {"version":3,"file":"TwoFactorEnrollmentForm.js","names":[],"sources":["../../../src/components/Authentication/TwoFactorEnrollmentForm.tsx"],"sourcesContent":["import { StyledOuterContainer } from '@/components/styled/LeftRightPanel'\nimport {\n NUMERIC_CODE_HTML_INPUT_PROPS,\n TOTP_CLOCK_SKEW_ERROR_APPENDAGE,\n} from '@/components/Authentication/Constants'\nimport { useFinishTwoFactorEnrollment } from '@/synapse-queries/auth/useTwoFactorEnrollment'\nimport { StyledComponent } from '@emotion/styled'\nimport {\n Box,\n BoxProps,\n Button,\n Divider,\n FormHelperText,\n IconButton,\n Link,\n Paper,\n Stack,\n styled,\n Typography,\n} from '@mui/material'\nimport { TotpSecret } from '@sage-bionetworks/synapse-types'\nimport * as qrcode from 'qrcode'\n// qrcode is CJS-only; use namespace import for Vite dev mode CJS interop.\nconst { toCanvas } = qrcode\nimport { useEffect, useId, useRef, useState } from 'react'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { SynapseSpinner } from '../LoadingScreen/LoadingScreen'\nimport TextField from '../TextField/TextField'\nimport TwoFactorSecretDialog from './TwoFactorSecretDialog'\nimport { displayToast } from '../ToastMessage/ToastMessage'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client/util/SynapseClientError'\n\n/**\n * Returns a URL that can be used to generate a QR code that 2FA authenticator apps can interpret.\n * This uses the username fro TotpSecret to create the friendly name for the account in the authenticator app.\n * @param secret\n */\nfunction toOtpAuthUrl(secret: TotpSecret) {\n return `otpauth://totp/Synapse:${secret.username}?secret=${secret.secret}&issuer=Sage%20Bionetworks&algorithm=${secret.alg}&digits=${secret.digits}&period=${secret.period}`\n}\n\nfunction isInvalidTotpCodeError(error: SynapseClientError) {\n return error.reason.toLowerCase().includes('invalid totp code')\n}\n\nconst Section: StyledComponent<BoxProps> = styled(\n (props: BoxProps) => (\n <Box\n sx={{\n my: 3,\n ...props.sx,\n }}\n {...props}\n />\n ),\n {\n label: 'Section',\n },\n)(() => ({}))\n\nconst SectionInnerGrid = styled(Box, { label: 'SectionInnerGrid' })(\n ({ theme }) => ({\n display: 'grid',\n gridTemplateColumns: 'auto 200px',\n columnGap: theme.spacing(5),\n [theme.breakpoints.down('sm')]: {\n gridTemplateColumns: '1fr',\n gap: '18px',\n },\n }),\n)\n\nexport const TWO_FACTOR_DOCS_LINK =\n 'https://help.synapse.org/docs/Managing-Your-Account.2055405596.html#Adding-Two-Factor-Authentication-(2FA)-to-your-account'\n\nexport type TwoFactorEnrollmentFormProps = {\n totpSecret: TotpSecret\n onTwoFactorEnrollmentSuccess: () => void\n onBackClicked: () => void\n}\n\nexport default function TwoFactorEnrollmentForm(\n props: TwoFactorEnrollmentFormProps,\n) {\n const { onTwoFactorEnrollmentSuccess, onBackClicked, totpSecret } = props\n\n const [totp, setTotp] = useState('')\n const [hasQrCode, setHasQrCode] = useState(false)\n const [showSecretInModal, setShowSecretInModal] = useState(false)\n const qrCodeCanvasElement = useRef<HTMLCanvasElement>(null)\n const invalidCodeErrorId = useId()\n\n const {\n mutate: finishEnrollment,\n isPending: isFinishingEnrollment,\n error,\n reset: resetEnrollmentError,\n } = useFinishTwoFactorEnrollment({\n onSuccess: onTwoFactorEnrollmentSuccess,\n onError: error => {\n // An invalid code is reported on the code field itself; anything else has no field to attach to\n if (!isInvalidTotpCodeError(error)) {\n displayToast(error.reason, 'danger')\n }\n },\n })\n\n const showInvalidCodeError = error != null && isInvalidTotpCodeError(error)\n\n useEffect(() => {\n async function createQrCode() {\n if (totpSecret && qrCodeCanvasElement.current) {\n await toCanvas(qrCodeCanvasElement.current, toOtpAuthUrl(totpSecret), {\n version: 10,\n margin: 0,\n scale: 3.5,\n })\n setHasQrCode(true)\n }\n }\n void createQrCode()\n }, [totpSecret])\n\n return (\n <StyledOuterContainer>\n <Paper\n sx={{\n position: 'relative',\n width: { xs: '100%', md: '800px' },\n py: 6.5,\n px: 8,\n mx: 'auto',\n }}\n >\n {onBackClicked && (\n <IconButton\n type=\"button\"\n onClick={() => {\n onBackClicked()\n }}\n sx={theme => ({\n position: 'absolute',\n top: theme.spacing(2),\n left: theme.spacing(2),\n })}\n >\n <IconSvg\n icon=\"arrowBack\"\n wrap={false}\n sx={{ height: '24px', width: '24px' }}\n />\n </IconButton>\n )}\n <Section>\n <Typography variant=\"headline2\" sx={{ mb: 3 }}>\n Activate Two-factor Authentication\n </Typography>\n <Typography variant=\"body1\">\n After setting up 2FA, you’ll use an authenticator app as part of\n your login process, in addition to your existing password. If you\n log in using your Google\n {/* oxlint-disable-next-line no-constant-binary-expression -- Remove conditionality when NIH RAS login is supported */}\n {false && ', NIH RAS,'} or ORCiD account, you may need to use 2FA as\n part of\n {/*those processes*/}\n that process as well.{' '}\n <Link href={TWO_FACTOR_DOCS_LINK}>Learn more about 2FA</Link>.\n </Typography>\n </Section>\n <Section>\n <SectionInnerGrid>\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 700 }}>\n Step 1. Get one of these apps\n </Typography>\n <Typography variant=\"body1\">\n Download and install one of these authentication apps to set up\n 2FA on your mobile device, tablet, or desktop. If you have one\n of these apps already installed, you can skip this step.\n </Typography>\n </Box>\n <Stack\n sx={theme => ({\n justifyContent: 'space-between',\n flexShrink: 0,\n [theme.breakpoints.down('sm')]: {\n gap: '20px',\n },\n })}\n >\n <Link href={'https://authy.com/download/'}>Authy</Link>\n <Link\n href={\n 'https://duo.com/product/multi-factor-authentication-mfa/duo-mobile-app'\n }\n >\n DUO Mobile\n </Link>\n <Link href={'https://googleauthenticator.net/'}>\n Google Authenticator\n </Link>\n <Link\n href={\n 'https://www.microsoft.com/en-us/security/mobile-authenticator-app'\n }\n >\n Microsoft Authenticator\n </Link>\n </Stack>\n </SectionInnerGrid>\n </Section>\n <Divider />\n <Section>\n <SectionInnerGrid>\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 700 }}>\n Step 2. Scan the QR Code\n </Typography>\n <Typography component=\"ol\" variant=\"body1\" sx={{ pl: 2, my: 1 }}>\n <li>Open your authenticator app</li>\n <li>Tap the &quot;+&quot; button</li>\n <li>Use your camera to scan the image to the right</li>\n </Typography>\n <Link\n onClick={() => {\n setShowSecretInModal(true)\n }}\n >\n Can&apos;t use your camera?\n </Link>\n <TwoFactorSecretDialog\n secret={totpSecret?.secret ?? ''}\n open={showSecretInModal}\n onClose={() => setShowSecretInModal(false)}\n />\n </Box>\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'middle',\n height: 'auto',\n }}\n >\n {!hasQrCode && <SynapseSpinner size={50} />}\n <canvas\n style={{ display: hasQrCode ? undefined : 'none' }}\n ref={qrCodeCanvasElement}\n />\n </Box>\n </SectionInnerGrid>\n </Section>\n <Divider />\n <Section>\n <SectionInnerGrid>\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 700 }}>\n Step 3. Enter the Verification Code\n </Typography>\n <Typography variant=\"body1\">\n After scanning in the QR code in step 2, your app will provide a\n 6-digit code. Enter it in in the field to the right.\n </Typography>\n </Box>\n <form\n onSubmit={e => {\n e.preventDefault()\n finishEnrollment({\n secretId: totpSecret.secretId,\n totp,\n })\n }}\n >\n <Stack\n direction={'row'}\n sx={{\n gap: 2,\n height: '48px',\n }}\n >\n <TextField\n autoFocus\n slotProps={{\n htmlInput: {\n ...NUMERIC_CODE_HTML_INPUT_PROPS,\n maxLength: totpSecret?.digits,\n 'aria-describedby': showInvalidCodeError\n ? invalidCodeErrorId\n : undefined,\n },\n }}\n value={totp}\n error={showInvalidCodeError}\n onChange={e => {\n // Clear a previous failure as soon as the user edits the code\n if (error) {\n resetEnrollmentError()\n }\n setTotp(e.target.value)\n }}\n />\n <Button\n type={'submit'}\n variant={'contained'}\n sx={{ flexShrink: 0 }}\n disabled={\n isFinishingEnrollment || totp.length != totpSecret?.digits\n }\n >\n Activate\n </Button>\n </Stack>\n {/* The message sits outside the input's form control so that it can wrap\n against the full width of the card rather than the width of the input */}\n {showInvalidCodeError && (\n <FormHelperText id={invalidCodeErrorId} error sx={{ mt: 1 }}>\n {`${error.reason}. ${TOTP_CLOCK_SKEW_ERROR_APPENDAGE}`}\n </FormHelperText>\n )}\n </form>\n </SectionInnerGrid>\n </Section>\n </Paper>\n </StyledOuterContainer>\n )\n}\n\nexport const EXPORTED_FOR_UNIT_TESTING = { toOtpAuthUrl }\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SynapseGrid.d.ts","sourceRoot":"","sources":["../../../src/components/DataGrid/SynapseGrid.tsx"],"names":[],"mappings":"AAsBA,OAAO,EACL,iBAAiB,EAGlB,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EACL,GAAG,EAOJ,MAAM,OAAO,CAAA;AAkBd,MAAM,MAAM,gBAAgB,GAAG;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,GAAG,CAAC,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAA;IACpD,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;CACjD,CAAA;AAghBD,iBAAS,WAAW,CAAC,KAAK,EAAE,gBAAgB,2CAM3C;AAED,eAAe,WAAW,CAAA"}
1
+ {"version":3,"file":"SynapseGrid.d.ts","sourceRoot":"","sources":["../../../src/components/DataGrid/SynapseGrid.tsx"],"names":[],"mappings":"AAuBA,OAAO,EACL,iBAAiB,EAGlB,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EACL,GAAG,EAOJ,MAAM,OAAO,CAAA;AAqBd,MAAM,MAAM,gBAAgB,GAAG;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,GAAG,CAAC,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAA;IACpD,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;CACjD,CAAA;AAghBD,iBAAS,WAAW,CAAC,KAAK,EAAE,gBAAgB,2CAM3C;AAED,eAAe,WAAW,CAAA"}