@abtnode/blocklet-services 1.16.32-beta-93e1a798 → 1.16.32-beta-820e4cfa

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 (233) hide show
  1. package/api/emails/components/content.js +2 -2
  2. package/api/emails/pages/notification.js +3 -2
  3. package/api/libs/connect/session.js +5 -33
  4. package/api/libs/email.js +6 -1
  5. package/api/libs/kyc.js +76 -2
  6. package/api/routes/oauth.js +3 -3
  7. package/api/routes/openapi.js +4 -4
  8. package/api/routes/opencomponent.js +4 -6
  9. package/api/routes/openembed.js +6 -5
  10. package/api/services/auth/connect/bind-wallet.js +2 -12
  11. package/api/services/auth/connect/update-kyc.js +10 -2
  12. package/api/services/kyc/index.js +25 -5
  13. package/api/util/federated.js +35 -0
  14. package/dist/assets/{Add-D8jHDZuh.js → Add-BnNzBkSM.js} +1 -1
  15. package/dist/assets/{Alert-CRD24aa1.js → Alert-MdMGtLD7.js} +1 -1
  16. package/dist/assets/{ArrowDropDown-CFc0zow6.js → ArrowDropDown-BxN9s0B3.js} +1 -1
  17. package/dist/assets/{Avatar-BIWwirOj.js → Avatar-C8UCl2Ga.js} +1 -1
  18. package/dist/assets/{ButtonGroup-DcU8GHuP.js → ButtonGroup-CZa7-ajY.js} +1 -1
  19. package/dist/assets/{CheckCircle-BrcbSmIK.js → CheckCircle-sCoWELrn.js} +1 -1
  20. package/dist/assets/{ChevronLeft-Cyjchnxw.js → ChevronLeft-DkDFOWTc.js} +1 -1
  21. package/dist/assets/{ChevronRight-j0-gJxyM.js → ChevronRight-B4jca3VR.js} +1 -1
  22. package/dist/assets/{Close-B2vbXcur.js → Close-Dsq723dc.js} +1 -1
  23. package/dist/assets/{CloseOutlined-BWhWoWD_.js → CloseOutlined-SmGyPCCX.js} +1 -1
  24. package/dist/assets/{Delete-B2j1UcE8.js → Delete-Dq713V6u.js} +1 -1
  25. package/dist/assets/{DeleteOutline-C2h-KiXe.js → DeleteOutline-CnT4EQeF.js} +1 -1
  26. package/dist/assets/{DialogContentText-D5Xxal_F.js → DialogContentText-DacbluUW.js} +1 -1
  27. package/dist/assets/{Done-B-JT0RXC.js → Done-qR9kVgrH.js} +1 -1
  28. package/dist/assets/{Download-DP_lDlx2.js → Download-DW26ur5s.js} +1 -1
  29. package/dist/assets/{Edit-B3J8-Twv.js → Edit-Dws2_-ub.js} +1 -1
  30. package/dist/assets/{EditIcon-R508XR9R.js → EditIcon-CY6l5Il6.js} +1 -1
  31. package/dist/assets/{Error-B4vCt6tb.js → Error-C5amiEhI.js} +1 -1
  32. package/dist/assets/{ExpandMore-IE6fvawl.js → ExpandMore-d42Ky8li.js} +1 -1
  33. package/dist/assets/{FormControl-Chtq9AE7.js → FormControl-C07X4iXm.js} +1 -1
  34. package/dist/assets/{FormControlLabel-BmopTtvW.js → FormControlLabel-jY_KMRPD.js} +1 -1
  35. package/dist/assets/{FormGroup-C54kQ9N4.js → FormGroup-CErrZ95I.js} +1 -1
  36. package/dist/assets/{Google-DBXwxuV5.js → Google-CvInay_a.js} +1 -1
  37. package/dist/assets/{Hidden-DPIGUAMJ.js → Hidden-NXnAHRZU.js} +1 -1
  38. package/dist/assets/{InfoOutlined-BmUBc2r2.js → InfoOutlined-DiESNXUD.js} +1 -1
  39. package/dist/assets/{InputAdornment-DXkRELYA.js → InputAdornment-DKQXkF5o.js} +1 -1
  40. package/dist/assets/{InputLabel-DMWY4sIp.js → InputLabel-DCPOxFdI.js} +1 -1
  41. package/dist/assets/{LastPage-D0B9CdNo.js → LastPage-CupdKuWQ.js} +1 -1
  42. package/dist/assets/{Launch-DhHbLKKF.js → Launch-BvCfmwc3.js} +1 -1
  43. package/dist/assets/{LaunchOutlined-CvTIL2cU.js → LaunchOutlined-B-TcY8Ty.js} +1 -1
  44. package/dist/assets/{Link-CYqMveft.js → Link-B6WCZ3ri.js} +1 -1
  45. package/dist/assets/{ListItemText-BR6T5ZDu.js → ListItemText-CAgBao36.js} +1 -1
  46. package/dist/assets/{LoadingButton-DmCdDxLA.js → LoadingButton-BO2pLS2M.js} +1 -1
  47. package/dist/assets/{LockIcon-C1x7LbhO.js → LockIcon-C--7O0SU.js} +1 -1
  48. package/dist/assets/{Loop-BwgmQ4ke.js → Loop-BbewjFkt.js} +1 -1
  49. package/dist/assets/{MoreHoriz-NGD3jXnn.js → MoreHoriz-BnLDnV7Y.js} +1 -1
  50. package/dist/assets/{MoreVert-MUbtAQHv.js → MoreVert-C8wT9PBh.js} +1 -1
  51. package/dist/assets/{OpenInNew-CJl5exgf.js → OpenInNew-BuRkQUDs.js} +1 -1
  52. package/dist/assets/{Pagination-IHWKke1i.js → Pagination-Tk6JJJWb.js} +1 -1
  53. package/dist/assets/{PlayArrow-DzoHzRoJ.js → PlayArrow-DGa9lwdU.js} +1 -1
  54. package/dist/assets/{QuestionMarkCircle-TnBpzaSI.js → QuestionMarkCircle-BJqkf48h.js} +1 -1
  55. package/dist/assets/{RadioGroup-C6M_sifl.js → RadioGroup-Ceyc11_1.js} +1 -1
  56. package/dist/assets/{Search-wiijyIeu.js → Search-B37iNoKq.js} +1 -1
  57. package/dist/assets/{Select-CIDtym3x.js → Select-B0ouveBQ.js} +1 -1
  58. package/dist/assets/{ServerLogo-Bal3ugu3.js → ServerLogo-8TjGIlip.js} +1 -1
  59. package/dist/assets/{Skeleton-BXCyEPW7.js → Skeleton-8eEDG-Ms.js} +1 -1
  60. package/dist/assets/{Slider-Ntyz_Q-E.js → Slider-BujG4_Kd.js} +1 -1
  61. package/dist/assets/{Stack-CYabuVI4.js → Stack-C7-JMCCu.js} +1 -1
  62. package/dist/assets/{Stepper-DuAngjIl.js → Stepper-Bc34zZ-Y.js} +1 -1
  63. package/dist/assets/{TextField-x4CoNOlz.js → TextField-D1ujlYf9.js} +1 -1
  64. package/dist/assets/{Toolbar-DlYXwq_K.js → Toolbar-3DD8ghgH.js} +1 -1
  65. package/dist/assets/{ViewColumn-8HGbbav-.js → ViewColumn-Dbd2RcMW.js} +1 -1
  66. package/dist/assets/{ViewList-DjDLjZbQ.js → ViewList-B4KeBI85.js} +1 -1
  67. package/dist/assets/{access-control-BSvhOxQQ.js → access-control-g3afaGNm.js} +1 -1
  68. package/dist/assets/{actions-byFcd21l.js → actions-D1fO3id2.js} +1 -1
  69. package/dist/assets/{add-component-core-BaGwMeTq.js → add-component-core-DrCymqMX.js} +1 -1
  70. package/dist/assets/{add-resource-R3DTTpMs.js → add-resource-id1YX_Oo.js} +1 -1
  71. package/dist/assets/{addon-B9HdZ1hJ.js → addon-DwXg8kbW.js} +1 -1
  72. package/dist/assets/{analytics-Drr9ic2m.js → analytics-DCFGDrSe.js} +1 -1
  73. package/dist/assets/api-BYS9rs2B.js +1 -0
  74. package/dist/assets/ar-5o8kqNk7.js +1 -0
  75. package/dist/assets/{audit-logs-tviTMDA1.js → audit-logs-D0fFriz5.js} +1 -1
  76. package/dist/assets/{button-D68lNTBN.js → button-ClHJcnVR.js} +1 -1
  77. package/dist/assets/{click-to-copy-Cy7g0c_W.js → click-to-copy-BqLgKtqA.js} +1 -1
  78. package/dist/assets/{complete-N8h-bC0Y.js → complete-D-sLwQDJ.js} +4 -4
  79. package/dist/assets/{component-CyfiUp-R.js → component-ZjhQBkiP.js} +60 -60
  80. package/dist/assets/{config-BZSxOwu6.js → config-N0FSLwXJ.js} +1 -1
  81. package/dist/assets/{config-BEOq9uec.js → config-_xJ464M_.js} +1 -1
  82. package/dist/assets/{config-navigation-C6EN0Fwq.js → config-navigation-fVL2wq7x.js} +1 -1
  83. package/dist/assets/{confirm-Bz_GmEiI.js → confirm-WGw4zZ8r.js} +1 -1
  84. package/dist/assets/{connect-BZC3CdFF.js → connect-1sWbqUfW.js} +1 -1
  85. package/dist/assets/{connect-Cr0AxBUc.js → connect-BZGrsZSG.js} +1 -1
  86. package/dist/assets/{connect-to-BmqBRB3U.js → connect-to-BzHQacMQ.js} +1 -1
  87. package/dist/assets/{content-layout-2vv5OZW9.js → content-layout-CBN6Dvqp.js} +1 -1
  88. package/dist/assets/{dashboard-Cwcji3JN.js → dashboard-B4ze-X1x.js} +3 -3
  89. package/dist/assets/de-Lu3QkkkU.js +1 -0
  90. package/dist/assets/{did-address-BIfBoDiQ.js → did-address-BURJDyiC.js} +1 -1
  91. package/dist/assets/domain-D5gY-NEc.js +9 -0
  92. package/dist/assets/domain-list-Mq2Fan-d.js +15 -0
  93. package/dist/assets/email-B50BtSL8.js +15 -0
  94. package/dist/assets/es-CTrW8z60.js +1 -0
  95. package/dist/assets/{exchange-passport-D-WRM3Wn.js → exchange-passport-CdNpP3Y-.js} +1 -1
  96. package/dist/assets/{fallback-DTP7cYpM.js → fallback-BgjQELn7.js} +1 -1
  97. package/dist/assets/{format-error-BOzcbfGa.js → format-error-CrcMEK2V.js} +1 -1
  98. package/dist/assets/fr-DU73a_6g.js +1 -0
  99. package/dist/assets/{fuel-Bn4-TEHO.js → fuel-Ct9vWJB8.js} +1 -1
  100. package/dist/assets/{fullpage-rvVF1rz8.js → fullpage-DibIuyDh.js} +1 -1
  101. package/dist/assets/hi-KeUirlJV.js +1 -0
  102. package/dist/assets/{home-DR7GS6ca.js → home-D4Hg_oC0.js} +1 -1
  103. package/dist/assets/id-CtWLWcnp.js +1 -0
  104. package/dist/assets/{iframe-glv0Poq3.js → iframe-DjP5hzT4.js} +1 -1
  105. package/dist/assets/{index-DFZwS5zQ.js → index-2WFTBY3L.js} +1 -1
  106. package/dist/assets/{index-ChqFEpi4.js → index-5HAOVHgh.js} +1 -1
  107. package/dist/assets/{index-DZIjChbd.js → index-9sFaWssT.js} +1 -1
  108. package/dist/assets/{index-B5vlCSnw.js → index-B2uvJWil.js} +1 -1
  109. package/dist/assets/{index-BZqmUYmf.js → index-B8yobdAt.js} +1 -1
  110. package/dist/assets/{index-Bukl4DJp.js → index-BAM5GUAz.js} +1 -1
  111. package/dist/assets/{index-DgFd31_6.js → index-BCt_GquA.js} +1 -1
  112. package/dist/assets/{index-B6NXai6_.js → index-BOtnl4g3.js} +1 -1
  113. package/dist/assets/{index-CEaTcEQs.js → index-BP0e3trc.js} +6 -6
  114. package/dist/assets/{index-wMDpYZdf.js → index-BYp7PNIm.js} +1 -1
  115. package/dist/assets/{index-BcUb67P2.js → index-BxmTVomL.js} +1 -1
  116. package/dist/assets/{index-DWAL5jyd.js → index-C3La5sKU.js} +1 -1
  117. package/dist/assets/{index-C_flIkR0.js → index-CEBNAvPK.js} +1 -1
  118. package/dist/assets/{index-CJPYlJzX.js → index-CHp2FXIo.js} +1 -1
  119. package/dist/assets/{index-BbBRjIRQ.js → index-CInwQHvl.js} +1 -1
  120. package/dist/assets/{index-BreZlHA5.js → index-CLhW7LJ4.js} +1 -1
  121. package/dist/assets/{index-Bsh1JZ9i.js → index-CnjLsEef.js} +1 -1
  122. package/dist/assets/{index-CE9qCuXL.js → index-D-f5DDJ1.js} +1 -1
  123. package/dist/assets/{index-bxrR9ubG.js → index-DVc2iGFg.js} +4 -4
  124. package/dist/assets/{index-B8cOlg3J.js → index-DZi-2Gbw.js} +1 -1
  125. package/dist/assets/{index-3hwSska-.js → index-D_Vu2xLx.js} +3 -3
  126. package/dist/assets/{index-DYNsUZaH.js → index-Di3jF2ud.js} +1 -1
  127. package/dist/assets/{index-BQQSQ70k.js → index-DmXHr_Jd.js} +1 -1
  128. package/dist/assets/{index-CeEJtkL-.js → index-DnjFnDbB.js} +1 -1
  129. package/dist/assets/{index-mmP1Lkjm.js → index-DqtfVmQd.js} +1 -1
  130. package/dist/assets/{index-DsNs234N.js → index-Ee7FJItU.js} +1 -1
  131. package/dist/assets/{index-MgF3lCRP.js → index-FKe4fuVo.js} +1 -1
  132. package/dist/assets/{index-BNm1w4Av.js → index-h75gmDWw.js} +1 -1
  133. package/dist/assets/index-j2-hVzu_.js +262 -0
  134. package/dist/assets/{index-j8Uq5XuX.js → index-wwrsvgTo.js} +1 -1
  135. package/dist/assets/{index-BNFvQJs8.js → index-wxPofhyR.js} +1 -1
  136. package/dist/assets/{index.es-Dz_wpH3d.js → index.es-B4hyWcg0.js} +1 -1
  137. package/dist/assets/index.esm-Xnj83P4x.js +1 -0
  138. package/dist/assets/{invitation-Bxk7RQM2.js → invitation-B6D49MAH.js} +1 -1
  139. package/dist/assets/{invite-DxTtxFmK.js → invite-C9_gSzwl.js} +1 -1
  140. package/dist/assets/{issue-passport-SKwEWQ_s.js → issue-passport-C4GU6O8E.js} +1 -1
  141. package/dist/assets/{item-B-EBHzLe.js → item-BF5S_bSW.js} +1 -1
  142. package/dist/assets/ja-CrqtPWVX.js +1 -0
  143. package/dist/assets/{jss-plugin-props-sort.esm-Bm1tsMYs.js → jss-plugin-props-sort.esm-C037h0ZA.js} +1 -1
  144. package/dist/assets/ko-Cl75HOeP.js +1 -0
  145. package/dist/assets/{launch-result-message-CaImC-I4.js → launch-result-message-CSFk0yKu.js} +1 -1
  146. package/dist/assets/{layout-DskBhVxG.js → layout-Cgc_KlR_.js} +1 -1
  147. package/dist/assets/{list-header-CfS2OSwd.js → list-header-BJmy3Sb6.js} +1 -1
  148. package/dist/assets/localization-DxBUHiuu.js +1 -0
  149. package/dist/assets/{log-BSUm2QeV.js → log-yfx-YeX0.js} +1 -1
  150. package/dist/assets/{login-BXwy09YT.js → login-CBnpVuLH.js} +1 -1
  151. package/dist/assets/{login-oauth-callback-CrNNy4ro.js → login-oauth-callback-DhSyRbsE.js} +1 -1
  152. package/dist/assets/{logo-uploader-Blhm721C.js → logo-uploader-CbVnmlud.js} +3 -3
  153. package/dist/assets/{lost-passport-r7tegJSQ.js → lost-passport-DYISuGT6.js} +3 -3
  154. package/dist/assets/{lottie-Bw0llhbP.js → lottie-yg9CNUXF.js} +1 -1
  155. package/dist/assets/{notifications-CymYmkqD.js → notifications-sAYV5JP7.js} +1 -1
  156. package/dist/assets/{open-window-EH5UZ1B9.js → open-window-B3y-K43C.js} +1 -1
  157. package/dist/assets/overview-B2gi6-EB.js +12 -0
  158. package/dist/assets/{page-header-CGrnydWl.js → page-header-C178XWza.js} +1 -1
  159. package/dist/assets/{permission-VH_Fm7Pw.js → permission-C_C-c12n.js} +1 -1
  160. package/dist/assets/{preferences-D4Eq55c6.js → preferences-dJVu_aGA.js} +1 -1
  161. package/dist/assets/pt-DQT1OGc3.js +1 -0
  162. package/dist/assets/publish-resource-CmTtvQT5.js +1 -0
  163. package/dist/assets/react-ByKj6cfy.js +57 -0
  164. package/dist/assets/{redux-DN6s-mdl.js → redux-B09DmXDw.js} +1 -1
  165. package/dist/assets/{resource-dialog-uAYGlGhi.js → resource-dialog-BwEU4HN_.js} +1 -1
  166. package/dist/assets/ru-BnBjQSIA.js +1 -0
  167. package/dist/assets/sdk-CVUR4sWS.js +1 -0
  168. package/dist/assets/{selector-LFwadlX9.js → selector-C48VqXJG.js} +1 -1
  169. package/dist/assets/session-6dBAYf8V.js +1 -0
  170. package/dist/assets/setup-CW9Mc5ia.js +19 -0
  171. package/dist/assets/{shorten-label-DZrPE8HL.js → shorten-label-BFmx1uT0.js} +1 -1
  172. package/dist/assets/{slicedToArray-DEmwrQWd.js → slicedToArray-nXfwDj8Z.js} +1 -1
  173. package/dist/assets/{spaces-D6Mid5Z_.js → spaces-4Z8WLh5r.js} +1 -1
  174. package/dist/assets/{start-Dgs20fUu.js → start-CphZOBJ-.js} +1 -1
  175. package/dist/assets/{step-actions-CQZle7ap.js → step-actions-dsgNJO3G.js} +1 -1
  176. package/dist/assets/{studio-Bk3f_TnH.js → studio-CqWqozKn.js} +1 -1
  177. package/dist/assets/{switch-control-XeRJBgck.js → switch-control-Cfn8zFPo.js} +1 -1
  178. package/dist/assets/th-CGHFfwO3.js +1 -0
  179. package/dist/assets/{toUpper-D3wJMACz.js → toUpper-D5T8Q9sM.js} +1 -1
  180. package/dist/assets/{transfer-CJn1-1Hv.js → transfer-Cb9oltJL.js} +1 -1
  181. package/dist/assets/trim-DT0GIvSS.js +1 -0
  182. package/dist/assets/{uniqBy-DA6z7OdT.js → uniqBy-DcaH1r2Z.js} +1 -1
  183. package/dist/assets/{unsubscribe-FfeRFV57.js → unsubscribe-B_g1tnbx.js} +1 -1
  184. package/dist/assets/{url-join-5MzXbhiU.js → url-join-2JMT_sNX.js} +1 -1
  185. package/dist/assets/{use-blocklet-info-for-connect-did-spaces-C5KUrb2h.js → use-blocklet-info-for-connect-did-spaces-BdJyHLGD.js} +1 -1
  186. package/dist/assets/{use-mobile-mkcGNRhM.js → use-mobile-iaxCrChc.js} +1 -1
  187. package/dist/assets/{useAsync-ByBqdjCT.js → useAsync-BNwz4d_3.js} +1 -1
  188. package/dist/assets/{useFormControl-BA79DoOc.js → useFormControl-ZYiDKPwe.js} +1 -1
  189. package/dist/assets/{useLocalStorage-CmGNzDHX.js → useLocalStorage-DJ6SjiMe.js} +1 -1
  190. package/dist/assets/{useSetState-Cz7xEaUb.js → useSetState-1EVxD1ii.js} +1 -1
  191. package/dist/assets/{useSlot-CDa1PttK.js → useSlot-DEzPBH-O.js} +1 -1
  192. package/dist/assets/{useSlotProps-4qJAhdYR.js → useSlotProps-OKH9p37y.js} +1 -1
  193. package/dist/assets/{useThemeProps-B-j4MceL.js → useThemeProps-CYOsA0xw.js} +1 -1
  194. package/dist/assets/{user-center-lM3dah3G.js → user-center--iMqbkOW.js} +1 -1
  195. package/dist/assets/{user-sessions-Bf8PBzsX.js → user-sessions-CSjxxHUQ.js} +1 -1
  196. package/dist/assets/{util-CxaUEagR.js → util-BBc8rTnk.js} +1 -1
  197. package/dist/assets/vi-DmvzB5rE.js +1 -0
  198. package/dist/assets/wrap-locale-HTk2AmiE.js +1 -0
  199. package/dist/assets/zh-DdFcZXz5.js +2 -0
  200. package/dist/assets/zh-qFJGs7UR.js +1 -0
  201. package/dist/assets/zh-tw-DfkXr6W8.js +1 -0
  202. package/dist/index.html +1 -1
  203. package/dist/service-worker.js +1 -1
  204. package/package.json +18 -18
  205. package/dist/assets/api-DHCXgKlp.js +0 -1
  206. package/dist/assets/ar-BywPGmOa.js +0 -1
  207. package/dist/assets/de-qs3PjT55.js +0 -1
  208. package/dist/assets/domain-CRovIqk7.js +0 -9
  209. package/dist/assets/domain-list-DcneFIba.js +0 -15
  210. package/dist/assets/email-CeOASC0F.js +0 -9
  211. package/dist/assets/es-DXb9xB6c.js +0 -1
  212. package/dist/assets/fr-CMgZc3LR.js +0 -1
  213. package/dist/assets/hi-Ch52Lky6.js +0 -1
  214. package/dist/assets/id-_x67Rh2B.js +0 -1
  215. package/dist/assets/index-BNnk2PUZ.js +0 -262
  216. package/dist/assets/index.esm-CoLXjYXU.js +0 -1
  217. package/dist/assets/ja-BemsOTjE.js +0 -1
  218. package/dist/assets/ko-CqkhhVdi.js +0 -1
  219. package/dist/assets/localization-BW8TQLcf.js +0 -1
  220. package/dist/assets/overview-BpKMkNIP.js +0 -12
  221. package/dist/assets/pt-DZmF_qcN.js +0 -1
  222. package/dist/assets/publish-resource-CtKz6A2f.js +0 -1
  223. package/dist/assets/react-DJuQ-Z9X.js +0 -57
  224. package/dist/assets/ru-BFNdjdAO.js +0 -1
  225. package/dist/assets/sdk-BYKTwfxu.js +0 -1
  226. package/dist/assets/session-BG5hlQoH.js +0 -1
  227. package/dist/assets/setup-DckNmKNu.js +0 -19
  228. package/dist/assets/th-B61cOYck.js +0 -1
  229. package/dist/assets/vi-B884zOLu.js +0 -1
  230. package/dist/assets/wrap-locale-aLhwmHYY.js +0 -1
  231. package/dist/assets/zh-DjEnl7LY.js +0 -1
  232. package/dist/assets/zh-kNAPjCk5.js +0 -2
  233. package/dist/assets/zh-tw-Bn1Pkz9A.js +0 -1
