@elqnt/auth 1.0.0 → 1.0.7

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/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  "use strict";
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.tsx","../context/user-context.tsx","../hooks/use-user.ts","../models/user-models.ts","../models/admin-types.ts"],"sourcesContent":["export * from \"./context\";\nexport * from \"./hooks\";\nexport * from \"./models\";\n// export * from \"./store\";\n\n// export * from \"./utils\";\n// export * from \"./client-types\";\n","\"use client\";\n\nimport { createContext, FC, ReactNode, useContext } from \"react\";\n\nimport { Team, UserResponse } from \"../models\";\nimport { useUser, UseUserType } from \"../hooks\";\n\nexport let UserContext = createContext<UseUserType>({\n user: undefined,\n isLoading: true,\n refresh: () => {},\n selectedOrgId: undefined,\n setSelectedOrgId: () => {},\n userOrgs: [],\n selectedOrg: undefined,\n isAdmin: false,\n isSuperAdmin: false,\n createUser: () => Promise.resolve({} as UserResponse),\n userInGroup: () => false,\n getUserTeam: () => Promise.resolve({} as Team),\n updateTeamOnboardingData: () => Promise.resolve(true),\n teams: [],\n selectedTeamId: undefined,\n setSelectedTeamId: () => {},\n onlineStatus: \"offline\",\n setOnlineStatus: () => {},\n});\n\ntype UserProviderProps = {\n children: ReactNode;\n email: string | undefined | null;\n};\n\nexport const UserProvider: FC<UserProviderProps> = ({ children, email }) => {\n const user = useUser(email);\n\n return <UserContext.Provider value={user}>{children}</UserContext.Provider>;\n};\n\nexport const useUserContext = () => useContext(UserContext);\n","\"use client\";\n\nimport { useNatsContext } from \"@elqnt/nats\";\nimport { useProductContext } from \"@elqnt/product\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n UpdateUserStatusRequest,\n UpdateUserStatusResponse,\n UpdateUserStatusSubject,\n UserStatusTS,\n} from \"@elqnt/types\";\nimport {\n OrgInfo,\n OrgInfoResponse,\n Team,\n User,\n UserOrgAccess,\n UserResponse,\n} from \"../models\";\n\n// Import OrgResponse from admin models for domain validation\ninterface OrgResponse {\n org: {\n id: string;\n title: string;\n mainDomain: string;\n [key: string]: any;\n };\n metadata: {\n success: boolean;\n error?: string;\n message?: string;\n };\n}\n\nexport interface UseUserType {\n user?: User;\n error?: Error;\n isLoading: boolean;\n refresh: () => void;\n selectedOrgId?: string;\n setSelectedOrgId?: (orgId: string) => void;\n userOrgs: UserOrgAccess[];\n selectedOrg?: OrgInfo;\n isAdmin: boolean;\n isSuperAdmin: boolean;\n createUser: (user: User) => Promise<UserResponse>;\n userInGroup: (group: string) => boolean;\n getUserTeam: () => Promise<Team | undefined>;\n updateTeamOnboardingData: (data: string) => Promise<Error | boolean>;\n teams: Team[];\n selectedTeamId?: string;\n setSelectedTeamId?: (id: string) => void;\n onlineStatus: UserStatusTS;\n setOnlineStatus: (status: UserStatusTS) => void;\n}\n\nexport const useUser = (\n email: string | undefined | null,\n autoLoad = true\n): UseUserType => {\n const { natsConnected, request } = useNatsContext();\n\n const [user, setUser] = useState<User | undefined>(undefined);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | undefined>(undefined);\n const [onlineStatus, setOnlineStatusLocal] = useState<UserStatusTS>(\"online\");\n const hasSetInitialStatus = useRef(false);\n\n const { product } = useProductContext();\n\n const [userOrgs, setUserOrgs] = useState<UserOrgAccess[]>([]);\n const [teams, setTeams] = useState<Team[]>([]);\n const [selectedTeamId, setSelectedTeamId] = useState<string | undefined>(\n undefined\n );\n\n const [selectedOrgId, setSelectedOrgId] = useState<string | undefined>(\n undefined\n );\n\n // Load orgId from localStorage on client side only\n useEffect(() => {\n const storedOrgId = localStorage.getItem(\"orgId\");\n if (storedOrgId) {\n setSelectedOrgId(storedOrgId);\n }\n }, []);\n\n const [selectedOrg, setSelectedOrg] = useState<OrgInfo | undefined>(\n undefined\n );\n\n const [isAdmin, setIsAdmin] = useState<boolean>(false);\n\n const [isSuperAdmin, setIsSuperAdmin] = useState<boolean>(false);\n\n // const [team, setTeam] = useState<Team | undefined>(undefined);\n\n const [userGroups, setUserGroups] = useState<string[]>([]);\n\n const getUserGroups = useCallback(async () => {\n if (!user || !selectedOrgId) return;\n const data = await request<object, { groups: string[] }>(\n \"user.groups.get\",\n {\n userId: user.id,\n },\n {\n orgId: selectedOrgId,\n }\n );\n\n if (!data || data?.groups.length === 0) {\n return;\n }\n\n // console.log(\"user groups\", data);\n\n //@ts-ignore\n setUserGroups(data.map((g) => g.toLowerCase().replaceAll(\" \", \"_\")));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user, selectedOrgId]);\n\n async function updateTeamOnboardingData(\n data: string\n ): Promise<Error | boolean> {\n if (!natsConnected) {\n console.error(\"nats not connected\");\n return new Error(\"nats not connected\");\n }\n\n if (!user) {\n console.error(\"user not defined\");\n return new Error(\"user not defined\");\n }\n\n if (!user.teamId) {\n console.error(\"teamId not defined\");\n return new Error(\"teamId not defined\");\n }\n\n const res = await request<any, any>(\n \"admin.teams.updateOnboardingData\",\n {\n data,\n teamId: user.teamId,\n },\n {\n orgId: selectedOrgId,\n product,\n }\n );\n\n if (res instanceof Error) {\n setError(res);\n setIsLoading(false);\n return res;\n }\n\n return res.success;\n }\n\n useEffect(() => {\n if (!user || !selectedOrgId) {\n return;\n }\n getUserGroups();\n }, [user, selectedOrgId, getUserGroups]);\n\n function userInGroup(group: string) {\n return userGroups.includes(group.toLowerCase().replaceAll(\" \", \"_\"));\n }\n\n useEffect(() => {\n if (!user) {\n return;\n }\n\n if (user.orgAccess && user?.orgAccess.length > 0) {\n if (selectedOrgId === undefined) {\n const orgAccess = user.orgAccess[0];\n\n //@ts-ignore\n setSelectedOrgId(orgAccess.orgId);\n setUserOrgs(user.orgAccess);\n updateAdminFlags();\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user, selectedOrgId]);\n\n const updateAdminFlags = useCallback(() => {\n const orgAccess = userOrgs.find((org) => org.orgId === selectedOrgId);\n const isAdmin = orgAccess?.roles.includes(\"admin\") ?? false;\n setIsAdmin(isAdmin);\n\n if (!isAdmin) {\n setSelectedTeamId(user?.teamId);\n }\n\n const isSuperAdmin = orgAccess?.roles.includes(\"super-admin\") ?? false;\n setIsSuperAdmin(isSuperAdmin);\n }, [userOrgs, selectedOrgId, user?.teamId]);\n\n const create = async (data: User) => {\n setIsLoading(true);\n const res = await request<User, UserResponse>(\"admin.users.create\", data, {\n product,\n });\n setIsLoading(false);\n\n if (res instanceof Error) {\n setError(res);\n return res;\n }\n\n return res;\n };\n\n const getUser = useCallback(async () => {\n if (!natsConnected || !email || !product) {\n console.log(\"will not get user\", natsConnected, email, product);\n return;\n }\n\n console.log(\"will get user\", email, product);\n\n setIsLoading(true);\n const data = await request<object, UserResponse>(\n \"admin.users.getOneByEmail\",\n {\n email,\n },\n {\n product,\n }\n );\n\n if (data.metadata.success) {\n setUser(data.user);\n } else {\n // User not found in DB - try domain validation for AD users\n console.log(\"User not found in DB, attempting domain validation\");\n\n // Extract domain from email\n const emailDomain = email.split(\"@\")[1];\n\n if (emailDomain) {\n try {\n const orgResponse = await request<{ domain: string }, OrgResponse>(\n \"admin.orgs.getByDomain\",\n { domain: emailDomain },\n { product }\n );\n\n if (orgResponse.metadata?.success && orgResponse.org) {\n console.log(\"Found org by domain, creating virtual user\", orgResponse.org);\n\n // Create virtual user with org access\n const virtualUser: User = {\n email,\n firstName: email.split(\"@\")[0], // Use email prefix as first name\n lastName: \"\",\n authProviderName: \"azure\",\n orgAccess: [\n {\n orgId: orgResponse.org.id,\n orgTitle: orgResponse.org.title,\n roles: [\"user\"], // Default role for AD users\n isSingleAccount: true,\n },\n ],\n isSysAdmin: false,\n };\n\n setUser(virtualUser);\n setIsLoading(false);\n return;\n }\n } catch (domainError) {\n console.log(\"Domain validation failed\", domainError);\n }\n }\n\n // If domain validation fails, set original error\n setError(new Error(\"User not found\"));\n }\n\n setIsLoading(false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [natsConnected, email, product]);\n\n const getSelectedOrg = useCallback(async () => {\n if (!selectedOrgId || !natsConnected) return;\n\n const res = await request<object, OrgInfoResponse>(\n \"admin.orgs.getInfo\",\n {\n id: selectedOrgId,\n },\n {\n product,\n }\n );\n\n setSelectedOrg(res.orgInfo);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedOrgId, product, natsConnected]);\n\n useEffect(() => {\n if (!selectedOrgId || !natsConnected) {\n return;\n }\n\n getSelectedOrg();\n updateAdminFlags();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedOrgId, natsConnected]);\n\n useEffect(() => {\n if (natsConnected && autoLoad && email) {\n getUser();\n }\n }, [natsConnected, autoLoad, email]);\n\n // Automatically set online status when user loads (removed due to infinite loop issues)\n // Users can manually set their status via the dropdown menu\n\n // Persist user status to backend\n const setOnlineStatus = useCallback(\n async (status: UserStatusTS) => {\n // Update local state immediately for responsiveness\n setOnlineStatusLocal(status);\n\n // Early returns\n if (!natsConnected) {\n console.log(\"NATS not connected, cannot update user status\");\n return;\n }\n\n if (!user) {\n console.log(\"User not available, cannot update user status\");\n return;\n }\n\n if (!selectedOrgId) {\n console.log(\"Org ID not selected, cannot update user status\");\n return;\n }\n\n // Persist to backend\n try {\n const response = await request<\n UpdateUserStatusRequest,\n UpdateUserStatusResponse\n >(UpdateUserStatusSubject, {\n orgId: selectedOrgId,\n userId: user.id || user.email,\n status: status,\n });\n\n if (!response.metadata.success) {\n console.error(\"Failed to update user status:\", response.metadata.error);\n // Optionally revert local state on failure\n // setOnlineStatusLocal(previousStatus);\n } else {\n console.log(\"User status updated successfully:\", status);\n }\n } catch (error) {\n console.error(\"Error updating user status:\", error);\n // Optionally revert local state on error\n // setOnlineStatusLocal(previousStatus);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [natsConnected, user, selectedOrgId]\n );\n\n return {\n user,\n error,\n isLoading,\n refresh: getUser,\n selectedOrg,\n selectedOrgId,\n setSelectedOrgId,\n userOrgs,\n isAdmin,\n isSuperAdmin,\n createUser: create,\n userInGroup,\n getUserTeam: () => Promise.resolve({} as Team),\n updateTeamOnboardingData,\n teams,\n selectedTeamId,\n setSelectedTeamId,\n onlineStatus,\n setOnlineStatus,\n };\n};\n","// Code generated by tygo. DO NOT EDIT.\n\n//////////\n// source: user.go\n\nexport type WidgetType = string;\nexport const WidgetTypeCalendar: WidgetType = \"calendar\";\nexport const WidgetTypeActivities: WidgetType = \"activities\";\nexport const WidgetTypeEmail: WidgetType = \"email\";\nexport const WidgetTypeTasks: WidgetType = \"tasks\";\nexport const WidgetTypeNotes: WidgetType = \"notes\";\nexport const WidgetTypeFiles: WidgetType = \"files\";\nexport const WidgetTypeContacts: WidgetType = \"contacts\";\nexport const WidgetTypeAccounts: WidgetType = \"accounts\";\nexport const WidgetTypeLeads: WidgetType = \"leads\";\nexport const WidgetTypeOpportunities: WidgetType = \"opportunities\";\nexport const WidgetTypeChart: WidgetType = \"chart\";\nexport const WidgetTypeOrders: WidgetType = \"orders\";\nexport interface Widget {\n id?: string /* ObjectID */;\n userId: string;\n title: string;\n subTitle?: string;\n type: WidgetType;\n chartSettings?: ChartSettings;\n slotIndex: number /* int */;\n}\nexport type ChartType = string;\nexport const ChartTypeBar: ChartType = \"Bar chart\";\nexport const ChartTypeLine: ChartType = \"Line chart\";\nexport const ChartTypePie: ChartType = \"Pie chart\";\nexport const ChartTypeDoughnut: ChartType = \"Doughnut chart\";\nexport const ChartTypeMetic: ChartType = \"Metric\";\nexport type AggregateType = string;\nexport const AggregateTypeSum: AggregateType = \"Sum\";\nexport const AggregateTypeCount: AggregateType = \"Count\";\nexport const AggregateTypeAverage: AggregateType = \"Average\";\nexport const AggregateTypeMin: AggregateType = \"Min\";\nexport const AggregateTypeMax: AggregateType = \"Max\";\nexport const AggregateTypeDistinct: AggregateType = \"Distinct\";\nexport interface MetricResult {\n aggregateType: AggregateType;\n value: any;\n compareAggregateType: AggregateType;\n compareValue: any;\n}\nexport interface DateValue {\n date: string;\n value: number /* float64 */;\n}\nexport interface ChartSettings {\n chartType: ChartType;\n aggregateType: AggregateType;\n tableName: string;\n groupByFieldName: string;\n valueFieldName: string;\n filterFieldName: string;\n filterFieldValue: string;\n enableCompare: boolean;\n compareTitle: string;\n compareAggregateType: AggregateType;\n compareTableName: string;\n compareValueFieldName: string;\n compareFilterFieldName: string;\n compareFilterFieldValue: string;\n}\n","// Types from admin package needed by auth\nexport interface ResponseMetadata {\n success: boolean;\n timestamp: string /* RFC3339 */;\n message?: string;\n error?: string;\n}\n\nexport interface UserOrgAccess {\n orgId: string /* ObjectID */;\n orgTitle: string;\n roles: string[];\n isSingleAccount: boolean;\n entityRecordFilter?: any /* entities.EntityRecordLookup */;\n}\n\n// UserSettings represents user preferences (elastic JSON structure)\nexport interface UserSettings {\n theme?: string; // \"system\" | \"light\" | \"dark\"\n language?: string; // \"auto\" | \"en\" | \"ar\" | etc.\n timezone?: string; // \"auto\" | \"America/New_York\" | etc.\n occupation?: string; // User's occupation/role\n company?: string; // User's company/organization\n}\n\n// NotificationPreferences represents user notification settings\nexport interface NotificationPreferences {\n pushEnabled: boolean;\n newChatAssignment: boolean;\n newMessages: boolean;\n escalations: boolean;\n urgentOnly: boolean;\n soundEnabled: boolean;\n doNotDisturb: boolean;\n dndStart?: string; // \"22:00\" format\n dndEnd?: string; // \"08:00\" format\n}\n\nexport interface User {\n id?: string /* ObjectID */;\n email: string;\n firstName: string;\n lastName: string;\n authProviderName: string;\n orgAccess: UserOrgAccess[];\n settings?: UserSettings;\n notificationPreferences?: NotificationPreferences;\n createdAt?: number /* int64 */;\n updatedAt?: number /* int64 */;\n createdBy?: string;\n updatedBy?: string;\n isTeamAdmin?: boolean;\n teamId?: string;\n teamName?: string;\n isSysAdmin?: boolean;\n}\n\nexport interface UserResponse {\n user: User;\n metadata: ResponseMetadata;\n}\n\n// Request/Response for settings operations\nexport interface UpdateUserSettingsRequest {\n id: string;\n settings?: UserSettings;\n notificationPreferences?: NotificationPreferences;\n}\n\nexport interface UserSettingsResponse {\n settings?: UserSettings;\n notificationPreferences?: NotificationPreferences;\n metadata: ResponseMetadata;\n}\n\nexport interface Team {\n id?: string /* ObjectID */;\n name: string;\n isSubscribed: boolean;\n subscribedAt: number /* int64 */;\n plan: string;\n ownerName: string;\n ownerEmail: string;\n subscriptionPlatform: SubscriptionPlatform;\n subscriptionId: string;\n onboardingDone: boolean;\n onboardingData: string;\n}\n\nexport type SubscriptionPlatform = string;\nexport const SubscriptionPlatformStripe: SubscriptionPlatform = \"stripe\";\nexport const SubscriptionPlatformCustom: SubscriptionPlatform = \"custom\";\n\nexport interface OrgInfo {\n id?: string;\n title: string;\n logoUrl: string;\n mainDomain?: string;\n apps: any[];\n}\n\nexport interface OrgInfoResponse {\n orgInfo: OrgInfo;\n metadata: ResponseMetadata;\n}"],"mappings":"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","names":["import_react","isAdmin","isSuperAdmin","error"]}
1
+ {"version":3,"sources":["../index.tsx","../context/user-context.tsx","../hooks/use-user.ts","../models/user-models.ts","../models/admin-types.ts"],"sourcesContent":["export * from \"./context\";\nexport * from \"./hooks\";\nexport * from \"./models\";\n// export * from \"./store\";\n\n// export * from \"./utils\";\n// export * from \"./client-types\";\n","\"use client\";\n\nimport { createContext, FC, ReactNode, useContext } from \"react\";\n\nimport { Team, UserResponse } from \"../models\";\nimport { useUser, UseUserType } from \"../hooks\";\n\nexport let UserContext = createContext<UseUserType>({\n user: undefined,\n isLoading: true,\n refresh: () => {},\n selectedOrgId: undefined,\n setSelectedOrgId: () => {},\n userOrgs: [],\n selectedOrg: undefined,\n isAdmin: false,\n isSuperAdmin: false,\n createUser: () => Promise.resolve({} as UserResponse),\n userInGroup: () => false,\n getUserTeam: () => Promise.resolve({} as Team),\n updateTeamOnboardingData: () => Promise.resolve(true),\n teams: [],\n selectedTeamId: undefined,\n setSelectedTeamId: () => {},\n onlineStatus: \"offline\",\n setOnlineStatus: () => {},\n});\n\ntype UserProviderProps = {\n children: ReactNode;\n email: string | undefined | null;\n};\n\nexport const UserProvider: FC<UserProviderProps> = ({ children, email }) => {\n const user = useUser(email);\n\n return <UserContext.Provider value={user}>{children}</UserContext.Provider>;\n};\n\nexport const useUserContext = () => useContext(UserContext);\n","\"use client\";\n\nimport { useNatsContext } from \"@elqnt/nats\";\nimport { useProductContext } from \"@elqnt/product\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n UpdateUserStatusRequest,\n UpdateUserStatusResponse,\n UpdateUserStatusSubject,\n UserStatusTS,\n} from \"@elqnt/types\";\nimport {\n OrgInfo,\n OrgInfoResponse,\n Team,\n User,\n UserOrgAccess,\n UserResponse,\n} from \"../models\";\n\n// Import OrgResponse from admin models for domain validation\ninterface OrgResponse {\n org: {\n id: string;\n title: string;\n mainDomain: string;\n [key: string]: any;\n };\n metadata: {\n success: boolean;\n error?: string;\n message?: string;\n };\n}\n\nexport interface UseUserType {\n user?: User;\n error?: Error;\n isLoading: boolean;\n refresh: () => void;\n selectedOrgId?: string;\n setSelectedOrgId?: (orgId: string) => void;\n userOrgs: UserOrgAccess[];\n selectedOrg?: OrgInfo;\n isAdmin: boolean;\n isSuperAdmin: boolean;\n createUser: (user: User) => Promise<UserResponse>;\n userInGroup: (group: string) => boolean;\n getUserTeam: () => Promise<Team | undefined>;\n updateTeamOnboardingData: (data: string) => Promise<Error | boolean>;\n teams: Team[];\n selectedTeamId?: string;\n setSelectedTeamId?: (id: string) => void;\n onlineStatus: UserStatusTS;\n setOnlineStatus: (status: UserStatusTS) => void;\n}\n\nexport const useUser = (\n email: string | undefined | null,\n autoLoad = true\n): UseUserType => {\n const { natsConnected, request } = useNatsContext();\n\n const [user, setUser] = useState<User | undefined>(undefined);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | undefined>(undefined);\n const [onlineStatus, setOnlineStatusLocal] = useState<UserStatusTS>(\"online\");\n const hasSetInitialStatus = useRef(false);\n\n const { product } = useProductContext();\n\n const [userOrgs, setUserOrgs] = useState<UserOrgAccess[]>([]);\n const [teams, setTeams] = useState<Team[]>([]);\n const [selectedTeamId, setSelectedTeamId] = useState<string | undefined>(\n undefined\n );\n\n const [selectedOrgId, setSelectedOrgId] = useState<string | undefined>(\n undefined\n );\n\n // Load orgId from localStorage on client side only\n useEffect(() => {\n const storedOrgId = localStorage.getItem(\"orgId\");\n if (storedOrgId) {\n setSelectedOrgId(storedOrgId);\n }\n }, []);\n\n const [selectedOrg, setSelectedOrg] = useState<OrgInfo | undefined>(\n undefined\n );\n\n const [isAdmin, setIsAdmin] = useState<boolean>(false);\n\n const [isSuperAdmin, setIsSuperAdmin] = useState<boolean>(false);\n\n // const [team, setTeam] = useState<Team | undefined>(undefined);\n\n const [userGroups, setUserGroups] = useState<string[]>([]);\n\n const getUserGroups = useCallback(async () => {\n if (!user || !selectedOrgId) return;\n const data = await request<object, { groups: string[] }>(\n \"user.groups.get\",\n {\n userId: user.id,\n },\n {\n orgId: selectedOrgId,\n }\n );\n\n if (!data || data?.groups.length === 0) {\n return;\n }\n\n // console.log(\"user groups\", data);\n\n //@ts-ignore\n setUserGroups(data.map((g) => g.toLowerCase().replaceAll(\" \", \"_\")));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user, selectedOrgId]);\n\n async function updateTeamOnboardingData(\n data: string\n ): Promise<Error | boolean> {\n if (!natsConnected) {\n console.error(\"nats not connected\");\n return new Error(\"nats not connected\");\n }\n\n if (!user) {\n console.error(\"user not defined\");\n return new Error(\"user not defined\");\n }\n\n if (!user.teamId) {\n console.error(\"teamId not defined\");\n return new Error(\"teamId not defined\");\n }\n\n const res = await request<any, any>(\n \"admin.teams.updateOnboardingData\",\n {\n data,\n teamId: user.teamId,\n },\n {\n orgId: selectedOrgId,\n product,\n }\n );\n\n if (res instanceof Error) {\n setError(res);\n setIsLoading(false);\n return res;\n }\n\n return res.success;\n }\n\n useEffect(() => {\n if (!user || !selectedOrgId) {\n return;\n }\n getUserGroups();\n }, [user, selectedOrgId, getUserGroups]);\n\n function userInGroup(group: string) {\n return userGroups.includes(group.toLowerCase().replaceAll(\" \", \"_\"));\n }\n\n useEffect(() => {\n if (!user) {\n return;\n }\n\n if (user.orgAccess && user?.orgAccess.length > 0) {\n if (selectedOrgId === undefined) {\n const orgAccess = user.orgAccess[0];\n\n //@ts-ignore\n setSelectedOrgId(orgAccess.orgId);\n setUserOrgs(user.orgAccess);\n updateAdminFlags();\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user, selectedOrgId]);\n\n const updateAdminFlags = useCallback(() => {\n const orgAccess = userOrgs.find((org) => org.orgId === selectedOrgId);\n const isAdmin = orgAccess?.roles.includes(\"admin\") ?? false;\n setIsAdmin(isAdmin);\n\n if (!isAdmin) {\n setSelectedTeamId(user?.teamId);\n }\n\n const isSuperAdmin = orgAccess?.roles.includes(\"super-admin\") ?? false;\n setIsSuperAdmin(isSuperAdmin);\n }, [userOrgs, selectedOrgId, user?.teamId]);\n\n const create = async (data: User) => {\n setIsLoading(true);\n const res = await request<User, UserResponse>(\"admin.users.create\", data, {\n product,\n });\n setIsLoading(false);\n\n if (res instanceof Error) {\n setError(res);\n return res;\n }\n\n return res;\n };\n\n const getUser = useCallback(async () => {\n if (!natsConnected || !email || !product) {\n console.log(\"will not get user\", natsConnected, email, product);\n return;\n }\n\n console.log(\"will get user\", email, product);\n\n setIsLoading(true);\n const data = await request<object, UserResponse>(\n \"admin.users.getOneByEmail\",\n {\n email,\n },\n {\n product,\n }\n );\n\n if (data.metadata.success) {\n setUser(data.user);\n } else {\n // User not found in DB - try domain validation for AD users\n console.log(\"User not found in DB, attempting domain validation\");\n\n // Extract domain from email\n const emailDomain = email.split(\"@\")[1];\n\n if (emailDomain) {\n try {\n const orgResponse = await request<{ domain: string }, OrgResponse>(\n \"admin.orgs.getByDomain\",\n { domain: emailDomain },\n { product }\n );\n\n if (orgResponse.metadata?.success && orgResponse.org) {\n console.log(\"Found org by domain, creating virtual user\", orgResponse.org);\n\n // Create virtual user with org access\n const virtualUser: User = {\n email,\n firstName: email.split(\"@\")[0], // Use email prefix as first name\n lastName: \"\",\n authProviderName: \"azure\",\n orgAccess: [\n {\n orgId: orgResponse.org.id,\n orgTitle: orgResponse.org.title,\n roles: [\"user\"], // Default role for AD users\n isSingleAccount: true,\n },\n ],\n isSysAdmin: false,\n };\n\n setUser(virtualUser);\n setIsLoading(false);\n return;\n }\n } catch (domainError) {\n console.log(\"Domain validation failed\", domainError);\n }\n }\n\n // If domain validation fails, set original error\n setError(new Error(\"User not found\"));\n }\n\n setIsLoading(false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [natsConnected, email, product]);\n\n const getSelectedOrg = useCallback(async () => {\n if (!selectedOrgId || !natsConnected) return;\n\n const res = await request<object, OrgInfoResponse>(\n \"admin.orgs.getInfo\",\n {\n id: selectedOrgId,\n },\n {\n product,\n }\n );\n\n setSelectedOrg(res.orgInfo);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedOrgId, product, natsConnected]);\n\n useEffect(() => {\n if (!selectedOrgId || !natsConnected) {\n return;\n }\n\n getSelectedOrg();\n updateAdminFlags();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedOrgId, natsConnected]);\n\n useEffect(() => {\n if (natsConnected && autoLoad && email) {\n getUser();\n }\n }, [natsConnected, autoLoad, email]);\n\n // Automatically set online status when user loads (removed due to infinite loop issues)\n // Users can manually set their status via the dropdown menu\n\n // Persist user status to backend\n const setOnlineStatus = useCallback(\n async (status: UserStatusTS) => {\n // Update local state immediately for responsiveness\n setOnlineStatusLocal(status);\n\n // Early returns\n if (!natsConnected) {\n console.log(\"NATS not connected, cannot update user status\");\n return;\n }\n\n if (!user) {\n console.log(\"User not available, cannot update user status\");\n return;\n }\n\n if (!selectedOrgId) {\n console.log(\"Org ID not selected, cannot update user status\");\n return;\n }\n\n // Persist to backend\n try {\n const response = await request<\n UpdateUserStatusRequest,\n UpdateUserStatusResponse\n >(UpdateUserStatusSubject, {\n orgId: selectedOrgId,\n userId: user.id || user.email,\n status: status,\n });\n\n if (!response.metadata.success) {\n console.error(\"Failed to update user status:\", response.metadata.error);\n // Optionally revert local state on failure\n // setOnlineStatusLocal(previousStatus);\n } else {\n console.log(\"User status updated successfully:\", status);\n }\n } catch (error) {\n console.error(\"Error updating user status:\", error);\n // Optionally revert local state on error\n // setOnlineStatusLocal(previousStatus);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [natsConnected, user, selectedOrgId]\n );\n\n return {\n user,\n error,\n isLoading,\n refresh: getUser,\n selectedOrg,\n selectedOrgId,\n setSelectedOrgId,\n userOrgs,\n isAdmin,\n isSuperAdmin,\n createUser: create,\n userInGroup,\n getUserTeam: () => Promise.resolve({} as Team),\n updateTeamOnboardingData,\n teams,\n selectedTeamId,\n setSelectedTeamId,\n onlineStatus,\n setOnlineStatus,\n };\n};\n","// Code generated by tygo. DO NOT EDIT.\n\n//////////\n// source: user.go\n\nexport type WidgetType = string;\nexport const WidgetTypeCalendar: WidgetType = \"calendar\";\nexport const WidgetTypeActivities: WidgetType = \"activities\";\nexport const WidgetTypeEmail: WidgetType = \"email\";\nexport const WidgetTypeTasks: WidgetType = \"tasks\";\nexport const WidgetTypeNotes: WidgetType = \"notes\";\nexport const WidgetTypeFiles: WidgetType = \"files\";\nexport const WidgetTypeContacts: WidgetType = \"contacts\";\nexport const WidgetTypeAccounts: WidgetType = \"accounts\";\nexport const WidgetTypeLeads: WidgetType = \"leads\";\nexport const WidgetTypeOpportunities: WidgetType = \"opportunities\";\nexport const WidgetTypeChart: WidgetType = \"chart\";\nexport const WidgetTypeOrders: WidgetType = \"orders\";\nexport interface Widget {\n id?: string /* ObjectID */;\n userId: string;\n title: string;\n subTitle?: string;\n type: WidgetType;\n chartSettings?: ChartSettings;\n slotIndex: number /* int */;\n}\nexport type ChartType = string;\nexport const ChartTypeBar: ChartType = \"Bar chart\";\nexport const ChartTypeLine: ChartType = \"Line chart\";\nexport const ChartTypePie: ChartType = \"Pie chart\";\nexport const ChartTypeDoughnut: ChartType = \"Doughnut chart\";\nexport const ChartTypeMetic: ChartType = \"Metric\";\nexport type AggregateType = string;\nexport const AggregateTypeSum: AggregateType = \"Sum\";\nexport const AggregateTypeCount: AggregateType = \"Count\";\nexport const AggregateTypeAverage: AggregateType = \"Average\";\nexport const AggregateTypeMin: AggregateType = \"Min\";\nexport const AggregateTypeMax: AggregateType = \"Max\";\nexport const AggregateTypeDistinct: AggregateType = \"Distinct\";\nexport interface MetricResult {\n aggregateType: AggregateType;\n value: any;\n compareAggregateType: AggregateType;\n compareValue: any;\n}\nexport interface DateValue {\n date: string;\n value: number /* float64 */;\n}\nexport interface ChartSettings {\n chartType: ChartType;\n aggregateType: AggregateType;\n tableName: string;\n groupByFieldName: string;\n valueFieldName: string;\n filterFieldName: string;\n filterFieldValue: string;\n enableCompare: boolean;\n compareTitle: string;\n compareAggregateType: AggregateType;\n compareTableName: string;\n compareValueFieldName: string;\n compareFilterFieldName: string;\n compareFilterFieldValue: string;\n}\n","// Types from admin package needed by auth\nexport interface ResponseMetadata {\n success: boolean;\n timestamp: string /* RFC3339 */;\n message?: string;\n error?: string;\n}\n\nexport interface UserOrgAccess {\n orgId: string /* ObjectID */;\n orgTitle: string;\n roles: string[];\n isSingleAccount: boolean;\n entityRecordFilter?: any /* entities.EntityRecordLookup */;\n}\n\n// UserSettings represents user preferences (elastic JSON structure)\nexport interface UserSettings {\n theme?: string; // \"system\" | \"light\" | \"dark\"\n language?: string; // \"auto\" | \"en\" | \"ar\" | etc.\n timezone?: string; // \"auto\" | \"America/New_York\" | etc.\n occupation?: string; // User's occupation/role\n company?: string; // User's company/organization\n}\n\n// NotificationPreferences represents user notification settings\nexport interface NotificationPreferences {\n pushEnabled: boolean;\n newChatAssignment: boolean;\n newMessages: boolean;\n escalations: boolean;\n urgentOnly: boolean;\n soundEnabled: boolean;\n doNotDisturb: boolean;\n dndStart?: string; // \"22:00\" format\n dndEnd?: string; // \"08:00\" format\n}\n\nexport interface User {\n id?: string /* ObjectID */;\n email: string;\n firstName: string;\n lastName: string;\n authProviderName: string;\n orgAccess: UserOrgAccess[];\n settings?: UserSettings;\n notificationPreferences?: NotificationPreferences;\n createdAt?: number /* int64 */;\n updatedAt?: number /* int64 */;\n createdBy?: string;\n updatedBy?: string;\n isTeamAdmin?: boolean;\n teamId?: string;\n teamName?: string;\n isSysAdmin?: boolean;\n}\n\nexport interface UserResponse {\n user: User;\n metadata: ResponseMetadata;\n}\n\n// Request/Response for settings operations\nexport interface UpdateUserSettingsRequest {\n id: string;\n settings?: UserSettings;\n notificationPreferences?: NotificationPreferences;\n}\n\nexport interface UserSettingsResponse {\n settings?: UserSettings;\n notificationPreferences?: NotificationPreferences;\n metadata: ResponseMetadata;\n}\n\nexport interface Team {\n id?: string /* ObjectID */;\n name: string;\n isSubscribed: boolean;\n subscribedAt: number /* int64 */;\n plan: string;\n ownerName: string;\n ownerEmail: string;\n subscriptionPlatform: SubscriptionPlatform;\n subscriptionId: string;\n onboardingDone: boolean;\n onboardingData: string;\n}\n\nexport type SubscriptionPlatform = string;\nexport const SubscriptionPlatformStripe: SubscriptionPlatform = \"stripe\";\nexport const SubscriptionPlatformCustom: SubscriptionPlatform = \"custom\";\n\nexport interface OrgInfo {\n id?: string;\n title: string;\n logoUrl: string;\n mainDomain?: string;\n apps: any[];\n}\n\nexport interface OrgInfoResponse {\n orgInfo: OrgInfo;\n metadata: ResponseMetadata;\n}"],"mappings":"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","names":["import_react","isAdmin","isSuperAdmin","error"]}
package/dist/index.mjs CHANGED
@@ -1,3 +1,5 @@
1
+ "use client";
2
+
1
3
  // context/user-context.tsx
