@burdenoff/microfe-conversations 2026.510.117

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 (155) hide show
  1. package/README.md +12 -0
  2. package/dist/__tests__/setup.d.ts +2 -0
  3. package/dist/__tests__/setup.d.ts.map +1 -0
  4. package/dist/conversations/ConversationsAdminRoot.d.ts +19 -0
  5. package/dist/conversations/ConversationsAdminRoot.d.ts.map +1 -0
  6. package/dist/conversations/ConversationsAdminRoot.js +104 -0
  7. package/dist/conversations/ConversationsAdminRoot.js.map +1 -0
  8. package/dist/conversations/ConversationsAdminRoutes.d.ts +18 -0
  9. package/dist/conversations/ConversationsAdminRoutes.d.ts.map +1 -0
  10. package/dist/conversations/ConversationsAdminRoutes.js +42 -0
  11. package/dist/conversations/ConversationsAdminRoutes.js.map +1 -0
  12. package/dist/conversations/ConversationsRoot.d.ts +33 -0
  13. package/dist/conversations/ConversationsRoot.d.ts.map +1 -0
  14. package/dist/conversations/ConversationsRoot.js +100 -0
  15. package/dist/conversations/ConversationsRoot.js.map +1 -0
  16. package/dist/conversations/ConversationsUserRoot.d.ts +17 -0
  17. package/dist/conversations/ConversationsUserRoot.d.ts.map +1 -0
  18. package/dist/conversations/ConversationsUserRoot.js +101 -0
  19. package/dist/conversations/ConversationsUserRoot.js.map +1 -0
  20. package/dist/conversations/ConversationsUserRoutes.d.ts +12 -0
  21. package/dist/conversations/ConversationsUserRoutes.d.ts.map +1 -0
  22. package/dist/conversations/ConversationsUserRoutes.js +45 -0
  23. package/dist/conversations/ConversationsUserRoutes.js.map +1 -0
  24. package/dist/conversations/components/ConversationCard.d.ts +14 -0
  25. package/dist/conversations/components/ConversationCard.d.ts.map +1 -0
  26. package/dist/conversations/components/ConversationCard.js +118 -0
  27. package/dist/conversations/components/ConversationCard.js.map +1 -0
  28. package/dist/conversations/components/LazyPageBoundary.d.ts +25 -0
  29. package/dist/conversations/components/LazyPageBoundary.d.ts.map +1 -0
  30. package/dist/conversations/components/LazyPageBoundary.js +144 -0
  31. package/dist/conversations/components/LazyPageBoundary.js.map +1 -0
  32. package/dist/conversations/components/MessageBubble.d.ts +21 -0
  33. package/dist/conversations/components/MessageBubble.d.ts.map +1 -0
  34. package/dist/conversations/components/MessageBubble.js +242 -0
  35. package/dist/conversations/components/MessageBubble.js.map +1 -0
  36. package/dist/conversations/components/PageLayout.d.ts +55 -0
  37. package/dist/conversations/components/PageLayout.d.ts.map +1 -0
  38. package/dist/conversations/components/PageLayout.js +93 -0
  39. package/dist/conversations/components/PageLayout.js.map +1 -0
  40. package/dist/conversations/components/PermissionGuard.d.ts +21 -0
  41. package/dist/conversations/components/PermissionGuard.d.ts.map +1 -0
  42. package/dist/conversations/components/PermissionGuard.js +25 -0
  43. package/dist/conversations/components/PermissionGuard.js.map +1 -0
  44. package/dist/conversations/constants/featureFlags.d.ts +8 -0
  45. package/dist/conversations/constants/featureFlags.d.ts.map +1 -0
  46. package/dist/conversations/constants/featureFlags.js +12 -0
  47. package/dist/conversations/constants/featureFlags.js.map +1 -0
  48. package/dist/conversations/constants/permissions.d.ts +174 -0
  49. package/dist/conversations/constants/permissions.d.ts.map +1 -0
  50. package/dist/conversations/constants/permissions.js +68 -0
  51. package/dist/conversations/constants/permissions.js.map +1 -0
  52. package/dist/conversations/hooks/useAdminFeatureFlags.d.ts +8 -0
  53. package/dist/conversations/hooks/useAdminFeatureFlags.d.ts.map +1 -0
  54. package/dist/conversations/hooks/useAdminFeatureFlags.js +16 -0
  55. package/dist/conversations/hooks/useAdminFeatureFlags.js.map +1 -0
  56. package/dist/conversations/hooks/useConversationQueries.d.ts +83 -0
  57. package/dist/conversations/hooks/useConversationQueries.d.ts.map +1 -0
  58. package/dist/conversations/hooks/useConversationQueries.js +136 -0
  59. package/dist/conversations/hooks/useConversationQueries.js.map +1 -0
  60. package/dist/conversations/hooks/useExportConversation.d.ts +10 -0
  61. package/dist/conversations/hooks/useExportConversation.d.ts.map +1 -0
  62. package/dist/conversations/hooks/useExportConversation.js +41 -0
  63. package/dist/conversations/hooks/useExportConversation.js.map +1 -0
  64. package/dist/conversations/hooks/useMessageQueries.d.ts +84 -0
  65. package/dist/conversations/hooks/useMessageQueries.d.ts.map +1 -0
  66. package/dist/conversations/hooks/useMessageQueries.js +123 -0
  67. package/dist/conversations/hooks/useMessageQueries.js.map +1 -0
  68. package/dist/conversations/hooks/useMessageSubscriptions.d.ts +24 -0
  69. package/dist/conversations/hooks/useMessageSubscriptions.d.ts.map +1 -0
  70. package/dist/conversations/hooks/useMessageSubscriptions.js +90 -0
  71. package/dist/conversations/hooks/useMessageSubscriptions.js.map +1 -0
  72. package/dist/conversations/hooks/useUserFeatureFlags.d.ts +5 -0
  73. package/dist/conversations/hooks/useUserFeatureFlags.d.ts.map +1 -0
  74. package/dist/conversations/hooks/useUserFeatureFlags.js +10 -0
  75. package/dist/conversations/hooks/useUserFeatureFlags.js.map +1 -0
  76. package/dist/conversations/index.d.ts +31 -0
  77. package/dist/conversations/index.d.ts.map +1 -0
  78. package/dist/conversations/index.js +5 -0
  79. package/dist/conversations/pages/AdminConversationsLandingPage.d.ts +9 -0
  80. package/dist/conversations/pages/AdminConversationsLandingPage.d.ts.map +1 -0
  81. package/dist/conversations/pages/AdminConversationsLandingPage.js +117 -0
  82. package/dist/conversations/pages/AdminConversationsLandingPage.js.map +1 -0
  83. package/dist/conversations/pages/ConversationAdminPages.d.ts +5 -0
  84. package/dist/conversations/pages/ConversationAdminPages.d.ts.map +1 -0
  85. package/dist/conversations/pages/ConversationAdminPages.js +573 -0
  86. package/dist/conversations/pages/ConversationAdminPages.js.map +1 -0
  87. package/dist/conversations/pages/ConversationDetailPage.d.ts +2 -0
  88. package/dist/conversations/pages/ConversationDetailPage.d.ts.map +1 -0
  89. package/dist/conversations/pages/ConversationDetailPage.js +439 -0
  90. package/dist/conversations/pages/ConversationDetailPage.js.map +1 -0
  91. package/dist/conversations/pages/ConversationListPage.d.ts +6 -0
  92. package/dist/conversations/pages/ConversationListPage.d.ts.map +1 -0
  93. package/dist/conversations/pages/ConversationListPage.js +269 -0
  94. package/dist/conversations/pages/ConversationListPage.js.map +1 -0
  95. package/dist/conversations/pages/ConversationsLandingPage.d.ts +9 -0
  96. package/dist/conversations/pages/ConversationsLandingPage.d.ts.map +1 -0
  97. package/dist/conversations/pages/ConversationsLandingPage.js +124 -0
  98. package/dist/conversations/pages/ConversationsLandingPage.js.map +1 -0
  99. package/dist/conversations/pages/ConversationsSettingsPage.d.ts +2 -0
  100. package/dist/conversations/pages/ConversationsSettingsPage.d.ts.map +1 -0
  101. package/dist/conversations/pages/ConversationsSettingsPage.js +215 -0
  102. package/dist/conversations/pages/ConversationsSettingsPage.js.map +1 -0
  103. package/dist/conversations/pages/NewConversationPage.d.ts +2 -0
  104. package/dist/conversations/pages/NewConversationPage.d.ts.map +1 -0
  105. package/dist/conversations/pages/NewConversationPage.js +287 -0
  106. package/dist/conversations/pages/NewConversationPage.js.map +1 -0
  107. package/dist/conversations/providers/ConversationsProvider.d.ts +13 -0
  108. package/dist/conversations/providers/ConversationsProvider.d.ts.map +1 -0
  109. package/dist/conversations/providers/ConversationsProvider.js +109 -0
  110. package/dist/conversations/providers/ConversationsProvider.js.map +1 -0
  111. package/dist/conversations/store/conversationsStore.d.ts +29 -0
  112. package/dist/conversations/store/conversationsStore.d.ts.map +1 -0
  113. package/dist/conversations/store/conversationsStore.js +56 -0
  114. package/dist/conversations/store/conversationsStore.js.map +1 -0
  115. package/dist/conversations/types/index.d.ts +352 -0
  116. package/dist/conversations/types/index.d.ts.map +1 -0
  117. package/dist/conversations/utils/cn.d.ts +8 -0
  118. package/dist/conversations/utils/cn.d.ts.map +1 -0
  119. package/dist/conversations/utils/cn.js +10 -0
  120. package/dist/conversations/utils/cn.js.map +1 -0
  121. package/dist/conversations/utils/i18n.d.ts +15 -0
  122. package/dist/conversations/utils/i18n.d.ts.map +1 -0
  123. package/dist/conversations/utils/i18n.js +14 -0
  124. package/dist/conversations/utils/i18n.js.map +1 -0
  125. package/dist/conversations/utils/mappers.d.ts +32 -0
  126. package/dist/conversations/utils/mappers.d.ts.map +1 -0
  127. package/dist/conversations/utils/mappers.js +164 -0
  128. package/dist/conversations/utils/mappers.js.map +1 -0
  129. package/dist/conversations/utils/navigation.d.ts +18 -0
  130. package/dist/conversations/utils/navigation.d.ts.map +1 -0
  131. package/dist/conversations/utils/navigation.js +8 -0
  132. package/dist/conversations/utils/navigation.js.map +1 -0
  133. package/dist/dev/main.d.ts +2 -0
  134. package/dist/dev/main.d.ts.map +1 -0
  135. package/dist/generated/global-operations.d.ts +2 -0
  136. package/dist/generated/global-operations.d.ts.map +1 -0
  137. package/dist/generated/global-types.d.ts +20716 -0
  138. package/dist/generated/global-types.d.ts.map +1 -0
  139. package/dist/generated/wspace-operations.d.ts +2008 -0
  140. package/dist/generated/wspace-operations.d.ts.map +1 -0
  141. package/dist/generated/wspace-operations.js +997 -0
  142. package/dist/generated/wspace-operations.js.map +1 -0
  143. package/dist/generated/wspace-types.d.ts +53363 -0
  144. package/dist/generated/wspace-types.d.ts.map +1 -0
  145. package/dist/index.d.ts +6 -0
  146. package/dist/index.d.ts.map +1 -0
  147. package/dist/index.js +7 -0
  148. package/dist/node_modules/clsx/dist/clsx.js +18 -0
  149. package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
  150. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1674 -0
  151. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  152. package/dist/utils/nativeBridge.d.ts +3 -0
  153. package/dist/utils/nativeBridge.d.ts.map +1 -0
  154. package/dist/utils/nativeBridge.js +2 -0
  155. package/package.json +115 -0
