@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,16 @@
|
|
|
1
|
+
import { CONVERSATIONS_FLAGS as e } from "../constants/featureFlags.js";
|
|
2
|
+
import { useFeatureFlagDetails as t } from "@burdenoff/fe-libs/shared/feature-flags";
|
|
3
|
+
//#region src/conversations/hooks/useAdminFeatureFlags.ts
|
|
4
|
+
function n() {
|
|
5
|
+
let n = t(e.MODERATION), r = t(e.BULK_OPERATIONS), i = t(e.AUDIT_LOG), a = t(e.APP_INSTALLATIONS);
|
|
6
|
+
return {
|
|
7
|
+
moderationEnabled: n?.value === !0,
|
|
8
|
+
bulkEnabled: r?.value === !0,
|
|
9
|
+
auditEnabled: i?.value === !0,
|
|
10
|
+
appsEnabled: a?.value === !0
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
export { n as useAdminFeatureFlags };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=useAdminFeatureFlags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAdminFeatureFlags.js","names":[],"sources":["../../../src/conversations/hooks/useAdminFeatureFlags.ts"],"sourcesContent":["import { useFeatureFlagDetails } from \"@burdenoff/fe-libs/shared/feature-flags\";\nimport { CONVERSATIONS_FLAGS } from \"../constants/featureFlags\";\n\nexport interface AdminFeatureFlags {\n moderationEnabled: boolean;\n bulkEnabled: boolean;\n auditEnabled: boolean;\n appsEnabled: boolean;\n}\n\nexport function useAdminFeatureFlags(): AdminFeatureFlags {\n const moderation = useFeatureFlagDetails(CONVERSATIONS_FLAGS.MODERATION);\n const bulk = useFeatureFlagDetails(CONVERSATIONS_FLAGS.BULK_OPERATIONS);\n const audit = useFeatureFlagDetails(CONVERSATIONS_FLAGS.AUDIT_LOG);\n const apps = useFeatureFlagDetails(CONVERSATIONS_FLAGS.APP_INSTALLATIONS);\n\n // `value === true` — FlagValue is boolean|string|number|object, so `Boolean(\"false\")` would be truthy.\n return {\n moderationEnabled: moderation?.value === true,\n bulkEnabled: bulk?.value === true,\n auditEnabled: audit?.value === true,\n appsEnabled: apps?.value === true,\n };\n}\n"],"mappings":";;;AAUA,SAAgB,IAA0C;CACxD,IAAM,IAAa,EAAsB,EAAoB,WAAW,EAClE,IAAO,EAAsB,EAAoB,gBAAgB,EACjE,IAAQ,EAAsB,EAAoB,UAAU,EAC5D,IAAO,EAAsB,EAAoB,kBAAkB;AAGzE,QAAO;EACL,mBAAmB,GAAY,UAAU;EACzC,aAAa,GAAM,UAAU;EAC7B,cAAc,GAAO,UAAU;EAC/B,aAAa,GAAM,UAAU;EAC9B"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Conversation, ConversationType, ConversationVisibility } from '../types';
|
|
2
|
+
|
|
3
|
+
interface UseGetConversationsOptions {
|
|
4
|
+
first?: number;
|
|
5
|
+
after?: string;
|
|
6
|
+
types?: ConversationType[];
|
|
7
|
+
hasUnread?: boolean;
|
|
8
|
+
isPinned?: boolean;
|
|
9
|
+
}
|
|
10
|
+
interface UseGetConversationsResult {
|
|
11
|
+
conversations: Conversation[];
|
|
12
|
+
loading: boolean;
|
|
13
|
+
error: Error | null;
|
|
14
|
+
hasNextPage: boolean;
|
|
15
|
+
fetchMore: () => void;
|
|
16
|
+
refetch: () => void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Hook: Fetch a paginated list of conversations.
|
|
20
|
+
*/
|
|
21
|
+
export declare function useGetConversations(options?: UseGetConversationsOptions): UseGetConversationsResult;
|
|
22
|
+
interface UseGetConversationResult {
|
|
23
|
+
conversation: Conversation | null;
|
|
24
|
+
loading: boolean;
|
|
25
|
+
error: Error | null;
|
|
26
|
+
refetch: () => void;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Hook: Fetch a single conversation by ID.
|
|
30
|
+
*/
|
|
31
|
+
export declare function useGetConversation(conversationId: string): UseGetConversationResult;
|
|
32
|
+
interface UseSearchConversationsResult {
|
|
33
|
+
conversations: Conversation[];
|
|
34
|
+
loading: boolean;
|
|
35
|
+
error: Error | null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Hook: Search conversations by query string.
|
|
39
|
+
*/
|
|
40
|
+
export declare function useSearchConversations(query: string): UseSearchConversationsResult;
|
|
41
|
+
interface CreateConversationInput {
|
|
42
|
+
type: ConversationType;
|
|
43
|
+
title?: string;
|
|
44
|
+
description?: string;
|
|
45
|
+
participantIds: string[];
|
|
46
|
+
visibility?: ConversationVisibility;
|
|
47
|
+
}
|
|
48
|
+
interface UseCreateConversationResult {
|
|
49
|
+
createConversation: (input: CreateConversationInput) => Promise<Conversation | null>;
|
|
50
|
+
loading: boolean;
|
|
51
|
+
error: Error | null;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Hook: Create a new conversation.
|
|
55
|
+
*/
|
|
56
|
+
export declare function useCreateConversation(): UseCreateConversationResult;
|
|
57
|
+
interface UseUpdateConversationResult {
|
|
58
|
+
archiveConversation: (id: string) => Promise<boolean>;
|
|
59
|
+
pinConversation: (id: string) => Promise<boolean>;
|
|
60
|
+
unpinConversation: (id: string) => Promise<boolean>;
|
|
61
|
+
muteConversation: (id: string) => Promise<boolean>;
|
|
62
|
+
unmuteConversation: (id: string) => Promise<boolean>;
|
|
63
|
+
loading: boolean;
|
|
64
|
+
error: Error | null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Hook: Conversation mutation operations.
|
|
68
|
+
*/
|
|
69
|
+
export declare function useConversationActions(): UseUpdateConversationResult;
|
|
70
|
+
interface UseUpdateConversationOptions {
|
|
71
|
+
updateConversation: (input: {
|
|
72
|
+
id: string;
|
|
73
|
+
title?: string;
|
|
74
|
+
description?: string;
|
|
75
|
+
avatarUrl?: string;
|
|
76
|
+
settings?: Record<string, unknown>;
|
|
77
|
+
}) => Promise<Conversation | null>;
|
|
78
|
+
loading: boolean;
|
|
79
|
+
error: Error | null;
|
|
80
|
+
}
|
|
81
|
+
export declare function useUpdateConversation(): UseUpdateConversationOptions;
|
|
82
|
+
export {};
|
|
83
|
+
//# sourceMappingURL=useConversationQueries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useConversationQueries.d.ts","sourceRoot":"","sources":["../../../src/conversations/hooks/useConversationQueries.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { useConversations as e } from "../providers/ConversationsProvider.js";
|
|
2
|
+
import { useArchiveConversationMutation as t, useCreateConversationMutation as n, useGetConversationQuery as r, useGetConversationsQuery as i, useMuteConversationMutation as a, usePinConversationMutation as o, useSearchConversationsQuery as s, useUnmuteConversationMutation as c, useUnpinConversationMutation as l, useUpdateConversationByHookMutation as u } from "../../generated/wspace-operations.js";
|
|
3
|
+
import { mapConversation as d } from "../utils/mappers.js";
|
|
4
|
+
import { useCallback as f, useMemo as p } from "react";
|
|
5
|
+
//#region src/conversations/hooks/useConversationQueries.ts
|
|
6
|
+
function m(t) {
|
|
7
|
+
let { workspaceId: n } = e(), r = i({
|
|
8
|
+
variables: {
|
|
9
|
+
first: t?.first ?? 25,
|
|
10
|
+
after: t?.after,
|
|
11
|
+
filter: {
|
|
12
|
+
types: t?.types,
|
|
13
|
+
hasUnread: t?.hasUnread,
|
|
14
|
+
isPinned: t?.isPinned
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
skip: !n
|
|
18
|
+
}), a = p(() => r.data?.conversations.edges.map((e) => d(e.node)) ?? [], [r.data]), o = r.data?.conversations.pageInfo.hasNextPage ?? !1;
|
|
19
|
+
return {
|
|
20
|
+
conversations: a,
|
|
21
|
+
loading: r.loading,
|
|
22
|
+
error: r.error ?? null,
|
|
23
|
+
hasNextPage: o,
|
|
24
|
+
fetchMore: () => {
|
|
25
|
+
let e = r.data?.conversations.pageInfo.endCursor;
|
|
26
|
+
!e || !o || r.fetchMore({ variables: {
|
|
27
|
+
first: t?.first ?? 25,
|
|
28
|
+
after: e,
|
|
29
|
+
filter: {
|
|
30
|
+
types: t?.types,
|
|
31
|
+
hasUnread: t?.hasUnread,
|
|
32
|
+
isPinned: t?.isPinned
|
|
33
|
+
}
|
|
34
|
+
} });
|
|
35
|
+
},
|
|
36
|
+
refetch: () => {
|
|
37
|
+
r.refetch();
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function h(t) {
|
|
42
|
+
let { workspaceId: n } = e(), i = r({
|
|
43
|
+
variables: { id: t },
|
|
44
|
+
skip: !n || !t
|
|
45
|
+
});
|
|
46
|
+
return {
|
|
47
|
+
conversation: i.data?.conversation ? d(i.data.conversation) : null,
|
|
48
|
+
loading: i.loading,
|
|
49
|
+
error: i.error ?? null,
|
|
50
|
+
refetch: () => {
|
|
51
|
+
i.refetch();
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function g(t) {
|
|
56
|
+
let { workspaceId: n } = e(), r = t.trim(), i = s({
|
|
57
|
+
variables: {
|
|
58
|
+
query: r,
|
|
59
|
+
first: 25
|
|
60
|
+
},
|
|
61
|
+
skip: !n || !r
|
|
62
|
+
});
|
|
63
|
+
return {
|
|
64
|
+
conversations: i.data?.searchConversations.edges.map((e) => d(e.node)) ?? [],
|
|
65
|
+
loading: i.loading,
|
|
66
|
+
error: i.error ?? null
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function _() {
|
|
70
|
+
let { workspaceId: t } = e(), [r, i] = n();
|
|
71
|
+
return {
|
|
72
|
+
createConversation: f(async (e) => {
|
|
73
|
+
if (!t) throw Error("Workspace context is required to create a conversation");
|
|
74
|
+
try {
|
|
75
|
+
let { data: n } = await r({ variables: { input: {
|
|
76
|
+
workspaceId: t,
|
|
77
|
+
type: e.type,
|
|
78
|
+
title: e.title,
|
|
79
|
+
description: e.description,
|
|
80
|
+
participantIds: e.participantIds
|
|
81
|
+
} } }), i = n?.createConversation.conversation;
|
|
82
|
+
return i ? d(i) : null;
|
|
83
|
+
} catch (e) {
|
|
84
|
+
throw e instanceof Error ? e : /* @__PURE__ */ Error("Failed to create conversation");
|
|
85
|
+
}
|
|
86
|
+
}, [r, t]),
|
|
87
|
+
loading: i.loading,
|
|
88
|
+
error: i.error ?? null
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function v() {
|
|
92
|
+
let [e, n] = t(), [r, i] = o(), [s, u] = l(), [d, p] = a(), [m, h] = c();
|
|
93
|
+
return {
|
|
94
|
+
archiveConversation: f(async (t) => {
|
|
95
|
+
let { data: n } = await e({ variables: { id: t } });
|
|
96
|
+
return n?.archiveConversation.id === t;
|
|
97
|
+
}, [e]),
|
|
98
|
+
pinConversation: f(async (e) => {
|
|
99
|
+
let { data: t } = await r({ variables: { conversationId: e } });
|
|
100
|
+
return !!t?.pinConversation?.id;
|
|
101
|
+
}, [r]),
|
|
102
|
+
unpinConversation: f(async (e) => {
|
|
103
|
+
let { data: t } = await s({ variables: { conversationId: e } });
|
|
104
|
+
return !!t?.unpinConversation?.id;
|
|
105
|
+
}, [s]),
|
|
106
|
+
muteConversation: f(async (e) => {
|
|
107
|
+
let { data: t } = await d({ variables: { conversationId: e } });
|
|
108
|
+
return !!t?.muteConversation?.id;
|
|
109
|
+
}, [d]),
|
|
110
|
+
unmuteConversation: f(async (e) => {
|
|
111
|
+
let { data: t } = await m({ variables: { conversationId: e } });
|
|
112
|
+
return !!t?.unmuteConversation?.id;
|
|
113
|
+
}, [m]),
|
|
114
|
+
loading: n.loading || i.loading || u.loading || p.loading || h.loading,
|
|
115
|
+
error: n.error ?? i.error ?? u.error ?? p.error ?? h.error ?? null
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function y() {
|
|
119
|
+
let [e, t] = u();
|
|
120
|
+
return {
|
|
121
|
+
updateConversation: f(async (t) => {
|
|
122
|
+
try {
|
|
123
|
+
let { data: n } = await e({ variables: { input: t } }), r = n?.updateConversation?.conversation;
|
|
124
|
+
return r ? d(r) : null;
|
|
125
|
+
} catch (e) {
|
|
126
|
+
throw e instanceof Error ? e : /* @__PURE__ */ Error("Failed to update conversation");
|
|
127
|
+
}
|
|
128
|
+
}, [e]),
|
|
129
|
+
loading: t.loading,
|
|
130
|
+
error: t.error ?? null
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
//#endregion
|
|
134
|
+
export { v as useConversationActions, _ as useCreateConversation, h as useGetConversation, m as useGetConversations, g as useSearchConversations, y as useUpdateConversation };
|
|
135
|
+
|
|
136
|
+
//# sourceMappingURL=useConversationQueries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useConversationQueries.js","names":[],"sources":["../../../src/conversations/hooks/useConversationQueries.ts"],"sourcesContent":["import { useCallback, useMemo } from \"react\";\nimport {\n useArchiveConversationMutation,\n useCreateConversationMutation,\n useGetConversationQuery,\n useGetConversationsQuery,\n useMuteConversationMutation,\n usePinConversationMutation,\n useSearchConversationsQuery,\n useUnmuteConversationMutation,\n useUnpinConversationMutation,\n useUpdateConversationByHookMutation,\n} from \"../../generated/wspace-operations\";\nimport type * as WspaceTypes from \"../../generated/wspace-types\";\nimport type {\n Conversation,\n ConversationType,\n ConversationVisibility,\n} from \"../types\";\nimport { useConversations } from \"../providers/ConversationsProvider\";\nimport { mapConversation } from \"../utils/mappers\";\n\ninterface UseGetConversationsOptions {\n first?: number;\n after?: string;\n types?: ConversationType[];\n hasUnread?: boolean;\n isPinned?: boolean;\n}\n\ninterface UseGetConversationsResult {\n conversations: Conversation[];\n loading: boolean;\n error: Error | null;\n hasNextPage: boolean;\n fetchMore: () => void;\n refetch: () => void;\n}\n\n/**\n * Hook: Fetch a paginated list of conversations.\n */\nexport function useGetConversations(\n options?: UseGetConversationsOptions,\n): UseGetConversationsResult {\n const { workspaceId } = useConversations();\n const queryResult = useGetConversationsQuery({\n variables: {\n first: options?.first ?? 25,\n after: options?.after,\n filter: {\n types: options?.types as WspaceTypes.InputMaybe<\n WspaceTypes.ConversationType[]\n >,\n hasUnread: options?.hasUnread,\n isPinned: options?.isPinned,\n },\n },\n skip: !workspaceId,\n });\n\n const conversations = useMemo(\n () =>\n queryResult.data?.conversations.edges.map(\n (edge: { node: Record<string, unknown> }) => mapConversation(edge.node),\n ) ?? [],\n [queryResult.data],\n );\n\n const hasNextPage =\n queryResult.data?.conversations.pageInfo.hasNextPage ?? false;\n\n return {\n conversations,\n loading: queryResult.loading,\n error: queryResult.error ?? null,\n hasNextPage,\n fetchMore: () => {\n const endCursor = queryResult.data?.conversations.pageInfo.endCursor;\n if (!endCursor || !hasNextPage) return;\n void queryResult.fetchMore({\n variables: {\n first: options?.first ?? 25,\n after: endCursor,\n filter: {\n types: options?.types as WspaceTypes.InputMaybe<\n WspaceTypes.ConversationType[]\n >,\n hasUnread: options?.hasUnread,\n isPinned: options?.isPinned,\n },\n },\n });\n },\n refetch: () => {\n void queryResult.refetch();\n },\n };\n}\n\ninterface UseGetConversationResult {\n conversation: Conversation | null;\n loading: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\n/**\n * Hook: Fetch a single conversation by ID.\n */\nexport function useGetConversation(\n conversationId: string,\n): UseGetConversationResult {\n const { workspaceId } = useConversations();\n const queryResult = useGetConversationQuery({\n variables: { id: conversationId },\n skip: !workspaceId || !conversationId,\n });\n\n return {\n conversation: queryResult.data?.conversation\n ? mapConversation(queryResult.data.conversation)\n : null,\n loading: queryResult.loading,\n error: queryResult.error ?? null,\n refetch: () => {\n void queryResult.refetch();\n },\n };\n}\n\ninterface UseSearchConversationsResult {\n conversations: Conversation[];\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Hook: Search conversations by query string.\n */\nexport function useSearchConversations(\n query: string,\n): UseSearchConversationsResult {\n const { workspaceId } = useConversations();\n const trimmedQuery = query.trim();\n const queryResult = useSearchConversationsQuery({\n variables: { query: trimmedQuery, first: 25 },\n skip: !workspaceId || !trimmedQuery,\n });\n\n return {\n conversations:\n queryResult.data?.searchConversations.edges.map(\n (edge: { node: Record<string, unknown> }) => mapConversation(edge.node),\n ) ?? [],\n loading: queryResult.loading,\n error: queryResult.error ?? null,\n };\n}\n\ninterface CreateConversationInput {\n type: ConversationType;\n title?: string;\n description?: string;\n participantIds: string[];\n visibility?: ConversationVisibility;\n}\n\ninterface UseCreateConversationResult {\n createConversation: (\n input: CreateConversationInput,\n ) => Promise<Conversation | null>;\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Hook: Create a new conversation.\n */\nexport function useCreateConversation(): UseCreateConversationResult {\n const { workspaceId } = useConversations();\n const [createConversationMutation, mutationState] =\n useCreateConversationMutation();\n\n const createConversation = useCallback(\n async (input: CreateConversationInput): Promise<Conversation | null> => {\n if (!workspaceId) {\n throw new Error(\n \"Workspace context is required to create a conversation\",\n );\n }\n\n try {\n const { data } = await createConversationMutation({\n variables: {\n input: {\n workspaceId,\n type: input.type as WspaceTypes.ConversationType,\n title: input.title,\n description: input.description,\n participantIds: input.participantIds,\n },\n },\n });\n\n const conversation = data?.createConversation.conversation;\n return conversation ? mapConversation(conversation) : null;\n } catch (err) {\n throw err instanceof Error\n ? err\n : new Error(\"Failed to create conversation\");\n }\n },\n [createConversationMutation, workspaceId],\n );\n\n return {\n createConversation,\n loading: mutationState.loading,\n error: mutationState.error ?? null,\n };\n}\n\ninterface UseUpdateConversationResult {\n archiveConversation: (id: string) => Promise<boolean>;\n pinConversation: (id: string) => Promise<boolean>;\n unpinConversation: (id: string) => Promise<boolean>;\n muteConversation: (id: string) => Promise<boolean>;\n unmuteConversation: (id: string) => Promise<boolean>;\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Hook: Conversation mutation operations.\n */\nexport function useConversationActions(): UseUpdateConversationResult {\n const [archiveConversationMutation, archiveState] =\n useArchiveConversationMutation();\n const [pinConversationMutation, pinState] = usePinConversationMutation();\n const [unpinConversationMutation, unpinState] =\n useUnpinConversationMutation();\n const [muteConversationMutation, muteState] = useMuteConversationMutation();\n const [unmuteConversationMutation, unmuteState] =\n useUnmuteConversationMutation();\n\n const archiveConversation = useCallback(\n async (id: string): Promise<boolean> => {\n const { data } = await archiveConversationMutation({ variables: { id } });\n return data?.archiveConversation.id === id;\n },\n [archiveConversationMutation],\n );\n\n const pinConversation = useCallback(\n async (id: string): Promise<boolean> => {\n const { data } = await pinConversationMutation({\n variables: { conversationId: id },\n });\n return Boolean(data?.pinConversation?.id);\n },\n [pinConversationMutation],\n );\n\n const unpinConversation = useCallback(\n async (id: string): Promise<boolean> => {\n const { data } = await unpinConversationMutation({\n variables: { conversationId: id },\n });\n return Boolean(data?.unpinConversation?.id);\n },\n [unpinConversationMutation],\n );\n\n const muteConversation = useCallback(\n async (id: string): Promise<boolean> => {\n const { data } = await muteConversationMutation({\n variables: { conversationId: id },\n });\n return Boolean(data?.muteConversation?.id);\n },\n [muteConversationMutation],\n );\n\n const unmuteConversation = useCallback(\n async (id: string): Promise<boolean> => {\n const { data } = await unmuteConversationMutation({\n variables: { conversationId: id },\n });\n return Boolean(data?.unmuteConversation?.id);\n },\n [unmuteConversationMutation],\n );\n\n return {\n archiveConversation,\n pinConversation,\n unpinConversation,\n muteConversation,\n unmuteConversation,\n loading:\n archiveState.loading ||\n pinState.loading ||\n unpinState.loading ||\n muteState.loading ||\n unmuteState.loading,\n error:\n (archiveState.error as Error | undefined) ??\n (pinState.error as Error | undefined) ??\n (unpinState.error as Error | undefined) ??\n (muteState.error as Error | undefined) ??\n (unmuteState.error as Error | undefined) ??\n null,\n };\n}\n\ninterface UseUpdateConversationOptions {\n updateConversation: (input: {\n id: string;\n title?: string;\n description?: string;\n avatarUrl?: string;\n settings?: Record<string, unknown>;\n }) => Promise<Conversation | null>;\n loading: boolean;\n error: Error | null;\n}\n\nexport function useUpdateConversation(): UseUpdateConversationOptions {\n const [updateConversationMutation, mutationState] =\n useUpdateConversationByHookMutation();\n\n const updateConversation = useCallback(\n async (input: {\n id: string;\n title?: string;\n description?: string;\n avatarUrl?: string;\n settings?: Record<string, unknown>;\n }): Promise<Conversation | null> => {\n try {\n const { data } = await updateConversationMutation({\n variables: { input },\n });\n const typedData = data as\n | {\n updateConversation?: {\n conversation?: Record<string, unknown> | null;\n };\n }\n | undefined;\n const conversation = typedData?.updateConversation?.conversation;\n return conversation\n ? mapConversation(conversation as Record<string, unknown>)\n : null;\n } catch (err) {\n throw err instanceof Error\n ? err\n : new Error(\"Failed to update conversation\");\n }\n },\n [updateConversationMutation],\n );\n\n return {\n updateConversation,\n loading: mutationState.loading,\n error: mutationState.error ?? null,\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type ExportFormat = "JSON" | "CSV" | "MARKDOWN";
|
|
2
|
+
interface UseExportConversationResult {
|
|
3
|
+
exportComments: (entityType: string, entityId: string, format?: ExportFormat) => Promise<string | null>;
|
|
4
|
+
loading: boolean;
|
|
5
|
+
error: Error | null;
|
|
6
|
+
downloadUrl: string | null;
|
|
7
|
+
}
|
|
8
|
+
export declare function useExportConversation(): UseExportConversationResult;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=useExportConversation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useExportConversation.d.ts","sourceRoot":"","sources":["../../../src/conversations/hooks/useExportConversation.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,KAAK,GAAG,UAAU,CAAC;AAEvD,UAAU,2BAA2B;IACnC,cAAc,EAAE,CACd,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,YAAY,KAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAgB,qBAAqB,IAAI,2BAA2B,CA2CnE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { useCallback as e, useState as t } from "react";
|
|
2
|
+
import { gql as n } from "@apollo/client";
|
|
3
|
+
import { useMutation as r } from "@apollo/client/react";
|
|
4
|
+
//#region src/conversations/hooks/useExportConversation.ts
|
|
5
|
+
var i = n`
|
|
6
|
+
mutation ExportEntityComments($input: ExportCommentsInput!) {
|
|
7
|
+
exportEntityComments(input: $input)
|
|
8
|
+
}
|
|
9
|
+
`;
|
|
10
|
+
function a() {
|
|
11
|
+
let [n, a] = t(null), [o, { loading: s, error: c }] = r(i);
|
|
12
|
+
return {
|
|
13
|
+
exportComments: e(async (e, t, n = "JSON") => {
|
|
14
|
+
try {
|
|
15
|
+
let { data: r } = await o({ variables: { input: {
|
|
16
|
+
entityType: e,
|
|
17
|
+
entityId: t,
|
|
18
|
+
format: n
|
|
19
|
+
} } }), i = r?.exportEntityComments ?? null;
|
|
20
|
+
if (i) {
|
|
21
|
+
let e = new Blob([i], { type: {
|
|
22
|
+
JSON: "application/json",
|
|
23
|
+
CSV: "text/csv",
|
|
24
|
+
MARKDOWN: "text/markdown"
|
|
25
|
+
}[n] }), t = URL.createObjectURL(e);
|
|
26
|
+
return a(t), t;
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
} catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}, [o]),
|
|
33
|
+
loading: s,
|
|
34
|
+
error: c ?? null,
|
|
35
|
+
downloadUrl: n
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//#endregion
|
|
39
|
+
export { a as useExportConversation };
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=useExportConversation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useExportConversation.js","names":[],"sources":["../../../src/conversations/hooks/useExportConversation.ts"],"sourcesContent":["import { useCallback, useState } from \"react\";\nimport { gql } from \"@apollo/client\";\nimport { useMutation } from \"@apollo/client/react\";\n\nconst EXPORT_ENTITY_COMMENTS = gql`\n mutation ExportEntityComments($input: ExportCommentsInput!) {\n exportEntityComments(input: $input)\n }\n`;\n\nexport type ExportFormat = \"JSON\" | \"CSV\" | \"MARKDOWN\";\n\ninterface UseExportConversationResult {\n exportComments: (\n entityType: string,\n entityId: string,\n format?: ExportFormat,\n ) => Promise<string | null>;\n loading: boolean;\n error: Error | null;\n downloadUrl: string | null;\n}\n\nexport function useExportConversation(): UseExportConversationResult {\n const [downloadUrl, setDownloadUrl] = useState<string | null>(null);\n const [mutate, { loading, error }] = useMutation<\n { exportEntityComments: string },\n { input: { entityType: string; entityId: string; format: string } }\n >(EXPORT_ENTITY_COMMENTS);\n\n const exportComments = useCallback(\n async (\n entityType: string,\n entityId: string,\n format: ExportFormat = \"JSON\",\n ): Promise<string | null> => {\n try {\n const { data } = await mutate({\n variables: { input: { entityType, entityId, format } },\n });\n const content = data?.exportEntityComments ?? null;\n if (content) {\n const mimeMap: Record<ExportFormat, string> = {\n JSON: \"application/json\",\n CSV: \"text/csv\",\n MARKDOWN: \"text/markdown\",\n };\n const blob = new Blob([content], { type: mimeMap[format] });\n const url = URL.createObjectURL(blob);\n setDownloadUrl(url);\n return url;\n }\n return null;\n } catch {\n return null;\n }\n },\n [mutate],\n );\n\n return {\n exportComments,\n loading,\n error: error ?? null,\n downloadUrl,\n };\n}\n"],"mappings":";;;;AAIA,IAAM,IAAyB,CAAG;;;;;AAmBlC,SAAgB,IAAqD;CACnE,IAAM,CAAC,GAAa,KAAkB,EAAwB,KAAK,EAC7D,CAAC,GAAQ,EAAE,YAAS,cAAW,EAGnC,EAAuB;AAgCzB,QAAO;EACL,gBA/BqB,EACrB,OACE,GACA,GACA,IAAuB,WACI;AAC3B,OAAI;IACF,IAAM,EAAE,YAAS,MAAM,EAAO,EAC5B,WAAW,EAAE,OAAO;KAAE;KAAY;KAAU;KAAQ,EAAE,EACvD,CAAC,EACI,IAAU,GAAM,wBAAwB;AAC9C,QAAI,GAAS;KAMX,IAAM,IAAO,IAAI,KAAK,CAAC,EAAQ,EAAE,EAAE,MALW;MAC5C,MAAM;MACN,KAAK;MACL,UAAU;MACX,CACgD,IAAS,CAAC,EACrD,IAAM,IAAI,gBAAgB,EAAK;AAErC,YADA,EAAe,EAAI,EACZ;;AAET,WAAO;WACD;AACN,WAAO;;KAGX,CAAC,EAAO,CACT;EAIC;EACA,OAAO,KAAS;EAChB;EACD"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { Message, MessageType } from '../types';
|
|
2
|
+
|
|
3
|
+
interface UseGetMessagesOptions {
|
|
4
|
+
first?: number;
|
|
5
|
+
after?: string;
|
|
6
|
+
before?: string;
|
|
7
|
+
}
|
|
8
|
+
interface UseGetMessagesResult {
|
|
9
|
+
messages: Message[];
|
|
10
|
+
loading: boolean;
|
|
11
|
+
error: Error | null;
|
|
12
|
+
hasNextPage: boolean;
|
|
13
|
+
hasPreviousPage: boolean;
|
|
14
|
+
fetchMore: () => void;
|
|
15
|
+
fetchPrevious: () => void;
|
|
16
|
+
refetch: () => void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Hook: Fetch paginated messages for a conversation.
|
|
20
|
+
*/
|
|
21
|
+
export declare function useGetMessages(conversationId: string, options?: UseGetMessagesOptions): UseGetMessagesResult;
|
|
22
|
+
interface UseGetThreadResult {
|
|
23
|
+
messages: Message[];
|
|
24
|
+
loading: boolean;
|
|
25
|
+
error: Error | null;
|
|
26
|
+
fetchMore: () => void;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Hook: Fetch thread replies for a message.
|
|
30
|
+
*/
|
|
31
|
+
export declare function useGetThread(messageId: string, options?: {
|
|
32
|
+
first?: number;
|
|
33
|
+
after?: string;
|
|
34
|
+
}): UseGetThreadResult;
|
|
35
|
+
interface SendMessageInput {
|
|
36
|
+
conversationId: string;
|
|
37
|
+
content: string;
|
|
38
|
+
type?: MessageType;
|
|
39
|
+
parentMessageId?: string;
|
|
40
|
+
attachmentIds?: string[];
|
|
41
|
+
mentionUserIds?: string[];
|
|
42
|
+
}
|
|
43
|
+
interface UseSendMessageResult {
|
|
44
|
+
sendMessage: (input: SendMessageInput) => Promise<Message | null>;
|
|
45
|
+
loading: boolean;
|
|
46
|
+
error: Error | null;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Hook: Send a message to a conversation.
|
|
50
|
+
*/
|
|
51
|
+
export declare function useSendMessage(): UseSendMessageResult;
|
|
52
|
+
interface UseEditMessageResult {
|
|
53
|
+
editMessage: (messageId: string, content: string, reason?: string) => Promise<Message | null>;
|
|
54
|
+
loading: boolean;
|
|
55
|
+
error: Error | null;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Hook: Edit an existing message.
|
|
59
|
+
*/
|
|
60
|
+
export declare function useEditMessage(): UseEditMessageResult;
|
|
61
|
+
interface UseMessageActionsResult {
|
|
62
|
+
deleteMessage: (messageId: string) => Promise<boolean>;
|
|
63
|
+
addReaction: (messageId: string, emoji: string) => Promise<boolean>;
|
|
64
|
+
removeReaction: (messageId: string, emoji: string) => Promise<boolean>;
|
|
65
|
+
pinMessage: (messageId: string) => Promise<boolean>;
|
|
66
|
+
unpinMessage: (messageId: string) => Promise<boolean>;
|
|
67
|
+
loading: boolean;
|
|
68
|
+
error: Error | null;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Hook: Message action mutations (delete, react, pin).
|
|
72
|
+
*/
|
|
73
|
+
export declare function useMessageActions(): UseMessageActionsResult;
|
|
74
|
+
interface UseSearchMessagesResult {
|
|
75
|
+
messages: Message[];
|
|
76
|
+
loading: boolean;
|
|
77
|
+
error: Error | null;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Hook: Search messages across conversations or within a conversation.
|
|
81
|
+
*/
|
|
82
|
+
export declare function useSearchMessages(query: string, conversationId?: string): UseSearchMessagesResult;
|
|
83
|
+
export {};
|
|
84
|
+
//# sourceMappingURL=useMessageQueries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMessageQueries.d.ts","sourceRoot":"","sources":["../../../src/conversations/hooks/useMessageQueries.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { useConversations as e } from "../providers/ConversationsProvider.js";
|
|
2
|
+
import { useAddReactionMutation as t, useDeleteMessageMutation as n, useEditMessageMutation as r, useGetMessagesQuery as i, usePinMessageByHookMutation as a, useRemoveReactionMutation as o, useSendMessageMutation as s, useUnpinMessageByHookMutation as c } from "../../generated/wspace-operations.js";
|
|
3
|
+
import { mapMessage as l } from "../utils/mappers.js";
|
|
4
|
+
import { useCallback as u, useMemo as d } from "react";
|
|
5
|
+
//#region src/conversations/hooks/useMessageQueries.ts
|
|
6
|
+
function f(t, n) {
|
|
7
|
+
let { workspaceId: r } = e(), a = i({
|
|
8
|
+
variables: {
|
|
9
|
+
conversationId: t,
|
|
10
|
+
first: n?.first ?? 50,
|
|
11
|
+
after: n?.after,
|
|
12
|
+
before: n?.before
|
|
13
|
+
},
|
|
14
|
+
skip: !r || !t
|
|
15
|
+
}), o = d(() => a.data?.messages.edges.map((e) => l(e.node)) ?? [], [a.data]), s = a.data?.messages.pageInfo;
|
|
16
|
+
return {
|
|
17
|
+
messages: o,
|
|
18
|
+
loading: a.loading,
|
|
19
|
+
error: a.error ?? null,
|
|
20
|
+
hasNextPage: s?.hasNextPage ?? !1,
|
|
21
|
+
hasPreviousPage: s?.hasPreviousPage ?? !1,
|
|
22
|
+
fetchMore: () => {
|
|
23
|
+
let e = s?.endCursor;
|
|
24
|
+
!e || !s?.hasNextPage || a.fetchMore({ variables: {
|
|
25
|
+
conversationId: t,
|
|
26
|
+
first: n?.first ?? 50,
|
|
27
|
+
after: e
|
|
28
|
+
} });
|
|
29
|
+
},
|
|
30
|
+
fetchPrevious: () => {
|
|
31
|
+
let e = s?.startCursor;
|
|
32
|
+
!e || !s?.hasPreviousPage || a.fetchMore({ variables: {
|
|
33
|
+
conversationId: t,
|
|
34
|
+
before: e,
|
|
35
|
+
first: n?.first ?? 50
|
|
36
|
+
} });
|
|
37
|
+
},
|
|
38
|
+
refetch: () => {
|
|
39
|
+
a.refetch();
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function p() {
|
|
44
|
+
let [e, t] = s();
|
|
45
|
+
return {
|
|
46
|
+
sendMessage: u(async (t) => {
|
|
47
|
+
try {
|
|
48
|
+
let { data: n } = await e({
|
|
49
|
+
variables: { input: {
|
|
50
|
+
conversationId: t.conversationId,
|
|
51
|
+
type: t.type ?? "TEXT",
|
|
52
|
+
content: { text: t.content },
|
|
53
|
+
parentMessageId: t.parentMessageId,
|
|
54
|
+
attachmentIds: t.attachmentIds,
|
|
55
|
+
mentionUserIds: t.mentionUserIds
|
|
56
|
+
} },
|
|
57
|
+
refetchQueries: ["GetMessages"]
|
|
58
|
+
}), r = n?.sendMessage.message;
|
|
59
|
+
return r ? l(r) : null;
|
|
60
|
+
} catch (e) {
|
|
61
|
+
throw e instanceof Error ? e : /* @__PURE__ */ Error("Failed to send message");
|
|
62
|
+
}
|
|
63
|
+
}, [e]),
|
|
64
|
+
loading: t.loading,
|
|
65
|
+
error: t.error ?? null
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function m() {
|
|
69
|
+
let [e, t] = r();
|
|
70
|
+
return {
|
|
71
|
+
editMessage: u(async (t, n, r) => {
|
|
72
|
+
try {
|
|
73
|
+
let { data: i } = await e({ variables: { input: {
|
|
74
|
+
id: t,
|
|
75
|
+
content: { text: n },
|
|
76
|
+
reason: r
|
|
77
|
+
} } }), a = i?.editMessage;
|
|
78
|
+
return a ? l(a) : null;
|
|
79
|
+
} catch (e) {
|
|
80
|
+
throw e instanceof Error ? e : /* @__PURE__ */ Error("Failed to edit message");
|
|
81
|
+
}
|
|
82
|
+
}, [e]),
|
|
83
|
+
loading: t.loading,
|
|
84
|
+
error: t.error ?? null
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function h() {
|
|
88
|
+
let [e, r] = n(), [i, s] = t(), [l, d] = o(), [f, p] = a(), [m, h] = c();
|
|
89
|
+
return {
|
|
90
|
+
deleteMessage: u(async (t) => {
|
|
91
|
+
let { data: n } = await e({ variables: { id: t } });
|
|
92
|
+
return n?.deleteMessage.success ?? !1;
|
|
93
|
+
}, [e]),
|
|
94
|
+
addReaction: u(async (e, t) => {
|
|
95
|
+
let { data: n } = await i({ variables: {
|
|
96
|
+
messageId: e,
|
|
97
|
+
emoji: t
|
|
98
|
+
} });
|
|
99
|
+
return !!n?.addReaction.id;
|
|
100
|
+
}, [i]),
|
|
101
|
+
removeReaction: u(async (e, t) => {
|
|
102
|
+
let { data: n } = await l({ variables: {
|
|
103
|
+
messageId: e,
|
|
104
|
+
emoji: t
|
|
105
|
+
} });
|
|
106
|
+
return n?.removeReaction.success ?? !1;
|
|
107
|
+
}, [l]),
|
|
108
|
+
pinMessage: u(async (e) => {
|
|
109
|
+
let { data: t } = await f({ variables: { messageId: e } });
|
|
110
|
+
return !!t?.pinMessage?.id;
|
|
111
|
+
}, [f]),
|
|
112
|
+
unpinMessage: u(async (e) => {
|
|
113
|
+
let { data: t } = await m({ variables: { messageId: e } });
|
|
114
|
+
return !!t?.unpinMessage?.id;
|
|
115
|
+
}, [m]),
|
|
116
|
+
loading: r.loading || s.loading || d.loading || p.loading || h.loading,
|
|
117
|
+
error: r.error ?? s.error ?? d.error ?? p.error ?? h.error ?? null
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
//#endregion
|
|
121
|
+
export { m as useEditMessage, f as useGetMessages, h as useMessageActions, p as useSendMessage };
|
|
122
|
+
|
|
123
|
+
//# sourceMappingURL=useMessageQueries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMessageQueries.js","names":[],"sources":["../../../src/conversations/hooks/useMessageQueries.ts"],"sourcesContent":["import { useCallback, useMemo } from \"react\";\nimport {\n useAddReactionMutation,\n useDeleteMessageMutation,\n useEditMessageMutation,\n useGetMessagesQuery,\n useGetThreadMessagesQuery,\n usePinMessageByHookMutation,\n useRemoveReactionMutation,\n useSearchMessagesByHookQuery,\n useSendMessageMutation,\n useUnpinMessageByHookMutation,\n} from \"../../generated/wspace-operations\";\nimport type { Message, MessageType } from \"../types\";\nimport { useConversations } from \"../providers/ConversationsProvider\";\nimport { mapMessage } from \"../utils/mappers\";\n\ninterface UseGetMessagesOptions {\n first?: number;\n after?: string;\n before?: string;\n}\n\ninterface UseGetMessagesResult {\n messages: Message[];\n loading: boolean;\n error: Error | null;\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n fetchMore: () => void;\n fetchPrevious: () => void;\n refetch: () => void;\n}\n\n/**\n * Hook: Fetch paginated messages for a conversation.\n */\nexport function useGetMessages(\n conversationId: string,\n options?: UseGetMessagesOptions,\n): UseGetMessagesResult {\n const { workspaceId } = useConversations();\n const queryResult = useGetMessagesQuery({\n variables: {\n conversationId,\n first: options?.first ?? 50,\n after: options?.after,\n before: options?.before,\n },\n skip: !workspaceId || !conversationId,\n });\n\n const messages = useMemo(\n () =>\n queryResult.data?.messages.edges.map(\n (edge: { node: Record<string, unknown> }) => mapMessage(edge.node),\n ) ?? [],\n [queryResult.data],\n );\n\n const pageInfo = queryResult.data?.messages.pageInfo;\n\n return {\n messages,\n loading: queryResult.loading,\n error: queryResult.error ?? null,\n hasNextPage: pageInfo?.hasNextPage ?? false,\n hasPreviousPage: pageInfo?.hasPreviousPage ?? false,\n fetchMore: () => {\n const endCursor = pageInfo?.endCursor;\n if (!endCursor || !pageInfo?.hasNextPage) return;\n void queryResult.fetchMore({\n variables: {\n conversationId,\n first: options?.first ?? 50,\n after: endCursor,\n },\n });\n },\n fetchPrevious: () => {\n const startCursor = pageInfo?.startCursor;\n if (!startCursor || !pageInfo?.hasPreviousPage) return;\n void queryResult.fetchMore({\n variables: {\n conversationId,\n before: startCursor,\n first: options?.first ?? 50,\n },\n });\n },\n refetch: () => {\n void queryResult.refetch();\n },\n };\n}\n\ninterface UseGetThreadResult {\n messages: Message[];\n loading: boolean;\n error: Error | null;\n fetchMore: () => void;\n}\n\n/**\n * Hook: Fetch thread replies for a message.\n */\nexport function useGetThread(\n messageId: string,\n options?: { first?: number; after?: string },\n): UseGetThreadResult {\n const { workspaceId } = useConversations();\n const queryResult = useGetThreadMessagesQuery({\n variables: {\n messageId,\n first: options?.first ?? 25,\n after: options?.after,\n },\n skip: !workspaceId || !messageId,\n });\n\n return {\n messages:\n queryResult.data?.thread.edges.map(\n (edge: { node: Record<string, unknown> }) => mapMessage(edge.node),\n ) ?? [],\n loading: queryResult.loading,\n error: queryResult.error ?? null,\n fetchMore: () => {\n const endCursor = queryResult.data?.thread.pageInfo.endCursor;\n if (!queryResult.data?.thread.pageInfo.hasNextPage || !endCursor) return;\n void queryResult.fetchMore({\n variables: {\n messageId,\n first: options?.first ?? 25,\n after: endCursor,\n },\n });\n },\n };\n}\n\ninterface SendMessageInput {\n conversationId: string;\n content: string;\n type?: MessageType;\n parentMessageId?: string;\n attachmentIds?: string[];\n mentionUserIds?: string[];\n}\n\ninterface UseSendMessageResult {\n sendMessage: (input: SendMessageInput) => Promise<Message | null>;\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Hook: Send a message to a conversation.\n */\nexport function useSendMessage(): UseSendMessageResult {\n const [sendMessageMutation, mutationState] = useSendMessageMutation();\n\n const sendMessage = useCallback(\n async (input: SendMessageInput): Promise<Message | null> => {\n try {\n const { data } = await sendMessageMutation({\n variables: {\n input: {\n conversationId: input.conversationId,\n type: input.type ?? \"TEXT\",\n content: { text: input.content },\n parentMessageId: input.parentMessageId,\n attachmentIds: input.attachmentIds,\n mentionUserIds: input.mentionUserIds,\n },\n },\n refetchQueries: [\"GetMessages\"],\n });\n\n const message = data?.sendMessage.message;\n return message ? mapMessage(message) : null;\n } catch (err) {\n throw err instanceof Error ? err : new Error(\"Failed to send message\");\n }\n },\n [sendMessageMutation],\n );\n\n return {\n sendMessage,\n loading: mutationState.loading,\n error: mutationState.error ?? null,\n };\n}\n\ninterface UseEditMessageResult {\n editMessage: (\n messageId: string,\n content: string,\n reason?: string,\n ) => Promise<Message | null>;\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Hook: Edit an existing message.\n */\nexport function useEditMessage(): UseEditMessageResult {\n const [editMessageMutation, mutationState] = useEditMessageMutation();\n\n const editMessage = useCallback(\n async (\n messageId: string,\n content: string,\n reason?: string,\n ): Promise<Message | null> => {\n try {\n const { data } = await editMessageMutation({\n variables: {\n input: {\n id: messageId,\n content: { text: content },\n reason,\n },\n },\n });\n const message = data?.editMessage;\n return message ? mapMessage(message as Record<string, unknown>) : null;\n } catch (err) {\n throw err instanceof Error ? err : new Error(\"Failed to edit message\");\n }\n },\n [editMessageMutation],\n );\n\n return {\n editMessage,\n loading: mutationState.loading,\n error: mutationState.error ?? null,\n };\n}\n\ninterface UseMessageActionsResult {\n deleteMessage: (messageId: string) => Promise<boolean>;\n addReaction: (messageId: string, emoji: string) => Promise<boolean>;\n removeReaction: (messageId: string, emoji: string) => Promise<boolean>;\n pinMessage: (messageId: string) => Promise<boolean>;\n unpinMessage: (messageId: string) => Promise<boolean>;\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Hook: Message action mutations (delete, react, pin).\n */\nexport function useMessageActions(): UseMessageActionsResult {\n const [deleteMessageMutation, deleteState] = useDeleteMessageMutation();\n const [addReactionMutation, addReactionState] = useAddReactionMutation();\n const [removeReactionMutation, removeReactionState] =\n useRemoveReactionMutation();\n const [pinMessageMutation, pinState] = usePinMessageByHookMutation();\n const [unpinMessageMutation, unpinState] = useUnpinMessageByHookMutation();\n\n const deleteMessage = useCallback(\n async (messageId: string): Promise<boolean> => {\n const { data } = await deleteMessageMutation({\n variables: { id: messageId },\n });\n return data?.deleteMessage.success ?? false;\n },\n [deleteMessageMutation],\n );\n\n const addReaction = useCallback(\n async (messageId: string, emoji: string): Promise<boolean> => {\n const { data } = await addReactionMutation({\n variables: { messageId, emoji },\n });\n return Boolean(data?.addReaction.id);\n },\n [addReactionMutation],\n );\n\n const removeReaction = useCallback(\n async (messageId: string, emoji: string): Promise<boolean> => {\n const { data } = await removeReactionMutation({\n variables: { messageId, emoji },\n });\n return data?.removeReaction.success ?? false;\n },\n [removeReactionMutation],\n );\n\n const pinMessage = useCallback(\n async (messageId: string): Promise<boolean> => {\n const { data } = await pinMessageMutation({ variables: { messageId } });\n return Boolean(data?.pinMessage?.id);\n },\n [pinMessageMutation],\n );\n\n const unpinMessage = useCallback(\n async (messageId: string): Promise<boolean> => {\n const { data } = await unpinMessageMutation({ variables: { messageId } });\n return Boolean(data?.unpinMessage?.id);\n },\n [unpinMessageMutation],\n );\n\n return {\n deleteMessage,\n addReaction,\n removeReaction,\n pinMessage,\n unpinMessage,\n loading:\n deleteState.loading ||\n addReactionState.loading ||\n removeReactionState.loading ||\n pinState.loading ||\n unpinState.loading,\n error:\n (deleteState.error as Error | undefined) ??\n (addReactionState.error as Error | undefined) ??\n (removeReactionState.error as Error | undefined) ??\n (pinState.error as Error | undefined) ??\n (unpinState.error as Error | undefined) ??\n null,\n };\n}\n\ninterface UseSearchMessagesResult {\n messages: Message[];\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Hook: Search messages across conversations or within a conversation.\n */\nexport function useSearchMessages(\n query: string,\n conversationId?: string,\n): UseSearchMessagesResult {\n const { workspaceId } = useConversations();\n const queryResult = useSearchMessagesByHookQuery({\n variables: { query: query.trim(), conversationId, first: 50 },\n skip: !workspaceId || !query.trim(),\n });\n\n return {\n messages:\n queryResult.data?.searchMessages.edges.map(\n (edge: { node: Record<string, unknown> }) => mapMessage(edge.node),\n ) ?? [],\n loading: queryResult.loading,\n error: queryResult.error ?? null,\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare function useMessageStreamForConversation(conversationId: string | undefined): void;
|
|
2
|
+
/**
|
|
3
|
+
* Reactions stream: subscribe per-message. Useful for a focused message
|
|
4
|
+
* preview (not the entire conversation).
|
|
5
|
+
*/
|
|
6
|
+
export declare function useReactionStreamForMessage(messageId: string | undefined): void;
|
|
7
|
+
/**
|
|
8
|
+
* Read-receipt stream for a single message — used by the read-by indicator.
|
|
9
|
+
*/
|
|
10
|
+
export declare function useReadReceiptStreamForMessage(messageId: string | undefined): void;
|
|
11
|
+
/**
|
|
12
|
+
* Subscribe to all conversation-level lifecycle events for the current actor.
|
|
13
|
+
*
|
|
14
|
+
* - `conversationAdded` — refresh the conversation list when one is created.
|
|
15
|
+
* - `conversationDeleted` — evict from cache when one is removed.
|
|
16
|
+
* - `conversationUpdated` — Apollo normalisation handles automatically; no
|
|
17
|
+
* manual write required.
|
|
18
|
+
* - `participantChanged` — refresh members panel.
|
|
19
|
+
*
|
|
20
|
+
* Use at the top of the list page / landing page once. Safe to call multiple
|
|
21
|
+
* times across components — Apollo deduplicates.
|
|
22
|
+
*/
|
|
23
|
+
export declare function useConversationStream(conversationId?: string | undefined): void;
|
|
24
|
+
//# sourceMappingURL=useMessageSubscriptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMessageSubscriptions.d.ts","sourceRoot":"","sources":["../../../src/conversations/hooks/useMessageSubscriptions.ts"],"names":[],"mappings":"AAmGA,wBAAgB,+BAA+B,CAC7C,cAAc,EAAE,MAAM,GAAG,SAAS,GACjC,IAAI,CAwCN;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,IAAI,CASN;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,IAAI,CASN;AAmBD;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,GAClC,IAAI,CA0DN"}
|