2
4
  import { createContext, useContext } from "react";
3
5
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../context/user-context.tsx","../hooks/use-user.ts","../models/user-models.ts","../models/admin-types.ts"],"sourcesContent":["\"use client\";\n\nimport { createContext, FC, ReactNode, useContext } from \"react\";\n\nimport { Team, UserResponse } from \"../models\";\nimport { useUser, UseUserType } from \"../hooks\";\n\nexport let UserContext = createContext<UseUserType>({\n user: undefined,\n isLoading: true,\n refresh: () => {},\n selectedOrgId: undefined,\n setSelectedOrgId: () => {},\n userOrgs: [],\n selectedOrg: undefined,\n isAdmin: false,\n isSuperAdmin: false,\n createUser: () => Promise.resolve({} as UserResponse),\n userInGroup: () => false,\n getUserTeam: () => Promise.resolve({} as Team),\n updateTeamOnboardingData: () => Promise.resolve(true),\n teams: [],\n selectedTeamId: undefined,\n setSelectedTeamId: () => {},\n onlineStatus: \"offline\",\n setOnlineStatus: () => {},\n});\n\ntype UserProviderProps = {\n children: ReactNode;\n email: string | undefined | null;\n};\n\nexport const UserProvider: FC<UserProviderProps> = ({ children, email }) => {\n const user = useUser(email);\n\n return <UserContext.Provider value={user}>{children}</UserContext.Provider>;\n};\n\nexport const useUserContext = () => useContext(UserContext);\n","\"use client\";\n\nimport { useNatsContext } from \"@elqnt/nats\";\nimport { useProductContext } from \"@elqnt/product\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n UpdateUserStatusRequest,\n UpdateUserStatusResponse,\n UpdateUserStatusSubject,\n UserStatusTS,\n} from \"@elqnt/types\";\nimport {\n OrgInfo,\n OrgInfoResponse,\n Team,\n User,\n UserOrgAccess,\n UserResponse,\n} from \"../models\";\n\n// Import OrgResponse from admin models for domain validation\ninterface OrgResponse {\n org: {\n id: string;\n title: string;\n mainDomain: string;\n [key: string]: any;\n };\n metadata: {\n success: boolean;\n error?: string;\n message?: string;\n };\n}\n\nexport interface UseUserType {\n user?: User;\n error?: Error;\n isLoading: boolean;\n refresh: () => void;\n selectedOrgId?: string;\n setSelectedOrgId?: (orgId: string) => void;\n userOrgs: UserOrgAccess[];\n selectedOrg?: OrgInfo;\n isAdmin: boolean;\n isSuperAdmin: boolean;\n createUser: (user: User) => Promise<UserResponse>;\n userInGroup: (group: string) => boolean;\n getUserTeam: () => Promise<Team | undefined>;\n updateTeamOnboardingData: (data: string) => Promise<Error | boolean>;\n teams: Team[];\n selectedTeamId?: string;\n setSelectedTeamId?: (id: string) => void;\n onlineStatus: UserStatusTS;\n setOnlineStatus: (status: UserStatusTS) => void;\n}\n\nexport const useUser = (\n email: string | undefined | null,\n autoLoad = true\n): UseUserType => {\n const { natsConnected, request } = useNatsContext();\n\n const [user, setUser] = useState<User | undefined>(undefined);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | undefined>(undefined);\n const [onlineStatus, setOnlineStatusLocal] = useState<UserStatusTS>(\"online\");\n const hasSetInitialStatus = useRef(false);\n\n const { product } = useProductContext();\n\n const [userOrgs, setUserOrgs] = useState<UserOrgAccess[]>([]);\n const [teams, setTeams] = useState<Team[]>([]);\n const [selectedTeamId, setSelectedTeamId] = useState<string | undefined>(\n undefined\n );\n\n const [selectedOrgId, setSelectedOrgId] = useState<string | undefined>(\n undefined\n );\n\n // Load orgId from localStorage on client side only\n useEffect(() => {\n const storedOrgId = localStorage.getItem(\"orgId\");\n if (storedOrgId) {\n setSelectedOrgId(storedOrgId);\n }\n }, []);\n\n const [selectedOrg, setSelectedOrg] = useState<OrgInfo | undefined>(\n undefined\n );\n\n const [isAdmin, setIsAdmin] = useState<boolean>(false);\n\n const [isSuperAdmin, setIsSuperAdmin] = useState<boolean>(false);\n\n // const [team, setTeam] = useState<Team | undefined>(undefined);\n\n const [userGroups, setUserGroups] = useState<string[]>([]);\n\n const getUserGroups = useCallback(async () => {\n if (!user || !selectedOrgId) return;\n const data = await request<object, { groups: string[] }>(\n \"user.groups.get\",\n {\n userId: user.id,\n },\n {\n orgId: selectedOrgId,\n }\n );\n\n if (!data || data?.groups.length === 0) {\n return;\n }\n\n // console.log(\"user groups\", data);\n\n //@ts-ignore\n setUserGroups(data.map((g) => g.toLowerCase().replaceAll(\" \", \"_\")));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user, selectedOrgId]);\n\n async function updateTeamOnboardingData(\n data: string\n ): Promise<Error | boolean> {\n if (!natsConnected) {\n console.error(\"nats not connected\");\n return new Error(\"nats not connected\");\n }\n\n if (!user) {\n console.error(\"user not defined\");\n return new Error(\"user not defined\");\n }\n\n if (!user.teamId) {\n console.error(\"teamId not defined\");\n return new Error(\"teamId not defined\");\n }\n\n const res = await request<any, any>(\n \"admin.teams.updateOnboardingData\",\n {\n data,\n teamId: user.teamId,\n },\n {\n orgId: selectedOrgId,\n product,\n }\n );\n\n if (res instanceof Error) {\n setError(res);\n setIsLoading(false);\n return res;\n }\n\n return res.success;\n }\n\n useEffect(() => {\n if (!user || !selectedOrgId) {\n return;\n }\n getUserGroups();\n }, [user, selectedOrgId, getUserGroups]);\n\n function userInGroup(group: string) {\n return userGroups.includes(group.toLowerCase().replaceAll(\" \", \"_\"));\n }\n\n useEffect(() => {\n if (!user) {\n return;\n }\n\n if (user.orgAccess && user?.orgAccess.length > 0) {\n if (selectedOrgId === undefined) {\n const orgAccess = user.orgAccess[0];\n\n //@ts-ignore\n setSelectedOrgId(orgAccess.orgId);\n setUserOrgs(user.orgAccess);\n updateAdminFlags();\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user, selectedOrgId]);\n\n const updateAdminFlags = useCallback(() => {\n const orgAccess = userOrgs.find((org) => org.orgId === selectedOrgId);\n const isAdmin = orgAccess?.roles.includes(\"admin\") ?? false;\n setIsAdmin(isAdmin);\n\n if (!isAdmin) {\n setSelectedTeamId(user?.teamId);\n }\n\n const isSuperAdmin = orgAccess?.roles.includes(\"super-admin\") ?? false;\n setIsSuperAdmin(isSuperAdmin);\n }, [userOrgs, selectedOrgId, user?.teamId]);\n\n const create = async (data: User) => {\n setIsLoading(true);\n const res = await request<User, UserResponse>(\"admin.users.create\", data, {\n product,\n });\n setIsLoading(false);\n\n if (res instanceof Error) {\n setError(res);\n return res;\n }\n\n return res;\n };\n\n const getUser = useCallback(async () => {\n if (!natsConnected || !email || !product) {\n console.log(\"will not get user\", natsConnected, email, product);\n return;\n }\n\n console.log(\"will get user\", email, product);\n\n setIsLoading(true);\n const data = await request<object, UserResponse>(\n \"admin.users.getOneByEmail\",\n {\n email,\n },\n {\n product,\n }\n );\n\n if (data.metadata.success) {\n setUser(data.user);\n } else {\n // User not found in DB - try domain validation for AD users\n console.log(\"User not found in DB, attempting domain validation\");\n\n // Extract domain from email\n const emailDomain = email.split(\"@\")[1];\n\n if (emailDomain) {\n try {\n const orgResponse = await request<{ domain: string }, OrgResponse>(\n \"admin.orgs.getByDomain\",\n { domain: emailDomain },\n { product }\n );\n\n if (orgResponse.metadata?.success && orgResponse.org) {\n console.log(\"Found org by domain, creating virtual user\", orgResponse.org);\n\n // Create virtual user with org access\n const virtualUser: User = {\n email,\n firstName: email.split(\"@\")[0], // Use email prefix as first name\n lastName: \"\",\n authProviderName: \"azure\",\n orgAccess: [\n {\n orgId: orgResponse.org.id,\n orgTitle: orgResponse.org.title,\n roles: [\"user\"], // Default role for AD users\n isSingleAccount: true,\n },\n ],\n isSysAdmin: false,\n };\n\n setUser(virtualUser);\n setIsLoading(false);\n return;\n }\n } catch (domainError) {\n console.log(\"Domain validation failed\", domainError);\n }\n }\n\n // If domain validation fails, set original error\n setError(new Error(\"User not found\"));\n }\n\n setIsLoading(false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [natsConnected, email, product]);\n\n const getSelectedOrg = useCallback(async () => {\n if (!selectedOrgId || !natsConnected) return;\n\n const res = await request<object, OrgInfoResponse>(\n \"admin.orgs.getInfo\",\n {\n id: selectedOrgId,\n },\n {\n product,\n }\n );\n\n setSelectedOrg(res.orgInfo);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedOrgId, product, natsConnected]);\n\n useEffect(() => {\n if (!selectedOrgId || !natsConnected) {\n return;\n }\n\n getSelectedOrg();\n updateAdminFlags();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedOrgId, natsConnected]);\n\n useEffect(() => {\n if (natsConnected && autoLoad && email) {\n getUser();\n }\n }, [natsConnected, autoLoad, email]);\n\n // Automatically set online status when user loads (removed due to infinite loop issues)\n // Users can manually set their status via the dropdown menu\n\n // Persist user status to backend\n const setOnlineStatus = useCallback(\n async (status: UserStatusTS) => {\n // Update local state immediately for responsiveness\n setOnlineStatusLocal(status);\n\n // Early returns\n if (!natsConnected) {\n console.log(\"NATS not connected, cannot update user status\");\n return;\n }\n\n if (!user) {\n console.log(\"User not available, cannot update user status\");\n return;\n }\n\n if (!selectedOrgId) {\n console.log(\"Org ID not selected, cannot update user status\");\n return;\n }\n\n // Persist to backend\n try {\n const response = await request<\n UpdateUserStatusRequest,\n UpdateUserStatusResponse\n >(UpdateUserStatusSubject, {\n orgId: selectedOrgId,\n userId: user.id || user.email,\n status: status,\n });\n\n if (!response.metadata.success) {\n console.error(\"Failed to update user status:\", response.metadata.error);\n // Optionally revert local state on failure\n // setOnlineStatusLocal(previousStatus);\n } else {\n console.log(\"User status updated successfully:\", status);\n }\n } catch (error) {\n console.error(\"Error updating user status:\", error);\n // Optionally revert local state on error\n // setOnlineStatusLocal(previousStatus);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [natsConnected, user, selectedOrgId]\n );\n\n return {\n user,\n error,\n isLoading,\n refresh: getUser,\n selectedOrg,\n selectedOrgId,\n setSelectedOrgId,\n userOrgs,\n isAdmin,\n isSuperAdmin,\n createUser: create,\n userInGroup,\n getUserTeam: () => Promise.resolve({} as Team),\n updateTeamOnboardingData,\n teams,\n selectedTeamId,\n setSelectedTeamId,\n onlineStatus,\n setOnlineStatus,\n };\n};\n","// Code generated by tygo. DO NOT EDIT.\n\n//////////\n// source: user.go\n\nexport type WidgetType = string;\nexport const WidgetTypeCalendar: WidgetType = \"calendar\";\nexport const WidgetTypeActivities: WidgetType = \"activities\";\nexport const WidgetTypeEmail: WidgetType = \"email\";\nexport const WidgetTypeTasks: WidgetType = \"tasks\";\nexport const WidgetTypeNotes: WidgetType = \"notes\";\nexport const WidgetTypeFiles: WidgetType = \"files\";\nexport const WidgetTypeContacts: WidgetType = \"contacts\";\nexport const WidgetTypeAccounts: WidgetType = \"accounts\";\nexport const WidgetTypeLeads: WidgetType = \"leads\";\nexport const WidgetTypeOpportunities: WidgetType = \"opportunities\";\nexport const WidgetTypeChart: WidgetType = \"chart\";\nexport const WidgetTypeOrders: WidgetType = \"orders\";\nexport interface Widget {\n id?: string /* ObjectID */;\n userId: string;\n title: string;\n subTitle?: string;\n type: WidgetType;\n chartSettings?: ChartSettings;\n slotIndex: number /* int */;\n}\nexport type ChartType = string;\nexport const ChartTypeBar: ChartType = \"Bar chart\";\nexport const ChartTypeLine: ChartType = \"Line chart\";\nexport const ChartTypePie: ChartType = \"Pie chart\";\nexport const ChartTypeDoughnut: ChartType = \"Doughnut chart\";\nexport const ChartTypeMetic: ChartType = \"Metric\";\nexport type AggregateType = string;\nexport const AggregateTypeSum: AggregateType = \"Sum\";\nexport const AggregateTypeCount: AggregateType = \"Count\";\nexport const AggregateTypeAverage: AggregateType = \"Average\";\nexport const AggregateTypeMin: AggregateType = \"Min\";\nexport const AggregateTypeMax: AggregateType = \"Max\";\nexport const AggregateTypeDistinct: AggregateType = \"Distinct\";\nexport interface MetricResult {\n aggregateType: AggregateType;\n value: any;\n compareAggregateType: AggregateType;\n compareValue: any;\n}\nexport interface DateValue {\n date: string;\n value: number /* float64 */;\n}\nexport interface ChartSettings {\n chartType: ChartType;\n aggregateType: AggregateType;\n tableName: string;\n groupByFieldName: string;\n valueFieldName: string;\n filterFieldName: string;\n filterFieldValue: string;\n enableCompare: boolean;\n compareTitle: string;\n compareAggregateType: AggregateType;\n compareTableName: string;\n compareValueFieldName: string;\n compareFilterFieldName: string;\n compareFilterFieldValue: string;\n}\n","// Types from admin package needed by auth\nexport interface ResponseMetadata {\n success: boolean;\n timestamp: string /* RFC3339 */;\n message?: string;\n error?: string;\n}\n\nexport interface UserOrgAccess {\n orgId: string /* ObjectID */;\n orgTitle: string;\n roles: string[];\n isSingleAccount: boolean;\n entityRecordFilter?: any /* entities.EntityRecordLookup */;\n}\n\n// UserSettings represents user preferences (elastic JSON structure)\nexport interface UserSettings {\n theme?: string; // \"system\" | \"light\" | \"dark\"\n language?: string; // \"auto\" | \"en\" | \"ar\" | etc.\n timezone?: string; // \"auto\" | \"America/New_York\" | etc.\n occupation?: string; // User's occupation/role\n company?: string; // User's company/organization\n}\n\n// NotificationPreferences represents user notification settings\nexport interface NotificationPreferences {\n pushEnabled: boolean;\n newChatAssignment: boolean;\n newMessages: boolean;\n escalations: boolean;\n urgentOnly: boolean;\n soundEnabled: boolean;\n doNotDisturb: boolean;\n dndStart?: string; // \"22:00\" format\n dndEnd?: string; // \"08:00\" format\n}\n\nexport interface User {\n id?: string /* ObjectID */;\n email: string;\n firstName: string;\n lastName: string;\n authProviderName: string;\n orgAccess: UserOrgAccess[];\n settings?: UserSettings;\n notificationPreferences?: NotificationPreferences;\n createdAt?: number /* int64 */;\n updatedAt?: number /* int64 */;\n createdBy?: string;\n updatedBy?: string;\n isTeamAdmin?: boolean;\n teamId?: string;\n teamName?: string;\n isSysAdmin?: boolean;\n}\n\nexport interface UserResponse {\n user: User;\n metadata: ResponseMetadata;\n}\n\n// Request/Response for settings operations\nexport interface UpdateUserSettingsRequest {\n id: string;\n settings?: UserSettings;\n notificationPreferences?: NotificationPreferences;\n}\n\nexport interface UserSettingsResponse {\n settings?: UserSettings;\n notificationPreferences?: NotificationPreferences;\n metadata: ResponseMetadata;\n}\n\nexport interface Team {\n id?: string /* ObjectID */;\n name: string;\n isSubscribed: boolean;\n subscribedAt: number /* int64 */;\n plan: string;\n ownerName: string;\n ownerEmail: string;\n subscriptionPlatform: SubscriptionPlatform;\n subscriptionId: string;\n onboardingDone: boolean;\n onboardingData: string;\n}\n\nexport type SubscriptionPlatform = string;\nexport const SubscriptionPlatformStripe: SubscriptionPlatform = \"stripe\";\nexport const SubscriptionPlatformCustom: SubscriptionPlatform = \"custom\";\n\nexport interface OrgInfo {\n id?: string;\n title: string;\n logoUrl: string;\n mainDomain?: string;\n apps: any[];\n}\n\nexport interface OrgInfoResponse {\n orgInfo: OrgInfo;\n metadata: ResponseMetadata;\n}"],"mappings":"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","names":["isAdmin","isSuperAdmin","error"]}
1
+ {"version":3,"sources":["../context/user-context.tsx","../hooks/use-user.ts","../models/user-models.ts","../models/admin-types.ts"],"sourcesContent":["\"use client\";\n\nimport { createContext, FC, ReactNode, useContext } from \"react\";\n\nimport { Team, UserResponse } from \"../models\";\nimport { useUser, UseUserType } from \"../hooks\";\n\nexport let UserContext = createContext<UseUserType>({\n user: undefined,\n isLoading: true,\n refresh: () => {},\n selectedOrgId: undefined,\n setSelectedOrgId: () => {},\n userOrgs: [],\n selectedOrg: undefined,\n isAdmin: false,\n isSuperAdmin: false,\n createUser: () => Promise.resolve({} as UserResponse),\n userInGroup: () => false,\n getUserTeam: () => Promise.resolve({} as Team),\n updateTeamOnboardingData: () => Promise.resolve(true),\n teams: [],\n selectedTeamId: undefined,\n setSelectedTeamId: () => {},\n onlineStatus: \"offline\",\n setOnlineStatus: () => {},\n});\n\ntype UserProviderProps = {\n children: ReactNode;\n email: string | undefined | null;\n};\n\nexport const UserProvider: FC<UserProviderProps> = ({ children, email }) => {\n const user = useUser(email);\n\n return <UserContext.Provider value={user}>{children}</UserContext.Provider>;\n};\n\nexport const useUserContext = () => useContext(UserContext);\n","\"use client\";\n\nimport { useNatsContext } from \"@elqnt/nats\";\nimport { useProductContext } from \"@elqnt/product\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n UpdateUserStatusRequest,\n UpdateUserStatusResponse,\n UpdateUserStatusSubject,\n UserStatusTS,\n} from \"@elqnt/types\";\nimport {\n OrgInfo,\n OrgInfoResponse,\n Team,\n User,\n UserOrgAccess,\n UserResponse,\n} from \"../models\";\n\n// Import OrgResponse from admin models for domain validation\ninterface OrgResponse {\n org: {\n id: string;\n title: string;\n mainDomain: string;\n [key: string]: any;\n };\n metadata: {\n success: boolean;\n error?: string;\n message?: string;\n };\n}\n\nexport interface UseUserType {\n user?: User;\n error?: Error;\n isLoading: boolean;\n refresh: () => void;\n selectedOrgId?: string;\n setSelectedOrgId?: (orgId: string) => void;\n userOrgs: UserOrgAccess[];\n selectedOrg?: OrgInfo;\n isAdmin: boolean;\n isSuperAdmin: boolean;\n createUser: (user: User) => Promise<UserResponse>;\n userInGroup: (group: string) => boolean;\n getUserTeam: () => Promise<Team | undefined>;\n updateTeamOnboardingData: (data: string) => Promise<Error | boolean>;\n teams: Team[];\n selectedTeamId?: string;\n setSelectedTeamId?: (id: string) => void;\n onlineStatus: UserStatusTS;\n setOnlineStatus: (status: UserStatusTS) => void;\n}\n\nexport const useUser = (\n email: string | undefined | null,\n autoLoad = true\n): UseUserType => {\n const { natsConnected, request } = useNatsContext();\n\n const [user, setUser] = useState<User | undefined>(undefined);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | undefined>(undefined);\n const [onlineStatus, setOnlineStatusLocal] = useState<UserStatusTS>(\"online\");\n const hasSetInitialStatus = useRef(false);\n\n const { product } = useProductContext();\n\n const [userOrgs, setUserOrgs] = useState<UserOrgAccess[]>([]);\n const [teams, setTeams] = useState<Team[]>([]);\n const [selectedTeamId, setSelectedTeamId] = useState<string | undefined>(\n undefined\n );\n\n const [selectedOrgId, setSelectedOrgId] = useState<string | undefined>(\n undefined\n );\n\n // Load orgId from localStorage on client side only\n useEffect(() => {\n const storedOrgId = localStorage.getItem(\"orgId\");\n if (storedOrgId) {\n setSelectedOrgId(storedOrgId);\n }\n }, []);\n\n const [selectedOrg, setSelectedOrg] = useState<OrgInfo | undefined>(\n undefined\n );\n\n const [isAdmin, setIsAdmin] = useState<boolean>(false);\n\n const [isSuperAdmin, setIsSuperAdmin] = useState<boolean>(false);\n\n // const [team, setTeam] = useState<Team | undefined>(undefined);\n\n const [userGroups, setUserGroups] = useState<string[]>([]);\n\n const getUserGroups = useCallback(async () => {\n if (!user || !selectedOrgId) return;\n const data = await request<object, { groups: string[] }>(\n \"user.groups.get\",\n {\n userId: user.id,\n },\n {\n orgId: selectedOrgId,\n }\n );\n\n if (!data || data?.groups.length === 0) {\n return;\n }\n\n // console.log(\"user groups\", data);\n\n //@ts-ignore\n setUserGroups(data.map((g) => g.toLowerCase().replaceAll(\" \", \"_\")));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user, selectedOrgId]);\n\n async function updateTeamOnboardingData(\n data: string\n ): Promise<Error | boolean> {\n if (!natsConnected) {\n console.error(\"nats not connected\");\n return new Error(\"nats not connected\");\n }\n\n if (!user) {\n console.error(\"user not defined\");\n return new Error(\"user not defined\");\n }\n\n if (!user.teamId) {\n console.error(\"teamId not defined\");\n return new Error(\"teamId not defined\");\n }\n\n const res = await request<any, any>(\n \"admin.teams.updateOnboardingData\",\n {\n data,\n teamId: user.teamId,\n },\n {\n orgId: selectedOrgId,\n product,\n }\n );\n\n if (res instanceof Error) {\n setError(res);\n setIsLoading(false);\n return res;\n }\n\n return res.success;\n }\n\n useEffect(() => {\n if (!user || !selectedOrgId) {\n return;\n }\n getUserGroups();\n }, [user, selectedOrgId, getUserGroups]);\n\n function userInGroup(group: string) {\n return userGroups.includes(group.toLowerCase().replaceAll(\" \", \"_\"));\n }\n\n useEffect(() => {\n if (!user) {\n return;\n }\n\n if (user.orgAccess && user?.orgAccess.length > 0) {\n if (selectedOrgId === undefined) {\n const orgAccess = user.orgAccess[0];\n\n //@ts-ignore\n setSelectedOrgId(orgAccess.orgId);\n setUserOrgs(user.orgAccess);\n updateAdminFlags();\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user, selectedOrgId]);\n\n const updateAdminFlags = useCallback(() => {\n const orgAccess = userOrgs.find((org) => org.orgId === selectedOrgId);\n const isAdmin = orgAccess?.roles.includes(\"admin\") ?? false;\n setIsAdmin(isAdmin);\n\n if (!isAdmin) {\n setSelectedTeamId(user?.teamId);\n }\n\n const isSuperAdmin = orgAccess?.roles.includes(\"super-admin\") ?? false;\n setIsSuperAdmin(isSuperAdmin);\n }, [userOrgs, selectedOrgId, user?.teamId]);\n\n const create = async (data: User) => {\n setIsLoading(true);\n const res = await request<User, UserResponse>(\"admin.users.create\", data, {\n product,\n });\n setIsLoading(false);\n\n if (res instanceof Error) {\n setError(res);\n return res;\n }\n\n return res;\n };\n\n const getUser = useCallback(async () => {\n if (!natsConnected || !email || !product) {\n console.log(\"will not get user\", natsConnected, email, product);\n return;\n }\n\n console.log(\"will get user\", email, product);\n\n setIsLoading(true);\n const data = await request<object, UserResponse>(\n \"admin.users.getOneByEmail\",\n {\n email,\n },\n {\n product,\n }\n );\n\n if (data.metadata.success) {\n setUser(data.user);\n } else {\n // User not found in DB - try domain validation for AD users\n console.log(\"User not found in DB, attempting domain validation\");\n\n // Extract domain from email\n const emailDomain = email.split(\"@\")[1];\n\n if (emailDomain) {\n try {\n const orgResponse = await request<{ domain: string }, OrgResponse>(\n \"admin.orgs.getByDomain\",\n { domain: emailDomain },\n { product }\n );\n\n if (orgResponse.metadata?.success && orgResponse.org) {\n console.log(\"Found org by domain, creating virtual user\", orgResponse.org);\n\n // Create virtual user with org access\n const virtualUser: User = {\n email,\n firstName: email.split(\"@\")[0], // Use email prefix as first name\n lastName: \"\",\n authProviderName: \"azure\",\n orgAccess: [\n {\n orgId: orgResponse.org.id,\n orgTitle: orgResponse.org.title,\n roles: [\"user\"], // Default role for AD users\n isSingleAccount: true,\n },\n ],\n isSysAdmin: false,\n };\n\n setUser(virtualUser);\n setIsLoading(false);\n return;\n }\n } catch (domainError) {\n console.log(\"Domain validation failed\", domainError);\n }\n }\n\n // If domain validation fails, set original error\n setError(new Error(\"User not found\"));\n }\n\n setIsLoading(false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [natsConnected, email, product]);\n\n const getSelectedOrg = useCallback(async () => {\n if (!selectedOrgId || !natsConnected) return;\n\n const res = await request<object, OrgInfoResponse>(\n \"admin.orgs.getInfo\",\n {\n id: selectedOrgId,\n },\n {\n product,\n }\n );\n\n setSelectedOrg(res.orgInfo);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedOrgId, product, natsConnected]);\n\n useEffect(() => {\n if (!selectedOrgId || !natsConnected) {\n return;\n }\n\n getSelectedOrg();\n updateAdminFlags();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedOrgId, natsConnected]);\n\n useEffect(() => {\n if (natsConnected && autoLoad && email) {\n getUser();\n }\n }, [natsConnected, autoLoad, email]);\n\n // Automatically set online status when user loads (removed due to infinite loop issues)\n // Users can manually set their status via the dropdown menu\n\n // Persist user status to backend\n const setOnlineStatus = useCallback(\n async (status: UserStatusTS) => {\n // Update local state immediately for responsiveness\n setOnlineStatusLocal(status);\n\n // Early returns\n if (!natsConnected) {\n console.log(\"NATS not connected, cannot update user status\");\n return;\n }\n\n if (!user) {\n console.log(\"User not available, cannot update user status\");\n return;\n }\n\n if (!selectedOrgId) {\n console.log(\"Org ID not selected, cannot update user status\");\n return;\n }\n\n // Persist to backend\n try {\n const response = await request<\n UpdateUserStatusRequest,\n UpdateUserStatusResponse\n >(UpdateUserStatusSubject, {\n orgId: selectedOrgId,\n userId: user.id || user.email,\n status: status,\n });\n\n if (!response.metadata.success) {\n console.error(\"Failed to update user status:\", response.metadata.error);\n // Optionally revert local state on failure\n // setOnlineStatusLocal(previousStatus);\n } else {\n console.log(\"User status updated successfully:\", status);\n }\n } catch (error) {\n console.error(\"Error updating user status:\", error);\n // Optionally revert local state on error\n // setOnlineStatusLocal(previousStatus);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [natsConnected, user, selectedOrgId]\n );\n\n return {\n user,\n error,\n isLoading,\n refresh: getUser,\n selectedOrg,\n selectedOrgId,\n setSelectedOrgId,\n userOrgs,\n isAdmin,\n isSuperAdmin,\n createUser: create,\n userInGroup,\n getUserTeam: () => Promise.resolve({} as Team),\n updateTeamOnboardingData,\n teams,\n selectedTeamId,\n setSelectedTeamId,\n onlineStatus,\n setOnlineStatus,\n };\n};\n","// Code generated by tygo. DO NOT EDIT.\n\n//////////\n// source: user.go\n\nexport type WidgetType = string;\nexport const WidgetTypeCalendar: WidgetType = \"calendar\";\nexport const WidgetTypeActivities: WidgetType = \"activities\";\nexport const WidgetTypeEmail: WidgetType = \"email\";\nexport const WidgetTypeTasks: WidgetType = \"tasks\";\nexport const WidgetTypeNotes: WidgetType = \"notes\";\nexport const WidgetTypeFiles: WidgetType = \"files\";\nexport const WidgetTypeContacts: WidgetType = \"contacts\";\nexport const WidgetTypeAccounts: WidgetType = \"accounts\";\nexport const WidgetTypeLeads: WidgetType = \"leads\";\nexport const WidgetTypeOpportunities: WidgetType = \"opportunities\";\nexport const WidgetTypeChart: WidgetType = \"chart\";\nexport const WidgetTypeOrders: WidgetType = \"orders\";\nexport interface Widget {\n id?: string /* ObjectID */;\n userId: string;\n title: string;\n subTitle?: string;\n type: WidgetType;\n chartSettings?: ChartSettings;\n slotIndex: number /* int */;\n}\nexport type ChartType = string;\nexport const ChartTypeBar: ChartType = \"Bar chart\";\nexport const ChartTypeLine: ChartType = \"Line chart\";\nexport const ChartTypePie: ChartType = \"Pie chart\";\nexport const ChartTypeDoughnut: ChartType = \"Doughnut chart\";\nexport const ChartTypeMetic: ChartType = \"Metric\";\nexport type AggregateType = string;\nexport const AggregateTypeSum: AggregateType = \"Sum\";\nexport const AggregateTypeCount: AggregateType = \"Count\";\nexport const AggregateTypeAverage: AggregateType = \"Average\";\nexport const AggregateTypeMin: AggregateType = \"Min\";\nexport const AggregateTypeMax: AggregateType = \"Max\";\nexport const AggregateTypeDistinct: AggregateType = \"Distinct\";\nexport interface MetricResult {\n aggregateType: AggregateType;\n value: any;\n compareAggregateType: AggregateType;\n compareValue: any;\n}\nexport interface DateValue {\n date: string;\n value: number /* float64 */;\n}\nexport interface ChartSettings {\n chartType: ChartType;\n aggregateType: AggregateType;\n tableName: string;\n groupByFieldName: string;\n valueFieldName: string;\n filterFieldName: string;\n filterFieldValue: string;\n enableCompare: boolean;\n compareTitle: string;\n compareAggregateType: AggregateType;\n compareTableName: string;\n compareValueFieldName: string;\n compareFilterFieldName: string;\n compareFilterFieldValue: string;\n}\n","// Types from admin package needed by auth\nexport interface ResponseMetadata {\n success: boolean;\n timestamp: string /* RFC3339 */;\n message?: string;\n error?: string;\n}\n\nexport interface UserOrgAccess {\n orgId: string /* ObjectID */;\n orgTitle: string;\n roles: string[];\n isSingleAccount: boolean;\n entityRecordFilter?: any /* entities.EntityRecordLookup */;\n}\n\n// UserSettings represents user preferences (elastic JSON structure)\nexport interface UserSettings {\n theme?: string; // \"system\" | \"light\" | \"dark\"\n language?: string; // \"auto\" | \"en\" | \"ar\" | etc.\n timezone?: string; // \"auto\" | \"America/New_York\" | etc.\n occupation?: string; // User's occupation/role\n company?: string; // User's company/organization\n}\n\n// NotificationPreferences represents user notification settings\nexport interface NotificationPreferences {\n pushEnabled: boolean;\n newChatAssignment: boolean;\n newMessages: boolean;\n escalations: boolean;\n urgentOnly: boolean;\n soundEnabled: boolean;\n doNotDisturb: boolean;\n dndStart?: string; // \"22:00\" format\n dndEnd?: string; // \"08:00\" format\n}\n\nexport interface User {\n id?: string /* ObjectID */;\n email: string;\n firstName: string;\n lastName: string;\n authProviderName: string;\n orgAccess: UserOrgAccess[];\n settings?: UserSettings;\n notificationPreferences?: NotificationPreferences;\n createdAt?: number /* int64 */;\n updatedAt?: number /* int64 */;\n createdBy?: string;\n updatedBy?: string;\n isTeamAdmin?: boolean;\n teamId?: string;\n teamName?: string;\n isSysAdmin?: boolean;\n}\n\nexport interface UserResponse {\n user: User;\n metadata: ResponseMetadata;\n}\n\n// Request/Response for settings operations\nexport interface UpdateUserSettingsRequest {\n id: string;\n settings?: UserSettings;\n notificationPreferences?: NotificationPreferences;\n}\n\nexport interface UserSettingsResponse {\n settings?: UserSettings;\n notificationPreferences?: NotificationPreferences;\n metadata: ResponseMetadata;\n}\n\nexport interface Team {\n id?: string /* ObjectID */;\n name: string;\n isSubscribed: boolean;\n subscribedAt: number /* int64 */;\n plan: string;\n ownerName: string;\n ownerEmail: string;\n subscriptionPlatform: SubscriptionPlatform;\n subscriptionId: string;\n onboardingDone: boolean;\n onboardingData: string;\n}\n\nexport type SubscriptionPlatform = string;\nexport const SubscriptionPlatformStripe: SubscriptionPlatform = \"stripe\";\nexport const SubscriptionPlatformCustom: SubscriptionPlatform = \"custom\";\n\nexport interface OrgInfo {\n id?: string;\n title: string;\n logoUrl: string;\n mainDomain?: string;\n apps: any[];\n}\n\nexport interface OrgInfoResponse {\n orgInfo: OrgInfo;\n metadata: ResponseMetadata;\n}"],"mappings":";;;AAEA,SAAS,eAA8B,kBAAkB;;;ACAzD,SAAS,sBAAsB;AAC/B,SAAS,yBAAyB;AAClC,SAAS,aAAa,WAAW,QAAQ,gBAAgB;AACzD;AAAA,EAGE;AAAA,OAEK;AA+CA,IAAM,UAAU,CACrB,OACA,WAAW,SACK;AAChB,QAAM,EAAE,eAAe,QAAQ,IAAI,eAAe;AAElD,QAAM,CAAC,MAAM,OAAO,IAAI,SAA2B,MAAS;AAC5D,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAA4B,MAAS;AAC/D,QAAM,CAAC,cAAc,oBAAoB,IAAI,SAAuB,QAAQ;AAC5E,QAAM,sBAAsB,OAAO,KAAK;AAExC,QAAM,EAAE,QAAQ,IAAI,kBAAkB;AAEtC,QAAM,CAAC,UAAU,WAAW,IAAI,SAA0B,CAAC,CAAC;AAC5D,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAiB,CAAC,CAAC;AAC7C,QAAM,CAAC,gBAAgB,iBAAiB,IAAI;AAAA,IAC1C;AAAA,EACF;AAEA,QAAM,CAAC,eAAe,gBAAgB,IAAI;AAAA,IACxC;AAAA,EACF;AAGA,YAAU,MAAM;AACd,UAAM,cAAc,aAAa,QAAQ,OAAO;AAChD,QAAI,aAAa;AACf,uBAAiB,WAAW;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,CAAC,aAAa,cAAc,IAAI;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,CAAC,SAAS,UAAU,IAAI,SAAkB,KAAK;AAErD,QAAM,CAAC,cAAc,eAAe,IAAI,SAAkB,KAAK;AAI/D,QAAM,CAAC,YAAY,aAAa,IAAI,SAAmB,CAAC,CAAC;AAEzD,QAAM,gBAAgB,YAAY,YAAY;AAC5C,QAAI,CAAC,QAAQ,CAAC,cAAe;AAC7B,UAAM,OAAO,MAAM;AAAA,MACjB;AAAA,MACA;AAAA,QACE,QAAQ,KAAK;AAAA,MACf;AAAA,MACA;AAAA,QACE,OAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ,MAAM,OAAO,WAAW,GAAG;AACtC;AAAA,IACF;AAKA,kBAAc,KAAK,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,KAAK,GAAG,CAAC,CAAC;AAAA,EAErE,GAAG,CAAC,MAAM,aAAa,CAAC;AAExB,iBAAe,yBACb,MAC0B;AAC1B,QAAI,CAAC,eAAe;AAClB,cAAQ,MAAM,oBAAoB;AAClC,aAAO,IAAI,MAAM,oBAAoB;AAAA,IACvC;AAEA,QAAI,CAAC,MAAM;AACT,cAAQ,MAAM,kBAAkB;AAChC,aAAO,IAAI,MAAM,kBAAkB;AAAA,IACrC;AAEA,QAAI,CAAC,KAAK,QAAQ;AAChB,cAAQ,MAAM,oBAAoB;AAClC,aAAO,IAAI,MAAM,oBAAoB;AAAA,IACvC;AAEA,UAAM,MAAM,MAAM;AAAA,MAChB;AAAA,MACA;AAAA,QACE;AAAA,QACA,QAAQ,KAAK;AAAA,MACf;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,QAAI,eAAe,OAAO;AACxB,eAAS,GAAG;AACZ,mBAAa,KAAK;AAClB,aAAO;AAAA,IACT;AAEA,WAAO,IAAI;AAAA,EACb;AAEA,YAAU,MAAM;AACd,QAAI,CAAC,QAAQ,CAAC,eAAe;AAC3B;AAAA,IACF;AACA,kBAAc;AAAA,EAChB,GAAG,CAAC,MAAM,eAAe,aAAa,CAAC;AAEvC,WAAS,YAAY,OAAe;AAClC,WAAO,WAAW,SAAS,MAAM,YAAY,EAAE,WAAW,KAAK,GAAG,CAAC;AAAA,EACrE;AAEA,YAAU,MAAM;AACd,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,QAAI,KAAK,aAAa,MAAM,UAAU,SAAS,GAAG;AAChD,UAAI,kBAAkB,QAAW;AAC/B,cAAM,YAAY,KAAK,UAAU,CAAC;AAGlC,yBAAiB,UAAU,KAAK;AAChC,oBAAY,KAAK,SAAS;AAC1B,yBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,EAEF,GAAG,CAAC,MAAM,aAAa,CAAC;AAExB,QAAM,mBAAmB,YAAY,MAAM;AACzC,UAAM,YAAY,SAAS,KAAK,CAAC,QAAQ,IAAI,UAAU,aAAa;AACpE,UAAMA,WAAU,WAAW,MAAM,SAAS,OAAO,KAAK;AACtD,eAAWA,QAAO;AAElB,QAAI,CAACA,UAAS;AACZ,wBAAkB,MAAM,MAAM;AAAA,IAChC;AAEA,UAAMC,gBAAe,WAAW,MAAM,SAAS,aAAa,KAAK;AACjE,oBAAgBA,aAAY;AAAA,EAC9B,GAAG,CAAC,UAAU,eAAe,MAAM,MAAM,CAAC;AAE1C,QAAM,SAAS,OAAO,SAAe;AACnC,iBAAa,IAAI;AACjB,UAAM,MAAM,MAAM,QAA4B,sBAAsB,MAAM;AAAA,MACxE;AAAA,IACF,CAAC;AACD,iBAAa,KAAK;AAElB,QAAI,eAAe,OAAO;AACxB,eAAS,GAAG;AACZ,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,YAAY,YAAY;AACtC,QAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,SAAS;AACxC,cAAQ,IAAI,qBAAqB,eAAe,OAAO,OAAO;AAC9D;AAAA,IACF;AAEA,YAAQ,IAAI,iBAAiB,OAAO,OAAO;AAE3C,iBAAa,IAAI;AACjB,UAAM,OAAO,MAAM;AAAA,MACjB;AAAA,MACA;AAAA,QACE;AAAA,MACF;AAAA,MACA;AAAA,QACE;AAAA,MACF;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,SAAS;AACzB,cAAQ,KAAK,IAAI;AAAA,IACnB,OAAO;AAEL,cAAQ,IAAI,oDAAoD;AAGhE,YAAM,cAAc,MAAM,MAAM,GAAG,EAAE,CAAC;AAEtC,UAAI,aAAa;AACf,YAAI;AACF,gBAAM,cAAc,MAAM;AAAA,YACxB;AAAA,YACA,EAAE,QAAQ,YAAY;AAAA,YACtB,EAAE,QAAQ;AAAA,UACZ;AAEA,cAAI,YAAY,UAAU,WAAW,YAAY,KAAK;AACpD,oBAAQ,IAAI,8CAA8C,YAAY,GAAG;AAGzE,kBAAM,cAAoB;AAAA,cACxB;AAAA,cACA,WAAW,MAAM,MAAM,GAAG,EAAE,CAAC;AAAA;AAAA,cAC7B,UAAU;AAAA,cACV,kBAAkB;AAAA,cAClB,WAAW;AAAA,gBACT;AAAA,kBACE,OAAO,YAAY,IAAI;AAAA,kBACvB,UAAU,YAAY,IAAI;AAAA,kBAC1B,OAAO,CAAC,MAAM;AAAA;AAAA,kBACd,iBAAiB;AAAA,gBACnB;AAAA,cACF;AAAA,cACA,YAAY;AAAA,YACd;AAEA,oBAAQ,WAAW;AACnB,yBAAa,KAAK;AAClB;AAAA,UACF;AAAA,QACF,SAAS,aAAa;AACpB,kBAAQ,IAAI,4BAA4B,WAAW;AAAA,QACrD;AAAA,MACF;AAGA,eAAS,IAAI,MAAM,gBAAgB,CAAC;AAAA,IACtC;AAEA,iBAAa,KAAK;AAAA,EAEpB,GAAG,CAAC,eAAe,OAAO,OAAO,CAAC;AAElC,QAAM,iBAAiB,YAAY,YAAY;AAC7C,QAAI,CAAC,iBAAiB,CAAC,cAAe;AAEtC,UAAM,MAAM,MAAM;AAAA,MAChB;AAAA,MACA;AAAA,QACE,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE;AAAA,MACF;AAAA,IACF;AAEA,mBAAe,IAAI,OAAO;AAAA,EAE5B,GAAG,CAAC,eAAe,SAAS,aAAa,CAAC;AAE1C,YAAU,MAAM;AACd,QAAI,CAAC,iBAAiB,CAAC,eAAe;AACpC;AAAA,IACF;AAEA,mBAAe;AACf,qBAAiB;AAAA,EAEnB,GAAG,CAAC,eAAe,aAAa,CAAC;AAEjC,YAAU,MAAM;AACd,QAAI,iBAAiB,YAAY,OAAO;AACtC,cAAQ;AAAA,IACV;AAAA,EACF,GAAG,CAAC,eAAe,UAAU,KAAK,CAAC;AAMnC,QAAM,kBAAkB;AAAA,IACtB,OAAO,WAAyB;AAE9B,2BAAqB,MAAM;AAG3B,UAAI,CAAC,eAAe;AAClB,gBAAQ,IAAI,+CAA+C;AAC3D;AAAA,MACF;AAEA,UAAI,CAAC,MAAM;AACT,gBAAQ,IAAI,+CAA+C;AAC3D;AAAA,MACF;AAEA,UAAI,CAAC,eAAe;AAClB,gBAAQ,IAAI,gDAAgD;AAC5D;AAAA,MACF;AAGA,UAAI;AACF,cAAM,WAAW,MAAM,QAGrB,yBAAyB;AAAA,UACzB,OAAO;AAAA,UACP,QAAQ,KAAK,MAAM,KAAK;AAAA,UACxB;AAAA,QACF,CAAC;AAED,YAAI,CAAC,SAAS,SAAS,SAAS;AAC9B,kBAAQ,MAAM,iCAAiC,SAAS,SAAS,KAAK;AAAA,QAGxE,OAAO;AACL,kBAAQ,IAAI,qCAAqC,MAAM;AAAA,QACzD;AAAA,MACF,SAASC,QAAO;AACd,gBAAQ,MAAM,+BAA+BA,MAAK;AAAA,MAGpD;AAAA,IACF;AAAA;AAAA,IAEA,CAAC,eAAe,MAAM,aAAa;AAAA,EACrC;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA,aAAa,MAAM,QAAQ,QAAQ,CAAC,CAAS;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AD5WS;AA7BF,IAAI,cAAc,cAA2B;AAAA,EAClD,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS,MAAM;AAAA,EAAC;AAAA,EAChB,eAAe;AAAA,EACf,kBAAkB,MAAM;AAAA,EAAC;AAAA,EACzB,UAAU,CAAC;AAAA,EACX,aAAa;AAAA,EACb,SAAS;AAAA,EACT,cAAc;AAAA,EACd,YAAY,MAAM,QAAQ,QAAQ,CAAC,CAAiB;AAAA,EACpD,aAAa,MAAM;AAAA,EACnB,aAAa,MAAM,QAAQ,QAAQ,CAAC,CAAS;AAAA,EAC7C,0BAA0B,MAAM,QAAQ,QAAQ,IAAI;AAAA,EACpD,OAAO,CAAC;AAAA,EACR,gBAAgB;AAAA,EAChB,mBAAmB,MAAM;AAAA,EAAC;AAAA,EAC1B,cAAc;AAAA,EACd,iBAAiB,MAAM;AAAA,EAAC;AAC1B,CAAC;AAOM,IAAM,eAAsC,CAAC,EAAE,UAAU,MAAM,MAAM;AAC1E,QAAM,OAAO,QAAQ,KAAK;AAE1B,SAAO,oBAAC,YAAY,UAAZ,EAAqB,OAAO,MAAO,UAAS;AACtD;AAEO,IAAM,iBAAiB,MAAM,WAAW,WAAW;;;AEjCnD,IAAM,qBAAiC;AACvC,IAAM,uBAAmC;AACzC,IAAM,kBAA8B;AACpC,IAAM,kBAA8B;AACpC,IAAM,kBAA8B;AACpC,IAAM,kBAA8B;AACpC,IAAM,qBAAiC;AACvC,IAAM,qBAAiC;AACvC,IAAM,kBAA8B;AACpC,IAAM,0BAAsC;AAC5C,IAAM,kBAA8B;AACpC,IAAM,mBAA+B;AAWrC,IAAM,eAA0B;AAChC,IAAM,gBAA2B;AACjC,IAAM,eAA0B;AAChC,IAAM,oBAA+B;AACrC,IAAM,iBAA4B;AAElC,IAAM,mBAAkC;AACxC,IAAM,qBAAoC;AAC1C,IAAM,uBAAsC;AAC5C,IAAM,mBAAkC;AACxC,IAAM,mBAAkC;AACxC,IAAM,wBAAuC;;;ACmD7C,IAAM,6BAAmD;AACzD,IAAM,6BAAmD;","names":["isAdmin","isSuperAdmin","error"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elqnt/auth",
3
- "version": "1.0.0",
3
+ "version": "1.0.7",
4
4
  "description": "Authentication and user context for Eloquent platform",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",