@thunderid/react 1.12.0 → 1.14.0

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 (79) hide show
  1. package/dist/api/auth/executeEmbeddedSelfFlow.d.ts +36 -0
  2. package/dist/api/auth/executeEmbeddedSelfFlow.d.ts.map +1 -0
  3. package/dist/api/auth/executeEmbeddedSelfFlow.js +30 -0
  4. package/dist/api/auth/executeEmbeddedSelfFlow.js.map +1 -0
  5. package/dist/cjs/api/auth/executeEmbeddedSelfFlow.cjs +32 -0
  6. package/dist/cjs/api/auth/executeEmbeddedSelfFlow.cjs.map +1 -0
  7. package/dist/cjs/components/account/UserProfile/BaseUserProfile.cjs +195 -46
  8. package/dist/cjs/components/account/UserProfile/BaseUserProfile.cjs.map +1 -1
  9. package/dist/cjs/components/account/UserProfile/BaseUserProfile.styles.cjs +57 -4
  10. package/dist/cjs/components/account/UserProfile/BaseUserProfile.styles.cjs.map +1 -1
  11. package/dist/cjs/components/account/UserProfile/UserProfile.cjs +13 -1
  12. package/dist/cjs/components/account/UserProfile/UserProfile.cjs.map +1 -1
  13. package/dist/cjs/components/account/VerifyAttribute/BaseVerifyAttribute.cjs +358 -0
  14. package/dist/cjs/components/account/VerifyAttribute/BaseVerifyAttribute.cjs.map +1 -0
  15. package/dist/cjs/components/account/VerifyAttribute/BaseVerifyAttribute.styles.cjs +84 -0
  16. package/dist/cjs/components/account/VerifyAttribute/BaseVerifyAttribute.styles.cjs.map +1 -0
  17. package/dist/cjs/components/account/VerifyAttribute/VerifyAttribute.cjs +94 -0
  18. package/dist/cjs/components/account/VerifyAttribute/VerifyAttribute.cjs.map +1 -0
  19. package/dist/cjs/components/auth/flow/AuthOptionFactory.cjs +26 -3
  20. package/dist/cjs/components/auth/flow/AuthOptionFactory.cjs.map +1 -1
  21. package/dist/cjs/components/auth/flow/FieldFactory.cjs +2 -1
  22. package/dist/cjs/components/auth/flow/FieldFactory.cjs.map +1 -1
  23. package/dist/cjs/components/primitives/OtpField/OtpField.cjs +10 -5
  24. package/dist/cjs/components/primitives/OtpField/OtpField.cjs.map +1 -1
  25. package/dist/cjs/components/primitives/OtpField/OtpField.styles.cjs +16 -8
  26. package/dist/cjs/components/primitives/OtpField/OtpField.styles.cjs.map +1 -1
  27. package/dist/cjs/contexts/ComponentRenderer/ComponentRendererContext.cjs.map +1 -1
  28. package/dist/cjs/contexts/ThunderID/ThunderIDProvider.cjs +14 -0
  29. package/dist/cjs/contexts/ThunderID/ThunderIDProvider.cjs.map +1 -1
  30. package/dist/cjs/index.cjs +30 -0
  31. package/dist/components/account/UserProfile/BaseUserProfile.d.ts +27 -1
  32. package/dist/components/account/UserProfile/BaseUserProfile.d.ts.map +1 -1
  33. package/dist/components/account/UserProfile/BaseUserProfile.js +197 -48
  34. package/dist/components/account/UserProfile/BaseUserProfile.js.map +1 -1
  35. package/dist/components/account/UserProfile/BaseUserProfile.styles.d.ts.map +1 -1
  36. package/dist/components/account/UserProfile/BaseUserProfile.styles.js +57 -4
  37. package/dist/components/account/UserProfile/BaseUserProfile.styles.js.map +1 -1
  38. package/dist/components/account/UserProfile/UserProfile.d.ts +7 -1
  39. package/dist/components/account/UserProfile/UserProfile.d.ts.map +1 -1
  40. package/dist/components/account/UserProfile/UserProfile.js +14 -2
  41. package/dist/components/account/UserProfile/UserProfile.js.map +1 -1
  42. package/dist/components/account/VerifyAttribute/BaseVerifyAttribute.d.ts +113 -0
  43. package/dist/components/account/VerifyAttribute/BaseVerifyAttribute.d.ts.map +1 -0
  44. package/dist/components/account/VerifyAttribute/BaseVerifyAttribute.js +354 -0
  45. package/dist/components/account/VerifyAttribute/BaseVerifyAttribute.js.map +1 -0
  46. package/dist/components/account/VerifyAttribute/BaseVerifyAttribute.styles.d.ts +10 -0
  47. package/dist/components/account/VerifyAttribute/BaseVerifyAttribute.styles.d.ts.map +1 -0
  48. package/dist/components/account/VerifyAttribute/BaseVerifyAttribute.styles.js +82 -0
  49. package/dist/components/account/VerifyAttribute/BaseVerifyAttribute.styles.js.map +1 -0
  50. package/dist/components/account/VerifyAttribute/VerifyAttribute.d.ts +41 -0
  51. package/dist/components/account/VerifyAttribute/VerifyAttribute.d.ts.map +1 -0
  52. package/dist/components/account/VerifyAttribute/VerifyAttribute.js +90 -0
  53. package/dist/components/account/VerifyAttribute/VerifyAttribute.js.map +1 -0
  54. package/dist/components/auth/flow/AuthOptionFactory.d.ts +5 -1
  55. package/dist/components/auth/flow/AuthOptionFactory.d.ts.map +1 -1
  56. package/dist/components/auth/flow/AuthOptionFactory.js +26 -4
  57. package/dist/components/auth/flow/AuthOptionFactory.js.map +1 -1
  58. package/dist/components/auth/flow/FieldFactory.d.ts +4 -0
  59. package/dist/components/auth/flow/FieldFactory.d.ts.map +1 -1
  60. package/dist/components/auth/flow/FieldFactory.js +2 -1
  61. package/dist/components/auth/flow/FieldFactory.js.map +1 -1
  62. package/dist/components/primitives/OtpField/OtpField.d.ts +4 -0
  63. package/dist/components/primitives/OtpField/OtpField.d.ts.map +1 -1
  64. package/dist/components/primitives/OtpField/OtpField.js +11 -6
  65. package/dist/components/primitives/OtpField/OtpField.js.map +1 -1
  66. package/dist/components/primitives/OtpField/OtpField.styles.d.ts +1 -1
  67. package/dist/components/primitives/OtpField/OtpField.styles.d.ts.map +1 -1
  68. package/dist/components/primitives/OtpField/OtpField.styles.js +16 -8
  69. package/dist/components/primitives/OtpField/OtpField.styles.js.map +1 -1
  70. package/dist/contexts/ComponentRenderer/ComponentRendererContext.d.ts +1 -1
  71. package/dist/contexts/ComponentRenderer/ComponentRendererContext.d.ts.map +1 -1
  72. package/dist/contexts/ComponentRenderer/ComponentRendererContext.js.map +1 -1
  73. package/dist/contexts/ThunderID/ThunderIDProvider.d.ts.map +1 -1
  74. package/dist/contexts/ThunderID/ThunderIDProvider.js +14 -0
  75. package/dist/contexts/ThunderID/ThunderIDProvider.js.map +1 -1
  76. package/dist/index.d.ts +7 -1
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +5 -2
  79. package/package.json +2 -2
@@ -4,6 +4,8 @@ import useTranslation_default from "../../../hooks/useTranslation.js";
4
4
  import Button_default from "../../primitives/Button/Button.js";
5
5
  import Typography_default from "../../primitives/Typography/Typography.js";
6
6
  import Card_default from "../../primitives/Card/Card.js";
7
+ import CircleAlert_default from "../../primitives/Icons/CircleAlert.js";
8
+ import CircleCheck_default from "../../primitives/Icons/CircleCheck.js";
7
9
  import Alert_default from "../../primitives/Alert/Alert.js";
8
10
  import TextField_default from "../../primitives/TextField/TextField.js";
9
11
  import Checkbox_default from "../../primitives/Checkbox/Checkbox.js";
@@ -15,8 +17,8 @@ import getDisplayName_default from "../../../utils/getDisplayName.js";
15
17
  import { Avatar } from "../../primitives/Avatar/Avatar.js";
16
18
  import Dialog_default from "../../primitives/Dialog/Dialog.js";
17
19
  import MultiInput_default from "../../primitives/MultiInput/MultiInput.js";
18
- import { bem, startCase, withVendorCSSClassPrefix } from "@thunderid/browser";
19
- import { useCallback, useEffect, useState } from "react";
20
+ import { AttributeVerificationConstants, bem, getVerifiedAttributes, isVerifiableAttribute, startCase, withVendorCSSClassPrefix } from "@thunderid/browser";
21
+ import { useCallback, useEffect, useMemo, useState } from "react";
20
22
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
21
23
 
22
24
  //#region src/components/account/UserProfile/BaseUserProfile.tsx
@@ -42,7 +44,8 @@ const fieldsToSkip = [
42
44
  "attributes",
43
45
  "picture",
44
46
  "isReadOnly",
45
- "isReadonly"
47
+ "isReadonly",
48
+ AttributeVerificationConstants.VERIFIED_ATTRIBUTES_KEY
46
49
  ];
