@abtnode/blocklet-services 1.16.32-beta-93e1a798 → 1.16.32-beta-76103be3
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.
- package/api/emails/components/content.js +2 -2
- package/api/emails/pages/notification.js +3 -2
- package/api/libs/connect/session.js +5 -33
- package/api/libs/email.js +6 -1
- package/api/libs/kyc.js +57 -0
- package/api/routes/openapi.js +4 -4
- package/api/routes/opencomponent.js +4 -6
- package/api/routes/openembed.js +6 -5
- package/api/services/auth/connect/bind-wallet.js +2 -12
- package/api/services/auth/connect/update-kyc.js +10 -2
- package/api/services/kyc/index.js +25 -5
- package/api/util/federated.js +35 -0
- package/dist/assets/{Add-D8jHDZuh.js → Add-BnNzBkSM.js} +1 -1
- package/dist/assets/{Alert-CRD24aa1.js → Alert-MdMGtLD7.js} +1 -1
- package/dist/assets/{ArrowDropDown-CFc0zow6.js → ArrowDropDown-BxN9s0B3.js} +1 -1
- package/dist/assets/{Avatar-BIWwirOj.js → Avatar-C8UCl2Ga.js} +1 -1
- package/dist/assets/{ButtonGroup-DcU8GHuP.js → ButtonGroup-CZa7-ajY.js} +1 -1
- package/dist/assets/{CheckCircle-BrcbSmIK.js → CheckCircle-sCoWELrn.js} +1 -1
- package/dist/assets/{ChevronLeft-Cyjchnxw.js → ChevronLeft-DkDFOWTc.js} +1 -1
- package/dist/assets/{ChevronRight-j0-gJxyM.js → ChevronRight-B4jca3VR.js} +1 -1
- package/dist/assets/{Close-B2vbXcur.js → Close-Dsq723dc.js} +1 -1
- package/dist/assets/{CloseOutlined-BWhWoWD_.js → CloseOutlined-SmGyPCCX.js} +1 -1
- package/dist/assets/{Delete-B2j1UcE8.js → Delete-Dq713V6u.js} +1 -1
- package/dist/assets/{DeleteOutline-C2h-KiXe.js → DeleteOutline-CnT4EQeF.js} +1 -1
- package/dist/assets/{DialogContentText-D5Xxal_F.js → DialogContentText-DacbluUW.js} +1 -1
- package/dist/assets/{Done-B-JT0RXC.js → Done-qR9kVgrH.js} +1 -1
- package/dist/assets/{Download-DP_lDlx2.js → Download-DW26ur5s.js} +1 -1
- package/dist/assets/{Edit-B3J8-Twv.js → Edit-Dws2_-ub.js} +1 -1
- package/dist/assets/{EditIcon-R508XR9R.js → EditIcon-CY6l5Il6.js} +1 -1
- package/dist/assets/{Error-B4vCt6tb.js → Error-C5amiEhI.js} +1 -1
- package/dist/assets/{ExpandMore-IE6fvawl.js → ExpandMore-d42Ky8li.js} +1 -1
- package/dist/assets/{FormControl-Chtq9AE7.js → FormControl-C07X4iXm.js} +1 -1
- package/dist/assets/{FormControlLabel-BmopTtvW.js → FormControlLabel-jY_KMRPD.js} +1 -1
- package/dist/assets/{FormGroup-C54kQ9N4.js → FormGroup-CErrZ95I.js} +1 -1
- package/dist/assets/{Google-DBXwxuV5.js → Google-CvInay_a.js} +1 -1
- package/dist/assets/{Hidden-DPIGUAMJ.js → Hidden-NXnAHRZU.js} +1 -1
- package/dist/assets/{InfoOutlined-BmUBc2r2.js → InfoOutlined-DiESNXUD.js} +1 -1
- package/dist/assets/{InputAdornment-DXkRELYA.js → InputAdornment-DKQXkF5o.js} +1 -1
- package/dist/assets/{InputLabel-DMWY4sIp.js → InputLabel-DCPOxFdI.js} +1 -1
- package/dist/assets/{LastPage-D0B9CdNo.js → LastPage-CupdKuWQ.js} +1 -1
- package/dist/assets/{Launch-DhHbLKKF.js → Launch-BvCfmwc3.js} +1 -1
- package/dist/assets/{LaunchOutlined-CvTIL2cU.js → LaunchOutlined-B-TcY8Ty.js} +1 -1
- package/dist/assets/{Link-CYqMveft.js → Link-B6WCZ3ri.js} +1 -1
- package/dist/assets/{ListItemText-BR6T5ZDu.js → ListItemText-CAgBao36.js} +1 -1
- package/dist/assets/{LoadingButton-DmCdDxLA.js → LoadingButton-BO2pLS2M.js} +1 -1
- package/dist/assets/{LockIcon-C1x7LbhO.js → LockIcon-C--7O0SU.js} +1 -1
- package/dist/assets/{Loop-BwgmQ4ke.js → Loop-BbewjFkt.js} +1 -1
- package/dist/assets/{MoreHoriz-NGD3jXnn.js → MoreHoriz-BnLDnV7Y.js} +1 -1
- package/dist/assets/{MoreVert-MUbtAQHv.js → MoreVert-C8wT9PBh.js} +1 -1
- package/dist/assets/{OpenInNew-CJl5exgf.js → OpenInNew-BuRkQUDs.js} +1 -1
- package/dist/assets/{Pagination-IHWKke1i.js → Pagination-Tk6JJJWb.js} +1 -1
- package/dist/assets/{PlayArrow-DzoHzRoJ.js → PlayArrow-DGa9lwdU.js} +1 -1
- package/dist/assets/{QuestionMarkCircle-TnBpzaSI.js → QuestionMarkCircle-BJqkf48h.js} +1 -1
- package/dist/assets/{RadioGroup-C6M_sifl.js → RadioGroup-Ceyc11_1.js} +1 -1
- package/dist/assets/{Search-wiijyIeu.js → Search-B37iNoKq.js} +1 -1
- package/dist/assets/{Select-CIDtym3x.js → Select-B0ouveBQ.js} +1 -1
- package/dist/assets/{ServerLogo-Bal3ugu3.js → ServerLogo-8TjGIlip.js} +1 -1
- package/dist/assets/{Skeleton-BXCyEPW7.js → Skeleton-8eEDG-Ms.js} +1 -1
- package/dist/assets/{Slider-Ntyz_Q-E.js → Slider-BujG4_Kd.js} +1 -1
- package/dist/assets/{Stack-CYabuVI4.js → Stack-C7-JMCCu.js} +1 -1
- package/dist/assets/{Stepper-DuAngjIl.js → Stepper-Bc34zZ-Y.js} +1 -1
- package/dist/assets/{TextField-x4CoNOlz.js → TextField-D1ujlYf9.js} +1 -1
- package/dist/assets/{Toolbar-DlYXwq_K.js → Toolbar-3DD8ghgH.js} +1 -1
- package/dist/assets/{ViewColumn-8HGbbav-.js → ViewColumn-Dbd2RcMW.js} +1 -1
- package/dist/assets/{ViewList-DjDLjZbQ.js → ViewList-B4KeBI85.js} +1 -1
- package/dist/assets/{access-control-BSvhOxQQ.js → access-control-g3afaGNm.js} +1 -1
- package/dist/assets/{actions-byFcd21l.js → actions-D1fO3id2.js} +1 -1
- package/dist/assets/{add-component-core-BaGwMeTq.js → add-component-core-DrCymqMX.js} +1 -1
- package/dist/assets/{add-resource-R3DTTpMs.js → add-resource-id1YX_Oo.js} +1 -1
- package/dist/assets/{addon-B9HdZ1hJ.js → addon-DwXg8kbW.js} +1 -1
- package/dist/assets/{analytics-Drr9ic2m.js → analytics-DCFGDrSe.js} +1 -1
- package/dist/assets/api-BYS9rs2B.js +1 -0
- package/dist/assets/ar-5o8kqNk7.js +1 -0
- package/dist/assets/{audit-logs-tviTMDA1.js → audit-logs-D0fFriz5.js} +1 -1
- package/dist/assets/{button-D68lNTBN.js → button-ClHJcnVR.js} +1 -1
- package/dist/assets/{click-to-copy-Cy7g0c_W.js → click-to-copy-BqLgKtqA.js} +1 -1
- package/dist/assets/{complete-N8h-bC0Y.js → complete-D-sLwQDJ.js} +4 -4
- package/dist/assets/{component-CyfiUp-R.js → component-ZjhQBkiP.js} +60 -60
- package/dist/assets/{config-BZSxOwu6.js → config-N0FSLwXJ.js} +1 -1
- package/dist/assets/{config-BEOq9uec.js → config-_xJ464M_.js} +1 -1
- package/dist/assets/{config-navigation-C6EN0Fwq.js → config-navigation-fVL2wq7x.js} +1 -1
- package/dist/assets/{confirm-Bz_GmEiI.js → confirm-WGw4zZ8r.js} +1 -1
- package/dist/assets/{connect-BZC3CdFF.js → connect-1sWbqUfW.js} +1 -1
- package/dist/assets/{connect-Cr0AxBUc.js → connect-BZGrsZSG.js} +1 -1
- package/dist/assets/{connect-to-BmqBRB3U.js → connect-to-BzHQacMQ.js} +1 -1
- package/dist/assets/{content-layout-2vv5OZW9.js → content-layout-CBN6Dvqp.js} +1 -1
- package/dist/assets/{dashboard-Cwcji3JN.js → dashboard-B4ze-X1x.js} +3 -3
- package/dist/assets/de-Lu3QkkkU.js +1 -0
- package/dist/assets/{did-address-BIfBoDiQ.js → did-address-BURJDyiC.js} +1 -1
- package/dist/assets/domain-D5gY-NEc.js +9 -0
- package/dist/assets/domain-list-Mq2Fan-d.js +15 -0
- package/dist/assets/email-B50BtSL8.js +15 -0
- package/dist/assets/es-CTrW8z60.js +1 -0
- package/dist/assets/{exchange-passport-D-WRM3Wn.js → exchange-passport-CdNpP3Y-.js} +1 -1
- package/dist/assets/{fallback-DTP7cYpM.js → fallback-BgjQELn7.js} +1 -1
- package/dist/assets/{format-error-BOzcbfGa.js → format-error-CrcMEK2V.js} +1 -1
- package/dist/assets/fr-DU73a_6g.js +1 -0
- package/dist/assets/{fuel-Bn4-TEHO.js → fuel-Ct9vWJB8.js} +1 -1
- package/dist/assets/{fullpage-rvVF1rz8.js → fullpage-DibIuyDh.js} +1 -1
- package/dist/assets/hi-KeUirlJV.js +1 -0
- package/dist/assets/{home-DR7GS6ca.js → home-D4Hg_oC0.js} +1 -1
- package/dist/assets/id-CtWLWcnp.js +1 -0
- package/dist/assets/{iframe-glv0Poq3.js → iframe-DjP5hzT4.js} +1 -1
- package/dist/assets/{index-DFZwS5zQ.js → index-2WFTBY3L.js} +1 -1
- package/dist/assets/{index-ChqFEpi4.js → index-5HAOVHgh.js} +1 -1
- package/dist/assets/{index-DZIjChbd.js → index-9sFaWssT.js} +1 -1
- package/dist/assets/{index-B5vlCSnw.js → index-B2uvJWil.js} +1 -1
- package/dist/assets/{index-BZqmUYmf.js → index-B8yobdAt.js} +1 -1
- package/dist/assets/{index-Bukl4DJp.js → index-BAM5GUAz.js} +1 -1
- package/dist/assets/{index-DgFd31_6.js → index-BCt_GquA.js} +1 -1
- package/dist/assets/{index-B6NXai6_.js → index-BOtnl4g3.js} +1 -1
- package/dist/assets/{index-CEaTcEQs.js → index-BP0e3trc.js} +6 -6
- package/dist/assets/{index-wMDpYZdf.js → index-BYp7PNIm.js} +1 -1
- package/dist/assets/{index-BcUb67P2.js → index-BxmTVomL.js} +1 -1
- package/dist/assets/{index-DWAL5jyd.js → index-C3La5sKU.js} +1 -1
- package/dist/assets/{index-C_flIkR0.js → index-CEBNAvPK.js} +1 -1
- package/dist/assets/{index-CJPYlJzX.js → index-CHp2FXIo.js} +1 -1
- package/dist/assets/{index-BbBRjIRQ.js → index-CInwQHvl.js} +1 -1
- package/dist/assets/{index-BreZlHA5.js → index-CLhW7LJ4.js} +1 -1
- package/dist/assets/{index-Bsh1JZ9i.js → index-CnjLsEef.js} +1 -1
- package/dist/assets/{index-CE9qCuXL.js → index-D-f5DDJ1.js} +1 -1
- package/dist/assets/{index-bxrR9ubG.js → index-DVc2iGFg.js} +4 -4
- package/dist/assets/{index-B8cOlg3J.js → index-DZi-2Gbw.js} +1 -1
- package/dist/assets/{index-3hwSska-.js → index-D_Vu2xLx.js} +3 -3
- package/dist/assets/{index-DYNsUZaH.js → index-Di3jF2ud.js} +1 -1
- package/dist/assets/{index-BQQSQ70k.js → index-DmXHr_Jd.js} +1 -1
- package/dist/assets/{index-CeEJtkL-.js → index-DnjFnDbB.js} +1 -1
- package/dist/assets/{index-mmP1Lkjm.js → index-DqtfVmQd.js} +1 -1
- package/dist/assets/{index-DsNs234N.js → index-Ee7FJItU.js} +1 -1
- package/dist/assets/{index-MgF3lCRP.js → index-FKe4fuVo.js} +1 -1
- package/dist/assets/{index-BNm1w4Av.js → index-h75gmDWw.js} +1 -1
- package/dist/assets/index-j2-hVzu_.js +262 -0
- package/dist/assets/{index-j8Uq5XuX.js → index-wwrsvgTo.js} +1 -1
- package/dist/assets/{index-BNFvQJs8.js → index-wxPofhyR.js} +1 -1
- package/dist/assets/{index.es-Dz_wpH3d.js → index.es-B4hyWcg0.js} +1 -1
- package/dist/assets/index.esm-Xnj83P4x.js +1 -0
- package/dist/assets/{invitation-Bxk7RQM2.js → invitation-B6D49MAH.js} +1 -1
- package/dist/assets/{invite-DxTtxFmK.js → invite-C9_gSzwl.js} +1 -1
- package/dist/assets/{issue-passport-SKwEWQ_s.js → issue-passport-C4GU6O8E.js} +1 -1
- package/dist/assets/{item-B-EBHzLe.js → item-BF5S_bSW.js} +1 -1
- package/dist/assets/ja-CrqtPWVX.js +1 -0
- package/dist/assets/{jss-plugin-props-sort.esm-Bm1tsMYs.js → jss-plugin-props-sort.esm-C037h0ZA.js} +1 -1
- package/dist/assets/ko-Cl75HOeP.js +1 -0
- package/dist/assets/{launch-result-message-CaImC-I4.js → launch-result-message-CSFk0yKu.js} +1 -1
- package/dist/assets/{layout-DskBhVxG.js → layout-Cgc_KlR_.js} +1 -1
- package/dist/assets/{list-header-CfS2OSwd.js → list-header-BJmy3Sb6.js} +1 -1
- package/dist/assets/localization-DxBUHiuu.js +1 -0
- package/dist/assets/{log-BSUm2QeV.js → log-yfx-YeX0.js} +1 -1
- package/dist/assets/{login-BXwy09YT.js → login-CBnpVuLH.js} +1 -1
- package/dist/assets/{login-oauth-callback-CrNNy4ro.js → login-oauth-callback-DhSyRbsE.js} +1 -1
- package/dist/assets/{logo-uploader-Blhm721C.js → logo-uploader-CbVnmlud.js} +3 -3
- package/dist/assets/{lost-passport-r7tegJSQ.js → lost-passport-DYISuGT6.js} +3 -3
- package/dist/assets/{lottie-Bw0llhbP.js → lottie-yg9CNUXF.js} +1 -1
- package/dist/assets/{notifications-CymYmkqD.js → notifications-sAYV5JP7.js} +1 -1
- package/dist/assets/{open-window-EH5UZ1B9.js → open-window-B3y-K43C.js} +1 -1
- package/dist/assets/overview-B2gi6-EB.js +12 -0
- package/dist/assets/{page-header-CGrnydWl.js → page-header-C178XWza.js} +1 -1
- package/dist/assets/{permission-VH_Fm7Pw.js → permission-C_C-c12n.js} +1 -1
- package/dist/assets/{preferences-D4Eq55c6.js → preferences-dJVu_aGA.js} +1 -1
- package/dist/assets/pt-DQT1OGc3.js +1 -0
- package/dist/assets/publish-resource-CmTtvQT5.js +1 -0
- package/dist/assets/react-ByKj6cfy.js +57 -0
- package/dist/assets/{redux-DN6s-mdl.js → redux-B09DmXDw.js} +1 -1
- package/dist/assets/{resource-dialog-uAYGlGhi.js → resource-dialog-BwEU4HN_.js} +1 -1
- package/dist/assets/ru-BnBjQSIA.js +1 -0
- package/dist/assets/sdk-CVUR4sWS.js +1 -0
- package/dist/assets/{selector-LFwadlX9.js → selector-C48VqXJG.js} +1 -1
- package/dist/assets/session-6dBAYf8V.js +1 -0
- package/dist/assets/setup-CW9Mc5ia.js +19 -0
- package/dist/assets/{shorten-label-DZrPE8HL.js → shorten-label-BFmx1uT0.js} +1 -1
- package/dist/assets/{slicedToArray-DEmwrQWd.js → slicedToArray-nXfwDj8Z.js} +1 -1
- package/dist/assets/{spaces-D6Mid5Z_.js → spaces-4Z8WLh5r.js} +1 -1
- package/dist/assets/{start-Dgs20fUu.js → start-CphZOBJ-.js} +1 -1
- package/dist/assets/{step-actions-CQZle7ap.js → step-actions-dsgNJO3G.js} +1 -1
- package/dist/assets/{studio-Bk3f_TnH.js → studio-CqWqozKn.js} +1 -1
- package/dist/assets/{switch-control-XeRJBgck.js → switch-control-Cfn8zFPo.js} +1 -1
- package/dist/assets/th-CGHFfwO3.js +1 -0
- package/dist/assets/{toUpper-D3wJMACz.js → toUpper-D5T8Q9sM.js} +1 -1
- package/dist/assets/{transfer-CJn1-1Hv.js → transfer-Cb9oltJL.js} +1 -1
- package/dist/assets/trim-DT0GIvSS.js +1 -0
- package/dist/assets/{uniqBy-DA6z7OdT.js → uniqBy-DcaH1r2Z.js} +1 -1
- package/dist/assets/{unsubscribe-FfeRFV57.js → unsubscribe-B_g1tnbx.js} +1 -1
- package/dist/assets/{url-join-5MzXbhiU.js → url-join-2JMT_sNX.js} +1 -1
- package/dist/assets/{use-blocklet-info-for-connect-did-spaces-C5KUrb2h.js → use-blocklet-info-for-connect-did-spaces-BdJyHLGD.js} +1 -1
- package/dist/assets/{use-mobile-mkcGNRhM.js → use-mobile-iaxCrChc.js} +1 -1
- package/dist/assets/{useAsync-ByBqdjCT.js → useAsync-BNwz4d_3.js} +1 -1
- package/dist/assets/{useFormControl-BA79DoOc.js → useFormControl-ZYiDKPwe.js} +1 -1
- package/dist/assets/{useLocalStorage-CmGNzDHX.js → useLocalStorage-DJ6SjiMe.js} +1 -1
- package/dist/assets/{useSetState-Cz7xEaUb.js → useSetState-1EVxD1ii.js} +1 -1
- package/dist/assets/{useSlot-CDa1PttK.js → useSlot-DEzPBH-O.js} +1 -1
- package/dist/assets/{useSlotProps-4qJAhdYR.js → useSlotProps-OKH9p37y.js} +1 -1
- package/dist/assets/{useThemeProps-B-j4MceL.js → useThemeProps-CYOsA0xw.js} +1 -1
- package/dist/assets/{user-center-lM3dah3G.js → user-center--iMqbkOW.js} +1 -1
- package/dist/assets/{user-sessions-Bf8PBzsX.js → user-sessions-CSjxxHUQ.js} +1 -1
- package/dist/assets/{util-CxaUEagR.js → util-BBc8rTnk.js} +1 -1
- package/dist/assets/vi-DmvzB5rE.js +1 -0
- package/dist/assets/wrap-locale-HTk2AmiE.js +1 -0
- package/dist/assets/zh-DdFcZXz5.js +2 -0
- package/dist/assets/zh-qFJGs7UR.js +1 -0
- package/dist/assets/zh-tw-DfkXr6W8.js +1 -0
- package/dist/index.html +1 -1
- package/dist/service-worker.js +1 -1
- package/package.json +18 -18
- package/dist/assets/api-DHCXgKlp.js +0 -1
- package/dist/assets/ar-BywPGmOa.js +0 -1
- package/dist/assets/de-qs3PjT55.js +0 -1
- package/dist/assets/domain-CRovIqk7.js +0 -9
- package/dist/assets/domain-list-DcneFIba.js +0 -15
- package/dist/assets/email-CeOASC0F.js +0 -9
- package/dist/assets/es-DXb9xB6c.js +0 -1
- package/dist/assets/fr-CMgZc3LR.js +0 -1
- package/dist/assets/hi-Ch52Lky6.js +0 -1
- package/dist/assets/id-_x67Rh2B.js +0 -1
- package/dist/assets/index-BNnk2PUZ.js +0 -262
- package/dist/assets/index.esm-CoLXjYXU.js +0 -1
- package/dist/assets/ja-BemsOTjE.js +0 -1
- package/dist/assets/ko-CqkhhVdi.js +0 -1
- package/dist/assets/localization-BW8TQLcf.js +0 -1
- package/dist/assets/overview-BpKMkNIP.js +0 -12
- package/dist/assets/pt-DZmF_qcN.js +0 -1
- package/dist/assets/publish-resource-CtKz6A2f.js +0 -1
- package/dist/assets/react-DJuQ-Z9X.js +0 -57
- package/dist/assets/ru-BFNdjdAO.js +0 -1
- package/dist/assets/sdk-BYKTwfxu.js +0 -1
- package/dist/assets/session-BG5hlQoH.js +0 -1
- package/dist/assets/setup-DckNmKNu.js +0 -19
- package/dist/assets/th-B61cOYck.js +0 -1
- package/dist/assets/vi-B884zOLu.js +0 -1
- package/dist/assets/wrap-locale-aLhwmHYY.js +0 -1
- package/dist/assets/zh-DjEnl7LY.js +0 -1
- package/dist/assets/zh-kNAPjCk5.js +0 -2
- 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 = '',
|
|
14
|
-
|
|
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
|
-
|
|
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(
|
|
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,15 @@
|
|
|
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');
|
|
4
5
|
const semver = require('semver');
|
|
5
6
|
const { messages, getVCFromClaims } = require('@abtnode/auth/lib/auth');
|
|
6
7
|
const { getPassportClaimUrl, getKycAcquireUrl } = require('@abtnode/auth/lib/passport');
|
|
8
|
+
const logger = require('@abtnode/logger')('@abtnode/blocklet-services/kyc');
|
|
7
9
|
|
|
8
10
|
const { getTrustedIssuers } = require('../util/blocklet-utils');
|
|
9
11
|
const { PASSPORT_VC_TYPES } = require('./auth/utils');
|
|
12
|
+
const { api } = require('./api');
|
|
10
13
|
|
|
11
14
|
const getPassportVc = async ({ blocklet, claims, challenge, locale, sourceAppPid, types = PASSPORT_VC_TYPES }) => {
|
|
12
15
|
const trustedIssuers = await getTrustedIssuers(blocklet, { sourceAppPid });
|
|
@@ -39,6 +42,35 @@ function isProfileUrlSupported(didWallet) {
|
|
|
39
42
|
return webCanUse || iosCanUse || androidCanUse;
|
|
40
43
|
}
|
|
41
44
|
|
|
45
|
+
function createEmailDomainChecker(toggleField, listField, valueOnDisabled = false) {
|
|
46
|
+
return async (blocklet, email) => {
|
|
47
|
+
if (!email) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
let domain = email.split('@')[1];
|
|
51
|
+
if (!domain) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
domain = domain.toLowerCase();
|
|
55
|
+
|
|
56
|
+
const config = blocklet.settings?.session?.email || {};
|
|
57
|
+
if (!config[toggleField]) {
|
|
58
|
+
return valueOnDisabled;
|
|
59
|
+
}
|
|
60
|
+
if (!config[listField] || !Array.isArray(config[listField]) || config[listField].length === 0) {
|
|
61
|
+
return valueOnDisabled;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const results = await Promise.allSettled(config[listField].map((x) => api.get(x, { timeout: 5000 })));
|
|
65
|
+
const data = results
|
|
66
|
+
.filter((x) => x.status === 'fulfilled' && x.value.data)
|
|
67
|
+
.map((x) => (x.value.data || '').split('\n').map(trim));
|
|
68
|
+
return data.some((x) => x.includes(domain));
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const isEmailBlocked = createEmailDomainChecker('enableDomainBlackList', 'domainBlackList', false);
|
|
72
|
+
const isEmailAllowed = createEmailDomainChecker('enableDomainWhiteList', 'domainWhiteList', true);
|
|
73
|
+
|
|
42
74
|
/**
|
|
43
75
|
* @description
|
|
44
76
|
* @param {object} settings
|
|
@@ -148,6 +180,18 @@ async function verifyKycClaims({ node, blocklet, teamDid, claims, challenge, loc
|
|
|
148
180
|
if (profile?.email && profile.email !== email) {
|
|
149
181
|
throw new Error(messages.emailMismatch[locale]);
|
|
150
182
|
}
|
|
183
|
+
|
|
184
|
+
const allowed = await isEmailAllowed(blocklet, email);
|
|
185
|
+
if (!allowed) {
|
|
186
|
+
logger.warn('Email domain is not allowed', { teamDid, email });
|
|
187
|
+
throw new Error(messages.emailBlocked[locale]);
|
|
188
|
+
}
|
|
189
|
+
const blocked = await isEmailBlocked(blocklet, email);
|
|
190
|
+
if (blocked) {
|
|
191
|
+
logger.warn('Email domain is blocked', { teamDid, email });
|
|
192
|
+
throw new Error(messages.emailBlocked[locale]);
|
|
193
|
+
}
|
|
194
|
+
|
|
151
195
|
if (!user && isEmailUniqueRequired(blocklet)) {
|
|
152
196
|
const isEmailUsed = await node.isEmailUsed({ teamDid, email, verified: true });
|
|
153
197
|
if (isEmailUsed) {
|
|
@@ -157,6 +201,17 @@ async function verifyKycClaims({ node, blocklet, teamDid, claims, challenge, loc
|
|
|
157
201
|
|
|
158
202
|
kycUpdates.emailVerified = true;
|
|
159
203
|
} else if (!user && profile?.email && isEmailUniqueRequired(blocklet)) {
|
|
204
|
+
const allowed = await isEmailAllowed(blocklet, profile.email);
|
|
205
|
+
if (!allowed) {
|
|
206
|
+
logger.warn('Email domain is not allowed', { teamDid, email: profile.email });
|
|
207
|
+
throw new Error(messages.emailBlocked[locale]);
|
|
208
|
+
}
|
|
209
|
+
const blocked = await isEmailBlocked(blocklet, profile.email);
|
|
210
|
+
if (blocked) {
|
|
211
|
+
logger.warn('Email domain is blocked', { teamDid, email: profile.email });
|
|
212
|
+
throw new Error(messages.emailBlocked[locale]);
|
|
213
|
+
}
|
|
214
|
+
|
|
160
215
|
const isEmailUsed = await node.isEmailUsed({ teamDid, email: profile.email, verified: false });
|
|
161
216
|
if (isEmailUsed) {
|
|
162
217
|
throw new Error(messages.emailAlreadyUsed[locale]);
|
|
@@ -210,4 +265,6 @@ module.exports = {
|
|
|
210
265
|
getKycClaims,
|
|
211
266
|
verifyKycClaims,
|
|
212
267
|
getPassportVc,
|
|
268
|
+
isEmailBlocked,
|
|
269
|
+
isEmailAllowed,
|
|
213
270
|
};
|
package/api/routes/openapi.js
CHANGED
|
@@ -91,17 +91,17 @@ function mergeOpenAPI(dataList, { blocklet }) {
|
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
async function generateOpenAPIData({ blocklet, did }) {
|
|
94
|
-
const
|
|
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
|
|
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 =
|
|
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(
|
|
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
|
|
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
|
|
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 =
|
|
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(
|
|
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
|
}
|
package/api/routes/openembed.js
CHANGED
|
@@ -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
|
|
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
|
|
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 =
|
|
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(
|
|
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
|
-
|
|
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:
|
|
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
|
|
package/api/util/federated.js
CHANGED
|
@@ -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-
|
|
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-
|
|
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-
|
|
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-
|
|
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};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as g,aE as j,aF as M,aG as N,aK as n,ck as V,aI as H,aJ as O,j as C,aM as _,cZ as k,c_ as y,aH as a,aN as F}from"./index-
|
|
1
|
+
import{r as g,aE as j,aF as M,aG as N,aK as n,ck as V,aI as H,aJ as O,j as C,aM as _,cZ as k,c_ as y,aH as a,aN as F}from"./index-BP0e3trc.js";function U(t){return g.Children.toArray(t).filter(o=>g.isValidElement(o))}function D(t){return M("MuiButtonGroup",t)}const i=j("MuiButtonGroup",["root","contained","outlined","text","disableElevation","disabled","firstButton","fullWidth","vertical","grouped","groupedHorizontal","groupedVertical","groupedText","groupedTextHorizontal","groupedTextVertical","groupedTextPrimary","groupedTextSecondary","groupedOutlined","groupedOutlinedHorizontal","groupedOutlinedVertical","groupedOutlinedPrimary","groupedOutlinedSecondary","groupedContained","groupedContainedHorizontal","groupedContainedVertical","groupedContainedPrimary","groupedContainedSecondary","lastButton","middleButton"]),A=["children","className","color","component","disabled","disableElevation","disableFocusRipple","disableRipple","fullWidth","orientation","size","variant"],I=(t,o)=>{const{ownerState:r}=t;return[{[`& .${i.grouped}`]:o.grouped},{[`& .${i.grouped}`]:o[`grouped${a(r.orientation)}`]},{[`& .${i.grouped}`]:o[`grouped${a(r.variant)}`]},{[`& .${i.grouped}`]:o[`grouped${a(r.variant)}${a(r.orientation)}`]},{[`& .${i.grouped}`]:o[`grouped${a(r.variant)}${a(r.color)}`]},{[`& .${i.firstButton}`]:o.firstButton},{[`& .${i.lastButton}`]:o.lastButton},{[`& .${i.middleButton}`]:o.middleButton},o.root,o[r.variant],r.disableElevation===!0&&o.disableElevation,r.fullWidth&&o.fullWidth,r.orientation==="vertical"&&o.vertical]},J=t=>{const{classes:o,color:r,disabled:s,disableElevation:v,fullWidth:b,orientation:d,variant:l}=t,u={root:["root",l,d==="vertical"&&"vertical",b&&"fullWidth",v&&"disableElevation"],grouped:["grouped",`grouped${a(d)}`,`grouped${a(l)}`,`grouped${a(l)}${a(d)}`,`grouped${a(l)}${a(r)}`,s&&"disabled"],firstButton:["firstButton"],lastButton:["lastButton"],middleButton:["middleButton"]};return F(u,D,o)},K=N("div",{name:"MuiButtonGroup",slot:"Root",overridesResolver:I})(({theme:t,ownerState:o})=>n({display:"inline-flex",borderRadius:(t.vars||t).shape.borderRadius},o.variant==="contained"&&{boxShadow:(t.vars||t).shadows[2]},o.disableElevation&&{boxShadow:"none"},o.fullWidth&&{width:"100%"},o.orientation==="vertical"&&{flexDirection:"column"},{[`& .${i.grouped}`]:n({minWidth:40,"&:hover":n({},o.variant==="contained"&&{boxShadow:"none"})},o.variant==="contained"&&{boxShadow:"none"}),[`& .${i.firstButton},& .${i.middleButton}`]:n({},o.orientation==="horizontal"&&{borderTopRightRadius:0,borderBottomRightRadius:0},o.orientation==="vertical"&&{borderBottomRightRadius:0,borderBottomLeftRadius:0},o.variant==="text"&&o.orientation==="horizontal"&&{borderRight:t.vars?`1px solid rgba(${t.vars.palette.common.onBackgroundChannel} / 0.23)`:`1px solid ${t.palette.mode==="light"?"rgba(0, 0, 0, 0.23)":"rgba(255, 255, 255, 0.23)"}`,[`&.${i.disabled}`]:{borderRight:`1px solid ${(t.vars||t).palette.action.disabled}`}},o.variant==="text"&&o.orientation==="vertical"&&{borderBottom:t.vars?`1px solid rgba(${t.vars.palette.common.onBackgroundChannel} / 0.23)`:`1px solid ${t.palette.mode==="light"?"rgba(0, 0, 0, 0.23)":"rgba(255, 255, 255, 0.23)"}`,[`&.${i.disabled}`]:{borderBottom:`1px solid ${(t.vars||t).palette.action.disabled}`}},o.variant==="text"&&o.color!=="inherit"&&{borderColor:t.vars?`rgba(${t.vars.palette[o.color].mainChannel} / 0.5)`:V(t.palette[o.color].main,.5)},o.variant==="outlined"&&o.orientation==="horizontal"&&{borderRightColor:"transparent"},o.variant==="outlined"&&o.orientation==="vertical"&&{borderBottomColor:"transparent"},o.variant==="contained"&&o.orientation==="horizontal"&&{borderRight:`1px solid ${(t.vars||t).palette.grey[400]}`,[`&.${i.disabled}`]:{borderRight:`1px solid ${(t.vars||t).palette.action.disabled}`}},o.variant==="contained"&&o.orientation==="vertical"&&{borderBottom:`1px solid ${(t.vars||t).palette.grey[400]}`,[`&.${i.disabled}`]:{borderBottom:`1px solid ${(t.vars||t).palette.action.disabled}`}},o.variant==="contained"&&o.color!=="inherit"&&{borderColor:(t.vars||t).palette[o.color].dark},{"&:hover":n({},o.variant==="outlined"&&o.orientation==="horizontal"&&{borderRightColor:"currentColor"},o.variant==="outlined"&&o.orientation==="vertical"&&{borderBottomColor:"currentColor"})}),[`& .${i.lastButton},& .${i.middleButton}`]:n({},o.orientation==="horizontal"&&{borderTopLeftRadius:0,borderBottomLeftRadius:0},o.orientation==="vertical"&&{borderTopRightRadius:0,borderTopLeftRadius:0},o.variant==="outlined"&&o.orientation==="horizontal"&&{marginLeft:-1},o.variant==="outlined"&&o.orientation==="vertical"&&{marginTop:-1})})),q=g.forwardRef(function(o,r){const s=H({props:o,name:"MuiButtonGroup"}),{children:v,className:b,color:d="primary",component:l="div",disabled:u=!1,disableElevation:B=!1,disableFocusRipple:$=!1,disableRipple:f=!1,fullWidth:x=!1,orientation:G="horizontal",size:h="medium",variant:R="outlined"}=s,T=O(s,A),m=n({},s,{color:d,component:l,disabled:u,disableElevation:B,disableFocusRipple:$,disableRipple:f,fullWidth:x,orientation:G,size:h,variant:R}),e=J(m),W=g.useMemo(()=>({className:e.grouped,color:d,disabled:u,disableElevation:B,disableFocusRipple:$,disableRipple:f,fullWidth:x,size:h,variant:R}),[d,u,B,$,f,x,h,R,e.grouped]),z=U(v),P=z.length,L=c=>{const p=c===0,E=c===P-1;return p&&E?"":p?e.firstButton:E?e.lastButton:e.middleButton};return C.jsx(K,n({as:l,role:"group",className:_(e.root,b),ref:r,ownerState:m},T,{children:C.jsx(k.Provider,{value:W,children:z.map((c,p)=>C.jsx(y.Provider,{value:L(p),children:c},p))})}))});export{q as B,U as g};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{X as r,Y as t,j as a}from"./index-
|
|
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 i=e.default=void 0,o=u(r()),l=a;i=e.default=(0,o.default)((0,l.jsx)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m-2 15-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8z"}),"CheckCircle");export{i as d};
|