hazo_chat 2.0.15 → 2.0.16
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/api/index.d.ts +26 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +25 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/messages.d.ts +34 -0
- package/dist/api/messages.d.ts.map +1 -0
- package/dist/api/messages.js +214 -0
- package/dist/api/messages.js.map +1 -0
- package/dist/api/types.d.ts +69 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +8 -0
- package/dist/api/types.js.map +1 -0
- package/dist/api/unread_count.d.ts +57 -0
- package/dist/api/unread_count.d.ts.map +1 -0
- package/dist/api/unread_count.js +86 -0
- package/dist/api/unread_count.js.map +1 -0
- package/dist/components/hazo_chat/hazo_chat.d.ts +28 -0
- package/dist/components/hazo_chat/hazo_chat.d.ts.map +1 -0
- package/dist/components/hazo_chat/hazo_chat.js +220 -0
- package/dist/components/hazo_chat/hazo_chat.js.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_attachment_preview.d.ts +17 -0
- package/dist/components/hazo_chat/hazo_chat_attachment_preview.d.ts.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_attachment_preview.js +60 -0
- package/dist/components/hazo_chat/hazo_chat_attachment_preview.js.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_context.d.ts +42 -0
- package/dist/components/hazo_chat/hazo_chat_context.d.ts.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_context.js +273 -0
- package/dist/components/hazo_chat/hazo_chat_context.js.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_document_viewer.d.ts +15 -0
- package/dist/components/hazo_chat/hazo_chat_document_viewer.d.ts.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_document_viewer.js +140 -0
- package/dist/components/hazo_chat/hazo_chat_document_viewer.js.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_header.d.ts +16 -0
- package/dist/components/hazo_chat/hazo_chat_header.d.ts.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_header.js +24 -0
- package/dist/components/hazo_chat/hazo_chat_header.js.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_input.d.ts +16 -0
- package/dist/components/hazo_chat/hazo_chat_input.d.ts.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_input.js +75 -0
- package/dist/components/hazo_chat/hazo_chat_input.js.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_messages.d.ts +17 -0
- package/dist/components/hazo_chat/hazo_chat_messages.d.ts.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_messages.js +109 -0
- package/dist/components/hazo_chat/hazo_chat_messages.js.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_reference_list.d.ts +16 -0
- package/dist/components/hazo_chat/hazo_chat_reference_list.d.ts.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_reference_list.js +59 -0
- package/dist/components/hazo_chat/hazo_chat_reference_list.js.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_sidebar.d.ts +18 -0
- package/dist/components/hazo_chat/hazo_chat_sidebar.d.ts.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_sidebar.js +72 -0
- package/dist/components/hazo_chat/hazo_chat_sidebar.js.map +1 -0
- package/dist/components/hazo_chat/index.d.ts +16 -0
- package/dist/components/hazo_chat/index.d.ts.map +1 -0
- package/dist/components/hazo_chat/index.js +19 -0
- package/dist/components/hazo_chat/index.js.map +1 -0
- package/dist/components/index.d.ts +9 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +11 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/ui/avatar.d.ts +13 -0
- package/dist/components/ui/avatar.d.ts.map +1 -0
- package/dist/components/ui/avatar.js +28 -0
- package/dist/components/ui/avatar.js.map +1 -0
- package/dist/components/ui/badge.d.ts +16 -0
- package/dist/components/ui/badge.d.ts.map +1 -0
- package/dist/components/ui/badge.js +36 -0
- package/dist/components/ui/badge.js.map +1 -0
- package/dist/components/ui/button.d.ts +18 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +47 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/chat_bubble.d.ts +18 -0
- package/dist/components/ui/chat_bubble.d.ts.map +1 -0
- package/dist/components/ui/chat_bubble.js +107 -0
- package/dist/components/ui/chat_bubble.js.map +1 -0
- package/dist/components/ui/hover-card.d.ts +13 -0
- package/dist/components/ui/hover-card.d.ts.map +1 -0
- package/dist/components/ui/hover-card.js +17 -0
- package/dist/components/ui/hover-card.js.map +1 -0
- package/dist/components/ui/index.d.ts +19 -0
- package/dist/components/ui/index.d.ts.map +1 -0
- package/dist/components/ui/index.js +21 -0
- package/dist/components/ui/index.js.map +1 -0
- package/dist/components/ui/input.d.ts +11 -0
- package/dist/components/ui/input.d.ts.map +1 -0
- package/dist/components/ui/input.js +18 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/loading_skeleton.d.ts +19 -0
- package/dist/components/ui/loading_skeleton.d.ts.map +1 -0
- package/dist/components/ui/loading_skeleton.js +30 -0
- package/dist/components/ui/loading_skeleton.js.map +1 -0
- package/dist/components/ui/scroll-area.d.ts +12 -0
- package/dist/components/ui/scroll-area.d.ts.map +1 -0
- package/dist/components/ui/scroll-area.js +25 -0
- package/dist/components/ui/scroll-area.js.map +1 -0
- package/dist/components/ui/separator.d.ts +11 -0
- package/dist/components/ui/separator.d.ts.map +1 -0
- package/dist/components/ui/separator.js +18 -0
- package/dist/components/ui/separator.js.map +1 -0
- package/dist/components/ui/skeleton.d.ts +9 -0
- package/dist/components/ui/skeleton.d.ts.map +1 -0
- package/dist/components/ui/skeleton.js +16 -0
- package/dist/components/ui/skeleton.js.map +1 -0
- package/dist/components/ui/textarea.d.ts +11 -0
- package/dist/components/ui/textarea.d.ts.map +1 -0
- package/dist/components/ui/textarea.js +18 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/components/ui/tooltip.d.ts +14 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/components/ui/tooltip.js +30 -0
- package/dist/components/ui/tooltip.js.map +1 -0
- package/dist/hooks/index.d.ts +10 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +10 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/use_chat_messages.d.ts +33 -0
- package/dist/hooks/use_chat_messages.d.ts.map +1 -0
- package/dist/hooks/use_chat_messages.js +466 -0
- package/dist/hooks/use_chat_messages.js.map +1 -0
- package/dist/hooks/use_chat_references.d.ts +17 -0
- package/dist/hooks/use_chat_references.d.ts.map +1 -0
- package/dist/hooks/use_chat_references.js +133 -0
- package/dist/hooks/use_chat_references.js.map +1 -0
- package/dist/hooks/use_file_upload.d.ts +23 -0
- package/dist/hooks/use_file_upload.d.ts.map +1 -0
- package/dist/hooks/use_file_upload.js +212 -0
- package/dist/hooks/use_file_upload.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +41 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +93 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +41 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +72 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/index.d.ts +9 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +9 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/utils.d.ts +17 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +20 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/types/index.d.ts +404 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +11 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HazoChat Component
|
|
3
|
+
*
|
|
4
|
+
* Main chat UI component with:
|
|
5
|
+
* - Responsive grid layout (sidebar + chat area)
|
|
6
|
+
* - Context provider for shared state
|
|
7
|
+
* - Document viewer and reference list
|
|
8
|
+
* - Message polling and pagination
|
|
9
|
+
*
|
|
10
|
+
* Uses API calls internally - no server-side dependencies required.
|
|
11
|
+
*/
|
|
12
|
+
'use client';
|
|
13
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
14
|
+
import { useCallback, useMemo, useState, useEffect, useRef } from 'react';
|
|
15
|
+
import { IoChevronDown, IoChevronUp, IoChevronBack, IoChevronForward } from 'react-icons/io5';
|
|
16
|
+
import { cn } from '../../lib/utils.js';
|
|
17
|
+
import { DEFAULT_TIMEZONE, DEFAULT_REALTIME_MODE, DEFAULT_POLLING_INTERVAL, DEFAULT_MESSAGES_PER_PAGE } from '../../lib/constants.js';
|
|
18
|
+
// Sub-components
|
|
19
|
+
import { HazoChatProvider, useHazoChatContext } from './hazo_chat_context.js';
|
|
20
|
+
import { HazoChatHeader } from './hazo_chat_header.js';
|
|
21
|
+
import { HazoChatReferenceList } from './hazo_chat_reference_list.js';
|
|
22
|
+
import { HazoChatDocumentViewer } from './hazo_chat_document_viewer.js';
|
|
23
|
+
import { HazoChatMessages } from './hazo_chat_messages.js';
|
|
24
|
+
import { HazoChatInput } from './hazo_chat_input.js';
|
|
25
|
+
import { TooltipProvider } from '../ui/tooltip.js';
|
|
26
|
+
import { Button } from '../ui/button.js';
|
|
27
|
+
// Hooks
|
|
28
|
+
import { useChatMessages } from '../../hooks/use_chat_messages.js';
|
|
29
|
+
import { useChatReferences } from '../../hooks/use_chat_references.js';
|
|
30
|
+
import { useFileUpload } from '../../hooks/use_file_upload.js';
|
|
31
|
+
function HazoChatInner({ receiver_user_id, reference_id = '', reference_type = 'chat', api_base_url = '/api/hazo_chat', additional_references = [], timezone = DEFAULT_TIMEZONE, title, subtitle, on_close, className, realtime_mode = DEFAULT_REALTIME_MODE, polling_interval = DEFAULT_POLLING_INTERVAL, messages_per_page = DEFAULT_MESSAGES_PER_PAGE, show_sidebar_toggle = false, show_delete_button = true, bubble_radius = 'default' }) {
|
|
32
|
+
// Get context
|
|
33
|
+
const { current_user, selected_reference, highlighted_message_id, pending_attachments, is_sidebar_open, set_selected_reference, set_highlighted_message_id, add_pending_attachment, remove_pending_attachment, clear_pending_attachments, toggle_sidebar, set_sidebar_open, add_reference } = useHazoChatContext();
|
|
34
|
+
// -------------------------------------------------------------------------
|
|
35
|
+
// Messages hook (uses API calls)
|
|
36
|
+
// -------------------------------------------------------------------------
|
|
37
|
+
const { messages, is_loading: is_loading_messages, has_more, load_more, send_message, delete_message, polling_status, refresh: refresh_messages } = useChatMessages({
|
|
38
|
+
receiver_user_id,
|
|
39
|
+
reference_id,
|
|
40
|
+
reference_type,
|
|
41
|
+
api_base_url,
|
|
42
|
+
realtime_mode,
|
|
43
|
+
polling_interval,
|
|
44
|
+
messages_per_page
|
|
45
|
+
});
|
|
46
|
+
// -------------------------------------------------------------------------
|
|
47
|
+
// References hook
|
|
48
|
+
// -------------------------------------------------------------------------
|
|
49
|
+
const { references, select_reference } = useChatReferences({
|
|
50
|
+
messages,
|
|
51
|
+
initial_references: additional_references.map((ref) => ({
|
|
52
|
+
...ref,
|
|
53
|
+
scope: ref.scope || 'field'
|
|
54
|
+
})),
|
|
55
|
+
on_selection_change: (ref) => {
|
|
56
|
+
set_selected_reference(ref);
|
|
57
|
+
// If ref has message_id, highlight it
|
|
58
|
+
if (ref?.message_id) {
|
|
59
|
+
set_highlighted_message_id(ref.message_id);
|
|
60
|
+
// Close sidebar on mobile after selection
|
|
61
|
+
set_sidebar_open(false);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
// -------------------------------------------------------------------------
|
|
66
|
+
// References section collapse state
|
|
67
|
+
// -------------------------------------------------------------------------
|
|
68
|
+
const [is_references_expanded, set_is_references_expanded] = useState(() => {
|
|
69
|
+
// Default to collapsed if no references
|
|
70
|
+
return references.length > 0;
|
|
71
|
+
});
|
|
72
|
+
// Auto-expand when references are added
|
|
73
|
+
useEffect(() => {
|
|
74
|
+
if (references.length > 0 && !is_references_expanded) {
|
|
75
|
+
set_is_references_expanded(true);
|
|
76
|
+
}
|
|
77
|
+
}, [references.length, is_references_expanded]);
|
|
78
|
+
// -------------------------------------------------------------------------
|
|
79
|
+
// Document viewer collapse state
|
|
80
|
+
// -------------------------------------------------------------------------
|
|
81
|
+
const [is_document_viewer_expanded, set_is_document_viewer_expanded] = useState(false);
|
|
82
|
+
// -------------------------------------------------------------------------
|
|
83
|
+
// Container width detection for narrow width handling
|
|
84
|
+
// -------------------------------------------------------------------------
|
|
85
|
+
const main_content_ref = useRef(null);
|
|
86
|
+
const NARROW_WIDTH_THRESHOLD = 500; // px - below this, open documents in new tab
|
|
87
|
+
// -------------------------------------------------------------------------
|
|
88
|
+
// File upload hook
|
|
89
|
+
// -------------------------------------------------------------------------
|
|
90
|
+
const { add_files, remove_file, upload_all, is_uploading } = useFileUpload({
|
|
91
|
+
upload_location: `${api_base_url}/uploads`
|
|
92
|
+
});
|
|
93
|
+
// -------------------------------------------------------------------------
|
|
94
|
+
// Handle send message
|
|
95
|
+
// -------------------------------------------------------------------------
|
|
96
|
+
const handle_send = useCallback(async (text, attachments) => {
|
|
97
|
+
if (!current_user)
|
|
98
|
+
return;
|
|
99
|
+
// Upload pending files first
|
|
100
|
+
const uploaded = await upload_all();
|
|
101
|
+
// Build reference list from attachments
|
|
102
|
+
const attachment_refs = [
|
|
103
|
+
...attachments,
|
|
104
|
+
...uploaded
|
|
105
|
+
].map((file) => ({
|
|
106
|
+
id: file.id,
|
|
107
|
+
type: 'document',
|
|
108
|
+
scope: 'chat',
|
|
109
|
+
name: file.name,
|
|
110
|
+
url: file.url,
|
|
111
|
+
mime_type: file.mime_type,
|
|
112
|
+
file_size: file.file_size
|
|
113
|
+
}));
|
|
114
|
+
const payload = {
|
|
115
|
+
reference_id: reference_id || '',
|
|
116
|
+
reference_type,
|
|
117
|
+
receiver_user_id,
|
|
118
|
+
message_text: text,
|
|
119
|
+
reference_list: attachment_refs.length > 0 ? attachment_refs : undefined
|
|
120
|
+
};
|
|
121
|
+
const success = await send_message(payload);
|
|
122
|
+
if (success) {
|
|
123
|
+
clear_pending_attachments();
|
|
124
|
+
// Add new references to the list
|
|
125
|
+
attachment_refs.forEach((ref) => add_reference(ref));
|
|
126
|
+
}
|
|
127
|
+
}, [
|
|
128
|
+
current_user,
|
|
129
|
+
reference_id,
|
|
130
|
+
reference_type,
|
|
131
|
+
receiver_user_id,
|
|
132
|
+
upload_all,
|
|
133
|
+
send_message,
|
|
134
|
+
clear_pending_attachments,
|
|
135
|
+
add_reference
|
|
136
|
+
]);
|
|
137
|
+
// -------------------------------------------------------------------------
|
|
138
|
+
// Handle add attachment
|
|
139
|
+
// -------------------------------------------------------------------------
|
|
140
|
+
const handle_add_attachment = useCallback((files) => {
|
|
141
|
+
files.forEach((file) => {
|
|
142
|
+
add_pending_attachment(file);
|
|
143
|
+
});
|
|
144
|
+
add_files(files);
|
|
145
|
+
}, [add_pending_attachment, add_files]);
|
|
146
|
+
// -------------------------------------------------------------------------
|
|
147
|
+
// Handle remove attachment
|
|
148
|
+
// -------------------------------------------------------------------------
|
|
149
|
+
const handle_remove_attachment = useCallback((attachment_id) => {
|
|
150
|
+
remove_pending_attachment(attachment_id);
|
|
151
|
+
remove_file(attachment_id);
|
|
152
|
+
}, [remove_pending_attachment, remove_file]);
|
|
153
|
+
// -------------------------------------------------------------------------
|
|
154
|
+
// Handle reference selection
|
|
155
|
+
// -------------------------------------------------------------------------
|
|
156
|
+
const handle_reference_select = useCallback((reference) => {
|
|
157
|
+
// Check container width - if narrow, open in new tab instead of showing preview
|
|
158
|
+
if (main_content_ref.current) {
|
|
159
|
+
const container_width = main_content_ref.current.offsetWidth;
|
|
160
|
+
if (container_width < NARROW_WIDTH_THRESHOLD) {
|
|
161
|
+
// Open in new tab for narrow containers
|
|
162
|
+
window.open(reference.url, '_blank');
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// Normal behavior: select reference and show in preview
|
|
167
|
+
select_reference(reference);
|
|
168
|
+
// Expand document viewer when selecting a reference in wide containers
|
|
169
|
+
if (!is_document_viewer_expanded) {
|
|
170
|
+
set_is_document_viewer_expanded(true);
|
|
171
|
+
}
|
|
172
|
+
}, [select_reference, is_document_viewer_expanded]);
|
|
173
|
+
// -------------------------------------------------------------------------
|
|
174
|
+
// Render
|
|
175
|
+
// -------------------------------------------------------------------------
|
|
176
|
+
return (_jsxs("div", { className: cn('cls_hazo_chat', 'flex flex-col h-full w-full', 'bg-background rounded-lg border overflow-hidden', className), children: [_jsx(HazoChatHeader, { title: title, subtitle: subtitle, on_close: on_close, on_refresh: refresh_messages, is_refreshing: is_loading_messages, on_toggle_sidebar: toggle_sidebar, is_sidebar_open: is_sidebar_open, show_sidebar_toggle: show_sidebar_toggle }), _jsx("div", { className: cn('cls_references_row border-b bg-muted/30 transition-all duration-300 ease-in-out overflow-hidden', is_references_expanded ? 'max-h-96' : 'max-h-8'), children: _jsxs("div", { className: "cls_references_container px-3 py-2", children: [_jsxs("button", { onClick: () => set_is_references_expanded(!is_references_expanded), className: "cls_references_header flex items-center justify-between w-full gap-2 mb-1.5 hover:bg-muted/50 rounded px-1 -mx-1 transition-colors", "aria-label": is_references_expanded ? 'Collapse references' : 'Expand references', "aria-expanded": is_references_expanded, children: [_jsx("h3", { className: "text-[9px] font-medium text-muted-foreground uppercase tracking-wider", children: "References" }), is_references_expanded ? (_jsx(IoChevronUp, { className: "w-3 h-3 text-muted-foreground flex-shrink-0" })) : (_jsx(IoChevronDown, { className: "w-3 h-3 text-muted-foreground flex-shrink-0" }))] }), is_references_expanded && (_jsx("div", { className: "cls_references_content", children: _jsx(HazoChatReferenceList, { references: references, selected_reference_id: selected_reference?.id, on_select: handle_reference_select, className: "flex-wrap" }) }))] }) }), _jsxs("div", { ref: main_content_ref, className: "cls_main_content flex flex-1 overflow-hidden relative h-full min-h-0", children: [_jsx("div", { className: cn('cls_doc_preview_column', 'border-r bg-muted/20', 'flex-shrink-0 flex flex-col', 'transition-all duration-300 ease-in-out overflow-hidden',
|
|
177
|
+
// Mobile: hidden by default, shown when sidebar is open
|
|
178
|
+
is_sidebar_open ? 'flex' : 'hidden md:flex',
|
|
179
|
+
// Collapse/expand based on state
|
|
180
|
+
is_document_viewer_expanded
|
|
181
|
+
? 'w-[280px] md:w-[320px] lg:w-[380px]'
|
|
182
|
+
: 'w-0 border-r-0'), children: is_document_viewer_expanded && (_jsx(HazoChatDocumentViewer, { reference: selected_reference || undefined })) }), _jsx(Button, { variant: "outline", size: "icon", onClick: () => set_is_document_viewer_expanded(!is_document_viewer_expanded), className: cn('cls_doc_viewer_toggle', 'absolute z-10', 'h-8 w-6 rounded-r-md rounded-l-none border-l-0', 'bg-background hover:bg-accent', 'transition-all duration-300',
|
|
183
|
+
// Center vertically - use top 50% and transform to center
|
|
184
|
+
'top-1/2 -translate-y-1/2',
|
|
185
|
+
// Hide on mobile when sidebar is closed
|
|
186
|
+
(!is_sidebar_open ? 'hidden md:flex' : 'flex'), is_document_viewer_expanded
|
|
187
|
+
? 'left-[280px] md:left-[320px] lg:left-[380px]'
|
|
188
|
+
: 'left-0'), style: {
|
|
189
|
+
top: '50%',
|
|
190
|
+
transform: 'translateY(-50%)',
|
|
191
|
+
WebkitTransform: 'translateY(-50%)'
|
|
192
|
+
}, "aria-label": is_document_viewer_expanded ? 'Collapse document viewer' : 'Expand document viewer', children: is_document_viewer_expanded ? (_jsx(IoChevronBack, { className: "h-4 w-4" })) : (_jsx(IoChevronForward, { className: "h-4 w-4" })) }), _jsx("div", { className: "cls_chat_column flex flex-col flex-1 min-w-0", children: _jsx(HazoChatMessages, { messages: messages, current_user_id: current_user?.id || '', timezone: timezone, is_loading: is_loading_messages, has_more: has_more, on_load_more: load_more, on_delete_message: delete_message, highlighted_message_id: highlighted_message_id || undefined, show_delete_button: show_delete_button, bubble_radius: bubble_radius }) })] }), _jsx("div", { className: "cls_input_row border-t bg-background", children: _jsx(HazoChatInput, { on_send: handle_send, pending_attachments: pending_attachments, on_add_attachment: handle_add_attachment, on_remove_attachment: handle_remove_attachment, is_disabled: !current_user || is_uploading }) }), polling_status !== 'connected' && (_jsx("div", { className: cn('cls_connection_status', 'absolute bottom-20 left-1/2 -translate-x-1/2', 'px-3 py-1.5 rounded-full text-xs font-medium z-10', polling_status === 'reconnecting'
|
|
193
|
+
? 'bg-yellow-100 text-yellow-800'
|
|
194
|
+
: 'bg-red-100 text-red-800'), children: polling_status === 'reconnecting' ? 'Reconnecting...' : 'Connection error' }))] }));
|
|
195
|
+
}
|
|
196
|
+
// ============================================================================
|
|
197
|
+
// Main Component (with Provider)
|
|
198
|
+
// ============================================================================
|
|
199
|
+
/**
|
|
200
|
+
* HazoChat - Main chat component
|
|
201
|
+
*
|
|
202
|
+
* Uses API calls internally for all data operations.
|
|
203
|
+
* Requires the following API routes to be set up:
|
|
204
|
+
* - GET/POST /api/hazo_chat/messages
|
|
205
|
+
* - GET /api/hazo_auth/me
|
|
206
|
+
* - POST /api/hazo_auth/profiles
|
|
207
|
+
*
|
|
208
|
+
* See SETUP_CHECKLIST.md for detailed setup instructions.
|
|
209
|
+
*/
|
|
210
|
+
export function HazoChat(props) {
|
|
211
|
+
const { receiver_user_id, reference_id, reference_type = 'chat', api_base_url = '/api/hazo_chat', additional_references = [], timezone = DEFAULT_TIMEZONE, title, subtitle, on_close, realtime_mode, polling_interval, messages_per_page, show_sidebar_toggle, show_delete_button, bubble_radius, className } = props;
|
|
212
|
+
// Convert ReferenceItem[] to ChatReferenceItem[]
|
|
213
|
+
const initial_refs = useMemo(() => additional_references.map((ref) => ({
|
|
214
|
+
...ref,
|
|
215
|
+
scope: ref.scope || 'field'
|
|
216
|
+
})), [additional_references]);
|
|
217
|
+
return (_jsx(TooltipProvider, { children: _jsx(HazoChatProvider, { api_base_url: api_base_url, initial_references: initial_refs, children: _jsx(HazoChatInner, { receiver_user_id: receiver_user_id, reference_id: reference_id, reference_type: reference_type, api_base_url: api_base_url, additional_references: initial_refs, timezone: timezone, title: title, subtitle: subtitle, on_close: on_close, realtime_mode: realtime_mode, polling_interval: polling_interval, messages_per_page: messages_per_page, show_sidebar_toggle: show_sidebar_toggle, show_delete_button: show_delete_button, bubble_radius: bubble_radius, className: className }) }) }));
|
|
218
|
+
}
|
|
219
|
+
HazoChat.displayName = 'HazoChat';
|
|
220
|
+
//# sourceMappingURL=hazo_chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hazo_chat.js","sourceRoot":"","sources":["../../../src/components/hazo_chat/hazo_chat.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HazoChatAttachmentPreview Component
|
|
3
|
+
*
|
|
4
|
+
* Shows thumbnails of pending file attachments before sending with:
|
|
5
|
+
* - Image previews for image files
|
|
6
|
+
* - File icon for non-image files
|
|
7
|
+
* - Upload status indicator
|
|
8
|
+
* - Remove button
|
|
9
|
+
*
|
|
10
|
+
* Uses shadcn/ui Button and Badge components.
|
|
11
|
+
*/
|
|
12
|
+
import type { HazoChatAttachmentPreviewProps } from '../../types/index.js';
|
|
13
|
+
export declare function HazoChatAttachmentPreview({ attachments, on_remove, className }: HazoChatAttachmentPreviewProps): import("react/jsx-runtime").JSX.Element | null;
|
|
14
|
+
export declare namespace HazoChatAttachmentPreview {
|
|
15
|
+
var displayName: string;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=hazo_chat_attachment_preview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hazo_chat_attachment_preview.d.ts","sourceRoot":"","sources":["../../../src/components/hazo_chat/hazo_chat_attachment_preview.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,KAAK,EAAE,8BAA8B,EAAqB,MAAM,sBAAsB,CAAC;AA+H9F,wBAAgB,yBAAyB,CAAC,EACxC,WAAW,EACX,SAAS,EACT,SAAS,EACV,EAAE,8BAA8B,kDA+BhC;yBAnCe,yBAAyB"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HazoChatAttachmentPreview Component
|
|
3
|
+
*
|
|
4
|
+
* Shows thumbnails of pending file attachments before sending with:
|
|
5
|
+
* - Image previews for image files
|
|
6
|
+
* - File icon for non-image files
|
|
7
|
+
* - Upload status indicator
|
|
8
|
+
* - Remove button
|
|
9
|
+
*
|
|
10
|
+
* Uses shadcn/ui Button and Badge components.
|
|
11
|
+
*/
|
|
12
|
+
'use client';
|
|
13
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
14
|
+
import { useCallback } from 'react';
|
|
15
|
+
import { IoClose, IoDocumentOutline, IoAlertCircle } from 'react-icons/io5';
|
|
16
|
+
import { cn } from '../../lib/utils.js';
|
|
17
|
+
import { Button } from '../ui/button.js';
|
|
18
|
+
import { Badge } from '../ui/badge.js';
|
|
19
|
+
import { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip.js';
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// Helper Functions
|
|
22
|
+
// ============================================================================
|
|
23
|
+
/**
|
|
24
|
+
* Get file extension from filename
|
|
25
|
+
*/
|
|
26
|
+
function get_file_extension(filename) {
|
|
27
|
+
const parts = filename.split('.');
|
|
28
|
+
return parts.length > 1 ? parts.pop()?.toUpperCase() || '' : '';
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Format file size
|
|
32
|
+
*/
|
|
33
|
+
function format_file_size(bytes) {
|
|
34
|
+
if (bytes < 1024)
|
|
35
|
+
return `${bytes} B`;
|
|
36
|
+
if (bytes < 1024 * 1024)
|
|
37
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
38
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
39
|
+
}
|
|
40
|
+
function AttachmentItem({ attachment, on_remove }) {
|
|
41
|
+
const extension = get_file_extension(attachment.file.name);
|
|
42
|
+
const is_image = attachment.file.type.startsWith('image/');
|
|
43
|
+
const is_uploading = attachment.upload_status === 'uploading';
|
|
44
|
+
const has_error = attachment.upload_status === 'failed';
|
|
45
|
+
return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: cn('cls_attachment_item', 'relative group', 'w-16 h-16 rounded-lg overflow-hidden', 'bg-muted border', has_error && 'border-destructive'), children: [is_image && attachment.preview_url ? (_jsx("img", { src: attachment.preview_url, alt: attachment.file.name, className: "w-full h-full object-cover" })) : (_jsxs("div", { className: "w-full h-full flex flex-col items-center justify-center", children: [_jsx(IoDocumentOutline, { className: "w-6 h-6 text-muted-foreground" }), _jsx("span", { className: "text-[8px] font-medium text-muted-foreground mt-1", children: extension })] })), is_uploading && (_jsx("div", { className: "absolute inset-0 bg-black/50 flex items-center justify-center", children: _jsx("div", { className: "w-6 h-6 border-2 border-white border-t-transparent rounded-full animate-spin" }) })), has_error && (_jsx("div", { className: "absolute inset-0 bg-destructive/20 flex items-center justify-center", children: _jsx(IoAlertCircle, { className: "w-6 h-6 text-destructive" }) })), _jsx(Button, { variant: "ghost", size: "icon", onClick: on_remove, className: cn('cls_attachment_remove', 'absolute top-0.5 right-0.5', 'w-5 h-5 p-0', 'bg-black/60 text-white hover:bg-black/80', 'opacity-0 group-hover:opacity-100 transition-opacity'), "aria-label": `Remove ${attachment.file.name}`, children: _jsx(IoClose, { className: "w-3 h-3" }) }), _jsx(Badge, { variant: "secondary", className: "absolute bottom-0.5 left-0.5 right-0.5 text-[8px] px-1 py-0 justify-center bg-black/60 text-white border-0", children: format_file_size(attachment.file.size) })] }) }), _jsxs(TooltipContent, { children: [_jsx("p", { className: "font-medium", children: attachment.file.name }), _jsx("p", { className: "text-xs text-muted-foreground", children: format_file_size(attachment.file.size) })] })] }));
|
|
46
|
+
}
|
|
47
|
+
// ============================================================================
|
|
48
|
+
// Main Component
|
|
49
|
+
// ============================================================================
|
|
50
|
+
export function HazoChatAttachmentPreview({ attachments, on_remove, className }) {
|
|
51
|
+
const handle_remove = useCallback((attachment_id) => {
|
|
52
|
+
on_remove(attachment_id);
|
|
53
|
+
}, [on_remove]);
|
|
54
|
+
if (attachments.length === 0) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
return (_jsx("div", { className: cn('cls_hazo_chat_attachment_preview', 'flex flex-wrap gap-2 p-2 border-t bg-muted/30', className), role: "list", "aria-label": "Pending attachments", children: attachments.map((attachment) => (_jsx(AttachmentItem, { attachment: attachment, on_remove: () => handle_remove(attachment.id) }, attachment.id))) }));
|
|
58
|
+
}
|
|
59
|
+
HazoChatAttachmentPreview.displayName = 'HazoChatAttachmentPreview';
|
|
60
|
+
//# sourceMappingURL=hazo_chat_attachment_preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hazo_chat_attachment_preview.js","sourceRoot":"","sources":["../../../src/components/hazo_chat/hazo_chat_attachment_preview.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,YAAY,CAAC;;AAEb,OAAc,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAExC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EACL,OAAO,EACP,cAAc,EACd,cAAc,EACf,MAAM,kBAAkB,CAAC;AAE1B,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;GAEG;AACH,SAAS,kBAAkB,CAAC,QAAgB;IAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,KAAa;IACrC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,IAAI,CAAC;IACtC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAClE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACpD,CAAC;AAWD,SAAS,cAAc,CAAC,EAAE,UAAU,EAAE,SAAS,EAAuB;IACpE,MAAM,SAAS,GAAG,kBAAkB,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,UAAU,CAAC,aAAa,KAAK,WAAW,CAAC;IAC9D,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,KAAK,QAAQ,CAAC;IAExD,OAAO,CACL,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,eACE,SAAS,EAAE,EAAE,CACX,qBAAqB,EACrB,gBAAgB,EAChB,sCAAsC,EACtC,iBAAiB,EACjB,SAAS,IAAI,oBAAoB,CAClC,aAGA,QAAQ,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CACpC,cACE,GAAG,EAAE,UAAU,CAAC,WAAW,EAC3B,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,EACzB,SAAS,EAAC,4BAA4B,GACtC,CACH,CAAC,CAAC,CAAC,CACF,eAAK,SAAS,EAAC,yDAAyD,aACtE,KAAC,iBAAiB,IAAC,SAAS,EAAC,+BAA+B,GAAG,EAC/D,eAAM,SAAS,EAAC,mDAAmD,YAChE,SAAS,GACL,IACH,CACP,EAGA,YAAY,IAAI,CACf,cAAK,SAAS,EAAC,+DAA+D,YAC5E,cAAK,SAAS,EAAC,8EAA8E,GAAG,GAC5F,CACP,EAGA,SAAS,IAAI,CACZ,cAAK,SAAS,EAAC,qEAAqE,YAClF,KAAC,aAAa,IAAC,SAAS,EAAC,0BAA0B,GAAG,GAClD,CACP,EAGD,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,EACX,OAAO,EAAE,SAAS,EAClB,SAAS,EAAE,EAAE,CACX,uBAAuB,EACvB,4BAA4B,EAC5B,aAAa,EACb,0CAA0C,EAC1C,sDAAsD,CACvD,gBACW,UAAU,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,YAE5C,KAAC,OAAO,IAAC,SAAS,EAAC,SAAS,GAAG,GACxB,EAGT,KAAC,KAAK,IACJ,OAAO,EAAC,WAAW,EACnB,SAAS,EAAC,4GAA4G,YAErH,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GACjC,IACJ,GACS,EACjB,MAAC,cAAc,eACb,YAAG,SAAS,EAAC,aAAa,YAAE,UAAU,CAAC,IAAI,CAAC,IAAI,GAAK,EACrD,YAAG,SAAS,EAAC,+BAA+B,YACzC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GACrC,IACW,IACT,CACX,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,MAAM,UAAU,yBAAyB,CAAC,EACxC,WAAW,EACX,SAAS,EACT,SAAS,EACsB;IAC/B,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,aAAqB,EAAE,EAAE;QACxB,SAAS,CAAC,aAAa,CAAC,CAAC;IAC3B,CAAC,EACD,CAAC,SAAS,CAAC,CACZ,CAAC;IAEF,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,cACE,SAAS,EAAE,EAAE,CACX,kCAAkC,EAClC,+CAA+C,EAC/C,SAAS,CACV,EACD,IAAI,EAAC,MAAM,gBACA,qBAAqB,YAE/B,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAC/B,KAAC,cAAc,IAEb,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC,IAFxC,UAAU,CAAC,EAAE,CAGlB,CACH,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAED,yBAAyB,CAAC,WAAW,GAAG,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HazoChatContext - React context for shared state management
|
|
3
|
+
*
|
|
4
|
+
* Provides centralized state management for:
|
|
5
|
+
* - Selected reference/document
|
|
6
|
+
* - Current user profile (fetched via API)
|
|
7
|
+
* - Pending file attachments
|
|
8
|
+
* - Sidebar collapsed state (mobile)
|
|
9
|
+
* - Polling connection status
|
|
10
|
+
* - Error handling
|
|
11
|
+
*
|
|
12
|
+
* Uses API calls to fetch user data - no server-side dependencies.
|
|
13
|
+
*/
|
|
14
|
+
import React, { type ReactNode } from 'react';
|
|
15
|
+
import type { HazoChatContextValue, ChatReferenceItem } from '../../types/index.js';
|
|
16
|
+
declare const HazoChatContext: React.Context<HazoChatContextValue | null>;
|
|
17
|
+
interface HazoChatProviderProps {
|
|
18
|
+
children: ReactNode;
|
|
19
|
+
/** Base URL for API endpoints (default: '/api/hazo_chat') */
|
|
20
|
+
api_base_url?: string;
|
|
21
|
+
/** Initial references from props */
|
|
22
|
+
initial_references?: ChatReferenceItem[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* HazoChatProvider - Context provider for HazoChat component tree
|
|
26
|
+
*
|
|
27
|
+
* Fetches current user via API on mount.
|
|
28
|
+
*
|
|
29
|
+
* @param children - Child components
|
|
30
|
+
* @param api_base_url - Base URL for API endpoints
|
|
31
|
+
* @param initial_references - Initial references from props
|
|
32
|
+
*/
|
|
33
|
+
export declare function HazoChatProvider({ children, api_base_url, initial_references }: HazoChatProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
34
|
+
/**
|
|
35
|
+
* useHazoChatContext - Hook to access HazoChat context
|
|
36
|
+
*
|
|
37
|
+
* @throws Error if used outside of HazoChatProvider
|
|
38
|
+
* @returns HazoChatContextValue
|
|
39
|
+
*/
|
|
40
|
+
export declare function useHazoChatContext(): HazoChatContextValue;
|
|
41
|
+
export { HazoChatContext };
|
|
42
|
+
//# sourceMappingURL=hazo_chat_context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hazo_chat_context.d.ts","sourceRoot":"","sources":["../../../src/components/hazo_chat/hazo_chat_context.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,EAOZ,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EACV,oBAAoB,EAEpB,iBAAiB,EAIlB,MAAM,sBAAsB,CAAC;AAyH9B,QAAA,MAAM,eAAe,4CAAmD,CAAC;AAMzE,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,SAAS,CAAC;IACpB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC1C;AAMD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,YAA+B,EAC/B,kBAAuB,EACxB,EAAE,qBAAqB,2CAwLvB;AAMD;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,oBAAoB,CAUzD;AAMD,OAAO,EAAE,eAAe,EAAE,CAAC"}
|