47
50
  const readonlyFields = [
48
51
  "attributes",
@@ -52,12 +55,44 @@ const readonlyFields = [
52
55
  "username",
53
56
  "sub"
54
57
  ];
55
- const BaseUserProfile = ({ fallback = null, className = "", cardLayout = true, profile, flattenedProfile, userSchema, mode = "inline", title, attributeMapping = {}, editable = true, onOpenChange, onUpdate, open = false, error = null, isLoading = false, preferences, showFields = [], hideFields = [], displayNameAttributes = [] }) => {
58
+ const isStatusType = (type) => !!type && AttributeVerificationConstants.VERIFIABLE_ATTRIBUTE_TYPES.includes(type.toLowerCase());
59
+ const isVerifiedAfterSave = (type) => !!type && AttributeVerificationConstants.VERIFY_AFTER_SAVE_ATTRIBUTE_TYPES.includes(type.toLowerCase());
60
+ const BaseUserProfile = ({ fallback = null, className = "", cardLayout = true, profile, flattenedProfile, userSchema, mode = "inline", title, attributeMapping = {}, editable = true, onOpenChange, onUpdate, open = false, error = null, isLoading = false, preferences, showFields = [], hideFields = [], displayNameAttributes = [], renderVerification = void 0 }) => {
56
61
  const { theme, colorScheme } = useTheme_default();
57
62
  const [editedUser, setEditedUser] = useState(flattenedProfile || profile);
58
63
  const [editingFields, setEditingFields] = useState({});
59
64
  const [fieldErrors, setFieldErrors] = useState({});
60
- const { t } = useTranslation_default(preferences?.i18n);
65
+ const [verifyingField, setVerifyingField] = useState(null);
66
+ const [verifiedNotice, setVerifiedNotice] = useState(null);
67
+ const [pendingVerification, setPendingVerification] = useState(null);
68
+ const [savingFields, setSavingFields] = useState({});
69
+ const { t, currentLanguage } = useTranslation_default(preferences?.i18n);
70
+ const reportedVerifiedAttributes = useMemo(() => getVerifiedAttributes(profile ?? flattenedProfile), [profile, flattenedProfile]);
71
+ const supportsVerification = reportedVerifiedAttributes !== void 0;
72
+ const verifiedAttributes = useMemo(() => reportedVerifiedAttributes ?? {}, [reportedVerifiedAttributes]);
73
+ useEffect(() => {
74
+ if (!pendingVerification) return;
75
+ if (error) {
76
+ setPendingVerification(null);
77
+ return;
78
+ }
79
+ const { name, previousValue } = pendingVerification;
80
+ const storedUser = flattenedProfile ?? profile;
81
+ const storedValue = (storedUser?.["attributes"])?.[name] ?? storedUser?.[name];
82
+ if (storedValue === previousValue) return;
83
+ if (supportsVerification && typeof storedValue === "string" && storedValue.trim() !== "" && !verifiedAttributes[name]) {
84
+ setVerifiedNotice(null);
85
+ setVerifyingField(name);
86
+ }
87
+ setPendingVerification(null);
88
+ }, [
89
+ pendingVerification,
90
+ flattenedProfile,
91
+ profile,
92
+ error,
93
+ verifiedAttributes,
94
+ supportsVerification
95
+ ]);
61
96
  useEffect(() => {
62
97
  const nextUser = flattenedProfile ?? profile;
63
98
  if (!nextUser) return;
@@ -112,6 +147,7 @@ const BaseUserProfile = ({ fallback = null, className = "", cardLayout = true, p
112
147
  }, [t]);
113
148
  const formatLabel = useCallback((key) => key.split(/(?=[A-Z])|_/).map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(" "), []);
114
149
  const styles = BaseUserProfile_styles_default(theme, colorScheme);
150
+ const verificationStyles = styles;
115
151
  const ObjectDisplay = ({ data }) => {
116
152
  if (!data || typeof data !== "object") return null;
117
153
  return /* @__PURE__ */ jsx("table", {
@@ -172,15 +208,32 @@ const BaseUserProfile = ({ fallback = null, className = "", cardLayout = true, p
172
208
  });
173
209
  let payload = {};
174
210
  set(payload, fieldName, fieldValue);
175
- onUpdate(payload);
211
+ setSavingFields((prev) => ({
212
+ ...prev,
213
+ [fieldName]: true
214
+ }));
215
+ Promise.resolve(onUpdate(payload)).catch(() => setPendingVerification(null)).finally(() => setSavingFields((prev) => {
216
+ const next = { ...prev };
217
+ delete next[fieldName];
218
+ return next;
219
+ }));
176
220
  toggleFieldEdit(fieldName);
221
+ const savedUser = flattenedProfile ?? profile;
222
+ const storedValue = (savedUser?.["attributes"])?.[fieldName] ?? savedUser?.[fieldName];
223
+ if (renderVerification && isVerifiedAfterSave(schema.type) && isVerifiableAttribute(userSchema, fieldName) && typeof fieldValue === "string" && fieldValue.trim() !== "" && fieldValue !== storedValue) setPendingVerification({
224
+ name: fieldName,
225
+ previousValue: storedValue
226
+ });
227
+ else setPendingVerification(null);
177
228
  }, [
178
229
  editedUser,
179
230
  flattenedProfile,
180
231
  profile,
181
232
  onUpdate,
182
233
  toggleFieldEdit,
183
- t
234
+ t,
235
+ renderVerification,
236
+ userSchema
184
237
  ]);
185
238
  const handleFieldCancel = useCallback((fieldName) => {
186
239
  const currentUser$1 = flattenedProfile || profile;
@@ -359,53 +412,142 @@ const BaseUserProfile = ({ fallback = null, className = "", cardLayout = true, p
359
412
  }) : displayValue
360
413
  })] });
361
414
  };
415
+ const renderVerificationStatus = (schema) => {
416
+ const verification = verifiedAttributes[schema.name];
417
+ let verifiedAtTitle;
418
+ if (verification?.verifiedAt) {
419
+ const verifiedAt = new Date(verification.verifiedAt);
420
+ verifiedAtTitle = t("user.verification.status.verified_at", { date: Number.isNaN(verifiedAt.getTime()) ? verification.verifiedAt : verifiedAt.toLocaleString(currentLanguage) });
421
+ }
422
+ return /* @__PURE__ */ jsxs("span", {
423
+ className: cx(withVendorCSSClassPrefix(bem("user-profile", "verification-status")), withVendorCSSClassPrefix(bem("user-profile", "verification-status", verification ? "verified" : "unverified")), verificationStyles["verificationStatus"], verification ? verificationStyles["verified"] : verificationStyles["unverified"]),
424
+ title: verifiedAtTitle,
425
+ "data-testid": `thunderid-verification-status-${schema.name}`,
426
+ children: [
427
+ verification ? /* @__PURE__ */ jsx(CircleCheck_default, {
428
+ width: 12,
429
+ height: 12,
430
+ "aria-hidden": "true"
431
+ }) : /* @__PURE__ */ jsx(CircleAlert_default, {
432
+ width: 12,
433
+ height: 12,
434
+ "aria-hidden": "true"
435
+ }),
436
+ verification ? t("user.verification.status.verified") : t("user.verification.status.unverified"),
437
+ verifiedAtTitle && /* @__PURE__ */ jsx("span", {
438
+ className: verificationStyles["visuallyHidden"],
439
+ children: ` (${verifiedAtTitle})`
440
+ })
441
+ ]
442
+ });
443
+ };
444
+ const renderVerificationPanel = (schema) => {
445
+ if (!renderVerification || !schema.name || verifyingField !== schema.name) return null;
446
+ const attributeDisplayName = schema.displayName ?? startCase(schema.name);
447
+ const panel = /* @__PURE__ */ jsx("div", {
448
+ className: cx(withVendorCSSClassPrefix(bem("user-profile", "verification")), verificationStyles["verification"], mode === "popup" ? verificationStyles["verificationInline"] : ""),
449
+ children: renderVerification({
450
+ attribute: schema.name,
451
+ attributeDisplayName,
452
+ onCancel: () => setVerifyingField(null),
453
+ onComplete: () => {
454
+ setVerifyingField(null);
455
+ setVerifiedNotice(attributeDisplayName);
456
+ }
457
+ })
458
+ });
459
+ if (mode === "popup") return panel;
460
+ return /* @__PURE__ */ jsx(Dialog_default, {
461
+ open: true,
462
+ onOpenChange: (isOpen) => {
463
+ if (!isOpen) setVerifyingField(null);
464
+ },
465
+ children: /* @__PURE__ */ jsx(Dialog_default.Content, {
466
+ "aria-label": t("user.verification.heading", { attribute: attributeDisplayName }),
467
+ children: /* @__PURE__ */ jsx("div", {
468
+ className: verificationStyles["verificationDialog"],
469
+ children: panel
470
+ })
471
+ })
472
+ });
473
+ };
362
474
  const renderUserInfo = (schema) => {
363
475
  if (!schema?.name) return null;
364
476
  const hasValue = schema.value !== void 0 && schema.value !== "" && schema.value !== null;
365
477
  const isFieldEditing = editingFields[schema.name];
366
478
  const isReadonlyField = readonlyFields.includes(schema.name);
367
479
  if (!(hasValue || isFieldEditing || editable && schema.mutability === "READ_WRITE")) return null;
480
+ const storedUser = flattenedProfile ?? profile;
481
+ const storedValue = (storedUser?.["attributes"])?.[schema.name] ?? storedUser?.[schema.name];
482
+ const showsVerificationStatus = supportsVerification && !!hasValue && !isFieldEditing && !savingFields[schema.name] && schema.value === storedValue && isStatusType(schema.type);
483
+ const canVerify = editable && !!renderVerification && showsVerificationStatus && !verifiedAttributes[schema.name] && verifyingField !== schema.name && isVerifiableAttribute(userSchema, schema.name) && typeof schema.value === "string";
368
484
  return /* @__PURE__ */ jsxs("div", {
369
485
  className: styles.field,
370
- children: [/* @__PURE__ */ jsxs("div", {
371
- className: styles.fieldInner,
372
- children: [renderSchemaField(schema, isFieldEditing, (value) => {
373
- const tempEditedUser = { ...editedUser };
374
- tempEditedUser[schema.name] = value;
375
- setEditedUser(tempEditedUser);
376
- }, () => toggleFieldEdit(schema.name)), fieldErrors[schema.name] && /* @__PURE__ */ jsx("div", {
377
- style: {
378
- color: "#d32f2f",
379
- fontSize: "0.8rem",
380
- marginTop: "4px",
381
- fontWeight: 500
382
- },
383
- children: fieldErrors[schema.name]
384
- })]
385
- }), editable && schema.mutability !== "READ_ONLY" && !isReadonlyField && /* @__PURE__ */ jsxs("div", {
386
- className: styles.fieldActions,
387
- children: [isFieldEditing && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Button_default, {
388
- size: "small",
389
- color: "primary",
390
- variant: "solid",
391
- onClick: () => handleFieldSave(schema),
392
- children: "Save"
393
- }), /* @__PURE__ */ jsx(Button_default, {
394
- size: "small",
395
- color: "secondary",
396
- variant: "solid",
397
- onClick: () => handleFieldCancel(schema.name),
398
- children: "Cancel"
399
- })] }), !isFieldEditing && hasValue && /* @__PURE__ */ jsx(Button_default, {
400
- size: "small",
401
- color: "tertiary",
402
- variant: "icon",
403
- onClick: () => toggleFieldEdit(schema.name),
404
- title: "Edit",
405
- className: styles.editButton,
406
- children: /* @__PURE__ */ jsx(PencilIcon, {})
407
- })]
408
- })]
486
+ children: [
487
+ /* @__PURE__ */ jsxs("div", {
488
+ className: styles.fieldInner,
489
+ children: [
490
+ renderSchemaField(schema, isFieldEditing, (value) => {
491
+ const tempEditedUser = { ...editedUser };
492
+ tempEditedUser[schema.name] = value;
493
+ setEditedUser(tempEditedUser);
494
+ }, () => toggleFieldEdit(schema.name)),
495
+ showsVerificationStatus && renderVerificationStatus(schema),
496
+ fieldErrors[schema.name] && /* @__PURE__ */ jsx("div", {
497
+ style: {
498
+ color: "#d32f2f",
499
+ fontSize: "0.8rem",
500
+ marginTop: "4px",
501
+ fontWeight: 500
502
+ },
503
+ children: fieldErrors[schema.name]
504
+ })
505
+ ]
506
+ }),
507
+ canVerify && /* @__PURE__ */ jsx("div", {
508
+ className: verificationStyles["fieldActions"],
509
+ children: /* @__PURE__ */ jsx(Button_default, {
510
+ size: "small",
511
+ color: "primary",
512
+ variant: "outline",
513
+ onClick: () => {
514
+ setVerifiedNotice(null);
515
+ setVerifyingField(schema.name);
516
+ },
517
+ className: withVendorCSSClassPrefix(bem("user-profile", "verify-button")),
518
+ "data-testid": `thunderid-verify-${schema.name}`,
519
+ children: t("user.verification.buttons.verify.text")
520
+ })
521
+ }),
522
+ editable && schema.mutability !== "READ_ONLY" && !isReadonlyField && /* @__PURE__ */ jsxs("div", {
523
+ className: styles.fieldActions,
524
+ children: [isFieldEditing && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Button_default, {
525
+ size: "small",
526
+ color: "primary",
527
+ variant: "solid",
528
+ onClick: () => handleFieldSave(schema),
529
+ children: "Save"
530
+ }), /* @__PURE__ */ jsx(Button_default, {
531
+ size: "small",
532
+ color: "secondary",
533
+ variant: "solid",
534
+ onClick: () => handleFieldCancel(schema.name),
535
+ children: "Cancel"
536
+ })] }), !isFieldEditing && hasValue && /* @__PURE__ */ jsx(Button_default, {
537
+ size: "small",
538
+ color: "tertiary",
539
+ variant: "icon",
540
+ onClick: () => {
541
+ if (verifyingField === schema.name) setVerifyingField(null);
542
+ setVerifiedNotice(null);
543
+ toggleFieldEdit(schema.name);
544
+ },
545
+ title: "Edit",
546
+ className: styles.editButton,
547
+ children: /* @__PURE__ */ jsx(PencilIcon, {})
548
+ })]
549
+ })
550
+ ]
409
551
  });
