hazo_chat 2.0.13 → 2.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/README.md +104 -7
  2. package/SETUP_CHECKLIST.md +73 -0
  3. package/package.json +1 -1
  4. package/dist/api/index.d.ts +0 -26
  5. package/dist/api/index.d.ts.map +0 -1
  6. package/dist/api/index.js +0 -25
  7. package/dist/api/index.js.map +0 -1
  8. package/dist/api/messages.d.ts +0 -34
  9. package/dist/api/messages.d.ts.map +0 -1
  10. package/dist/api/messages.js +0 -214
  11. package/dist/api/messages.js.map +0 -1
  12. package/dist/api/types.d.ts +0 -69
  13. package/dist/api/types.d.ts.map +0 -1
  14. package/dist/api/types.js +0 -8
  15. package/dist/api/types.js.map +0 -1
  16. package/dist/api/unread_count.d.ts +0 -57
  17. package/dist/api/unread_count.d.ts.map +0 -1
  18. package/dist/api/unread_count.js +0 -86
  19. package/dist/api/unread_count.js.map +0 -1
  20. package/dist/components/hazo_chat/hazo_chat.d.ts +0 -28
  21. package/dist/components/hazo_chat/hazo_chat.d.ts.map +0 -1
  22. package/dist/components/hazo_chat/hazo_chat.js +0 -201
  23. package/dist/components/hazo_chat/hazo_chat.js.map +0 -1
  24. package/dist/components/hazo_chat/hazo_chat_attachment_preview.d.ts +0 -17
  25. package/dist/components/hazo_chat/hazo_chat_attachment_preview.d.ts.map +0 -1
  26. package/dist/components/hazo_chat/hazo_chat_attachment_preview.js +0 -60
  27. package/dist/components/hazo_chat/hazo_chat_attachment_preview.js.map +0 -1
  28. package/dist/components/hazo_chat/hazo_chat_context.d.ts +0 -42
  29. package/dist/components/hazo_chat/hazo_chat_context.d.ts.map +0 -1
  30. package/dist/components/hazo_chat/hazo_chat_context.js +0 -273
  31. package/dist/components/hazo_chat/hazo_chat_context.js.map +0 -1
  32. package/dist/components/hazo_chat/hazo_chat_document_viewer.d.ts +0 -15
  33. package/dist/components/hazo_chat/hazo_chat_document_viewer.d.ts.map +0 -1
  34. package/dist/components/hazo_chat/hazo_chat_document_viewer.js +0 -111
  35. package/dist/components/hazo_chat/hazo_chat_document_viewer.js.map +0 -1
  36. package/dist/components/hazo_chat/hazo_chat_header.d.ts +0 -16
  37. package/dist/components/hazo_chat/hazo_chat_header.d.ts.map +0 -1
  38. package/dist/components/hazo_chat/hazo_chat_header.js +0 -24
  39. package/dist/components/hazo_chat/hazo_chat_header.js.map +0 -1
  40. package/dist/components/hazo_chat/hazo_chat_input.d.ts +0 -16
  41. package/dist/components/hazo_chat/hazo_chat_input.d.ts.map +0 -1
  42. package/dist/components/hazo_chat/hazo_chat_input.js +0 -75
  43. package/dist/components/hazo_chat/hazo_chat_input.js.map +0 -1
  44. package/dist/components/hazo_chat/hazo_chat_messages.d.ts +0 -17
  45. package/dist/components/hazo_chat/hazo_chat_messages.d.ts.map +0 -1
  46. package/dist/components/hazo_chat/hazo_chat_messages.js +0 -109
  47. package/dist/components/hazo_chat/hazo_chat_messages.js.map +0 -1
  48. package/dist/components/hazo_chat/hazo_chat_reference_list.d.ts +0 -16
  49. package/dist/components/hazo_chat/hazo_chat_reference_list.d.ts.map +0 -1
  50. package/dist/components/hazo_chat/hazo_chat_reference_list.js +0 -59
  51. package/dist/components/hazo_chat/hazo_chat_reference_list.js.map +0 -1
  52. package/dist/components/hazo_chat/hazo_chat_sidebar.d.ts +0 -18
  53. package/dist/components/hazo_chat/hazo_chat_sidebar.d.ts.map +0 -1
  54. package/dist/components/hazo_chat/hazo_chat_sidebar.js +0 -72
  55. package/dist/components/hazo_chat/hazo_chat_sidebar.js.map +0 -1
  56. package/dist/components/hazo_chat/index.d.ts +0 -16
  57. package/dist/components/hazo_chat/index.d.ts.map +0 -1
  58. package/dist/components/hazo_chat/index.js +0 -19
  59. package/dist/components/hazo_chat/index.js.map +0 -1
  60. package/dist/components/index.d.ts +0 -9
  61. package/dist/components/index.d.ts.map +0 -1
  62. package/dist/components/index.js +0 -11
  63. package/dist/components/index.js.map +0 -1
  64. package/dist/components/ui/avatar.d.ts +0 -13
  65. package/dist/components/ui/avatar.d.ts.map +0 -1
  66. package/dist/components/ui/avatar.js +0 -28
  67. package/dist/components/ui/avatar.js.map +0 -1
  68. package/dist/components/ui/badge.d.ts +0 -16
  69. package/dist/components/ui/badge.d.ts.map +0 -1
  70. package/dist/components/ui/badge.js +0 -36
  71. package/dist/components/ui/badge.js.map +0 -1
  72. package/dist/components/ui/button.d.ts +0 -18
  73. package/dist/components/ui/button.d.ts.map +0 -1
  74. package/dist/components/ui/button.js +0 -47
  75. package/dist/components/ui/button.js.map +0 -1
  76. package/dist/components/ui/chat_bubble.d.ts +0 -18
  77. package/dist/components/ui/chat_bubble.d.ts.map +0 -1
  78. package/dist/components/ui/chat_bubble.js +0 -107
  79. package/dist/components/ui/chat_bubble.js.map +0 -1
  80. package/dist/components/ui/hover-card.d.ts +0 -13
  81. package/dist/components/ui/hover-card.d.ts.map +0 -1
  82. package/dist/components/ui/hover-card.js +0 -17
  83. package/dist/components/ui/hover-card.js.map +0 -1
  84. package/dist/components/ui/index.d.ts +0 -19
  85. package/dist/components/ui/index.d.ts.map +0 -1
  86. package/dist/components/ui/index.js +0 -21
  87. package/dist/components/ui/index.js.map +0 -1
  88. package/dist/components/ui/input.d.ts +0 -11
  89. package/dist/components/ui/input.d.ts.map +0 -1
  90. package/dist/components/ui/input.js +0 -18
  91. package/dist/components/ui/input.js.map +0 -1
  92. package/dist/components/ui/loading_skeleton.d.ts +0 -19
  93. package/dist/components/ui/loading_skeleton.d.ts.map +0 -1
  94. package/dist/components/ui/loading_skeleton.js +0 -30
  95. package/dist/components/ui/loading_skeleton.js.map +0 -1
  96. package/dist/components/ui/scroll-area.d.ts +0 -12
  97. package/dist/components/ui/scroll-area.d.ts.map +0 -1
  98. package/dist/components/ui/scroll-area.js +0 -25
  99. package/dist/components/ui/scroll-area.js.map +0 -1
  100. package/dist/components/ui/separator.d.ts +0 -11
  101. package/dist/components/ui/separator.d.ts.map +0 -1
  102. package/dist/components/ui/separator.js +0 -18
  103. package/dist/components/ui/separator.js.map +0 -1
  104. package/dist/components/ui/skeleton.d.ts +0 -9
  105. package/dist/components/ui/skeleton.d.ts.map +0 -1
  106. package/dist/components/ui/skeleton.js +0 -16
  107. package/dist/components/ui/skeleton.js.map +0 -1
  108. package/dist/components/ui/textarea.d.ts +0 -11
  109. package/dist/components/ui/textarea.d.ts.map +0 -1
  110. package/dist/components/ui/textarea.js +0 -18
  111. package/dist/components/ui/textarea.js.map +0 -1
  112. package/dist/components/ui/tooltip.d.ts +0 -14
  113. package/dist/components/ui/tooltip.d.ts.map +0 -1
  114. package/dist/components/ui/tooltip.js +0 -30
  115. package/dist/components/ui/tooltip.js.map +0 -1
  116. package/dist/hooks/index.d.ts +0 -10
  117. package/dist/hooks/index.d.ts.map +0 -1
  118. package/dist/hooks/index.js +0 -10
  119. package/dist/hooks/index.js.map +0 -1
  120. package/dist/hooks/use_chat_messages.d.ts +0 -33
  121. package/dist/hooks/use_chat_messages.d.ts.map +0 -1
  122. package/dist/hooks/use_chat_messages.js +0 -466
  123. package/dist/hooks/use_chat_messages.js.map +0 -1
  124. package/dist/hooks/use_chat_references.d.ts +0 -17
  125. package/dist/hooks/use_chat_references.d.ts.map +0 -1
  126. package/dist/hooks/use_chat_references.js +0 -133
  127. package/dist/hooks/use_chat_references.js.map +0 -1
  128. package/dist/hooks/use_file_upload.d.ts +0 -23
  129. package/dist/hooks/use_file_upload.d.ts.map +0 -1
  130. package/dist/hooks/use_file_upload.js +0 -212
  131. package/dist/hooks/use_file_upload.js.map +0 -1
  132. package/dist/index.d.ts +0 -13
  133. package/dist/index.d.ts.map +0 -1
  134. package/dist/index.js +0 -17
  135. package/dist/index.js.map +0 -1
  136. package/dist/lib/config.d.ts +0 -41
  137. package/dist/lib/config.d.ts.map +0 -1
  138. package/dist/lib/config.js +0 -93
  139. package/dist/lib/config.js.map +0 -1
  140. package/dist/lib/constants.d.ts +0 -41
  141. package/dist/lib/constants.d.ts.map +0 -1
  142. package/dist/lib/constants.js +0 -72
  143. package/dist/lib/constants.js.map +0 -1
  144. package/dist/lib/index.d.ts +0 -9
  145. package/dist/lib/index.d.ts.map +0 -1
  146. package/dist/lib/index.js +0 -9
  147. package/dist/lib/index.js.map +0 -1
  148. package/dist/lib/utils.d.ts +0 -17
  149. package/dist/lib/utils.d.ts.map +0 -1
  150. package/dist/lib/utils.js +0 -20
  151. package/dist/lib/utils.js.map +0 -1
  152. package/dist/types/index.d.ts +0 -404
  153. package/dist/types/index.d.ts.map +0 -1
  154. package/dist/types/index.js +0 -11
  155. package/dist/types/index.js.map +0 -1
