@droppii-org/chat-sdk 0.1.22 → 0.1.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/bizInbox/BizThreadAvatar.d.ts +10 -0
- package/dist/components/bizInbox/BizThreadAvatar.d.ts.map +1 -0
- package/dist/components/bizInbox/BizThreadAvatar.js +8 -0
- package/dist/components/bizInbox/BizThreadCard.d.ts.map +1 -1
- package/dist/components/bizInbox/BizThreadCard.js +12 -39
- package/dist/components/bizInbox/BizThreadList.d.ts +1 -1
- package/dist/components/bizInbox/BizThreadList.d.ts.map +1 -1
- package/dist/components/bizInbox/BizThreadList.js +22 -4
- package/dist/components/bizInbox/BizThreadTitle.d.ts +8 -0
- package/dist/components/bizInbox/BizThreadTitle.d.ts.map +1 -0
- package/dist/components/bizInbox/BizThreadTitle.js +6 -0
- package/dist/components/bizInbox/index.d.ts +4 -0
- package/dist/components/bizInbox/index.d.ts.map +1 -1
- package/dist/components/bizInbox/index.js +2 -0
- package/dist/components/bizThreadDetail/BizThreadDetailHeader.d.ts +8 -0
- package/dist/components/bizThreadDetail/BizThreadDetailHeader.d.ts.map +1 -0
- package/dist/components/bizThreadDetail/BizThreadDetailHeader.js +18 -0
- package/dist/components/bizThreadDetail/BizThreadDetailInput.d.ts +9 -0
- package/dist/components/bizThreadDetail/BizThreadDetailInput.d.ts.map +1 -0
- package/dist/components/bizThreadDetail/BizThreadDetailInput.js +20 -0
- package/dist/components/bizThreadDetail/index.d.ts +5 -0
- package/dist/components/bizThreadDetail/index.d.ts.map +1 -0
- package/dist/components/bizThreadDetail/index.js +2 -0
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/locales/vi/bizInbox.json +7 -0
- package/dist/screens/bizMessage/index.d.ts.map +1 -1
- package/dist/screens/bizMessage/index.js +37 -12
- package/dist/screens/bizThreadDetail/index.d.ts +9 -0
- package/dist/screens/bizThreadDetail/index.d.ts.map +1 -0
- package/dist/screens/bizThreadDetail/index.js +36 -0
- package/dist/store/bizConversation.d.ts +12 -0
- package/dist/store/bizConversation.d.ts.map +1 -0
- package/dist/store/bizConversation.js +22 -0
- package/dist/styles/global.css +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/biz.d.ts +20 -17
- package/dist/types/biz.d.ts.map +1 -1
- package/dist/types/biz.js +17 -1
- package/dist/utils/bizConversation.d.ts +11 -0
- package/dist/utils/bizConversation.d.ts.map +1 -0
- package/dist/utils/bizConversation.js +65 -0
- package/package.json +126 -125
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BizChatCategory } from "../../types/biz";
|
|
2
|
+
export interface BizThreadAvatarProps {
|
|
3
|
+
chatCategory: BizChatCategory;
|
|
4
|
+
displayName: string;
|
|
5
|
+
avatarUrl: string | null;
|
|
6
|
+
badgeLabel: string;
|
|
7
|
+
}
|
|
8
|
+
declare const BizThreadAvatar: ({ chatCategory, displayName, avatarUrl, badgeLabel, }: BizThreadAvatarProps) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export default BizThreadAvatar;
|
|
10
|
+
//# sourceMappingURL=BizThreadAvatar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BizThreadAvatar.d.ts","sourceRoot":"","sources":["../../../src/components/bizInbox/BizThreadAvatar.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,eAAe,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,eAAe,GAAI,uDAKtB,oBAAoB,4CA8BtB,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import clsx from "clsx";
|
|
4
|
+
import { Icon } from "../icon";
|
|
5
|
+
import { BizChatCategory } from "../../types/biz";
|
|
6
|
+
import { resolveBizBadgeColor } from "../../utils/bizConversation";
|
|
7
|
+
const BizThreadAvatar = ({ chatCategory, displayName, avatarUrl, badgeLabel, }) => (_jsxs("div", { className: "relative h-12 w-12 shrink-0", children: [avatarUrl ? (_jsx("img", { src: avatarUrl, alt: displayName, className: "h-12 w-12 rounded-full object-cover" })) : (_jsx("div", { className: "flex h-12 w-12 items-center justify-center rounded-full bg-[#0C5CFF] text-white", children: chatCategory === BizChatCategory.GROUP ? (_jsx(Icon, { icon: "user-two-b", size: 20 })) : chatCategory === BizChatCategory.BIZ_BOT_PDP ? (_jsx(Icon, { icon: "droppii-o-1", size: 20 })) : (_jsx(Icon, { icon: "user-o", size: 20 })) })), badgeLabel && (_jsx("span", { className: clsx("absolute -bottom-px -right-px flex h-[17px] items-center justify-center gap-2 rounded-md border border-white px-1 text-[10px] font-semibold leading-3 text-white shadow-[inset_2px_6px_8px_0_rgba(0,0,0,0.40)]", resolveBizBadgeColor(chatCategory)), children: badgeLabel }))] }));
|
|
8
|
+
export default BizThreadAvatar;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BizThreadCard.d.ts","sourceRoot":"","sources":["../../../src/components/bizInbox/BizThreadCard.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BizThreadCard.d.ts","sourceRoot":"","sources":["../../../src/components/bizInbox/BizThreadCard.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAY3D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,IAAI,CAAC;CAC9C;AAOD,QAAA,MAAM,aAAa,GAAI,mBAAmB,kBAAkB,4CA+C3D,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -1,52 +1,25 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useMemo } from "react";
|
|
4
3
|
import { useTranslation } from "react-i18next";
|
|
5
|
-
import clsx from "clsx";
|
|
6
|
-
import { Icon } from "../icon";
|
|
7
4
|
import { formatTimestamp } from "../../utils/common";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
return fullName;
|
|
14
|
-
const username = (_b = item.peer.user.username) === null || _b === void 0 ? void 0 : _b.trim();
|
|
15
|
-
if (username)
|
|
16
|
-
return username;
|
|
17
|
-
}
|
|
18
|
-
if (item.peer.group) {
|
|
19
|
-
const groupName = (_c = item.peer.group.name) === null || _c === void 0 ? void 0 : _c.trim();
|
|
20
|
-
if (groupName)
|
|
21
|
-
return groupName;
|
|
22
|
-
}
|
|
23
|
-
return fallback;
|
|
24
|
-
};
|
|
25
|
-
const resolveAvatarUrl = (item) => {
|
|
26
|
-
var _a, _b, _c, _d;
|
|
27
|
-
return (_d = (_b = (_a = item.peer.user) === null || _a === void 0 ? void 0 : _a.avatar) !== null && _b !== void 0 ? _b : (_c = item.peer.group) === null || _c === void 0 ? void 0 : _c.avatar) !== null && _d !== void 0 ? _d : null;
|
|
28
|
-
};
|
|
29
|
-
const formatLatestMessageTime = (latestMessageAt) => {
|
|
30
|
-
if (!latestMessageAt)
|
|
31
|
-
return "";
|
|
32
|
-
const timestamp = new Date(latestMessageAt).getTime();
|
|
33
|
-
if (Number.isNaN(timestamp))
|
|
5
|
+
import { resolveBizAvatarUrl, resolveBizBadgeLabel, resolveBizDisplayName, resolveBizLastMessagePreview, resolveBizLastMessageTime, } from "../../utils/bizConversation";
|
|
6
|
+
import BizThreadAvatar from "./BizThreadAvatar";
|
|
7
|
+
import BizThreadTitle from "./BizThreadTitle";
|
|
8
|
+
const formatLatestMessageTime = (sendTime) => {
|
|
9
|
+
if (!sendTime)
|
|
34
10
|
return "";
|
|
35
|
-
return formatTimestamp(
|
|
11
|
+
return formatTimestamp(sendTime, { hasTime: true });
|
|
36
12
|
};
|
|
37
13
|
const BizThreadCard = ({ item, onClick }) => {
|
|
38
14
|
const { t } = useTranslation("bizInbox");
|
|
39
|
-
const displayName =
|
|
40
|
-
const avatarUrl =
|
|
41
|
-
const badgeLabel = item.chatCategory
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
? t("thread_card.badge.bot")
|
|
45
|
-
: "";
|
|
46
|
-
const latestMessageTime = formatLatestMessageTime(item.latestMessageAt);
|
|
15
|
+
const displayName = resolveBizDisplayName(item, t("thread_card.fallback_name"));
|
|
16
|
+
const avatarUrl = resolveBizAvatarUrl(item);
|
|
17
|
+
const badgeLabel = resolveBizBadgeLabel(item.chatCategory, t);
|
|
18
|
+
const latestMessagePreview = resolveBizLastMessagePreview(item.lastMessage, t);
|
|
19
|
+
const latestMessageTime = formatLatestMessageTime(resolveBizLastMessageTime(item.lastMessage));
|
|
47
20
|
const handleClick = () => {
|
|
48
21
|
onClick(item);
|
|
49
22
|
};
|
|
50
|
-
return (_jsxs("button", { type: "button", onClick: handleClick, "data-testid": "biz-inbox-thread-card", className: "flex w-full shrink-0 items-center gap-2 border-b border-
|
|
23
|
+
return (_jsxs("button", { type: "button", onClick: handleClick, "data-testid": "biz-inbox-thread-card", className: "flex w-full shrink-0 items-center gap-2 border-b border-[#EFEFEF] bg-white p-3 text-left transition-colors hover:bg-gray-50 focus:outline-none focus-visible:ring-2 focus-visible:ring-[#1677ff]", children: [_jsx(BizThreadAvatar, { chatCategory: item.chatCategory, displayName: displayName, avatarUrl: avatarUrl, badgeLabel: badgeLabel }), _jsxs("div", { className: "flex min-w-0 flex-1 flex-col pt-0.5", children: [_jsx(BizThreadTitle, { chatCategory: item.chatCategory, displayName: displayName }), _jsx("p", { className: "min-h-[22.4px] truncate text-[14px] font-normal leading-[160%] tracking-[0.14px] text-[#5C6366] [font-feature-settings:'liga'_off,'clig'_off]", children: latestMessagePreview })] }), latestMessageTime && (_jsx("span", { className: "shrink-0 text-[12px] font-normal leading-[160%] text-[#747B7E] [font-feature-settings:'liga'_off,'clig'_off]", children: latestMessageTime }))] }));
|
|
51
24
|
};
|
|
52
25
|
export default BizThreadCard;
|
|
@@ -4,7 +4,7 @@ export interface BizThreadListProps {
|
|
|
4
4
|
isFetchingNextPage: boolean;
|
|
5
5
|
hasNextPage: boolean;
|
|
6
6
|
onLoadMore: () => void;
|
|
7
|
-
onSelectThread
|
|
7
|
+
onSelectThread?: (item: BizConversationItem) => void;
|
|
8
8
|
}
|
|
9
9
|
declare const BizThreadList: ({ items, isFetchingNextPage, hasNextPage, onLoadMore, onSelectThread, }: BizThreadListProps) => import("react/jsx-runtime").JSX.Element;
|
|
10
10
|
export default BizThreadList;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BizThreadList.d.ts","sourceRoot":"","sources":["../../../src/components/bizInbox/BizThreadList.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BizThreadList.d.ts","sourceRoot":"","sources":["../../../src/components/bizInbox/BizThreadList.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAK3D,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,IAAI,CAAC;CACtD;AAYD,QAAA,MAAM,aAAa,GAAI,yEAMpB,kBAAkB,4CAoEpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -1,17 +1,35 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import {
|
|
3
|
+
import { usePathname, useRouter, useSearchParams } from "next/navigation";
|
|
4
|
+
import { useTranslation } from "react-i18next";
|
|
4
5
|
import { Empty } from "antd";
|
|
5
6
|
import InfiniteScroll from "react-infinite-scroll-component";
|
|
7
|
+
import useBizConversationStore from "../../store/bizConversation";
|
|
6
8
|
import { Icon } from "../icon";
|
|
7
9
|
import BizThreadCard from "./BizThreadCard";
|
|
8
10
|
const FooterSkeleton = () => (_jsxs("div", { className: "flex items-center gap-3 p-3", children: [_jsx("div", { className: "h-10 w-10 animate-pulse rounded-full bg-neutral-200" }), _jsxs("div", { className: "flex flex-1 flex-col gap-2", children: [_jsx("div", { className: "h-3 w-1/2 animate-pulse rounded bg-neutral-200" }), _jsx("div", { className: "h-2.5 w-1/3 animate-pulse rounded bg-neutral-200" })] })] }));
|
|
9
11
|
const BizThreadList = ({ items, isFetchingNextPage, hasNextPage, onLoadMore, onSelectThread, }) => {
|
|
10
|
-
const
|
|
12
|
+
const { t } = useTranslation("bizInbox");
|
|
13
|
+
const router = useRouter();
|
|
14
|
+
const pathname = usePathname();
|
|
15
|
+
const searchParams = useSearchParams();
|
|
16
|
+
const selectConversation = useBizConversationStore((state) => state.selectConversation);
|
|
17
|
+
const handleSelectThread = (item) => {
|
|
18
|
+
selectConversation(item);
|
|
19
|
+
if (searchParams.get("threadId") === item.conversationId) {
|
|
20
|
+
onSelectThread === null || onSelectThread === void 0 ? void 0 : onSelectThread(item);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const newSearchParams = new URLSearchParams(searchParams);
|
|
24
|
+
newSearchParams.set("threadId", item.conversationId);
|
|
25
|
+
router.push(`${pathname}?${newSearchParams.toString()}`);
|
|
26
|
+
onSelectThread === null || onSelectThread === void 0 ? void 0 : onSelectThread(item);
|
|
27
|
+
};
|
|
28
|
+
const handleEndReached = () => {
|
|
11
29
|
if (hasNextPage && !isFetchingNextPage) {
|
|
12
30
|
onLoadMore();
|
|
13
31
|
}
|
|
14
|
-
}
|
|
15
|
-
return (_jsx("div", { id: "scrollableBizThreadsDiv", "data-testid": "biz-inbox-thread-list", className: "min-h-0 w-full flex-1 overflow-auto", children: _jsx(InfiniteScroll, { dataLength: items.length, next: handleEndReached, hasMore: hasNextPage, loader: isFetchingNextPage ? _jsx(FooterSkeleton, {}) : null, scrollableTarget: "scrollableBizThreadsDiv", children: items.length === 0 ? (_jsx("div", { className: "flex items-center justify-center py-12", children: _jsx(Empty, { image: _jsx(Icon, { icon: "chat-square-b", size: 80, className: "text-gray-300" }), description: "
|
|
32
|
+
};
|
|
33
|
+
return (_jsx("div", { id: "scrollableBizThreadsDiv", "data-testid": "biz-inbox-thread-list", className: "min-h-0 w-full flex-1 overflow-auto", children: _jsx(InfiniteScroll, { dataLength: items.length, next: handleEndReached, hasMore: hasNextPage, loader: isFetchingNextPage ? _jsx(FooterSkeleton, {}) : null, scrollableTarget: "scrollableBizThreadsDiv", children: items.length === 0 ? (_jsx("div", { className: "flex items-center justify-center py-12", children: _jsx(Empty, { image: _jsx(Icon, { icon: "chat-square-b", size: 80, className: "text-gray-300" }), description: t("empty.no_conversations") }) })) : (items.map((item) => (_jsx(BizThreadCard, { item: item, onClick: handleSelectThread }, item.conversationId)))) }) }));
|
|
16
34
|
};
|
|
17
35
|
export default BizThreadList;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BizChatCategory } from "../../types/biz";
|
|
2
|
+
export interface BizThreadTitleProps {
|
|
3
|
+
chatCategory: BizChatCategory;
|
|
4
|
+
displayName: string;
|
|
5
|
+
}
|
|
6
|
+
declare const BizThreadTitle: ({ chatCategory, displayName }: BizThreadTitleProps) => import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export default BizThreadTitle;
|
|
8
|
+
//# sourceMappingURL=BizThreadTitle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BizThreadTitle.d.ts","sourceRoot":"","sources":["../../../src/components/bizInbox/BizThreadTitle.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,eAAe,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,QAAA,MAAM,cAAc,GAAI,+BAA+B,mBAAmB,4CAczE,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Icon } from "../icon";
|
|
4
|
+
import { BizChatCategory } from "../../types/biz";
|
|
5
|
+
const BizThreadTitle = ({ chatCategory, displayName }) => (_jsxs("div", { className: "flex min-w-0 items-center gap-1", children: [chatCategory === BizChatCategory.GROUP && (_jsx(Icon, { icon: "user-two-b", size: 12, className: "shrink-0 text-black" })), chatCategory === BizChatCategory.BIZ_BOT_PDP && (_jsx("span", { className: "flex h-4 w-4 shrink-0 items-center justify-center gap-0.5 rounded-full border border-white bg-[linear-gradient(93deg,#607CFB_0%,#1B3FE4_100%)] px-1 py-0.5 text-white", children: _jsx(Icon, { icon: "shield-done-b", size: 8 }) })), _jsx("span", { className: "truncate text-[16px] font-[510] leading-[160%] text-black", children: displayName })] }));
|
|
6
|
+
export default BizThreadTitle;
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
export { default as BizInboxHeader } from "./BizInboxHeader";
|
|
2
|
+
export { default as BizThreadAvatar } from "./BizThreadAvatar";
|
|
3
|
+
export type { BizThreadAvatarProps } from "./BizThreadAvatar";
|
|
4
|
+
export { default as BizThreadTitle } from "./BizThreadTitle";
|
|
5
|
+
export type { BizThreadTitleProps } from "./BizThreadTitle";
|
|
2
6
|
export { default as BizThreadCard } from "./BizThreadCard";
|
|
3
7
|
export type { BizThreadCardProps } from "./BizThreadCard";
|
|
4
8
|
export { default as BizThreadList } from "./BizThreadList";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/bizInbox/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAE7D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/bizInbox/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAE7D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7D,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export { default as BizInboxHeader } from "./BizInboxHeader";
|
|
2
|
+
export { default as BizThreadAvatar } from "./BizThreadAvatar";
|
|
3
|
+
export { default as BizThreadTitle } from "./BizThreadTitle";
|
|
2
4
|
export { default as BizThreadCard } from "./BizThreadCard";
|
|
3
5
|
export { default as BizThreadList } from "./BizThreadList";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { BizConversationItem } from "../../types/biz";
|
|
2
|
+
export interface BizThreadDetailHeaderProps {
|
|
3
|
+
conversation: BizConversationItem;
|
|
4
|
+
onBack?: () => void;
|
|
5
|
+
}
|
|
6
|
+
declare const BizThreadDetailHeader: ({ conversation, onBack, }: BizThreadDetailHeaderProps) => import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export default BizThreadDetailHeader;
|
|
8
|
+
//# sourceMappingURL=BizThreadDetailHeader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BizThreadDetailHeader.d.ts","sourceRoot":"","sources":["../../../src/components/bizThreadDetail/BizThreadDetailHeader.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAQ3D,MAAM,WAAW,0BAA0B;IACzC,YAAY,EAAE,mBAAmB,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAqBD,QAAA,MAAM,qBAAqB,GAAI,2BAG5B,0BAA0B,4CA8C5B,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useTranslation } from "react-i18next";
|
|
4
|
+
import { Icon } from "../icon";
|
|
5
|
+
import BizThreadAvatar from "../bizInbox/BizThreadAvatar";
|
|
6
|
+
import BizThreadTitle from "../bizInbox/BizThreadTitle";
|
|
7
|
+
import { isBizGroupChat, resolveBizAvatarUrl, resolveBizBadgeLabel, resolveBizDisplayName, } from "../../utils/bizConversation";
|
|
8
|
+
const HeaderIconButton = ({ icon, onClick, testId, }) => (_jsx("button", { type: "button", onClick: onClick, "data-testid": testId, className: "flex shrink-0 cursor-pointer items-center justify-center p-2 text-[#1B3FE4]", children: _jsx(Icon, { icon: icon, size: 24 }) }));
|
|
9
|
+
const BizThreadDetailHeader = ({ conversation, onBack, }) => {
|
|
10
|
+
const { t } = useTranslation("bizInbox");
|
|
11
|
+
const isGroup = isBizGroupChat(conversation);
|
|
12
|
+
const displayName = resolveBizDisplayName(conversation, t("thread_card.fallback_name"));
|
|
13
|
+
const avatarUrl = resolveBizAvatarUrl(conversation);
|
|
14
|
+
const badgeLabel = resolveBizBadgeLabel(conversation.chatCategory, t);
|
|
15
|
+
const subtitle = isGroup ? "" : t("thread_detail.profile_hint");
|
|
16
|
+
return (_jsxs("div", { "data-testid": "biz-thread-detail-header", className: "flex w-full cursor-default items-center border-b border-[#EFEFEF] bg-white p-2 shadow-[inset_0px_-1px_0px_0px_rgba(61,63,64,0.1)]", children: [_jsx(HeaderIconButton, { icon: "arrow-left-o", onClick: onBack, testId: "biz-thread-detail-back" }), _jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-2 px-1", "data-testid": "biz-thread-detail-profile", children: [_jsx(BizThreadAvatar, { chatCategory: conversation.chatCategory, displayName: displayName, avatarUrl: avatarUrl, badgeLabel: badgeLabel }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx(BizThreadTitle, { chatCategory: conversation.chatCategory, displayName: displayName }), _jsx("p", { className: "truncate text-[10px] font-normal leading-[160%] tracking-[0.1px] text-[#5C6366] [font-feature-settings:'liga'_off,'clig'_off]", children: subtitle })] })] })] }));
|
|
17
|
+
};
|
|
18
|
+
export default BizThreadDetailHeader;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface BizThreadDetailInputProps {
|
|
2
|
+
placeholder?: string;
|
|
3
|
+
onSendClick?: () => void;
|
|
4
|
+
onInputChange?: (value: string) => void;
|
|
5
|
+
value?: string;
|
|
6
|
+
}
|
|
7
|
+
declare const BizThreadDetailInput: ({ placeholder, onSendClick, onInputChange, value: controlledValue, }: BizThreadDetailInputProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export default BizThreadDetailInput;
|
|
9
|
+
//# sourceMappingURL=BizThreadDetailInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BizThreadDetailInput.d.ts","sourceRoot":"","sources":["../../../src/components/bizThreadDetail/BizThreadDetailInput.tsx"],"names":[],"mappings":"AAOA,MAAM,WAAW,yBAAyB;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,QAAA,MAAM,oBAAoB,GAAI,sEAK3B,yBAAyB,4CA+C3B,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { useTranslation } from "react-i18next";
|
|
5
|
+
import clsx from "clsx";
|
|
6
|
+
import { Icon } from "../icon";
|
|
7
|
+
const BizThreadDetailInput = ({ placeholder, onSendClick, onInputChange, value: controlledValue, }) => {
|
|
8
|
+
const { t } = useTranslation("bizInbox");
|
|
9
|
+
const [internalValue, setInternalValue] = useState("");
|
|
10
|
+
const value = controlledValue !== null && controlledValue !== void 0 ? controlledValue : internalValue;
|
|
11
|
+
const canSend = value.trim().length > 0;
|
|
12
|
+
const handleChange = (nextValue) => {
|
|
13
|
+
if (controlledValue === undefined) {
|
|
14
|
+
setInternalValue(nextValue);
|
|
15
|
+
}
|
|
16
|
+
onInputChange === null || onInputChange === void 0 ? void 0 : onInputChange(nextValue);
|
|
17
|
+
};
|
|
18
|
+
return (_jsx("div", { "data-testid": "biz-thread-detail-input", className: "flex w-full shrink-0 flex-col bg-[rgba(131,137,157,0.05)]", children: _jsxs("div", { className: "flex items-center gap-3 px-3 py-2", children: [_jsx("div", { className: "flex min-h-[48px] min-w-0 flex-1 items-center rounded-xl border border-[#DDDEDF] bg-white", children: _jsx("input", { type: "text", value: value, onChange: (e) => handleChange(e.target.value), placeholder: placeholder !== null && placeholder !== void 0 ? placeholder : t("thread_detail.input_placeholder"), "data-testid": "biz-thread-detail-message-input", className: "min-w-0 flex-1 bg-transparent px-3 py-3 text-[16px] leading-[160%] tracking-[0.16px] text-black outline-none placeholder:text-[#747B7E]" }) }), _jsx("div", { className: "flex shrink-0 items-center py-1", children: _jsx("button", { type: "button", onClick: onSendClick, disabled: !canSend, "data-testid": "biz-thread-detail-send", className: clsx("flex h-10 w-10 items-center justify-center rounded-full", canSend ? "bg-[#002BEB]" : "bg-[#002BEB] opacity-25"), children: _jsx(Icon, { icon: "send-b", size: 20, className: "text-white" }) }) })] }) }));
|
|
19
|
+
};
|
|
20
|
+
export default BizThreadDetailInput;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { default as BizThreadDetailHeader } from "./BizThreadDetailHeader";
|
|
2
|
+
export type { BizThreadDetailHeaderProps } from "./BizThreadDetailHeader";
|
|
3
|
+
export { default as BizThreadDetailInput } from "./BizThreadDetailInput";
|
|
4
|
+
export type { BizThreadDetailInputProps } from "./BizThreadDetailInput";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/bizThreadDetail/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAC3E,YAAY,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAE1E,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,YAAY,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -15,12 +15,18 @@ export { DChatDeskMessage, DChatBubble, Icon };
|
|
|
15
15
|
export { default as RichTextEditor } from "./components/richTextEditor/RichTextEditor";
|
|
16
16
|
export { default as DChatBizInbox } from "./screens/bizMessage";
|
|
17
17
|
export type { DChatBizInboxProps } from "./screens/bizMessage";
|
|
18
|
-
export
|
|
18
|
+
export { default as DChatBizThreadDetail } from "./screens/bizThreadDetail";
|
|
19
|
+
export type { DChatBizThreadDetailProps } from "./screens/bizThreadDetail";
|
|
20
|
+
export { BizThreadDetailHeader, BizThreadDetailInput, } from "./components/bizThreadDetail";
|
|
21
|
+
export type { BizThreadDetailHeaderProps, BizThreadDetailInputProps, } from "./components/bizThreadDetail";
|
|
22
|
+
export { BizChatCategory, BizChatType, BizPeerType, } from "./types/biz";
|
|
23
|
+
export type { BizConversationItem, BizConversationPeer, BizCreateConversationData, BizConversationMember, } from "./types/biz";
|
|
19
24
|
export { useDChatAuth } from "./hooks/user/useAuth";
|
|
20
25
|
export { useUpdateFcmToken } from "./hooks/user/useUpdateFcmToken";
|
|
21
|
-
export { useCreateBizConversation } from "./hooks/biz";
|
|
26
|
+
export { useBizConversationList, useCreateBizConversation, } from "./hooks/biz";
|
|
22
27
|
export type { CreateBizConversationInput } from "./hooks/biz";
|
|
23
28
|
export { useUserStore, DChatApplicationType, useAuthStore };
|
|
29
|
+
export { default as useBizConversationStore } from "./store/bizConversation";
|
|
24
30
|
export { Platform as DChatPlatform, LogLevel as DChatLogLevel, SessionType as DChatSessionType, };
|
|
25
31
|
export type { DChatInitAndLoginConfig };
|
|
26
32
|
export { getDChatSDK } from "./constants/sdk";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,CAAC;AAExB,OAAO,gBAAgB,MAAM,uBAAuB,CAAC;AACrD,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,YAAY,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,YAAY,MAAM,cAAc,CAAC;AACxC,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,OAAO,IAAI,EAAE,EAAE,MAAM,cAAc,CAAC;AAC7C,cAAc,eAAe,CAAC;AAG9B,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGrE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAEvF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChE,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,CAAC;AAExB,OAAO,gBAAgB,MAAM,uBAAuB,CAAC;AACrD,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,YAAY,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,YAAY,MAAM,cAAc,CAAC;AACxC,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,OAAO,IAAI,EAAE,EAAE,MAAM,cAAc,CAAC;AAC7C,cAAc,eAAe,CAAC;AAG9B,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGrE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAEvF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChE,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAC5E,YAAY,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAE3E,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,eAAe,EACf,WAAW,EACX,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EACL,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAG9D,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAI7E,OAAO,EACL,QAAQ,IAAI,aAAa,EACzB,QAAQ,IAAI,aAAa,EACzB,WAAW,IAAI,gBAAgB,GAChC,CAAC;AAEF,YAAY,EAAE,uBAAuB,EAAE,CAAC;AAExC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -16,12 +16,16 @@ export { ChatProvider, useChatContext } from "./context/ChatContext";
|
|
|
16
16
|
export { DChatDeskMessage, DChatBubble, Icon };
|
|
17
17
|
export { default as RichTextEditor } from "./components/richTextEditor/RichTextEditor";
|
|
18
18
|
export { default as DChatBizInbox } from "./screens/bizMessage";
|
|
19
|
+
export { default as DChatBizThreadDetail } from "./screens/bizThreadDetail";
|
|
20
|
+
export { BizThreadDetailHeader, BizThreadDetailInput, } from "./components/bizThreadDetail";
|
|
21
|
+
export { BizChatCategory, BizChatType, BizPeerType, } from "./types/biz";
|
|
19
22
|
//Hooks
|
|
20
23
|
export { useDChatAuth } from "./hooks/user/useAuth";
|
|
21
24
|
export { useUpdateFcmToken } from "./hooks/user/useUpdateFcmToken";
|
|
22
|
-
export { useCreateBizConversation } from "./hooks/biz";
|
|
25
|
+
export { useBizConversationList, useCreateBizConversation, } from "./hooks/biz";
|
|
23
26
|
//Store
|
|
24
27
|
export { useUserStore, DChatApplicationType, useAuthStore };
|
|
28
|
+
export { default as useBizConversationStore } from "./store/bizConversation";
|
|
25
29
|
// export * from "./types/sdk";
|
|
26
30
|
export { Platform as DChatPlatform, LogLevel as DChatLogLevel, SessionType as DChatSessionType, };
|
|
27
31
|
export { getDChatSDK } from "./constants/sdk";
|
|
@@ -2,11 +2,18 @@
|
|
|
2
2
|
"tabs": {
|
|
3
3
|
"messages": "Tin nhắn"
|
|
4
4
|
},
|
|
5
|
+
"empty": {
|
|
6
|
+
"no_conversations": "Chưa có cuộc trò chuyện"
|
|
7
|
+
},
|
|
5
8
|
"thread_card": {
|
|
6
9
|
"fallback_name": "Người dùng",
|
|
7
10
|
"badge": {
|
|
8
11
|
"mall": "Mall",
|
|
9
12
|
"bot": "Bot"
|
|
10
13
|
}
|
|
14
|
+
},
|
|
15
|
+
"thread_detail": {
|
|
16
|
+
"profile_hint": "Nhấn để xem thông tin",
|
|
17
|
+
"input_placeholder": "Nhập tin nhắn..."
|
|
11
18
|
}
|
|
12
19
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/screens/bizMessage/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/screens/bizMessage/index.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAG3D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,CAAC,YAAY,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,aAAa,GAAI,0CAIpB,kBAAkB,4CA8EpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -1,30 +1,55 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import {
|
|
3
|
+
import { useEffect } from "react";
|
|
4
|
+
import { useSearchParams } from "next/navigation";
|
|
5
|
+
import { useTranslation } from "react-i18next";
|
|
4
6
|
import { Empty } from "antd";
|
|
5
7
|
import clsx from "clsx";
|
|
6
8
|
import useAuthStore from "../../store/auth";
|
|
9
|
+
import useBizConversationStore from "../../store/bizConversation";
|
|
7
10
|
import { useBizConversationList } from "../../hooks/biz";
|
|
8
|
-
import { BizInboxHeader
|
|
11
|
+
import { BizInboxHeader } from "../../components/bizInbox";
|
|
12
|
+
import BizThreadList from "../../components/bizInbox/BizThreadList";
|
|
13
|
+
import DChatBizThreadDetail from "../bizThreadDetail";
|
|
9
14
|
import { PAGE_SIZE } from "../../constants";
|
|
10
15
|
import { DChatApplicationType } from "../../types/chat";
|
|
11
16
|
import { Icon } from "../../components/icon";
|
|
12
17
|
const DChatBizInbox = ({ pageSize = PAGE_SIZE.medium, onSelectThread, className, }) => {
|
|
18
|
+
const { t } = useTranslation("bizInbox");
|
|
19
|
+
const searchParams = useSearchParams();
|
|
13
20
|
const applicationType = useAuthStore((state) => state.applicationType);
|
|
14
|
-
const
|
|
21
|
+
const conversationData = useBizConversationStore((state) => state.conversationData);
|
|
22
|
+
const selectConversation = useBizConversationStore((state) => state.selectConversation);
|
|
23
|
+
const clearSelectedConversation = useBizConversationStore((state) => state.clearSelectedConversation);
|
|
24
|
+
const threadId = searchParams.get("threadId");
|
|
25
|
+
const isApplicationTypeValid = Object.values(DChatApplicationType).includes(applicationType);
|
|
15
26
|
const conversationList = useBizConversationList({
|
|
16
27
|
enabled: isApplicationTypeValid,
|
|
17
28
|
pageSize,
|
|
18
29
|
});
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
return
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
if (!threadId) {
|
|
32
|
+
if (conversationData) {
|
|
33
|
+
clearSelectedConversation();
|
|
34
|
+
}
|
|
35
|
+
return;
|
|
25
36
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
37
|
+
if ((conversationData === null || conversationData === void 0 ? void 0 : conversationData.conversationId) === threadId)
|
|
38
|
+
return;
|
|
39
|
+
const matchedThread = conversationList.items.find((item) => item.conversationId === threadId);
|
|
40
|
+
if (matchedThread) {
|
|
41
|
+
selectConversation(matchedThread);
|
|
42
|
+
}
|
|
43
|
+
}, [
|
|
44
|
+
threadId,
|
|
45
|
+
conversationList.items,
|
|
46
|
+
conversationData,
|
|
47
|
+
selectConversation,
|
|
48
|
+
clearSelectedConversation,
|
|
49
|
+
]);
|
|
50
|
+
if (threadId && conversationData) {
|
|
51
|
+
return _jsx(DChatBizThreadDetail, { className: className });
|
|
52
|
+
}
|
|
53
|
+
return (_jsxs("div", { "data-testid": "biz-inbox-root", className: clsx("flex h-full w-full flex-col bg-white", className), children: [_jsx(BizInboxHeader, {}), !isApplicationTypeValid ? (_jsx("div", { className: "flex flex-1 items-center justify-center py-12", children: _jsx(Empty, { image: _jsx(Icon, { icon: "chat-square-b", size: 80, className: "text-gray-300" }), description: t("empty.no_conversations") }) })) : (_jsx(BizThreadList, { items: conversationList.items, isFetchingNextPage: conversationList.isFetchingNextPage, hasNextPage: conversationList.hasNextPage, onLoadMore: conversationList.fetchNextPage, onSelectThread: onSelectThread }))] }));
|
|
29
54
|
};
|
|
30
55
|
export default DChatBizInbox;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { BizThreadDetailInputProps } from "../../components/bizThreadDetail";
|
|
2
|
+
export interface DChatBizThreadDetailProps extends BizThreadDetailInputProps {
|
|
3
|
+
className?: string;
|
|
4
|
+
children?: React.ReactNode;
|
|
5
|
+
onBack?: () => void;
|
|
6
|
+
}
|
|
7
|
+
declare const DChatBizThreadDetail: ({ className, children, onBack, ...inputProps }: DChatBizThreadDetailProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
8
|
+
export default DChatBizThreadDetail;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/screens/bizThreadDetail/index.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAElF,MAAM,WAAW,yBAA0B,SAAQ,yBAAyB;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,QAAA,MAAM,oBAAoB,GAAI,gDAK3B,yBAAyB,mDA+B3B,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
14
|
+
import { usePathname, useRouter, useSearchParams } from "next/navigation";
|
|
15
|
+
import clsx from "clsx";
|
|
16
|
+
import useBizConversationStore from "../../store/bizConversation";
|
|
17
|
+
import { BizThreadDetailHeader, BizThreadDetailInput, } from "../../components/bizThreadDetail";
|
|
18
|
+
const DChatBizThreadDetail = (_a) => {
|
|
19
|
+
var { className, children, onBack } = _a, inputProps = __rest(_a, ["className", "children", "onBack"]);
|
|
20
|
+
const router = useRouter();
|
|
21
|
+
const pathname = usePathname();
|
|
22
|
+
const searchParams = useSearchParams();
|
|
23
|
+
const conversation = useBizConversationStore((state) => state.conversationData);
|
|
24
|
+
const handleBack = () => {
|
|
25
|
+
const newSearchParams = new URLSearchParams(searchParams);
|
|
26
|
+
newSearchParams.delete("threadId");
|
|
27
|
+
const query = newSearchParams.toString();
|
|
28
|
+
router.replace(query ? `${pathname}?${query}` : pathname);
|
|
29
|
+
onBack === null || onBack === void 0 ? void 0 : onBack();
|
|
30
|
+
};
|
|
31
|
+
if (!conversation) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
return (_jsxs("div", { "data-testid": "biz-thread-detail-root", className: clsx("flex h-full w-full flex-col bg-white", className), children: [_jsx(BizThreadDetailHeader, { conversation: conversation, onBack: handleBack }), _jsx("div", { className: "min-h-0 flex-1 overflow-auto bg-white", children: children }), _jsx(BizThreadDetailInput, Object.assign({}, inputProps))] }));
|
|
35
|
+
};
|
|
36
|
+
export default DChatBizThreadDetail;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BizConversationItem } from "../types/biz";
|
|
2
|
+
interface BizConversationStore {
|
|
3
|
+
conversationData: BizConversationItem | null;
|
|
4
|
+
selectedConversationId: string;
|
|
5
|
+
setConversationData: (data: BizConversationItem | null) => void;
|
|
6
|
+
setSelectedConversationId: (id: string) => void;
|
|
7
|
+
selectConversation: (conversation: BizConversationItem) => void;
|
|
8
|
+
clearSelectedConversation: () => void;
|
|
9
|
+
}
|
|
10
|
+
declare const useBizConversationStore: import("zustand").UseBoundStore<import("zustand").StoreApi<BizConversationStore>>;
|
|
11
|
+
export default useBizConversationStore;
|
|
12
|
+
//# sourceMappingURL=bizConversation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bizConversation.d.ts","sourceRoot":"","sources":["../../src/store/bizConversation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,UAAU,oBAAoB;IAC5B,gBAAgB,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC7C,sBAAsB,EAAE,MAAM,CAAC;IAC/B,mBAAmB,EAAE,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,KAAK,IAAI,CAAC;IAChE,yBAAyB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,kBAAkB,EAAE,CAAC,YAAY,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAChE,yBAAyB,EAAE,MAAM,IAAI,CAAC;CACvC;AAED,QAAA,MAAM,uBAAuB,mFAmB1B,CAAC;AAEJ,eAAe,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { create } from "zustand";
|
|
2
|
+
const useBizConversationStore = create((set) => ({
|
|
3
|
+
conversationData: null,
|
|
4
|
+
selectedConversationId: "",
|
|
5
|
+
setConversationData: (data) => {
|
|
6
|
+
var _a;
|
|
7
|
+
return set({
|
|
8
|
+
conversationData: data,
|
|
9
|
+
selectedConversationId: (_a = data === null || data === void 0 ? void 0 : data.conversationId) !== null && _a !== void 0 ? _a : "",
|
|
10
|
+
});
|
|
11
|
+
},
|
|
12
|
+
setSelectedConversationId: (id) => set({ selectedConversationId: id }),
|
|
13
|
+
selectConversation: (conversation) => set({
|
|
14
|
+
conversationData: conversation,
|
|
15
|
+
selectedConversationId: conversation.conversationId,
|
|
16
|
+
}),
|
|
17
|
+
clearSelectedConversation: () => set({
|
|
18
|
+
conversationData: null,
|
|
19
|
+
selectedConversationId: "",
|
|
20
|
+
}),
|
|
21
|
+
}));
|
|
22
|
+
export default useBizConversationStore;
|