您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 

691 行
37 KiB

  1. // material-ui
  2. import {
  3. Grid, Button, Typography,
  4. FormHelperText,
  5. Stack,
  6. IconButton
  7. } from '@mui/material';
  8. import MainCard from "components/MainCard";
  9. import { useEffect, useState, lazy } from "react";
  10. import * as yup from 'yup';
  11. import { useFormik } from 'formik';
  12. import * as FieldUtils from "utils/FieldUtils";
  13. import * as HttpUtils from 'utils/HttpUtils';
  14. import * as UrlUtils from "utils/ApiPathConst";
  15. import * as ComboData from "utils/ComboData";
  16. const LoadingComponent = Loadable(lazy(() => import('../../extra-pages/LoadingComponent')));
  17. import Loadable from 'components/Loadable';
  18. import { notifyActiveSuccess, notifyLockSuccess, notifySaveSuccess, notifyVerifySuccess } from 'utils/CommonFunction';
  19. import { useIntl } from "react-intl";
  20. import { PNSPS_BUTTON_THEME } from "themes/buttonConst";
  21. import { ThemeProvider } from "@emotion/react";
  22. import { EyeInvisibleOutlined, EyeOutlined } from '@ant-design/icons';
  23. import { isGrantedAny } from "auth/utils";
  24. // ==============================|| DASHBOARD - DEFAULT ||============================== //
  25. const UserInformationCard_Individual = ({ formData, loadDataFun }) => {
  26. const intl = useIntl();
  27. const [currentUserData, setCurrentUserData] = useState(formData);
  28. const [editMode, setEditMode] = useState(false);
  29. const [locked, setLocked] = useState(false);
  30. const [onReady, setOnReady] = useState(false);
  31. const [errorMsg, setErrorMsg] = useState("");
  32. const [showId, setshowId] = useState(false);
  33. const [selectedIdDocInputType, setSelectedIdDocInputType] = useState("");
  34. const handleClickShowId = () => {
  35. setshowId(!showId);
  36. };
  37. const handleMouseDownId = (event) => {
  38. event.preventDefault();
  39. };
  40. useEffect(() => {
  41. //if state data are ready and assign to different field
  42. // console.log(currentApplicationDetailData)
  43. if (Object.keys(currentUserData).length > 0) {
  44. setSelectedIdDocInputType(currentUserData.idDocType)
  45. setOnReady(true);
  46. }
  47. }, [currentUserData]);
  48. function getMaxErrStr(num, fieldname) {
  49. return intl.formatMessage({ id: 'noMoreThenNWords' }, { num: num, fieldname: fieldname ? intl.formatMessage({ id: fieldname }) + ": " : "" });
  50. }
  51. function getRequiredErrStr(fieldname) {
  52. return displayErrorMsg(intl.formatMessage({ id: 'require' }, { fieldname: fieldname ? intl.formatMessage({ id: fieldname }) : "" }));
  53. }
  54. function displayErrorMsg(errorMsg) {
  55. return <Typography variant="errorMessage1">{errorMsg}</Typography>
  56. }
  57. const formik = useFormik({
  58. enableReinitialize: true,
  59. initialValues: currentUserData,
  60. validationSchema: yup.object().shape({
  61. enName: yup.string().max(40, getMaxErrStr(40)).when('chName', {
  62. is: (chName) => chName?false:true,
  63. then: yup.string().required(intl.formatMessage({ id: 'userRequireEnglishName' }))
  64. }).nullable(),
  65. chName: yup.string().max(6, getMaxErrStr(6)).nullable(),
  66. addressLine1: yup.string().max(40, getMaxErrStr(40)).required(intl.formatMessage({ id: 'validateAddressLine1' })),
  67. addressLine2: yup.string().max(40, getMaxErrStr(40)).nullable(),
  68. addressLine3: yup.string().max(40, getMaxErrStr(40)).nullable(),
  69. emailAddress: yup.string().email(intl.formatMessage({ id: 'validEmailFormat' })).max(255).required(intl.formatMessage({ id: 'requireEmail' })),
  70. idDocType: yup.string().max(255, getMaxErrStr(255)).required(intl.formatMessage({ id: 'requireIdDocType' })),
  71. identification: yup.string().required(getRequiredErrStr('number'))
  72. .matches(/^[aA-zZ0-9\s]+$/, { message: displayErrorMsg(`${selectedIdDocInputType}${intl.formatMessage({ id: 'noSpecialCharacter' })}`) })
  73. .matches(/^\S*$/, { message: displayErrorMsg(`${selectedIdDocInputType}${intl.formatMessage({ id: 'noSpace' })}`) })
  74. .test('checkIDCardFormat', displayErrorMsg(`${intl.formatMessage({ id: 'requiredValid' })}${selectedIdDocInputType}${intl.formatMessage({ id: 'number' })}`), function (value) {
  75. var pattern_HKIDv1 = /^[A-Z]{1}[0-9]{6}$/;
  76. var pattern_HKIDv2 = /^[A-Z]{2}[0-9]{6}$/;
  77. var pattern_passport = /^[A-Z]{1}[0-9]{8}$/;
  78. var pattern_CHID = /^[0-9]{6}(20|19)[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])[0-9]{3}[0-9X]{1}/;
  79. var pattern_otherCert = /^[A-Z]{1}[0-9]{5,}/;
  80. if (value !== undefined) {
  81. switch (selectedIdDocInputType) {
  82. case "HKID":
  83. if (value.match(pattern_HKIDv1)) {
  84. return true
  85. } else if (value.match(pattern_HKIDv2)) {
  86. return true
  87. } else {
  88. return false
  89. }
  90. case "passport":
  91. if (value.match(pattern_passport)) {
  92. return true
  93. } else {
  94. return false
  95. }
  96. case "CNID":
  97. if (value.match(pattern_CHID)) {
  98. const subStr_year = value.substring(6, 10)
  99. const subStr_month = value.substring(10, 12)
  100. const subStr_date = value.substring(12, 14)
  101. const today = new Date()
  102. const inputDate = new Date(`${subStr_year}-${subStr_month}-${subStr_date}`)
  103. if (inputDate > today || inputDate === "Invalid Date" || inputDate.getFullYear().toString() !== subStr_year || (inputDate.getMonth() + 1).toString().padStart(2, "0") !== subStr_month || inputDate.getDate().toString().padStart(2, "0") !== subStr_date) {
  104. return false
  105. } else {
  106. return true
  107. }
  108. } else {
  109. return false
  110. }
  111. case "otherCert":
  112. if (value.match(pattern_otherCert)) {
  113. return true
  114. } else {
  115. return false
  116. }
  117. default:
  118. break;
  119. }
  120. }
  121. }),
  122. checkDigit: yup.string().max(1, getMaxErrStr(1)).nullable()
  123. .matches(/^[A-Z0-9\s]+$/, { message: displayErrorMsg(`${selectedIdDocInputType}${intl.formatMessage({ id: 'noSpecialCharacter' })}`) })
  124. .test('checkIDCardFormat', displayErrorMsg(`${intl.formatMessage({ id: 'requiredNumberInQuote' })}`), function (value) {
  125. console.log(selectedIdDocInputType)
  126. if (value != undefined || value != null) {
  127. switch (selectedIdDocInputType) {
  128. case "HKID":
  129. if (value.length == 1) {
  130. return true
  131. } else {
  132. return false
  133. }
  134. case "passport":
  135. return true
  136. case "CNID":
  137. return true
  138. case "otherCert":
  139. return true
  140. default:
  141. break;
  142. }
  143. } else {
  144. if (selectedIdDocInputType != "HKID"){
  145. return true
  146. } else {
  147. return false
  148. }
  149. }
  150. }),
  151. tel_countryCode: yup.string().min(3, intl.formatMessage({ id: 'require3Number' })).required(intl.formatMessage({ id: 'requireDialingCode' })),
  152. fax_countryCode: yup.string().min(3, intl.formatMessage({ id: 'require3Number' })),
  153. phoneNumber: yup.string().min(8, intl.formatMessage({ id: 'require8Number' })).required(intl.formatMessage({ id: 'requireContactNumber' })),
  154. faxNumber: yup.string().min(8, intl.formatMessage({ id: 'require8Number' })).nullable(),
  155. }),
  156. onSubmit: values => {
  157. if (values.country == null) {
  158. setErrorMsg(intl.formatMessage({ id: 'pleaseFillInCountry' }))
  159. } else {
  160. if (values.country.type == "hongKong" && values.district == null) {
  161. setErrorMsg(intl.formatMessage({ id: 'pleaseFillInDistrict' }))
  162. } else {
  163. HttpUtils.post({
  164. url: UrlUtils.POST_IND_USER + "/" + formData.id,
  165. params: {
  166. prefix: values.prefix,
  167. enName: values.enName,
  168. chName: values.chName,
  169. idDocType: values.idDocType,
  170. mobileNumber: {
  171. countryCode: values.tel_countryCode,
  172. phoneNumber: values.phoneNumber
  173. },
  174. identification: values.identification,
  175. checkDigit: values.checkDigit,
  176. faxNo: {
  177. countryCode: values.fax_countryCode,
  178. faxNumber: values.faxNumber
  179. },
  180. emailAddress: values.emailAddress,
  181. address: {
  182. country: values.country.type,
  183. district: values.district?.type,
  184. addressLine1: values.addressLine1,
  185. addressLine2: values.addressLine2,
  186. addressLine3: values.addressLine3,
  187. },
  188. preferLocale: values.preferLocale.type
  189. },
  190. onSuccess: function () {
  191. notifySaveSuccess();
  192. loadDataFun();
  193. }
  194. });
  195. }
  196. }
  197. }
  198. });
  199. useEffect(() => {
  200. if (Object.keys(formData).length > 0) {
  201. setCurrentUserData(formData);
  202. }
  203. }, [formData]);
  204. useEffect(() => {
  205. setLocked(currentUserData.locked);
  206. }, [currentUserData]);
  207. const onEditClick = () => {
  208. setEditMode(true);
  209. };
  210. const onVerifiedClick = () => {
  211. HttpUtils.get({
  212. url: UrlUtils.GET_IND_USER_VERIFY + "/" + formData.id,
  213. onSuccess: function () {
  214. notifyVerifySuccess()
  215. loadDataFun();
  216. }
  217. });
  218. };
  219. const doLock = () => {
  220. HttpUtils.get({
  221. url: UrlUtils.GET_USER_LOCK + "/" + formData.id,
  222. onSuccess: function () {
  223. notifyLockSuccess()
  224. loadDataFun();
  225. }
  226. });
  227. };
  228. const doUnlock = () => {
  229. HttpUtils.get({
  230. url: UrlUtils.GET_USER_UNLOCK + "/" + formData.id,
  231. onSuccess: function () {
  232. notifyActiveSuccess()
  233. loadDataFun();
  234. }
  235. });
  236. };
  237. return (
  238. <MainCard elevation={0}
  239. border={false}
  240. content={false}
  241. >
  242. {!onReady ?
  243. <LoadingComponent />
  244. :
  245. <form onSubmit={formik.handleSubmit} style={{ padding: 12 }}>
  246. {/*top button*/}
  247. {
  248. isGrantedAny("MAINTAIN_USER") ?
  249. <Grid item xs={12} sm={12} md={12} lg={12} sx={{ mb: 3 }} alignItems={"start"} justifyContent="center">
  250. <Grid container maxWidth justifyContent="flex-start">
  251. {editMode ?
  252. <>
  253. <ThemeProvider theme={PNSPS_BUTTON_THEME}>
  254. <Grid item sx={{ mr: 3 }}>
  255. <Button
  256. variant="contained"
  257. onClick={loadDataFun}
  258. color="cancel"
  259. >
  260. Reset & Back
  261. </Button>
  262. </Grid>
  263. <Grid item sx={{ ml: 3, mr: 3 }}>
  264. <Button
  265. variant="contained"
  266. type="submit"
  267. color="success"
  268. >
  269. Save
  270. </Button>
  271. </Grid>
  272. </ThemeProvider>
  273. </>
  274. :
  275. <>
  276. <Grid item sx={{ mr: 3 }}>
  277. <ThemeProvider theme={PNSPS_BUTTON_THEME}>
  278. <Button
  279. variant="contained"
  280. onClick={onEditClick}
  281. >
  282. Edit
  283. </Button>
  284. </ThemeProvider>
  285. </Grid>
  286. </>
  287. }
  288. </Grid>
  289. </Grid>
  290. : <></>
  291. }
  292. {/*end top button*/}
  293. <Typography variant="h4" sx={{ mt: 3, mb: 2, borderBottom: "1px solid black" }}>
  294. Individual User Details
  295. </Typography>
  296. <Grid item xs={12} sm={12} md={12} lg={12}>
  297. <Grid container>
  298. <Grid item xs={12}>
  299. <FormHelperText error id="helper-text-address1-signup">
  300. <Typography variant="errorMessage1">
  301. {errorMsg}
  302. </Typography>
  303. </FormHelperText>
  304. </Grid>
  305. <Grid item xs={12} sm={12} md={12} lg={4} >
  306. {FieldUtils.getTextField({
  307. label: "Username:",
  308. valueName: "username",
  309. disabled: true,
  310. form: formik
  311. })}
  312. </Grid>
  313. <Grid item xs={12} sm={12} md={12} lg={4}>
  314. {FieldUtils.getTextField({
  315. label: "English Name:",
  316. valueName: "enName",
  317. disabled: (!editMode),
  318. form: formik
  319. })}
  320. </Grid>
  321. <Grid item xs={12} sm={12} md={12} lg={4}>
  322. {FieldUtils.getTextField({
  323. label: "Created Date:",
  324. valueName: "createDate",
  325. disabled: true,
  326. form: formik
  327. })}
  328. </Grid>
  329. <Grid item xs={12} sm={12} md={12} lg={4}>
  330. {FieldUtils.getTextField({
  331. label: "Prefix:",
  332. valueName: "prefix",
  333. disabled: (!editMode),
  334. form: formik
  335. })}
  336. </Grid>
  337. <Grid item xs={12} sm={12} md={12} lg={4}>
  338. {FieldUtils.getTextField({
  339. label: "Chinese Name:",
  340. valueName: "chName",
  341. disabled: (!editMode),
  342. form: formik
  343. })}
  344. </Grid>
  345. <Grid item xs={12} sm={12} md={12} lg={4}>
  346. {FieldUtils.getTextField({
  347. label: "Last Updated:",
  348. valueName: "modifieDate",
  349. disabled: true,
  350. form: formik
  351. })}
  352. </Grid>
  353. <Grid item xs={12} sm={12} md={12} lg={4}>
  354. {FieldUtils.getComboField({
  355. label: "ID Type:",
  356. valueName: "idDocType",
  357. disabled: (!editMode),
  358. dataList: ComboData.idDocType,
  359. filterOptions: (options) => options,
  360. getOptionLabel: (item) => item ? typeof item === 'string' ? item : (item["type"] ? item["type"] + "-" + item["label"] : "") : "",
  361. onInputChange: (event, newValue, setInputValue) => {
  362. if (newValue == null) {
  363. setInputValue("");
  364. }
  365. let _val = newValue.split("-");
  366. if (_val[0]) {
  367. setInputValue(_val[0]);
  368. }
  369. },
  370. onChange: (event, newValue) => {
  371. if (newValue == null) {
  372. formik.setFieldValue("idDocType", "");
  373. return;
  374. }
  375. formik.setFieldValue("idDocType", newValue.type);
  376. setSelectedIdDocInputType(newValue.type);
  377. if (newValue.type !== "HKID") {
  378. formik.setFieldValue("checkDigit", "")
  379. }
  380. },
  381. form: formik
  382. })}
  383. </Grid>
  384. <Grid item xs={12} sm={12} md={12} lg={4}>
  385. {FieldUtils.getPhoneField({
  386. label: "Contact Tel:",
  387. valueName: {
  388. code: "tel_countryCode",
  389. num: "phoneNumber"
  390. },
  391. disabled: (!editMode),
  392. form: formik
  393. })}
  394. </Grid>
  395. <Grid item xs={12} sm={12} md={12} lg={4}>
  396. <Grid container alignItems={"center"}>
  397. <Grid item xs={12} md={3} lg={3} sx={{ display: 'flex', alignItems: 'center' }}>
  398. <Typography variant="h5">Verified:</Typography>
  399. </Grid>
  400. {
  401. !isGrantedAny("MAINTAIN_USER") || currentUserData.verifiedBy || editMode ?
  402. <Grid item xs={12} sm={12} md={6} lg={6} sx={{ mb: 2 }}>
  403. {FieldUtils.initField({
  404. valueName: "verifiedStatus",
  405. disabled: true,
  406. form: formik,
  407. })}
  408. </Grid>
  409. :
  410. <>
  411. <Grid item xs={8} sm={8} md={6} lg={4} sx={{ mb: 2 }}>
  412. {FieldUtils.initField({
  413. valueName: "verifiedStatus",
  414. disabled: true,
  415. form: formik,
  416. })}
  417. </Grid>
  418. <Grid item xs={2} sm={2} md={2} lg={2} sx={{ ml: 2, mb: 2 }}>
  419. <ThemeProvider theme={PNSPS_BUTTON_THEME}>
  420. <Button
  421. variant="contained"
  422. onClick={onVerifiedClick}
  423. >
  424. Verify
  425. </Button>
  426. </ThemeProvider>
  427. </Grid>
  428. </>
  429. }
  430. </Grid>
  431. </Grid>
  432. <Grid xs={12} sm={12} md={12} lg={4}>
  433. <Grid container alignItems={"center"} sx={{ mb: 2 }}>
  434. <Grid item xs={12} sm={12} md={3} lg={3} sx={{ display: 'flex', alignItems: 'center' }}>
  435. <Typography variant="h5">ID No.:</Typography>
  436. </Grid>
  437. <Grid item xs={12} sm={12} md={9} lg={6}>
  438. <Grid container>
  439. {formik.values.idDocType === "HKID" ?
  440. editMode ?
  441. <>
  442. <Grid item xs={6} sm={6} md={6} lg={7.5} sx={{ mr: 1 }}>
  443. {FieldUtils.initField({
  444. valueName: "identification",
  445. disabled: (!editMode),
  446. form: formik,
  447. placeholder: intl.formatMessage({ id: 'idDocNumber' }),
  448. inputProps: {
  449. maxLength: 7,
  450. onKeyDown: (e) => {
  451. if (e.key === 'Enter') {
  452. e.preventDefault();
  453. }
  454. },
  455. }
  456. })}
  457. </Grid>
  458. <Grid item xs={2} sm={2} md={2} lg={2} style={{ minWidth: 40 }}>
  459. {FieldUtils.initField({
  460. valueName: "checkDigit",
  461. disabled: (!editMode),
  462. form: formik,
  463. })}
  464. </Grid>
  465. </>
  466. :
  467. <Stack direction="row">
  468. <Typography variant="h5" mt={1}>
  469. {formik.values.identification?.slice(0, 4)}
  470. </Typography>
  471. <Typography variant="h5" mt={1}>
  472. {showId ? formik.values.identification?.slice(4) : "****"}{showId ? formik.values.checkDigit?'(' +formik.values.checkDigit+ ')': "()" : ""}
  473. </Typography>
  474. <IconButton
  475. aria-label="toggle id visibility"
  476. onClick={handleClickShowId}
  477. onMouseDown={handleMouseDownId}
  478. edge="end"
  479. size="large"
  480. >
  481. {showId ? <EyeOutlined /> : <EyeInvisibleOutlined />}
  482. </IconButton>
  483. </Stack>
  484. :
  485. editMode ?
  486. <>
  487. <Grid item xs={10} sm={4} md={4} lg={10}>
  488. {FieldUtils.initField({
  489. valueName: "identification",
  490. disabled: (!editMode),
  491. form: formik
  492. })}
  493. </Grid>
  494. </>
  495. :
  496. <Stack direction="row">
  497. <Typography variant="h5" mt={1}>
  498. {formik.values.identification?.slice(0, 4)}
  499. </Typography>
  500. <Typography variant="h5" mt={1}>
  501. {showId ? formik.values.identification?.slice(4) : "****"}
  502. </Typography>
  503. <IconButton
  504. aria-label="toggle id visibility"
  505. onClick={handleClickShowId}
  506. onMouseDown={handleMouseDownId}
  507. edge="end"
  508. size="large"
  509. >
  510. {showId ? <EyeOutlined /> : <EyeInvisibleOutlined />}
  511. </IconButton>
  512. </Stack>
  513. }
  514. </Grid>
  515. </Grid>
  516. </Grid>
  517. </Grid>
  518. <Grid item xs={12} sm={12} md={12} lg={4}>
  519. {FieldUtils.getPhoneField({
  520. label: "Fax No.:",
  521. valueName: {
  522. code: "fax_countryCode",
  523. num: "faxNumber"
  524. },
  525. disabled: (!editMode),
  526. form: formik
  527. })}
  528. </Grid>
  529. <Grid item xs={12} sm={12} md={12} lg={4}>
  530. {FieldUtils.getTextField({
  531. label: "Last Login:",
  532. valueName: "lastLoginDate",
  533. disabled: true,
  534. form: formik
  535. })}
  536. </Grid>
  537. <Grid item xs={12} sm={12} md={12} lg={4}>
  538. {FieldUtils.getComboField({
  539. label: "Country:",
  540. valueName: "country",
  541. getOptionLabel: (option) => option.type ? intl.formatMessage({ id: option.type }) : "",
  542. dataList: ComboData.country,
  543. disabled: (!editMode),
  544. form: formik
  545. })}
  546. </Grid>
  547. <Grid item xs={12} sm={12} md={12} lg={4}>
  548. {FieldUtils.getTextField({
  549. label: "Email:",
  550. valueName: "emailAddress",
  551. disabled: (!editMode),
  552. form: formik
  553. })}
  554. </Grid>
  555. <Grid item xs={12} sm={12} md={12} lg={4}>
  556. <Grid container alignItems={"center"} sx={{ mb: 2 }}>
  557. <Grid item xs={12} sm={12} md={3} lg={3} sx={{ display: 'flex', alignItems: 'center' }}>
  558. <Typography variant="h5">Status:</Typography>
  559. </Grid>
  560. {
  561. !isGrantedAny("MAINTAIN_USER") || editMode ?
  562. <Grid item xs={8} sm={8} md={6} lg={6}>
  563. {FieldUtils.initField({
  564. valueName: "status",
  565. disabled: true,
  566. form: formik,
  567. })}
  568. </Grid>
  569. :
  570. <>
  571. <Grid item xs={8} sm={8} md={6} lg={4}>
  572. {FieldUtils.initField({
  573. valueName: "status",
  574. disabled: true,
  575. form: formik,
  576. })}
  577. </Grid>
  578. {
  579. locked ?
  580. <Grid item xs={2} sm={2} md={2} lg={2} sx={{ ml: 2 }}>
  581. <ThemeProvider theme={PNSPS_BUTTON_THEME}>
  582. <Button
  583. variant="contained"
  584. color="success"
  585. onClick={doUnlock}
  586. >
  587. Active
  588. </Button>
  589. </ThemeProvider>
  590. </Grid>
  591. :
  592. <Grid item xs={2} sm={2} md={2} lg={2} sx={{ ml: 2 }}>
  593. <ThemeProvider theme={PNSPS_BUTTON_THEME}>
  594. <Button
  595. variant="contained"
  596. color="error"
  597. onClick={doLock}
  598. >
  599. Lock
  600. </Button>
  601. </ThemeProvider>
  602. </Grid>
  603. }
  604. </>
  605. }
  606. </Grid>
  607. </Grid>
  608. <Grid item xs={12} sm={12} md={12} lg={4}>
  609. {FieldUtils.getComboField({
  610. label: "District:",
  611. valueName: "district",
  612. dataList: ComboData.district,
  613. getOptionLabel: (option) => option.type ? intl.formatMessage({ id: option.type }) : "",
  614. disabled: (!editMode),
  615. form: formik
  616. })}
  617. </Grid>
  618. <Grid item xs={12} sm={12} md={12} lg={4}>
  619. {FieldUtils.getComboField({
  620. label: intl.formatMessage({ id: 'language' }) + ":",
  621. valueName: "preferLocale",
  622. dataList: ComboData.Locale,
  623. getOptionLabel: (option) => option.label ? option.label : "",
  624. disabled: (!editMode),
  625. form: formik
  626. })}
  627. </Grid>
  628. <Grid item xs={12} sm={12} md={12} lg={12}>
  629. {FieldUtils.getAddressField({
  630. label: "Address:",
  631. valueName: ["addressLine1", "addressLine2", "addressLine3"],
  632. disabled: (!editMode),
  633. form: formik
  634. })}
  635. </Grid>
  636. </Grid>
  637. </Grid>
  638. </form>
  639. }
  640. </MainCard>
  641. );
  642. };
  643. export default UserInformationCard_Individual;