@@ -1,57 +0,0 @@
1
- /**
2
- * Unread Count Library Function Factory
3
- *
4
- * Creates a function to get unread message counts grouped by reference_id
5
- * for a given receiver user ID.
6
- *
7
- * @example
8
- * ```typescript
9
- * // In your server-side code
10
- * import { createUnreadCountFunction } from 'hazo_chat/api';
11
- * import { getHazoConnectSingleton } from 'hazo_connect/nextjs/setup';
12
- *
13
- * const getUnreadCount = createUnreadCountFunction({
14
- * getHazoConnect: () => getHazoConnectSingleton()
15
- * });
16
- *
17
- * // Use the function
18
- * const unreadCounts = await getUnreadCount('receiver-user-id-123');
19
- * // Returns: [{ reference_id: 'ref-1', count: 5 }, { reference_id: 'ref-2', count: 3 }]
20
- * ```
21
- */
22
- /**
23
- * Options for creating the unread count function
24
- */
25
- export interface UnreadCountFunctionOptions {
26
- /**
27
- * Function to get the hazo_connect adapter instance.
28
- * Called each time the function is invoked to get a fresh connection.
29
- *
30
- * @example
31
- * ```typescript
32
- * import { getHazoConnectSingleton } from 'hazo_connect/nextjs/setup';
33
- *
34
- * const options = {
35
- * getHazoConnect: () => getHazoConnectSingleton()
36
- * };
37
- * ```
38
- */
39
- getHazoConnect: () => unknown;
40
- }
41
- /**
42
- * Result type for unread count function
43
- */
44
- export interface UnreadCountResult {
45
- /** The reference ID */
46
- reference_id: string;
47
- /** Number of unread messages for this reference */
48
- count: number;
49
- }
50
- /**
51
- * Creates a function to get unread message counts by reference_id
52
- *
53
- * @param options - Configuration options
54
- * @returns Function that takes receiver_user_id and returns unread counts
55
- */
56
- export declare function createUnreadCountFunction(options: UnreadCountFunctionOptions): (receiver_user_id: string) => Promise<UnreadCountResult[]>;
57
- //# sourceMappingURL=unread_count.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"unread_count.d.ts","sourceRoot":"","sources":["../../src/api/unread_count.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAMH;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC;;;;;;;;;;;;OAYG;IACH,cAAc,EAAE,MAAM,OAAO,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,uBAAuB;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,0BAA0B,IAUzE,kBAAkB,MAAM,KACvB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA2DhC"}
@@ -1,86 +0,0 @@
1
- /**
2
- * Unread Count Library Function Factory
3
- *
4
- * Creates a function to get unread message counts grouped by reference_id
5
- * for a given receiver user ID.
6
- *
7
- * @example
8
- * ```typescript
9
- * // In your server-side code
10
- * import { createUnreadCountFunction } from 'hazo_chat/api';
11
- * import { getHazoConnectSingleton } from 'hazo_connect/nextjs/setup';
12
- *
13
- * const getUnreadCount = createUnreadCountFunction({
14
- * getHazoConnect: () => getHazoConnectSingleton()
15
- * });
16
- *
17
- * // Use the function
18
- * const unreadCounts = await getUnreadCount('receiver-user-id-123');
19
- * // Returns: [{ reference_id: 'ref-1', count: 5 }, { reference_id: 'ref-2', count: 3 }]
20
- * ```
21
- */
22
- import { createCrudService } from 'hazo_connect/server';
23
- /**
24
- * Creates a function to get unread message counts by reference_id
25
- *
26
- * @param options - Configuration options
27
- * @returns Function that takes receiver_user_id and returns unread counts
28
- */
29
- export function createUnreadCountFunction(options) {
30
- const { getHazoConnect } = options;
31
- /**
32
- * Get unread message counts grouped by reference_id for a receiver user
33
- *
34
- * @param receiver_user_id - The user ID to get unread counts for
35
- * @returns Array of objects with reference_id and count of unread messages
36
- */
37
- return async function hazo_chat_get_unread_count(receiver_user_id) {
38
- try {
39
- if (!receiver_user_id || receiver_user_id.trim() === '') {
40
- console.error('[hazo_chat_get_unread_count] Missing receiver_user_id');
41
- return [];
42
- }
43
- console.log('[hazo_chat_get_unread_count] Fetching unread counts for:', {
44
- receiver_user_id,
45
- });
46
- // Get hazo_connect instance and create CRUD service
47
- const hazoConnect = getHazoConnect();
48
- const chatService = createCrudService(hazoConnect, 'hazo_chat');
49
- // Fetch all unread messages for this receiver
50
- const unread_messages = await chatService.list((qb) => {
51
- return qb
52
- .select('*')
53
- .where('receiver_user_id', 'eq', receiver_user_id)
54
- .where('read_at', 'is', null)
55
- .where('deleted_at', 'is', null);
56
- });
57
- // Group by reference_id and count
58
- const count_map = new Map();
59
- for (const message of unread_messages) {
60
- const ref_id = message.reference_id || '';
61
- const current_count = count_map.get(ref_id) || 0;
62
- count_map.set(ref_id, current_count + 1);
63
- }
64
- // Convert map to array of results
65
- const results = Array.from(count_map.entries()).map(([reference_id, count]) => ({
66
- reference_id,
67
- count,
68
- }));
69
- // Sort by count descending (most unread first)
70
- results.sort((a, b) => b.count - a.count);
71
- console.log('[hazo_chat_get_unread_count] Found unread counts:', {
72
- receiver_user_id,
73
- total_references: results.length,
74
- total_unread: unread_messages.length,
75
- });
76
- return results;
77
- }
78
- catch (error) {
79
- const error_message = error instanceof Error ? error.message : 'Unknown error';
80
- console.error('[hazo_chat_get_unread_count] Error:', error_message, error);
81
- // Return empty array on error rather than throwing
82
- return [];
83
- }
84
- };
85
- }
86
- //# sourceMappingURL=unread_count.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"unread_count.js","sourceRoot":"","sources":["../../src/api/unread_count.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAkCxD;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAmC;IAC3E,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;IAEnC;;;;;OAKG;IACH,OAAO,KAAK,UAAU,0BAA0B,CAC9C,gBAAwB;QAExB,IAAI,CAAC;YACH,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBACxD,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;gBACvE,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,0DAA0D,EAAE;gBACtE,gBAAgB;aACjB,CAAC,CAAC;YAEH,oDAAoD;YACpD,MAAM,WAAW,GAAG,cAAc,EAAwB,CAAC;YAC3D,MAAM,WAAW,GAAG,iBAAiB,CAAoB,WAAW,EAAE,WAAW,CAAC,CAAC;YAEnF,8CAA8C;YAC9C,MAAM,eAAe,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;gBACpD,OAAO,EAAE;qBACN,MAAM,CAAC,GAAG,CAAC;qBACX,KAAK,CAAC,kBAAkB,EAAE,IAAI,EAAE,gBAAgB,CAAC;qBACjD,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC;qBAC5B,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;YAEH,kCAAkC;YAClC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;YAE5C,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;gBACtC,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;gBAC1C,MAAM,aAAa,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACjD,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC;YAC3C,CAAC;YAED,kCAAkC;YAClC,MAAM,OAAO,GAAwB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CACtE,CAAC,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1B,YAAY;gBACZ,KAAK;aACN,CAAC,CACH,CAAC;YAEF,+CAA+C;YAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YAE1C,OAAO,CAAC,GAAG,CAAC,mDAAmD,EAAE;gBAC/D,gBAAgB;gBAChB,gBAAgB,EAAE,OAAO,CAAC,MAAM;gBAChC,YAAY,EAAE,eAAe,CAAC,MAAM;aACrC,CAAC,CAAC;YAEH,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,aAAa,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAC/E,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;YAE3E,mDAAmD;YACnD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -1,28 +0,0 @@
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
- import type { HazoChatProps } from '../../types/index.js';
13
- /**
14
- * HazoChat - Main chat component
15
- *
16
- * Uses API calls internally for all data operations.
17
- * Requires the following API routes to be set up:
18
- * - GET/POST /api/hazo_chat/messages
19
- * - GET /api/hazo_auth/me
20
- * - POST /api/hazo_auth/profiles
21
- *
22
- * See SETUP_CHECKLIST.md for detailed setup instructions.
23
- */
24
- export declare function HazoChat(props: HazoChatProps): import("react/jsx-runtime").JSX.Element;
25
- export declare namespace HazoChat {
26
- var displayName: string;
27
- }
28
- //# sourceMappingURL=hazo_chat.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hazo_chat.d.ts","sourceRoot":"","sources":["../../../src/components/hazo_chat/hazo_chat.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,KAAK,EACV,aAAa,EAId,MAAM,sBAAsB,CAAC;AAyZ9B;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,2CAyD5C;yBAzDe,QAAQ"}
@@ -1,201 +0,0 @@
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 } 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(true);
82
- // -------------------------------------------------------------------------
83
- // File upload hook
84
- // -------------------------------------------------------------------------
85
- const { add_files, remove_file, upload_all, is_uploading } = useFileUpload({
86
- upload_location: `${api_base_url}/uploads`
87
- });
88
- // -------------------------------------------------------------------------
89
- // Handle send message
90
- // -------------------------------------------------------------------------
91
- const handle_send = useCallback(async (text, attachments) => {
92
- if (!current_user)
93
- return;
94
- // Upload pending files first
95
- const uploaded = await upload_all();
96
- // Build reference list from attachments
97
- const attachment_refs = [
98
- ...attachments,
99
- ...uploaded
100
- ].map((file) => ({
101
- id: file.id,
102
- type: 'document',
103
- scope: 'chat',
104
- name: file.name,
105
- url: file.url,
106
- mime_type: file.mime_type,
107
- file_size: file.file_size
108
- }));
109
- const payload = {
110
- reference_id: reference_id || '',
111
- reference_type,
112
- receiver_user_id,
113
- message_text: text,
114
- reference_list: attachment_refs.length > 0 ? attachment_refs : undefined
115
- };
116
- const success = await send_message(payload);
117
- if (success) {
118
- clear_pending_attachments();
119
- // Add new references to the list
120
- attachment_refs.forEach((ref) => add_reference(ref));
121
- }
122
- }, [
123
- current_user,
124
- reference_id,
125
- reference_type,
126
- receiver_user_id,
127
- upload_all,
128
- send_message,
129
- clear_pending_attachments,
130
- add_reference
131
- ]);
132
- // -------------------------------------------------------------------------
133
- // Handle add attachment
134
- // -------------------------------------------------------------------------
135
- const handle_add_attachment = useCallback((files) => {
136
- files.forEach((file) => {
137
- add_pending_attachment(file);
138
- });
139
- add_files(files);
140
- }, [add_pending_attachment, add_files]);
141
- // -------------------------------------------------------------------------
142
- // Handle remove attachment
143
- // -------------------------------------------------------------------------
144
- const handle_remove_attachment = useCallback((attachment_id) => {
145
- remove_pending_attachment(attachment_id);
146
- remove_file(attachment_id);
147
- }, [remove_pending_attachment, remove_file]);
148
- // -------------------------------------------------------------------------
149
- // Handle reference selection
150
- // -------------------------------------------------------------------------
151
- const handle_reference_select = useCallback((reference) => {
152
- select_reference(reference);
153
- }, [select_reference]);
154
- // -------------------------------------------------------------------------
155
- // Render
156
- // -------------------------------------------------------------------------
157
- 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-[7px] 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", { 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',
158
- // Mobile: hidden by default, shown when sidebar is open
159
- is_sidebar_open ? 'flex' : 'hidden md:flex',
160
- // Collapse/expand based on state
161
- is_document_viewer_expanded
162
- ? 'w-[280px] md:w-[320px] lg:w-[380px]'
163
- : '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',
164
- // Center vertically - use top 50% and transform to center
165
- 'top-1/2 -translate-y-1/2',
166
- // Hide on mobile when sidebar is closed
167
- (!is_sidebar_open ? 'hidden md:flex' : 'flex'), is_document_viewer_expanded
168
- ? 'left-[280px] md:left-[320px] lg:left-[380px]'
169
- : 'left-0'), style: {
170
- top: '50%',
171
- transform: 'translateY(-50%)',
172
- WebkitTransform: 'translateY(-50%)'
173
- }, "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'
174
- ? 'bg-yellow-100 text-yellow-800'
175
- : 'bg-red-100 text-red-800'), children: polling_status === 'reconnecting' ? 'Reconnecting...' : 'Connection error' }))] }));
176
- }
177
- // ============================================================================
178
- // Main Component (with Provider)
179
- // ============================================================================
180
- /**
181
- * HazoChat - Main chat component
182
- *
183
- * Uses API calls internally for all data operations.
184
- * Requires the following API routes to be set up:
185
- * - GET/POST /api/hazo_chat/messages
186
- * - GET /api/hazo_auth/me
187
- * - POST /api/hazo_auth/profiles
188
- *
189
- * See SETUP_CHECKLIST.md for detailed setup instructions.
190
- */
191
- export function HazoChat(props) {
192
- 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;
193
- // Convert ReferenceItem[] to ChatReferenceItem[]
194
- const initial_refs = useMemo(() => additional_references.map((ref) => ({
195
- ...ref,
196
- scope: ref.scope || 'field'
197
- })), [additional_references]);
198
- 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 }) }) }));
199
- }
200
- HazoChat.displayName = 'HazoChat';
201
- //# sourceMappingURL=hazo_chat.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hazo_chat.js","sourceRoot":"","sources":["../../../src/components/hazo_chat/hazo_chat.tsx"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,60 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"hazo_chat_attachment_preview.js","sourceRoot":"","sources":["../../../src/components/hazo_chat/hazo_chat_attachment_preview.tsx"],"names":[],"mappings":"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"}
@@ -1,42 +0,0 @@
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
@@ -1 +0,0 @@
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"}