@cossistant/react 0.0.3 → 0.0.5
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 +74 -0
- package/_virtual/rolldown_runtime.js +19 -0
- package/conversation.d.ts +26 -3
- package/conversation.d.ts.map +1 -1
- package/hooks/index.d.ts +5 -3
- package/hooks/index.js +7 -5
- package/hooks/private/store/use-conversations-store.d.ts +8 -0
- package/hooks/private/store/use-conversations-store.d.ts.map +1 -1
- package/hooks/private/store/use-conversations-store.js +8 -0
- package/hooks/private/store/use-conversations-store.js.map +1 -1
- package/hooks/private/store/use-store-selector.d.ts +4 -0
- package/hooks/private/store/use-store-selector.d.ts.map +1 -1
- package/hooks/private/store/use-store-selector.js +5 -2
- package/hooks/private/store/use-store-selector.js.map +1 -1
- package/hooks/private/store/use-website-store.d.ts +4 -0
- package/hooks/private/store/use-website-store.d.ts.map +1 -1
- package/hooks/private/store/use-website-store.js +6 -3
- package/hooks/private/store/use-website-store.js.map +1 -1
- package/hooks/private/typing.d.ts +35 -0
- package/hooks/private/typing.d.ts.map +1 -0
- package/hooks/private/typing.js +49 -0
- package/hooks/private/typing.js.map +1 -0
- package/hooks/private/use-client-query.d.ts +5 -0
- package/hooks/private/use-client-query.d.ts.map +1 -1
- package/hooks/private/use-client-query.js +5 -0
- package/hooks/private/use-client-query.js.map +1 -1
- package/hooks/private/use-grouped-messages.d.ts +10 -4
- package/hooks/private/use-grouped-messages.d.ts.map +1 -1
- package/hooks/private/use-grouped-messages.js +24 -4
- package/hooks/private/use-grouped-messages.js.map +1 -1
- package/hooks/private/use-multimodal-input.d.ts.map +1 -1
- package/hooks/private/use-rest-client.d.ts.map +1 -1
- package/hooks/private/use-visitor-typing-reporter.d.ts +6 -0
- package/hooks/private/use-visitor-typing-reporter.d.ts.map +1 -1
- package/hooks/private/use-visitor-typing-reporter.js +6 -0
- package/hooks/private/use-visitor-typing-reporter.js.map +1 -1
- package/hooks/use-composer-refocus.d.ts.map +1 -1
- package/hooks/use-conversation-auto-seen.d.ts +9 -0
- package/hooks/use-conversation-auto-seen.d.ts.map +1 -1
- package/hooks/use-conversation-auto-seen.js +44 -3
- package/hooks/use-conversation-auto-seen.js.map +1 -1
- package/hooks/use-conversation-history-page.d.ts.map +1 -1
- package/hooks/use-conversation-history-page.js +16 -18
- package/hooks/use-conversation-history-page.js.map +1 -1
- package/hooks/use-conversation-lifecycle.d.ts.map +1 -1
- package/hooks/use-conversation-lifecycle.js +2 -4
- package/hooks/use-conversation-lifecycle.js.map +1 -1
- package/hooks/use-conversation-page.d.ts +6 -0
- package/hooks/use-conversation-page.d.ts.map +1 -1
- package/hooks/use-conversation-page.js +41 -3
- package/hooks/use-conversation-page.js.map +1 -1
- package/hooks/use-conversation-preview.d.ts +61 -0
- package/hooks/use-conversation-preview.d.ts.map +1 -0
- package/hooks/use-conversation-preview.js +173 -0
- package/hooks/use-conversation-preview.js.map +1 -0
- package/hooks/use-conversation-seen.d.ts +4 -0
- package/hooks/use-conversation-seen.d.ts.map +1 -1
- package/hooks/use-conversation-seen.js +4 -0
- package/hooks/use-conversation-seen.js.map +1 -1
- package/hooks/use-conversation-timeline-items.d.ts +4 -0
- package/hooks/use-conversation-timeline-items.d.ts.map +1 -1
- package/hooks/use-conversation-timeline-items.js +4 -0
- package/hooks/use-conversation-timeline-items.js.map +1 -1
- package/hooks/use-conversation-timeline.d.ts +32 -0
- package/hooks/use-conversation-timeline.d.ts.map +1 -0
- package/hooks/use-conversation-timeline.js +41 -0
- package/hooks/use-conversation-timeline.js.map +1 -0
- package/hooks/use-conversation-typing.d.ts +4 -0
- package/hooks/use-conversation-typing.d.ts.map +1 -1
- package/hooks/use-conversation-typing.js +4 -0
- package/hooks/use-conversation-typing.js.map +1 -1
- package/hooks/use-conversation.d.ts +11 -0
- package/hooks/use-conversation.d.ts.map +1 -1
- package/hooks/use-conversation.js +11 -0
- package/hooks/use-conversation.js.map +1 -1
- package/hooks/use-conversations.d.ts +12 -0
- package/hooks/use-conversations.d.ts.map +1 -1
- package/hooks/use-conversations.js +12 -0
- package/hooks/use-conversations.js.map +1 -1
- package/hooks/use-create-conversation.d.ts +5 -0
- package/hooks/use-create-conversation.d.ts.map +1 -1
- package/hooks/use-create-conversation.js +12 -9
- package/hooks/use-create-conversation.js.map +1 -1
- package/hooks/use-home-page.d.ts.map +1 -1
- package/hooks/use-home-page.js +6 -4
- package/hooks/use-home-page.js.map +1 -1
- package/hooks/use-message-composer.d.ts.map +1 -1
- package/hooks/use-realtime-support.d.ts.map +1 -1
- package/hooks/use-send-message.d.ts +9 -0
- package/hooks/use-send-message.d.ts.map +1 -1
- package/hooks/use-send-message.js +15 -13
- package/hooks/use-send-message.js.map +1 -1
- package/hooks/use-visitor.d.ts.map +1 -1
- package/hooks/use-visitor.js +28 -30
- package/hooks/use-visitor.js.map +1 -1
- package/hooks/use-window-visibility-focus.d.ts +4 -0
- package/hooks/use-window-visibility-focus.d.ts.map +1 -1
- package/hooks/use-window-visibility-focus.js +5 -2
- package/hooks/use-window-visibility-focus.js.map +1 -1
- package/identify-visitor.d.ts +12 -3
- package/identify-visitor.d.ts.map +1 -1
- package/identify-visitor.js +58 -9
- package/identify-visitor.js.map +1 -1
- package/index.d.ts +10 -7
- package/index.js +10 -9
- package/package.json +14 -17
- package/primitives/avatar/avatar.d.ts.map +1 -1
- package/primitives/avatar/fallback.d.ts.map +1 -1
- package/primitives/avatar/fallback.js +1 -3
- package/primitives/avatar/fallback.js.map +1 -1
- package/primitives/avatar/image.d.ts.map +1 -1
- package/primitives/avatar/index.d.ts +1 -0
- package/primitives/bubble.d.ts +2 -0
- package/primitives/bubble.d.ts.map +1 -1
- package/primitives/bubble.js +8 -2
- package/primitives/bubble.js.map +1 -1
- package/primitives/button.d.ts.map +1 -1
- package/primitives/conversation-timeline.d.ts.map +1 -1
- package/primitives/conversation-timeline.js +58 -5
- package/primitives/conversation-timeline.js.map +1 -1
- package/primitives/index.d.ts +1 -0
- package/primitives/index.parts.d.ts +1 -0
- package/primitives/multimodal-input.d.ts.map +1 -1
- package/primitives/timeline-item-group.d.ts +7 -7
- package/primitives/timeline-item-group.d.ts.map +1 -1
- package/primitives/timeline-item-group.js.map +1 -1
- package/primitives/timeline-item.d.ts +1 -1
- package/primitives/timeline-item.d.ts.map +1 -1
- package/primitives/timeline-item.js +7 -1
- package/primitives/timeline-item.js.map +1 -1
- package/primitives/window.d.ts +1 -1
- package/primitives/window.d.ts.map +1 -1
- package/primitives/window.js +4 -4
- package/primitives/window.js.map +1 -1
- package/provider.d.ts +23 -43
- package/provider.d.ts.map +1 -1
- package/provider.js +152 -49
- package/provider.js.map +1 -1
- package/realtime/event-filter.d.ts +4 -0
- package/realtime/event-filter.d.ts.map +1 -1
- package/realtime/event-filter.js +4 -0
- package/realtime/event-filter.js.map +1 -1
- package/realtime/index.js +1 -1
- package/realtime/provider.d.ts +7 -2
- package/realtime/provider.d.ts.map +1 -1
- package/realtime/provider.js +23 -1
- package/realtime/provider.js.map +1 -1
- package/realtime/seen-store.d.ts +13 -0
- package/realtime/seen-store.d.ts.map +1 -1
- package/realtime/seen-store.js +14 -2
- package/realtime/seen-store.js.map +1 -1
- package/realtime/support-provider.d.ts +1 -2
- package/realtime/support-provider.d.ts.map +1 -1
- package/realtime/support-provider.js +19 -20
- package/realtime/support-provider.js.map +1 -1
- package/realtime/typing-store.d.ts +18 -0
- package/realtime/typing-store.d.ts.map +1 -1
- package/realtime/typing-store.js +19 -2
- package/realtime/typing-store.js.map +1 -1
- package/realtime/use-realtime.d.ts +8 -4
- package/realtime/use-realtime.d.ts.map +1 -1
- package/realtime/use-realtime.js +4 -0
- package/realtime/use-realtime.js.map +1 -1
- package/realtime-events.d.ts +17 -3
- package/realtime-events.d.ts.map +1 -1
- package/schemas.d.ts +7 -1
- package/schemas.d.ts.map +1 -1
- package/support/components/avatar-stack.d.ts +8 -4
- package/support/components/avatar-stack.d.ts.map +1 -1
- package/support/components/avatar-stack.js +4 -0
- package/support/components/avatar-stack.js.map +1 -1
- package/support/components/avatar.d.ts +11 -6
- package/support/components/avatar.d.ts.map +1 -1
- package/support/components/avatar.js +4 -0
- package/support/components/avatar.js.map +1 -1
- package/support/components/bubble.d.ts.map +1 -1
- package/support/components/bubble.js +29 -6
- package/support/components/bubble.js.map +1 -1
- package/support/components/button.d.ts +8 -5
- package/support/components/button.d.ts.map +1 -1
- package/support/components/button.js +5 -1
- package/support/components/button.js.map +1 -1
- package/support/components/container.d.ts +0 -1
- package/support/components/container.d.ts.map +1 -1
- package/support/components/container.js +2 -8
- package/support/components/container.js.map +1 -1
- package/support/components/conversation-button-link.d.ts +8 -21
- package/support/components/conversation-button-link.d.ts.map +1 -1
- package/support/components/conversation-button-link.js +62 -178
- package/support/components/conversation-button-link.js.map +1 -1
- package/support/components/conversation-event.d.ts.map +1 -1
- package/support/components/conversation-event.js +4 -0
- package/support/components/conversation-event.js.map +1 -1
- package/support/components/conversation-timeline.d.ts +10 -1
- package/support/components/conversation-timeline.d.ts.map +1 -1
- package/support/components/conversation-timeline.js +63 -57
- package/support/components/conversation-timeline.js.map +1 -1
- package/support/components/cossistant-branding.d.ts +5 -2
- package/support/components/cossistant-branding.d.ts.map +1 -1
- package/support/components/cossistant-branding.js +3 -0
- package/support/components/cossistant-branding.js.map +1 -1
- package/support/components/header.d.ts.map +1 -1
- package/support/components/header.js +2 -2
- package/support/components/header.js.map +1 -1
- package/support/components/icons.d.ts.map +1 -1
- package/support/components/multimodal-input.d.ts.map +1 -1
- package/support/components/multimodal-input.js +5 -24
- package/support/components/multimodal-input.js.map +1 -1
- package/support/components/navigation-tab.d.ts +7 -2
- package/support/components/navigation-tab.d.ts.map +1 -1
- package/support/components/navigation-tab.js +4 -0
- package/support/components/navigation-tab.js.map +1 -1
- package/support/components/support-content.d.ts +1 -1
- package/support/components/support-content.d.ts.map +1 -1
- package/support/components/support-content.js +7 -10
- package/support/components/support-content.js.map +1 -1
- package/support/components/text-effect.d.ts +5 -2
- package/support/components/text-effect.d.ts.map +1 -1
- package/support/components/text-effect.js +4 -0
- package/support/components/text-effect.js.map +1 -1
- package/support/components/timeline-identification-tool.d.ts +7 -0
- package/support/components/timeline-identification-tool.d.ts.map +1 -0
- package/support/components/timeline-identification-tool.js +139 -0
- package/support/components/timeline-identification-tool.js.map +1 -0
- package/support/components/timeline-message-group.d.ts +2 -1
- package/support/components/timeline-message-group.d.ts.map +1 -1
- package/support/components/timeline-message-group.js +4 -19
- package/support/components/timeline-message-group.js.map +1 -1
- package/support/components/timeline-message-item.d.ts +6 -2
- package/support/components/timeline-message-item.d.ts.map +1 -1
- package/support/components/timeline-message-item.js +8 -4
- package/support/components/timeline-message-item.js.map +1 -1
- package/support/components/typing-indicator.d.ts +5 -2
- package/support/components/typing-indicator.d.ts.map +1 -1
- package/support/components/typing-indicator.js +4 -4
- package/support/components/typing-indicator.js.map +1 -1
- package/support/components/watermark.d.ts.map +1 -1
- package/support/context/websocket.d.ts +8 -0
- package/support/context/websocket.d.ts.map +1 -1
- package/support/context/websocket.js +12 -6
- package/support/context/websocket.js.map +1 -1
- package/support/index.d.ts +8 -8
- package/support/index.d.ts.map +1 -1
- package/support/index.js +18 -18
- package/support/index.js.map +1 -1
- package/support/pages/conversation-history.js +46 -54
- package/support/pages/conversation-history.js.map +1 -1
- package/support/pages/conversation.d.ts +3 -6
- package/support/pages/conversation.d.ts.map +1 -1
- package/support/pages/conversation.js +19 -9
- package/support/pages/conversation.js.map +1 -1
- package/support/pages/home.d.ts +2 -2
- package/support/pages/home.d.ts.map +1 -1
- package/support/pages/home.js +64 -77
- package/support/pages/home.js.map +1 -1
- package/support/store/support-store.d.ts +18 -2
- package/support/store/support-store.d.ts.map +1 -1
- package/support/store/support-store.js +20 -5
- package/support/store/support-store.js.map +1 -1
- package/support/{support-CMoDLQoC.css → support-Ck4jy29i.css} +1 -2
- package/support/support-Ck4jy29i.css.map +1 -0
- package/support/text/index.d.ts +15 -2
- package/support/text/index.d.ts.map +1 -1
- package/support/text/index.js +15 -2
- package/support/text/index.js.map +1 -1
- package/support/text/locales/en.js +22 -4
- package/support/text/locales/en.js.map +1 -1
- package/support/text/locales/es.js +18 -0
- package/support/text/locales/es.js.map +1 -1
- package/support/text/locales/fr.js +18 -0
- package/support/text/locales/fr.js.map +1 -1
- package/support/text/locales/keys.d.ts +69 -9
- package/support/text/locales/keys.d.ts.map +1 -1
- package/support/text/locales/keys.js +18 -0
- package/support/text/locales/keys.js.map +1 -1
- package/support/text/runtime.d.ts +21 -0
- package/support/text/runtime.d.ts.map +1 -1
- package/support/text/runtime.js +21 -0
- package/support/text/runtime.js.map +1 -1
- package/support/utils/index.d.ts +4 -0
- package/support/utils/index.d.ts.map +1 -1
- package/support/utils/index.js +4 -1
- package/support/utils/index.js.map +1 -1
- package/support/utils/time.d.ts +3 -0
- package/support/utils/time.d.ts.map +1 -1
- package/support/utils/time.js +3 -0
- package/support/utils/time.js.map +1 -1
- package/support-config.d.ts +2 -1
- package/support-config.d.ts.map +1 -1
- package/support-config.js.map +1 -1
- package/support.css +2 -2
- package/timeline-item.d.ts +10 -0
- package/timeline-item.d.ts.map +1 -1
- package/utils/conversation.d.ts +7 -0
- package/utils/conversation.d.ts.map +1 -0
- package/utils/conversation.js +18 -0
- package/utils/conversation.js.map +1 -0
- package/utils/id.d.ts +3 -0
- package/utils/id.d.ts.map +1 -1
- package/utils/id.js +3 -0
- package/utils/id.js.map +1 -1
- package/utils/index.d.ts +2 -1
- package/utils/index.js +2 -1
- package/utils/metadata-hash.d.ts +12 -0
- package/utils/metadata-hash.d.ts.map +1 -0
- package/utils/metadata-hash.js +26 -0
- package/utils/metadata-hash.js.map +1 -0
- package/utils/text.d.ts +3 -0
- package/utils/text.d.ts.map +1 -1
- package/utils/text.js +3 -0
- package/utils/text.js.map +1 -1
- package/utils/use-render-element.d.ts +3 -0
- package/utils/use-render-element.d.ts.map +1 -1
- package/utils/use-render-element.js +3 -0
- package/utils/use-render-element.js.map +1 -1
- package/support/context/config.d.ts +0 -32
- package/support/context/config.d.ts.map +0 -1
- package/support/context/config.js +0 -27
- package/support/context/config.js.map +0 -1
- package/support/support-CMoDLQoC.css.map +0 -1
|
@@ -8,7 +8,6 @@ import { PENDING_CONVERSATION_ID } from "../../utils/id.js";
|
|
|
8
8
|
import { Watermark } from "../components/watermark.js";
|
|
9
9
|
import { useConversationHistoryPage } from "../../hooks/use-conversation-history-page.js";
|
|
10
10
|
import { ConversationButtonLink } from "../components/conversation-button-link.js";
|
|
11
|
-
import { TextEffect } from "../components/text-effect.js";
|
|
12
11
|
import { useSupport } from "../../provider.js";
|
|
13
12
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
14
13
|
|
|
@@ -49,36 +48,36 @@ const ConversationHistoryPage = () => {
|
|
|
49
48
|
if (canGoBack) goBack();
|
|
50
49
|
else navigate({ page: "HOME" });
|
|
51
50
|
};
|
|
52
|
-
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
humanAgents: availableHumanAgents,
|
|
61
|
-
size: 32,
|
|
62
|
-
spacing: 28
|
|
63
|
-
})]
|
|
64
|
-
})
|
|
65
|
-
}),
|
|
66
|
-
/* @__PURE__ */ jsx("div", {
|
|
67
|
-
className: "sticky top-4 flex flex-1 items-center justify-center",
|
|
68
|
-
children: /* @__PURE__ */ jsx("div", {
|
|
69
|
-
className: "flex flex-col items-center gap-2",
|
|
70
|
-
children: /* @__PURE__ */ jsx(TextEffect, {
|
|
71
|
-
as: "h2",
|
|
72
|
-
className: "max-w-xs text-balance text-center font-co-sans text-2xl leading-normal",
|
|
73
|
-
delay: .5,
|
|
74
|
-
preset: "fade-in-blur",
|
|
51
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Header, {
|
|
52
|
+
onGoBack: handleGoBack,
|
|
53
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
54
|
+
className: "flex w-full items-center justify-between gap-2 py-3",
|
|
55
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
56
|
+
className: "flex flex-col",
|
|
57
|
+
children: /* @__PURE__ */ jsx("h2", {
|
|
58
|
+
className: "max-w-xs text-balance font-co-sans text-md leading-normal",
|
|
75
59
|
children: text("page.conversationHistory.title")
|
|
76
60
|
})
|
|
77
|
-
})
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
61
|
+
}), /* @__PURE__ */ jsx(AvatarStack, {
|
|
62
|
+
aiAgents: availableAIAgents,
|
|
63
|
+
gapWidth: 2,
|
|
64
|
+
humanAgents: availableHumanAgents,
|
|
65
|
+
size: 32,
|
|
66
|
+
spacing: 28
|
|
67
|
+
})]
|
|
68
|
+
})
|
|
69
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
70
|
+
className: "flex flex-1 flex-col items-center justify-between gap-2 px-6 pb-4",
|
|
71
|
+
children: [history.conversations.length > 0 && /* @__PURE__ */ jsxs("div", {
|
|
72
|
+
className: "flex flex-col items-center justify-between gap-2 pt-10",
|
|
73
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
74
|
+
className: "flex w-full flex-col overflow-clip rounded-md border border-co-border/80",
|
|
75
|
+
children: history.visibleConversations.map((conversation) => /* @__PURE__ */ jsx(ConversationButtonLink, {
|
|
76
|
+
className: "rounded-none",
|
|
77
|
+
conversation,
|
|
78
|
+
onClick: () => history.openConversation(conversation.id)
|
|
79
|
+
}, conversation.id))
|
|
80
|
+
}), history.hasMore && /* @__PURE__ */ jsx(Button, {
|
|
82
81
|
className: "relative mt-6 w-full text-co-primary/40 text-xs hover:text-co-primary",
|
|
83
82
|
onClick: history.showAll,
|
|
84
83
|
variant: "ghost",
|
|
@@ -87,32 +86,25 @@ const ConversationHistoryPage = () => {
|
|
|
87
86
|
textKey: "page.conversationHistory.showMore",
|
|
88
87
|
variables: { count: history.remainingCount }
|
|
89
88
|
})
|
|
90
|
-
}), /* @__PURE__ */ jsx("div", {
|
|
91
|
-
className: "mt-6 flex w-full flex-col overflow-clip rounded-md border border-co-border/80",
|
|
92
|
-
children: history.visibleConversations.map((conversation) => /* @__PURE__ */ jsx(ConversationButtonLink, {
|
|
93
|
-
className: "rounded-none",
|
|
94
|
-
conversation,
|
|
95
|
-
onClick: () => history.openConversation(conversation.id)
|
|
96
|
-
}, conversation.id))
|
|
97
|
-
})] }), /* @__PURE__ */ jsxs("div", {
|
|
98
|
-
className: "sticky bottom-4 z-10 flex w-full flex-col items-center gap-2",
|
|
99
|
-
children: [/* @__PURE__ */ jsxs(Button, {
|
|
100
|
-
className: "relative w-full justify-between",
|
|
101
|
-
onClick: () => history.startConversation(),
|
|
102
|
-
size: "large",
|
|
103
|
-
variant: "secondary",
|
|
104
|
-
children: [/* @__PURE__ */ jsx(icons_default, {
|
|
105
|
-
className: "-translate-y-1/2 absolute top-1/2 right-4 size-3 text-co-primary/60 transition-transform duration-200 group-hover/btn:translate-x-0.5 group-hover/btn:text-co-primary",
|
|
106
|
-
name: "arrow-right",
|
|
107
|
-
variant: "default"
|
|
108
|
-
}), /* @__PURE__ */ jsx(Text, {
|
|
109
|
-
as: "span",
|
|
110
|
-
textKey: "common.actions.askQuestion"
|
|
111
|
-
})]
|
|
112
|
-
}), /* @__PURE__ */ jsx(Watermark, { className: "mt-4 mb-2" })]
|
|
113
89
|
})]
|
|
114
|
-
})
|
|
115
|
-
|
|
90
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
91
|
+
className: "sticky bottom-4 z-10 flex w-full flex-col items-center gap-2",
|
|
92
|
+
children: [/* @__PURE__ */ jsxs(Button, {
|
|
93
|
+
className: "relative w-full justify-between",
|
|
94
|
+
onClick: () => history.startConversation(),
|
|
95
|
+
size: "large",
|
|
96
|
+
variant: "secondary",
|
|
97
|
+
children: [/* @__PURE__ */ jsx(icons_default, {
|
|
98
|
+
className: "-translate-y-1/2 absolute top-1/2 right-4 size-3 text-co-primary/60 transition-transform duration-200 group-hover/btn:translate-x-0.5 group-hover/btn:text-co-primary",
|
|
99
|
+
name: "arrow-right",
|
|
100
|
+
variant: "default"
|
|
101
|
+
}), /* @__PURE__ */ jsx(Text, {
|
|
102
|
+
as: "span",
|
|
103
|
+
textKey: "common.actions.askQuestion"
|
|
104
|
+
})]
|
|
105
|
+
}), /* @__PURE__ */ jsx(Watermark, { className: "mt-4 mb-2" })]
|
|
106
|
+
})]
|
|
107
|
+
})] });
|
|
116
108
|
};
|
|
117
109
|
|
|
118
110
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-history.js","names":["ConversationHistoryPage: React.FC","Icon"],"sources":["../../../src/support/pages/conversation-history.tsx"],"sourcesContent":["import { useSupport } from \"@cossistant/react\";\nimport { PENDING_CONVERSATION_ID } from \"@cossistant/react/utils/id\";\nimport type React from \"react\";\nimport { useConversationHistoryPage } from \"../../hooks/use-conversation-history-page\";\nimport { AvatarStack } from \"../components/avatar-stack\";\nimport { Button } from \"../components/button\";\nimport { ConversationButtonLink } from \"../components/conversation-button-link\";\nimport { Header } from \"../components/header\";\nimport Icon from \"../components/icons\";\nimport { TextEffect } from \"../components/text-effect\";\nimport { Watermark } from \"../components/watermark\";\nimport { useSupportNavigation } from \"../store/support-store\";\nimport { Text, useSupportText } from \"../text\";\n\n/**\n * Conversation history page component.\n *\n * Displays:\n * - List of all conversations\n * - Pagination controls\n * - Button to start new conversation\n *\n * All logic is handled by the useConversationHistoryPage hook.\n */\nexport const ConversationHistoryPage: React.FC = () => {\n\tconst { goBack, canGoBack, navigate } = useSupportNavigation();\n\tconst { availableAIAgents, availableHumanAgents } = useSupport();\n\tconst text = useSupportText();\n\n\tconst history = useConversationHistoryPage({\n\t\tinitialVisibleCount: 4,\n\t\tonOpenConversation: (conversationId) => {\n\t\t\tnavigate({\n\t\t\t\tpage: \"CONVERSATION\",\n\t\t\t\tparams: {\n\t\t\t\t\tconversationId,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tonStartConversation: (initialMessage) => {\n\t\t\tnavigate({\n\t\t\t\tpage: \"CONVERSATION\",\n\t\t\t\tparams: {\n\t\t\t\t\tconversationId: PENDING_CONVERSATION_ID,\n\t\t\t\t\tinitialMessage,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t});\n\n\tconst handleGoBack = () => {\n\t\tif (canGoBack) {\n\t\t\tgoBack();\n\t\t} else {\n\t\t\tnavigate({\n\t\t\t\tpage: \"HOME\",\n\t\t\t});\n\t\t}\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<Header onGoBack={handleGoBack}>\n\t\t\t\t<div className=\"flex w-full items-center justify-between gap-2 py-3\">\n\t\t\t\t\t<div className=\"flex flex-col\"
|
|
1
|
+
{"version":3,"file":"conversation-history.js","names":["ConversationHistoryPage: React.FC","Icon"],"sources":["../../../src/support/pages/conversation-history.tsx"],"sourcesContent":["import { useSupport } from \"@cossistant/react\";\nimport { PENDING_CONVERSATION_ID } from \"@cossistant/react/utils/id\";\nimport type React from \"react\";\nimport { useConversationHistoryPage } from \"../../hooks/use-conversation-history-page\";\nimport { AvatarStack } from \"../components/avatar-stack\";\nimport { Button } from \"../components/button\";\nimport { ConversationButtonLink } from \"../components/conversation-button-link\";\nimport { Header } from \"../components/header\";\nimport Icon from \"../components/icons\";\nimport { TextEffect } from \"../components/text-effect\";\nimport { Watermark } from \"../components/watermark\";\nimport { useSupportNavigation } from \"../store/support-store\";\nimport { Text, useSupportText } from \"../text\";\n\n/**\n * Conversation history page component.\n *\n * Displays:\n * - List of all conversations\n * - Pagination controls\n * - Button to start new conversation\n *\n * All logic is handled by the useConversationHistoryPage hook.\n */\nexport const ConversationHistoryPage: React.FC = () => {\n\tconst { goBack, canGoBack, navigate } = useSupportNavigation();\n\tconst { availableAIAgents, availableHumanAgents } = useSupport();\n\tconst text = useSupportText();\n\n\tconst history = useConversationHistoryPage({\n\t\tinitialVisibleCount: 4,\n\t\tonOpenConversation: (conversationId) => {\n\t\t\tnavigate({\n\t\t\t\tpage: \"CONVERSATION\",\n\t\t\t\tparams: {\n\t\t\t\t\tconversationId,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tonStartConversation: (initialMessage) => {\n\t\t\tnavigate({\n\t\t\t\tpage: \"CONVERSATION\",\n\t\t\t\tparams: {\n\t\t\t\t\tconversationId: PENDING_CONVERSATION_ID,\n\t\t\t\t\tinitialMessage,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t});\n\n\tconst handleGoBack = () => {\n\t\tif (canGoBack) {\n\t\t\tgoBack();\n\t\t} else {\n\t\t\tnavigate({\n\t\t\t\tpage: \"HOME\",\n\t\t\t});\n\t\t}\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<Header onGoBack={handleGoBack}>\n\t\t\t\t<div className=\"flex w-full items-center justify-between gap-2 py-3\">\n\t\t\t\t\t<div className=\"flex flex-col\">\n\t\t\t\t\t\t<h2 className=\"max-w-xs text-balance font-co-sans text-md leading-normal\">\n\t\t\t\t\t\t\t{text(\"page.conversationHistory.title\")}\n\t\t\t\t\t\t</h2>\n\t\t\t\t\t</div>\n\t\t\t\t\t<AvatarStack\n\t\t\t\t\t\taiAgents={availableAIAgents}\n\t\t\t\t\t\tgapWidth={2}\n\t\t\t\t\t\thumanAgents={availableHumanAgents}\n\t\t\t\t\t\tsize={32}\n\t\t\t\t\t\tspacing={28}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</Header>\n\n\t\t\t<div className=\"flex flex-1 flex-col items-center justify-between gap-2 px-6 pb-4\">\n\t\t\t\t{history.conversations.length > 0 && (\n\t\t\t\t\t<div className=\"flex flex-col items-center justify-between gap-2 pt-10\">\n\t\t\t\t\t\t<div className=\"flex w-full flex-col overflow-clip rounded-md border border-co-border/80\">\n\t\t\t\t\t\t\t{history.visibleConversations.map((conversation) => (\n\t\t\t\t\t\t\t\t<ConversationButtonLink\n\t\t\t\t\t\t\t\t\tclassName=\"rounded-none\"\n\t\t\t\t\t\t\t\t\tconversation={conversation}\n\t\t\t\t\t\t\t\t\tkey={conversation.id}\n\t\t\t\t\t\t\t\t\tonClick={() => history.openConversation(conversation.id)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{history.hasMore && (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tclassName=\"relative mt-6 w-full text-co-primary/40 text-xs hover:text-co-primary\"\n\t\t\t\t\t\t\t\tonClick={history.showAll}\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\tas=\"span\"\n\t\t\t\t\t\t\t\t\ttextKey=\"page.conversationHistory.showMore\"\n\t\t\t\t\t\t\t\t\tvariables={{ count: history.remainingCount }}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<div className=\"sticky bottom-4 z-10 flex w-full flex-col items-center gap-2\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\tclassName=\"relative w-full justify-between\"\n\t\t\t\t\t\tonClick={() => history.startConversation()}\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\tclassName=\"-translate-y-1/2 absolute top-1/2 right-4 size-3 text-co-primary/60 transition-transform duration-200 group-hover/btn:translate-x-0.5 group-hover/btn:text-co-primary\"\n\t\t\t\t\t\t\tname=\"arrow-right\"\n\t\t\t\t\t\t\tvariant=\"default\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Text as=\"span\" textKey=\"common.actions.askQuestion\" />\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Watermark className=\"mt-4 mb-2\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</>\n\t);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAwBA,MAAaA,gCAA0C;CACtD,MAAM,EAAE,QAAQ,WAAW,aAAa,sBAAsB;CAC9D,MAAM,EAAE,mBAAmB,yBAAyB,YAAY;CAChE,MAAM,OAAO,gBAAgB;CAE7B,MAAM,UAAU,2BAA2B;EAC1C,qBAAqB;EACrB,qBAAqB,mBAAmB;AACvC,YAAS;IACR,MAAM;IACN,QAAQ,EACP,gBACA;IACD,CAAC;;EAEH,sBAAsB,mBAAmB;AACxC,YAAS;IACR,MAAM;IACN,QAAQ;KACP,gBAAgB;KAChB;KACA;IACD,CAAC;;EAEH,CAAC;CAEF,MAAM,qBAAqB;AAC1B,MAAI,UACH,SAAQ;MAER,UAAS,EACR,MAAM,QACN,CAAC;;AAIJ,QACC,4CACC,oBAAC;EAAO,UAAU;YACjB,qBAAC;GAAI,WAAU;cACd,oBAAC;IAAI,WAAU;cACd,oBAAC;KAAG,WAAU;eACZ,KAAK,iCAAiC;MACnC;KACA,EACN,oBAAC;IACA,UAAU;IACV,UAAU;IACV,aAAa;IACb,MAAM;IACN,SAAS;KACR;IACG;GACE,EAET,qBAAC;EAAI,WAAU;aACb,QAAQ,cAAc,SAAS,KAC/B,qBAAC;GAAI,WAAU;cACd,oBAAC;IAAI,WAAU;cACb,QAAQ,qBAAqB,KAAK,iBAClC,oBAAC;KACA,WAAU;KACI;KAEd,eAAe,QAAQ,iBAAiB,aAAa,GAAG;OADnD,aAAa,GAEjB,CACD;KACG,EACL,QAAQ,WACR,oBAAC;IACA,WAAU;IACV,SAAS,QAAQ;IACjB,SAAQ;cAER,oBAAC;KACA,IAAG;KACH,SAAQ;KACR,WAAW,EAAE,OAAO,QAAQ,gBAAgB;MAC3C;KACM;IAEL,EAGP,qBAAC;GAAI,WAAU;cACd,qBAAC;IACA,WAAU;IACV,eAAe,QAAQ,mBAAmB;IAC1C,MAAK;IACL,SAAQ;eAER,oBAACC;KACA,WAAU;KACV,MAAK;KACL,SAAQ;MACP,EACF,oBAAC;KAAK,IAAG;KAAO,SAAQ;MAA+B;KAC/C,EACT,oBAAC,aAAU,WAAU,cAAc;IAC9B;GACD,IACJ"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { TimelineItem } from "../../timeline-item.js";
|
|
2
|
-
import
|
|
2
|
+
import { ReactElement } from "react";
|
|
3
3
|
|
|
4
4
|
//#region src/support/pages/conversation.d.ts
|
|
5
5
|
type ConversationPageProps = {
|
|
@@ -22,11 +22,8 @@ type ConversationPageProps = {
|
|
|
22
22
|
* All conversation logic is handled by the useConversationPage hook,
|
|
23
23
|
* making this component focused purely on rendering and user interaction.
|
|
24
24
|
*/
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
initialMessage,
|
|
28
|
-
items: passedItems
|
|
29
|
-
}: ConversationPageProps) => react_jsx_runtime8.JSX.Element;
|
|
25
|
+
type ConversationPageComponent = (props: ConversationPageProps) => ReactElement;
|
|
26
|
+
declare const ConversationPage: ConversationPageComponent;
|
|
30
27
|
//#endregion
|
|
31
28
|
export { ConversationPage };
|
|
32
29
|
//# sourceMappingURL=conversation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.d.ts","names":[],"sources":["../../../src/support/pages/conversation.tsx"],"sourcesContent":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"conversation.d.ts","names":[],"sources":["../../../src/support/pages/conversation.tsx"],"sourcesContent":[],"mappings":";;;;KAcK,qBAAA;;AAZ8C;AA0B9B;EAWR,cAAA,EAAA,MA2GZ;;;;;;;;UAtHQ;;;;;;;;KASJ,yBAAA,WAAoC,0BAA0B;cAEtD,kBAAkB"}
|
|
@@ -1,28 +1,29 @@
|
|
|
1
1
|
import { AvatarStack } from "../components/avatar-stack.js";
|
|
2
|
-
import { useSupportNavigation } from "../store/support-store.js";
|
|
2
|
+
import { useSupportConfig, useSupportNavigation } from "../store/support-store.js";
|
|
3
3
|
import { Header } from "../components/header.js";
|
|
4
4
|
import { Text, useSupportText } from "../text/index.js";
|
|
5
|
+
import { useConversation } from "../../hooks/use-conversation.js";
|
|
5
6
|
import { useConversationPage } from "../../hooks/use-conversation-page.js";
|
|
6
7
|
import { ConversationTimelineList } from "../components/conversation-timeline.js";
|
|
7
8
|
import { MultimodalInput } from "../components/multimodal-input.js";
|
|
9
|
+
import { IdentificationTimelineTool } from "../components/timeline-identification-tool.js";
|
|
8
10
|
import { useSupport } from "../../provider.js";
|
|
11
|
+
import { useMemo } from "react";
|
|
12
|
+
import { ConversationStatus } from "@cossistant/types";
|
|
9
13
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
14
|
|
|
11
15
|
//#region src/support/pages/conversation.tsx
|
|
12
|
-
/**
|
|
13
|
-
* Main conversation page component.
|
|
14
|
-
*
|
|
15
|
-
* All conversation logic is handled by the useConversationPage hook,
|
|
16
|
-
* making this component focused purely on rendering and user interaction.
|
|
17
|
-
*/
|
|
18
16
|
const ConversationPage = ({ conversationId: initialConversationId, initialMessage, items: passedItems = [] }) => {
|
|
19
17
|
const { website, availableAIAgents, availableHumanAgents, visitor } = useSupport();
|
|
20
18
|
const { navigate, replace, goBack, canGoBack } = useSupportNavigation();
|
|
19
|
+
const { isOpen } = useSupportConfig();
|
|
21
20
|
const text = useSupportText();
|
|
21
|
+
const timelineTools = useMemo(() => ({ identification: { component: IdentificationTimelineTool } }), []);
|
|
22
22
|
const conversation = useConversationPage({
|
|
23
23
|
conversationId: initialConversationId,
|
|
24
24
|
items: passedItems,
|
|
25
25
|
initialMessage,
|
|
26
|
+
autoSeenEnabled: isOpen,
|
|
26
27
|
onConversationIdChange: (newConversationId) => {
|
|
27
28
|
replace({
|
|
28
29
|
page: "CONVERSATION",
|
|
@@ -30,6 +31,8 @@ const ConversationPage = ({ conversationId: initialConversationId, initialMessag
|
|
|
30
31
|
});
|
|
31
32
|
}
|
|
32
33
|
});
|
|
34
|
+
const { conversation: activeConversation } = useConversation(conversation.isPending ? null : conversation.conversationId, { enabled: !conversation.isPending });
|
|
35
|
+
const isConversationClosed = Boolean(activeConversation && (activeConversation.status === ConversationStatus.RESOLVED || activeConversation.status === ConversationStatus.SPAM || activeConversation.deletedAt));
|
|
33
36
|
const handleGoBack = () => {
|
|
34
37
|
if (canGoBack) goBack();
|
|
35
38
|
else navigate({ page: "HOME" });
|
|
@@ -66,9 +69,16 @@ const ConversationPage = ({ conversationId: initialConversationId, initialMessag
|
|
|
66
69
|
className: "min-h-0 flex-1 px-4",
|
|
67
70
|
conversationId: conversation.conversationId,
|
|
68
71
|
currentVisitorId: visitor?.id,
|
|
69
|
-
items: conversation.items
|
|
72
|
+
items: conversation.items,
|
|
73
|
+
tools: timelineTools
|
|
70
74
|
}),
|
|
71
|
-
/* @__PURE__ */ jsx("div", {
|
|
75
|
+
isConversationClosed ? /* @__PURE__ */ jsx("div", {
|
|
76
|
+
className: "m-4 flex items-center justify-center text-balance px-4 pb-6 text-center font-medium text-muted-foreground text-sm",
|
|
77
|
+
children: /* @__PURE__ */ jsx(Text, {
|
|
78
|
+
as: "p",
|
|
79
|
+
textKey: "component.conversationPage.closedMessage"
|
|
80
|
+
})
|
|
81
|
+
}) : /* @__PURE__ */ jsx("div", {
|
|
72
82
|
className: "flex-shrink-0 p-1",
|
|
73
83
|
children: /* @__PURE__ */ jsx(MultimodalInput, {
|
|
74
84
|
disabled: conversation.composer.isSubmitting,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.js","names":[],"sources":["../../../src/support/pages/conversation.tsx"],"sourcesContent":["import type { TimelineItem } from \"@cossistant/types/api/timeline-item\";\nimport { useConversationPage } from \"../../hooks/use-conversation-page\";\nimport { useSupport } from \"../../provider\";\nimport { AvatarStack } from \"../components/avatar-stack\";\nimport { ConversationTimelineList } from \"../components/conversation-timeline\";\nimport { Header } from \"../components/header\";\nimport { MultimodalInput } from \"../components/multimodal-input\";\nimport { useSupportNavigation } from \"../store\";\nimport { Text, useSupportText } from \"../text\";\n\ntype ConversationPageProps = {\n\t/**\n\t * The conversation ID to display (can be PENDING_CONVERSATION_ID or a real ID).\n\t */\n\tconversationId: string;\n\n\t/**\n\t * Optional initial message to send when opening the conversation.\n\t */\n\tinitialMessage?: string;\n\n\t/**\n\t * Optional timeline items to display (for optimistic updates or initial state).\n\t */\n\titems?: TimelineItem[];\n};\n\n/**\n * Main conversation page component.\n *\n * All conversation logic is handled by the useConversationPage hook,\n * making this component focused purely on rendering and user interaction.\n */\nexport const ConversationPage = ({\n\tconversationId: initialConversationId,\n\tinitialMessage,\n\titems: passedItems = [],\n}: ConversationPageProps) => {\n\tconst { website, availableAIAgents, availableHumanAgents, visitor } =\n\t\tuseSupport();\n\tconst { navigate, replace, goBack, canGoBack } = useSupportNavigation();\n\tconst text = useSupportText();\n\n\t// Main conversation hook - handles all logic\n\tconst conversation = useConversationPage({\n\t\tconversationId: initialConversationId,\n\t\titems: passedItems,\n\t\tinitialMessage,\n\t\tonConversationIdChange: (newConversationId) => {\n\t\t\t// Update navigation when conversation is created\n\t\t\treplace({\n\t\t\t\tpage: \"CONVERSATION\",\n\t\t\t\tparams: { conversationId: newConversationId },\n\t\t\t});\n\t\t},\n\t});\n\n\tconst handleGoBack = () => {\n\t\tif (canGoBack) {\n\t\t\tgoBack();\n\t\t} else {\n\t\t\tnavigate({ page: \"HOME\" });\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className=\"flex h-full flex-col gap-0 overflow-hidden\">\n\t\t\t<Header onGoBack={handleGoBack}>\n\t\t\t\t<div className=\"flex w-full items-center justify-between gap-2 py-3\">\n\t\t\t\t\t<div className=\"flex flex-col\">\n\t\t\t\t\t\t<p className=\"font-medium text-sm\">{website?.name}</p>\n\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\tas=\"p\"\n\t\t\t\t\t\t\tclassName=\"text-muted-foreground text-sm\"\n\t\t\t\t\t\t\ttextKey=\"common.labels.supportOnline\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<AvatarStack\n\t\t\t\t\t\taiAgents={availableAIAgents}\n\t\t\t\t\t\tgapWidth={2}\n\t\t\t\t\t\thumanAgents={availableHumanAgents}\n\t\t\t\t\t\tsize={32}\n\t\t\t\t\t\tspacing={28}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</Header>\n\n\t\t\t<ConversationTimelineList\n\t\t\t\tavailableAIAgents={availableAIAgents}\n\t\t\t\tavailableHumanAgents={availableHumanAgents}\n\t\t\t\tclassName=\"min-h-0 flex-1 px-4\"\n\t\t\t\tconversationId={conversation.conversationId}\n\t\t\t\tcurrentVisitorId={visitor?.id}\n\t\t\t\titems={conversation.items}\n\t\t\t/>\n\n\t\t\t<div className=\"flex-shrink-0 p-1\">\n\t\t\t\t<MultimodalInput\n\t\t\t\t\tdisabled={conversation.composer.isSubmitting}\n\t\t\t\t\terror={conversation.error}\n\t\t\t\t\tfiles={conversation.composer.files}\n\t\t\t\t\tisSubmitting={conversation.composer.isSubmitting}\n\t\t\t\t\tonChange={conversation.composer.setMessage}\n\t\t\t\t\tonFileSelect={conversation.composer.addFiles}\n\t\t\t\t\tonRemoveFile={conversation.composer.removeFile}\n\t\t\t\t\tonSubmit={conversation.composer.submit}\n\t\t\t\t\tplaceholder={text(\"component.multimodalInput.placeholder\")}\n\t\t\t\t\tvalue={conversation.composer.message}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"conversation.js","names":["ConversationPage: ConversationPageComponent"],"sources":["../../../src/support/pages/conversation.tsx"],"sourcesContent":["import { ConversationStatus } from \"@cossistant/types\";\nimport type { TimelineItem } from \"@cossistant/types/api/timeline-item\";\nimport { type ReactElement, useMemo } from \"react\";\nimport { useConversation } from \"../../hooks/use-conversation\";\nimport { useConversationPage } from \"../../hooks/use-conversation-page\";\nimport { useSupport } from \"../../provider\";\nimport { AvatarStack } from \"../components/avatar-stack\";\nimport { ConversationTimelineList } from \"../components/conversation-timeline\";\nimport { Header } from \"../components/header\";\nimport { MultimodalInput } from \"../components/multimodal-input\";\nimport { IdentificationTimelineTool } from \"../components/timeline-identification-tool\";\nimport { useSupportConfig, useSupportNavigation } from \"../store\";\nimport { Text, useSupportText } from \"../text\";\n\ntype ConversationPageProps = {\n\t/**\n\t * The conversation ID to display (can be PENDING_CONVERSATION_ID or a real ID).\n\t */\n\tconversationId: string;\n\n\t/**\n\t * Optional initial message to send when opening the conversation.\n\t */\n\tinitialMessage?: string;\n\n\t/**\n\t * Optional timeline items to display (for optimistic updates or initial state).\n\t */\n\titems?: TimelineItem[];\n};\n\n/**\n * Main conversation page component.\n *\n * All conversation logic is handled by the useConversationPage hook,\n * making this component focused purely on rendering and user interaction.\n */\ntype ConversationPageComponent = (props: ConversationPageProps) => ReactElement;\n\nexport const ConversationPage: ConversationPageComponent = ({\n\tconversationId: initialConversationId,\n\tinitialMessage,\n\titems: passedItems = [],\n}: ConversationPageProps) => {\n\tconst { website, availableAIAgents, availableHumanAgents, visitor } =\n\t\tuseSupport();\n\tconst { navigate, replace, goBack, canGoBack } = useSupportNavigation();\n\tconst { isOpen } = useSupportConfig();\n\tconst text = useSupportText();\n\n\tconst timelineTools = useMemo(\n\t\t() => ({\n\t\t\tidentification: { component: IdentificationTimelineTool },\n\t\t}),\n\t\t[]\n\t);\n\n\t// Main conversation hook - handles all logic\n\tconst conversation = useConversationPage({\n\t\tconversationId: initialConversationId,\n\t\titems: passedItems,\n\t\tinitialMessage,\n\t\tautoSeenEnabled: isOpen,\n\t\tonConversationIdChange: (newConversationId) => {\n\t\t\t// Update navigation when conversation is created\n\t\t\treplace({\n\t\t\t\tpage: \"CONVERSATION\",\n\t\t\t\tparams: { conversationId: newConversationId },\n\t\t\t});\n\t\t},\n\t});\n\n\tconst { conversation: activeConversation } = useConversation(\n\t\tconversation.isPending ? null : conversation.conversationId,\n\t\t{ enabled: !conversation.isPending }\n\t);\n\n\tconst isConversationClosed = Boolean(\n\t\tactiveConversation &&\n\t\t\t(activeConversation.status === ConversationStatus.RESOLVED ||\n\t\t\t\tactiveConversation.status === ConversationStatus.SPAM ||\n\t\t\t\tactiveConversation.deletedAt)\n\t);\n\n\tconst handleGoBack = () => {\n\t\tif (canGoBack) {\n\t\t\tgoBack();\n\t\t} else {\n\t\t\tnavigate({ page: \"HOME\" });\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className=\"flex h-full flex-col gap-0 overflow-hidden\">\n\t\t\t<Header onGoBack={handleGoBack}>\n\t\t\t\t<div className=\"flex w-full items-center justify-between gap-2 py-3\">\n\t\t\t\t\t<div className=\"flex flex-col\">\n\t\t\t\t\t\t<p className=\"font-medium text-sm\">{website?.name}</p>\n\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\tas=\"p\"\n\t\t\t\t\t\t\tclassName=\"text-muted-foreground text-sm\"\n\t\t\t\t\t\t\ttextKey=\"common.labels.supportOnline\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<AvatarStack\n\t\t\t\t\t\taiAgents={availableAIAgents}\n\t\t\t\t\t\tgapWidth={2}\n\t\t\t\t\t\thumanAgents={availableHumanAgents}\n\t\t\t\t\t\tsize={32}\n\t\t\t\t\t\tspacing={28}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</Header>\n\n\t\t\t<ConversationTimelineList\n\t\t\t\tavailableAIAgents={availableAIAgents}\n\t\t\t\tavailableHumanAgents={availableHumanAgents}\n\t\t\t\tclassName=\"min-h-0 flex-1 px-4\"\n\t\t\t\tconversationId={conversation.conversationId}\n\t\t\t\tcurrentVisitorId={visitor?.id}\n\t\t\t\titems={conversation.items}\n\t\t\t\ttools={timelineTools}\n\t\t\t/>\n\n\t\t\t{isConversationClosed ? (\n\t\t\t\t<div className=\"m-4 flex items-center justify-center text-balance px-4 pb-6 text-center font-medium text-muted-foreground text-sm\">\n\t\t\t\t\t<Text as=\"p\" textKey=\"component.conversationPage.closedMessage\" />\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<div className=\"flex-shrink-0 p-1\">\n\t\t\t\t\t<MultimodalInput\n\t\t\t\t\t\tdisabled={conversation.composer.isSubmitting}\n\t\t\t\t\t\terror={conversation.error}\n\t\t\t\t\t\tfiles={conversation.composer.files}\n\t\t\t\t\t\tisSubmitting={conversation.composer.isSubmitting}\n\t\t\t\t\t\tonChange={conversation.composer.setMessage}\n\t\t\t\t\t\tonFileSelect={conversation.composer.addFiles}\n\t\t\t\t\t\tonRemoveFile={conversation.composer.removeFile}\n\t\t\t\t\t\tonSubmit={conversation.composer.submit}\n\t\t\t\t\t\tplaceholder={text(\"component.multimodalInput.placeholder\")}\n\t\t\t\t\t\tvalue={conversation.composer.message}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n"],"mappings":";;;;;;;;;;;;;;;AAuCA,MAAaA,oBAA+C,EAC3D,gBAAgB,uBAChB,gBACA,OAAO,cAAc,EAAE,OACK;CAC5B,MAAM,EAAE,SAAS,mBAAmB,sBAAsB,YACzD,YAAY;CACb,MAAM,EAAE,UAAU,SAAS,QAAQ,cAAc,sBAAsB;CACvE,MAAM,EAAE,WAAW,kBAAkB;CACrC,MAAM,OAAO,gBAAgB;CAE7B,MAAM,gBAAgB,eACd,EACN,gBAAgB,EAAE,WAAW,4BAA4B,EACzD,GACD,EAAE,CACF;CAGD,MAAM,eAAe,oBAAoB;EACxC,gBAAgB;EAChB,OAAO;EACP;EACA,iBAAiB;EACjB,yBAAyB,sBAAsB;AAE9C,WAAQ;IACP,MAAM;IACN,QAAQ,EAAE,gBAAgB,mBAAmB;IAC7C,CAAC;;EAEH,CAAC;CAEF,MAAM,EAAE,cAAc,uBAAuB,gBAC5C,aAAa,YAAY,OAAO,aAAa,gBAC7C,EAAE,SAAS,CAAC,aAAa,WAAW,CACpC;CAED,MAAM,uBAAuB,QAC5B,uBACE,mBAAmB,WAAW,mBAAmB,YACjD,mBAAmB,WAAW,mBAAmB,QACjD,mBAAmB,WACrB;CAED,MAAM,qBAAqB;AAC1B,MAAI,UACH,SAAQ;MAER,UAAS,EAAE,MAAM,QAAQ,CAAC;;AAI5B,QACC,qBAAC;EAAI,WAAU;;GACd,oBAAC;IAAO,UAAU;cACjB,qBAAC;KAAI,WAAU;gBACd,qBAAC;MAAI,WAAU;iBACd,oBAAC;OAAE,WAAU;iBAAuB,SAAS;QAAS,EACtD,oBAAC;OACA,IAAG;OACH,WAAU;OACV,SAAQ;QACP;OACG,EACN,oBAAC;MACA,UAAU;MACV,UAAU;MACV,aAAa;MACb,MAAM;MACN,SAAS;OACR;MACG;KACE;GAET,oBAAC;IACmB;IACG;IACtB,WAAU;IACV,gBAAgB,aAAa;IAC7B,kBAAkB,SAAS;IAC3B,OAAO,aAAa;IACpB,OAAO;KACN;GAED,uBACA,oBAAC;IAAI,WAAU;cACd,oBAAC;KAAK,IAAG;KAAI,SAAQ;MAA6C;KAC7D,GAEN,oBAAC;IAAI,WAAU;cACd,oBAAC;KACA,UAAU,aAAa,SAAS;KAChC,OAAO,aAAa;KACpB,OAAO,aAAa,SAAS;KAC7B,cAAc,aAAa,SAAS;KACpC,UAAU,aAAa,SAAS;KAChC,cAAc,aAAa,SAAS;KACpC,cAAc,aAAa,SAAS;KACpC,UAAU,aAAa,SAAS;KAChC,aAAa,KAAK,wCAAwC;KAC1D,OAAO,aAAa,SAAS;MAC5B;KACG;;GAEF"}
|
package/support/pages/home.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { ReactElement } from "react";
|
|
2
2
|
|
|
3
3
|
//#region src/support/pages/home.d.ts
|
|
4
4
|
|
|
@@ -14,7 +14,7 @@ import * as react_jsx_runtime10 from "react/jsx-runtime";
|
|
|
14
14
|
*
|
|
15
15
|
* All logic is handled by the useHomePage hook.
|
|
16
16
|
*/
|
|
17
|
-
declare const HomePage: () =>
|
|
17
|
+
declare const HomePage: () => ReactElement;
|
|
18
18
|
//#endregion
|
|
19
19
|
export { HomePage };
|
|
20
20
|
//# sourceMappingURL=home.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"home.d.ts","names":[],"sources":["../../../src/support/pages/home.tsx"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"home.d.ts","names":[],"sources":["../../../src/support/pages/home.tsx"],"sourcesContent":[],"mappings":";;;;;;AA2BA;;;;;;;;;;cAAa,gBAAe"}
|
package/support/pages/home.js
CHANGED
|
@@ -7,7 +7,6 @@ import { Text, useSupportText } from "../text/index.js";
|
|
|
7
7
|
import { PENDING_CONVERSATION_ID } from "../../utils/id.js";
|
|
8
8
|
import { Watermark } from "../components/watermark.js";
|
|
9
9
|
import { ConversationButtonLink } from "../components/conversation-button-link.js";
|
|
10
|
-
import { TextEffect } from "../components/text-effect.js";
|
|
11
10
|
import { useHomePage } from "../../hooks/use-home-page.js";
|
|
12
11
|
import { useSupport } from "../../provider.js";
|
|
13
12
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -53,84 +52,72 @@ const HomePage = () => {
|
|
|
53
52
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
54
53
|
/* @__PURE__ */ jsx(Header, {}),
|
|
55
54
|
/* @__PURE__ */ jsx("div", {
|
|
56
|
-
className: "sticky top-
|
|
55
|
+
className: "sticky top-0 flex flex-1 px-6",
|
|
57
56
|
children: /* @__PURE__ */ jsxs("div", {
|
|
58
|
-
className: "flex flex-col
|
|
59
|
-
children: [
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
filter: "blur(12px)"
|
|
71
|
-
},
|
|
72
|
-
visible: {
|
|
73
|
-
opacity: 1,
|
|
74
|
-
y: 0,
|
|
75
|
-
filter: "blur(0px)"
|
|
76
|
-
},
|
|
77
|
-
exit: {
|
|
78
|
-
opacity: 0,
|
|
79
|
-
y: 20,
|
|
80
|
-
filter: "blur(12px)"
|
|
81
|
-
}
|
|
57
|
+
className: "flex flex-col gap-2",
|
|
58
|
+
children: [/* @__PURE__ */ jsxs(motion.div, {
|
|
59
|
+
animate: "visible",
|
|
60
|
+
className: "flex flex-col gap-2",
|
|
61
|
+
exit: "exit",
|
|
62
|
+
initial: "hidden",
|
|
63
|
+
transition: { delay: .1 },
|
|
64
|
+
variants: {
|
|
65
|
+
hidden: {
|
|
66
|
+
opacity: 0,
|
|
67
|
+
y: 20,
|
|
68
|
+
filter: "blur(12px)"
|
|
82
69
|
},
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
spacing: 32
|
|
88
|
-
}), /* @__PURE__ */ jsx(Text, {
|
|
89
|
-
as: "p",
|
|
90
|
-
className: "mb-4 text-co-primary/80 text-sm",
|
|
91
|
-
textKey: "page.home.tagline",
|
|
92
|
-
variables: { websiteName: website?.name ?? null }
|
|
93
|
-
})]
|
|
94
|
-
}),
|
|
95
|
-
/* @__PURE__ */ jsx(TextEffect, {
|
|
96
|
-
as: "h2",
|
|
97
|
-
className: "max-w-xs text-balance text-center font-co-sans text-2xl leading-normal",
|
|
98
|
-
delay: .5,
|
|
99
|
-
preset: "fade-in-blur",
|
|
100
|
-
children: text("page.home.greeting", { visitorName: visitor?.contact?.name ?? void 0 })
|
|
101
|
-
}),
|
|
102
|
-
quickOptions.length > 0 && /* @__PURE__ */ jsx(motion.div, {
|
|
103
|
-
animate: "visible",
|
|
104
|
-
className: "mt-6 inline-flex gap-2",
|
|
105
|
-
exit: "exit",
|
|
106
|
-
initial: "hidden",
|
|
107
|
-
transition: { delay: 1.3 },
|
|
108
|
-
variants: {
|
|
109
|
-
hidden: {
|
|
110
|
-
opacity: 0,
|
|
111
|
-
y: 20,
|
|
112
|
-
filter: "blur(12px)"
|
|
113
|
-
},
|
|
114
|
-
visible: {
|
|
115
|
-
opacity: 1,
|
|
116
|
-
y: 0,
|
|
117
|
-
filter: "blur(0px)"
|
|
118
|
-
},
|
|
119
|
-
exit: {
|
|
120
|
-
opacity: 0,
|
|
121
|
-
y: 20,
|
|
122
|
-
filter: "blur(12px)"
|
|
123
|
-
}
|
|
70
|
+
visible: {
|
|
71
|
+
opacity: 1,
|
|
72
|
+
y: 0,
|
|
73
|
+
filter: "blur(0px)"
|
|
124
74
|
},
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
75
|
+
exit: {
|
|
76
|
+
opacity: 0,
|
|
77
|
+
y: 20,
|
|
78
|
+
filter: "blur(12px)"
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
children: [/* @__PURE__ */ jsx(AvatarStack, {
|
|
82
|
+
aiAgents: website?.availableAIAgents || [],
|
|
83
|
+
humanAgents: availableHumanAgents,
|
|
84
|
+
size: 44,
|
|
85
|
+
spacing: 32
|
|
86
|
+
}), /* @__PURE__ */ jsx("h2", {
|
|
87
|
+
className: "max-w-xs text-balance font-co-sans font-medium text-2xl leading-normal",
|
|
88
|
+
children: text("page.home.greeting", { visitorName: visitor?.contact?.name?.split(" ")[0] ?? void 0 })
|
|
89
|
+
})]
|
|
90
|
+
}), quickOptions.length > 0 && /* @__PURE__ */ jsx(motion.div, {
|
|
91
|
+
animate: "visible",
|
|
92
|
+
className: "mt-6 space-x-2 space-y-2",
|
|
93
|
+
exit: "exit",
|
|
94
|
+
initial: "hidden",
|
|
95
|
+
transition: { delay: .1 },
|
|
96
|
+
variants: {
|
|
97
|
+
hidden: {
|
|
98
|
+
opacity: 0,
|
|
99
|
+
y: 20,
|
|
100
|
+
filter: "blur(12px)"
|
|
101
|
+
},
|
|
102
|
+
visible: {
|
|
103
|
+
opacity: 1,
|
|
104
|
+
y: 0,
|
|
105
|
+
filter: "blur(0px)"
|
|
106
|
+
},
|
|
107
|
+
exit: {
|
|
108
|
+
opacity: 0,
|
|
109
|
+
y: 20,
|
|
110
|
+
filter: "blur(12px)"
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
children: quickOptions?.map((option) => /* @__PURE__ */ jsx(Button, {
|
|
114
|
+
className: "inline-flex w-fit rounded-lg border-dashed px-2",
|
|
115
|
+
onClick: () => home.startConversation(option),
|
|
116
|
+
size: "default",
|
|
117
|
+
variant: "outline",
|
|
118
|
+
children: option
|
|
119
|
+
}, option))
|
|
120
|
+
})]
|
|
134
121
|
})
|
|
135
122
|
}),
|
|
136
123
|
/* @__PURE__ */ jsxs("div", {
|
|
@@ -171,7 +158,7 @@ const HomePage = () => {
|
|
|
171
158
|
as: "span",
|
|
172
159
|
textKey: "common.actions.askQuestion"
|
|
173
160
|
})]
|
|
174
|
-
}), /* @__PURE__ */ jsx(Watermark, { className: "mt-4 mb-
|
|
161
|
+
}), /* @__PURE__ */ jsx(Watermark, { className: "mt-4 mb-0" })]
|
|
175
162
|
}),
|
|
176
163
|
/* @__PURE__ */ jsx("div", {})
|
|
177
164
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"home.js","names":["Icon"],"sources":["../../../src/support/pages/home.tsx"],"sourcesContent":["import { motion } from \"motion/react\";\nimport { useHomePage } from \"../../hooks/use-home-page\";\nimport { useSupport } from \"../../provider\";\nimport { PENDING_CONVERSATION_ID } from \"../../utils/id\";\nimport { AvatarStack } from \"../components/avatar-stack\";\nimport { Button } from \"../components/button\";\nimport { ConversationButtonLink } from \"../components/conversation-button-link\";\nimport { Header } from \"../components/header\";\nimport Icon from \"../components/icons\";\nimport { TextEffect } from \"../components/text-effect\";\nimport { Watermark } from \"../components/watermark\";\nimport { useSupportNavigation } from \"../store/support-store\";\nimport { Text, useSupportText } from \"../text\";\n\n/**\n * Home page component for the support widget.\n *\n * Displays:\n * - Welcome message with available agents\n * - Quick action buttons\n * - Last open conversation (if any)\n * - Button to start new conversation\n * - Link to conversation history\n *\n * All logic is handled by the useHomePage hook.\n */\nexport const HomePage = () => {\n\tconst { website, availableHumanAgents, visitor, quickOptions } = useSupport();\n\tconst { navigate } = useSupportNavigation();\n\tconst text = useSupportText();\n\n\t// Main home page hook - handles all logic\n\tconst home = useHomePage({\n\t\tonStartConversation: (initialMessage) => {\n\t\t\tnavigate({\n\t\t\t\tpage: \"CONVERSATION\",\n\t\t\t\tparams: {\n\t\t\t\t\tconversationId: PENDING_CONVERSATION_ID,\n\t\t\t\t\tinitialMessage,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tonOpenConversation: (conversationId) => {\n\t\t\tnavigate({\n\t\t\t\tpage: \"CONVERSATION\",\n\t\t\t\tparams: {\n\t\t\t\t\tconversationId,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tonOpenConversationHistory: () => {\n\t\t\tnavigate({\n\t\t\t\tpage: \"CONVERSATION_HISTORY\",\n\t\t\t});\n\t\t},\n\t});\n\n\treturn (\n\t\t<>\n\t\t\t<Header>{/* <NavigationTab /> */}</Header>\n\t\t\t<div className=\"sticky top-
|
|
1
|
+
{"version":3,"file":"home.js","names":["Icon"],"sources":["../../../src/support/pages/home.tsx"],"sourcesContent":["import { motion } from \"motion/react\";\nimport type { ReactElement } from \"react\";\nimport { useHomePage } from \"../../hooks/use-home-page\";\nimport { useSupport } from \"../../provider\";\nimport { PENDING_CONVERSATION_ID } from \"../../utils/id\";\nimport { AvatarStack } from \"../components/avatar-stack\";\nimport { Button } from \"../components/button\";\nimport { ConversationButtonLink } from \"../components/conversation-button-link\";\nimport { Header } from \"../components/header\";\nimport Icon from \"../components/icons\";\nimport { TextEffect } from \"../components/text-effect\";\nimport { Watermark } from \"../components/watermark\";\nimport { useSupportNavigation } from \"../store/support-store\";\nimport { Text, useSupportText } from \"../text\";\n\n/**\n * Home page component for the support widget.\n *\n * Displays:\n * - Welcome message with available agents\n * - Quick action buttons\n * - Last open conversation (if any)\n * - Button to start new conversation\n * - Link to conversation history\n *\n * All logic is handled by the useHomePage hook.\n */\nexport const HomePage = (): ReactElement => {\n\tconst { website, availableHumanAgents, visitor, quickOptions } = useSupport();\n\tconst { navigate } = useSupportNavigation();\n\tconst text = useSupportText();\n\n\t// Main home page hook - handles all logic\n\tconst home = useHomePage({\n\t\tonStartConversation: (initialMessage) => {\n\t\t\tnavigate({\n\t\t\t\tpage: \"CONVERSATION\",\n\t\t\t\tparams: {\n\t\t\t\t\tconversationId: PENDING_CONVERSATION_ID,\n\t\t\t\t\tinitialMessage,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tonOpenConversation: (conversationId) => {\n\t\t\tnavigate({\n\t\t\t\tpage: \"CONVERSATION\",\n\t\t\t\tparams: {\n\t\t\t\t\tconversationId,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tonOpenConversationHistory: () => {\n\t\t\tnavigate({\n\t\t\t\tpage: \"CONVERSATION_HISTORY\",\n\t\t\t});\n\t\t},\n\t});\n\n\treturn (\n\t\t<>\n\t\t\t<Header>{/* <NavigationTab /> */}</Header>\n\t\t\t<div className=\"sticky top-0 flex flex-1 px-6\">\n\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t<motion.div\n\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\tclassName=\"flex flex-col gap-2\"\n\t\t\t\t\t\texit=\"exit\"\n\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\tdelay: 0.1,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tvariants={{\n\t\t\t\t\t\t\thidden: { opacity: 0, y: 20, filter: \"blur(12px)\" },\n\t\t\t\t\t\t\tvisible: { opacity: 1, y: 0, filter: \"blur(0px)\" },\n\t\t\t\t\t\t\texit: { opacity: 0, y: 20, filter: \"blur(12px)\" },\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<AvatarStack\n\t\t\t\t\t\t\taiAgents={website?.availableAIAgents || []}\n\t\t\t\t\t\t\thumanAgents={availableHumanAgents}\n\t\t\t\t\t\t\tsize={44}\n\t\t\t\t\t\t\tspacing={32}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<h2 className=\"max-w-xs text-balance font-co-sans font-medium text-2xl leading-normal\">\n\t\t\t\t\t\t\t{text(\"page.home.greeting\", {\n\t\t\t\t\t\t\t\tvisitorName: visitor?.contact?.name?.split(\" \")[0] ?? undefined,\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</h2>\n\t\t\t\t\t</motion.div>\n\n\t\t\t\t\t{quickOptions.length > 0 && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\tclassName=\"mt-6 space-x-2 space-y-2\"\n\t\t\t\t\t\t\texit=\"exit\"\n\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\tdelay: 0.1,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tvariants={{\n\t\t\t\t\t\t\t\thidden: { opacity: 0, y: 20, filter: \"blur(12px)\" },\n\t\t\t\t\t\t\t\tvisible: { opacity: 1, y: 0, filter: \"blur(0px)\" },\n\t\t\t\t\t\t\t\texit: { opacity: 0, y: 20, filter: \"blur(12px)\" },\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{quickOptions?.map((option) => (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tclassName=\"inline-flex w-fit rounded-lg border-dashed px-2\"\n\t\t\t\t\t\t\t\t\tkey={option}\n\t\t\t\t\t\t\t\t\tonClick={() => home.startConversation(option)}\n\t\t\t\t\t\t\t\t\tsize=\"default\"\n\t\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{option}\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-shrink-0 flex-col items-center justify-center gap-2 px-6 pb-4\">\n\t\t\t\t{home.availableConversationsCount > 0 && (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tclassName=\"relative w-full text-co-primary/40 text-xs hover:text-co-primary\"\n\t\t\t\t\t\tonClick={home.openConversationHistory}\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\tas=\"span\"\n\t\t\t\t\t\t\ttextKey=\"page.home.history.more\"\n\t\t\t\t\t\t\tvariables={{ count: home.availableConversationsCount }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\n\t\t\t\t{home.lastOpenConversation && (\n\t\t\t\t\t<div className=\"flex w-full flex-col overflow-clip rounded-md border border-co-border/80\">\n\t\t\t\t\t\t<ConversationButtonLink\n\t\t\t\t\t\t\tclassName=\"rounded-none\"\n\t\t\t\t\t\t\tconversation={home.lastOpenConversation}\n\t\t\t\t\t\t\tkey={home.lastOpenConversation.id}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tif (home.lastOpenConversation) {\n\t\t\t\t\t\t\t\t\thome.openConversation(home.lastOpenConversation.id);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<div className=\"sticky bottom-4 z-10 flex w-full flex-col items-center gap-2\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\tclassName=\"relative w-full justify-between\"\n\t\t\t\t\t\tonClick={() => home.startConversation()}\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\tclassName=\"-translate-y-1/2 absolute top-1/2 right-4 size-3 text-co-primary/60 transition-transform duration-200 group-hover/btn:translate-x-0.5 group-hover/btn:text-co-primary\"\n\t\t\t\t\t\t\tname=\"arrow-right\"\n\t\t\t\t\t\t\tvariant=\"default\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Text as=\"span\" textKey=\"common.actions.askQuestion\" />\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Watermark className=\"mt-4 mb-0\" />\n\t\t\t\t</div>\n\t\t\t\t<div />\n\t\t\t</div>\n\t\t</>\n\t);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,MAAa,iBAA+B;CAC3C,MAAM,EAAE,SAAS,sBAAsB,SAAS,iBAAiB,YAAY;CAC7E,MAAM,EAAE,aAAa,sBAAsB;CAC3C,MAAM,OAAO,gBAAgB;CAG7B,MAAM,OAAO,YAAY;EACxB,sBAAsB,mBAAmB;AACxC,YAAS;IACR,MAAM;IACN,QAAQ;KACP,gBAAgB;KAChB;KACA;IACD,CAAC;;EAEH,qBAAqB,mBAAmB;AACvC,YAAS;IACR,MAAM;IACN,QAAQ,EACP,gBACA;IACD,CAAC;;EAEH,iCAAiC;AAChC,YAAS,EACR,MAAM,wBACN,CAAC;;EAEH,CAAC;AAEF,QACC;EACC,oBAAC,WAAyC;EAC1C,oBAAC;GAAI,WAAU;aACd,qBAAC;IAAI,WAAU;eACd,qBAAC,OAAO;KACP,SAAQ;KACR,WAAU;KACV,MAAK;KACL,SAAQ;KACR,YAAY,EACX,OAAO,IACP;KACD,UAAU;MACT,QAAQ;OAAE,SAAS;OAAG,GAAG;OAAI,QAAQ;OAAc;MACnD,SAAS;OAAE,SAAS;OAAG,GAAG;OAAG,QAAQ;OAAa;MAClD,MAAM;OAAE,SAAS;OAAG,GAAG;OAAI,QAAQ;OAAc;MACjD;gBAED,oBAAC;MACA,UAAU,SAAS,qBAAqB,EAAE;MAC1C,aAAa;MACb,MAAM;MACN,SAAS;OACR,EACF,oBAAC;MAAG,WAAU;gBACZ,KAAK,sBAAsB,EAC3B,aAAa,SAAS,SAAS,MAAM,MAAM,IAAI,CAAC,MAAM,QACtD,CAAC;OACE;MACO,EAEZ,aAAa,SAAS,KACtB,oBAAC,OAAO;KACP,SAAQ;KACR,WAAU;KACV,MAAK;KACL,SAAQ;KACR,YAAY,EACX,OAAO,IACP;KACD,UAAU;MACT,QAAQ;OAAE,SAAS;OAAG,GAAG;OAAI,QAAQ;OAAc;MACnD,SAAS;OAAE,SAAS;OAAG,GAAG;OAAG,QAAQ;OAAa;MAClD,MAAM;OAAE,SAAS;OAAG,GAAG;OAAI,QAAQ;OAAc;MACjD;eAEA,cAAc,KAAK,WACnB,oBAAC;MACA,WAAU;MAEV,eAAe,KAAK,kBAAkB,OAAO;MAC7C,MAAK;MACL,SAAQ;gBAEP;QALI,OAMG,CACR;MACU;KAET;IACD;EACN,qBAAC;GAAI,WAAU;;IACb,KAAK,8BAA8B,KACnC,oBAAC;KACA,WAAU;KACV,SAAS,KAAK;KACd,SAAQ;eAER,oBAAC;MACA,IAAG;MACH,SAAQ;MACR,WAAW,EAAE,OAAO,KAAK,6BAA6B;OACrD;MACM;IAGT,KAAK,wBACL,oBAAC;KAAI,WAAU;eACd,oBAAC;MACA,WAAU;MACV,cAAc,KAAK;MAEnB,eAAe;AACd,WAAI,KAAK,qBACR,MAAK,iBAAiB,KAAK,qBAAqB,GAAG;;QAHhD,KAAK,qBAAqB,GAM9B;MACG;IAGP,qBAAC;KAAI,WAAU;gBACd,qBAAC;MACA,WAAU;MACV,eAAe,KAAK,mBAAmB;MACvC,MAAK;MACL,SAAQ;iBAER,oBAACA;OACA,WAAU;OACV,MAAK;OACL,SAAQ;QACP,EACF,oBAAC;OAAK,IAAG;OAAO,SAAQ;QAA+B;OAC/C,EACT,oBAAC,aAAU,WAAU,cAAc;MAC9B;IACN,oBAAC,UAAM;;IACF;KACJ"}
|
|
@@ -3,12 +3,20 @@ import { SupportConfig, SupportStore, SupportStoreState } from "@cossistant/core
|
|
|
3
3
|
|
|
4
4
|
//#region src/support/store/support-store.d.ts
|
|
5
5
|
type UseSupportStoreResult = SupportStoreState & Pick<SupportStore, "navigate" | "replace" | "goBack" | "open" | "close" | "toggle" | "updateConfig" | "reset">;
|
|
6
|
+
/**
|
|
7
|
+
* React hook wrapper around the shared support widget store. Exposes both the
|
|
8
|
+
* raw state and imperative actions so UI components can drive navigation or
|
|
9
|
+
* change configuration without importing the store singleton directly.
|
|
10
|
+
*/
|
|
6
11
|
declare function useSupportStore(): UseSupportStoreResult;
|
|
12
|
+
/**
|
|
13
|
+
* Shortcut hook that returns the persisted widget configuration along with
|
|
14
|
+
* open/close/toggle helpers for common UI bindings.
|
|
15
|
+
*/
|
|
7
16
|
declare const useSupportConfig: () => {
|
|
8
17
|
open: () => void;
|
|
9
18
|
close: () => void;
|
|
10
19
|
toggle: () => void;
|
|
11
|
-
mode: "floating" | "responsive";
|
|
12
20
|
size: "normal" | "larger";
|
|
13
21
|
isOpen: boolean;
|
|
14
22
|
content: {
|
|
@@ -19,6 +27,10 @@ declare const useSupportConfig: () => {
|
|
|
19
27
|
};
|
|
20
28
|
};
|
|
21
29
|
};
|
|
30
|
+
/**
|
|
31
|
+
* Provides the current navigation entry, the stack history and helpers to
|
|
32
|
+
* transition between screens inside the support widget.
|
|
33
|
+
*/
|
|
22
34
|
declare const useSupportNavigation: () => {
|
|
23
35
|
current: _cossistant_core0.NavigationState;
|
|
24
36
|
page: "HOME" | "ARTICLES" | "CONVERSATION" | "CONVERSATION_HISTORY";
|
|
@@ -32,8 +44,12 @@ declare const useSupportNavigation: () => {
|
|
|
32
44
|
goBack: () => void;
|
|
33
45
|
canGoBack: boolean;
|
|
34
46
|
};
|
|
47
|
+
/**
|
|
48
|
+
* Applies initial configuration derived from provider props or server state to
|
|
49
|
+
* the singleton support store. Call this once during bootstrapping so that the
|
|
50
|
+
* UI renders with the expected open state.
|
|
51
|
+
*/
|
|
35
52
|
declare const initializeSupportStore: (props: {
|
|
36
|
-
mode?: SupportConfig["mode"];
|
|
37
53
|
size?: SupportConfig["size"];
|
|
38
54
|
defaultOpen?: boolean;
|
|
39
55
|
}) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"support-store.d.ts","names":[],"sources":["../../../src/support/store/support-store.ts"],"sourcesContent":[],"mappings":";;;;KA8CY,qBAAA,GAAwB,oBACnC,KACC
|
|
1
|
+
{"version":3,"file":"support-store.d.ts","names":[],"sources":["../../../src/support/store/support-store.ts"],"sourcesContent":[],"mappings":";;;;KA8CY,qBAAA,GAAwB,oBACnC,KACC;;;AAFF;;;AACC,iBAiBe,eAAA,CAAA,CAjBf,EAiBkC,qBAjBlC;;AAiBD;AAuBA;AAkBA;AAiBC,cAnCY,gBAmCZ,EAAA,GAAA,GAAA;;;;;EAOY,MAAA,EAAA,OAAA;;;;;;;;;;;;;cAxBA;WAiBZ,iBAAA,CAAA;;;;;;;;;;;;;;;;;cAOY;SACL"}
|
|
@@ -5,18 +5,21 @@ import { useMemo, useRef, useSyncExternalStore } from "react";
|
|
|
5
5
|
import { createSupportStore } from "@cossistant/core";
|
|
6
6
|
|
|
7
7
|
//#region src/support/store/support-store.ts
|
|
8
|
-
const
|
|
9
|
-
const store = createSupportStore({ storage });
|
|
8
|
+
const store = createSupportStore({ storage: typeof window !== "undefined" ? window.localStorage : void 0 });
|
|
10
9
|
function useSelector(selector, isEqual = Object.is) {
|
|
11
10
|
const selectionRef = useRef(void 0);
|
|
12
11
|
const subscribe = (onStoreChange) => store.subscribe(() => {
|
|
13
12
|
onStoreChange();
|
|
14
13
|
});
|
|
15
|
-
const
|
|
16
|
-
const selected = selector(snapshot);
|
|
14
|
+
const selected = selector(useSyncExternalStore(subscribe, store.getState, store.getState));
|
|
17
15
|
if (selectionRef.current === void 0 || !isEqual(selectionRef.current, selected)) selectionRef.current = selected;
|
|
18
16
|
return selectionRef.current;
|
|
19
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* React hook wrapper around the shared support widget store. Exposes both the
|
|
20
|
+
* raw state and imperative actions so UI components can drive navigation or
|
|
21
|
+
* change configuration without importing the store singleton directly.
|
|
22
|
+
*/
|
|
20
23
|
function useSupportStore() {
|
|
21
24
|
const state = useSelector((current) => current);
|
|
22
25
|
return useMemo(() => ({
|
|
@@ -31,6 +34,10 @@ function useSupportStore() {
|
|
|
31
34
|
reset: store.reset
|
|
32
35
|
}), [state]);
|
|
33
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Shortcut hook that returns the persisted widget configuration along with
|
|
39
|
+
* open/close/toggle helpers for common UI bindings.
|
|
40
|
+
*/
|
|
34
41
|
const useSupportConfig = () => {
|
|
35
42
|
const config = useSelector((state) => state.config);
|
|
36
43
|
return useMemo(() => ({
|
|
@@ -40,6 +47,10 @@ const useSupportConfig = () => {
|
|
|
40
47
|
toggle: store.toggle
|
|
41
48
|
}), [config]);
|
|
42
49
|
};
|
|
50
|
+
/**
|
|
51
|
+
* Provides the current navigation entry, the stack history and helpers to
|
|
52
|
+
* transition between screens inside the support widget.
|
|
53
|
+
*/
|
|
43
54
|
const useSupportNavigation = () => {
|
|
44
55
|
const { current, previousPages } = useSelector((state) => state.navigation);
|
|
45
56
|
return useMemo(() => ({
|
|
@@ -53,9 +64,13 @@ const useSupportNavigation = () => {
|
|
|
53
64
|
canGoBack: previousPages.length > 0
|
|
54
65
|
}), [current, previousPages]);
|
|
55
66
|
};
|
|
67
|
+
/**
|
|
68
|
+
* Applies initial configuration derived from provider props or server state to
|
|
69
|
+
* the singleton support store. Call this once during bootstrapping so that the
|
|
70
|
+
* UI renders with the expected open state.
|
|
71
|
+
*/
|
|
56
72
|
const initializeSupportStore = (props) => {
|
|
57
73
|
const patch = {};
|
|
58
|
-
if (props.mode !== void 0) patch.mode = props.mode;
|
|
59
74
|
if (props.size !== void 0) patch.size = props.size;
|
|
60
75
|
if (props.defaultOpen !== void 0) patch.isOpen = props.defaultOpen;
|
|
61
76
|
if (Object.keys(patch).length > 0) store.updateConfig(patch);
|