@wealthx/shadcn 1.5.11 → 1.5.13
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/.turbo/turbo-build.log +88 -88
- package/CHANGELOG.md +12 -0
- package/dist/{chunk-O5CP6VP6.mjs → chunk-BF5FKUF6.mjs} +104 -63
- package/dist/{chunk-ZMTCMP2G.mjs → chunk-EB626HVW.mjs} +70 -3
- package/dist/chunk-KICT4VQL.mjs +508 -0
- package/dist/chunk-V23CBULF.mjs +432 -0
- package/dist/components/ui/ai-conversations.js +70 -3
- package/dist/components/ui/ai-conversations.mjs +1 -1
- package/dist/components/ui/appointment-calendar-view.js +177 -176
- package/dist/components/ui/appointment-calendar-view.mjs +1 -1
- package/dist/components/ui/bank-statement-generate-dialog.js +209 -107
- package/dist/components/ui/bank-statement-generate-dialog.mjs +2 -1
- package/dist/components/ui/resource-center/index.js +1030 -0
- package/dist/components/ui/resource-center/index.mjs +29 -0
- package/dist/index.js +661 -403
- package/dist/index.mjs +16 -14
- package/dist/styles.css +1 -1
- package/package.json +4 -4
- package/src/components/index.tsx +2 -0
- package/src/components/ui/ai-conversations.tsx +157 -23
- package/src/components/ui/appointment-calendar-view.tsx +211 -199
- package/src/components/ui/bank-statement-generate-dialog.tsx +147 -96
- package/src/components/ui/resource-center/index.tsx +35 -0
- package/src/components/ui/resource-center/resource-cards.tsx +218 -0
- package/src/components/ui/resource-center/resource-carousel.tsx +122 -0
- package/src/components/ui/resource-center/resource-center-header.tsx +95 -0
- package/src/components/ui/resource-center/resource-email-editor-dialog.tsx +131 -0
- package/src/components/ui/resource-center/resource-modal.tsx +76 -0
- package/src/components/ui/resource-center/types.ts +81 -0
- package/src/styles/styles-css.ts +1 -1
- package/tsup.config.ts +1 -1
- package/dist/chunk-IODGRCQG.mjs +0 -438
- package/dist/chunk-XYWEGBAA.mjs +0 -348
- package/dist/components/ui/resource-center.js +0 -748
- package/dist/components/ui/resource-center.mjs +0 -24
- package/src/components/ui/resource-center.tsx +0 -539
|
@@ -2,6 +2,9 @@ import {
|
|
|
2
2
|
Field,
|
|
3
3
|
FieldLabel
|
|
4
4
|
} from "./chunk-MUV4EGDW.mjs";
|
|
5
|
+
import {
|
|
6
|
+
PaginationNavButtons
|
|
7
|
+
} from "./chunk-SSUK6C2K.mjs";
|
|
5
8
|
import {
|
|
6
9
|
Table,
|
|
7
10
|
TableBody,
|
|
@@ -43,14 +46,16 @@ import {
|
|
|
43
46
|
import {
|
|
44
47
|
Button
|
|
45
48
|
} from "./chunk-NOOEKOWY.mjs";
|
|
46
|
-
import {
|
|
47
|
-
cn
|
|
48
|
-
} from "./chunk-AFML43VJ.mjs";
|
|
49
49
|
|
|
50
50
|
// src/components/ui/bank-statement-generate-dialog.tsx
|
|
51
51
|
import { useEffect, useMemo, useState } from "react";
|
|
52
52
|
import { format, parseISO, subDays } from "date-fns";
|
|
53
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
53
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
54
|
+
var APPLICANT_TYPE_LABELS = {
|
|
55
|
+
primary: "Main applicant",
|
|
56
|
+
secondary: "Co-applicant"
|
|
57
|
+
};
|
|
58
|
+
var ACCOUNTS_PAGE_SIZE = 5;
|
|
54
59
|
function toIsoDate(date) {
|
|
55
60
|
return date.toISOString().slice(0, 10);
|
|
56
61
|
}
|
|
@@ -74,29 +79,37 @@ function BankStatementGenerateDialog({
|
|
|
74
79
|
}) {
|
|
75
80
|
const [statementName, setStatementName] = useState("Bank Statement 1");
|
|
76
81
|
const [rangePreset, setRangePreset] = useState(90);
|
|
77
|
-
const [fromDate, setFromDate] = useState(
|
|
78
|
-
|
|
82
|
+
const [fromDate, setFromDate] = useState(
|
|
83
|
+
() => presetToDateRange(90).from
|
|
84
|
+
);
|
|
85
|
+
const [toDate, setToDate] = useState(() => presetToDateRange(90).to);
|
|
79
86
|
const [applicantType, setApplicantType] = useState("");
|
|
80
87
|
const [selectedAccountIds, setSelectedAccountIds] = useState([]);
|
|
88
|
+
const [accountPage, setAccountPage] = useState(1);
|
|
81
89
|
useEffect(() => {
|
|
82
90
|
if (!open) return;
|
|
83
91
|
const timer = setTimeout(() => {
|
|
84
|
-
setStatementName("Bank Statement 1");
|
|
85
|
-
setApplicantType("");
|
|
86
|
-
setSelectedAccountIds([]);
|
|
87
92
|
const { from, to } = presetToDateRange(90);
|
|
93
|
+
setStatementName("Bank Statement 1");
|
|
88
94
|
setRangePreset(90);
|
|
89
95
|
setFromDate(from);
|
|
90
96
|
setToDate(to);
|
|
97
|
+
setApplicantType("");
|
|
98
|
+
setSelectedAccountIds([]);
|
|
99
|
+
setAccountPage(1);
|
|
91
100
|
}, 0);
|
|
92
101
|
return () => clearTimeout(timer);
|
|
93
102
|
}, [open]);
|
|
94
103
|
const handleApplicantTypeChange = (type) => {
|
|
95
104
|
setApplicantType(type);
|
|
96
105
|
setSelectedAccountIds([]);
|
|
106
|
+
setAccountPage(1);
|
|
97
107
|
onApplicantTypeChange == null ? void 0 : onApplicantTypeChange(type);
|
|
98
108
|
};
|
|
99
|
-
const
|
|
109
|
+
const handlePresetChange = (val) => {
|
|
110
|
+
if (val.length === 0) return;
|
|
111
|
+
const raw = val[0];
|
|
112
|
+
const preset = raw === "custom" ? "custom" : Number(raw);
|
|
100
113
|
setRangePreset(preset);
|
|
101
114
|
if (preset !== "custom") {
|
|
102
115
|
const { from, to } = presetToDateRange(preset);
|
|
@@ -112,12 +125,13 @@ function BankStatementGenerateDialog({
|
|
|
112
125
|
);
|
|
113
126
|
};
|
|
114
127
|
const handleToggleAll = () => {
|
|
115
|
-
|
|
116
|
-
setSelectedAccountIds([]);
|
|
117
|
-
} else {
|
|
118
|
-
setSelectedAccountIds(bankAccounts.map((a) => a.id));
|
|
119
|
-
}
|
|
128
|
+
setSelectedAccountIds(areAllSelected ? [] : bankAccounts.map((a) => a.id));
|
|
120
129
|
};
|
|
130
|
+
const accountPageCount = Math.ceil(bankAccounts.length / ACCOUNTS_PAGE_SIZE);
|
|
131
|
+
const pagedAccounts = bankAccounts.slice(
|
|
132
|
+
(accountPage - 1) * ACCOUNTS_PAGE_SIZE,
|
|
133
|
+
accountPage * ACCOUNTS_PAGE_SIZE
|
|
134
|
+
);
|
|
121
135
|
const periodLabel = useMemo(() => {
|
|
122
136
|
if (fromDate && toDate) {
|
|
123
137
|
return `${format(parseISO(fromDate), "dd MMM yyyy")} \u2013 ${format(parseISO(toDate), "dd MMM yyyy")}`;
|
|
@@ -139,7 +153,8 @@ function BankStatementGenerateDialog({
|
|
|
139
153
|
return /* @__PURE__ */ jsx(Dialog, { open, onOpenChange: (o) => !o && onClose(), children: /* @__PURE__ */ jsxs(
|
|
140
154
|
DialogContent,
|
|
141
155
|
{
|
|
142
|
-
|
|
156
|
+
size: "3xl",
|
|
157
|
+
className,
|
|
143
158
|
"data-slot": "bank-statement-generate-dialog",
|
|
144
159
|
children: [
|
|
145
160
|
/* @__PURE__ */ jsx(DialogHeader, { children: /* @__PURE__ */ jsx(DialogTitle, { children: "Generate Bank Statement" }) }),
|
|
@@ -163,15 +178,7 @@ function BankStatementGenerateDialog({
|
|
|
163
178
|
type: "single",
|
|
164
179
|
variant: "outline",
|
|
165
180
|
value: [String(rangePreset)],
|
|
166
|
-
onValueChange:
|
|
167
|
-
if (val.length === 0) return;
|
|
168
|
-
const raw = val[0];
|
|
169
|
-
if (raw === "custom") {
|
|
170
|
-
applyPreset("custom");
|
|
171
|
-
} else {
|
|
172
|
-
applyPreset(Number(raw));
|
|
173
|
-
}
|
|
174
|
-
},
|
|
181
|
+
onValueChange: handlePresetChange,
|
|
175
182
|
className: "w-full",
|
|
176
183
|
children: [
|
|
177
184
|
/* @__PURE__ */ jsx(ToggleGroupItem, { value: "90", className: "flex-1", children: "3 Months" }),
|
|
@@ -207,19 +214,18 @@ function BankStatementGenerateDialog({
|
|
|
207
214
|
{
|
|
208
215
|
value: applicantType,
|
|
209
216
|
onValueChange: (v) => handleApplicantTypeChange(v),
|
|
217
|
+
items: APPLICANT_TYPE_LABELS,
|
|
210
218
|
children: [
|
|
211
219
|
/* @__PURE__ */ jsx(SelectTrigger, { className: "w-full", children: /* @__PURE__ */ jsx(SelectValue, { placeholder: "Applicant Type" }) }),
|
|
212
220
|
/* @__PURE__ */ jsxs(SelectContent, { children: [
|
|
213
|
-
/* @__PURE__ */ jsx(SelectItem, { value: "primary", children:
|
|
214
|
-
hasCoApplicant && /* @__PURE__ */ jsx(SelectItem, { value: "secondary", children:
|
|
221
|
+
/* @__PURE__ */ jsx(SelectItem, { value: "primary", children: APPLICANT_TYPE_LABELS.primary }),
|
|
222
|
+
hasCoApplicant && /* @__PURE__ */ jsx(SelectItem, { value: "secondary", children: APPLICANT_TYPE_LABELS.secondary })
|
|
215
223
|
] })
|
|
216
224
|
]
|
|
217
225
|
}
|
|
218
226
|
),
|
|
219
|
-
applicantType && /* @__PURE__ */
|
|
220
|
-
|
|
221
|
-
!isLoadingAccounts && bankAccounts.length === 0 && /* @__PURE__ */ jsx("p", { className: "py-4 text-center text-body-medium text-muted-foreground", children: "No bank accounts found for the selected applicant" }),
|
|
222
|
-
!isLoadingAccounts && bankAccounts.length > 0 && /* @__PURE__ */ jsxs(Table, { children: [
|
|
227
|
+
applicantType && /* @__PURE__ */ jsx("div", { className: "mt-1", children: isLoadingAccounts ? /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center p-6", children: /* @__PURE__ */ jsx(Spinner, { size: "lg" }) }) : bankAccounts.length === 0 ? /* @__PURE__ */ jsx("p", { className: "py-4 text-center text-body-medium text-muted-foreground", children: "No bank accounts found for the selected applicant" }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
228
|
+
/* @__PURE__ */ jsxs(Table, { className: "table-fixed", children: [
|
|
223
229
|
/* @__PURE__ */ jsx(TableHeader, { children: /* @__PURE__ */ jsxs(TableRow, { children: [
|
|
224
230
|
/* @__PURE__ */ jsx(TableHead, { className: "w-10", children: /* @__PURE__ */ jsx(
|
|
225
231
|
Checkbox,
|
|
@@ -231,42 +237,77 @@ function BankStatementGenerateDialog({
|
|
|
231
237
|
}
|
|
232
238
|
) }),
|
|
233
239
|
/* @__PURE__ */ jsx(TableHead, { children: "Account Name" }),
|
|
234
|
-
/* @__PURE__ */ jsx(TableHead, { children: "Account Number" }),
|
|
235
|
-
/* @__PURE__ */ jsx(TableHead, { children: "Period" }),
|
|
236
|
-
/* @__PURE__ */ jsx(TableHead, { children: "Last Updated" })
|
|
240
|
+
/* @__PURE__ */ jsx(TableHead, { className: "w-40", children: "Account Number" }),
|
|
241
|
+
/* @__PURE__ */ jsx(TableHead, { className: "w-52", children: "Period" }),
|
|
242
|
+
/* @__PURE__ */ jsx(TableHead, { className: "w-28", children: "Last Updated" })
|
|
237
243
|
] }) }),
|
|
238
|
-
/* @__PURE__ */ jsx(TableBody, { children:
|
|
244
|
+
/* @__PURE__ */ jsx(TableBody, { children: pagedAccounts.map((account) => {
|
|
239
245
|
var _a, _b;
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
246
|
+
const isSelected = selectedAccountIds.includes(
|
|
247
|
+
account.id
|
|
248
|
+
);
|
|
249
|
+
return /* @__PURE__ */ jsxs(
|
|
250
|
+
TableRow,
|
|
251
|
+
{
|
|
252
|
+
"data-state": isSelected ? "selected" : void 0,
|
|
253
|
+
children: [
|
|
254
|
+
/* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx(
|
|
255
|
+
Checkbox,
|
|
256
|
+
{
|
|
257
|
+
checked: isSelected,
|
|
258
|
+
onCheckedChange: () => handleToggleAccount(account.id),
|
|
259
|
+
"aria-label": `Select ${account.name}`
|
|
260
|
+
}
|
|
261
|
+
) }),
|
|
262
|
+
/* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
263
|
+
account.institutionLogo && /* @__PURE__ */ jsx(
|
|
264
|
+
"img",
|
|
265
|
+
{
|
|
266
|
+
src: account.institutionLogo,
|
|
267
|
+
alt: (_a = account.institutionName) != null ? _a : "",
|
|
268
|
+
className: "size-8 object-cover"
|
|
269
|
+
}
|
|
270
|
+
),
|
|
271
|
+
/* @__PURE__ */ jsx("span", { className: "text-body-medium font-semibold", children: account.name || account.institutionName || "\u2014" })
|
|
272
|
+
] }) }),
|
|
273
|
+
/* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx("span", { className: "text-body-medium", children: (_b = account.accountNo) != null ? _b : "\u2014" }) }),
|
|
274
|
+
/* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx("span", { className: "text-body-medium", children: periodLabel }) }),
|
|
275
|
+
/* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx("span", { className: "text-body-medium", children: account.lastUpdated ? format(
|
|
276
|
+
parseISO(account.lastUpdated),
|
|
277
|
+
"dd MMM yyyy"
|
|
278
|
+
) : "\u2014" }) })
|
|
279
|
+
]
|
|
280
|
+
},
|
|
281
|
+
account.id
|
|
282
|
+
);
|
|
267
283
|
}) })
|
|
284
|
+
] }),
|
|
285
|
+
accountPageCount > 1 && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between pt-2", children: [
|
|
286
|
+
/* @__PURE__ */ jsxs("span", { className: "text-body-small text-muted-foreground", children: [
|
|
287
|
+
(accountPage - 1) * ACCOUNTS_PAGE_SIZE + 1,
|
|
288
|
+
"\u2013",
|
|
289
|
+
Math.min(
|
|
290
|
+
accountPage * ACCOUNTS_PAGE_SIZE,
|
|
291
|
+
bankAccounts.length
|
|
292
|
+
),
|
|
293
|
+
" ",
|
|
294
|
+
"of ",
|
|
295
|
+
bankAccounts.length,
|
|
296
|
+
" accounts"
|
|
297
|
+
] }),
|
|
298
|
+
/* @__PURE__ */ jsx(
|
|
299
|
+
PaginationNavButtons,
|
|
300
|
+
{
|
|
301
|
+
hasPrev: accountPage > 1,
|
|
302
|
+
hasNext: accountPage < accountPageCount,
|
|
303
|
+
onFirst: () => setAccountPage(1),
|
|
304
|
+
onPrev: () => setAccountPage((p) => p - 1),
|
|
305
|
+
onNext: () => setAccountPage((p) => p + 1),
|
|
306
|
+
onLast: () => setAccountPage(accountPageCount)
|
|
307
|
+
}
|
|
308
|
+
)
|
|
268
309
|
] })
|
|
269
|
-
] })
|
|
310
|
+
] }) })
|
|
270
311
|
] }),
|
|
271
312
|
/* @__PURE__ */ jsxs(DialogFooter, { children: [
|
|
272
313
|
/* @__PURE__ */ jsx(Button, { variant: "ghost", onClick: onClose, children: "Cancel" }),
|
|
@@ -424,15 +424,19 @@ function ChatComposer({
|
|
|
424
424
|
mode,
|
|
425
425
|
channel: channelProp = "chat",
|
|
426
426
|
onChannelChange,
|
|
427
|
+
isEmailIntegrated = false,
|
|
427
428
|
contactEmail = "",
|
|
428
429
|
inputValue = "",
|
|
429
430
|
onInputChange,
|
|
430
431
|
onSend,
|
|
432
|
+
onSendEmail,
|
|
431
433
|
onTakeOver,
|
|
432
434
|
onLetAiHandle,
|
|
433
435
|
className
|
|
434
436
|
}) {
|
|
435
|
-
const [channel, setChannel] = React.useState(
|
|
437
|
+
const [channel, setChannel] = React.useState(
|
|
438
|
+
isEmailIntegrated ? channelProp : "chat"
|
|
439
|
+
);
|
|
436
440
|
const [emailTo, setEmailTo] = React.useState(contactEmail);
|
|
437
441
|
const [emailCc, setEmailCc] = React.useState("");
|
|
438
442
|
const [showCc, setShowCc] = React.useState(false);
|
|
@@ -482,7 +486,7 @@ function ChatComposer({
|
|
|
482
486
|
className
|
|
483
487
|
),
|
|
484
488
|
children: [
|
|
485
|
-
/* @__PURE__ */ jsx("div", { className: "border-b border-border px-3 py-2", children: /* @__PURE__ */ jsx(
|
|
489
|
+
isEmailIntegrated && /* @__PURE__ */ jsx("div", { className: "border-b border-border px-3 py-2", children: /* @__PURE__ */ jsx(
|
|
486
490
|
Tabs,
|
|
487
491
|
{
|
|
488
492
|
value: channel,
|
|
@@ -617,7 +621,12 @@ function ChatComposer({
|
|
|
617
621
|
Button,
|
|
618
622
|
{
|
|
619
623
|
size: "sm",
|
|
620
|
-
onClick: () =>
|
|
624
|
+
onClick: () => onSendEmail == null ? void 0 : onSendEmail({
|
|
625
|
+
content: inputValue,
|
|
626
|
+
to: emailTo,
|
|
627
|
+
cc: emailCc,
|
|
628
|
+
subject: emailSubject
|
|
629
|
+
}),
|
|
621
630
|
disabled: !inputValue.trim() || !emailTo.trim(),
|
|
622
631
|
children: [
|
|
623
632
|
/* @__PURE__ */ jsx(Send, { className: "mr-1.5 size-3.5" }),
|
|
@@ -672,9 +681,11 @@ function ChatThread({
|
|
|
672
681
|
isAiTyping = false,
|
|
673
682
|
channel,
|
|
674
683
|
onChannelChange,
|
|
684
|
+
isEmailIntegrated,
|
|
675
685
|
inputValue,
|
|
676
686
|
onInputChange,
|
|
677
687
|
onSend,
|
|
688
|
+
onSendEmail,
|
|
678
689
|
onTakeOver,
|
|
679
690
|
onLetAiHandle,
|
|
680
691
|
onReopen,
|
|
@@ -682,12 +693,53 @@ function ChatThread({
|
|
|
682
693
|
onUnmarkUrgent,
|
|
683
694
|
onArchive,
|
|
684
695
|
onAssignToAdvisor,
|
|
696
|
+
hasMoreMessages,
|
|
697
|
+
isLoadingMoreMessages,
|
|
698
|
+
onLoadMoreMessages,
|
|
685
699
|
onBack,
|
|
686
700
|
onShowLeadInfo,
|
|
687
701
|
className
|
|
688
702
|
}) {
|
|
689
703
|
const aiIsHandling = mode === "ai";
|
|
690
704
|
const isClosed = status === "closed";
|
|
705
|
+
const scrollRef = React.useRef(null);
|
|
706
|
+
const preLoadScrollHeightRef = React.useRef(null);
|
|
707
|
+
const handleScroll = (e) => {
|
|
708
|
+
if (!hasMoreMessages || isLoadingMoreMessages || !onLoadMoreMessages) {
|
|
709
|
+
return;
|
|
710
|
+
}
|
|
711
|
+
if (e.currentTarget.scrollTop <= 80) {
|
|
712
|
+
preLoadScrollHeightRef.current = e.currentTarget.scrollHeight;
|
|
713
|
+
onLoadMoreMessages();
|
|
714
|
+
}
|
|
715
|
+
};
|
|
716
|
+
const prevLastMessageIdRef = React.useRef(void 0);
|
|
717
|
+
const prevContactIdRef = React.useRef(contact.id);
|
|
718
|
+
React.useLayoutEffect(() => {
|
|
719
|
+
var _a, _b;
|
|
720
|
+
const el = scrollRef.current;
|
|
721
|
+
if (!el) return;
|
|
722
|
+
if (preLoadScrollHeightRef.current !== null) {
|
|
723
|
+
el.scrollTop = el.scrollHeight - preLoadScrollHeightRef.current;
|
|
724
|
+
preLoadScrollHeightRef.current = null;
|
|
725
|
+
prevLastMessageIdRef.current = (_a = messages[messages.length - 1]) == null ? void 0 : _a.id;
|
|
726
|
+
prevContactIdRef.current = contact.id;
|
|
727
|
+
return;
|
|
728
|
+
}
|
|
729
|
+
const currentLastId = (_b = messages[messages.length - 1]) == null ? void 0 : _b.id;
|
|
730
|
+
const contactChanged = prevContactIdRef.current !== contact.id;
|
|
731
|
+
const tailChanged = prevLastMessageIdRef.current !== currentLastId;
|
|
732
|
+
if (contactChanged || tailChanged) {
|
|
733
|
+
el.scrollTop = el.scrollHeight;
|
|
734
|
+
}
|
|
735
|
+
prevLastMessageIdRef.current = currentLastId;
|
|
736
|
+
prevContactIdRef.current = contact.id;
|
|
737
|
+
}, [contact.id, messages]);
|
|
738
|
+
React.useLayoutEffect(() => {
|
|
739
|
+
if (!isAiTyping) return;
|
|
740
|
+
const el = scrollRef.current;
|
|
741
|
+
if (el) el.scrollTop = el.scrollHeight;
|
|
742
|
+
}, [isAiTyping]);
|
|
691
743
|
return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col bg-background", className), children: [
|
|
692
744
|
/* @__PURE__ */ jsxs(
|
|
693
745
|
"div",
|
|
@@ -777,9 +829,12 @@ function ChatThread({
|
|
|
777
829
|
/* @__PURE__ */ jsxs(
|
|
778
830
|
"div",
|
|
779
831
|
{
|
|
832
|
+
ref: scrollRef,
|
|
833
|
+
onScroll: handleScroll,
|
|
780
834
|
className: "flex flex-1 flex-col gap-4 overflow-y-auto p-4",
|
|
781
835
|
tabIndex: 0,
|
|
782
836
|
children: [
|
|
837
|
+
isLoadingMoreMessages && /* @__PURE__ */ jsx("div", { className: "flex justify-center py-1 text-caption text-muted-foreground", children: "Loading older messages..." }),
|
|
783
838
|
messages.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-col items-center justify-center gap-2 text-muted-foreground", children: [
|
|
784
839
|
/* @__PURE__ */ jsx(MessageSquare, { className: "size-8 opacity-30" }),
|
|
785
840
|
/* @__PURE__ */ jsx("p", { className: "text-sm", children: "No messages yet" })
|
|
@@ -817,10 +872,12 @@ function ChatThread({
|
|
|
817
872
|
mode,
|
|
818
873
|
channel,
|
|
819
874
|
onChannelChange,
|
|
875
|
+
isEmailIntegrated,
|
|
820
876
|
contactEmail: contact.email,
|
|
821
877
|
inputValue,
|
|
822
878
|
onInputChange,
|
|
823
879
|
onSend,
|
|
880
|
+
onSendEmail,
|
|
824
881
|
onTakeOver,
|
|
825
882
|
onLetAiHandle
|
|
826
883
|
}
|
|
@@ -1171,11 +1228,15 @@ function ConversationsPage({
|
|
|
1171
1228
|
onChannelFilterChange,
|
|
1172
1229
|
channel,
|
|
1173
1230
|
onChannelChange,
|
|
1231
|
+
isEmailIntegrated,
|
|
1174
1232
|
inputValue,
|
|
1175
1233
|
internalNotes,
|
|
1176
1234
|
showLeadPanel = true,
|
|
1177
1235
|
hasMore,
|
|
1178
1236
|
isLoadingMore,
|
|
1237
|
+
hasMoreMessages,
|
|
1238
|
+
isLoadingMoreMessages,
|
|
1239
|
+
onLoadMoreMessages,
|
|
1179
1240
|
isAiTyping,
|
|
1180
1241
|
notesSaveStatus,
|
|
1181
1242
|
onSelectConversation,
|
|
@@ -1184,6 +1245,7 @@ function ConversationsPage({
|
|
|
1184
1245
|
onFilterChange,
|
|
1185
1246
|
onInputChange,
|
|
1186
1247
|
onSend,
|
|
1248
|
+
onSendEmail,
|
|
1187
1249
|
onTakeOver,
|
|
1188
1250
|
onLetAiHandle,
|
|
1189
1251
|
onReopen,
|
|
@@ -1252,9 +1314,11 @@ function ConversationsPage({
|
|
|
1252
1314
|
isAiTyping,
|
|
1253
1315
|
channel,
|
|
1254
1316
|
onChannelChange,
|
|
1317
|
+
isEmailIntegrated,
|
|
1255
1318
|
inputValue,
|
|
1256
1319
|
onInputChange,
|
|
1257
1320
|
onSend,
|
|
1321
|
+
onSendEmail,
|
|
1258
1322
|
onTakeOver,
|
|
1259
1323
|
onLetAiHandle,
|
|
1260
1324
|
onReopen,
|
|
@@ -1262,6 +1326,9 @@ function ConversationsPage({
|
|
|
1262
1326
|
onUnmarkUrgent,
|
|
1263
1327
|
onArchive,
|
|
1264
1328
|
onAssignToAdvisor,
|
|
1329
|
+
hasMoreMessages,
|
|
1330
|
+
isLoadingMoreMessages,
|
|
1331
|
+
onLoadMoreMessages,
|
|
1265
1332
|
onBack: () => setMobilePanel("list"),
|
|
1266
1333
|
onShowLeadInfo: () => setMobilePanel("lead"),
|
|
1267
1334
|
className: cn(
|