@adminide-stack/yantra-mobile 12.0.54 → 12.0.55-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/CustomDrawer.js +203 -150
- package/lib/components/CustomDrawer.js.map +1 -1
- package/lib/components/NavigationHeader/HeaderMoreMenu.js +9 -2
- package/lib/components/NavigationHeader/HeaderMoreMenu.js.map +1 -1
- package/lib/components/NavigationHeader/HeaderSettingsMenu.js +2 -2
- package/lib/components/NavigationHeader/HeaderSettingsMenu.js.map +1 -1
- package/lib/components/NavigationHeader/HeaderToolbarButton.js +4 -1
- package/lib/components/NavigationHeader/HeaderToolbarButton.js.map +1 -1
- package/lib/components/NavigationHeader/NavigationHeader.js +4 -3
- package/lib/components/NavigationHeader/NavigationHeader.js.map +1 -1
- package/lib/components/ProfileAvatar.js +44 -0
- package/lib/components/ProfileAvatar.js.map +1 -0
- package/lib/compute.js +53 -1
- package/lib/compute.js.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/routes.json +55 -0
- package/lib/screens/Account/index.js +393 -0
- package/lib/screens/Account/index.js.map +1 -0
- package/lib/screens/Account/splitDisplayName.js +15 -0
- package/lib/screens/Account/splitDisplayName.js.map +1 -0
- package/lib/screens/Chat/index.js +4 -3
- package/lib/screens/Chat/index.js.map +1 -1
- package/lib/screens/Home/HomeScreen.js +4 -3
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/Home/components/HomeSuggestions.js +1 -1
- package/lib/screens/Home/components/HomeSuggestions.js.map +1 -1
- package/lib/theme/AppThemeProvider.js +74 -0
- package/lib/theme/AppThemeProvider.js.map +1 -0
- package/lib/theme/appTheme.js +9 -0
- package/lib/theme/appTheme.js.map +1 -0
- package/lib/theme/mobileTokens.js +52 -13
- package/lib/theme/mobileTokens.js.map +1 -1
- package/lib/utils/authUserDisplay.js +27 -9
- package/lib/utils/authUserDisplay.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authUserDisplay.js","sources":["../../src/utils/authUserDisplay.ts"],"sourcesContent":["/**\n * How the signed-in Auth0 user is presented: display name, email, avatar,\n * initials.\n *\n * Extracted from CustomDrawer so the drawer and the chat surface cannot drift\n * on what \"this user's name\" means - a chat message header showing a different\n * name from the drawer would read as two different accounts. Pure functions,\n * no React, so they are directly unit-testable.\n */\nimport type { IUserState } from '@adminide-stack/core';\n\n/** The OIDC claims Auth0 puts on the profile; all optional in practice. */\nexport type Auth0ProfileClaims = {\n email?: string;\n name?: string;\n nickname?: string;\n picture?: string;\n given_name?: string;\n family_name?: string;\n};\n\ntype AuthUserLike = IUserState & {\n profile?: Auth0ProfileClaims;\n givenName?: string;\n familyName?: string;\n name?: string;\n nickname?: string;\n email?: string;\n picture?: string;\n};\n\n/** Up to two letters for an avatar fallback; never empty. */\nexport function getInitials(name: string): string {\n const cleaned = name.trim();\n if (!cleaned) return 'A';\n const parts = cleaned.split(/\\s+/).filter(Boolean);\n if (parts.length === 1) return parts[0].slice(0, 1).toUpperCase();\n return `${parts[0].slice(0, 1)}${parts[1].slice(0, 1)}`.toUpperCase();\n}\n\n/**\n * The best human name we can build, in descending preference:\n * given+family, then OIDC `name` when it is not merely the email, then\n * nickname, then `name` even if it duplicates the email, then the email's\n * local part. Falls back to 'Account' so a header is never blank.\n */\nexport function pickPrimaryDisplayName(authUser: IUserState | null | undefined): string {\n const u = authUser as AuthUserLike;\n const p = u?.profile;\n const email = (p?.email ?? u?.email ?? '').trim();\n const emailLower = email.toLowerCase();\n\n const given = (p?.given_name ?? u?.givenName ?? '').trim();\n const family = (p?.family_name ?? u?.familyName ?? '').trim();\n /** 1) Full / partial legal name from given + family (given-only counts). */\n const fromParts = [given, family].filter(Boolean).join(' ').trim();\n if (fromParts) return fromParts;\n\n const nickname = (p?.nickname ?? u?.nickname ?? '').trim();\n const legalName = (p?.name ?? u?.name ?? '').trim();\n const legalLower = legalName.toLowerCase();\n\n /** 2) OIDC `name` when it is not just the email (often a proper display name). */\n if (legalName && legalLower !== emailLower) return legalName;\n\n /** 3) Username / nickname. */\n if (nickname) return nickname;\n\n /** 4) Fallback to `name` even when it duplicates email. */\n if (legalName) return legalName;\n\n const local = email.includes('@') ? (email.split('@')[0] ?? '').trim() : '';\n return local || 'Account';\n}\n\nexport function pickAuthEmail(authUser: IUserState | null | undefined): string {\n const u = authUser as AuthUserLike;\n return (u?.profile?.email ?? u?.email ?? '').trim();\n}\n\nexport function pickAuthPicture(authUser: IUserState | null | undefined): string | null {\n const u = authUser as AuthUserLike;\n const pic = u?.profile?.picture ?? u?.picture;\n return
|
|
1
|
+
{"version":3,"file":"authUserDisplay.js","sources":["../../src/utils/authUserDisplay.ts"],"sourcesContent":["/**\n * How the signed-in Auth0 user is presented: display name, email, avatar,\n * initials.\n *\n * Extracted from CustomDrawer so the drawer and the chat surface cannot drift\n * on what \"this user's name\" means - a chat message header showing a different\n * name from the drawer would read as two different accounts. Pure functions,\n * no React, so they are directly unit-testable.\n */\nimport type { IUserState } from '@adminide-stack/core';\n\n/** The OIDC claims Auth0 puts on the profile; all optional in practice. */\nexport type Auth0ProfileClaims = {\n email?: string;\n name?: string;\n nickname?: string;\n picture?: string;\n given_name?: string;\n family_name?: string;\n};\n\ntype AuthUserLike = IUserState & {\n profile?: Auth0ProfileClaims;\n givenName?: string;\n familyName?: string;\n name?: string;\n nickname?: string;\n username?: string;\n email?: string;\n picture?: string;\n};\n\n/** Up to two letters for an avatar fallback; never empty. */\nexport function getInitials(name: string): string {\n const cleaned = name.trim();\n if (!cleaned) return 'A';\n const parts = cleaned.split(/\\s+/).filter(Boolean);\n if (parts.length === 1) return parts[0].slice(0, 1).toUpperCase();\n return `${parts[0].slice(0, 1)}${parts[1].slice(0, 1)}`.toUpperCase();\n}\n\n/**\n * The best human name we can build, in descending preference:\n * given+family, then OIDC `name` when it is not merely the email, then\n * nickname, then `name` even if it duplicates the email, then the email's\n * local part. Falls back to 'Account' so a header is never blank.\n */\nexport function pickPrimaryDisplayName(authUser: IUserState | null | undefined): string {\n const u = authUser as AuthUserLike;\n const p = u?.profile;\n const email = (p?.email ?? u?.email ?? '').trim();\n const emailLower = email.toLowerCase();\n\n const given = (p?.given_name ?? u?.givenName ?? '').trim();\n const family = (p?.family_name ?? u?.familyName ?? '').trim();\n /** 1) Full / partial legal name from given + family (given-only counts). */\n const fromParts = [given, family].filter(Boolean).join(' ').trim();\n if (fromParts) return fromParts;\n\n const nickname = (p?.nickname ?? u?.nickname ?? '').trim();\n const legalName = (p?.name ?? u?.name ?? '').trim();\n const legalLower = legalName.toLowerCase();\n\n /** 2) OIDC `name` when it is not just the email (often a proper display name). */\n if (legalName && legalLower !== emailLower) return legalName;\n\n /** 3) Username / nickname. */\n if (nickname) return nickname;\n\n /** 4) Fallback to `name` even when it duplicates email. */\n if (legalName) return legalName;\n\n const local = email.includes('@') ? (email.split('@')[0] ?? '').trim() : '';\n return local || 'Account';\n}\n\nexport function pickAuthEmail(authUser: IUserState | null | undefined): string {\n const u = authUser as AuthUserLike;\n return (u?.profile?.email ?? u?.email ?? '').trim();\n}\n\n/** Handle / Auth0 nickname, without a leading @. Falls back to the email local part. */\nexport function pickAuthUsername(authUser: IUserState | null | undefined): string {\n const u = authUser as AuthUserLike;\n const fromClaims = (u?.username ?? u?.nickname ?? u?.profile?.nickname ?? '').trim().replace(/^@/, '');\n if (fromClaims) return fromClaims;\n const email = pickAuthEmail(authUser);\n return email.includes('@') ? (email.split('@')[0] ?? '').trim() : '';\n}\n\n/** Single letter for the circular text avatar (Manus-style). */\nexport function firstAvatarLetter(name: string): string {\n const ch = name.trim().charAt(0);\n return ch ? ch.toUpperCase() : 'A';\n}\n\n/**\n * Auth0 always sends a `picture` URL — often `cdn.auth0.com/avatars/t.png` or a\n * Gravatar that points at that generated blob. Those look like a solid color\n * circle with no letter. Treat them as \"no photo\" so we render a text avatar.\n */\nexport function isUsableProfilePhotoUrl(url: string | null | undefined): boolean {\n const raw = typeof url === 'string' ? url.trim() : '';\n if (!raw || !/^https?:\\/\\//i.test(raw)) return false;\n const lower = raw.toLowerCase();\n if (lower.includes('cdn.auth0.com/avatars/')) return false;\n if (lower.includes('gravatar.com/avatar') && /[?&]d=/.test(lower)) return false;\n return true;\n}\n\nexport function pickAuthPicture(authUser: IUserState | null | undefined): string | null {\n const u = authUser as AuthUserLike;\n const pic = u?.profile?.picture ?? u?.picture;\n return isUsableProfilePhotoUrl(pic) ? String(pic).trim() : null;\n}\n\nexport function pickProfilePhotoUrl(\n photos: Array<{ url?: string | null } | null | undefined> | null | undefined,\n authUser: IUserState | null | undefined,\n): string | null {\n const fromProfile = (photos ?? []).map((p) => p?.url).find((url) => isUsableProfilePhotoUrl(url ?? null));\n if (fromProfile) return fromProfile.trim();\n return pickAuthPicture(authUser);\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adminide-stack/yantra-mobile",
|
|
3
|
-
"version": "12.0.
|
|
3
|
+
"version": "12.0.55-alpha.1",
|
|
4
4
|
"description": "Sample core for higher packages to depend on",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"author": "CDMBase LLC",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"uuid": "^9.0.0"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"common": "
|
|
28
|
+
"common": "12.0.55-alpha.1"
|
|
29
29
|
},
|
|
30
30
|
"peerDependencies": {
|
|
31
31
|
"@admin-layout/gluestack-ui-mobile": "*",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"@messenger-box/platform-mobile": "*",
|
|
42
42
|
"@react-native-async-storage/async-storage": "*",
|
|
43
43
|
"@react-navigation/native": "*",
|
|
44
|
-
"common": "12.0.
|
|
44
|
+
"common": "12.0.54-alpha.11",
|
|
45
45
|
"expo-constants": "*",
|
|
46
46
|
"expo-secure-store": "*",
|
|
47
47
|
"lodash": "*",
|
|
@@ -57,5 +57,5 @@
|
|
|
57
57
|
"typescript": {
|
|
58
58
|
"definition": "lib/index.d.ts"
|
|
59
59
|
},
|
|
60
|
-
"gitHead": "
|
|
60
|
+
"gitHead": "ba520ffdd3dcd385393909758081e0b150283abf"
|
|
61
61
|
}
|