@adminide-stack/yantra-mobile 12.0.54-alpha.8 → 12.0.55-alpha.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 (64) hide show
  1. package/lib/components/CustomDrawer.js +230 -168
  2. package/lib/components/CustomDrawer.js.map +1 -1
  3. package/lib/components/NavigationHeader/HeaderMoreMenu.js +15 -5
  4. package/lib/components/NavigationHeader/HeaderMoreMenu.js.map +1 -1
  5. package/lib/components/NavigationHeader/HeaderSettingsMenu.js +2 -2
  6. package/lib/components/NavigationHeader/HeaderSettingsMenu.js.map +1 -1
  7. package/lib/components/NavigationHeader/HeaderSkillsButton.js +5 -2
  8. package/lib/components/NavigationHeader/HeaderSkillsButton.js.map +1 -1
  9. package/lib/components/NavigationHeader/HeaderTasksButton.js +4 -1
  10. package/lib/components/NavigationHeader/HeaderTasksButton.js.map +1 -1
  11. package/lib/components/NavigationHeader/HeaderToolbarButton.js +4 -1
  12. package/lib/components/NavigationHeader/HeaderToolbarButton.js.map +1 -1
  13. package/lib/components/NavigationHeader/NavigationHeader.js +5 -5
  14. package/lib/components/NavigationHeader/NavigationHeader.js.map +1 -1
  15. package/lib/components/ProfileAvatar.js +44 -0
  16. package/lib/components/ProfileAvatar.js.map +1 -0
  17. package/lib/compute.js +109 -7
  18. package/lib/compute.js.map +1 -1
  19. package/lib/features/agent-chat/NativeAgentChat.js +46 -7
  20. package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
  21. package/lib/features/apps/AppsCatalog.js +10 -0
  22. package/lib/features/apps/AppsCatalog.js.map +1 -1
  23. package/lib/features/apps/mobileAppCatalog.js +7 -0
  24. package/lib/features/apps/mobileAppCatalog.js.map +1 -1
  25. package/lib/features/travel/nativeTravelRegistry.js +15 -0
  26. package/lib/features/travel/nativeTravelRegistry.js.map +1 -0
  27. package/lib/graphql/typePolicies.js +35 -1
  28. package/lib/graphql/typePolicies.js.map +1 -1
  29. package/lib/hooks/useAccountDefaultSettings.js +2 -0
  30. package/lib/hooks/useAccountDefaultSettings.js.map +1 -1
  31. package/lib/hooks/usePrerequisiteIds.js +4 -1
  32. package/lib/hooks/usePrerequisiteIds.js.map +1 -1
  33. package/lib/index.js +1 -1
  34. package/lib/index.js.map +1 -1
  35. package/lib/routes.json +113 -3
  36. package/lib/screens/Account/index.js +393 -0
  37. package/lib/screens/Account/index.js.map +1 -0
  38. package/lib/screens/Account/splitDisplayName.js +15 -0
  39. package/lib/screens/Account/splitDisplayName.js.map +1 -0
  40. package/lib/screens/CanvasBoard/index.js +6 -1
  41. package/lib/screens/CanvasBoard/index.js.map +1 -1
  42. package/lib/screens/Chat/index.js +4 -3
  43. package/lib/screens/Chat/index.js.map +1 -1
  44. package/lib/screens/Home/HomeScreen.js +39 -21
  45. package/lib/screens/Home/HomeScreen.js.map +1 -1
  46. package/lib/screens/Home/components/HomeSuggestions.js +1 -1
  47. package/lib/screens/Home/components/HomeSuggestions.js.map +1 -1
  48. package/lib/screens/ShoppingNative/index.js +3 -1
  49. package/lib/screens/ShoppingNative/index.js.map +1 -1
  50. package/lib/screens/TravelNative/index.js +70 -0
  51. package/lib/screens/TravelNative/index.js.map +1 -0
  52. package/lib/screens/TravelNative/useTravelHostChat.js +66 -0
  53. package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -0
  54. package/lib/theme/AppThemeProvider.js +74 -0
  55. package/lib/theme/AppThemeProvider.js.map +1 -0
  56. package/lib/theme/appTheme.js +9 -0
  57. package/lib/theme/appTheme.js.map +1 -0
  58. package/lib/theme/mobileTokens.js +52 -13
  59. package/lib/theme/mobileTokens.js.map +1 -1
  60. package/lib/utils/authUserDisplay.js +27 -9
  61. package/lib/utils/authUserDisplay.js.map +1 -1
  62. package/lib/utils/drawerNavigation.js +42 -0
  63. package/lib/utils/drawerNavigation.js.map +1 -0
  64. package/package.json +4 -4