@@ -8,8 +8,8 @@ const components_1 = require("@react-email/components");
8
8
  const attachments_1 = __importDefault(require("./attachments"));
9
9
  const actions_1 = __importDefault(require("./actions"));
10
10
  const highlight_1 = require("../libs/highlight");
11
- function Content({ title, content, attachments = [], actions = [], style = {}, locale, severity = 'normal', }) {
12
- return ((0, jsx_runtime_1.jsxs)(components_1.Section, { style: style, children: [(0, jsx_runtime_1.jsx)(components_1.Heading, { style: h1, children: title }), content && ((0, jsx_runtime_1.jsx)(components_1.Text, { className: "content", style: { whiteSpace: 'pre-line!important' }, dangerouslySetInnerHTML: { __html: (0, highlight_1.toClickableSpan)(content) } })), (0, jsx_runtime_1.jsx)(attachments_1.default, { severity: severity, attachments: attachments, locale: locale }), (0, jsx_runtime_1.jsx)(actions_1.default, { actions: actions })] }));
11
+ function Content({ title, content, attachments = [], actions = [], style = {}, locale, raw = false, severity = 'normal', }) {
12
+ return ((0, jsx_runtime_1.jsxs)(components_1.Section, { style: style, children: [(0, jsx_runtime_1.jsx)(components_1.Heading, { style: h1, children: title }), content && ((0, jsx_runtime_1.jsx)(components_1.Text, { className: "content", style: { whiteSpace: 'pre-line!important' }, dangerouslySetInnerHTML: { __html: raw ? content : (0, highlight_1.toClickableSpan)(content) } })), (0, jsx_runtime_1.jsx)(attachments_1.default, { severity: severity, attachments: attachments, locale: locale }), (0, jsx_runtime_1.jsx)(actions_1.default, { actions: actions })] }));
13
13
  }
14
14
  exports.default = Content;
15
15
  const h1 = {
@@ -10,8 +10,9 @@ const footer_1 = __importDefault(require("../components/footer"));
10
10
  const content_1 = __importDefault(require("../components/content"));
11
11
  const layout_1 = __importDefault(require("../components/layout"));
12
12
  const header_1 = __importDefault(require("../components/header"));
13
- const NotificationEmail = ({ title, body = '', subject, attachments = [], actions = [], appInfo, locale = 'en', severity = 'normal', unsubscribeToken, userInfo, }) => {
14
- return ((0, jsx_runtime_1.jsxs)(layout_1.default, { mainStyle: main, subject: subject, children: [(0, jsx_runtime_1.jsx)(components_1.Preview, { children: subject }), (0, jsx_runtime_1.jsx)(header_1.default, { appInfo: appInfo }), (0, jsx_runtime_1.jsx)(content_1.default, { style: container, title: title, content: body, attachments: attachments, actions: actions, locale: locale, severity: severity }), (0, jsx_runtime_1.jsx)(footer_1.default, { showCopyright: false, showBlocklet: true, appInfo: appInfo, locale: locale, unsubscribeToken: unsubscribeToken, userInfo: userInfo })] }));
13
+ const NotificationEmail = ({ title, body = '', raw = false, // do not convert body to clickable span
14
+ subject, attachments = [], actions = [], appInfo, locale = 'en', severity = 'normal', unsubscribeToken, userInfo, }) => {
15
+ return ((0, jsx_runtime_1.jsxs)(layout_1.default, { mainStyle: main, subject: subject, children: [(0, jsx_runtime_1.jsx)(components_1.Preview, { children: subject }), (0, jsx_runtime_1.jsx)(header_1.default, { appInfo: appInfo }), (0, jsx_runtime_1.jsx)(content_1.default, { style: container, title: title, content: body, attachments: attachments, actions: actions, locale: locale, severity: severity, raw: raw }), (0, jsx_runtime_1.jsx)(footer_1.default, { showCopyright: false, showBlocklet: true, appInfo: appInfo, locale: locale, unsubscribeToken: unsubscribeToken, userInfo: userInfo })] }));
15
16
  };
16
17
  exports.NotificationEmail = NotificationEmail;
17
18
  exports.default = exports.NotificationEmail;
@@ -1,7 +1,6 @@
1
1
  // Holds shared logic for session-manager v1 and v2
2
2
  const get = require('lodash/get');
3
3
  const merge = require('lodash/merge');
4
- const pick = require('lodash/pick');
5
4
  const { joinURL } = require('ufo');
6
5
  const formatContext = require('@abtnode/util/lib/format-context');
7
6
  const { extractUserAvatar, getAppAvatarUrl } = require('@abtnode/util/lib/user');
@@ -59,6 +58,7 @@ const {
59
58
  getFederatedMaster,
60
59
  shouldSyncFederated,
61
60
  getUserWithinFederated,
61
+ syncFederatedUser,
62
62
  } = require('../../util/federated');
63
63
  const { Profile } = require('../../state/profile');
64
64
 
@@ -813,38 +813,7 @@ module.exports = {
813
813
  node
814
814
  );
815
815
 
816
- const syncUserData = pick(doc, [
817
- 'did',
818
- 'pk',
819
- 'fullName',
820
- 'avatar',
821
- 'email',
822
- 'phone',
823
- 'url',
824
- 'inviter',
825
- 'generation',
826
- 'emailVerified',
827
- 'phoneVerified',
828
- ]);
829
- if (syncUserData.avatar) {
830
- syncUserData.avatar = getUserAvatarUrl(syncUserData.avatar, blocklet);
831
- }
832
- const masterSite = getFederatedMaster(blocklet);
833
- // NOTICE: 采用异步来更新,不阻塞接口的正常响应
834
- if (shouldSyncFederated(sourceAppPid, blocklet)) {
835
- node.syncFederated({
836
- did: teamDid,
837
- data: {
838
- users: [
839
- {
840
- ...syncUserData,
841
- action: 'switchProfile',
842
- sourceAppPid: sourceAppPid || masterSite.appPid,
843
- },
844
- ],
845
- },
846
- });
847
- }
816
+ syncFederatedUser(blocklet, node, doc, sourceAppPid);
848
817
 
849
818
  // @NOTE: 异步地刷新 profile
850
819
  Profile.refresh({
@@ -1163,6 +1132,9 @@ module.exports = {
1163
1132
  pk: userPk,
1164
1133
  lastLoginAt: currentTime,
1165
1134
  firstLoginAt: currentTime,
1135
+ userInfo: {
1136
+ wallet: request.context.didwallet,
1137
+ },
1166
1138
  };
1167
1139
 
1168
1140
  await node.updateUser({
package/api/libs/email.js CHANGED
@@ -12,7 +12,11 @@ const schemaEmail = Joi.string().email().required();
12
12
 
13
13
  const validateEmail = schemaEmail.validateAsync.bind(schemaEmail);
14
14
 
15
- async function sendEmail(receiver, notification, { teamDid, node, locale, unsubscribeToken = '', userInfo = {} }) {
15
+ async function sendEmail(
16
+ receiver,
17
+ notification,
18
+ { teamDid, node, locale, unsubscribeToken = '', userInfo = {}, raw = false }
19
+ ) {
16
20
  if (!receiver) {
17
21
  throw new Error('receiver is required');
18
22
  }
@@ -61,6 +65,7 @@ async function sendEmail(receiver, notification, { teamDid, node, locale, unsubs
61
65
  ...notification,
62
66
  appInfo,
63
67
  locale,
68
+ raw,
64
69
  unsubscribeToken,
65
70
  userInfo: {
66
71
  ...userInfo,
package/api/libs/kyc.js CHANGED
@@ -1,12 +1,16 @@
1
1
  const get = require('lodash/get');
2
2
  const uniq = require('lodash/uniq');
3
3
  const pick = require('lodash/pick');
4
+ const trim = require('lodash/trim');
5
+ const lowerCase = require('lodash/lowerCase');
4
6
  const semver = require('semver');
5
7
  const { messages, getVCFromClaims } = require('@abtnode/auth/lib/auth');
6
8
  const { getPassportClaimUrl, getKycAcquireUrl } = require('@abtnode/auth/lib/passport');
9
+ const logger = require('@abtnode/logger')('@abtnode/blocklet-services/kyc');
7
10
 
8
11
  const { getTrustedIssuers } = require('../util/blocklet-utils');
9
12
  const { PASSPORT_VC_TYPES } = require('./auth/utils');
13
+ const { api } = require('./api');
10
14
 
11
15
  const getPassportVc = async ({ blocklet, claims, challenge, locale, sourceAppPid, types = PASSPORT_VC_TYPES }) => {
12
16
  const trustedIssuers = await getTrustedIssuers(blocklet, { sourceAppPid });
@@ -39,6 +43,35 @@ function isProfileUrlSupported(didWallet) {
39
43
  return webCanUse || iosCanUse || androidCanUse;
40
44
  }
41
45
 
46
+ function createEmailDomainChecker(toggleField, listField, valueOnDisabled = false) {
47
+ return async (blocklet, email) => {
48
+ if (!email) {
49
+ return false;
50
+ }
51
+ let domain = email.split('@')[1];
52
+ if (!domain) {
53
+ return false;
54
+ }
55
+ domain = domain.toLowerCase();
56
+
57
+ const config = blocklet.settings?.session?.email || {};
58
+ if (!config[toggleField]) {
59
+ return valueOnDisabled;
60
+ }
61
+ if (!config[listField] || !Array.isArray(config[listField]) || config[listField].length === 0) {
62
+ return valueOnDisabled;
63
+ }
64
+
65
+ const results = await Promise.allSettled(config[listField].map((x) => api.get(x, { timeout: 5000 })));
66
+ const data = results
67
+ .filter((x) => x.status === 'fulfilled' && x.value.data)
68
+ .map((x) => (x.value.data || '').split('\n').map(trim));
69
+ return data.some((x) => x.includes(domain));
70
+ };
71
+ }
72
+ const isEmailBlocked = createEmailDomainChecker('enableDomainBlackList', 'domainBlackList', false);
73
+ const isEmailAllowed = createEmailDomainChecker('enableDomainWhiteList', 'domainWhiteList', true);
74
+
42
75
  /**
43
76
  * @description
44
77
  * @param {object} settings
@@ -127,6 +160,20 @@ function getKycClaims(blocklet, user, locale, baseUrl, trustedIssuers) {
127
160
  return claims;
128
161
  }
129
162
 
163
+ const isSameEmail = (email1, email2) => {
164
+ if (!email1 || !email2) {
165
+ return false;
166
+ }
167
+ return lowerCase(email1) === lowerCase(email2);
168
+ };
169
+
170
+ const isSamePhone = (phone1, phone2) => {
171
+ if (!phone1 || !phone2) {
172
+ return false;
173
+ }
174
+ return phone1.replace(/\s+/g, '').replace(/[()-]/g, '') === phone2.replace(/\s+/g, '').replace(/[()-]/g, '');
175
+ };
176
+
130
177
  async function verifyKycClaims({ node, blocklet, teamDid, claims, challenge, locale, sourceAppPid, user }) {
131
178
  const profile = claims.find((claim) => claim.type === 'profile');
132
179
  const kycUpdates = pick(user || {}, ['emailVerified', 'phoneVerified']);
@@ -145,9 +192,21 @@ async function verifyKycClaims({ node, blocklet, teamDid, claims, challenge, loc
145
192
  throw new Error(messages.missingEmailKyc[locale]);
146
193
  }
147
194
  const email = get(emailKyc, 'credentialSubject.kyc.subject');
148
- if (profile?.email && profile.email !== email) {
195
+ if (profile?.email && !isSameEmail(profile.email, email)) {
149
196
  throw new Error(messages.emailMismatch[locale]);
150
197
  }
198
+
199
+ const allowed = await isEmailAllowed(blocklet, email);
200
+ if (!allowed) {
201
+ logger.warn('Email domain is not allowed', { teamDid, email });
202
+ throw new Error(messages.emailBlocked[locale]);
203
+ }
204
+ const blocked = await isEmailBlocked(blocklet, email);
205
+ if (blocked) {
206
+ logger.warn('Email domain is blocked', { teamDid, email });
207
+ throw new Error(messages.emailBlocked[locale]);
208
+ }
209
+
151
210
  if (!user && isEmailUniqueRequired(blocklet)) {
152
211
  const isEmailUsed = await node.isEmailUsed({ teamDid, email, verified: true });
153
212
  if (isEmailUsed) {
@@ -157,6 +216,17 @@ async function verifyKycClaims({ node, blocklet, teamDid, claims, challenge, loc
157
216
 
158
217
  kycUpdates.emailVerified = true;
159
218
  } else if (!user && profile?.email && isEmailUniqueRequired(blocklet)) {
219
+ const allowed = await isEmailAllowed(blocklet, profile.email);
220
+ if (!allowed) {
221
+ logger.warn('Email domain is not allowed', { teamDid, email: profile.email });
222
+ throw new Error(messages.emailBlocked[locale]);
223
+ }
224
+ const blocked = await isEmailBlocked(blocklet, profile.email);
225
+ if (blocked) {
226
+ logger.warn('Email domain is blocked', { teamDid, email: profile.email });
227
+ throw new Error(messages.emailBlocked[locale]);
228
+ }
229
+
160
230
  const isEmailUsed = await node.isEmailUsed({ teamDid, email: profile.email, verified: false });
161
231
  if (isEmailUsed) {
162
232
  throw new Error(messages.emailAlreadyUsed[locale]);
@@ -177,7 +247,7 @@ async function verifyKycClaims({ node, blocklet, teamDid, claims, challenge, loc
177
247
  throw new Error(messages.missingPhoneKyc[locale]);
178
248
  }
179
249
  const phone = get(phoneKyc, 'credentialSubject.kyc.subject');
180
- if (profile?.phone && profile.phone !== phone) {
250
+ if (profile?.phone && !isSamePhone(profile.phone, phone)) {
181
251
  throw new Error(messages.phoneMismatch[locale]);
182
252
  }
183
253
  if (!user && isPhoneUniqueRequired(blocklet)) {
@@ -210,4 +280,8 @@ module.exports = {
210
280
  getKycClaims,
211
281
  verifyKycClaims,
212
282
  getPassportVc,
283
+ isEmailBlocked,
284
+ isEmailAllowed,
285
+ isSameEmail,
286
+ isSamePhone,
213
287
  };
@@ -31,7 +31,7 @@ const { sendToUser } = require('../libs/notification');
31
31
  const { isInvitedUserOnly, createTokenFn, getDidConnectVersion } = require('../util');
32
32
  const { ApiError } = require('../util/error');
33
33
  const federatedUtil = require('../util/federated');
34
- const { isOAuthEmailVerified, isEmailUniqueRequired, isEmailKycRequired } = require('../libs/kyc');
34
+ const { isOAuthEmailVerified, isEmailUniqueRequired, isEmailKycRequired, isSameEmail } = require('../libs/kyc');
35
35
 
36
36
  const PREFIX = WELLKNOWN_SERVICE_PATH_PREFIX;
37
37
 
@@ -438,7 +438,7 @@ async function invite(req, node, options) {
438
438
  fullName: oauthInfo.name,
439
439
  avatar: getUserAvatarUrl(baseUrl, avatar),
440
440
  };
441
- if (profile.email === oauthInfo.email && isOAuthEmailVerified(blocklet, oauthInfo)) {
441
+ if (isSameEmail(profile.email, oauthInfo.email) && isOAuthEmailVerified(blocklet, oauthInfo)) {
442
442
  profile.emailVerified = true;
443
443
  }
444
444
  }
@@ -644,7 +644,7 @@ async function bind(req, node, options) {
644
644
  avatar,
645
645
  };
646
646
 
647
- if (mergeProfile.email === oauthInfo.email && isOAuthEmailVerified(blocklet, oauthInfo)) {
647
+ if (isSameEmail(mergeProfile.email, oauthInfo.email) && isOAuthEmailVerified(blocklet, oauthInfo)) {
648
648
  mergeProfile.emailVerified = true;
649
649
  }
650
650
 
@@ -91,17 +91,17 @@ function mergeOpenAPI(dataList, { blocklet }) {
91
91
  }
92
92
 
93
93
  async function generateOpenAPIData({ blocklet, did }) {
94
- const blockletCompontList = blocklet?.children || [];
94
+ const blockletComponents = blocklet?.children || [];
95
95
  const appUrl = blocklet?.environmentObj?.BLOCKLET_APP_URL;
96
96
  const healthCheckUrl = joinURL(appUrl, '.well-known/service/health');
97
97
  const { data: healthCheckData } = await api.get(healthCheckUrl);
98
- const runningCompontList = blockletCompontList.filter((x) => {
98
+ const runningComponents = blockletComponents.filter((x) => {
99
99
  const status = healthCheckData.components?.[x.meta.did];
100
100
  return status?.running === true;
101
101
  });
102
102
  // 单个 component
103
103
  if (did) {
104
- const findComponent = runningCompontList.find((component) => component?.meta?.did === did);
104
+ const findComponent = runningComponents.find((component) => component?.meta?.did === did);
105
105
  if (findComponent) {
106
106
  const result = getComponentOpenAPIData(findComponent, { baseUrl: appUrl });
107
107
  return result;
@@ -109,7 +109,7 @@ async function generateOpenAPIData({ blocklet, did }) {
109
109
  return null;
110
110
  }
111
111
  // 多个 component 组合
112
- const componentListData = await pMap(runningCompontList, (x) => getComponentOpenAPIData(x, { baseUrl: appUrl }));
112
+ const componentListData = await pMap(runningComponents, (x) => getComponentOpenAPIData(x, { baseUrl: appUrl }));
113
113
  const result = mergeOpenAPI(componentListData, { blocklet });
114
114
  return result;
115
115
  }
@@ -87,17 +87,17 @@ function mergeOpenComponent(dataList, { blocklet }) {
87
87
  }
88
88
 
89
89
  async function generateOpenComponentData({ blocklet, did }) {
90
- const blockletCompontList = blocklet?.children || [];
90
+ const blockletComponents = blocklet?.children || [];
91
91
  const appUrl = blocklet?.environmentObj?.BLOCKLET_APP_URL;
92
92
  const healthCheckUrl = joinURL(appUrl, '.well-known/service/health');
93
93
  const { data: healthCheckData } = await api.get(healthCheckUrl);
94
- const runningCompontList = blockletCompontList.filter((x) => {
94
+ const runningComponents = blockletComponents.filter((x) => {
95
95
  const status = healthCheckData.components?.[x.meta.did];
96
96
  return status?.running === true;
97
97
  });
98
98
  // 单个 component
99
99
  if (did) {
100
- const findComponent = runningCompontList.find((component) => component?.meta?.did === did);
100
+ const findComponent = runningComponents.find((component) => component?.meta?.did === did);
101
101
  if (findComponent) {
102
102
  const result = getComponentOpenComponentData(findComponent, { baseUrl: appUrl });
103
103
  return result;
@@ -105,9 +105,7 @@ async function generateOpenComponentData({ blocklet, did }) {
105
105
  return null;
106
106
  }
107
107
  // 多个 component 组合
108
- const componentListData = await pMap(runningCompontList, (x) =>
109
- getComponentOpenComponentData(x, { baseUrl: appUrl })
110
- );
108
+ const componentListData = await pMap(runningComponents, (x) => getComponentOpenComponentData(x, { baseUrl: appUrl }));
111
109
  const result = mergeOpenComponent(componentListData, { blocklet });
112
110
  return result;
113
111
  }
@@ -1,5 +1,6 @@
1
1
  const { WELLKNOWN_SERVICE_PATH_PREFIX } = require('@abtnode/constant');
2
2
  const { BLOCKLET_OPENEMBED_PREFIX } = require('@blocklet/constant');
3
+ const formatError = require('@abtnode/util/lib/format-error');
3
4
  const pMap = require('p-map');
4
5
  const YAML = require('yaml');
5
6
  const { joinURL, withQuery, withLeadingSlash, withoutTrailingSlash } = require('ufo');
@@ -25,7 +26,7 @@ async function getComponentOpenEmbedData(component) {
25
26
  result = JSON.parse(result);
26
27
  }
27
28
  } catch (err) {
28
- console.error('openembed.json parse error', err);
29
+ console.error('openembed.json parse error', formatError(err));
29
30
  return null;
30
31
  }
31
32
 
@@ -107,17 +108,17 @@ async function mergeOpenEmbed(dataList, { blocklet, node }) {
107
108
  }
108
109
 
109
110
  async function generateOpenEmbedData({ blocklet, did, node }) {
110
- const blockletCompontList = blocklet?.children || [];
111
+ const blockletComponents = blocklet?.children || [];
111
112
  const appUrl = blocklet?.environmentObj?.BLOCKLET_APP_URL;
112
113
  const healthCheckUrl = joinURL(appUrl, '/.well-known/service/health');
113
114
  const { data: healthCheckData } = await api.get(healthCheckUrl);
114
- const runningCompontList = blockletCompontList.filter((x) => {
115
+ const runningComponents = blockletComponents.filter((x) => {
115
116
  const status = healthCheckData.components?.[x.meta.did];
116
117
  return hasStartEngine(x?.meta) && status?.running === true;
117
118
  });
118
119
  // 单个 component
119
120
  if (did) {
120
- const findComponent = runningCompontList.find((component) => component?.meta?.did === did);
121
+ const findComponent = runningComponents.find((component) => component?.meta?.did === did);
121
122
  if (findComponent) {
122
123
  const result = getComponentOpenEmbedData(findComponent, { baseUrl: appUrl });
123
124
  return result;
@@ -125,7 +126,7 @@ async function generateOpenEmbedData({ blocklet, did, node }) {
125
126
  return null;
126
127
  }
127
128
  // 多个 component 组合
128
- const componentListData = await pMap(runningCompontList, (x) => getComponentOpenEmbedData(x, { baseUrl: appUrl }), {
129
+ const componentListData = await pMap(runningComponents, (x) => getComponentOpenEmbedData(x, { baseUrl: appUrl }), {
129
130
  concurrency: 3,
130
131
  stopOnError: false,
131
132
  });
@@ -3,6 +3,7 @@ const logger = require('../../../libs/logger')(require('../../../../package.json
3
3
 
4
4
  const { onConnect, onApprove, authPrincipal } = bindWallet;
5
5
 
6
+ // eslint-disable-next-line no-unused-vars
6
7
  module.exports = function createRoutes(node, authenticator, createSessionToken) {
7
8
  return {
8
9
  action: 'bind-wallet',
@@ -24,27 +25,16 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
24
25
  });
25
26
  },
26
27
 
27
- onAuth: async ({
28
- claims,
29
- challenge,
30
- userDid,
31
- userPk,
32
- extraParams: { locale, componentId, previousUserDid },
33
- req,
34
- baseUrl,
35
- }) => {
28
+ onAuth: async ({ claims, userDid, userPk, extraParams: { locale, previousUserDid }, req, baseUrl }) => {
36
29
  try {
37
30
  const result = await onApprove({
38
31
  node,
39
32
  request: req,
40
33
  locale,
41
- challenge,
42
34
  userDid,
43
35
  userPk,
44
36
  baseUrl,
45
37
  claims,
46
- createSessionToken,
47
- componentId,
48
38
  previousUserDid,
49
39
  });
50
40
 
@@ -1,6 +1,7 @@
1
1
  const { messages } = require('@abtnode/auth/lib/auth');
2
2
  const { getKycClaims, verifyKycClaims, getProfileItems, isProfileClaimRequired } = require('../../../libs/kyc');
3
3
  const { getTrustedIssuers } = require('../../../util/blocklet-utils');
4
+ const { syncFederatedUser } = require('../../../util/federated');
4
5
 
5
6
  // Used to update user kyc status using existing certificates
6
7
  // eslint-disable-next-line no-unused-vars
@@ -34,7 +35,12 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
34
35
  }
35
36
 
36
37
  const trustedIssuers = await getTrustedIssuers(blocklet, { sourceAppPid });
37
- return Object.assign(claims, getKycClaims(blocklet, user, locale, baseUrl, trustedIssuers));
38
+ Object.assign(claims, getKycClaims(blocklet, user, locale, baseUrl, trustedIssuers));
39
+ if (Object.keys(claims).length === 0) {
40
+ throw new Error(messages.noKycRequired[locale]);
41
+ }
42
+
43
+ return claims;
38
44
  },
39
45
 
40
46
  onAuth: async ({ userDid, claims, challenge, extraParams, request }) => {
@@ -78,12 +84,14 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
78
84
  teamDid: blocklet.appPid,
79
85
  user: {
80
86
  did: user.did,
81
- kycChanged: true,
82
87
  ...kycUpdates,
83
88
  ...profileUpdates,
84
89
  },
85
90
  });
86
91
 
92
+ // 同步到站点群
93
+ syncFederatedUser(blocklet, node, updatedUser, sourceAppPid);
94
+
87
95
  return updatedUser;
88
96
  },
89
97
  };
@@ -1,7 +1,7 @@
1
- const { WELLKNOWN_SERVICE_PATH_PREFIX } = require('@abtnode/constant');
1
+ const { WELLKNOWN_SERVICE_PATH_PREFIX, VERIFY_CODE_TTL } = require('@abtnode/constant');
2
2
  const { emailSchema } = require('../../socket/channel/did');
3
3
  const { sendEmail } = require('../../libs/email');
4
- const { isEmailKycRequired, isEmailUniqueRequired } = require('../../libs/kyc');
4
+ const { isEmailKycRequired, isEmailUniqueRequired, isEmailBlocked, isEmailAllowed } = require('../../libs/kyc');
5
5
 
6
6
  const logger = require('../../libs/logger')('kyc');
7
7
 
@@ -33,6 +33,24 @@ const init = ({ node }) => {
33
33
  }
34
34
  }
35
35
 
36
+ const isAllowed = await isEmailAllowed(blocklet, subject);
37
+ if (!isAllowed) {
38
+ logger.warn('Email domain is not allowed', { teamDid, subject });
39
+ return res.status(400).send({
40
+ error: 'Email domain is not allowed, please use another email',
41
+ code: 'email_not_allowed',
42
+ });
43
+ }
44
+
45
+ const isBlocked = await isEmailBlocked(blocklet, subject);
46
+ if (isBlocked) {
47
+ logger.warn('Email domain is blocked', { teamDid, subject });
48
+ return res.status(400).send({
49
+ error: 'Email domain is blocked, please use another email',
50
+ code: 'email_blocked',
51
+ });
52
+ }
53
+
36
54
  if (await node.isSubjectSent({ teamDid, subject })) {
37
55
  return res.status(400).send({
38
56
  error: 'Email is already sent, please check your inbox, or retry later',
@@ -47,12 +65,16 @@ const init = ({ node }) => {
47
65
  subject,
48
66
  {
49
67
  title: `Verify Your Email on ${info.name}`,
50
- body: `To ensure the security of your account and enhance your experience, you need to use following code to verify your email, and you will receive a certificate in your DID Wallet upon verification.\n\nYour verify code is ${doc.code}, please use it within 30 minutes.\n\nThank you for taking the time to enhance your account's security.`,
68
+ body: `<p style="font-size:14px;line-height:24px;margin:16px 0;">To ensure the security of your account and enhance your experience, you need to use following code to verify your email, and you will receive a certificate in your DID Wallet upon verification.</p>
69
+ <p style="font-size:36px; line-height:24px; color: #333; font-weight: bold; text-align: center;">${doc.code}</p>
70
+ <p style="font-size:14px;line-height:24px;margin:16px 0;">This code is valid for ${VERIFY_CODE_TTL / 60 / 1000} minutes. If you don't want to verify your email, you can ignore this message.</p>
71
+ <p style="font-size:14px;line-height:24px;margin:16px 0;">${info.name} will never email you and ask you to disclose your password, credit card, or banking account number. </p>`,
51
72
  },
52
73
  {
53
74
  teamDid,
54
75
  node,
55
76
  locale: req.query.locale,
77
+ raw: true,
56
78
  }
57
79
  );
58
80
  logger.info('send verify code', { teamDid, result });
@@ -67,8 +89,6 @@ const init = ({ node }) => {
67
89
 
68
90
  const onEndEmailVerify = async (req, res) => {
69
91
  try {
70
- logger.info('onEndEmailVerify', { payload: req.body, user: req.user });
71
-
72
92
  const blocklet = await req.getBlocklet();
73
93
  const teamDid = blocklet.meta.did;
74
94
 
@@ -132,6 +132,40 @@ async function getUserWithinFederated({ userDid, userPk, teamDid, sourceAppPid }
132
132
  return currentUser;
133
133
  }
134
134
 
135
+ function syncFederatedUser(blocklet, node, user, sourceAppPid) {
136
+ const masterSite = getFederatedMaster(blocklet);
137
+ if (shouldSyncFederated(sourceAppPid, blocklet)) {
138
+ const data = pick(user, [
139
+ 'did',
140
+ 'pk',
141
+ 'fullName',
142
+ 'avatar',
143
+ 'email',
144
+ 'phone',
145
+ 'url',
146
+ 'inviter',
147
+ 'generation',
148
+ 'emailVerified',
149
+ 'phoneVerified',
150
+ ]);
151
+ if (data.avatar) {
152
+ data.avatar = getUserAvatarUrl(data.avatar, blocklet);
153
+ }
154
+ node.syncFederated({
155
+ did: blocklet.appPid,
156
+ data: {
157
+ users: [
158
+ {
159
+ ...data,
160
+ action: 'switchProfile',
161
+ sourceAppPid: sourceAppPid || masterSite.appPid,
162
+ },
163
+ ],
164
+ },
165
+ });
166
+ }
167
+ }
168
+
135
169
  module.exports = {
136
170
  isMaster,
137
171
  shouldSyncFederated,
@@ -142,4 +176,5 @@ module.exports = {
142
176
  getOAuthUserInfo,
143
177
  loginByMember,
144
178
  getUserWithinFederated,
179
+ syncFederatedUser,
145
180
  };
@@ -1 +1 @@
1
- import{X as r,Y as t,j as a}from"./index-CEaTcEQs.js";var e={},u=t;Object.defineProperty(e,"__esModule",{value:!0});var d=e.default=void 0,v=u(r()),o=a;d=e.default=(0,v.default)((0,o.jsx)("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6z"}),"Add");export{d};
1
+ import{X as r,Y as t,j as a}from"./index-BP0e3trc.js";var e={},u=t;Object.defineProperty(e,"__esModule",{value:!0});var d=e.default=void 0,v=u(r()),o=a;d=e.default=(0,v.default)((0,o.jsx)("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6z"}),"Add");export{d};
@@ -1 +1 @@
1
- import{aE as w,aF as H,at as c,j as e,aG as d,ai as T,aH as g,cd as y,ce as I,aK as n,r as _,aI as F,aJ as U,aC as V,aM as Z,aN as D}from"./index-CEaTcEQs.js";import{u as M}from"./useSlot-CDa1PttK.js";function G(t){return H("MuiAlert",t)}const S=w("MuiAlert",["root","action","icon","message","filled","colorSuccess","colorInfo","colorWarning","colorError","filledSuccess","filledInfo","filledWarning","filledError","outlined","outlinedSuccess","outlinedInfo","outlinedWarning","outlinedError","standard","standardSuccess","standardInfo","standardWarning","standardError"]),J=c(e.jsx("path",{d:"M20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4C12.76,4 13.5,4.11 14.2, 4.31L15.77,2.74C14.61,2.26 13.34,2 12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0, 0 22,12M7.91,10.08L6.5,11.5L11,16L21,6L19.59,4.58L11,13.17L7.91,10.08Z"}),"SuccessOutlined"),K=c(e.jsx("path",{d:"M12 5.99L19.53 19H4.47L12 5.99M12 2L1 21h22L12 2zm1 14h-2v2h2v-2zm0-6h-2v4h2v-4z"}),"ReportProblemOutlined"),q=c(e.jsx("path",{d:"M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"}),"ErrorOutline"),Q=c(e.jsx("path",{d:"M11,9H13V7H11M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20, 12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10, 10 0 0,0 12,2M11,17H13V11H11V17Z"}),"InfoOutlined"),X=c(e.jsx("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"}),"Close"),Y=["action","children","className","closeText","color","components","componentsProps","icon","iconMapping","onClose","role","severity","slotProps","slots","variant"],tt=t=>{const{variant:s,color:r,severity:o,classes:l}=t,u={root:["root",`color${g(r||o)}`,`${s}${g(r||o)}`,`${s}`],icon:["icon"],message:["message"],action:["action"]};return D(u,G,l)},ot=d(T,{name:"MuiAlert",slot:"Root",overridesResolver:(t,s)=>{const{ownerState:r}=t;return[s.root,s[r.variant],s[`${r.variant}${g(r.color||r.severity)}`]]}})(({theme:t})=>{const s=t.palette.mode==="light"?y:I,r=t.palette.mode==="light"?I:y;return n({},t.typography.body2,{backgroundColor:"transparent",display:"flex",padding:"6px 16px",variants:[...Object.entries(t.palette).filter(([,o])=>o.main&&o.light).map(([o])=>({props:{colorSeverity:o,variant:"standard"},style:{color:t.vars?t.vars.palette.Alert[`${o}Color`]:s(t.palette[o].light,.6),backgroundColor:t.vars?t.vars.palette.Alert[`${o}StandardBg`]:r(t.palette[o].light,.9),[`& .${S.icon}`]:t.vars?{color:t.vars.palette.Alert[`${o}IconColor`]}:{color:t.palette[o].main}}})),...Object.entries(t.palette).filter(([,o])=>o.main&&o.light).map(([o])=>({props:{colorSeverity:o,variant:"outlined"},style:{color:t.vars?t.vars.palette.Alert[`${o}Color`]:s(t.palette[o].light,.6),border:`1px solid ${(t.vars||t).palette[o].light}`,[`& .${S.icon}`]:t.vars?{color:t.vars.palette.Alert[`${o}IconColor`]}:{color:t.palette[o].main}}})),...Object.entries(t.palette).filter(([,o])=>o.main&&o.dark).map(([o])=>({props:{colorSeverity:o,variant:"filled"},style:n({fontWeight:t.typography.fontWeightMedium},t.vars?{color:t.vars.palette.Alert[`${o}FilledColor`],backgroundColor:t.vars.palette.Alert[`${o}FilledBg`]}:{backgroundColor:t.palette.mode==="dark"?t.palette[o].dark:t.palette[o].main,color:t.palette.getContrastText(t.palette[o].main)})}))]})}),st=d("div",{name:"MuiAlert",slot:"Icon",overridesResolver:(t,s)=>s.icon})({marginRight:12,padding:"7px 0",display:"flex",fontSize:22,opacity:.9}),et=d("div",{name:"MuiAlert",slot:"Message",overridesResolver:(t,s)=>s.message})({padding:"8px 0",minWidth:0,overflow:"auto"}),j=d("div",{name:"MuiAlert",slot:"Action",overridesResolver:(t,s)=>s.action})({display:"flex",alignItems:"flex-start",padding:"4px 0 0 16px",marginLeft:"auto",marginRight:-8}),z={success:e.jsx(J,{fontSize:"inherit"}),warning:e.jsx(K,{fontSize:"inherit"}),error:e.jsx(q,{fontSize:"inherit"}),info:e.jsx(Q,{fontSize:"inherit"})},nt=_.forwardRef(function(s,r){const o=F({props:s,name:"MuiAlert"}),{action:l,children:u,className:$,closeText:v="Close",color:f,components:x={},componentsProps:L={},icon:C,iconMapping:b=z,onClose:A,role:h="alert",severity:p="success",slotProps:P={},slots:R={},variant:O="standard"}=o,k=U(o,Y),a=n({},o,{color:f,severity:p,variant:O,colorSeverity:f||p}),i=tt(a),m={slots:n({closeButton:x.CloseButton,closeIcon:x.CloseIcon},R),slotProps:n({},L,P)},[B,E]=M("closeButton",{elementType:V,externalForwardedProps:m,ownerState:a}),[N,W]=M("closeIcon",{elementType:X,externalForwardedProps:m,ownerState:a});return e.jsxs(ot,n({role:h,elevation:0,ownerState:a,className:Z(i.root,$),ref:r},k,{children:[C!==!1?e.jsx(st,{ownerState:a,className:i.icon,children:C||b[p]||z[p]}):null,e.jsx(et,{ownerState:a,className:i.message,children:u}),l!=null?e.jsx(j,{ownerState:a,className:i.action,children:l}):null,l==null&&A?e.jsx(j,{ownerState:a,className:i.action,children:e.jsx(B,n({size:"small","aria-label":v,title:v,color:"inherit",onClick:A},E,{children:e.jsx(N,n({fontSize:"small"},W))}))}):null]}))});export{nt as A,X as C};
1
+ import{aE as w,aF as H,at as c,j as e,aG as d,ai as T,aH as g,cd as y,ce as I,aK as n,r as _,aI as F,aJ as U,aC as V,aM as Z,aN as D}from"./index-BP0e3trc.js";import{u as M}from"./useSlot-DEzPBH-O.js";function G(t){return H("MuiAlert",t)}const S=w("MuiAlert",["root","action","icon","message","filled","colorSuccess","colorInfo","colorWarning","colorError","filledSuccess","filledInfo","filledWarning","filledError","outlined","outlinedSuccess","outlinedInfo","outlinedWarning","outlinedError","standard","standardSuccess","standardInfo","standardWarning","standardError"]),J=c(e.jsx("path",{d:"M20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4C12.76,4 13.5,4.11 14.2, 4.31L15.77,2.74C14.61,2.26 13.34,2 12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0, 0 22,12M7.91,10.08L6.5,11.5L11,16L21,6L19.59,4.58L11,13.17L7.91,10.08Z"}),"SuccessOutlined"),K=c(e.jsx("path",{d:"M12 5.99L19.53 19H4.47L12 5.99M12 2L1 21h22L12 2zm1 14h-2v2h2v-2zm0-6h-2v4h2v-4z"}),"ReportProblemOutlined"),q=c(e.jsx("path",{d:"M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"}),"ErrorOutline"),Q=c(e.jsx("path",{d:"M11,9H13V7H11M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20, 12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10, 10 0 0,0 12,2M11,17H13V11H11V17Z"}),"InfoOutlined"),X=c(e.jsx("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"}),"Close"),Y=["action","children","className","closeText","color","components","componentsProps","icon","iconMapping","onClose","role","severity","slotProps","slots","variant"],tt=t=>{const{variant:s,color:r,severity:o,classes:l}=t,u={root:["root",`color${g(r||o)}`,`${s}${g(r||o)}`,`${s}`],icon:["icon"],message:["message"],action:["action"]};return D(u,G,l)},ot=d(T,{name:"MuiAlert",slot:"Root",overridesResolver:(t,s)=>{const{ownerState:r}=t;return[s.root,s[r.variant],s[`${r.variant}${g(r.color||r.severity)}`]]}})(({theme:t})=>{const s=t.palette.mode==="light"?y:I,r=t.palette.mode==="light"?I:y;return n({},t.typography.body2,{backgroundColor:"transparent",display:"flex",padding:"6px 16px",variants:[...Object.entries(t.palette).filter(([,o])=>o.main&&o.light).map(([o])=>({props:{colorSeverity:o,variant:"standard"},style:{color:t.vars?t.vars.palette.Alert[`${o}Color`]:s(t.palette[o].light,.6),backgroundColor:t.vars?t.vars.palette.Alert[`${o}StandardBg`]:r(t.palette[o].light,.9),[`& .${S.icon}`]:t.vars?{color:t.vars.palette.Alert[`${o}IconColor`]}:{color:t.palette[o].main}}})),...Object.entries(t.palette).filter(([,o])=>o.main&&o.light).map(([o])=>({props:{colorSeverity:o,variant:"outlined"},style:{color:t.vars?t.vars.palette.Alert[`${o}Color`]:s(t.palette[o].light,.6),border:`1px solid ${(t.vars||t).palette[o].light}`,[`& .${S.icon}`]:t.vars?{color:t.vars.palette.Alert[`${o}IconColor`]}:{color:t.palette[o].main}}})),...Object.entries(t.palette).filter(([,o])=>o.main&&o.dark).map(([o])=>({props:{colorSeverity:o,variant:"filled"},style:n({fontWeight:t.typography.fontWeightMedium},t.vars?{color:t.vars.palette.Alert[`${o}FilledColor`],backgroundColor:t.vars.palette.Alert[`${o}FilledBg`]}:{backgroundColor:t.palette.mode==="dark"?t.palette[o].dark:t.palette[o].main,color:t.palette.getContrastText(t.palette[o].main)})}))]})}),st=d("div",{name:"MuiAlert",slot:"Icon",overridesResolver:(t,s)=>s.icon})({marginRight:12,padding:"7px 0",display:"flex",fontSize:22,opacity:.9}),et=d("div",{name:"MuiAlert",slot:"Message",overridesResolver:(t,s)=>s.message})({padding:"8px 0",minWidth:0,overflow:"auto"}),j=d("div",{name:"MuiAlert",slot:"Action",overridesResolver:(t,s)=>s.action})({display:"flex",alignItems:"flex-start",padding:"4px 0 0 16px",marginLeft:"auto",marginRight:-8}),z={success:e.jsx(J,{fontSize:"inherit"}),warning:e.jsx(K,{fontSize:"inherit"}),error:e.jsx(q,{fontSize:"inherit"}),info:e.jsx(Q,{fontSize:"inherit"})},nt=_.forwardRef(function(s,r){const o=F({props:s,name:"MuiAlert"}),{action:l,children:u,className:$,closeText:v="Close",color:f,components:x={},componentsProps:L={},icon:C,iconMapping:b=z,onClose:A,role:h="alert",severity:p="success",slotProps:P={},slots:R={},variant:O="standard"}=o,k=U(o,Y),a=n({},o,{color:f,severity:p,variant:O,colorSeverity:f||p}),i=tt(a),m={slots:n({closeButton:x.CloseButton,closeIcon:x.CloseIcon},R),slotProps:n({},L,P)},[B,E]=M("closeButton",{elementType:V,externalForwardedProps:m,ownerState:a}),[N,W]=M("closeIcon",{elementType:X,externalForwardedProps:m,ownerState:a});return e.jsxs(ot,n({role:h,elevation:0,ownerState:a,className:Z(i.root,$),ref:r},k,{children:[C!==!1?e.jsx(st,{ownerState:a,className:i.icon,children:C||b[p]||z[p]}):null,e.jsx(et,{ownerState:a,className:i.message,children:u}),l!=null?e.jsx(j,{ownerState:a,className:i.action,children:l}):null,l==null&&A?e.jsx(j,{ownerState:a,className:i.action,children:e.jsx(B,n({size:"small","aria-label":v,title:v,color:"inherit",onClick:A},E,{children:e.jsx(N,n({fontSize:"small"},W))}))}):null]}))});export{nt as A,X as C};
@@ -1 +1 @@
1
- import{X as r,Y as t,j as a}from"./index-CEaTcEQs.js";var e={},o=t;Object.defineProperty(e,"__esModule",{value:!0});var u=e.default=void 0,i=o(r()),p=a;u=e.default=(0,i.default)((0,p.jsx)("path",{d:"m7 10 5 5 5-5z"}),"ArrowDropDown");export{u as d};
1
+ import{X as r,Y as t,j as a}from"./index-BP0e3trc.js";var e={},o=t;Object.defineProperty(e,"__esModule",{value:!0});var u=e.default=void 0,i=o(r()),p=a;u=e.default=(0,i.default)((0,p.jsx)("path",{d:"m7 10 5 5 5-5z"}),"ArrowDropDown");export{u as d};
@@ -1 +1 @@
1
- import{at as w,j as u,aF as C,aE as D,aG as m,aK as l,r as g,aI as F,aJ as M,aM as N,aN as z}from"./index-CEaTcEQs.js";import{u as E}from"./useSlot-CDa1PttK.js";const U=w(u.jsx("path",{d:"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"}),"Person");function L(a){return C("MuiAvatar",a)}D("MuiAvatar",["root","colorDefault","circular","rounded","square","img","fallback"]);const _=["alt","children","className","component","slots","slotProps","imgProps","sizes","src","srcSet","variant"],q=a=>{const{classes:t,variant:o,colorDefault:r}=a;return z({root:["root",o,r&&"colorDefault"],img:["img"],fallback:["fallback"]},L,t)},T=m("div",{name:"MuiAvatar",slot:"Root",overridesResolver:(a,t)=>{const{ownerState:o}=a;return[t.root,t[o.variant],o.colorDefault&&t.colorDefault]}})(({theme:a})=>({position:"relative",display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0,width:40,height:40,fontFamily:a.typography.fontFamily,fontSize:a.typography.pxToRem(20),lineHeight:1,borderRadius:"50%",overflow:"hidden",userSelect:"none",variants:[{props:{variant:"rounded"},style:{borderRadius:(a.vars||a).shape.borderRadius}},{props:{variant:"square"},style:{borderRadius:0}},{props:{colorDefault:!0},style:l({color:(a.vars||a).palette.background.default},a.vars?{backgroundColor:a.vars.palette.Avatar.defaultBg}:l({backgroundColor:a.palette.grey[400]},a.applyStyles("dark",{backgroundColor:a.palette.grey[600]})))}]})),B=m("img",{name:"MuiAvatar",slot:"Img",overridesResolver:(a,t)=>t.img})({width:"100%",height:"100%",textAlign:"center",objectFit:"cover",color:"transparent",textIndent:1e4}),G=m(U,{name:"MuiAvatar",slot:"Fallback",overridesResolver:(a,t)=>t.fallback})({width:"75%",height:"75%"});function H({crossOrigin:a,referrerPolicy:t,src:o,srcSet:r}){const[n,s]=g.useState(!1);return g.useEffect(()=>{if(!o&&!r)return;s(!1);let i=!0;const e=new Image;return e.onload=()=>{i&&s("loaded")},e.onerror=()=>{i&&s("error")},e.crossOrigin=a,e.referrerPolicy=t,e.src=o,r&&(e.srcset=r),()=>{i=!1}},[a,t,o,r]),n}const W=g.forwardRef(function(t,o){const r=F({props:t,name:"MuiAvatar"}),{alt:n,children:s,className:i,component:e="div",slots:h={},slotProps:A={},imgProps:y,sizes:k,src:p,srcSet:f,variant:P="circular"}=r,R=M(r,_);let c=null;const I=H(l({},y,{src:p,srcSet:f})),b=p||f,x=b&&I!=="error",d=l({},r,{colorDefault:!x,component:e,variant:P}),v=q(d),[S,j]=E("img",{className:v.img,elementType:B,externalForwardedProps:{slots:h,slotProps:{img:l({},y,A.img)}},additionalProps:{alt:n,src:p,srcSet:f,sizes:k},ownerState:d});return x?c=u.jsx(S,l({},j)):s||s===0?c=s:b&&n?c=n[0]:c=u.jsx(G,{ownerState:d,className:v.fallback}),u.jsx(T,l({as:e,ownerState:d,className:N(v.root,i),ref:o},R,{children:c}))});export{W as A};
1
+ import{at as w,j as u,aF as C,aE as D,aG as m,aK as l,r as g,aI as F,aJ as M,aM as N,aN as z}from"./index-BP0e3trc.js";import{u as E}from"./useSlot-DEzPBH-O.js";const U=w(u.jsx("path",{d:"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"}),"Person");function L(a){return C("MuiAvatar",a)}D("MuiAvatar",["root","colorDefault","circular","rounded","square","img","fallback"]);const _=["alt","children","className","component","slots","slotProps","imgProps","sizes","src","srcSet","variant"],q=a=>{const{classes:t,variant:o,colorDefault:r}=a;return z({root:["root",o,r&&"colorDefault"],img:["img"],fallback:["fallback"]},L,t)},T=m("div",{name:"MuiAvatar",slot:"Root",overridesResolver:(a,t)=>{const{ownerState:o}=a;return[t.root,t[o.variant],o.colorDefault&&t.colorDefault]}})(({theme:a})=>({position:"relative",display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0,width:40,height:40,fontFamily:a.typography.fontFamily,fontSize:a.typography.pxToRem(20),lineHeight:1,borderRadius:"50%",overflow:"hidden",userSelect:"none",variants:[{props:{variant:"rounded"},style:{borderRadius:(a.vars||a).shape.borderRadius}},{props:{variant:"square"},style:{borderRadius:0}},{props:{colorDefault:!0},style:l({color:(a.vars||a).palette.background.default},a.vars?{backgroundColor:a.vars.palette.Avatar.defaultBg}:l({backgroundColor:a.palette.grey[400]},a.applyStyles("dark",{backgroundColor:a.palette.grey[600]})))}]})),B=m("img",{name:"MuiAvatar",slot:"Img",overridesResolver:(a,t)=>t.img})({width:"100%",height:"100%",textAlign:"center",objectFit:"cover",color:"transparent",textIndent:1e4}),G=m(U,{name:"MuiAvatar",slot:"Fallback",overridesResolver:(a,t)=>t.fallback})({width:"75%",height:"75%"});function H({crossOrigin:a,referrerPolicy:t,src:o,srcSet:r}){const[n,s]=g.useState(!1);return g.useEffect(()=>{if(!o&&!r)return;s(!1);let i=!0;const e=new Image;return e.onload=()=>{i&&s("loaded")},e.onerror=()=>{i&&s("error")},e.crossOrigin=a,e.referrerPolicy=t,e.src=o,r&&(e.srcset=r),()=>{i=!1}},[a,t,o,r]),n}const W=g.forwardRef(function(t,o){const r=F({props:t,name:"MuiAvatar"}),{alt:n,children:s,className:i,component:e="div",slots:h={},slotProps:A={},imgProps:y,sizes:k,src:p,srcSet:f,variant:P="circular"}=r,R=M(r,_);let c=null;const I=H(l({},y,{src:p,srcSet:f})),b=p||f,x=b&&I!=="error",d=l({},r,{colorDefault:!x,component:e,variant:P}),v=q(d),[S,j]=E("img",{className:v.img,elementType:B,externalForwardedProps:{slots:h,slotProps:{img:l({},y,A.img)}},additionalProps:{alt:n,src:p,srcSet:f,sizes:k},ownerState:d});return x?c=u.jsx(S,l({},j)):s||s===0?c=s:b&&n?c=n[0]:c=u.jsx(G,{ownerState:d,className:v.fallback}),u.jsx(T,l({as:e,ownerState:d,className:N(v.root,i),ref:o},R,{children:c}))});export{W as A};