@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.
Files changed (36) hide show
  1. package/.turbo/turbo-build.log +88 -88
  2. package/CHANGELOG.md +12 -0
  3. package/dist/{chunk-O5CP6VP6.mjs → chunk-BF5FKUF6.mjs} +104 -63
  4. package/dist/{chunk-ZMTCMP2G.mjs → chunk-EB626HVW.mjs} +70 -3
  5. package/dist/chunk-KICT4VQL.mjs +508 -0
  6. package/dist/chunk-V23CBULF.mjs +432 -0
  7. package/dist/components/ui/ai-conversations.js +70 -3
  8. package/dist/components/ui/ai-conversations.mjs +1 -1
  9. package/dist/components/ui/appointment-calendar-view.js +177 -176
  10. package/dist/components/ui/appointment-calendar-view.mjs +1 -1
  11. package/dist/components/ui/bank-statement-generate-dialog.js +209 -107
  12. package/dist/components/ui/bank-statement-generate-dialog.mjs +2 -1
  13. package/dist/components/ui/resource-center/index.js +1030 -0
  14. package/dist/components/ui/resource-center/index.mjs +29 -0
  15. package/dist/index.js +661 -403
  16. package/dist/index.mjs +16 -14
  17. package/dist/styles.css +1 -1
  18. package/package.json +4 -4
  19. package/src/components/index.tsx +2 -0
  20. package/src/components/ui/ai-conversations.tsx +157 -23
  21. package/src/components/ui/appointment-calendar-view.tsx +211 -199
  22. package/src/components/ui/bank-statement-generate-dialog.tsx +147 -96
  23. package/src/components/ui/resource-center/index.tsx +35 -0
  24. package/src/components/ui/resource-center/resource-cards.tsx +218 -0
  25. package/src/components/ui/resource-center/resource-carousel.tsx +122 -0
  26. package/src/components/ui/resource-center/resource-center-header.tsx +95 -0
  27. package/src/components/ui/resource-center/resource-email-editor-dialog.tsx +131 -0
  28. package/src/components/ui/resource-center/resource-modal.tsx +76 -0
  29. package/src/components/ui/resource-center/types.ts +81 -0
  30. package/src/styles/styles-css.ts +1 -1
  31. package/tsup.config.ts +1 -1
  32. package/dist/chunk-IODGRCQG.mjs +0 -438
  33. package/dist/chunk-XYWEGBAA.mjs +0 -348
  34. package/dist/components/ui/resource-center.js +0 -748
  35. package/dist/components/ui/resource-center.mjs +0 -24
  36. 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
- const [toDate, setToDate] = useState("");
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 applyPreset = (preset) => {
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
- if (areAllSelected) {
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
- className: cn("max-w-[700px]", className),
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: (val) => {
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: "Main applicant" }),
214
- hasCoApplicant && /* @__PURE__ */ jsx(SelectItem, { value: "secondary", children: "Co-applicant" })
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__ */ jsxs("div", { className: "mt-1", children: [
220
- isLoadingAccounts && /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center p-6", children: /* @__PURE__ */ jsx(Spinner, { size: "lg" }) }),
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: bankAccounts.map((account) => {
244
+ /* @__PURE__ */ jsx(TableBody, { children: pagedAccounts.map((account) => {
239
245
  var _a, _b;
240
- return /* @__PURE__ */ jsxs(TableRow, { children: [
241
- /* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx(
242
- Checkbox,
243
- {
244
- checked: selectedAccountIds.includes(account.id),
245
- onCheckedChange: () => handleToggleAccount(account.id),
246
- "aria-label": `Select ${account.name}`
247
- }
248
- ) }),
249
- /* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
250
- account.institutionLogo && /* @__PURE__ */ jsx(
251
- "img",
252
- {
253
- src: account.institutionLogo,
254
- alt: (_a = account.institutionName) != null ? _a : "",
255
- className: "size-8 rounded object-cover"
256
- }
257
- ),
258
- /* @__PURE__ */ jsx("span", { className: "text-body-medium font-semibold", children: account.name || account.institutionName || "\u2014" })
259
- ] }) }),
260
- /* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx("span", { className: "text-body-medium", children: (_b = account.accountNo) != null ? _b : "\u2014" }) }),
261
- /* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx("span", { className: "text-body-medium", children: periodLabel }) }),
262
- /* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx("span", { className: "text-body-medium", children: account.lastUpdated ? format(
263
- parseISO(account.lastUpdated),
264
- "dd MMM yyyy"
265
- ) : "\u2014" }) })
266
- ] }, account.id);
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(channelProp);
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: () => onSend == null ? void 0 : onSend(inputValue),
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(