@@ -0,0 +1,109 @@
1
+ import { createContext as e, useContext as t, useMemo as n, useRef as r } from "react";
2
+ import { MemoryRouter as i } from "react-router-dom";
3
+ import { QueryClient as a, QueryClientProvider as o } from "@tanstack/react-query";
4
+ import { ApolloClient as s, HttpLink as c, InMemoryCache as l, Observable as u, from as d } from "@apollo/client";
5
+ import { onError as f } from "@apollo/client/link/error";
6
+ import { ApolloProvider as p, useApolloClient as m } from "@apollo/client/react";
7
+ import { PermissionProvider as h } from "@burdenoff/fe-libs/shared/providers/shell";
8
+ import { isAuthNetworkError as g, redirectToLogin as _ } from "@burdenoff/fe-libs/shared/utils";
9
+ import { useEvent as v } from "@burdenoff/fe-libs/shared/events";
10
+ import { Fragment as y, jsx as b, jsxs as x } from "react/jsx-runtime";
11
+ //#region src/conversations/providers/ConversationsProvider.tsx
12
+ function S() {
13
+ let e = m();
14
+ return v("auth.signed_out", () => {
15
+ e.clearStore();
16
+ }), null;
17
+ }
18
+ function C(e = []) {
19
+ return e.some((e) => {
20
+ let t = typeof e.extensions?.code == "string" ? e.extensions.code : "", n = typeof e.extensions?.errorCode == "string" ? e.extensions.errorCode : "", r = (e.message ?? "").toLowerCase();
21
+ return t === "UNAUTHENTICATED" || n === "TOKEN_EXPIRED" || r.includes("token_expired") || r.includes("token expired") || r.includes("session expired") || r.includes("unauthorized") || r.includes("unauthenticated") || r.includes("authentication required") || r.includes("workspace context missing");
22
+ });
23
+ }
24
+ var w = e(null), T = () => {
25
+ let e = t(w);
26
+ if (!e) throw Error("useConversations must be used within ConversationsProvider");
27
+ return e;
28
+ }, E = ({ children: e, basePath: t, navigate: m, currentUser: v, workspaceId: T, apiGatewayUrl: E, authToken: D, workspaceToken: O, getWorkspaceToken: k, onConversationSelect: A, onMessageSend: j, defaultView: M, variant: N }) => {
29
+ let P = {
30
+ basePath: t,
31
+ navigate: m,
32
+ currentUser: v,
33
+ workspaceId: T,
34
+ apiGatewayUrl: E,
35
+ authToken: D,
36
+ workspaceToken: O,
37
+ getWorkspaceToken: k,
38
+ onConversationSelect: A,
39
+ onMessageSend: j,
40
+ defaultView: M,
41
+ variant: N
42
+ }, F = r(!1), I = r(k);
43
+ I.current = k;
44
+ let L = n(() => new a({ defaultOptions: { queries: {
45
+ retry: 1,
46
+ refetchOnWindowFocus: !1,
47
+ staleTime: 300 * 1e3
48
+ } } }), []), R = n(() => {
49
+ let e = typeof window < "u" && (window.location.hostname === "localhost" || window.location.hostname.endsWith(".local.burdenoff.com")), t = e ? `${window.location.origin}/__local/conversations/graphql` : E ? `${E}/workspaces/graphql` : "/workspaces/graphql", n = {};
50
+ D && (n.Authorization = `Bearer ${D}`), O && (n["X-Workspace-Authorization"] = `Bearer ${O}`), T && (n["x-workspace-id"] = T), e && v?.id && (n["x-actor-id"] = v.id, n["x-actor-type"] = "user");
51
+ let r = new c({
52
+ uri: t,
53
+ headers: Object.keys(n).length > 0 ? n : void 0
54
+ });
55
+ return new s({
56
+ link: d([f(({ error: e, operation: t, forward: n }) => {
57
+ if (!e) return;
58
+ let r = C("errors" in e && Array.isArray(e.errors) ? e.errors : []);
59
+ if (!I.current || !r || F.current) {
60
+ e instanceof Error && g(e) && _();
61
+ return;
62
+ }
63
+ return new u((e) => {
64
+ F.current = !0, I.current?.().then((r) => {
65
+ if (F.current = !1, !r) {
66
+ _(), e.error(/* @__PURE__ */ Error("Failed to refresh workspace token"));
67
+ return;
68
+ }
69
+ t.setContext(({ headers: e = {} }) => ({ headers: {
70
+ ...e,
71
+ "X-Workspace-Authorization": `Bearer ${r}`,
72
+ ...T ? { "x-workspace-id": T } : {}
73
+ } }));
74
+ let i = n(t).subscribe(e);
75
+ return () => i.unsubscribe();
76
+ }).catch((t) => {
77
+ F.current = !1, e.error(t);
78
+ });
79
+ });
80
+ }), r]),
81
+ cache: new l(),
82
+ defaultOptions: { watchQuery: { fetchPolicy: "cache-and-network" } }
83
+ });
84
+ }, [
85
+ E,
86
+ D,
87
+ v?.id,
88
+ T,
89
+ O
90
+ ]), z = !!t, B = /* @__PURE__ */ b(o, {
91
+ client: L,
92
+ children: /* @__PURE__ */ b(w.Provider, {
93
+ value: P,
94
+ children: z ? /* @__PURE__ */ x(h, {
95
+ scopeId: T ?? null,
96
+ gateway: "workspace",
97
+ children: [/* @__PURE__ */ b(S, {}), e]
98
+ }) : /* @__PURE__ */ x(y, { children: [/* @__PURE__ */ b(S, {}), e] })
99
+ })
100
+ });
101
+ return z ? B : /* @__PURE__ */ b(p, {
102
+ client: R,
103
+ children: /* @__PURE__ */ b(i, { children: B })
104
+ });
105
+ };
106
+ //#endregion
107
+ export { E as ConversationsProvider, T as useConversations };
108
+
109
+ //# sourceMappingURL=ConversationsProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationsProvider.js","names":[],"sources":["../../../src/conversations/providers/ConversationsProvider.tsx"],"sourcesContent":["import type { FC, PropsWithChildren } from \"react\";\nimport { createContext, useContext, useMemo, useRef } from \"react\";\nimport { MemoryRouter } from \"react-router-dom\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport {\n ApolloClient,\n InMemoryCache,\n HttpLink,\n from,\n Observable,\n} from \"@apollo/client\";\nimport { onError } from \"@apollo/client/link/error\";\nimport { ApolloProvider, useApolloClient } from \"@apollo/client/react\";\nimport { PermissionProvider } from \"@burdenoff/fe-libs/shared/providers/shell\";\nimport {\n isAuthNetworkError,\n redirectToLogin,\n} from \"@burdenoff/fe-libs/shared/utils\";\nimport { useEvent } from \"@burdenoff/fe-libs/shared/events\";\nimport type { ConversationsRootProps } from \"../types\";\n\n/**\n * Clears Apollo cache on auth.signed_out so stale conversation data\n * is not retained across sessions. Must render inside ApolloProvider.\n */\nfunction AuthCacheClearer() {\n const client = useApolloClient();\n useEvent(\"auth.signed_out\", () => {\n void client.clearStore();\n });\n return null;\n}\n\nfunction hasSessionAuthErrors(\n errors: ReadonlyArray<{\n message?: string;\n extensions?: Record<string, unknown>;\n }> = [],\n): boolean {\n return errors.some((error) => {\n const code =\n typeof error.extensions?.code === \"string\" ? error.extensions.code : \"\";\n const errorCode =\n typeof error.extensions?.errorCode === \"string\"\n ? error.extensions.errorCode\n : \"\";\n const message = (error.message ?? \"\").toLowerCase();\n\n return (\n code === \"UNAUTHENTICATED\" ||\n errorCode === \"TOKEN_EXPIRED\" ||\n message.includes(\"token_expired\") ||\n message.includes(\"token expired\") ||\n message.includes(\"session expired\") ||\n message.includes(\"unauthorized\") ||\n message.includes(\"unauthenticated\") ||\n message.includes(\"authentication required\") ||\n message.includes(\"workspace context missing\")\n );\n });\n}\n\n/**\n * Context value for Conversations microfrontend\n */\ntype ConversationsContextValue = ConversationsRootProps;\n\nconst ConversationsContext = createContext<ConversationsContextValue | null>(\n null,\n);\n\n/**\n * Hook to access Conversations context\n */\nexport const useConversations = () => {\n const context = useContext(ConversationsContext);\n if (!context) {\n throw new Error(\n \"useConversations must be used within ConversationsProvider\",\n );\n }\n return context;\n};\n\n/**\n * Provider component for Conversations microfrontend\n * Sets up routing, context, Apollo Client, and React Query client\n */\nexport const ConversationsProvider: FC<\n PropsWithChildren<ConversationsRootProps>\n> = ({\n children,\n basePath,\n navigate,\n currentUser,\n workspaceId,\n apiGatewayUrl,\n authToken,\n workspaceToken,\n getWorkspaceToken,\n onConversationSelect,\n onMessageSend,\n defaultView,\n variant,\n}) => {\n const contextValue: ConversationsContextValue = {\n basePath,\n navigate,\n currentUser,\n workspaceId,\n apiGatewayUrl,\n authToken,\n workspaceToken,\n getWorkspaceToken,\n onConversationSelect,\n onMessageSend,\n defaultView,\n variant,\n };\n\n const isRefreshingRef = useRef(false);\n const getWorkspaceTokenRef = useRef(getWorkspaceToken);\n getWorkspaceTokenRef.current = getWorkspaceToken;\n\n // Create QueryClient instance (memoized to avoid recreation on re-renders)\n const queryClient = useMemo(\n () =>\n new QueryClient({\n defaultOptions: {\n queries: {\n retry: 1,\n refetchOnWindowFocus: false,\n staleTime: 5 * 60 * 1000, // 5 minutes\n },\n },\n }),\n [],\n );\n\n // Create ApolloClient instance (memoized, recreated when tokens change)\n // The workspace gateway requires dual-token auth:\n // Authorization: Bearer <authToken> (platform identity)\n // X-Workspace-Authorization: Bearer <workspaceToken> (workspace access)\n const apolloClient = useMemo(() => {\n const isLocalDirectMode =\n typeof window !== \"undefined\" &&\n (window.location.hostname === \"localhost\" ||\n window.location.hostname.endsWith(\".local.burdenoff.com\"));\n const workspaceEndpoint = isLocalDirectMode\n ? `${window.location.origin}/__local/conversations/graphql`\n : apiGatewayUrl\n ? `${apiGatewayUrl}/workspaces/graphql`\n : \"/workspaces/graphql\";\n\n const headers: Record<string, string> = {};\n if (authToken) {\n headers[\"Authorization\"] = `Bearer ${authToken}`;\n }\n if (workspaceToken) {\n headers[\"X-Workspace-Authorization\"] = `Bearer ${workspaceToken}`;\n }\n if (workspaceId) {\n headers[\"x-workspace-id\"] = workspaceId;\n }\n if (isLocalDirectMode && currentUser?.id) {\n headers[\"x-actor-id\"] = currentUser.id;\n headers[\"x-actor-type\"] = \"user\";\n }\n\n const httpLink = new HttpLink({\n uri: workspaceEndpoint,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n });\n\n const errorLink = onError(({ error, operation, forward }) => {\n if (!error) return;\n\n const errors =\n \"errors\" in error && Array.isArray(error.errors) ? error.errors : [];\n const hasAuthError = hasSessionAuthErrors(errors);\n\n if (\n !getWorkspaceTokenRef.current ||\n !hasAuthError ||\n isRefreshingRef.current\n ) {\n if (error instanceof Error && isAuthNetworkError(error)) {\n redirectToLogin();\n }\n return;\n }\n\n return new Observable((observer) => {\n isRefreshingRef.current = true;\n getWorkspaceTokenRef\n .current?.()\n .then((freshToken) => {\n isRefreshingRef.current = false;\n if (!freshToken) {\n redirectToLogin();\n observer.error(new Error(\"Failed to refresh workspace token\"));\n return;\n }\n\n operation.setContext(\n ({\n headers: existingHeaders = {},\n }: {\n headers?: Record<string, string>;\n }) => ({\n headers: {\n ...existingHeaders,\n \"X-Workspace-Authorization\": `Bearer ${freshToken}`,\n ...(workspaceId ? { \"x-workspace-id\": workspaceId } : {}),\n },\n }),\n );\n\n const subscriber = forward(operation).subscribe(observer);\n return () => subscriber.unsubscribe();\n })\n .catch((refreshError: unknown) => {\n isRefreshingRef.current = false;\n observer.error(refreshError);\n });\n });\n });\n\n return new ApolloClient({\n link: from([errorLink, httpLink]),\n cache: new InMemoryCache(),\n defaultOptions: {\n watchQuery: {\n fetchPolicy: \"cache-and-network\",\n },\n },\n });\n }, [apiGatewayUrl, authToken, currentUser?.id, workspaceId, workspaceToken]);\n\n // PermissionProvider requires the shell's AuthProvider — only mount it in integrated mode.\n const isIntegrated = !!basePath;\n\n // Wrap content with QueryClientProvider and ConversationsContext.Provider\n const content = (\n <QueryClientProvider client={queryClient}>\n <ConversationsContext.Provider value={contextValue}>\n {isIntegrated ? (\n <PermissionProvider scopeId={workspaceId ?? null} gateway=\"workspace\">\n <AuthCacheClearer />\n {children}\n </PermissionProvider>\n ) : (\n <>\n <AuthCacheClearer />\n {children}\n </>\n )}\n </ConversationsContext.Provider>\n </QueryClientProvider>\n );\n\n // When integrated into a shell (basePath provided), the shell already has a router and ApolloProvider\n // so we don't create another one. When standalone (no basePath), use MemoryRouter and ApolloProvider.\n return isIntegrated ? (\n content\n ) : (\n <ApolloProvider client={apolloClient}>\n <MemoryRouter>{content}</MemoryRouter>\n </ApolloProvider>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { Conversation, ConversationFilter, ConversationDisplayMode } from '../types';
2
+
3
+ interface ConversationsState {
4
+ activeConversationId: string | null;
5
+ viewMode: ConversationDisplayMode;
6
+ searchQuery: string;
7
+ conversationFilter: ConversationFilter;
8
+ messageDrafts: Record<string, string>;
9
+ isSidebarOpen: boolean;
10
+ isParticipantsPanelOpen: boolean;
11
+ selectedConversations: Conversation[];
12
+ setActiveConversationId: (id: string | null) => void;
13
+ setViewMode: (mode: ConversationDisplayMode) => void;
14
+ setSearchQuery: (query: string) => void;
15
+ updateConversationFilter: (filter: Partial<ConversationFilter>) => void;
16
+ resetConversationFilter: () => void;
17
+ setMessageDraft: (conversationId: string, draft: string) => void;
18
+ clearMessageDraft: (conversationId: string) => void;
19
+ toggleSidebar: () => void;
20
+ setSidebarOpen: (open: boolean) => void;
21
+ toggleParticipantsPanel: () => void;
22
+ setParticipantsPanelOpen: (open: boolean) => void;
23
+ setSelectedConversations: (conversations: Conversation[]) => void;
24
+ toggleConversationSelection: (conversation: Conversation) => void;
25
+ clearSelection: () => void;
26
+ }
27
+ export declare const useConversationsStore: import('zustand').UseBoundStore<import('zustand').StoreApi<ConversationsState>>;
28
+ export {};
29
+ //# sourceMappingURL=conversationsStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversationsStore.d.ts","sourceRoot":"","sources":["../../../src/conversations/store/conversationsStore.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,uBAAuB,EACxB,MAAM,UAAU,CAAC;AAElB,UAAU,kBAAkB;IAE1B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,EAAE,uBAAuB,CAAC;IAGlC,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,kBAAkB,CAAC;IAGvC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAGtC,aAAa,EAAE,OAAO,CAAC;IACvB,uBAAuB,EAAE,OAAO,CAAC;IAGjC,qBAAqB,EAAE,YAAY,EAAE,CAAC;IAGtC,uBAAuB,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACrD,WAAW,EAAE,CAAC,IAAI,EAAE,uBAAuB,KAAK,IAAI,CAAC;IACrD,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,wBAAwB,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,KAAK,IAAI,CAAC;IACxE,uBAAuB,EAAE,MAAM,IAAI,CAAC;IACpC,eAAe,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjE,iBAAiB,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,uBAAuB,EAAE,MAAM,IAAI,CAAC;IACpC,wBAAwB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,wBAAwB,EAAE,CAAC,aAAa,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;IAClE,2BAA2B,EAAE,CAAC,YAAY,EAAE,YAAY,KAAK,IAAI,CAAC;IAClE,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAYD,eAAO,MAAM,qBAAqB,iFAyD/B,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { create as e } from "zustand";
2
+ //#region src/conversations/store/conversationsStore.ts
3
+ var t = {
4
+ search: "",
5
+ type: "all",
6
+ state: "all",
7
+ visibility: "all",
8
+ hasUnread: void 0,
9
+ isPinned: void 0,
10
+ isMuted: void 0
11
+ }, n = e((e) => ({
12
+ activeConversationId: null,
13
+ viewMode: "list",
14
+ searchQuery: "",
15
+ conversationFilter: t,
16
+ messageDrafts: {},
17
+ isSidebarOpen: !0,
18
+ isParticipantsPanelOpen: !1,
19
+ selectedConversations: [],
20
+ setActiveConversationId: (t) => e({ activeConversationId: t }),
21
+ setViewMode: (t) => e({ viewMode: t }),
22
+ setSearchQuery: (t) => e((e) => ({
23
+ searchQuery: t,
24
+ conversationFilter: {
25
+ ...e.conversationFilter,
26
+ search: t
27
+ }
28
+ })),
29
+ updateConversationFilter: (t) => e((e) => ({ conversationFilter: {
30
+ ...e.conversationFilter,
31
+ ...t
32
+ } })),
33
+ resetConversationFilter: () => e({
34
+ conversationFilter: t,
35
+ searchQuery: ""
36
+ }),
37
+ setMessageDraft: (t, n) => e((e) => ({ messageDrafts: {
38
+ ...e.messageDrafts,
39
+ [t]: n
40
+ } })),
41
+ clearMessageDraft: (t) => e((e) => {
42
+ let n = { ...e.messageDrafts };
43
+ return delete n[t], { messageDrafts: n };
44
+ }),
45
+ toggleSidebar: () => e((e) => ({ isSidebarOpen: !e.isSidebarOpen })),
46
+ setSidebarOpen: (t) => e({ isSidebarOpen: t }),
47
+ toggleParticipantsPanel: () => e((e) => ({ isParticipantsPanelOpen: !e.isParticipantsPanelOpen })),
48
+ setParticipantsPanelOpen: (t) => e({ isParticipantsPanelOpen: t }),
49
+ setSelectedConversations: (t) => e({ selectedConversations: t }),
50
+ toggleConversationSelection: (t) => e((e) => ({ selectedConversations: e.selectedConversations.some((e) => e.id === t.id) ? e.selectedConversations.filter((e) => e.id !== t.id) : [...e.selectedConversations, t] })),
51
+ clearSelection: () => e({ selectedConversations: [] })
52
+ }));
53
+ //#endregion
54
+ export { n as useConversationsStore };
55
+
56
+ //# sourceMappingURL=conversationsStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversationsStore.js","names":[],"sources":["../../../src/conversations/store/conversationsStore.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport type {\n Conversation,\n ConversationFilter,\n ConversationDisplayMode,\n} from \"../types\";\n\ninterface ConversationsState {\n // View state\n activeConversationId: string | null;\n viewMode: ConversationDisplayMode;\n\n // Search and filters\n searchQuery: string;\n conversationFilter: ConversationFilter;\n\n // Message draft state (per conversation)\n messageDrafts: Record<string, string>;\n\n // UI state\n isSidebarOpen: boolean;\n isParticipantsPanelOpen: boolean;\n\n // Selection state (for bulk operations)\n selectedConversations: Conversation[];\n\n // Actions\n setActiveConversationId: (id: string | null) => void;\n setViewMode: (mode: ConversationDisplayMode) => void;\n setSearchQuery: (query: string) => void;\n updateConversationFilter: (filter: Partial<ConversationFilter>) => void;\n resetConversationFilter: () => void;\n setMessageDraft: (conversationId: string, draft: string) => void;\n clearMessageDraft: (conversationId: string) => void;\n toggleSidebar: () => void;\n setSidebarOpen: (open: boolean) => void;\n toggleParticipantsPanel: () => void;\n setParticipantsPanelOpen: (open: boolean) => void;\n setSelectedConversations: (conversations: Conversation[]) => void;\n toggleConversationSelection: (conversation: Conversation) => void;\n clearSelection: () => void;\n}\n\nconst defaultConversationFilter: ConversationFilter = {\n search: \"\",\n type: \"all\",\n state: \"all\",\n visibility: \"all\",\n hasUnread: undefined,\n isPinned: undefined,\n isMuted: undefined,\n};\n\nexport const useConversationsStore = create<ConversationsState>((set) => ({\n // Initial state\n activeConversationId: null,\n viewMode: \"list\",\n searchQuery: \"\",\n conversationFilter: defaultConversationFilter,\n messageDrafts: {},\n isSidebarOpen: true,\n isParticipantsPanelOpen: false,\n selectedConversations: [],\n\n // Actions\n setActiveConversationId: (id) => set({ activeConversationId: id }),\n setViewMode: (mode) => set({ viewMode: mode }),\n setSearchQuery: (query) =>\n set((state) => ({\n searchQuery: query,\n conversationFilter: { ...state.conversationFilter, search: query },\n })),\n updateConversationFilter: (filter) =>\n set((state) => ({\n conversationFilter: { ...state.conversationFilter, ...filter },\n })),\n resetConversationFilter: () =>\n set({ conversationFilter: defaultConversationFilter, searchQuery: \"\" }),\n setMessageDraft: (conversationId, draft) =>\n set((state) => ({\n messageDrafts: { ...state.messageDrafts, [conversationId]: draft },\n })),\n clearMessageDraft: (conversationId) =>\n set((state) => {\n const drafts = { ...state.messageDrafts };\n delete drafts[conversationId];\n return { messageDrafts: drafts };\n }),\n toggleSidebar: () =>\n set((state) => ({ isSidebarOpen: !state.isSidebarOpen })),\n setSidebarOpen: (open) => set({ isSidebarOpen: open }),\n toggleParticipantsPanel: () =>\n set((state) => ({\n isParticipantsPanelOpen: !state.isParticipantsPanelOpen,\n })),\n setParticipantsPanelOpen: (open) => set({ isParticipantsPanelOpen: open }),\n setSelectedConversations: (conversations) =>\n set({ selectedConversations: conversations }),\n toggleConversationSelection: (conversation) =>\n set((state) => {\n const isSelected = state.selectedConversations.some(\n (c) => c.id === conversation.id,\n );\n return {\n selectedConversations: isSelected\n ? state.selectedConversations.filter((c) => c.id !== conversation.id)\n : [...state.selectedConversations, conversation],\n };\n }),\n clearSelection: () => set({ selectedConversations: [] }),\n}));\n"],"mappings":";;AA2CA,IAAM,IAAgD;CACpD,QAAQ;CACR,MAAM;CACN,OAAO;CACP,YAAY;CACZ,WAAW,KAAA;CACX,UAAU,KAAA;CACV,SAAS,KAAA;CACV,EAEY,IAAwB,GAA4B,OAAS;CAExE,sBAAsB;CACtB,UAAU;CACV,aAAa;CACb,oBAAoB;CACpB,eAAe,EAAE;CACjB,eAAe;CACf,yBAAyB;CACzB,uBAAuB,EAAE;CAGzB,0BAA0B,MAAO,EAAI,EAAE,sBAAsB,GAAI,CAAC;CAClE,cAAc,MAAS,EAAI,EAAE,UAAU,GAAM,CAAC;CAC9C,iBAAiB,MACf,GAAK,OAAW;EACd,aAAa;EACb,oBAAoB;GAAE,GAAG,EAAM;GAAoB,QAAQ;GAAO;EACnE,EAAE;CACL,2BAA2B,MACzB,GAAK,OAAW,EACd,oBAAoB;EAAE,GAAG,EAAM;EAAoB,GAAG;EAAQ,EAC/D,EAAE;CACL,+BACE,EAAI;EAAE,oBAAoB;EAA2B,aAAa;EAAI,CAAC;CACzE,kBAAkB,GAAgB,MAChC,GAAK,OAAW,EACd,eAAe;EAAE,GAAG,EAAM;GAAgB,IAAiB;EAAO,EACnE,EAAE;CACL,oBAAoB,MAClB,GAAK,MAAU;EACb,IAAM,IAAS,EAAE,GAAG,EAAM,eAAe;AAEzC,SADA,OAAO,EAAO,IACP,EAAE,eAAe,GAAQ;GAChC;CACJ,qBACE,GAAK,OAAW,EAAE,eAAe,CAAC,EAAM,eAAe,EAAE;CAC3D,iBAAiB,MAAS,EAAI,EAAE,eAAe,GAAM,CAAC;CACtD,+BACE,GAAK,OAAW,EACd,yBAAyB,CAAC,EAAM,yBACjC,EAAE;CACL,2BAA2B,MAAS,EAAI,EAAE,yBAAyB,GAAM,CAAC;CAC1E,2BAA2B,MACzB,EAAI,EAAE,uBAAuB,GAAe,CAAC;CAC/C,8BAA8B,MAC5B,GAAK,OAII,EACL,uBAJiB,EAAM,sBAAsB,MAC5C,MAAM,EAAE,OAAO,EAAa,GAC9B,GAGK,EAAM,sBAAsB,QAAQ,MAAM,EAAE,OAAO,EAAa,GAAG,GACnE,CAAC,GAAG,EAAM,uBAAuB,EAAa,EACnD,EACD;CACJ,sBAAsB,EAAI,EAAE,uBAAuB,EAAE,EAAE,CAAC;CACzD,EAAE"}
@@ -0,0 +1,352 @@
1
+ /**
2
+ * Navigation item for shell integration
3
+ */
4
+ export interface NavItem {
5
+ id: string;
6
+ label: string;
7
+ path: string;
8
+ icon?: React.ReactNode;
9
+ badge?: number;
10
+ order?: number;
11
+ group?: string;
12
+ visible?: boolean;
13
+ /** Nested children items for dropdown menus */
14
+ children?: NavItem[];
15
+ }
16
+ /**
17
+ * Footer item for shell integration
18
+ */
19
+ export interface FooterItem {
20
+ id: string;
21
+ label: string;
22
+ type: "status" | "action";
23
+ order?: number;
24
+ section: "left" | "center" | "right";
25
+ }
26
+ /**
27
+ * Base microfrontend root props.
28
+ */
29
+ export interface MicrofrontendRootProps {
30
+ }
31
+ /**
32
+ * Props for the ConversationsRoot component
33
+ */
34
+ export interface ConversationsRootProps extends MicrofrontendRootProps {
35
+ /**
36
+ * Base path for the conversations microfrontend
37
+ */
38
+ basePath?: string;
39
+ /**
40
+ * Workspace ID for scoping operations
41
+ */
42
+ workspaceId?: string;
43
+ /**
44
+ * API Gateway URL for GraphQL requests
45
+ */
46
+ apiGatewayUrl?: string;
47
+ /**
48
+ * Authentication token for API requests (platform identity JWT)
49
+ */
50
+ authToken?: string;
51
+ /**
52
+ * Workspace token for workspace-scoped API requests (workspace access JWT).
53
+ * The gateway requires both authToken (Authorization) and workspaceToken
54
+ * (X-Workspace-Authorization) for workspace operations.
55
+ */
56
+ workspaceToken?: string;
57
+ /**
58
+ * Optional token refresh callback provided by the shell.
59
+ */
60
+ getWorkspaceToken?: () => Promise<string | null>;
61
+ /**
62
+ * Navigation function provided by the shell
63
+ */
64
+ navigate?: (path: string) => void;
65
+ /**
66
+ * Current user information
67
+ */
68
+ currentUser?: {
69
+ id: string;
70
+ email: string;
71
+ firstName?: string;
72
+ lastName?: string;
73
+ avatarUrl?: string;
74
+ };
75
+ /**
76
+ * Optional callback when a conversation is selected
77
+ */
78
+ onConversationSelect?: (conversation: Conversation) => void;
79
+ /**
80
+ * Optional callback when a message is sent
81
+ */
82
+ onMessageSend?: (message: Message, conversationId: string) => void;
83
+ /**
84
+ * Optional default view to show
85
+ */
86
+ defaultView?: ConversationsView;
87
+ /**
88
+ * Optional function to register navigation items with the shell
89
+ * Injected by the shell app
90
+ */
91
+ registerNavItems?: (items: NavItem | NavItem[]) => () => void;
92
+ /**
93
+ * Optional function to register footer items with the shell
94
+ * Injected by the shell app
95
+ */
96
+ registerFooterItems?: (items: FooterItem | FooterItem[]) => () => void;
97
+ /**
98
+ * Which variant of the conversations UI is active.
99
+ *
100
+ * **Set by the Root component that is mounted** — host apps must not
101
+ * set this directly; any host-passed value is ignored because the
102
+ * Root component always overrides it before passing to the provider:
103
+ * - `ConversationsUserRoot` -> `"user"`
104
+ * - `ConversationsAdminRoot` -> `"admin"`
105
+ * - Legacy `ConversationsRoot` leaves this undefined (behaves as user).
106
+ *
107
+ * Consumers can branch on this inside the provider/context if needed.
108
+ */
109
+ variant?: "user" | "admin";
110
+ }
111
+ /**
112
+ * Conversation entity
113
+ */
114
+ export interface Conversation {
115
+ id: string;
116
+ title: string;
117
+ description?: string;
118
+ avatar?: string;
119
+ settings?: Record<string, unknown>;
120
+ sourceContext?: {
121
+ product?: string;
122
+ pagePath: string;
123
+ contextHref: string;
124
+ contextTitle?: string;
125
+ entityType?: string;
126
+ entityId?: string;
127
+ activeTab?: string;
128
+ };
129
+ type: ConversationType;
130
+ state: ConversationState;
131
+ visibility: ConversationVisibility;
132
+ isGroup: boolean;
133
+ memberCount: number;
134
+ unreadCount: number;
135
+ mentionCount: number;
136
+ lastMessage?: Message;
137
+ isPinned: boolean;
138
+ isMuted: boolean;
139
+ features: ConversationFeatures;
140
+ createdBy: {
141
+ id: string;
142
+ name: string;
143
+ };
144
+ createdAt: string;
145
+ updatedAt: string;
146
+ }
147
+ /**
148
+ * Conversation features configuration
149
+ */
150
+ export interface ConversationFeatures {
151
+ threads: boolean;
152
+ reactions: boolean;
153
+ mentions: boolean;
154
+ calls: boolean;
155
+ apps: boolean;
156
+ polls: boolean;
157
+ anonymousMode: boolean;
158
+ screenShare: boolean;
159
+ recording: boolean;
160
+ }
161
+ /**
162
+ * Conversation membership
163
+ */
164
+ export interface ConversationMembership {
165
+ id: string;
166
+ conversationId: string;
167
+ userId: string;
168
+ role: ParticipantRole;
169
+ status: MembershipStatus;
170
+ unreadCount: number;
171
+ mentionCount: number;
172
+ notificationLevel: NotificationLevel;
173
+ isMuted: boolean;
174
+ isPinned: boolean;
175
+ canSendMessages: boolean;
176
+ canAddMembers: boolean;
177
+ canRemoveMembers: boolean;
178
+ joinedAt: string;
179
+ lastReadAt?: string;
180
+ }
181
+ /**
182
+ * Conversation participant (display-friendly)
183
+ */
184
+ export interface Participant {
185
+ id: string;
186
+ userId: string;
187
+ name: string;
188
+ avatarUrl?: string;
189
+ role: ParticipantRole;
190
+ status: PresenceStatus;
191
+ joinedAt: string;
192
+ lastSeenAt?: string;
193
+ }
194
+ /**
195
+ * Message entity
196
+ */
197
+ export interface Message {
198
+ id: string;
199
+ conversationId: string;
200
+ type: MessageType;
201
+ status: MessageStatus;
202
+ content: string;
203
+ authorId: string;
204
+ authorType: string;
205
+ isAnonymous: boolean;
206
+ sender: {
207
+ id: string;
208
+ name: string;
209
+ avatarUrl?: string;
210
+ };
211
+ parentMessageId?: string;
212
+ threadRootId?: string;
213
+ threadLevel: number;
214
+ replyCount: number;
215
+ isEdited: boolean;
216
+ editedAt?: string;
217
+ isPinned: boolean;
218
+ reactions: Reaction[];
219
+ mentions: Mention[];
220
+ attachments: Attachment[];
221
+ permissions: MessagePermissions;
222
+ createdAt: string;
223
+ updatedAt: string;
224
+ }
225
+ /**
226
+ * Message reaction
227
+ */
228
+ export interface Reaction {
229
+ id: string;
230
+ emoji: string;
231
+ count: number;
232
+ users: Array<{
233
+ id: string;
234
+ name: string;
235
+ }>;
236
+ currentUserReacted: boolean;
237
+ }
238
+ /**
239
+ * Message mention
240
+ */
241
+ export interface Mention {
242
+ id: string;
243
+ mentionedUser?: string;
244
+ mentionType: MentionType;
245
+ offset: number;
246
+ length: number;
247
+ }
248
+ /**
249
+ * Message attachment
250
+ */
251
+ export interface Attachment {
252
+ id: string;
253
+ fileId: string;
254
+ fileName: string;
255
+ fileSize: number;
256
+ mimeType: string;
257
+ downloadUrl?: string;
258
+ width?: number;
259
+ height?: number;
260
+ duration?: number;
261
+ thumbnail?: string;
262
+ }
263
+ /**
264
+ * Message permissions for current user
265
+ */
266
+ export interface MessagePermissions {
267
+ canEdit: boolean;
268
+ canDelete: boolean;
269
+ canReact: boolean;
270
+ canReply: boolean;
271
+ canPin: boolean;
272
+ canHide: boolean;
273
+ canReport: boolean;
274
+ }
275
+ /**
276
+ * Conversation filter options
277
+ */
278
+ export interface ConversationFilter {
279
+ search: string;
280
+ type: ConversationType | "all";
281
+ state: ConversationState | "all";
282
+ visibility: ConversationVisibility | "all";
283
+ hasUnread: boolean | undefined;
284
+ isPinned: boolean | undefined;
285
+ isMuted: boolean | undefined;
286
+ }
287
+ /**
288
+ * Message filter options
289
+ */
290
+ export interface MessageFilter {
291
+ types?: MessageType[];
292
+ authorIds?: string[];
293
+ hasAttachments?: boolean;
294
+ hasMentions?: boolean;
295
+ isUnread?: boolean;
296
+ isPinned?: boolean;
297
+ fromDate?: string;
298
+ toDate?: string;
299
+ }
300
+ /**
301
+ * Conversation type
302
+ */
303
+ export type ConversationType = "DIRECT" | "GROUP" | "CHANNEL" | "BROADCAST" | "SUPPORT" | "ANNOUNCEMENT" | "BOT";
304
+ /**
305
+ * Conversation state
306
+ */
307
+ export type ConversationState = "ACTIVE" | "ARCHIVED" | "DELETED";
308
+ /**
309
+ * Conversation visibility
310
+ */
311
+ export type ConversationVisibility = "PUBLIC" | "PRIVATE" | "PROTECTED";
312
+ /**
313
+ * Message type
314
+ */
315
+ export type MessageType = "TEXT" | "FILE" | "IMAGE" | "VIDEO" | "AUDIO" | "SYSTEM" | "POLL";
316
+ /**
317
+ * Message status
318
+ */
319
+ export type MessageStatus = "SENDING" | "SENT" | "DELIVERED" | "READ" | "FAILED" | "DELETED";
320
+ /**
321
+ * Participant role
322
+ */
323
+ export type ParticipantRole = "OWNER" | "ADMIN" | "MODERATOR" | "MEMBER" | "GUEST" | "OBSERVER";
324
+ /**
325
+ * Membership status
326
+ */
327
+ export type MembershipStatus = "ACTIVE" | "INVITED" | "LEFT" | "REMOVED" | "BANNED";
328
+ /**
329
+ * Notification level
330
+ */
331
+ export type NotificationLevel = "ALL" | "MENTIONS" | "DIRECT" | "NONE";
332
+ /**
333
+ * Mention type
334
+ */
335
+ export type MentionType = "USER" | "ALL" | "HERE" | "ROLE";
336
+ /**
337
+ * Presence status
338
+ */
339
+ export type PresenceStatus = "ONLINE" | "OFFLINE" | "AWAY" | "DO_NOT_DISTURB";
340
+ /**
341
+ * Call type
342
+ */
343
+ export type CallType = "AUDIO" | "VIDEO" | "SCREEN_SHARE" | "SCREEN_SHARE_WITH_CONTROL";
344
+ /**
345
+ * View mode for the conversations UI
346
+ */
347
+ export type ConversationsView = "inbox" | "channels" | "directs" | "threads" | "archived" | "settings";
348
+ /**
349
+ * View mode for conversation list display
350
+ */
351
+ export type ConversationDisplayMode = "list" | "grid" | "compact";
352
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/conversations/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { ClassValue } from 'clsx';
2
+
3
+ /**
4
+ * Utility function to merge Tailwind CSS classes
5
+ * Combines clsx for conditional classes and tailwind-merge for deduplication
6
+ */
7
+ export declare function cn(...inputs: ClassValue[]): string;
8
+ //# sourceMappingURL=cn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cn.d.ts","sourceRoot":"","sources":["../../../src/conversations/utils/cn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAQ,MAAM,MAAM,CAAC;AAG7C;;;GAGG;AACH,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC"}
@@ -0,0 +1,10 @@
1
+ import e from "../../node_modules/clsx/dist/clsx.js";
2
+ import { twMerge as t } from "../../node_modules/tailwind-merge/dist/bundle-mjs.js";
3
+ //#region src/conversations/utils/cn.ts
4
+ function n(...n) {
5
+ return t(e(n));
6
+ }
7
+ //#endregion
8
+ export { n as cn };
9
+
10
+ //# sourceMappingURL=cn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cn.js","names":[],"sources":["../../../src/conversations/utils/cn.ts"],"sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Utility function to merge Tailwind CSS classes\n * Combines clsx for conditional classes and tailwind-merge for deduplication\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"],"mappings":";;;AAOA,SAAgB,EAAG,GAAG,GAAsB;AAC1C,QAAO,EAAQ,EAAK,EAAO,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Stable translate helper used throughout the conversations MFE.
3
+ *
4
+ * Wraps the shell's `useI18n().t()` with a two-argument signature that
5
+ * returns the English `fallback` when the translation key is not
6
+ * resolved. Memoises around `t` so the returned function is referentially
7
+ * stable across renders — safe to list in `useMemo` / `useEffect` dep
8
+ * arrays without triggering churn on every render.
9
+ *
10
+ * @example
11
+ * const tr = useTr();
12
+ * const label = tr("conversations.inbox", "Inbox");
13
+ */
14
+ export declare function useTr(): (key: string, fallback: string) => string;
15
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../../src/conversations/utils/i18n.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;GAYG;AACH,wBAAgB,KAAK,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CASjE"}
@@ -0,0 +1,14 @@
1
+ import { useCallback as e } from "react";
2
+ import { useI18n as t } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
3
+ //#region src/conversations/utils/i18n.ts
4
+ function n() {
5
+ let { t: n } = t();
6
+ return e((e, t) => {
7
+ let r = n(e);
8
+ return r === e ? t : r;
9
+ }, [n]);
10
+ }
11
+ //#endregion
12
+ export { n as useTr };
13
+
14
+ //# sourceMappingURL=i18n.js.map