@cellarnode/ui 0.1.0
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/chat/chat-api.d.ts +14 -0
- package/dist/chat/chat-api.d.ts.map +1 -0
- package/dist/chat/chat-api.js +36 -0
- package/dist/chat/chat-api.js.map +1 -0
- package/dist/chat/chat-toggle-button.d.ts +8 -0
- package/dist/chat/chat-toggle-button.d.ts.map +1 -0
- package/dist/chat/chat-toggle-button.js +8 -0
- package/dist/chat/chat-toggle-button.js.map +1 -0
- package/dist/chat/chat-ws.d.ts +61 -0
- package/dist/chat/chat-ws.d.ts.map +1 -0
- package/dist/chat/chat-ws.js +217 -0
- package/dist/chat/chat-ws.js.map +1 -0
- package/dist/chat/communication-hub-widget.d.ts +21 -0
- package/dist/chat/communication-hub-widget.d.ts.map +1 -0
- package/dist/chat/communication-hub-widget.js +49 -0
- package/dist/chat/communication-hub-widget.js.map +1 -0
- package/dist/chat/communication-panel.d.ts +3 -0
- package/dist/chat/communication-panel.d.ts.map +1 -0
- package/dist/chat/communication-panel.js +34 -0
- package/dist/chat/communication-panel.js.map +1 -0
- package/dist/chat/index.d.ts +17 -0
- package/dist/chat/index.d.ts.map +1 -0
- package/dist/chat/index.js +11 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/chat/messenger-layout.d.ts +25 -0
- package/dist/chat/messenger-layout.d.ts.map +1 -0
- package/dist/chat/messenger-layout.js +70 -0
- package/dist/chat/messenger-layout.js.map +1 -0
- package/dist/chat/negotiation-event-card.d.ts +9 -0
- package/dist/chat/negotiation-event-card.d.ts.map +1 -0
- package/dist/chat/negotiation-event-card.js +39 -0
- package/dist/chat/negotiation-event-card.js.map +1 -0
- package/dist/chat/timeline-utils.d.ts +7 -0
- package/dist/chat/timeline-utils.d.ts.map +1 -0
- package/dist/chat/timeline-utils.js +40 -0
- package/dist/chat/timeline-utils.js.map +1 -0
- package/dist/chat/types.d.ts +132 -0
- package/dist/chat/types.d.ts.map +1 -0
- package/dist/chat/types.js +3 -0
- package/dist/chat/types.js.map +1 -0
- package/dist/chat/unified-timeline.d.ts +13 -0
- package/dist/chat/unified-timeline.d.ts.map +1 -0
- package/dist/chat/unified-timeline.js +97 -0
- package/dist/chat/unified-timeline.js.map +1 -0
- package/dist/chat/use-chat.d.ts +10 -0
- package/dist/chat/use-chat.d.ts.map +1 -0
- package/dist/chat/use-chat.js +280 -0
- package/dist/chat/use-chat.js.map +1 -0
- package/dist/components/accordion.d.ts +8 -0
- package/dist/components/accordion.d.ts.map +1 -0
- package/dist/components/accordion.js +19 -0
- package/dist/components/accordion.js.map +1 -0
- package/dist/components/alert.d.ts +29 -0
- package/dist/components/alert.d.ts.map +1 -0
- package/dist/components/alert.js +31 -0
- package/dist/components/alert.js.map +1 -0
- package/dist/components/animated-list.d.ts +20 -0
- package/dist/components/animated-list.d.ts.map +1 -0
- package/dist/components/animated-list.js +50 -0
- package/dist/components/animated-list.js.map +1 -0
- package/dist/components/avatar.d.ts +19 -0
- package/dist/components/avatar.d.ts.map +1 -0
- package/dist/components/avatar.js +18 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.d.ts +39 -0
- package/dist/components/badge.d.ts.map +1 -0
- package/dist/components/badge.js +35 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/button.d.ts +64 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +174 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/button.stories.d.ts +13 -0
- package/dist/components/button.stories.d.ts.map +1 -0
- package/dist/components/button.stories.js +48 -0
- package/dist/components/button.stories.js.map +1 -0
- package/dist/components/card.d.ts +9 -0
- package/dist/components/card.d.ts.map +1 -0
- package/dist/components/card.js +17 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/checkbox.d.ts +37 -0
- package/dist/components/checkbox.d.ts.map +1 -0
- package/dist/components/checkbox.js +84 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/combobox.d.ts +20 -0
- package/dist/components/combobox.d.ts.map +1 -0
- package/dist/components/combobox.js +87 -0
- package/dist/components/combobox.js.map +1 -0
- package/dist/components/command.d.ts +12 -0
- package/dist/components/command.d.ts.map +1 -0
- package/dist/components/command.js +31 -0
- package/dist/components/command.js.map +1 -0
- package/dist/components/description-list.d.ts +4 -0
- package/dist/components/description-list.d.ts.map +1 -0
- package/dist/components/description-list.js +12 -0
- package/dist/components/description-list.js.map +1 -0
- package/dist/components/dialog.d.ts +30 -0
- package/dist/components/dialog.d.ts.map +1 -0
- package/dist/components/dialog.js +32 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/divider.d.ts +4 -0
- package/dist/components/divider.d.ts.map +1 -0
- package/dist/components/divider.js +6 -0
- package/dist/components/divider.js.map +1 -0
- package/dist/components/drawer.d.ts +23 -0
- package/dist/components/drawer.d.ts.map +1 -0
- package/dist/components/drawer.js +23 -0
- package/dist/components/drawer.js.map +1 -0
- package/dist/components/dropdown-menu.d.ts +26 -0
- package/dist/components/dropdown-menu.d.ts.map +1 -0
- package/dist/components/dropdown-menu.js +52 -0
- package/dist/components/dropdown-menu.js.map +1 -0
- package/dist/components/dropdown.d.ts +37 -0
- package/dist/components/dropdown.d.ts.map +1 -0
- package/dist/components/dropdown.js +79 -0
- package/dist/components/dropdown.js.map +1 -0
- package/dist/components/fieldset.d.ts +22 -0
- package/dist/components/fieldset.d.ts.map +1 -0
- package/dist/components/fieldset.js +25 -0
- package/dist/components/fieldset.js.map +1 -0
- package/dist/components/form.d.ts +25 -0
- package/dist/components/form.d.ts.map +1 -0
- package/dist/components/form.js +60 -0
- package/dist/components/form.js.map +1 -0
- package/dist/components/heading.d.ts +7 -0
- package/dist/components/heading.d.ts.map +1 -0
- package/dist/components/heading.js +11 -0
- package/dist/components/heading.js.map +1 -0
- package/dist/components/input.d.ts +11 -0
- package/dist/components/input.d.ts.map +1 -0
- package/dist/components/input.js +57 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/kanban-board.d.ts +78 -0
- package/dist/components/kanban-board.d.ts.map +1 -0
- package/dist/components/kanban-board.js +18 -0
- package/dist/components/kanban-board.js.map +1 -0
- package/dist/components/kanban-board.stories.d.ts +10 -0
- package/dist/components/kanban-board.stories.d.ts.map +1 -0
- package/dist/components/kanban-board.stories.js +125 -0
- package/dist/components/kanban-board.stories.js.map +1 -0
- package/dist/components/kanban-card.d.ts +8 -0
- package/dist/components/kanban-card.d.ts.map +1 -0
- package/dist/components/kanban-card.js +13 -0
- package/dist/components/kanban-card.js.map +1 -0
- package/dist/components/kanban-dnd-board.d.ts +8 -0
- package/dist/components/kanban-dnd-board.d.ts.map +1 -0
- package/dist/components/kanban-dnd-board.js +104 -0
- package/dist/components/kanban-dnd-board.js.map +1 -0
- package/dist/components/label.d.ts +5 -0
- package/dist/components/label.d.ts.map +1 -0
- package/dist/components/label.js +9 -0
- package/dist/components/label.js.map +1 -0
- package/dist/components/link.d.ts +12 -0
- package/dist/components/link.d.ts.map +1 -0
- package/dist/components/link.js +14 -0
- package/dist/components/link.js.map +1 -0
- package/dist/components/listbox.d.ts +16 -0
- package/dist/components/listbox.d.ts.map +1 -0
- package/dist/components/listbox.js +88 -0
- package/dist/components/listbox.js.map +1 -0
- package/dist/components/pagination.d.ts +18 -0
- package/dist/components/pagination.d.ts.map +1 -0
- package/dist/components/pagination.js +22 -0
- package/dist/components/pagination.js.map +1 -0
- package/dist/components/popover.d.ts +11 -0
- package/dist/components/popover.d.ts.map +1 -0
- package/dist/components/popover.js +27 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/radio.d.ts +38 -0
- package/dist/components/radio.d.ts.map +1 -0
- package/dist/components/radio.js +87 -0
- package/dist/components/radio.js.map +1 -0
- package/dist/components/scroll-area.d.ts +6 -0
- package/dist/components/scroll-area.d.ts.map +1 -0
- package/dist/components/scroll-area.js +14 -0
- package/dist/components/scroll-area.js.map +1 -0
- package/dist/components/select.d.ts +6 -0
- package/dist/components/select.d.ts.map +1 -0
- package/dist/components/select.js +41 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/separator.d.ts +5 -0
- package/dist/components/separator.d.ts.map +1 -0
- package/dist/components/separator.js +9 -0
- package/dist/components/separator.js.map +1 -0
- package/dist/components/shadcn-badge.d.ts +10 -0
- package/dist/components/shadcn-badge.d.ts.map +1 -0
- package/dist/components/shadcn-badge.js +25 -0
- package/dist/components/shadcn-badge.js.map +1 -0
- package/dist/components/shadcn-button.d.ts +11 -0
- package/dist/components/shadcn-button.d.ts.map +1 -0
- package/dist/components/shadcn-button.js +36 -0
- package/dist/components/shadcn-button.js.map +1 -0
- package/dist/components/shadcn-dialog.d.ts +18 -0
- package/dist/components/shadcn-dialog.d.ts.map +1 -0
- package/dist/components/shadcn-dialog.js +37 -0
- package/dist/components/shadcn-dialog.js.map +1 -0
- package/dist/components/shadcn-input.d.ts +4 -0
- package/dist/components/shadcn-input.d.ts.map +1 -0
- package/dist/components/shadcn-input.js +7 -0
- package/dist/components/shadcn-input.js.map +1 -0
- package/dist/components/shadcn-select.d.ts +14 -0
- package/dist/components/shadcn-select.d.ts.map +1 -0
- package/dist/components/shadcn-select.js +32 -0
- package/dist/components/shadcn-select.js.map +1 -0
- package/dist/components/shadcn-textarea.d.ts +4 -0
- package/dist/components/shadcn-textarea.d.ts.map +1 -0
- package/dist/components/shadcn-textarea.js +7 -0
- package/dist/components/shadcn-textarea.js.map +1 -0
- package/dist/components/sheet.d.ts +26 -0
- package/dist/components/sheet.d.ts.map +1 -0
- package/dist/components/sheet.js +37 -0
- package/dist/components/sheet.js.map +1 -0
- package/dist/components/sidebar.d.ts +68 -0
- package/dist/components/sidebar.d.ts.map +1 -0
- package/dist/components/sidebar.js +208 -0
- package/dist/components/sidebar.js.map +1 -0
- package/dist/components/skeleton.d.ts +3 -0
- package/dist/components/skeleton.d.ts.map +1 -0
- package/dist/components/skeleton.js +7 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/slider.d.ts +5 -0
- package/dist/components/slider.d.ts.map +1 -0
- package/dist/components/slider.js +8 -0
- package/dist/components/slider.js.map +1 -0
- package/dist/components/sonner.d.ts +11 -0
- package/dist/components/sonner.d.ts.map +1 -0
- package/dist/components/sonner.js +14 -0
- package/dist/components/sonner.js.map +1 -0
- package/dist/components/switch.d.ts +30 -0
- package/dist/components/switch.d.ts.map +1 -0
- package/dist/components/switch.js +68 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/table.d.ts +17 -0
- package/dist/components/table.d.ts.map +1 -0
- package/dist/components/table.js +41 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tabs.d.ts +12 -0
- package/dist/components/tabs.d.ts.map +1 -0
- package/dist/components/tabs.js +30 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/text.d.ts +6 -0
- package/dist/components/text.d.ts.map +1 -0
- package/dist/components/text.js +16 -0
- package/dist/components/text.js.map +1 -0
- package/dist/components/textarea.d.ts +8 -0
- package/dist/components/textarea.d.ts.map +1 -0
- package/dist/components/textarea.js +38 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/components/toast.d.ts +16 -0
- package/dist/components/toast.d.ts.map +1 -0
- package/dist/components/toast.js +34 -0
- package/dist/components/toast.js.map +1 -0
- package/dist/components/toaster.d.ts +2 -0
- package/dist/components/toaster.d.ts.map +1 -0
- package/dist/components/toaster.js +10 -0
- package/dist/components/toaster.js.map +1 -0
- package/dist/components/tooltip.d.ts +8 -0
- package/dist/components/tooltip.d.ts.map +1 -0
- package/dist/components/tooltip.js +11 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/components/use-toast.d.ts +3 -0
- package/dist/components/use-toast.d.ts.map +1 -0
- package/dist/components/use-toast.js +3 -0
- package/dist/components/use-toast.js.map +1 -0
- package/dist/globe/data/country-geo.d.ts +15 -0
- package/dist/globe/data/country-geo.d.ts.map +1 -0
- package/dist/globe/data/country-geo.js +81 -0
- package/dist/globe/data/country-geo.js.map +1 -0
- package/dist/globe/electron-arc.d.ts +30 -0
- package/dist/globe/electron-arc.d.ts.map +1 -0
- package/dist/globe/electron-arc.js +119 -0
- package/dist/globe/electron-arc.js.map +1 -0
- package/dist/globe/globe-theme.d.ts +34 -0
- package/dist/globe/globe-theme.d.ts.map +1 -0
- package/dist/globe/globe-theme.js +118 -0
- package/dist/globe/globe-theme.js.map +1 -0
- package/dist/globe/globe-types.d.ts +42 -0
- package/dist/globe/globe-types.d.ts.map +1 -0
- package/dist/globe/globe-types.js +5 -0
- package/dist/globe/globe-types.js.map +1 -0
- package/dist/globe/globe-view.d.ts +27 -0
- package/dist/globe/globe-view.d.ts.map +1 -0
- package/dist/globe/globe-view.js +601 -0
- package/dist/globe/globe-view.js.map +1 -0
- package/dist/globe/globe-view.stories.d.ts +42 -0
- package/dist/globe/globe-view.stories.d.ts.map +1 -0
- package/dist/globe/globe-view.stories.js +319 -0
- package/dist/globe/globe-view.stories.js.map +1 -0
- package/dist/globe/index.d.ts +12 -0
- package/dist/globe/index.d.ts.map +1 -0
- package/dist/globe/index.js +7 -0
- package/dist/globe/index.js.map +1 -0
- package/dist/globe/map/country-code-map.d.ts +10 -0
- package/dist/globe/map/country-code-map.d.ts.map +1 -0
- package/dist/globe/map/country-code-map.js +15 -0
- package/dist/globe/map/country-code-map.js.map +1 -0
- package/dist/globe/map/map-geometry.d.ts +10 -0
- package/dist/globe/map/map-geometry.d.ts.map +1 -0
- package/dist/globe/map/map-geometry.js +57 -0
- package/dist/globe/map/map-geometry.js.map +1 -0
- package/dist/globe/map/map-materials.d.ts +8 -0
- package/dist/globe/map/map-materials.d.ts.map +1 -0
- package/dist/globe/map/map-materials.js +32 -0
- package/dist/globe/map/map-materials.js.map +1 -0
- package/dist/globe/map/map-projection.d.ts +11 -0
- package/dist/globe/map/map-projection.d.ts.map +1 -0
- package/dist/globe/map/map-projection.js +17 -0
- package/dist/globe/map/map-projection.js.map +1 -0
- package/dist/globe/scene-extras.d.ts +10 -0
- package/dist/globe/scene-extras.d.ts.map +1 -0
- package/dist/globe/scene-extras.js +69 -0
- package/dist/globe/scene-extras.js.map +1 -0
- package/dist/hooks/use-kanban-dnd.d.ts +23 -0
- package/dist/hooks/use-kanban-dnd.d.ts.map +1 -0
- package/dist/hooks/use-kanban-dnd.js +22 -0
- package/dist/hooks/use-kanban-dnd.js.map +1 -0
- package/dist/hooks/use-mobile.d.ts +2 -0
- package/dist/hooks/use-mobile.d.ts.map +1 -0
- package/dist/hooks/use-mobile.js +16 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/hooks/use-toast.d.ts +45 -0
- package/dist/hooks/use-toast.d.ts.map +1 -0
- package/dist/hooks/use-toast.js +125 -0
- package/dist/hooks/use-toast.js.map +1 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/currencies.d.ts +33 -0
- package/dist/lib/currencies.d.ts.map +1 -0
- package/dist/lib/currencies.js +13 -0
- package/dist/lib/currencies.js.map +1 -0
- package/dist/lib/kanban-transitions.d.ts +12 -0
- package/dist/lib/kanban-transitions.d.ts.map +1 -0
- package/dist/lib/kanban-transitions.js +13 -0
- package/dist/lib/kanban-transitions.js.map +1 -0
- package/dist/lib/semantic-tones.d.ts +4 -0
- package/dist/lib/semantic-tones.d.ts.map +1 -0
- package/dist/lib/semantic-tones.js +35 -0
- package/dist/lib/semantic-tones.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +6 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/offer/attachments-folder.d.ts +13 -0
- package/dist/offer/attachments-folder.d.ts.map +1 -0
- package/dist/offer/attachments-folder.js +20 -0
- package/dist/offer/attachments-folder.js.map +1 -0
- package/dist/offer/confirm-action-dialog.d.ts +18 -0
- package/dist/offer/confirm-action-dialog.d.ts.map +1 -0
- package/dist/offer/confirm-action-dialog.js +57 -0
- package/dist/offer/confirm-action-dialog.js.map +1 -0
- package/dist/offer/index.d.ts +11 -0
- package/dist/offer/index.d.ts.map +1 -0
- package/dist/offer/index.js +6 -0
- package/dist/offer/index.js.map +1 -0
- package/dist/offer/inline-counter-form.d.ts +19 -0
- package/dist/offer/inline-counter-form.d.ts.map +1 -0
- package/dist/offer/inline-counter-form.js +59 -0
- package/dist/offer/inline-counter-form.js.map +1 -0
- package/dist/offer/negotiation-event-card.d.ts +9 -0
- package/dist/offer/negotiation-event-card.d.ts.map +1 -0
- package/dist/offer/negotiation-event-card.js +39 -0
- package/dist/offer/negotiation-event-card.js.map +1 -0
- package/dist/offer/offer-status-badge.d.ts +8 -0
- package/dist/offer/offer-status-badge.d.ts.map +1 -0
- package/dist/offer/offer-status-badge.js +35 -0
- package/dist/offer/offer-status-badge.js.map +1 -0
- package/dist/offer/types.d.ts +43 -0
- package/dist/offer/types.d.ts.map +1 -0
- package/dist/offer/types.js +2 -0
- package/dist/offer/types.js.map +1 -0
- package/dist/theme/index.d.ts +2 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +2 -0
- package/dist/theme/index.js.map +1 -0
- package/package.json +166 -0
- package/src/theme/tokens.css +475 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../lib/utils";
|
|
3
|
+
import { Skeleton } from "../components/skeleton";
|
|
4
|
+
import { Search, MessageCircle, ArrowLeft, ArrowUpRight } from "lucide-react";
|
|
5
|
+
/* ─── Helpers ─── */
|
|
6
|
+
const defaultT = (_key, fallback) => fallback ?? _key;
|
|
7
|
+
function formatRelativeTime(isoDate) {
|
|
8
|
+
const now = Date.now();
|
|
9
|
+
const then = new Date(isoDate).getTime();
|
|
10
|
+
const diffMs = now - then;
|
|
11
|
+
if (diffMs < 0)
|
|
12
|
+
return "just now";
|
|
13
|
+
const minutes = Math.floor(diffMs / 60_000);
|
|
14
|
+
if (minutes < 1)
|
|
15
|
+
return "just now";
|
|
16
|
+
if (minutes < 60)
|
|
17
|
+
return `${minutes}m`;
|
|
18
|
+
const hours = Math.floor(minutes / 60);
|
|
19
|
+
if (hours < 24)
|
|
20
|
+
return `${hours}h`;
|
|
21
|
+
const days = Math.floor(hours / 24);
|
|
22
|
+
if (days === 1)
|
|
23
|
+
return "1d";
|
|
24
|
+
if (days < 7)
|
|
25
|
+
return `${days}d`;
|
|
26
|
+
return new Date(isoDate).toLocaleDateString(undefined, {
|
|
27
|
+
month: "short",
|
|
28
|
+
day: "numeric",
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/* ─── Loading skeleton ─── */
|
|
32
|
+
function ConversationListSkeleton({ count = 6 }) {
|
|
33
|
+
return (_jsx("div", { className: "flex flex-col gap-1 p-2", children: Array.from({ length: count }).map((_, i) => (_jsxs("div", { className: "flex items-center gap-3 px-3 py-3", children: [_jsx(Skeleton, { className: "size-10 shrink-0 rounded-full" }), _jsxs("div", { className: "flex-1 space-y-2", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx(Skeleton, { className: "h-3.5 w-24" }), _jsx(Skeleton, { className: "h-3 w-10" })] }), _jsx(Skeleton, { className: "h-3 w-3/4" })] })] }, i))) }));
|
|
34
|
+
}
|
|
35
|
+
function ConversationItem({ conversation, isSelected, onClick, onSubtitleClick, }) {
|
|
36
|
+
const hasUnread = conversation.unreadCount > 0;
|
|
37
|
+
return (_jsxs("button", { type: "button", onClick: onClick, className: cn("group flex w-full items-center gap-3 rounded-xl px-3 py-3 text-left", "transition-all duration-150", "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring", isSelected
|
|
38
|
+
? "bg-primary/10 dark:bg-primary/15"
|
|
39
|
+
: "hover:bg-accent/50 dark:hover:bg-accent/30"), children: [_jsx("span", { className: cn("flex size-10 shrink-0 items-center justify-center rounded-full text-xs font-semibold", hasUnread || isSelected
|
|
40
|
+
? "bg-primary text-primary-foreground"
|
|
41
|
+
: "bg-muted text-muted-foreground"), children: conversation.initials }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx("span", { className: cn("truncate text-sm", hasUnread
|
|
42
|
+
? "font-semibold text-foreground"
|
|
43
|
+
: "font-medium text-foreground/80"), children: conversation.name }), conversation.lastMessageAt && (_jsx("span", { className: "shrink-0 text-xs text-muted-foreground", children: formatRelativeTime(conversation.lastMessageAt) }))] }), conversation.subtitle && (onSubtitleClick ? (_jsxs("button", { type: "button", onClick: (e) => {
|
|
44
|
+
e.stopPropagation();
|
|
45
|
+
onSubtitleClick(conversation.id);
|
|
46
|
+
}, className: cn("mt-0.5 flex items-center gap-1 truncate text-xs", "text-primary/70 hover:text-primary hover:underline", "transition-colors"), "aria-label": `View offer for ${conversation.subtitle}`, children: [_jsx("span", { className: "truncate", children: conversation.subtitle }), _jsx(ArrowUpRight, { className: "size-3 shrink-0" })] })) : (_jsx("p", { className: "mt-0.5 truncate text-xs text-muted-foreground/70", children: conversation.subtitle }))), conversation.lastMessage && (_jsx("p", { className: "mt-0.5 truncate text-sm/5 text-muted-foreground", children: conversation.lastMessage }))] }), hasUnread && (_jsx("span", { className: cn("flex size-5 shrink-0 items-center justify-center rounded-full", "text-[10px] font-bold tabular-nums", "bg-primary text-primary-foreground"), children: conversation.unreadCount > 9 ? "9+" : conversation.unreadCount }))] }));
|
|
47
|
+
}
|
|
48
|
+
/* ─── Empty state ─── */
|
|
49
|
+
function EmptyState({ t = defaultT }) {
|
|
50
|
+
return (_jsxs("div", { className: "flex flex-1 flex-col items-center justify-center gap-3 px-5 py-16 text-center", children: [_jsx("div", { className: "flex size-12 items-center justify-center rounded-full bg-muted", children: _jsx(MessageCircle, { className: "size-6 text-muted-foreground/50" }) }), _jsx("p", { className: "text-sm font-medium text-muted-foreground", children: t("messenger.empty", "No conversations yet") }), _jsx("p", { className: "max-w-[200px] text-xs text-muted-foreground/70", children: t("messenger.emptyHint", "Conversations will appear here when you start messaging") })] }));
|
|
51
|
+
}
|
|
52
|
+
/* ─── No results ─── */
|
|
53
|
+
function NoResults({ query, t = defaultT, }) {
|
|
54
|
+
return (_jsxs("div", { className: "flex flex-1 flex-col items-center justify-center gap-2 px-5 py-16 text-center", children: [_jsx(Search, { className: "size-6 text-muted-foreground/40" }), _jsxs("p", { className: "text-sm text-muted-foreground", children: [t("messenger.noResults", "No results for"), " ", _jsxs("span", { className: "font-medium text-foreground", children: ["\u201C", query, "\u201D"] })] })] }));
|
|
55
|
+
}
|
|
56
|
+
/* ─── Main Layout ─── */
|
|
57
|
+
export function MessengerLayout({ conversations, activeConversationId, onSelectConversation, isLoading = false, searchQuery = "", onSearchChange, children, header, onBack, onSubtitleClick, t = defaultT, }) {
|
|
58
|
+
/* Filter conversations by search */
|
|
59
|
+
const filtered = searchQuery.trim()
|
|
60
|
+
? conversations.filter((c) => c.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
|
|
61
|
+
c.subtitle?.toLowerCase().includes(searchQuery.toLowerCase()))
|
|
62
|
+
: conversations;
|
|
63
|
+
const hasActive = !!activeConversationId;
|
|
64
|
+
return (_jsxs("div", { className: "flex h-full min-h-0 overflow-hidden rounded-2xl border border-border bg-card shadow-xs", children: [_jsxs("div", { className: cn("flex w-full flex-col border-r border-border lg:w-80 xl:w-96",
|
|
65
|
+
/* On mobile: hide sidebar when a conversation is selected */
|
|
66
|
+
hasActive ? "hidden lg:flex" : "flex"), children: [header, onSearchChange && (_jsx("div", { className: "border-b border-border px-3 py-3", children: _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground" }), _jsx("input", { type: "text", value: searchQuery, onChange: (e) => onSearchChange(e.target.value), placeholder: t("messenger.search", "Search conversations..."), className: cn("w-full rounded-lg border border-border bg-background py-2 pl-9 pr-3", "text-sm text-foreground placeholder:text-muted-foreground", "transition-colors focus:border-primary/50 focus:outline-none focus:ring-2 focus:ring-primary/20") })] }) })), _jsx("div", { className: "flex-1 overflow-y-auto", children: isLoading ? (_jsx(ConversationListSkeleton, {})) : filtered.length === 0 && searchQuery.trim() ? (_jsx(NoResults, { query: searchQuery, t: t })) : filtered.length === 0 ? (_jsx(EmptyState, { t: t })) : (_jsx("div", { className: "flex flex-col gap-0.5 p-2", children: filtered.map((conv) => (_jsx(ConversationItem, { conversation: conv, isSelected: conv.id === activeConversationId, onClick: () => onSelectConversation(conv.id), onSubtitleClick: onSubtitleClick }, conv.id))) })) })] }), _jsxs("div", { className: cn("flex min-w-0 flex-1 flex-col",
|
|
67
|
+
/* On mobile: hide panel when no conversation is selected */
|
|
68
|
+
!hasActive ? "hidden lg:flex" : "flex"), children: [hasActive && onBack && (_jsx("div", { className: "flex items-center gap-2 border-b border-border px-4 py-3 lg:hidden", children: _jsxs("button", { type: "button", onClick: onBack, className: cn("inline-flex items-center gap-1.5 rounded-lg px-2 py-1.5", "text-sm font-medium text-muted-foreground", "transition-colors hover:bg-accent hover:text-foreground", "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring"), children: [_jsx(ArrowLeft, { className: "size-4" }), t("messenger.back", "Back")] }) })), children] })] }));
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=messenger-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messenger-layout.js","sourceRoot":"","sources":["../../src/chat/messenger-layout.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AA6B9E,qBAAqB;AAErB,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,QAAiB,EAAE,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAC;AAEvE,SAAS,kBAAkB,CAAC,OAAe;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC;IAC1B,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC;IAElC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC5C,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC;IACnC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,GAAG,CAAC;IAEvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,GAAG,KAAK,GAAG,CAAC;IAEnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACpC,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,GAAG,IAAI,GAAG,CAAC;IAEhC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,kBAAkB,CAAC,SAAS,EAAE;QACrD,KAAK,EAAE,OAAO;QACd,GAAG,EAAE,SAAS;KACf,CAAC,CAAC;AACL,CAAC;AAED,8BAA8B;AAE9B,SAAS,wBAAwB,CAAC,EAAE,KAAK,GAAG,CAAC,EAAsB;IACjE,OAAO,CACL,cAAK,SAAS,EAAC,yBAAyB,YACrC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAC3C,eAAa,SAAS,EAAC,mCAAmC,aACxD,KAAC,QAAQ,IAAC,SAAS,EAAC,+BAA+B,GAAG,EACtD,eAAK,SAAS,EAAC,kBAAkB,aAC/B,eAAK,SAAS,EAAC,yCAAyC,aACtD,KAAC,QAAQ,IAAC,SAAS,EAAC,YAAY,GAAG,EACnC,KAAC,QAAQ,IAAC,SAAS,EAAC,UAAU,GAAG,IAC7B,EACN,KAAC,QAAQ,IAAC,SAAS,EAAC,WAAW,GAAG,IAC9B,KARE,CAAC,CASL,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAWD,SAAS,gBAAgB,CAAC,EACxB,YAAY,EACZ,UAAU,EACV,OAAO,EACP,eAAe,GACO;IACtB,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,GAAG,CAAC,CAAC;IAE/C,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,EAAE,CACX,qEAAqE,EACrE,6BAA6B,EAC7B,mFAAmF,EACnF,UAAU;YACR,CAAC,CAAC,kCAAkC;YACpC,CAAC,CAAC,4CAA4C,CACjD,aAGD,eACE,SAAS,EAAE,EAAE,CACX,sFAAsF,EACtF,SAAS,IAAI,UAAU;oBACrB,CAAC,CAAC,oCAAoC;oBACtC,CAAC,CAAC,gCAAgC,CACrC,YAEA,YAAY,CAAC,QAAQ,GACjB,EAGP,eAAK,SAAS,EAAC,gBAAgB,aAC7B,eAAK,SAAS,EAAC,yCAAyC,aACtD,eACE,SAAS,EAAE,EAAE,CACX,kBAAkB,EAClB,SAAS;oCACP,CAAC,CAAC,+BAA+B;oCACjC,CAAC,CAAC,gCAAgC,CACrC,YAEA,YAAY,CAAC,IAAI,GACb,EACN,YAAY,CAAC,aAAa,IAAI,CAC7B,eAAM,SAAS,EAAC,wCAAwC,YACrD,kBAAkB,CAAC,YAAY,CAAC,aAAa,CAAC,GAC1C,CACR,IACG,EAEL,YAAY,CAAC,QAAQ,IAAI,CACxB,eAAe,CAAC,CAAC,CAAC,CAChB,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;4BACb,CAAC,CAAC,eAAe,EAAE,CAAC;4BACpB,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;wBACnC,CAAC,EACD,SAAS,EAAE,EAAE,CACX,iDAAiD,EACjD,oDAAoD,EACpD,mBAAmB,CACpB,gBACW,kBAAkB,YAAY,CAAC,QAAQ,EAAE,aAErD,eAAM,SAAS,EAAC,UAAU,YAAE,YAAY,CAAC,QAAQ,GAAQ,EACzD,KAAC,YAAY,IAAC,SAAS,EAAC,iBAAiB,GAAG,IACrC,CACV,CAAC,CAAC,CAAC,CACF,YAAG,SAAS,EAAC,kDAAkD,YAC5D,YAAY,CAAC,QAAQ,GACpB,CACL,CACF,EAEA,YAAY,CAAC,WAAW,IAAI,CAC3B,YAAG,SAAS,EAAC,iDAAiD,YAC3D,YAAY,CAAC,WAAW,GACvB,CACL,IACG,EAGL,SAAS,IAAI,CACZ,eACE,SAAS,EAAE,EAAE,CACX,+DAA+D,EAC/D,oCAAoC,EACpC,oCAAoC,CACrC,YAEA,YAAY,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,GAC1D,CACR,IACM,CACV,CAAC;AACJ,CAAC;AAED,yBAAyB;AAEzB,SAAS,UAAU,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAsD;IACtF,OAAO,CACL,eAAK,SAAS,EAAC,+EAA+E,aAC5F,cAAK,SAAS,EAAC,gEAAgE,YAC7E,KAAC,aAAa,IAAC,SAAS,EAAC,iCAAiC,GAAG,GACzD,EACN,YAAG,SAAS,EAAC,2CAA2C,YACrD,CAAC,CAAC,iBAAiB,EAAE,sBAAsB,CAAC,GAC3C,EACJ,YAAG,SAAS,EAAC,gDAAgD,YAC1D,CAAC,CACA,qBAAqB,EACrB,yDAAyD,CAC1D,GACC,IACA,CACP,CAAC;AACJ,CAAC;AAED,wBAAwB;AAExB,SAAS,SAAS,CAAC,EACjB,KAAK,EACL,CAAC,GAAG,QAAQ,GAIb;IACC,OAAO,CACL,eAAK,SAAS,EAAC,+EAA+E,aAC5F,KAAC,MAAM,IAAC,SAAS,EAAC,iCAAiC,GAAG,EACtD,aAAG,SAAS,EAAC,+BAA+B,aACzC,CAAC,CAAC,qBAAqB,EAAE,gBAAgB,CAAC,EAAE,GAAG,EAChD,gBAAM,SAAS,EAAC,6BAA6B,uBAAS,KAAK,cAAe,IACxE,IACA,CACP,CAAC;AACJ,CAAC;AAED,yBAAyB;AAEzB,MAAM,UAAU,eAAe,CAAC,EAC9B,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,SAAS,GAAG,KAAK,EACjB,WAAW,GAAG,EAAE,EAChB,cAAc,EACd,QAAQ,EACR,MAAM,EACN,MAAM,EACN,eAAe,EACf,CAAC,GAAG,QAAQ,GACS;IACrB,oCAAoC;IACpC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE;QACjC,CAAC,CAAC,aAAa,CAAC,MAAM,CAClB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;YACxD,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAChE;QACH,CAAC,CAAC,aAAa,CAAC;IAElB,MAAM,SAAS,GAAG,CAAC,CAAC,oBAAoB,CAAC;IAEzC,OAAO,CACL,eAAK,SAAS,EAAC,wFAAwF,aAErG,eACE,SAAS,EAAE,EAAE,CACX,6DAA6D;gBAC7D,6DAA6D;gBAC7D,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CACtC,aAGA,MAAM,EAGN,cAAc,IAAI,CACjB,cAAK,SAAS,EAAC,kCAAkC,YAC/C,eAAK,SAAS,EAAC,UAAU,aACvB,KAAC,MAAM,IAAC,SAAS,EAAC,2FAA2F,GAAG,EAChH,gBACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC/C,WAAW,EAAE,CAAC,CAAC,kBAAkB,EAAE,yBAAyB,CAAC,EAC7D,SAAS,EAAE,EAAE,CACX,qEAAqE,EACrE,2DAA2D,EAC3D,iGAAiG,CAClG,GACD,IACE,GACF,CACP,EAGD,cAAK,SAAS,EAAC,wBAAwB,YACpC,SAAS,CAAC,CAAC,CAAC,CACX,KAAC,wBAAwB,KAAG,CAC7B,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAChD,KAAC,SAAS,IAAC,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,GAAI,CACxC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC1B,KAAC,UAAU,IAAC,CAAC,EAAE,CAAC,GAAI,CACrB,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,2BAA2B,YACvC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACtB,KAAC,gBAAgB,IAEf,YAAY,EAAE,IAAI,EAClB,UAAU,EAAE,IAAI,CAAC,EAAE,KAAK,oBAAoB,EAC5C,OAAO,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,EAC5C,eAAe,EAAE,eAAe,IAJ3B,IAAI,CAAC,EAAE,CAKZ,CACH,CAAC,GACE,CACP,GACG,IACF,EAGN,eACE,SAAS,EAAE,EAAE,CACX,8BAA8B;gBAC9B,4DAA4D;gBAC5D,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CACvC,aAGA,SAAS,IAAI,MAAM,IAAI,CACtB,cAAK,SAAS,EAAC,oEAAoE,YACjF,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,EAAE,CACX,yDAAyD,EACzD,2CAA2C,EAC3C,yDAAyD,EACzD,mFAAmF,CACpF,aAED,KAAC,SAAS,IAAC,SAAS,EAAC,QAAQ,GAAG,EAC/B,CAAC,CAAC,gBAAgB,EAAE,MAAM,CAAC,IACrB,GACL,CACP,EAEA,QAAQ,IACL,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { OfferResponseThread, TranslationFn } from "./types";
|
|
2
|
+
interface NegotiationEventCardProps {
|
|
3
|
+
response: OfferResponseThread;
|
|
4
|
+
/** Optional translation function; falls back to English defaults. */
|
|
5
|
+
t?: TranslationFn;
|
|
6
|
+
}
|
|
7
|
+
export declare function NegotiationEventCard({ response, t }: NegotiationEventCardProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=negotiation-event-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"negotiation-event-card.d.ts","sourceRoot":"","sources":["../../src/chat/negotiation-event-card.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAElE,UAAU,yBAAyB;IACjC,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,qEAAqE;IACrE,CAAC,CAAC,EAAE,aAAa,CAAC;CACnB;AAkBD,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,CAAY,EAAE,EAAE,yBAAyB,2CAkFzF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { format, formatDistanceToNow } from "date-fns";
|
|
3
|
+
import { ShadcnBadge as Badge } from "../components/shadcn-badge";
|
|
4
|
+
import { Check, X, ArrowLeftRight, Ban, Link2, } from "lucide-react";
|
|
5
|
+
import { toneClass } from "../lib/semantic-tones";
|
|
6
|
+
const TYPE_ICONS = {
|
|
7
|
+
accept: _jsx(Check, { className: "size-3.5" }),
|
|
8
|
+
counter: _jsx(ArrowLeftRight, { className: "size-3.5" }),
|
|
9
|
+
reject: _jsx(X, { className: "size-3.5" }),
|
|
10
|
+
withdraw: _jsx(Ban, { className: "size-3.5" }),
|
|
11
|
+
};
|
|
12
|
+
const TYPE_TONES = {
|
|
13
|
+
accept: "success",
|
|
14
|
+
counter: "negotiation",
|
|
15
|
+
reject: "danger",
|
|
16
|
+
withdraw: "neutral",
|
|
17
|
+
};
|
|
18
|
+
const defaultT = (_key, fallback) => fallback;
|
|
19
|
+
export function NegotiationEventCard({ response, t = defaultT }) {
|
|
20
|
+
const typeLabels = {
|
|
21
|
+
accept: t("eventAccepted", "Accepted"),
|
|
22
|
+
counter: t("eventCounter", "Counter"),
|
|
23
|
+
reject: t("eventRejected", "Rejected"),
|
|
24
|
+
withdraw: t("eventWithdrawn", "Withdrawn"),
|
|
25
|
+
};
|
|
26
|
+
const icon = TYPE_ICONS[response.responseType] ?? TYPE_ICONS.counter;
|
|
27
|
+
const label = typeLabels[response.responseType] ?? typeLabels.counter;
|
|
28
|
+
const tone = TYPE_TONES[response.responseType] ?? TYPE_TONES.counter;
|
|
29
|
+
const config = { icon, label, tone };
|
|
30
|
+
const isProducer = response.responderRole === "producer";
|
|
31
|
+
const hasCommercials = response.details?.price ||
|
|
32
|
+
response.details?.availableVolume ||
|
|
33
|
+
response.details?.validThrough ||
|
|
34
|
+
response.details?.terms;
|
|
35
|
+
return (_jsxs("div", { className: `tone-panel premium-panel rounded-[24px] border-l-4 px-4 py-4 ${toneClass(config.tone)}`, style: { borderLeftColor: "var(--tone-solid)" }, children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs(Badge, { className: `status-pill ${toneClass(config.tone)}`, children: [_jsx("span", { className: "mr-1", children: config.icon }), config.label] }), _jsx("span", { className: "text-xs font-medium", children: isProducer ? t("producer", "Producer") : t("you", "You") }), _jsx("span", { className: "text-xs text-muted-foreground", children: formatDistanceToNow(new Date(response.createdAt), {
|
|
36
|
+
addSuffix: true,
|
|
37
|
+
}) }), response.parentResponseId && (_jsxs("span", { className: "inline-flex items-center gap-1 text-xs text-muted-foreground", children: [_jsx(Link2, { className: "size-3" }), t("repliesToPrior", "Replies to prior terms")] }))] }), response.message && (_jsx("p", { className: "mt-3 text-sm/6 text-foreground", children: response.message })), hasCommercials && (_jsxs("div", { className: "surface-card mt-4 grid gap-3 rounded-[20px] p-4 text-sm", children: [response.details?.price && (_jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsx("span", { className: "text-muted-foreground", children: t("chipPrice", "Price") }), _jsxs("span", { className: "font-medium text-foreground", children: [response.details.currency ?? "", " ", response.details.price] })] })), response.details?.availableVolume && (_jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsx("span", { className: "text-muted-foreground", children: t("availableVolume", "Available Volume") }), _jsx("span", { className: "font-medium text-foreground", children: response.details.availableVolume })] })), response.details?.validThrough && (_jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsx("span", { className: "text-muted-foreground", children: t("chipValidThrough", "Valid through") }), _jsx("span", { className: "font-medium text-foreground", children: format(new Date(response.details.validThrough), "MMM d, yyyy") })] })), response.details?.terms && (_jsxs("div", { className: "grid gap-1", children: [_jsx("span", { className: "text-muted-foreground", children: t("terms", "Terms") }), _jsx("span", { className: "text-foreground", children: response.details.terms })] }))] }))] }));
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=negotiation-event-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"negotiation-event-card.js","sourceRoot":"","sources":["../../src/chat/negotiation-event-card.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ChatMessage, OfferResponseThread, ConversationEvent } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Build a stable timeline across direct chat, system notes, and structured
|
|
4
|
+
* negotiation responses. System echoes that mirror response cards are removed.
|
|
5
|
+
*/
|
|
6
|
+
export declare function buildConversationTimeline(chatMessages: ChatMessage[], responseThread: OfferResponseThread[]): ConversationEvent[];
|
|
7
|
+
//# sourceMappingURL=timeline-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline-utils.d.ts","sourceRoot":"","sources":["../../src/chat/timeline-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEnF;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,WAAW,EAAE,EAC3B,cAAc,EAAE,mBAAmB,EAAE,GACpC,iBAAiB,EAAE,CAwCrB"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build a stable timeline across direct chat, system notes, and structured
|
|
3
|
+
* negotiation responses. System echoes that mirror response cards are removed.
|
|
4
|
+
*/
|
|
5
|
+
export function buildConversationTimeline(chatMessages, responseThread) {
|
|
6
|
+
const responseIds = new Set(responseThread.map((response) => response.id));
|
|
7
|
+
const events = [];
|
|
8
|
+
for (const message of chatMessages) {
|
|
9
|
+
const responseId = message.metadata?.responseId;
|
|
10
|
+
const isResponseEcho = message.messageType === "system" &&
|
|
11
|
+
message.metadata?.action === "offer_response" &&
|
|
12
|
+
typeof responseId === "string" &&
|
|
13
|
+
responseIds.has(responseId);
|
|
14
|
+
if (isResponseEcho)
|
|
15
|
+
continue;
|
|
16
|
+
events.push({
|
|
17
|
+
id: `chat:${message.id}`,
|
|
18
|
+
kind: message.messageType === "system" ? "system" : "chat",
|
|
19
|
+
timestamp: message.createdAt,
|
|
20
|
+
senderOrgId: message.senderOrgId,
|
|
21
|
+
message,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
for (const response of responseThread) {
|
|
25
|
+
events.push({
|
|
26
|
+
id: `response:${response.id}`,
|
|
27
|
+
kind: "response",
|
|
28
|
+
timestamp: response.createdAt,
|
|
29
|
+
senderOrgId: response.responderOrgId,
|
|
30
|
+
response,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return events.sort((left, right) => {
|
|
34
|
+
const delta = new Date(left.timestamp).getTime() - new Date(right.timestamp).getTime();
|
|
35
|
+
if (delta !== 0)
|
|
36
|
+
return delta;
|
|
37
|
+
return left.id.localeCompare(right.id);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=timeline-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline-utils.js","sourceRoot":"","sources":["../../src/chat/timeline-utils.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,YAA2B,EAC3B,cAAqC;IAErC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAE3E,MAAM,MAAM,GAAwB,EAAE,CAAC;IAEvC,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC;QAChD,MAAM,cAAc,GAClB,OAAO,CAAC,WAAW,KAAK,QAAQ;YAChC,OAAO,CAAC,QAAQ,EAAE,MAAM,KAAK,gBAAgB;YAC7C,OAAO,UAAU,KAAK,QAAQ;YAC9B,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAE9B,IAAI,cAAc;YAAE,SAAS;QAE7B,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,QAAQ,OAAO,CAAC,EAAE,EAAE;YACxB,IAAI,EAAE,OAAO,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;YAC1D,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,YAAY,QAAQ,CAAC,EAAE,EAAE;YAC7B,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,WAAW,EAAE,QAAQ,CAAC,cAAc;YACpC,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACjC,MAAM,KAAK,GACT,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QAC3E,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC9B,OAAO,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
export interface ChatRoom {
|
|
2
|
+
id: string;
|
|
3
|
+
offerId: string;
|
|
4
|
+
producerOrgId: string;
|
|
5
|
+
importerOrgId: string;
|
|
6
|
+
producerOrgName?: string | null;
|
|
7
|
+
importerOrgName?: string | null;
|
|
8
|
+
beverageName?: string | null;
|
|
9
|
+
beverageProducer?: string | null;
|
|
10
|
+
offerStatus?: string | null;
|
|
11
|
+
recipientId?: string | null;
|
|
12
|
+
status: "active" | "closed" | "archived";
|
|
13
|
+
lastMessageAt?: string | null;
|
|
14
|
+
createdAt: string;
|
|
15
|
+
}
|
|
16
|
+
export interface ChatMessage {
|
|
17
|
+
id: string;
|
|
18
|
+
roomId: string;
|
|
19
|
+
senderOrgId: string;
|
|
20
|
+
senderUserId?: string | null;
|
|
21
|
+
content: string;
|
|
22
|
+
messageType: "text" | "system";
|
|
23
|
+
metadata?: (Record<string, unknown> & {
|
|
24
|
+
clientMessageId?: string;
|
|
25
|
+
}) | null;
|
|
26
|
+
readBy?: string[] | null;
|
|
27
|
+
createdAt: string;
|
|
28
|
+
}
|
|
29
|
+
export interface CursorPaginatedResponse<T> {
|
|
30
|
+
data: T[];
|
|
31
|
+
pagination: {
|
|
32
|
+
nextCursor?: string;
|
|
33
|
+
hasMore: boolean;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export interface OfferResponseThread {
|
|
37
|
+
id: string;
|
|
38
|
+
offerId: string;
|
|
39
|
+
recipientId?: string | null;
|
|
40
|
+
importerOrgId: string;
|
|
41
|
+
responseType: "accept" | "counter" | "reject" | "withdraw";
|
|
42
|
+
details?: {
|
|
43
|
+
price?: string;
|
|
44
|
+
currency?: string;
|
|
45
|
+
availableVolume?: string;
|
|
46
|
+
terms?: string;
|
|
47
|
+
validThrough?: string;
|
|
48
|
+
} | null;
|
|
49
|
+
message?: string | null;
|
|
50
|
+
isAccepted?: boolean;
|
|
51
|
+
parentResponseId?: string | null;
|
|
52
|
+
responderOrgId: string;
|
|
53
|
+
responderRole: "producer" | "importer";
|
|
54
|
+
createdAt: string;
|
|
55
|
+
}
|
|
56
|
+
export type ConversationEvent = {
|
|
57
|
+
id: string;
|
|
58
|
+
kind: "chat";
|
|
59
|
+
timestamp: string;
|
|
60
|
+
senderOrgId: string;
|
|
61
|
+
message: ChatMessage;
|
|
62
|
+
} | {
|
|
63
|
+
id: string;
|
|
64
|
+
kind: "system";
|
|
65
|
+
timestamp: string;
|
|
66
|
+
senderOrgId: string;
|
|
67
|
+
message: ChatMessage;
|
|
68
|
+
} | {
|
|
69
|
+
id: string;
|
|
70
|
+
kind: "response";
|
|
71
|
+
timestamp: string;
|
|
72
|
+
senderOrgId: string;
|
|
73
|
+
response: OfferResponseThread;
|
|
74
|
+
};
|
|
75
|
+
/** A minimal translation function. Defaults to identity (returns the fallback). */
|
|
76
|
+
export type TranslationFn = (key: string, fallback: string, options?: Record<string, unknown>) => string;
|
|
77
|
+
export interface ChatApiClient {
|
|
78
|
+
getMessages(roomId: string, cursor?: string): Promise<CursorPaginatedResponse<ChatMessage>>;
|
|
79
|
+
sendMessage(roomId: string, content: string, messageType?: "text" | "system", metadata?: Record<string, unknown>): Promise<ChatMessage>;
|
|
80
|
+
markRead(roomId: string, messageId: string): Promise<void>;
|
|
81
|
+
markReadBulk(roomId: string): Promise<{
|
|
82
|
+
markedRead: number;
|
|
83
|
+
}>;
|
|
84
|
+
getWsTicket(): Promise<{
|
|
85
|
+
ticket: string;
|
|
86
|
+
}>;
|
|
87
|
+
}
|
|
88
|
+
export interface ChatWsConfig {
|
|
89
|
+
/** Base URL for WebSocket connection (e.g. "http://localhost:4000" - will be converted to ws://) */
|
|
90
|
+
baseUrl: string;
|
|
91
|
+
/** Function to get the WS auth ticket */
|
|
92
|
+
getWsTicket: () => Promise<{
|
|
93
|
+
ticket: string;
|
|
94
|
+
}>;
|
|
95
|
+
}
|
|
96
|
+
export interface ChatState {
|
|
97
|
+
messages: ChatMessage[];
|
|
98
|
+
sendMessage: (content: string) => void;
|
|
99
|
+
sendTyping: () => void;
|
|
100
|
+
isConnected: boolean;
|
|
101
|
+
isTyping: boolean;
|
|
102
|
+
isLoading: boolean;
|
|
103
|
+
hasMore: boolean;
|
|
104
|
+
loadMore: () => Promise<unknown> | void;
|
|
105
|
+
isSending: boolean;
|
|
106
|
+
unreadCount: number;
|
|
107
|
+
}
|
|
108
|
+
export interface CommunicationPanelProps {
|
|
109
|
+
chatState: ChatState;
|
|
110
|
+
roomId: string | null | undefined;
|
|
111
|
+
currentOrgId: string;
|
|
112
|
+
offerId: string;
|
|
113
|
+
responseThread: OfferResponseThread[];
|
|
114
|
+
counterMode: boolean;
|
|
115
|
+
onCounterCancel: () => void;
|
|
116
|
+
onCounterSuccess: () => void;
|
|
117
|
+
defaultCurrency?: string | null;
|
|
118
|
+
showPanelToggle?: boolean;
|
|
119
|
+
panelOpen?: boolean;
|
|
120
|
+
onPanelToggle?: () => void;
|
|
121
|
+
/** Multi-room mode: list of available rooms */
|
|
122
|
+
rooms?: ChatRoom[];
|
|
123
|
+
/** Active room ID for multi-room mode */
|
|
124
|
+
activeRoomId?: string;
|
|
125
|
+
/** Callback when room changes in multi-room mode */
|
|
126
|
+
onRoomChange?: (id: string) => void;
|
|
127
|
+
/** Optional translation function */
|
|
128
|
+
t?: TranslationFn;
|
|
129
|
+
/** Render prop for counter form (dashboard provides its own form with hooks) */
|
|
130
|
+
renderCounterForm?: () => React.ReactNode;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/chat/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/chat/types.ts"],"names":[],"mappings":"AAAA,wBAAwB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ConversationEvent, TranslationFn } from "./types";
|
|
2
|
+
interface UnifiedTimelineProps {
|
|
3
|
+
items: ConversationEvent[];
|
|
4
|
+
currentOrgId: string;
|
|
5
|
+
isTyping: boolean;
|
|
6
|
+
hasMore: boolean;
|
|
7
|
+
onLoadMore: () => Promise<unknown> | void;
|
|
8
|
+
/** Optional translation function; falls back to English defaults. */
|
|
9
|
+
t?: TranslationFn;
|
|
10
|
+
}
|
|
11
|
+
export declare function UnifiedTimeline({ items, currentOrgId, isTyping, hasMore, onLoadMore, t, }: UnifiedTimelineProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=unified-timeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unified-timeline.d.ts","sourceRoot":"","sources":["../../src/chat/unified-timeline.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEhE,UAAU,oBAAoB;IAC5B,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAC1C,qEAAqE;IACrE,CAAC,CAAC,EAAE,aAAa,CAAC;CACnB;AAUD,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,YAAY,EACZ,QAAQ,EACR,OAAO,EACP,UAAU,EACV,CAAY,GACb,EAAE,oBAAoB,2CAmMtB"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useEffect, useCallback, useMemo, useState } from "react";
|
|
3
|
+
import { format, isToday, isSameDay } from "date-fns";
|
|
4
|
+
import { Check, CheckCheck } from "lucide-react";
|
|
5
|
+
import { ShadcnButton as Button } from "../components/shadcn-button";
|
|
6
|
+
import { NegotiationEventCard } from "./negotiation-event-card";
|
|
7
|
+
function formatMessageTime(dateStr) {
|
|
8
|
+
const date = new Date(dateStr);
|
|
9
|
+
if (isToday(date))
|
|
10
|
+
return format(date, "h:mm a");
|
|
11
|
+
return format(date, "MMM d, h:mm a");
|
|
12
|
+
}
|
|
13
|
+
const defaultT = (_key, fallback) => fallback;
|
|
14
|
+
export function UnifiedTimeline({ items, currentOrgId, isTyping, hasMore, onLoadMore, t = defaultT, }) {
|
|
15
|
+
const scrollRef = useRef(null);
|
|
16
|
+
const wasNearBottomRef = useRef(true);
|
|
17
|
+
const initialScrollDone = useRef(false);
|
|
18
|
+
const [showJumpToLatest, setShowJumpToLatest] = useState(false);
|
|
19
|
+
const checkNearBottom = useCallback(() => {
|
|
20
|
+
const el = scrollRef.current;
|
|
21
|
+
if (!el)
|
|
22
|
+
return;
|
|
23
|
+
const threshold = 80;
|
|
24
|
+
wasNearBottomRef.current =
|
|
25
|
+
el.scrollHeight - el.scrollTop - el.clientHeight < threshold;
|
|
26
|
+
setShowJumpToLatest(!wasNearBottomRef.current);
|
|
27
|
+
}, []);
|
|
28
|
+
// Initial scroll to bottom when messages first load
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
if (items.length > 0 && !initialScrollDone.current && scrollRef.current) {
|
|
31
|
+
initialScrollDone.current = true;
|
|
32
|
+
requestAnimationFrame(() => {
|
|
33
|
+
if (scrollRef.current) {
|
|
34
|
+
scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}, [items.length]);
|
|
39
|
+
// Auto-scroll when near bottom on new messages
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
if (initialScrollDone.current && wasNearBottomRef.current && scrollRef.current) {
|
|
42
|
+
scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
|
|
43
|
+
}
|
|
44
|
+
}, [items.length]);
|
|
45
|
+
const timeline = useMemo(() => items.map((item, index) => {
|
|
46
|
+
const previous = items[index - 1];
|
|
47
|
+
const showDaySeparator = !previous ||
|
|
48
|
+
!isSameDay(new Date(previous.timestamp), new Date(item.timestamp));
|
|
49
|
+
// Check if consecutive same-sender for tighter spacing
|
|
50
|
+
const isSameSender = previous &&
|
|
51
|
+
item.kind === "chat" &&
|
|
52
|
+
previous.kind === "chat" &&
|
|
53
|
+
item.senderOrgId === previous.senderOrgId &&
|
|
54
|
+
!showDaySeparator;
|
|
55
|
+
return { item, showDaySeparator, isSameSender };
|
|
56
|
+
}), [items]);
|
|
57
|
+
async function handleLoadMore() {
|
|
58
|
+
const container = scrollRef.current;
|
|
59
|
+
if (!container) {
|
|
60
|
+
await onLoadMore();
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const previousHeight = container.scrollHeight;
|
|
64
|
+
await onLoadMore();
|
|
65
|
+
requestAnimationFrame(() => {
|
|
66
|
+
const nextHeight = container.scrollHeight;
|
|
67
|
+
container.scrollTop = nextHeight - previousHeight + container.scrollTop;
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
return (_jsxs("div", { ref: scrollRef, onScroll: checkNearBottom, className: "relative flex min-h-0 flex-1 flex-col overflow-y-auto p-4", children: [hasMore && (_jsx(Button, { variant: "ghost", size: "sm", className: "mb-2 self-center text-xs", onClick: () => {
|
|
71
|
+
void handleLoadMore();
|
|
72
|
+
}, children: t("loadOlder", "Load older") })), items.length === 0 && (_jsx("p", { className: "self-center text-sm text-muted-foreground", children: t("noMessagesYet", "No messages yet. Start the conversation!") })), timeline.map(({ item, showDaySeparator, isSameSender }) => {
|
|
73
|
+
const gap = isSameSender ? "mt-1.5" : "mt-3";
|
|
74
|
+
if (item.kind === "response") {
|
|
75
|
+
return (_jsxs("div", { className: `flex flex-col ${showDaySeparator ? "mt-3" : gap}`, children: [showDaySeparator && (_jsx("div", { className: "mb-3 self-center text-center", children: _jsx("span", { className: "status-pill status-pill-no-dot px-3 py-1 text-[11px] font-semibold uppercase tracking-[0.16em] text-muted-foreground", children: format(new Date(item.timestamp), "EEEE, MMM d") }) })), _jsx(NegotiationEventCard, { response: item.response, t: t })] }, item.id));
|
|
76
|
+
}
|
|
77
|
+
if (item.kind === "system") {
|
|
78
|
+
return (_jsxs("div", { className: `flex flex-col ${showDaySeparator ? "mt-3" : gap}`, children: [showDaySeparator && (_jsx("div", { className: "mb-3 self-center text-center", children: _jsx("span", { className: "status-pill status-pill-no-dot px-3 py-1 text-[11px] font-semibold uppercase tracking-[0.16em] text-muted-foreground", children: format(new Date(item.timestamp), "EEEE, MMM d") }) })), _jsx("div", { className: "self-center text-center text-xs text-muted-foreground italic", children: item.message.content })] }, item.id));
|
|
79
|
+
}
|
|
80
|
+
// Chat message
|
|
81
|
+
const msg = item.message;
|
|
82
|
+
const isMe = item.senderOrgId === currentOrgId;
|
|
83
|
+
const isReadByOther = msg.readBy?.some((id) => id !== currentOrgId);
|
|
84
|
+
return (_jsxs("div", { className: `flex flex-col ${showDaySeparator ? "mt-3" : gap}`, children: [showDaySeparator && (_jsx("div", { className: "mb-3 self-center text-center", children: _jsx("span", { className: "status-pill px-3 py-1 text-[11px] font-semibold uppercase tracking-[0.16em] text-muted-foreground", children: format(new Date(item.timestamp), "EEEE, MMM d") }) })), _jsxs("div", { className: `max-w-[80%] px-3.5 py-2.5 text-sm shadow-soft ${isMe
|
|
85
|
+
? "self-end rounded-[20px] rounded-br-xs bg-primary text-primary-foreground"
|
|
86
|
+
: "surface-card self-start rounded-[20px] rounded-bl-xs"}`, children: [_jsx("p", { className: "text-sm/6", children: msg.content }), _jsxs("div", { className: `mt-1.5 flex items-center gap-1 text-[10px] ${isMe
|
|
87
|
+
? "justify-end text-primary-foreground/70"
|
|
88
|
+
: "text-muted-foreground"}`, children: [_jsx("span", { children: formatMessageTime(msg.createdAt) }), isMe && (isReadByOther ? (_jsx(CheckCheck, { className: "size-3" })) : (_jsx(Check, { className: "size-3" })))] })] })] }, item.id));
|
|
89
|
+
}), isTyping && (_jsx("div", { className: "mt-3 self-start text-xs text-muted-foreground italic", children: t("producerTyping", "Producer is typing...") })), showJumpToLatest && (_jsx(Button, { size: "sm", className: "sticky bottom-0 mt-2 self-center rounded-full shadow-soft", onClick: () => {
|
|
90
|
+
if (!scrollRef.current)
|
|
91
|
+
return;
|
|
92
|
+
scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
|
|
93
|
+
wasNearBottomRef.current = true;
|
|
94
|
+
setShowJumpToLatest(false);
|
|
95
|
+
}, children: t("jumpToLatest", "Jump to latest") }))] }));
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=unified-timeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unified-timeline.js","sourceRoot":"","sources":["../../src/chat/unified-timeline.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ChatApiClient, ChatState } from "./types";
|
|
2
|
+
import type { ChatWebSocket } from "./chat-ws";
|
|
3
|
+
export interface UseChatOptions {
|
|
4
|
+
/** Chat API client (created via `createChatApi`) */
|
|
5
|
+
chatApi: ChatApiClient;
|
|
6
|
+
/** Chat WebSocket instance (created via `createChatWs`) */
|
|
7
|
+
chatWs: ChatWebSocket;
|
|
8
|
+
}
|
|
9
|
+
export declare function useChat(roomId: string | null | undefined, currentOrgId: string | null | undefined, panelActive: boolean | undefined, options: UseChatOptions): ChatState;
|
|
10
|
+
//# sourceMappingURL=use-chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-chat.d.ts","sourceRoot":"","sources":["../../src/chat/use-chat.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAe,SAAS,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAkD/C,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,OAAO,EAAE,aAAa,CAAC;IACvB,2DAA2D;IAC3D,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,wBAAgB,OAAO,CACrB,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACjC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACvC,WAAW,EAAE,OAAO,YAAO,EAC3B,OAAO,EAAE,cAAc,GACtB,SAAS,CA4QX"}
|