@@ -0,0 +1,74 @@
1
+ import {jsx}from'react/jsx-runtime';import AsyncStorage from'@react-native-async-storage/async-storage';import {useContext,createContext,useState,useRef,useCallback,useEffect,useMemo}from'react';import {useColorScheme,Appearance}from'react-native';import {resolveEffectiveScheme,DEFAULT_THEME_PREFERENCE,schemeFromDevice,THEME_PREFERENCE_STORAGE_KEY}from'./appTheme.js';const AppThemeContext = createContext(null);
2
+ function applyNativeColorScheme(preference) {
3
+ const setter = Appearance.setColorScheme;
4
+ if (typeof setter !== "function") return;
5
+ setter(preference === "system" ? null : preference);
6
+ }
7
+ function persistPreference(next) {
8
+ void AsyncStorage.setItem(THEME_PREFERENCE_STORAGE_KEY, next).catch(() => {
9
+ });
10
+ }
11
+ function AppThemeProvider({
12
+ children
13
+ }) {
14
+ const systemScheme = useColorScheme();
15
+ const [preference, setPreferenceState] = useState(DEFAULT_THEME_PREFERENCE);
16
+ const skipNextSystemSync = useRef(false);
17
+ const setPreference = useCallback((next) => {
18
+ setPreferenceState(next);
19
+ applyNativeColorScheme(next);
20
+ persistPreference(next);
21
+ }, []);
22
+ const setDarkMode = useCallback((enabled) => {
23
+ skipNextSystemSync.current = true;
24
+ setPreference(enabled ? "dark" : "light");
25
+ }, [setPreference]);
26
+ useEffect(() => {
27
+ applyNativeColorScheme("system");
28
+ const syncFromDevice = () => {
29
+ const device = schemeFromDevice(Appearance.getColorScheme());
30
+ setPreferenceState(device);
31
+ persistPreference(device);
32
+ };
33
+ syncFromDevice();
34
+ const timer = setTimeout(syncFromDevice, 0);
35
+ return () => clearTimeout(timer);
36
+ }, []);
37
+ useEffect(() => {
38
+ const sub = Appearance.addChangeListener(({
39
+ colorScheme
40
+ }) => {
41
+ if (skipNextSystemSync.current) {
42
+ skipNextSystemSync.current = false;
43
+ return;
44
+ }
45
+ const next = schemeFromDevice(colorScheme);
46
+ setPreferenceState(next);
47
+ persistPreference(next);
48
+ applyNativeColorScheme("system");
49
+ });
50
+ return () => sub.remove();
51
+ }, []);
52
+ const scheme = resolveEffectiveScheme(preference, systemScheme);
53
+ const value = useMemo(() => ({
54
+ preference,
55
+ scheme,
56
+ isDark: scheme === "dark",
57
+ setPreference,
58
+ setDarkMode
59
+ }), [preference, scheme, setPreference, setDarkMode]);
60
+ return /* @__PURE__ */ jsx(AppThemeContext.Provider, { value, children });
61
+ }
62
+ function useAppTheme() {
63
+ const ctx = useContext(AppThemeContext);
64
+ const systemScheme = useColorScheme();
65
+ const scheme = resolveEffectiveScheme(DEFAULT_THEME_PREFERENCE, systemScheme);
66
+ if (ctx) return ctx;
67
+ return {
68
+ preference: DEFAULT_THEME_PREFERENCE,
69
+ scheme,
70
+ isDark: scheme === "dark",
71
+ setPreference: () => void 0,
72
+ setDarkMode: () => void 0
73
+ };
74
+ }export{AppThemeProvider,useAppTheme};//# sourceMappingURL=AppThemeProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppThemeProvider.js","sources":["../../src/theme/AppThemeProvider.tsx"],"sourcesContent":["import AsyncStorage from '@react-native-async-storage/async-storage';\nimport React, { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { Appearance, useColorScheme } from 'react-native';\nimport {\n DEFAULT_THEME_PREFERENCE,\n THEME_PREFERENCE_STORAGE_KEY,\n resolveEffectiveScheme,\n schemeFromDevice,\n type ColorSchemeName,\n type ThemePreference,\n} from './appTheme';\n\ntype AppThemeContextValue = {\n preference: ThemePreference;\n scheme: ColorSchemeName;\n isDark: boolean;\n setPreference: (next: ThemePreference) => void;\n setDarkMode: (enabled: boolean) => void;\n};\n\nconst AppThemeContext = createContext<AppThemeContextValue | null>(null);\n\nfunction applyNativeColorScheme(preference: ThemePreference) {\n const setter = Appearance.setColorScheme;\n if (typeof setter !== 'function') return;\n setter(preference === 'system' ? null : preference);\n}\n\nfunction persistPreference(next: ThemePreference) {\n void AsyncStorage.setItem(THEME_PREFERENCE_STORAGE_KEY, next).catch(() => {\n /* ignore */\n });\n}\n\nexport function AppThemeProvider({ children }: { children: React.ReactNode }) {\n const systemScheme = useColorScheme();\n const [preference, setPreferenceState] = useState<ThemePreference>(DEFAULT_THEME_PREFERENCE);\n const skipNextSystemSync = useRef(false);\n\n const setPreference = useCallback((next: ThemePreference) => {\n setPreferenceState(next);\n applyNativeColorScheme(next);\n persistPreference(next);\n }, []);\n\n const setDarkMode = useCallback(\n (enabled: boolean) => {\n skipNextSystemSync.current = true;\n setPreference(enabled ? 'dark' : 'light');\n },\n [setPreference],\n );\n\n useEffect(() => {\n applyNativeColorScheme('system');\n const syncFromDevice = () => {\n const device = schemeFromDevice(Appearance.getColorScheme());\n setPreferenceState(device);\n persistPreference(device);\n };\n syncFromDevice();\n const timer = setTimeout(syncFromDevice, 0);\n return () => clearTimeout(timer);\n }, []);\n\n useEffect(() => {\n const sub = Appearance.addChangeListener(({ colorScheme }) => {\n if (skipNextSystemSync.current) {\n skipNextSystemSync.current = false;\n return;\n }\n const next = schemeFromDevice(colorScheme);\n setPreferenceState(next);\n persistPreference(next);\n applyNativeColorScheme('system');\n });\n return () => sub.remove();\n }, []);\n\n const scheme = resolveEffectiveScheme(preference, systemScheme);\n const value = useMemo(\n () => ({\n preference,\n scheme,\n isDark: scheme === 'dark',\n setPreference,\n setDarkMode,\n }),\n [preference, scheme, setPreference, setDarkMode],\n );\n\n return <AppThemeContext.Provider value={value}>{children}</AppThemeContext.Provider>;\n}\n\nexport function useAppTheme(): AppThemeContextValue {\n const ctx = useContext(AppThemeContext);\n const systemScheme = useColorScheme();\n const scheme = resolveEffectiveScheme(DEFAULT_THEME_PREFERENCE, systemScheme);\n if (ctx) return ctx;\n return {\n preference: DEFAULT_THEME_PREFERENCE,\n scheme,\n isDark: scheme === 'dark',\n setPreference: () => undefined,\n setDarkMode: () => undefined,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ const THEME_PREFERENCE_STORAGE_KEY = "yantra-appearance-preference";
2
+ const DEFAULT_THEME_PREFERENCE = "light";
3
+ function resolveEffectiveScheme(preference, systemScheme) {
4
+ if (preference === "light" || preference === "dark") return preference;
5
+ return systemScheme === "dark" ? "dark" : "light";
6
+ }
7
+ function schemeFromDevice(systemScheme) {
8
+ return systemScheme === "dark" ? "dark" : "light";
9
+ }export{DEFAULT_THEME_PREFERENCE,THEME_PREFERENCE_STORAGE_KEY,resolveEffectiveScheme,schemeFromDevice};//# sourceMappingURL=appTheme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appTheme.js","sources":["../../src/theme/appTheme.ts"],"sourcesContent":["export type ThemePreference = 'system' | 'light' | 'dark';\nexport type ColorSchemeName = 'light' | 'dark';\n\nexport const THEME_PREFERENCE_STORAGE_KEY = 'yantra-appearance-preference';\n\n/** First launch and unknown values are light. */\nexport const DEFAULT_THEME_PREFERENCE: ThemePreference = 'light';\n\nexport function parseThemePreference(raw: string | null | undefined): ThemePreference {\n if (raw === 'light' || raw === 'dark' || raw === 'system') return raw;\n return DEFAULT_THEME_PREFERENCE;\n}\n\nexport function resolveEffectiveScheme(\n preference: ThemePreference,\n systemScheme: ColorSchemeName | null | undefined,\n): ColorSchemeName {\n if (preference === 'light' || preference === 'dark') return preference;\n return systemScheme === 'dark' ? 'dark' : 'light';\n}\n\n/** Device appearance wins over a leftover in-app override. */\nexport function schemeFromDevice(systemScheme: ColorSchemeName | null | undefined): ColorSchemeName {\n return systemScheme === 'dark' ? 'dark' : 'light';\n}\n"],"names":[],"mappings":"AAEO,MAAM,4BAA+B,GAAA;AAGrC,MAAM,wBAA4C,GAAA;AAKzC,SAAA,sBAAA,CAAuB,YAA6B,YAAmE,EAAA;AACrI,EAAA,IAAI,UAAe,KAAA,OAAA,IAAW,UAAe,KAAA,MAAA,EAAe,OAAA,UAAA;AAC5D,EAAO,OAAA,YAAA,KAAiB,SAAS,MAAS,GAAA,OAAA;AAC5C;AAGO,SAAS,iBAAiB,YAAmE,EAAA;AAClG,EAAO,OAAA,YAAA,KAAiB,SAAS,MAAS,GAAA,OAAA;AAC5C"}
@@ -1,15 +1,54 @@
1
+ const lightColor = {
2
+ bg: "#f8fafc",
3
+ surface: "#ffffff",
4
+ surfaceMuted: "#f1f5f9",
5
+ border: "#e2e8f0",
6
+ text: "#0f172a",
7
+ textMuted: "#475569",
8
+ primary: "#4f46e5",
9
+ primarySoft: "#eef2ff",
10
+ primaryBorder: "#c7d2fe",
11
+ successSoft: "#ecfdf5",
12
+ successText: "#047857",
13
+ warningSoft: "#fffbeb",
14
+ warningText: "#b45309",
15
+ dangerSoft: "#fef2f2",
16
+ dangerText: "#b91c1c"
17
+ };
18
+ const darkColor = {
19
+ bg: "#0f172a",
20
+ surface: "#1e293b",
21
+ surfaceMuted: "#334155",
22
+ border: "rgba(148,163,184,0.22)",
23
+ text: "#e2e8f0",
24
+ textMuted: "#94a3b8",
25
+ primary: "#818cf8",
26
+ primarySoft: "rgba(99,102,241,0.22)",
27
+ primaryBorder: "rgba(165,180,252,0.4)",
28
+ successSoft: "rgba(16,185,129,0.16)",
29
+ successText: "#6ee7b7",
30
+ warningSoft: "rgba(245,158,11,0.16)",
31
+ warningText: "#fbbf24",
32
+ dangerSoft: "rgba(239,68,68,0.16)",
33
+ dangerText: "#fca5a5"
34
+ };
35
+ function mobileColors(isDark) {
36
+ return isDark ? darkColor : lightColor;
37
+ }
1
38
  const mobileTokens = {
2
- color: {
3
- bg: "#f8fafc",
4
- surface: "#ffffff",
5
- surfaceMuted: "#f1f5f9",
6
- border: "#e2e8f0",
7
- text: "#0f172a",
8
- textMuted: "#475569",
9
- primary: "#4f46e5",
10
- primarySoft: "#eef2ff",
11
- primaryBorder: "#c7d2fe",
12
- dangerText: "#b91c1c"
13
- },
39
+ color: lightColor,
14
40
  radius: {
15
- md: 14}};export{mobileTokens};//# sourceMappingURL=mobileTokens.js.map
41
+ md: 14},
42
+ shadow: {
43
+ card: {
44
+ shadowColor: "#0f172a",
45
+ shadowOpacity: 0.06,
46
+ shadowRadius: 10,
47
+ shadowOffset: {
48
+ width: 0,
49
+ height: 4
50
+ },
51
+ elevation: 2
52
+ }
53
+ }
54
+ };export{mobileColors,mobileTokens};//# sourceMappingURL=mobileTokens.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mobileTokens.js","sources":["../../src/theme/mobileTokens.ts"],"sourcesContent":["export const mobileTokens = {\n color: {\n bg: '#f8fafc',\n surface: '#ffffff',\n surfaceMuted: '#f1f5f9',\n border: '#e2e8f0',\n text: '#0f172a',\n textMuted: '#475569',\n primary: '#4f46e5',\n primarySoft: '#eef2ff',\n primaryBorder: '#c7d2fe',\n successSoft: '#ecfdf5',\n successText: '#047857',\n warningSoft: '#fffbeb',\n warningText: '#b45309',\n dangerSoft: '#fef2f2',\n dangerText: '#b91c1c',\n },\n radius: {\n sm: 10,\n md: 14,\n lg: 18,\n pill: 999,\n },\n shadow: {\n card: {\n shadowColor: '#0f172a',\n shadowOpacity: 0.06,\n shadowRadius: 10,\n shadowOffset: { width: 0, height: 4 },\n elevation: 2,\n },\n },\n} as const;\n"],"names":[],"mappings":"AAAO,MAAM,YAAe,GAAA;AAAA,EAC1B,KAAO,EAAA;AAAA,IACL,EAAI,EAAA,SAAA;AAAA,IACJ,OAAS,EAAA,SAAA;AAAA,IACT,YAAc,EAAA,SAAA;AAAA,IACd,MAAQ,EAAA,SAAA;AAAA,IACR,IAAM,EAAA,SAAA;AAAA,IACN,SAAW,EAAA,SAAA;AAAA,IACX,OAAS,EAAA,SAAA;AAAA,IACT,WAAa,EAAA,SAAA;AAAA,IACb,aAAe,EAAA,SAAA;AAAA,IAMf,UAAY,EAAA;AAAA,GACd;AAAA,EACA,MAAQ,EAAA;AAAA,IAEN,EAAI,EAAA,EAGN,CAaF"}
1
+ {"version":3,"file":"mobileTokens.js","sources":["../../src/theme/mobileTokens.ts"],"sourcesContent":["const lightColor = {\n bg: '#f8fafc',\n surface: '#ffffff',\n surfaceMuted: '#f1f5f9',\n border: '#e2e8f0',\n text: '#0f172a',\n textMuted: '#475569',\n primary: '#4f46e5',\n primarySoft: '#eef2ff',\n primaryBorder: '#c7d2fe',\n successSoft: '#ecfdf5',\n successText: '#047857',\n warningSoft: '#fffbeb',\n warningText: '#b45309',\n dangerSoft: '#fef2f2',\n dangerText: '#b91c1c',\n} as const;\n\nconst darkColor = {\n bg: '#0f172a',\n surface: '#1e293b',\n surfaceMuted: '#334155',\n border: 'rgba(148,163,184,0.22)',\n text: '#e2e8f0',\n textMuted: '#94a3b8',\n primary: '#818cf8',\n primarySoft: 'rgba(99,102,241,0.22)',\n primaryBorder: 'rgba(165,180,252,0.4)',\n successSoft: 'rgba(16,185,129,0.16)',\n successText: '#6ee7b7',\n warningSoft: 'rgba(245,158,11,0.16)',\n warningText: '#fbbf24',\n dangerSoft: 'rgba(239,68,68,0.16)',\n dangerText: '#fca5a5',\n} as const;\n\nexport function mobileColors(isDark: boolean) {\n return isDark ? darkColor : lightColor;\n}\n\nexport const mobileTokens = {\n color: lightColor,\n radius: {\n sm: 10,\n md: 14,\n lg: 18,\n pill: 999,\n },\n shadow: {\n card: {\n shadowColor: '#0f172a',\n shadowOpacity: 0.06,\n shadowRadius: 10,\n shadowOffset: { width: 0, height: 4 },\n elevation: 2,\n },\n },\n} as const;\n"],"names":[],"mappings":"AAAA,MAAM,UAAa,GAAA;AAAA,EACjB,EAAI,EAAA,SAAA;AAAA,EACJ,OAAS,EAAA,SAAA;AAAA,EACT,YAAc,EAAA,SAAA;AAAA,EACd,MAAQ,EAAA,SAAA;AAAA,EACR,IAAM,EAAA,SAAA;AAAA,EACN,SAAW,EAAA,SAAA;AAAA,EACX,OAAS,EAAA,SAAA;AAAA,EACT,WAAa,EAAA,SAAA;AAAA,EACb,aAAe,EAAA,SAAA;AAAA,EACf,WAAa,EAAA,SAAA;AAAA,EACb,WAAa,EAAA,SAAA;AAAA,EACb,WAAa,EAAA,SAAA;AAAA,EACb,WAAa,EAAA,SAAA;AAAA,EACb,UAAY,EAAA,SAAA;AAAA,EACZ,UAAY,EAAA;AACd,CAAA;AACA,MAAM,SAAY,GAAA;AAAA,EAChB,EAAI,EAAA,SAAA;AAAA,EACJ,OAAS,EAAA,SAAA;AAAA,EACT,YAAc,EAAA,SAAA;AAAA,EACd,MAAQ,EAAA,wBAAA;AAAA,EACR,IAAM,EAAA,SAAA;AAAA,EACN,SAAW,EAAA,SAAA;AAAA,EACX,OAAS,EAAA,SAAA;AAAA,EACT,WAAa,EAAA,uBAAA;AAAA,EACb,aAAe,EAAA,uBAAA;AAAA,EACf,WAAa,EAAA,uBAAA;AAAA,EACb,WAAa,EAAA,SAAA;AAAA,EACb,WAAa,EAAA,uBAAA;AAAA,EACb,WAAa,EAAA,SAAA;AAAA,EACb,UAAY,EAAA,sBAAA;AAAA,EACZ,UAAY,EAAA;AACd,CAAA;AACO,SAAS,aAAa,MAAiB,EAAA;AAC5C,EAAA,OAAO,SAAS,SAAY,GAAA,UAAA;AAC9B;AACO,MAAM,YAAe,GAAA;AAAA,EAC1B,KAAO,EAAA,UAAA;AAAA,EACP,MAAQ,EAAA;AAAA,IAEN,EAAI,EAAA,EAGN,CAAA;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA;AAAA,MACJ,WAAa,EAAA,SAAA;AAAA,MACb,aAAe,EAAA,IAAA;AAAA,MACf,YAAc,EAAA,EAAA;AAAA,MACd,YAAc,EAAA;AAAA,QACZ,KAAO,EAAA,CAAA;AAAA,QACP,MAAQ,EAAA;AAAA,OACV;AAAA,MACA,SAAW,EAAA;AAAA;AACb;AAEJ"}
@@ -1,10 +1,3 @@
1
- function getInitials(name) {
2
- const cleaned = name.trim();
3
- if (!cleaned) return "A";
4
- const parts = cleaned.split(/\s+/).filter(Boolean);
5
- if (parts.length === 1) return parts[0].slice(0, 1).toUpperCase();
6
- return `${parts[0].slice(0, 1)}${parts[1].slice(0, 1)}`.toUpperCase();
7
- }
8
1
  function pickPrimaryDisplayName(authUser) {
9
2
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
10
3
  const u = authUser;
@@ -29,9 +22,34 @@ function pickAuthEmail(authUser) {
29
22
  const u = authUser;
30
23
  return ((_c = (_b = (_a = u == null ? void 0 : u.profile) == null ? void 0 : _a.email) != null ? _b : u == null ? void 0 : u.email) != null ? _c : "").trim();
31
24
  }
25
+ function pickAuthUsername(authUser) {
26
+ var _a, _b, _c, _d, _e;
27
+ const u = authUser;
28
+ const fromClaims = ((_d = (_c = (_a = u == null ? void 0 : u.username) != null ? _a : u == null ? void 0 : u.nickname) != null ? _c : (_b = u == null ? void 0 : u.profile) == null ? void 0 : _b.nickname) != null ? _d : "").trim().replace(/^@/, "");
29
+ if (fromClaims) return fromClaims;
30
+ const email = pickAuthEmail(authUser);
31
+ return email.includes("@") ? ((_e = email.split("@")[0]) != null ? _e : "").trim() : "";
32
+ }
33
+ function firstAvatarLetter(name) {
34
+ const ch = name.trim().charAt(0);
35
+ return ch ? ch.toUpperCase() : "A";
36
+ }
37
+ function isUsableProfilePhotoUrl(url) {
38
+ const raw = typeof url === "string" ? url.trim() : "";
39
+ if (!raw || !/^https?:\/\//i.test(raw)) return false;
40
+ const lower = raw.toLowerCase();
41
+ if (lower.includes("cdn.auth0.com/avatars/")) return false;
42
+ if (lower.includes("gravatar.com/avatar") && /[?&]d=/.test(lower)) return false;
43
+ return true;
44
+ }
32
45
  function pickAuthPicture(authUser) {
33
46
  var _a, _b;
34
47
  const u = authUser;
35
48
  const pic = (_b = (_a = u == null ? void 0 : u.profile) == null ? void 0 : _a.picture) != null ? _b : u == null ? void 0 : u.picture;
36
- return typeof pic === "string" && pic.trim() ? pic.trim() : null;
37
- }export{getInitials,pickAuthEmail,pickAuthPicture,pickPrimaryDisplayName};//# sourceMappingURL=authUserDisplay.js.map
49
+ return isUsableProfilePhotoUrl(pic) ? String(pic).trim() : null;
50
+ }
51
+ function pickProfilePhotoUrl(photos, authUser) {
52
+ const fromProfile = (photos != null ? photos : []).map((p) => p == null ? void 0 : p.url).find((url) => isUsableProfilePhotoUrl(url != null ? url : null));
53
+ if (fromProfile) return fromProfile.trim();
54
+ return pickAuthPicture(authUser);
55
+ }export{firstAvatarLetter,isUsableProfilePhotoUrl,pickAuthEmail,pickAuthPicture,pickAuthUsername,pickPrimaryDisplayName,pickProfilePhotoUrl};//# sourceMappingURL=authUserDisplay.js.map
@@ -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 typeof pic === 'string' && pic.trim() ? pic.trim() : null;\n}\n"],"names":[],"mappings":"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"}
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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"}
@@ -0,0 +1,42 @@
1
+ import {DrawerActions}from'@react-navigation/native';function findDrawerNavigation(navigation) {
2
+ var _a, _b, _c;
3
+ let current = navigation;
4
+ for (let i = 0; i < 12 && current; i += 1) {
5
+ if (typeof current.openDrawer === "function" || ((_b = (_a = current.getState) == null ? void 0 : _a.call(current)) == null ? void 0 : _b.type) === "drawer") {
6
+ return current;
7
+ }
8
+ current = (_c = current.getParent) == null ? void 0 : _c.call(current);
9
+ }
10
+ return null;
11
+ }
12
+ function dispatchDrawerAction(navigation, action) {
13
+ var _a, _b, _c;
14
+ const drawer = findDrawerNavigation(navigation);
15
+ if (!drawer) return;
16
+ if (action === "open" && typeof drawer.openDrawer === "function") {
17
+ drawer.openDrawer();
18
+ return;
19
+ }
20
+ if (action === "close" && typeof drawer.closeDrawer === "function") {
21
+ drawer.closeDrawer();
22
+ return;
23
+ }
24
+ if (action === "toggle" && typeof drawer.toggleDrawer === "function") {
25
+ drawer.toggleDrawer();
26
+ return;
27
+ }
28
+ if (((_b = (_a = drawer.getState) == null ? void 0 : _a.call(drawer)) == null ? void 0 : _b.type) !== "drawer") return;
29
+ const creator = action === "open" ? DrawerActions.openDrawer : action === "close" ? DrawerActions.closeDrawer : DrawerActions.toggleDrawer;
30
+ (_c = drawer.dispatch) == null ? void 0 : _c.call(drawer, creator());
31
+ }
32
+ function resetDrawerClosed(navigation) {
33
+ dispatchDrawerAction(navigation, "close");
34
+ requestAnimationFrame(() => {
35
+ dispatchDrawerAction(navigation, "close");
36
+ });
37
+ }
38
+ function afterNativeModalClose(run) {
39
+ requestAnimationFrame(() => {
40
+ setTimeout(run, 40);
41
+ });
42
+ }export{afterNativeModalClose,dispatchDrawerAction,findDrawerNavigation,resetDrawerClosed};//# sourceMappingURL=drawerNavigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drawerNavigation.js","sources":["../../src/utils/drawerNavigation.ts"],"sourcesContent":["import { DrawerActions } from '@react-navigation/native';\n\ntype NavLike = {\n openDrawer?: () => void;\n closeDrawer?: () => void;\n toggleDrawer?: () => void;\n getState?: () => { type?: string; history?: Array<{ type?: string }> } | undefined;\n getParent?: () => NavLike | undefined;\n dispatch?: (action: unknown) => void;\n};\n\nexport type DrawerAction = 'open' | 'close' | 'toggle';\n\n/**\n * Home / Chat live inside the workspace drawer; Canvas, Apps, and Shop are\n * nested (or sibling) routes. After those screens, `DrawerActions.openDrawer()`\n * on the focused navigator is a no-op, and a half-closed drawer leaves a\n * left-edge overlay that eats hamburger taps.\n */\nexport function findDrawerNavigation(navigation: NavLike | null | undefined): NavLike | null {\n let current: NavLike | null | undefined = navigation;\n for (let i = 0; i < 12 && current; i += 1) {\n if (typeof current.openDrawer === 'function' || current.getState?.()?.type === 'drawer') {\n return current;\n }\n current = current.getParent?.();\n }\n return null;\n}\n\n/** React Navigation records an open drawer as `{ type: 'drawer' }` in history. */\nexport function isDrawerOpen(navigation: NavLike | null | undefined): boolean {\n const history = findDrawerNavigation(navigation)?.getState?.()?.history;\n return Array.isArray(history) && history.some((entry) => entry?.type === 'drawer');\n}\n\nexport function dispatchDrawerAction(navigation: NavLike | null | undefined, action: DrawerAction): void {\n const drawer = findDrawerNavigation(navigation);\n // Apps / Canvas / Shop sit on the root stack (`/:orgName/apps`), not inside\n // `main_drawer`. Dispatching CLOSE_DRAWER there logs \"not handled by any\n // navigator\" and does not reset the leftover overlay.\n if (!drawer) return;\n if (action === 'open' && typeof drawer.openDrawer === 'function') {\n drawer.openDrawer();\n return;\n }\n if (action === 'close' && typeof drawer.closeDrawer === 'function') {\n drawer.closeDrawer();\n return;\n }\n if (action === 'toggle' && typeof drawer.toggleDrawer === 'function') {\n drawer.toggleDrawer();\n return;\n }\n if (drawer.getState?.()?.type !== 'drawer') return;\n const creator =\n action === 'open'\n ? DrawerActions.openDrawer\n : action === 'close'\n ? DrawerActions.closeDrawer\n : DrawerActions.toggleDrawer;\n drawer.dispatch?.(creator());\n}\n\n/**\n * Close twice: once now, once after the current frame. Interrupted drawer\n * animations (Canvas / video editor on top of the drawer) often leave a\n * sliver overlay that a single closeDrawer() does not clear.\n */\nexport function resetDrawerClosed(navigation: NavLike | null | undefined): void {\n dispatchDrawerAction(navigation, 'close');\n requestAnimationFrame(() => {\n dispatchDrawerAction(navigation, 'close');\n });\n}\n\n/** Navigate after RN Modal `visible` has gone false (avoids iOS overlay leaks). */\nexport function afterNativeModalClose(run: () => void): void {\n requestAnimationFrame(() => {\n setTimeout(run, 40);\n });\n}\n"],"names":[],"mappings":"qDAsBO,SAAS,qBAAqB,UAAwD,EAAA;AAtB7F,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAuBE,EAAA,IAAI,OAAsC,GAAA,UAAA;AAC1C,EAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,EAAM,IAAA,OAAA,EAAS,KAAK,CAAG,EAAA;AACzC,IAAI,IAAA,OAAO,QAAQ,UAAe,KAAA,UAAA,IAAA,CAAA,CAAc,mBAAQ,QAAR,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,OAAA,CAAA,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAsB,UAAS,QAAU,EAAA;AACvF,MAAO,OAAA,OAAA;AAAA;AAET,IAAA,OAAA,GAAA,CAAU,aAAQ,SAAR,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,OAAA,CAAA;AAAA;AAEZ,EAAO,OAAA,IAAA;AACT;AAOgB,SAAA,oBAAA,CAAqB,YAAwC,MAA4B,EAAA;AAtCzG,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAuCE,EAAM,MAAA,MAAA,GAAS,qBAAqB,UAAU,CAAA;AAI9C,EAAA,IAAI,CAAC,MAAQ,EAAA;AACb,EAAA,IAAI,MAAW,KAAA,MAAA,IAAU,OAAO,MAAA,CAAO,eAAe,UAAY,EAAA;AAChE,IAAA,MAAA,CAAO,UAAW,EAAA;AAClB,IAAA;AAAA;AAEF,EAAA,IAAI,MAAW,KAAA,OAAA,IAAW,OAAO,MAAA,CAAO,gBAAgB,UAAY,EAAA;AAClE,IAAA,MAAA,CAAO,WAAY,EAAA;AACnB,IAAA;AAAA;AAEF,EAAA,IAAI,MAAW,KAAA,QAAA,IAAY,OAAO,MAAA,CAAO,iBAAiB,UAAY,EAAA;AACpE,IAAA,MAAA,CAAO,YAAa,EAAA;AACpB,IAAA;AAAA;AAEF,EAAA,IAAA,CAAA,CAAI,EAAO,GAAA,CAAA,EAAA,GAAA,MAAA,CAAA,QAAA,KAAP,IAAqB,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,MAAA,CAAA,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,MAAS,QAAU,EAAA;AAC5C,EAAM,MAAA,OAAA,GAAU,WAAW,MAAS,GAAA,aAAA,CAAc,aAAa,MAAW,KAAA,OAAA,GAAU,aAAc,CAAA,WAAA,GAAc,aAAc,CAAA,YAAA;AAC9H,EAAO,CAAA,EAAA,GAAA,MAAA,CAAA,QAAA,KAAP,gCAAkB,OAAQ,EAAA,CAAA;AAC5B;AAOO,SAAS,kBAAkB,UAA8C,EAAA;AAC9E,EAAA,oBAAA,CAAqB,YAAY,OAAO,CAAA;AACxC,EAAA,qBAAA,CAAsB,MAAM;AAC1B,IAAA,oBAAA,CAAqB,YAAY,OAAO,CAAA;AAAA,GACzC,CAAA;AACH;AAGO,SAAS,sBAAsB,GAAuB,EAAA;AAC3D,EAAA,qBAAA,CAAsB,MAAM;AAC1B,IAAA,UAAA,CAAW,KAAK,EAAE,CAAA;AAAA,GACnB,CAAA;AACH"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adminide-stack/yantra-mobile",
3
- "version": "12.0.54-alpha.8",
3
+ "version": "12.0.55-alpha.0",
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": "12.0.54-alpha.7"
28
+ "common": "12.0.54-alpha.11"
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.54-alpha.7",
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": "5e446ef01758892cf08a97ec01270078660f5a64"
60
+ "gitHead": "e9f84ce0814f0ce532e275125a4b99ebc2021c66"
61
61
  }