410
552
  };
411
553
  if (!profile && !flattenedProfile) return fallback;
@@ -444,6 +586,13 @@ const BaseUserProfile = ({ fallback = null, className = "", cardLayout = true, p
444
586
  };
445
587
  });
446
588
  return /* @__PURE__ */ jsxs(Fragment$1, { children: [
589
+ verifiedNotice && /* @__PURE__ */ jsx(Alert_default, {
590
+ variant: "success",
591
+ role: "status",
592
+ className: cx(withVendorCSSClassPrefix(bem("user-profile", "verification-notice")), verificationStyles["alert"]),
593
+ "data-testid": "thunderid-verification-notice",
594
+ children: /* @__PURE__ */ jsx(Alert_default.Description, { children: t("user.verification.success", { attribute: verifiedNotice }) })
595
+ }),
447
596
  /* @__PURE__ */ jsxs("div", {
448
597
  className: styles.profileSummary,
449
598
  children: [
@@ -467,9 +616,9 @@ const BaseUserProfile = ({ fallback = null, className = "", cardLayout = true, p
467
616
  ]
468
617
  }),
469
618
  /* @__PURE__ */ jsx(Divider_default, {}),
470
- schemaItems.map((schemaWithValue) => /* @__PURE__ */ jsx("div", {
619
+ schemaItems.map((schemaWithValue) => /* @__PURE__ */ jsxs("div", {
471
620
  className: styles.info,
472
- children: renderUserInfo(schemaWithValue)
621
+ children: [renderUserInfo(schemaWithValue), renderVerificationPanel(schemaWithValue)]
473
622
  }, schemaWithValue.name))
474
623
  ] });
475
624
  };
@@ -1 +1 @@
1
- {"version":3,"file":"BaseUserProfile.js","names":["fieldsToSkip: string[]","readonlyFields: string[]","BaseUserProfile: FC<BaseUserProfileProps>","useTheme","useTranslation","toggleFieldEdit: any","getFieldPlaceholder: any","fieldLabel: any","formatLabel: any","styles: any","useStyles","ObjectDisplay: FC<{data: unknown}>","keys: any","current: any","i: any","key: any","handleFieldSave: any","fieldName: string","currentUser: any","fieldValue: any","currentUser","payload: Record<string, any>","handleFieldCancel: any","mergedMappings: Record<string, string | string[]>","label: any","displayValue: string","displayValue","hasValues: any","isEditable: any","isEditable","currentValue: any","fieldValues: string[]","MultiInput","Button","commonProps: any","field: ReactElement","TextField","DatePicker","Checkbox","hasValue: any","isFieldEditing: any","isReadonlyField: any","tempEditedUser: any","containerClasses: any","displayName: any","getDisplayName","schemaItems: Schema[]","getMappedUserProfileValue","Typography","Divider","profileContent: any","CardPrimitive","AlertPrimitive","DialogPrimitive"],"sources":["../../../../src/components/account/UserProfile/BaseUserProfile.tsx"],"sourcesContent":["// Copyright 2025 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {User, withVendorCSSClassPrefix, bem, Preferences, startCase, AttributeSchema} from '@thunderid/browser';\nimport {FC, ReactElement, useState, useCallback, useEffect} from 'react';\nimport useStyles from './BaseUserProfile.styles';\nimport useTheme from '../../../contexts/Theme/useTheme';\nimport useTranslation from '../../../hooks/useTranslation';\nimport {cx} from '../../../styles/emotion';\nimport getDisplayName from '../../../utils/getDisplayName';\nimport getMappedUserProfileValue from '../../../utils/getMappedUserProfileValue';\nimport AlertPrimitive from '../../primitives/Alert/Alert';\nimport {Avatar} from '../../primitives/Avatar/Avatar';\nimport Button from '../../primitives/Button/Button';\nimport CardPrimitive from '../../primitives/Card/Card';\nimport Checkbox from '../../primitives/Checkbox/Checkbox';\nimport DatePicker from '../../primitives/DatePicker/DatePicker';\nimport DialogPrimitive from '../../primitives/Dialog/Dialog';\nimport Divider from '../../primitives/Divider/Divider';\nimport MultiInput from '../../primitives/MultiInput/MultiInput';\nimport TextField from '../../primitives/TextField/TextField';\nimport Typography from '../../primitives/Typography/Typography';\n\ninterface ExtendedFlatSchema {\n path?: string;\n schemaId?: string;\n}\n\ninterface Schema extends ExtendedFlatSchema {\n caseExact?: boolean;\n description?: string;\n displayName?: string;\n displayOrder?: string;\n multiValued?: boolean;\n mutability?: string;\n name?: string;\n regex?: string;\n required?: boolean;\n returned?: string;\n subAttributes?: Schema[];\n type?: string;\n uniqueness?: string;\n value?: any;\n}\n\nexport interface BaseUserProfileProps {\n attributeMapping?: {\n [key: string]: string | string[] | undefined;\n firstName?: string | string[];\n lastName?: string | string[];\n picture?: string | string[];\n username?: string | string[];\n };\n cardLayout?: boolean;\n className?: string;\n displayNameAttributes?: string[];\n editable?: boolean;\n error?: string | null;\n fallback?: ReactElement | null;\n flattenedProfile?: User;\n hideFields?: string[];\n isLoading?: boolean;\n mode?: 'inline' | 'popup';\n onOpenChange?: (open: boolean) => void;\n onUpdate?: (payload: any) => Promise<void>;\n open?: boolean;\n /**\n * Component-level preferences to override global i18n and theme settings.\n * Preferences are deep-merged with global ones, with component preferences\n * taking precedence. Affects this component and all its descendants.\n */\n preferences?: Preferences;\n profile?: User;\n showFields?: string[];\n\n title?: string;\n userSchema?: Record<string, AttributeSchema> | null;\n}\n\n// Fields to skip based on schema.name\nconst fieldsToSkip: string[] = [\n 'roles.default',\n 'active',\n 'groups',\n 'accountLocked',\n 'accountDisabled',\n 'oneTimePassword',\n 'userSourceId',\n 'idpType',\n 'localCredentialExists',\n 'active',\n 'ResourceType',\n 'ExternalID',\n 'MetaData',\n 'verifiedMobileNumbers',\n 'verifiedEmailAddresses',\n 'phoneNumbers.mobile',\n 'emailAddresses',\n 'preferredMFAOption',\n 'attributes',\n 'picture',\n 'isReadOnly',\n 'isReadonly',\n];\n\n// Fields that should be readonly\nconst readonlyFields: string[] = ['attributes', 'id', 'isReadOnly', 'ouId', 'username', 'sub'];\n\nconst BaseUserProfile: FC<BaseUserProfileProps> = ({\n fallback = null,\n className = '',\n cardLayout = true,\n profile,\n flattenedProfile,\n userSchema,\n mode = 'inline',\n title,\n attributeMapping = {},\n editable = true,\n onOpenChange,\n onUpdate,\n open = false,\n error = null,\n isLoading = false,\n preferences,\n showFields = [],\n hideFields = [],\n displayNameAttributes = [],\n}: BaseUserProfileProps): ReactElement | null => {\n const {theme, colorScheme} = useTheme();\n const [editedUser, setEditedUser] = useState(flattenedProfile || profile);\n const [editingFields, setEditingFields] = useState<Record<string, boolean>>({});\n const [fieldErrors, setFieldErrors] = useState<Record<string, string>>({});\n const {t} = useTranslation(preferences?.i18n);\n\n useEffect(() => {\n const nextUser = flattenedProfile ?? profile;\n if (!nextUser) return;\n\n setEditedUser((prev: any) => {\n if (!prev) return nextUser;\n\n const updated = {...nextUser};\n Object.keys(prev).forEach((key) => {\n if (editingFields[key]) {\n updated[key] = prev[key];\n }\n });\n return updated;\n });\n }, [flattenedProfile, profile, editingFields]);\n\n /**\n * Determines if a field should be visible based on showFields, hideFields, and fallback fieldsToSkip arrays.\n * When isSchemaBased is true, fieldsToSkip is bypassed so schema-defined fields render dynamically.\n */\n const shouldShowField = useCallback(\n (fieldName: string, isSchemaBased: boolean = false): boolean => {\n // For fallback without schema metadata, skip internal system fields\n if (!isSchemaBased && fieldsToSkip.includes(fieldName)) {\n return false;\n }\n\n // If hideFields is provided and contains this field, hide it\n if (hideFields.length > 0 && hideFields.includes(fieldName)) {\n return false;\n }\n\n // If showFields is provided and not empty, only show fields in that array\n if (showFields.length > 0) {\n return showFields.includes(fieldName);\n }\n\n return true;\n },\n [showFields, hideFields],\n );\n\n const PencilIcon = (): any => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z\" />\n </svg>\n );\n\n const toggleFieldEdit: any = useCallback((fieldName: string) => {\n setEditingFields((prev: any) => ({\n ...prev,\n [fieldName]: !prev[fieldName],\n }));\n }, []);\n\n const getFieldPlaceholder: any = useCallback(\n (schema: Schema): string => {\n const {type, displayName, description, name} = schema;\n\n const fieldLabel: any = displayName || description || name || 'value';\n\n switch (type) {\n case 'DATE_TIME':\n case 'STRING':\n default:\n return t('elements.fields.generic.placeholder', {field: fieldLabel.toLowerCase()});\n }\n },\n [t],\n );\n\n const formatLabel: any = useCallback(\n (key: string): string =>\n key\n .split(/(?=[A-Z])|_/)\n .map((word: any) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' '),\n [],\n );\n\n const styles: any = useStyles(theme, colorScheme);\n\n const ObjectDisplay: FC<{data: unknown}> = ({data}: {data: unknown}): ReactElement | null => {\n if (!data || typeof data !== 'object') return null;\n\n return (\n <table className={styles.value}>\n <tbody>\n {Object.entries(data).map(([key, value]: any) => (\n <tr key={key}>\n <td className={styles.objectKey}>\n <strong>{formatLabel(key)}:</strong>\n </td>\n <td className={styles.objectValue}>\n {typeof value === 'object' ? <ObjectDisplay data={value} /> : String(value)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n };\n\n function set(obj: Record<string, any>, path: string, value: any): void {\n const keys: any = path.split('.');\n let current: any = obj;\n\n for (let i: any = 0; i < keys.length; i += 1) {\n const key: any = keys[i];\n\n if (i === keys.length - 1) {\n current[key] = value;\n } else {\n if (!current[key] || typeof current[key] !== 'object') {\n current[key] = {};\n }\n current = current[key];\n }\n }\n }\n\n const handleFieldSave: any = useCallback(\n (schema: Schema): void => {\n if (!onUpdate || !schema.name) return;\n\n const fieldName: string = schema.name;\n const currentUser: any = flattenedProfile || profile;\n let fieldValue: any;\n if (editedUser && fieldName && editedUser[fieldName] !== undefined) {\n fieldValue = editedUser[fieldName];\n } else if (currentUser?.attributes?.[fieldName] !== undefined) {\n fieldValue = currentUser.attributes[fieldName];\n } else if (flattenedProfile?.[fieldName] !== undefined) {\n fieldValue = flattenedProfile[fieldName];\n } else {\n fieldValue = '';\n }\n\n if (Array.isArray(fieldValue)) {\n fieldValue = fieldValue.filter((v: any) => v !== undefined && v !== null && v !== '');\n }\n\n const strVal = String(fieldValue ?? '').trim();\n const fieldLabel = schema.displayName || (schema.name ? startCase(schema.name) : 'Field');\n\n // 1. Required validation\n if (schema.required && !strVal) {\n setFieldErrors((prev: Record<string, string>) => ({\n ...prev,\n [fieldName]: t('validations.required.field.error'),\n }));\n return;\n }\n\n // 2. Regex validation\n if (schema.regex && strVal) {\n try {\n const reg = new RegExp(schema.regex);\n if (!reg.test(strVal)) {\n setFieldErrors((prev: Record<string, string>) => ({\n ...prev,\n [fieldName]: t('validation.pattern.invalid'),\n }));\n return;\n }\n } catch (e) {\n // ignore invalid regex syntax safely\n }\n }\n\n // Clear field error if valid\n setFieldErrors((prev: Record<string, string>) => {\n const next = {...prev};\n delete next[fieldName];\n return next;\n });\n\n let payload: Record<string, any> = {};\n set(payload, fieldName, fieldValue);\n\n onUpdate(payload);\n\n toggleFieldEdit(fieldName);\n },\n [editedUser, flattenedProfile, profile, onUpdate, toggleFieldEdit, t],\n );\n\n const handleFieldCancel: any = useCallback(\n (fieldName: string) => {\n const currentUser: any = flattenedProfile || profile;\n const initialVal = currentUser?.attributes?.[fieldName] ?? currentUser?.[fieldName];\n setEditedUser((prev: any) => ({\n ...prev,\n [fieldName]: initialVal,\n }));\n setFieldErrors((prev: Record<string, string>) => {\n const next = {...prev};\n delete next[fieldName];\n return next;\n });\n toggleFieldEdit(fieldName);\n },\n [flattenedProfile, profile, toggleFieldEdit],\n );\n\n const defaultAttributeMappings: Record<string, string | string[]> = {\n email: ['emails', 'email'],\n firstName: ['name.givenName', 'given_name'],\n lastName: ['name.familyName', 'family_name'],\n picture: ['profile', 'profileUrl', 'picture', 'URL'],\n username: ['userName', 'username', 'user_name'],\n };\n\n const mergedMappings: Record<string, string | string[]> = Object.fromEntries(\n Object.entries({...defaultAttributeMappings, ...attributeMapping}).filter(\n (entry): entry is [string, string | string[]] => entry[1] !== undefined,\n ),\n );\n\n const renderSchemaField = (\n schema: Schema,\n isEditing: boolean,\n onEditValue?: (value: any) => void,\n onStartEdit?: () => void,\n ): ReactElement | null => {\n if (!schema) return null;\n const {value, displayName, description, name, type, required, mutability, subAttributes, multiValued} = schema;\n const label: any = displayName || description || (name ? startCase(name) : '');\n\n if (subAttributes && Array.isArray(subAttributes)) {\n return (\n <>\n {subAttributes.map((subAttr: any, index: any) => {\n let displayValue: string;\n if (Array.isArray(subAttr.value)) {\n displayValue = subAttr.value\n .map((item: any) => (typeof item === 'object' ? JSON.stringify(item) : String(item)))\n .join(', ');\n } else if (typeof subAttr.value === 'object') {\n displayValue = JSON.stringify(subAttr.value);\n } else {\n displayValue = String(subAttr.value);\n }\n\n return (\n <div key={index} className={styles.field}>\n <span className={styles.label}>{subAttr.displayName || subAttr.description || ''}</span>\n <div className={styles.value}>{displayValue}</div>\n </div>\n );\n })}\n </>\n );\n }\n\n if (Array.isArray(value) || multiValued) {\n const hasValues: any = Array.isArray(value)\n ? value.length > 0\n : value !== undefined && value !== null && value !== '';\n const isEditable: any = editable && mutability !== 'READ_ONLY' && !readonlyFields.includes(name || '');\n\n if (isEditing && onEditValue && isEditable) {\n let currentValue: any;\n if (editedUser && name && editedUser[name] !== undefined) {\n currentValue = editedUser[name];\n } else if (flattenedProfile && name && flattenedProfile[name] !== undefined) {\n currentValue = flattenedProfile[name];\n } else {\n currentValue = value;\n }\n\n let fieldValues: string[];\n if (Array.isArray(currentValue)) {\n fieldValues = currentValue.map(String);\n } else if (currentValue !== undefined && currentValue !== null && currentValue !== '') {\n fieldValues = [String(currentValue)];\n } else {\n fieldValues = [];\n }\n\n return (\n <>\n <span className={styles.label}>{label}</span>\n <div className={styles.value}>\n <MultiInput\n values={fieldValues}\n onChange={(newValues: any): void => {\n if (multiValued || Array.isArray(currentValue)) {\n onEditValue(newValues);\n } else {\n onEditValue(newValues[0] || '');\n }\n }}\n placeholder={getFieldPlaceholder(schema)}\n fieldType={type as 'STRING' | 'DATE_TIME' | 'BOOLEAN'}\n type={type === 'DATE_TIME' ? 'date' : 'text'}\n required={required}\n />\n </div>\n </>\n );\n }\n\n let displayValue: string;\n if (hasValues) {\n if (Array.isArray(value)) {\n displayValue = value\n .map((item: any) => (typeof item === 'object' ? JSON.stringify(item) : String(item)))\n .join(', ');\n } else {\n displayValue = String(value);\n }\n } else if (isEditable) {\n displayValue = getFieldPlaceholder(schema);\n } else {\n displayValue = '-';\n }\n\n return (\n <>\n <span className={styles.label}>{label}</span>\n <div className={cx(styles.value, !hasValues ? styles.valuePlaceholder : '')}>\n {!hasValues && isEditable && onStartEdit ? (\n <Button\n onClick={onStartEdit}\n variant=\"text\"\n color=\"secondary\"\n size=\"small\"\n title=\"Click to edit\"\n className={styles.editButton}\n >\n {displayValue}\n </Button>\n ) : (\n displayValue\n )}\n </div>\n </>\n );\n }\n if (type === 'COMPLEX' && typeof value === 'object') {\n return <ObjectDisplay data={value} />;\n }\n\n if (isEditing && onEditValue && mutability !== 'READ_ONLY' && !readonlyFields.includes(name || '')) {\n let fieldValue: any;\n if (editedUser && name && editedUser[name] !== undefined) {\n fieldValue = editedUser[name];\n } else if (flattenedProfile && name && flattenedProfile[name] !== undefined) {\n fieldValue = flattenedProfile[name];\n } else {\n fieldValue = value || '';\n }\n\n const commonProps: any = {\n label: undefined,\n onChange: (e: any) => onEditValue(e.target ? e.target.value : e),\n placeholder: getFieldPlaceholder(schema),\n required,\n value: fieldValue,\n // Removed inline style, use .styles.ts for marginBottom if needed\n };\n let field: ReactElement;\n switch (type) {\n case 'STRING':\n field = <TextField {...commonProps} />;\n break;\n case 'DATE_TIME':\n field = <DatePicker {...commonProps} />;\n break;\n case 'BOOLEAN':\n field = (\n <Checkbox\n {...commonProps}\n checked={!!fieldValue}\n onChange={(e: any): void => {\n onEditValue(e.target.checked);\n }}\n />\n );\n break;\n case 'COMPLEX':\n field = (\n <textarea\n value={fieldValue}\n onChange={(e: any): void => onEditValue(e.target.value)}\n placeholder={getFieldPlaceholder(schema)}\n required={required}\n className={styles.complexTextarea}\n />\n );\n break;\n default:\n field = <TextField {...commonProps} />;\n }\n return (\n <>\n <span className={styles.label}>{label}</span>\n <div className={styles.value}>{field}</div>\n </>\n );\n }\n\n const hasValue: any = value !== undefined && value !== null && value !== '';\n const isEditable: any = editable && mutability !== 'READ_ONLY' && !readonlyFields.includes(name || '');\n\n let displayValue: string;\n if (hasValue) {\n displayValue = String(value);\n } else if (isEditable) {\n displayValue = getFieldPlaceholder(schema);\n } else {\n displayValue = '-';\n }\n\n return (\n <>\n <span className={styles.label}>{label}</span>\n <div className={cx(styles.value, !hasValue ? styles.valuePlaceholder : '')}>\n {!hasValue && isEditable && onStartEdit ? (\n <Button\n onClick={onStartEdit}\n variant=\"text\"\n color=\"secondary\"\n size=\"small\"\n title=\"Click to edit\"\n className={styles.editButton}\n >\n {displayValue}\n </Button>\n ) : (\n displayValue\n )}\n </div>\n </>\n );\n };\n\n const renderUserInfo = (schema: Schema): any => {\n if (!schema?.name) return null;\n\n const hasValue: any = schema.value !== undefined && schema.value !== '' && schema.value !== null;\n const isFieldEditing: any = editingFields[schema.name];\n const isReadonlyField: any = readonlyFields.includes(schema.name);\n\n const shouldShow: any = hasValue || isFieldEditing || (editable && schema.mutability === 'READ_WRITE');\n\n if (!shouldShow) {\n return null;\n }\n\n return (\n <div className={styles.field}>\n <div className={styles.fieldInner}>\n {renderSchemaField(\n schema,\n isFieldEditing,\n (value: any) => {\n const tempEditedUser: any = {...editedUser};\n tempEditedUser[schema.name!] = value;\n setEditedUser(tempEditedUser);\n },\n () => toggleFieldEdit(schema.name),\n )}\n {fieldErrors[schema.name] && (\n <div style={{color: '#d32f2f', fontSize: '0.8rem', marginTop: '4px', fontWeight: 500}}>\n {fieldErrors[schema.name]}\n </div>\n )}\n </div>\n {editable && schema.mutability !== 'READ_ONLY' && !isReadonlyField && (\n <div className={styles.fieldActions}>\n {isFieldEditing && (\n <>\n <Button size=\"small\" color=\"primary\" variant=\"solid\" onClick={(): any => handleFieldSave(schema)}>\n Save\n </Button>\n <Button\n size=\"small\"\n color=\"secondary\"\n variant=\"solid\"\n onClick={(): any => handleFieldCancel(schema.name)}\n >\n Cancel\n </Button>\n </>\n )}\n {!isFieldEditing && hasValue && (\n <Button\n size=\"small\"\n color=\"tertiary\"\n variant=\"icon\"\n onClick={(): any => toggleFieldEdit(schema.name)}\n title=\"Edit\"\n className={styles.editButton}\n >\n <PencilIcon />\n </Button>\n )}\n </div>\n )}\n </div>\n );\n };\n\n if (!profile && !flattenedProfile) {\n return fallback;\n }\n\n const containerClasses: any = cx(\n styles.root,\n cardLayout ? styles.card : '',\n withVendorCSSClassPrefix('user-profile'),\n className,\n );\n\n const currentUser: any = flattenedProfile || profile;\n\n const renderProfileContent = (): any => {\n if (!currentUser) return null;\n\n const displayName: any = getDisplayName(mergedMappings, profile!, displayNameAttributes);\n\n let schemaItems: Schema[] = [];\n\n if (userSchema && typeof userSchema === 'object' && Object.keys(userSchema).length > 0) {\n schemaItems = Object.entries(userSchema)\n .filter(([key, metaAttr]: [string, AttributeSchema]) => {\n if (metaAttr?.credential) return false;\n return shouldShowField(key, true);\n })\n .map(([key, metaAttr]: [string, AttributeSchema]) => {\n const val = editedUser?.[key] ?? currentUser?.attributes?.[key] ?? currentUser?.[key] ?? '';\n\n const isReadonly =\n metaAttr.readOnly === true || metaAttr.mutability === 'READ_ONLY' || readonlyFields.includes(key);\n\n return {\n name: key,\n displayName: metaAttr.displayName ?? (key ? startCase(key) : ''),\n type: (metaAttr.type ?? 'STRING').toUpperCase(),\n regex: metaAttr.regex,\n required: !!metaAttr.required,\n mutability: isReadonly ? 'READ_ONLY' : 'READ_WRITE',\n value: val,\n };\n });\n } else {\n const profileEntries: any = Object.entries(currentUser)\n .filter(([key, value]: [string, any]) => {\n if (!shouldShowField(key)) return false;\n\n return value !== undefined && value !== '' && value !== null;\n })\n .sort(([a]: [string, ...any[]], [b]: [string, ...any[]]) => a.localeCompare(b));\n\n schemaItems = profileEntries.map(([key, value]: any) => {\n const isReadonly = readonlyFields.includes(key);\n return {\n name: key,\n displayName: startCase(key),\n mutability: isReadonly ? 'READ_ONLY' : 'READ_WRITE',\n value,\n };\n });\n }\n\n return (\n <>\n <div className={styles.profileSummary}>\n <Avatar\n imageUrl={getMappedUserProfileValue('picture', mergedMappings, currentUser)}\n name={displayName}\n size={70}\n alt={`${displayName}'s avatar`}\n isLoading={isLoading}\n />\n <Typography variant=\"h3\" fontWeight=\"medium\">\n {displayName}\n </Typography>\n {getMappedUserProfileValue('email', mergedMappings, currentUser) && (\n <Typography variant=\"body2\" color=\"textSecondary\">\n {getMappedUserProfileValue('email', mergedMappings, currentUser)}\n </Typography>\n )}\n </div>\n <Divider />\n {schemaItems.map((schemaWithValue: Schema) => (\n <div key={schemaWithValue.name} className={styles.info}>\n {renderUserInfo(schemaWithValue)}\n </div>\n ))}\n </>\n );\n };\n\n const profileContent: any = (\n <CardPrimitive className={containerClasses}>\n {error && (\n <AlertPrimitive\n variant=\"error\"\n className={cx(withVendorCSSClassPrefix(bem('user-profile', 'alert')), styles.alert)}\n >\n <AlertPrimitive.Title>{t('errors.heading') || 'Error'}</AlertPrimitive.Title>\n <AlertPrimitive.Description>{error}</AlertPrimitive.Description>\n </AlertPrimitive>\n )}\n <div className={styles.infoContainer}>{renderProfileContent()}</div>\n </CardPrimitive>\n );\n\n if (mode === 'popup') {\n return (\n <DialogPrimitive open={open} onOpenChange={onOpenChange}>\n <DialogPrimitive.Content>\n <DialogPrimitive.Heading>{title ?? t('user.profile.heading')}</DialogPrimitive.Heading>\n <div className={styles.popup}>{profileContent}</div>\n </DialogPrimitive.Content>\n </DialogPrimitive>\n );\n }\n\n return profileContent;\n};\n\nexport default BaseUserProfile;\n"],"mappings":"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"}
1
+ {"version":3,"file":"BaseUserProfile.js","names":["fieldsToSkip: string[]","readonlyFields: string[]","BaseUserProfile: FC<BaseUserProfileProps>","useTheme","useTranslation","reportedVerifiedAttributes: Record<string, VerifiedAttribute> | undefined","supportsVerification: boolean","verifiedAttributes: Record<string, VerifiedAttribute>","storedUser: User | undefined","storedValue: unknown","toggleFieldEdit: any","getFieldPlaceholder: any","fieldLabel: any","formatLabel: any","styles: any","useStyles","verificationStyles: Record<string, string>","ObjectDisplay: FC<{data: unknown}>","keys: any","current: any","i: any","key: any","handleFieldSave: any","fieldName: string","currentUser: any","fieldValue: any","currentUser","payload: Record<string, any>","next: Record<string, boolean>","savedUser: User | undefined","handleFieldCancel: any","mergedMappings: Record<string, string | string[]>","label: any","displayValue: string","displayValue","hasValues: any","isEditable: any","isEditable","currentValue: any","fieldValues: string[]","MultiInput","Button","commonProps: any","field: ReactElement","TextField","DatePicker","Checkbox","hasValue: any","verification: VerifiedAttribute | undefined","verifiedAtTitle: string | undefined","verifiedAt: Date","CircleCheck","CircleAlert","attributeDisplayName: string","panel: ReactElement","DialogPrimitive","isFieldEditing: any","isReadonlyField: any","showsVerificationStatus: boolean","canVerify: boolean","tempEditedUser: any","containerClasses: any","displayName: any","getDisplayName","schemaItems: Schema[]","AlertPrimitive","getMappedUserProfileValue","Typography","Divider","profileContent: any","CardPrimitive"],"sources":["../../../../src/components/account/UserProfile/BaseUserProfile.tsx"],"sourcesContent":["// Copyright 2025-2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n User,\n withVendorCSSClassPrefix,\n bem,\n Preferences,\n startCase,\n AttributeSchema,\n AttributeVerificationConstants,\n VerifiedAttribute,\n getVerifiedAttributes,\n isVerifiableAttribute,\n} from '@thunderid/browser';\nimport {FC, ReactElement, ReactNode, useState, useCallback, useEffect, useMemo} from 'react';\nimport useStyles from './BaseUserProfile.styles';\nimport useTheme from '../../../contexts/Theme/useTheme';\nimport useTranslation from '../../../hooks/useTranslation';\nimport {cx} from '../../../styles/emotion';\nimport getDisplayName from '../../../utils/getDisplayName';\nimport getMappedUserProfileValue from '../../../utils/getMappedUserProfileValue';\nimport AlertPrimitive from '../../primitives/Alert/Alert';\nimport {Avatar} from '../../primitives/Avatar/Avatar';\nimport Button from '../../primitives/Button/Button';\nimport CardPrimitive from '../../primitives/Card/Card';\nimport Checkbox from '../../primitives/Checkbox/Checkbox';\nimport DatePicker from '../../primitives/DatePicker/DatePicker';\nimport DialogPrimitive from '../../primitives/Dialog/Dialog';\nimport Divider from '../../primitives/Divider/Divider';\nimport {CircleAlert, CircleCheck} from '../../primitives/Icons';\nimport MultiInput from '../../primitives/MultiInput/MultiInput';\nimport TextField from '../../primitives/TextField/TextField';\nimport Typography from '../../primitives/Typography/Typography';\n\ninterface ExtendedFlatSchema {\n path?: string;\n schemaId?: string;\n}\n\ninterface Schema extends ExtendedFlatSchema {\n caseExact?: boolean;\n description?: string;\n displayName?: string;\n displayOrder?: string;\n multiValued?: boolean;\n mutability?: string;\n name?: string;\n regex?: string;\n required?: boolean;\n returned?: string;\n subAttributes?: Schema[];\n type?: string;\n uniqueness?: string;\n value?: any;\n}\n\nexport interface BaseUserProfileProps {\n attributeMapping?: {\n [key: string]: string | string[] | undefined;\n firstName?: string | string[];\n lastName?: string | string[];\n picture?: string | string[];\n username?: string | string[];\n };\n cardLayout?: boolean;\n className?: string;\n displayNameAttributes?: string[];\n editable?: boolean;\n error?: string | null;\n fallback?: ReactElement | null;\n flattenedProfile?: User;\n hideFields?: string[];\n isLoading?: boolean;\n mode?: 'inline' | 'popup';\n onOpenChange?: (open: boolean) => void;\n onUpdate?: (payload: any) => Promise<void>;\n open?: boolean;\n /**\n * Component-level preferences to override global i18n and theme settings.\n * Preferences are deep-merged with global ones, with component preferences\n * taking precedence. Affects this component and all its descendants.\n */\n preferences?: Preferences;\n profile?: User;\n /**\n * Renders the verification panel for an attribute. When omitted, or when the profile is not\n * editable, verification statuses are shown without a Verify action.\n */\n renderVerification?: (props: BaseUserProfileVerificationRenderProps) => ReactNode;\n showFields?: string[];\n\n title?: string;\n userSchema?: Record<string, AttributeSchema> | null;\n}\n\n/**\n * Props passed to `renderVerification`.\n */\nexport interface BaseUserProfileVerificationRenderProps {\n /**\n * Name of the attribute to verify.\n */\n attribute: string;\n /**\n * Label of the attribute.\n */\n attributeDisplayName: string;\n /**\n * Closes the panel.\n */\n onCancel: () => void;\n /**\n * Closes the panel and confirms the recorded verification.\n */\n onComplete: () => void;\n}\n\n// Fields to skip based on schema.name\nconst fieldsToSkip: string[] = [\n 'roles.default',\n 'active',\n 'groups',\n 'accountLocked',\n 'accountDisabled',\n 'oneTimePassword',\n 'userSourceId',\n 'idpType',\n 'localCredentialExists',\n 'active',\n 'ResourceType',\n 'ExternalID',\n 'MetaData',\n 'verifiedMobileNumbers',\n 'verifiedEmailAddresses',\n 'phoneNumbers.mobile',\n 'emailAddresses',\n 'preferredMFAOption',\n 'attributes',\n 'picture',\n 'isReadOnly',\n 'isReadonly',\n AttributeVerificationConstants.VERIFIED_ATTRIBUTES_KEY,\n];\n\n// Fields that should be readonly\nconst readonlyFields: string[] = ['attributes', 'id', 'isReadOnly', 'ouId', 'username', 'sub'];\n\nconst isStatusType = (type?: string): boolean =>\n !!type && AttributeVerificationConstants.VERIFIABLE_ATTRIBUTE_TYPES.includes(type.toLowerCase());\n\nconst isVerifiedAfterSave = (type?: string): boolean =>\n !!type && AttributeVerificationConstants.VERIFY_AFTER_SAVE_ATTRIBUTE_TYPES.includes(type.toLowerCase());\n\nconst BaseUserProfile: FC<BaseUserProfileProps> = ({\n fallback = null,\n className = '',\n cardLayout = true,\n profile,\n flattenedProfile,\n userSchema,\n mode = 'inline',\n title,\n attributeMapping = {},\n editable = true,\n onOpenChange,\n onUpdate,\n open = false,\n error = null,\n isLoading = false,\n preferences,\n showFields = [],\n hideFields = [],\n displayNameAttributes = [],\n renderVerification = undefined,\n}: BaseUserProfileProps): ReactElement | null => {\n const {theme, colorScheme} = useTheme();\n const [editedUser, setEditedUser] = useState(flattenedProfile || profile);\n const [editingFields, setEditingFields] = useState<Record<string, boolean>>({});\n const [fieldErrors, setFieldErrors] = useState<Record<string, string>>({});\n // Attribute whose verification panel is open.\n const [verifyingField, setVerifyingField] = useState<string | null>(null);\n // Label of the attribute whose verification was just recorded.\n const [verifiedNotice, setVerifiedNotice] = useState<string | null>(null);\n // A saved attribute to verify once the profile reflects the change.\n const [pendingVerification, setPendingVerification] = useState<{name: string; previousValue: unknown} | null>(null);\n // Fields whose save is in flight; their stored value is about to change.\n const [savingFields, setSavingFields] = useState<Record<string, boolean>>({});\n const {t, currentLanguage} = useTranslation(preferences?.i18n);\n\n const reportedVerifiedAttributes: Record<string, VerifiedAttribute> | undefined = useMemo(\n () => getVerifiedAttributes(profile ?? flattenedProfile),\n [profile, flattenedProfile],\n );\n // A server without verification support omits the field, so no status is known.\n const supportsVerification: boolean = reportedVerifiedAttributes !== undefined;\n const verifiedAttributes: Record<string, VerifiedAttribute> = useMemo(\n () => reportedVerifiedAttributes ?? {},\n [reportedVerifiedAttributes],\n );\n\n useEffect(() => {\n if (!pendingVerification) return;\n\n if (error) {\n setPendingVerification(null);\n return;\n }\n\n const {name, previousValue} = pendingVerification;\n const storedUser: User | undefined = flattenedProfile ?? profile;\n const storedAttributes: Record<string, unknown> | undefined = storedUser?.['attributes'] as\n | Record<string, unknown>\n | undefined;\n const storedValue: unknown = storedAttributes?.[name] ?? storedUser?.[name];\n\n if (storedValue === previousValue) return;\n\n // An absent verification record leaves the status unknown, so nothing opens on that basis.\n if (\n supportsVerification &&\n typeof storedValue === 'string' &&\n storedValue.trim() !== '' &&\n !verifiedAttributes[name]\n ) {\n setVerifiedNotice(null);\n setVerifyingField(name);\n }\n setPendingVerification(null);\n }, [pendingVerification, flattenedProfile, profile, error, verifiedAttributes, supportsVerification]);\n\n useEffect(() => {\n const nextUser = flattenedProfile ?? profile;\n if (!nextUser) return;\n\n setEditedUser((prev: any) => {\n if (!prev) return nextUser;\n\n const updated = {...nextUser};\n Object.keys(prev).forEach((key) => {\n if (editingFields[key]) {\n updated[key] = prev[key];\n }\n });\n return updated;\n });\n }, [flattenedProfile, profile, editingFields]);\n\n /**\n * Determines if a field should be visible based on showFields, hideFields, and fallback fieldsToSkip arrays.\n * When isSchemaBased is true, fieldsToSkip is bypassed so schema-defined fields render dynamically.\n */\n const shouldShowField = useCallback(\n (fieldName: string, isSchemaBased: boolean = false): boolean => {\n // For fallback without schema metadata, skip internal system fields\n if (!isSchemaBased && fieldsToSkip.includes(fieldName)) {\n return false;\n }\n\n // If hideFields is provided and contains this field, hide it\n if (hideFields.length > 0 && hideFields.includes(fieldName)) {\n return false;\n }\n\n // If showFields is provided and not empty, only show fields in that array\n if (showFields.length > 0) {\n return showFields.includes(fieldName);\n }\n\n return true;\n },\n [showFields, hideFields],\n );\n\n const PencilIcon = (): any => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z\" />\n </svg>\n );\n\n const toggleFieldEdit: any = useCallback((fieldName: string) => {\n setEditingFields((prev: any) => ({\n ...prev,\n [fieldName]: !prev[fieldName],\n }));\n }, []);\n\n const getFieldPlaceholder: any = useCallback(\n (schema: Schema): string => {\n const {type, displayName, description, name} = schema;\n\n const fieldLabel: any = displayName || description || name || 'value';\n\n switch (type) {\n case 'DATE_TIME':\n case 'STRING':\n default:\n return t('elements.fields.generic.placeholder', {field: fieldLabel.toLowerCase()});\n }\n },\n [t],\n );\n\n const formatLabel: any = useCallback(\n (key: string): string =>\n key\n .split(/(?=[A-Z])|_/)\n .map((word: any) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' '),\n [],\n );\n\n const styles: any = useStyles(theme, colorScheme);\n // Typed view of the same classes for the verification markup.\n const verificationStyles: Record<string, string> = styles as Record<string, string>;\n\n const ObjectDisplay: FC<{data: unknown}> = ({data}: {data: unknown}): ReactElement | null => {\n if (!data || typeof data !== 'object') return null;\n\n return (\n <table className={styles.value}>\n <tbody>\n {Object.entries(data).map(([key, value]: any) => (\n <tr key={key}>\n <td className={styles.objectKey}>\n <strong>{formatLabel(key)}:</strong>\n </td>\n <td className={styles.objectValue}>\n {typeof value === 'object' ? <ObjectDisplay data={value} /> : String(value)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n };\n\n function set(obj: Record<string, any>, path: string, value: any): void {\n const keys: any = path.split('.');\n let current: any = obj;\n\n for (let i: any = 0; i < keys.length; i += 1) {\n const key: any = keys[i];\n\n if (i === keys.length - 1) {\n current[key] = value;\n } else {\n if (!current[key] || typeof current[key] !== 'object') {\n current[key] = {};\n }\n current = current[key];\n }\n }\n }\n\n const handleFieldSave: any = useCallback(\n (schema: Schema): void => {\n if (!onUpdate || !schema.name) return;\n\n const fieldName: string = schema.name;\n const currentUser: any = flattenedProfile || profile;\n let fieldValue: any;\n if (editedUser && fieldName && editedUser[fieldName] !== undefined) {\n fieldValue = editedUser[fieldName];\n } else if (currentUser?.attributes?.[fieldName] !== undefined) {\n fieldValue = currentUser.attributes[fieldName];\n } else if (flattenedProfile?.[fieldName] !== undefined) {\n fieldValue = flattenedProfile[fieldName];\n } else {\n fieldValue = '';\n }\n\n if (Array.isArray(fieldValue)) {\n fieldValue = fieldValue.filter((v: any) => v !== undefined && v !== null && v !== '');\n }\n\n const strVal = String(fieldValue ?? '').trim();\n const fieldLabel = schema.displayName || (schema.name ? startCase(schema.name) : 'Field');\n\n // 1. Required validation\n if (schema.required && !strVal) {\n setFieldErrors((prev: Record<string, string>) => ({\n ...prev,\n [fieldName]: t('validations.required.field.error'),\n }));\n return;\n }\n\n // 2. Regex validation\n if (schema.regex && strVal) {\n try {\n const reg = new RegExp(schema.regex);\n if (!reg.test(strVal)) {\n setFieldErrors((prev: Record<string, string>) => ({\n ...prev,\n [fieldName]: t('validation.pattern.invalid'),\n }));\n return;\n }\n } catch (e) {\n // ignore invalid regex syntax safely\n }\n }\n\n // Clear field error if valid\n setFieldErrors((prev: Record<string, string>) => {\n const next = {...prev};\n delete next[fieldName];\n return next;\n });\n\n let payload: Record<string, any> = {};\n set(payload, fieldName, fieldValue);\n\n setSavingFields((prev: Record<string, boolean>) => ({...prev, [fieldName]: true}));\n // A failed save is reported through `error`; it only drops the verification it would have opened.\n Promise.resolve(onUpdate(payload))\n .catch((): void => setPendingVerification(null))\n .finally((): void =>\n setSavingFields((prev: Record<string, boolean>) => {\n const next: Record<string, boolean> = {...prev};\n delete next[fieldName];\n return next;\n }),\n );\n\n toggleFieldEdit(fieldName);\n\n // Offer verification once a changed, verifiable value is saved.\n const savedUser: User | undefined = flattenedProfile ?? profile;\n const savedAttributes: Record<string, unknown> | undefined = savedUser?.['attributes'] as\n | Record<string, unknown>\n | undefined;\n const storedValue: unknown = savedAttributes?.[fieldName] ?? savedUser?.[fieldName];\n if (\n renderVerification &&\n isVerifiedAfterSave(schema.type) &&\n isVerifiableAttribute(userSchema, fieldName) &&\n typeof fieldValue === 'string' &&\n fieldValue.trim() !== '' &&\n fieldValue !== storedValue\n ) {\n setPendingVerification({name: fieldName, previousValue: storedValue});\n } else {\n setPendingVerification(null);\n }\n },\n [editedUser, flattenedProfile, profile, onUpdate, toggleFieldEdit, t, renderVerification, userSchema],\n );\n\n const handleFieldCancel: any = useCallback(\n (fieldName: string) => {\n const currentUser: any = flattenedProfile || profile;\n const initialVal = currentUser?.attributes?.[fieldName] ?? currentUser?.[fieldName];\n setEditedUser((prev: any) => ({\n ...prev,\n [fieldName]: initialVal,\n }));\n setFieldErrors((prev: Record<string, string>) => {\n const next = {...prev};\n delete next[fieldName];\n return next;\n });\n toggleFieldEdit(fieldName);\n },\n [flattenedProfile, profile, toggleFieldEdit],\n );\n\n const defaultAttributeMappings: Record<string, string | string[]> = {\n email: ['emails', 'email'],\n firstName: ['name.givenName', 'given_name'],\n lastName: ['name.familyName', 'family_name'],\n picture: ['profile', 'profileUrl', 'picture', 'URL'],\n username: ['userName', 'username', 'user_name'],\n };\n\n const mergedMappings: Record<string, string | string[]> = Object.fromEntries(\n Object.entries({...defaultAttributeMappings, ...attributeMapping}).filter(\n (entry): entry is [string, string | string[]] => entry[1] !== undefined,\n ),\n );\n\n const renderSchemaField = (\n schema: Schema,\n isEditing: boolean,\n onEditValue?: (value: any) => void,\n onStartEdit?: () => void,\n ): ReactElement | null => {\n if (!schema) return null;\n const {value, displayName, description, name, type, required, mutability, subAttributes, multiValued} = schema;\n const label: any = displayName || description || (name ? startCase(name) : '');\n\n if (subAttributes && Array.isArray(subAttributes)) {\n return (\n <>\n {subAttributes.map((subAttr: any, index: any) => {\n let displayValue: string;\n if (Array.isArray(subAttr.value)) {\n displayValue = subAttr.value\n .map((item: any) => (typeof item === 'object' ? JSON.stringify(item) : String(item)))\n .join(', ');\n } else if (typeof subAttr.value === 'object') {\n displayValue = JSON.stringify(subAttr.value);\n } else {\n displayValue = String(subAttr.value);\n }\n\n return (\n <div key={index} className={styles.field}>\n <span className={styles.label}>{subAttr.displayName || subAttr.description || ''}</span>\n <div className={styles.value}>{displayValue}</div>\n </div>\n );\n })}\n </>\n );\n }\n\n if (Array.isArray(value) || multiValued) {\n const hasValues: any = Array.isArray(value)\n ? value.length > 0\n : value !== undefined && value !== null && value !== '';\n const isEditable: any = editable && mutability !== 'READ_ONLY' && !readonlyFields.includes(name || '');\n\n if (isEditing && onEditValue && isEditable) {\n let currentValue: any;\n if (editedUser && name && editedUser[name] !== undefined) {\n currentValue = editedUser[name];\n } else if (flattenedProfile && name && flattenedProfile[name] !== undefined) {\n currentValue = flattenedProfile[name];\n } else {\n currentValue = value;\n }\n\n let fieldValues: string[];\n if (Array.isArray(currentValue)) {\n fieldValues = currentValue.map(String);\n } else if (currentValue !== undefined && currentValue !== null && currentValue !== '') {\n fieldValues = [String(currentValue)];\n } else {\n fieldValues = [];\n }\n\n return (\n <>\n <span className={styles.label}>{label}</span>\n <div className={styles.value}>\n <MultiInput\n values={fieldValues}\n onChange={(newValues: any): void => {\n if (multiValued || Array.isArray(currentValue)) {\n onEditValue(newValues);\n } else {\n onEditValue(newValues[0] || '');\n }\n }}\n placeholder={getFieldPlaceholder(schema)}\n fieldType={type as 'STRING' | 'DATE_TIME' | 'BOOLEAN'}\n type={type === 'DATE_TIME' ? 'date' : 'text'}\n required={required}\n />\n </div>\n </>\n );\n }\n\n let displayValue: string;\n if (hasValues) {\n if (Array.isArray(value)) {\n displayValue = value\n .map((item: any) => (typeof item === 'object' ? JSON.stringify(item) : String(item)))\n .join(', ');\n } else {\n displayValue = String(value);\n }\n } else if (isEditable) {\n displayValue = getFieldPlaceholder(schema);\n } else {\n displayValue = '-';\n }\n\n return (\n <>\n <span className={styles.label}>{label}</span>\n <div className={cx(styles.value, !hasValues ? styles.valuePlaceholder : '')}>\n {!hasValues && isEditable && onStartEdit ? (\n <Button\n onClick={onStartEdit}\n variant=\"text\"\n color=\"secondary\"\n size=\"small\"\n title=\"Click to edit\"\n className={styles.editButton}\n >\n {displayValue}\n </Button>\n ) : (\n displayValue\n )}\n </div>\n </>\n );\n }\n if (type === 'COMPLEX' && typeof value === 'object') {\n return <ObjectDisplay data={value} />;\n }\n\n if (isEditing && onEditValue && mutability !== 'READ_ONLY' && !readonlyFields.includes(name || '')) {\n let fieldValue: any;\n if (editedUser && name && editedUser[name] !== undefined) {\n fieldValue = editedUser[name];\n } else if (flattenedProfile && name && flattenedProfile[name] !== undefined) {\n fieldValue = flattenedProfile[name];\n } else {\n fieldValue = value || '';\n }\n\n const commonProps: any = {\n label: undefined,\n onChange: (e: any) => onEditValue(e.target ? e.target.value : e),\n placeholder: getFieldPlaceholder(schema),\n required,\n value: fieldValue,\n // Removed inline style, use .styles.ts for marginBottom if needed\n };\n let field: ReactElement;\n switch (type) {\n case 'STRING':\n field = <TextField {...commonProps} />;\n break;\n case 'DATE_TIME':\n field = <DatePicker {...commonProps} />;\n break;\n case 'BOOLEAN':\n field = (\n <Checkbox\n {...commonProps}\n checked={!!fieldValue}\n onChange={(e: any): void => {\n onEditValue(e.target.checked);\n }}\n />\n );\n break;\n case 'COMPLEX':\n field = (\n <textarea\n value={fieldValue}\n onChange={(e: any): void => onEditValue(e.target.value)}\n placeholder={getFieldPlaceholder(schema)}\n required={required}\n className={styles.complexTextarea}\n />\n );\n break;\n default:\n field = <TextField {...commonProps} />;\n }\n return (\n <>\n <span className={styles.label}>{label}</span>\n <div className={styles.value}>{field}</div>\n </>\n );\n }\n\n const hasValue: any = value !== undefined && value !== null && value !== '';\n const isEditable: any = editable && mutability !== 'READ_ONLY' && !readonlyFields.includes(name || '');\n\n let displayValue: string;\n if (hasValue) {\n displayValue = String(value);\n } else if (isEditable) {\n displayValue = getFieldPlaceholder(schema);\n } else {\n displayValue = '-';\n }\n\n return (\n <>\n <span className={styles.label}>{label}</span>\n <div className={cx(styles.value, !hasValue ? styles.valuePlaceholder : '')}>\n {!hasValue && isEditable && onStartEdit ? (\n <Button\n onClick={onStartEdit}\n variant=\"text\"\n color=\"secondary\"\n size=\"small\"\n title=\"Click to edit\"\n className={styles.editButton}\n >\n {displayValue}\n </Button>\n ) : (\n displayValue\n )}\n </div>\n </>\n );\n };\n\n const renderVerificationStatus = (schema: Schema): ReactElement | null => {\n const verification: VerifiedAttribute | undefined = verifiedAttributes[schema.name!];\n let verifiedAtTitle: string | undefined;\n\n if (verification?.verifiedAt) {\n const verifiedAt: Date = new Date(verification.verifiedAt);\n const date: string = Number.isNaN(verifiedAt.getTime())\n ? verification.verifiedAt\n : verifiedAt.toLocaleString(currentLanguage);\n verifiedAtTitle = t('user.verification.status.verified_at', {date});\n }\n\n return (\n <span\n className={cx(\n withVendorCSSClassPrefix(bem('user-profile', 'verification-status')),\n withVendorCSSClassPrefix(\n bem('user-profile', 'verification-status', verification ? 'verified' : 'unverified'),\n ),\n verificationStyles['verificationStatus'],\n verification ? verificationStyles['verified'] : verificationStyles['unverified'],\n )}\n title={verifiedAtTitle}\n data-testid={`thunderid-verification-status-${schema.name}`}\n >\n {verification ? (\n <CircleCheck width={12} height={12} aria-hidden=\"true\" />\n ) : (\n <CircleAlert width={12} height={12} aria-hidden=\"true\" />\n )}\n {verification ? t('user.verification.status.verified') : t('user.verification.status.unverified')}\n {/* A title is not reachable by keyboard or touch, so the time is also given as text. */}\n {verifiedAtTitle && <span className={verificationStyles['visuallyHidden']}>{` (${verifiedAtTitle})`}</span>}\n </span>\n );\n };\n\n const renderVerificationPanel = (schema: Schema): ReactNode => {\n if (!renderVerification || !schema.name || verifyingField !== schema.name) {\n return null;\n }\n\n const attributeDisplayName: string = schema.displayName ?? startCase(schema.name);\n const panel: ReactElement = (\n <div\n className={cx(\n withVendorCSSClassPrefix(bem('user-profile', 'verification')),\n verificationStyles['verification'],\n mode === 'popup' ? verificationStyles['verificationInline'] : '',\n )}\n >\n {renderVerification({\n attribute: schema.name,\n attributeDisplayName,\n onCancel: (): void => setVerifyingField(null),\n onComplete: (): void => {\n setVerifyingField(null);\n setVerifiedNotice(attributeDisplayName);\n },\n })}\n </div>\n );\n\n // Popup mode keeps the panel under the row, inside the profile's own dialog.\n if (mode === 'popup') return panel;\n\n return (\n <DialogPrimitive\n open\n onOpenChange={(isOpen: boolean): void => {\n if (!isOpen) setVerifyingField(null);\n }}\n >\n {/* Content's own props replace its class, so the size goes on a wrapper. */}\n <DialogPrimitive.Content aria-label={t('user.verification.heading', {attribute: attributeDisplayName})}>\n <div className={verificationStyles['verificationDialog']}>{panel}</div>\n </DialogPrimitive.Content>\n </DialogPrimitive>\n );\n };\n\n const renderUserInfo = (schema: Schema): any => {\n if (!schema?.name) return null;\n\n const hasValue: any = schema.value !== undefined && schema.value !== '' && schema.value !== null;\n const isFieldEditing: any = editingFields[schema.name];\n const isReadonlyField: any = readonlyFields.includes(schema.name);\n\n const shouldShow: any = hasValue || isFieldEditing || (editable && schema.mutability === 'READ_WRITE');\n\n if (!shouldShow) {\n return null;\n }\n\n // Status describes the stored value, so it is shown only while the row shows that value and no\n // save is about to replace it.\n const storedUser: User | undefined = flattenedProfile ?? profile;\n const storedAttributes: Record<string, unknown> | undefined = storedUser?.['attributes'] as\n | Record<string, unknown>\n | undefined;\n const storedValue: unknown = storedAttributes?.[schema.name] ?? storedUser?.[schema.name];\n const showsVerificationStatus: boolean =\n supportsVerification &&\n !!hasValue &&\n !isFieldEditing &&\n !savingFields[schema.name] &&\n schema.value === storedValue &&\n isStatusType(schema.type);\n // A read-only profile shows the status only.\n const canVerify: boolean =\n editable &&\n !!renderVerification &&\n showsVerificationStatus &&\n !verifiedAttributes[schema.name] &&\n verifyingField !== schema.name &&\n isVerifiableAttribute(userSchema, schema.name) &&\n typeof schema.value === 'string';\n\n return (\n <div className={styles.field}>\n <div className={styles.fieldInner}>\n {renderSchemaField(\n schema,\n isFieldEditing,\n (value: any) => {\n const tempEditedUser: any = {...editedUser};\n tempEditedUser[schema.name!] = value;\n setEditedUser(tempEditedUser);\n },\n () => toggleFieldEdit(schema.name),\n )}\n {showsVerificationStatus && renderVerificationStatus(schema)}\n {fieldErrors[schema.name] && (\n <div style={{color: '#d32f2f', fontSize: '0.8rem', marginTop: '4px', fontWeight: 500}}>\n {fieldErrors[schema.name]}\n </div>\n )}\n </div>\n {canVerify && (\n <div className={verificationStyles['fieldActions']}>\n <Button\n size=\"small\"\n color=\"primary\"\n variant=\"outline\"\n onClick={(): void => {\n setVerifiedNotice(null);\n setVerifyingField(schema.name!);\n }}\n className={withVendorCSSClassPrefix(bem('user-profile', 'verify-button'))}\n data-testid={`thunderid-verify-${schema.name}`}\n >\n {t('user.verification.buttons.verify.text')}\n </Button>\n </div>\n )}\n {editable && schema.mutability !== 'READ_ONLY' && !isReadonlyField && (\n <div className={styles.fieldActions}>\n {isFieldEditing && (\n <>\n <Button size=\"small\" color=\"primary\" variant=\"solid\" onClick={(): any => handleFieldSave(schema)}>\n Save\n </Button>\n <Button\n size=\"small\"\n color=\"secondary\"\n variant=\"solid\"\n onClick={(): any => handleFieldCancel(schema.name)}\n >\n Cancel\n </Button>\n </>\n )}\n {!isFieldEditing && hasValue && (\n <Button\n size=\"small\"\n color=\"tertiary\"\n variant=\"icon\"\n onClick={(): any => {\n if (verifyingField === schema.name) setVerifyingField(null);\n setVerifiedNotice(null);\n toggleFieldEdit(schema.name);\n }}\n title=\"Edit\"\n className={styles.editButton}\n >\n <PencilIcon />\n </Button>\n )}\n </div>\n )}\n </div>\n );\n };\n\n if (!profile && !flattenedProfile) {\n return fallback;\n }\n\n const containerClasses: any = cx(\n styles.root,\n cardLayout ? styles.card : '',\n withVendorCSSClassPrefix('user-profile'),\n className,\n );\n\n const currentUser: any = flattenedProfile || profile;\n\n const renderProfileContent = (): any => {\n if (!currentUser) return null;\n\n const displayName: any = getDisplayName(mergedMappings, profile!, displayNameAttributes);\n\n let schemaItems: Schema[] = [];\n\n if (userSchema && typeof userSchema === 'object' && Object.keys(userSchema).length > 0) {\n schemaItems = Object.entries(userSchema)\n .filter(([key, metaAttr]: [string, AttributeSchema]) => {\n if (metaAttr?.credential) return false;\n return shouldShowField(key, true);\n })\n .map(([key, metaAttr]: [string, AttributeSchema]) => {\n const val = editedUser?.[key] ?? currentUser?.attributes?.[key] ?? currentUser?.[key] ?? '';\n\n const isReadonly =\n metaAttr.readOnly === true || metaAttr.mutability === 'READ_ONLY' || readonlyFields.includes(key);\n\n return {\n name: key,\n displayName: metaAttr.displayName ?? (key ? startCase(key) : ''),\n type: (metaAttr.type ?? 'STRING').toUpperCase(),\n regex: metaAttr.regex,\n required: !!metaAttr.required,\n mutability: isReadonly ? 'READ_ONLY' : 'READ_WRITE',\n value: val,\n };\n });\n } else {\n const profileEntries: any = Object.entries(currentUser)\n .filter(([key, value]: [string, any]) => {\n if (!shouldShowField(key)) return false;\n\n return value !== undefined && value !== '' && value !== null;\n })\n .sort(([a]: [string, ...any[]], [b]: [string, ...any[]]) => a.localeCompare(b));\n\n schemaItems = profileEntries.map(([key, value]: any) => {\n const isReadonly = readonlyFields.includes(key);\n return {\n name: key,\n displayName: startCase(key),\n mutability: isReadonly ? 'READ_ONLY' : 'READ_WRITE',\n value,\n };\n });\n }\n\n return (\n <>\n {verifiedNotice && (\n <AlertPrimitive\n variant=\"success\"\n role=\"status\"\n className={cx(\n withVendorCSSClassPrefix(bem('user-profile', 'verification-notice')),\n verificationStyles['alert'],\n )}\n data-testid=\"thunderid-verification-notice\"\n >\n <AlertPrimitive.Description>\n {t('user.verification.success', {attribute: verifiedNotice})}\n </AlertPrimitive.Description>\n </AlertPrimitive>\n )}\n <div className={styles.profileSummary}>\n <Avatar\n imageUrl={getMappedUserProfileValue('picture', mergedMappings, currentUser)}\n name={displayName}\n size={70}\n alt={`${displayName}'s avatar`}\n isLoading={isLoading}\n />\n <Typography variant=\"h3\" fontWeight=\"medium\">\n {displayName}\n </Typography>\n {getMappedUserProfileValue('email', mergedMappings, currentUser) && (\n <Typography variant=\"body2\" color=\"textSecondary\">\n {getMappedUserProfileValue('email', mergedMappings, currentUser)}\n </Typography>\n )}\n </div>\n <Divider />\n {schemaItems.map((schemaWithValue: Schema) => (\n <div key={schemaWithValue.name} className={styles.info}>\n {renderUserInfo(schemaWithValue)}\n {renderVerificationPanel(schemaWithValue)}\n </div>\n ))}\n </>\n );\n };\n\n const profileContent: any = (\n <CardPrimitive className={containerClasses}>\n {error && (\n <AlertPrimitive\n variant=\"error\"\n className={cx(withVendorCSSClassPrefix(bem('user-profile', 'alert')), styles.alert)}\n >\n <AlertPrimitive.Title>{t('errors.heading') || 'Error'}</AlertPrimitive.Title>\n <AlertPrimitive.Description>{error}</AlertPrimitive.Description>\n </AlertPrimitive>\n )}\n <div className={styles.infoContainer}>{renderProfileContent()}</div>\n </CardPrimitive>\n );\n\n if (mode === 'popup') {\n return (\n <DialogPrimitive open={open} onOpenChange={onOpenChange}>\n <DialogPrimitive.Content>\n <DialogPrimitive.Heading>{title ?? t('user.profile.heading')}</DialogPrimitive.Heading>\n <div className={styles.popup}>{profileContent}</div>\n </DialogPrimitive.Content>\n </DialogPrimitive>\n );\n }\n\n return profileContent;\n};\n\nexport default BaseUserProfile;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"BaseUserProfile.styles.d.ts","sourceRoot":"","sources":["../../../../src/components/account/UserProfile/BaseUserProfile.styles.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,KAAK,EAA2B,MAAM,oBAAoB,CAAC;AAInE;;;;;GAKG;AACH,QAAA,MAAM,SAAS,GAAI,OAAO,KAAK,EAAE,aAAa,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CA+N3E,CAAC;AAEF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"BaseUserProfile.styles.d.ts","sourceRoot":"","sources":["../../../../src/components/account/UserProfile/BaseUserProfile.styles.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,KAAK,EAA2B,MAAM,oBAAoB,CAAC;AAInE;;;;;GAKG;AACH,QAAA,MAAM,SAAS,GAAI,OAAO,KAAK,EAAE,aAAa,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CA+R3E,CAAC;AAEF,eAAe,SAAS,CAAC"}