@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.
- package/README.md +12 -0
- package/dist/__tests__/setup.d.ts +2 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/conversations/ConversationsAdminRoot.d.ts +19 -0
- package/dist/conversations/ConversationsAdminRoot.d.ts.map +1 -0
- package/dist/conversations/ConversationsAdminRoot.js +104 -0
- package/dist/conversations/ConversationsAdminRoot.js.map +1 -0
- package/dist/conversations/ConversationsAdminRoutes.d.ts +18 -0
- package/dist/conversations/ConversationsAdminRoutes.d.ts.map +1 -0
- package/dist/conversations/ConversationsAdminRoutes.js +42 -0
- package/dist/conversations/ConversationsAdminRoutes.js.map +1 -0
- package/dist/conversations/ConversationsRoot.d.ts +33 -0
- package/dist/conversations/ConversationsRoot.d.ts.map +1 -0
- package/dist/conversations/ConversationsRoot.js +100 -0
- package/dist/conversations/ConversationsRoot.js.map +1 -0
- package/dist/conversations/ConversationsUserRoot.d.ts +17 -0
- package/dist/conversations/ConversationsUserRoot.d.ts.map +1 -0
- package/dist/conversations/ConversationsUserRoot.js +101 -0
- package/dist/conversations/ConversationsUserRoot.js.map +1 -0
- package/dist/conversations/ConversationsUserRoutes.d.ts +12 -0
- package/dist/conversations/ConversationsUserRoutes.d.ts.map +1 -0
- package/dist/conversations/ConversationsUserRoutes.js +45 -0
- package/dist/conversations/ConversationsUserRoutes.js.map +1 -0
- package/dist/conversations/components/ConversationCard.d.ts +14 -0
- package/dist/conversations/components/ConversationCard.d.ts.map +1 -0
- package/dist/conversations/components/ConversationCard.js +118 -0
- package/dist/conversations/components/ConversationCard.js.map +1 -0
- package/dist/conversations/components/LazyPageBoundary.d.ts +25 -0
- package/dist/conversations/components/LazyPageBoundary.d.ts.map +1 -0
- package/dist/conversations/components/LazyPageBoundary.js +144 -0
- package/dist/conversations/components/LazyPageBoundary.js.map +1 -0
- package/dist/conversations/components/MessageBubble.d.ts +21 -0
- package/dist/conversations/components/MessageBubble.d.ts.map +1 -0
- package/dist/conversations/components/MessageBubble.js +242 -0
- package/dist/conversations/components/MessageBubble.js.map +1 -0
- package/dist/conversations/components/PageLayout.d.ts +55 -0
- package/dist/conversations/components/PageLayout.d.ts.map +1 -0
- package/dist/conversations/components/PageLayout.js +93 -0
- package/dist/conversations/components/PageLayout.js.map +1 -0
- package/dist/conversations/components/PermissionGuard.d.ts +21 -0
- package/dist/conversations/components/PermissionGuard.d.ts.map +1 -0
- package/dist/conversations/components/PermissionGuard.js +25 -0
- package/dist/conversations/components/PermissionGuard.js.map +1 -0
- package/dist/conversations/constants/featureFlags.d.ts +8 -0
- package/dist/conversations/constants/featureFlags.d.ts.map +1 -0
- package/dist/conversations/constants/featureFlags.js +12 -0
- package/dist/conversations/constants/featureFlags.js.map +1 -0
- package/dist/conversations/constants/permissions.d.ts +174 -0
- package/dist/conversations/constants/permissions.d.ts.map +1 -0
- package/dist/conversations/constants/permissions.js +68 -0
- package/dist/conversations/constants/permissions.js.map +1 -0
- package/dist/conversations/hooks/useAdminFeatureFlags.d.ts +8 -0
- package/dist/conversations/hooks/useAdminFeatureFlags.d.ts.map +1 -0
- package/dist/conversations/hooks/useAdminFeatureFlags.js +16 -0
- package/dist/conversations/hooks/useAdminFeatureFlags.js.map +1 -0
- package/dist/conversations/hooks/useConversationQueries.d.ts +83 -0
- package/dist/conversations/hooks/useConversationQueries.d.ts.map +1 -0
- package/dist/conversations/hooks/useConversationQueries.js +136 -0
- package/dist/conversations/hooks/useConversationQueries.js.map +1 -0
- package/dist/conversations/hooks/useExportConversation.d.ts +10 -0
- package/dist/conversations/hooks/useExportConversation.d.ts.map +1 -0
- package/dist/conversations/hooks/useExportConversation.js +41 -0
- package/dist/conversations/hooks/useExportConversation.js.map +1 -0
- package/dist/conversations/hooks/useMessageQueries.d.ts +84 -0
- package/dist/conversations/hooks/useMessageQueries.d.ts.map +1 -0
- package/dist/conversations/hooks/useMessageQueries.js +123 -0
- package/dist/conversations/hooks/useMessageQueries.js.map +1 -0
- package/dist/conversations/hooks/useMessageSubscriptions.d.ts +24 -0
- package/dist/conversations/hooks/useMessageSubscriptions.d.ts.map +1 -0
- package/dist/conversations/hooks/useMessageSubscriptions.js +90 -0
- package/dist/conversations/hooks/useMessageSubscriptions.js.map +1 -0
- package/dist/conversations/hooks/useUserFeatureFlags.d.ts +5 -0
- package/dist/conversations/hooks/useUserFeatureFlags.d.ts.map +1 -0
- package/dist/conversations/hooks/useUserFeatureFlags.js +10 -0
- package/dist/conversations/hooks/useUserFeatureFlags.js.map +1 -0
- package/dist/conversations/index.d.ts +31 -0
- package/dist/conversations/index.d.ts.map +1 -0
- package/dist/conversations/index.js +5 -0
- package/dist/conversations/pages/AdminConversationsLandingPage.d.ts +9 -0
- package/dist/conversations/pages/AdminConversationsLandingPage.d.ts.map +1 -0
- package/dist/conversations/pages/AdminConversationsLandingPage.js +117 -0
- package/dist/conversations/pages/AdminConversationsLandingPage.js.map +1 -0
- package/dist/conversations/pages/ConversationAdminPages.d.ts +5 -0
- package/dist/conversations/pages/ConversationAdminPages.d.ts.map +1 -0
- package/dist/conversations/pages/ConversationAdminPages.js +573 -0
- package/dist/conversations/pages/ConversationAdminPages.js.map +1 -0
- package/dist/conversations/pages/ConversationDetailPage.d.ts +2 -0
- package/dist/conversations/pages/ConversationDetailPage.d.ts.map +1 -0
- package/dist/conversations/pages/ConversationDetailPage.js +439 -0
- package/dist/conversations/pages/ConversationDetailPage.js.map +1 -0
- package/dist/conversations/pages/ConversationListPage.d.ts +6 -0
- package/dist/conversations/pages/ConversationListPage.d.ts.map +1 -0
- package/dist/conversations/pages/ConversationListPage.js +269 -0
- package/dist/conversations/pages/ConversationListPage.js.map +1 -0
- package/dist/conversations/pages/ConversationsLandingPage.d.ts +9 -0
- package/dist/conversations/pages/ConversationsLandingPage.d.ts.map +1 -0
- package/dist/conversations/pages/ConversationsLandingPage.js +124 -0
- package/dist/conversations/pages/ConversationsLandingPage.js.map +1 -0
- package/dist/conversations/pages/ConversationsSettingsPage.d.ts +2 -0
- package/dist/conversations/pages/ConversationsSettingsPage.d.ts.map +1 -0
- package/dist/conversations/pages/ConversationsSettingsPage.js +215 -0
- package/dist/conversations/pages/ConversationsSettingsPage.js.map +1 -0
- package/dist/conversations/pages/NewConversationPage.d.ts +2 -0
- package/dist/conversations/pages/NewConversationPage.d.ts.map +1 -0
- package/dist/conversations/pages/NewConversationPage.js +287 -0
- package/dist/conversations/pages/NewConversationPage.js.map +1 -0
- package/dist/conversations/providers/ConversationsProvider.d.ts +13 -0
- package/dist/conversations/providers/ConversationsProvider.d.ts.map +1 -0
- package/dist/conversations/providers/ConversationsProvider.js +109 -0
- package/dist/conversations/providers/ConversationsProvider.js.map +1 -0
- package/dist/conversations/store/conversationsStore.d.ts +29 -0
- package/dist/conversations/store/conversationsStore.d.ts.map +1 -0
- package/dist/conversations/store/conversationsStore.js +56 -0
- package/dist/conversations/store/conversationsStore.js.map +1 -0
- package/dist/conversations/types/index.d.ts +352 -0
- package/dist/conversations/types/index.d.ts.map +1 -0
- package/dist/conversations/utils/cn.d.ts +8 -0
- package/dist/conversations/utils/cn.d.ts.map +1 -0
- package/dist/conversations/utils/cn.js +10 -0
- package/dist/conversations/utils/cn.js.map +1 -0
- package/dist/conversations/utils/i18n.d.ts +15 -0
- package/dist/conversations/utils/i18n.d.ts.map +1 -0
- package/dist/conversations/utils/i18n.js +14 -0
- package/dist/conversations/utils/i18n.js.map +1 -0
- package/dist/conversations/utils/mappers.d.ts +32 -0
- package/dist/conversations/utils/mappers.d.ts.map +1 -0
- package/dist/conversations/utils/mappers.js +164 -0
- package/dist/conversations/utils/mappers.js.map +1 -0
- package/dist/conversations/utils/navigation.d.ts +18 -0
- package/dist/conversations/utils/navigation.d.ts.map +1 -0
- package/dist/conversations/utils/navigation.js +8 -0
- package/dist/conversations/utils/navigation.js.map +1 -0
- package/dist/dev/main.d.ts +2 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/generated/global-operations.d.ts +2 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-types.d.ts +20716 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/wspace-operations.d.ts +2008 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-operations.js +997 -0
- package/dist/generated/wspace-operations.js.map +1 -0
- package/dist/generated/wspace-types.d.ts +53363 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/node_modules/clsx/dist/clsx.js +18 -0
- package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1674 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/dist/utils/nativeBridge.d.ts +3 -0
- package/dist/utils/nativeBridge.d.ts.map +1 -0
- package/dist/utils/nativeBridge.js +2 -0
- 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
|