hazo_chat 2.0.2 → 2.0.3

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 (145) hide show
  1. package/dist/api/index.d.ts +24 -0
  2. package/dist/api/index.d.ts.map +1 -0
  3. package/dist/api/index.js +24 -0
  4. package/dist/api/index.js.map +1 -0
  5. package/dist/api/messages.d.ts +34 -0
  6. package/dist/api/messages.d.ts.map +1 -0
  7. package/dist/api/messages.js +210 -0
  8. package/dist/api/messages.js.map +1 -0
  9. package/dist/api/types.d.ts +69 -0
  10. package/dist/api/types.d.ts.map +1 -0
  11. package/dist/api/types.js +8 -0
  12. package/dist/api/types.js.map +1 -0
  13. package/dist/components/hazo_chat/hazo_chat.d.ts +28 -0
  14. package/dist/components/hazo_chat/hazo_chat.d.ts.map +1 -0
  15. package/dist/components/hazo_chat/hazo_chat.js +167 -0
  16. package/dist/components/hazo_chat/hazo_chat.js.map +1 -0
  17. package/dist/components/hazo_chat/hazo_chat_attachment_preview.d.ts +17 -0
  18. package/dist/components/hazo_chat/hazo_chat_attachment_preview.d.ts.map +1 -0
  19. package/dist/components/hazo_chat/hazo_chat_attachment_preview.js +60 -0
  20. package/dist/components/hazo_chat/hazo_chat_attachment_preview.js.map +1 -0
  21. package/dist/components/hazo_chat/hazo_chat_context.d.ts +42 -0
  22. package/dist/components/hazo_chat/hazo_chat_context.d.ts.map +1 -0
  23. package/dist/components/hazo_chat/hazo_chat_context.js +261 -0
  24. package/dist/components/hazo_chat/hazo_chat_context.js.map +1 -0
  25. package/dist/components/hazo_chat/hazo_chat_document_viewer.d.ts +15 -0
  26. package/dist/components/hazo_chat/hazo_chat_document_viewer.d.ts.map +1 -0
  27. package/dist/components/hazo_chat/hazo_chat_document_viewer.js +111 -0
  28. package/dist/components/hazo_chat/hazo_chat_document_viewer.js.map +1 -0
  29. package/dist/components/hazo_chat/hazo_chat_header.d.ts +16 -0
  30. package/dist/components/hazo_chat/hazo_chat_header.d.ts.map +1 -0
  31. package/dist/components/hazo_chat/hazo_chat_header.js +24 -0
  32. package/dist/components/hazo_chat/hazo_chat_header.js.map +1 -0
  33. package/dist/components/hazo_chat/hazo_chat_input.d.ts +18 -0
  34. package/dist/components/hazo_chat/hazo_chat_input.d.ts.map +1 -0
  35. package/dist/components/hazo_chat/hazo_chat_input.js +134 -0
  36. package/dist/components/hazo_chat/hazo_chat_input.js.map +1 -0
  37. package/dist/components/hazo_chat/hazo_chat_messages.d.ts +17 -0
  38. package/dist/components/hazo_chat/hazo_chat_messages.d.ts.map +1 -0
  39. package/dist/components/hazo_chat/hazo_chat_messages.js +109 -0
  40. package/dist/components/hazo_chat/hazo_chat_messages.js.map +1 -0
  41. package/dist/components/hazo_chat/hazo_chat_reference_list.d.ts +16 -0
  42. package/dist/components/hazo_chat/hazo_chat_reference_list.d.ts.map +1 -0
  43. package/dist/components/hazo_chat/hazo_chat_reference_list.js +59 -0
  44. package/dist/components/hazo_chat/hazo_chat_reference_list.js.map +1 -0
  45. package/dist/components/hazo_chat/hazo_chat_sidebar.d.ts +18 -0
  46. package/dist/components/hazo_chat/hazo_chat_sidebar.d.ts.map +1 -0
  47. package/dist/components/hazo_chat/hazo_chat_sidebar.js +72 -0
  48. package/dist/components/hazo_chat/hazo_chat_sidebar.js.map +1 -0
  49. package/dist/components/hazo_chat/index.d.ts +16 -0
  50. package/dist/components/hazo_chat/index.d.ts.map +1 -0
  51. package/dist/components/hazo_chat/index.js +19 -0
  52. package/dist/components/hazo_chat/index.js.map +1 -0
  53. package/dist/components/index.d.ts +9 -0
  54. package/dist/components/index.d.ts.map +1 -0
  55. package/dist/components/index.js +11 -0
  56. package/dist/components/index.js.map +1 -0
  57. package/dist/components/ui/avatar.d.ts +13 -0
  58. package/dist/components/ui/avatar.d.ts.map +1 -0
  59. package/dist/components/ui/avatar.js +28 -0
  60. package/dist/components/ui/avatar.js.map +1 -0
  61. package/dist/components/ui/badge.d.ts +16 -0
  62. package/dist/components/ui/badge.d.ts.map +1 -0
  63. package/dist/components/ui/badge.js +36 -0
  64. package/dist/components/ui/badge.js.map +1 -0
  65. package/dist/components/ui/button.d.ts +18 -0
  66. package/dist/components/ui/button.d.ts.map +1 -0
  67. package/dist/components/ui/button.js +47 -0
  68. package/dist/components/ui/button.js.map +1 -0
  69. package/dist/components/ui/chat_bubble.d.ts +19 -0
  70. package/dist/components/ui/chat_bubble.d.ts.map +1 -0
  71. package/dist/components/ui/chat_bubble.js +101 -0
  72. package/dist/components/ui/chat_bubble.js.map +1 -0
  73. package/dist/components/ui/index.d.ts +18 -0
  74. package/dist/components/ui/index.d.ts.map +1 -0
  75. package/dist/components/ui/index.js +20 -0
  76. package/dist/components/ui/index.js.map +1 -0
  77. package/dist/components/ui/input.d.ts +11 -0
  78. package/dist/components/ui/input.d.ts.map +1 -0
  79. package/dist/components/ui/input.js +18 -0
  80. package/dist/components/ui/input.js.map +1 -0
  81. package/dist/components/ui/loading_skeleton.d.ts +19 -0
  82. package/dist/components/ui/loading_skeleton.d.ts.map +1 -0
  83. package/dist/components/ui/loading_skeleton.js +30 -0
  84. package/dist/components/ui/loading_skeleton.js.map +1 -0
  85. package/dist/components/ui/scroll-area.d.ts +12 -0
  86. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  87. package/dist/components/ui/scroll-area.js +25 -0
  88. package/dist/components/ui/scroll-area.js.map +1 -0
  89. package/dist/components/ui/separator.d.ts +11 -0
  90. package/dist/components/ui/separator.d.ts.map +1 -0
  91. package/dist/components/ui/separator.js +18 -0
  92. package/dist/components/ui/separator.js.map +1 -0
  93. package/dist/components/ui/skeleton.d.ts +9 -0
  94. package/dist/components/ui/skeleton.d.ts.map +1 -0
  95. package/dist/components/ui/skeleton.js +16 -0
  96. package/dist/components/ui/skeleton.js.map +1 -0
  97. package/dist/components/ui/textarea.d.ts +11 -0
  98. package/dist/components/ui/textarea.d.ts.map +1 -0
  99. package/dist/components/ui/textarea.js +18 -0
  100. package/dist/components/ui/textarea.js.map +1 -0
  101. package/dist/components/ui/tooltip.d.ts +14 -0
  102. package/dist/components/ui/tooltip.d.ts.map +1 -0
  103. package/dist/components/ui/tooltip.js +30 -0
  104. package/dist/components/ui/tooltip.js.map +1 -0
  105. package/dist/hooks/index.d.ts +10 -0
  106. package/dist/hooks/index.d.ts.map +1 -0
  107. package/dist/hooks/index.js +10 -0
  108. package/dist/hooks/index.js.map +1 -0
  109. package/dist/hooks/use_chat_messages.d.ts +30 -0
  110. package/dist/hooks/use_chat_messages.d.ts.map +1 -0
  111. package/dist/hooks/use_chat_messages.js +432 -0
  112. package/dist/hooks/use_chat_messages.js.map +1 -0
  113. package/dist/hooks/use_chat_references.d.ts +17 -0
  114. package/dist/hooks/use_chat_references.d.ts.map +1 -0
  115. package/dist/hooks/use_chat_references.js +133 -0
  116. package/dist/hooks/use_chat_references.js.map +1 -0
  117. package/dist/hooks/use_file_upload.d.ts +23 -0
  118. package/dist/hooks/use_file_upload.d.ts.map +1 -0
  119. package/dist/hooks/use_file_upload.js +212 -0
  120. package/dist/hooks/use_file_upload.js.map +1 -0
  121. package/dist/index.d.ts +13 -0
  122. package/dist/index.d.ts.map +1 -0
  123. package/dist/index.js +17 -0
  124. package/dist/index.js.map +1 -0
  125. package/dist/lib/config.d.ts +41 -0
  126. package/dist/lib/config.d.ts.map +1 -0
  127. package/dist/lib/config.js +93 -0
  128. package/dist/lib/config.js.map +1 -0
  129. package/dist/lib/constants.d.ts +39 -0
  130. package/dist/lib/constants.d.ts.map +1 -0
  131. package/dist/lib/constants.js +70 -0
  132. package/dist/lib/constants.js.map +1 -0
  133. package/dist/lib/index.d.ts +9 -0
  134. package/dist/lib/index.d.ts.map +1 -0
  135. package/dist/lib/index.js +9 -0
  136. package/dist/lib/index.js.map +1 -0
  137. package/dist/lib/utils.d.ts +17 -0
  138. package/dist/lib/utils.d.ts.map +1 -0
  139. package/dist/lib/utils.js +20 -0
  140. package/dist/lib/utils.js.map +1 -0
  141. package/dist/types/index.d.ts +378 -0
  142. package/dist/types/index.d.ts.map +1 -0
  143. package/dist/types/index.js +11 -0
  144. package/dist/types/index.js.map +1 -0
  145. package/package.json +1 -1
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Tooltip Component (shadcn/ui style)
3
+ *
4
+ * A tooltip component for displaying hints on hover.
5
+ * Uses @radix-ui/react-tooltip for accessibility.
6
+ */
7
+ import * as React from 'react';
8
+ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
9
+ declare const TooltipProvider: React.FC<TooltipPrimitive.TooltipProviderProps>;
10
+ declare const Tooltip: React.FC<TooltipPrimitive.TooltipProps>;
11
+ declare const TooltipTrigger: React.ForwardRefExoticComponent<TooltipPrimitive.TooltipTriggerProps & React.RefAttributes<HTMLButtonElement>>;
12
+ declare const TooltipContent: React.ForwardRefExoticComponent<Omit<TooltipPrimitive.TooltipContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
13
+ export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
14
+ //# sourceMappingURL=tooltip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../../../src/components/ui/tooltip.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAC;AAO5D,QAAA,MAAM,eAAe,iDAA4B,CAAC;AAMlD,QAAA,MAAM,OAAO,yCAAwB,CAAC;AAMtC,QAAA,MAAM,cAAc,gHAA2B,CAAC;AAMhD,QAAA,MAAM,cAAc,gKAalB,CAAC;AAIH,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Tooltip Component (shadcn/ui style)
3
+ *
4
+ * A tooltip component for displaying hints on hover.
5
+ * Uses @radix-ui/react-tooltip for accessibility.
6
+ */
7
+ 'use client';
8
+ import { jsx as _jsx } from "react/jsx-runtime";
9
+ import * as React from 'react';
10
+ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
11
+ import { cn } from '../../lib/utils.js';
12
+ // ============================================================================
13
+ // Tooltip Provider
14
+ // ============================================================================
15
+ const TooltipProvider = TooltipPrimitive.Provider;
16
+ // ============================================================================
17
+ // Tooltip Root
18
+ // ============================================================================
19
+ const Tooltip = TooltipPrimitive.Root;
20
+ // ============================================================================
21
+ // Tooltip Trigger
22
+ // ============================================================================
23
+ const TooltipTrigger = TooltipPrimitive.Trigger;
24
+ // ============================================================================
25
+ // Tooltip Content
26
+ // ============================================================================
27
+ const TooltipContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => (_jsx(TooltipPrimitive.Content, { ref: ref, sideOffset: sideOffset, className: cn('z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', className), ...props })));
28
+ TooltipContent.displayName = TooltipPrimitive.Content.displayName;
29
+ export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
30
+ //# sourceMappingURL=tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip.js","sourceRoot":"","sources":["../../../src/components/ui/tooltip.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAExC,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,MAAM,eAAe,GAAG,gBAAgB,CAAC,QAAQ,CAAC;AAElD,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC;AAEtC,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E,MAAM,cAAc,GAAG,gBAAgB,CAAC,OAAO,CAAC;AAEhD,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAGrC,CAAC,EAAE,SAAS,EAAE,UAAU,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClD,KAAC,gBAAgB,CAAC,OAAO,IACvB,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,EAAE,CACX,oYAAoY,EACpY,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC,CAAC;AAEH,cAAc,CAAC,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,WAAW,CAAC;AAElE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Hooks barrel export file
3
+ *
4
+ * Exports all custom hooks from the hazo_chat package.
5
+ * All export paths use explicit .js extensions for ES module compatibility.
6
+ */
7
+ export { useChatMessages } from './use_chat_messages.js';
8
+ export { useChatReferences } from './use_chat_references.js';
9
+ export { useFileUpload } from './use_file_upload.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Hooks barrel export file
3
+ *
4
+ * Exports all custom hooks from the hazo_chat package.
5
+ * All export paths use explicit .js extensions for ES module compatibility.
6
+ */
7
+ export { useChatMessages } from './use_chat_messages.js';
8
+ export { useChatReferences } from './use_chat_references.js';
9
+ export { useFileUpload } from './use_file_upload.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * useChatMessages Hook
3
+ *
4
+ * Manages chat messages with:
5
+ * - Cursor-based pagination (infinite scroll)
6
+ * - Polling for new messages with configurable interval
7
+ * - Optimistic updates for sent messages
8
+ * - Soft delete functionality
9
+ * - Exponential backoff on errors
10
+ *
11
+ * Uses fetch() to call API endpoints instead of direct database access.
12
+ * This allows the hook to work in client components without Node.js dependencies.
13
+ */
14
+ import type { UseChatMessagesReturn } from '../types/index.js';
15
+ export interface UseChatMessagesParams {
16
+ /** UUID of the chat recipient (required) */
17
+ receiver_user_id: string;
18
+ /** Reference ID for chat context grouping */
19
+ reference_id?: string;
20
+ /** Reference type (default: 'chat') */
21
+ reference_type?: string;
22
+ /** Base URL for API endpoints (default: '/api/hazo_chat') */
23
+ api_base_url?: string;
24
+ /** Polling interval in milliseconds (default: 3000) */
25
+ polling_interval?: number;
26
+ /** Number of messages per page for pagination (default: 20) */
27
+ messages_per_page?: number;
28
+ }
29
+ export declare function useChatMessages({ receiver_user_id, reference_id, reference_type, api_base_url, polling_interval, messages_per_page }: UseChatMessagesParams): UseChatMessagesReturn;
30
+ //# sourceMappingURL=use_chat_messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use_chat_messages.d.ts","sourceRoot":"","sources":["../../src/hooks/use_chat_messages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAKV,qBAAqB,EAEtB,MAAM,mBAAmB,CAAC;AAY3B,MAAM,WAAW,qBAAqB;IACpC,4CAA4C;IAC5C,gBAAgB,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+DAA+D;IAC/D,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AA6BD,wBAAgB,eAAe,CAAC,EAC9B,gBAAgB,EAChB,YAAiB,EACjB,cAAuB,EACvB,YAA+B,EAC/B,gBAA2C,EAC3C,iBAA6C,EAC9C,EAAE,qBAAqB,GAAG,qBAAqB,CA2f/C"}
@@ -0,0 +1,432 @@
1
+ /**
2
+ * useChatMessages Hook
3
+ *
4
+ * Manages chat messages with:
5
+ * - Cursor-based pagination (infinite scroll)
6
+ * - Polling for new messages with configurable interval
7
+ * - Optimistic updates for sent messages
8
+ * - Soft delete functionality
9
+ * - Exponential backoff on errors
10
+ *
11
+ * Uses fetch() to call API endpoints instead of direct database access.
12
+ * This allows the hook to work in client components without Node.js dependencies.
13
+ */
14
+ 'use client';
15
+ import { useState, useEffect, useCallback, useRef } from 'react';
16
+ import { DEFAULT_POLLING_INTERVAL, DEFAULT_MESSAGES_PER_PAGE, MAX_RETRY_ATTEMPTS, RETRY_BASE_DELAY } from '../lib/constants.js';
17
+ // ============================================================================
18
+ // Hook Implementation
19
+ // ============================================================================
20
+ export function useChatMessages({ receiver_user_id, reference_id = '', reference_type = 'chat', api_base_url = '/api/hazo_chat', polling_interval = DEFAULT_POLLING_INTERVAL, messages_per_page = DEFAULT_MESSAGES_PER_PAGE }) {
21
+ // -------------------------------------------------------------------------
22
+ // State
23
+ // -------------------------------------------------------------------------
24
+ const [messages, set_messages] = useState([]);
25
+ const [is_loading, set_is_loading] = useState(true);
26
+ const [is_loading_more, set_is_loading_more] = useState(false);
27
+ const [has_more, set_has_more] = useState(true);
28
+ const [error, set_error] = useState(null);
29
+ const [polling_status, set_polling_status] = useState('connected');
30
+ const [current_user_id, set_current_user_id] = useState(null);
31
+ // -------------------------------------------------------------------------
32
+ // Refs
33
+ // -------------------------------------------------------------------------
34
+ const cursor_ref = useRef(0);
35
+ const retry_count_ref = useRef(0);
36
+ const user_profiles_cache_ref = useRef(new Map());
37
+ const polling_timer_ref = useRef(null);
38
+ const is_mounted_ref = useRef(true);
39
+ // -------------------------------------------------------------------------
40
+ // Cleanup on unmount
41
+ // -------------------------------------------------------------------------
42
+ useEffect(() => {
43
+ is_mounted_ref.current = true;
44
+ return () => {
45
+ is_mounted_ref.current = false;
46
+ if (polling_timer_ref.current) {
47
+ clearInterval(polling_timer_ref.current);
48
+ }
49
+ };
50
+ }, []);
51
+ // -------------------------------------------------------------------------
52
+ // Fetch user profiles via API
53
+ // -------------------------------------------------------------------------
54
+ const fetch_user_profiles = useCallback(async (user_ids) => {
55
+ const uncached_ids = user_ids.filter((id) => !user_profiles_cache_ref.current.has(id));
56
+ if (uncached_ids.length > 0) {
57
+ try {
58
+ // Use the hazo_auth profiles endpoint
59
+ const response = await fetch('/api/hazo_auth/profiles', {
60
+ method: 'POST',
61
+ headers: { 'Content-Type': 'application/json' },
62
+ body: JSON.stringify({ user_ids: uncached_ids }),
63
+ });
64
+ if (response.ok) {
65
+ const data = await response.json();
66
+ if (data.success && data.profiles) {
67
+ data.profiles.forEach((profile) => {
68
+ user_profiles_cache_ref.current.set(profile.id, profile);
69
+ });
70
+ }
71
+ }
72
+ }
73
+ catch (err) {
74
+ console.error('[useChatMessages] Failed to fetch user profiles:', err);
75
+ }
76
+ }
77
+ return user_profiles_cache_ref.current;
78
+ }, []);
79
+ // -------------------------------------------------------------------------
80
+ // Transform DB messages to ChatMessage
81
+ // -------------------------------------------------------------------------
82
+ const transform_messages = useCallback(async (db_messages, user_id) => {
83
+ // Collect all unique user IDs
84
+ const user_ids = new Set();
85
+ db_messages.forEach((msg) => {
86
+ user_ids.add(msg.sender_user_id);
87
+ user_ids.add(msg.receiver_user_id);
88
+ });
89
+ // Fetch profiles
90
+ const profiles = await fetch_user_profiles(Array.from(user_ids));
91
+ // Transform messages
92
+ return db_messages.map((msg) => ({
93
+ ...msg,
94
+ sender_profile: profiles.get(msg.sender_user_id),
95
+ receiver_profile: profiles.get(msg.receiver_user_id),
96
+ is_sender: msg.sender_user_id === user_id,
97
+ send_status: 'sent'
98
+ }));
99
+ }, [fetch_user_profiles]);
100
+ // -------------------------------------------------------------------------
101
+ // Fetch messages via API
102
+ // -------------------------------------------------------------------------
103
+ const fetch_messages_from_api = useCallback(async () => {
104
+ if (!receiver_user_id) {
105
+ return { messages: [], user_id: null };
106
+ }
107
+ try {
108
+ const params = new URLSearchParams({
109
+ receiver_user_id,
110
+ ...(reference_id && { reference_id }),
111
+ ...(reference_type && { reference_type }),
112
+ });
113
+ const response = await fetch(`${api_base_url}/messages?${params.toString()}`);
114
+ if (!response.ok) {
115
+ throw new Error(`HTTP ${response.status}`);
116
+ }
117
+ const data = await response.json();
118
+ if (data.success) {
119
+ return {
120
+ messages: data.messages || [],
121
+ user_id: data.current_user_id || null
122
+ };
123
+ }
124
+ else {
125
+ throw new Error(data.error || 'Failed to fetch messages');
126
+ }
127
+ }
128
+ catch (err) {
129
+ console.error('[useChatMessages] Fetch error:', err);
130
+ throw err;
131
+ }
132
+ }, [receiver_user_id, reference_id, reference_type, api_base_url]);
133
+ // -------------------------------------------------------------------------
134
+ // Initial load
135
+ // -------------------------------------------------------------------------
136
+ const load_initial = useCallback(async () => {
137
+ if (!receiver_user_id) {
138
+ set_is_loading(false);
139
+ return;
140
+ }
141
+ set_is_loading(true);
142
+ set_error(null);
143
+ try {
144
+ const { messages: db_messages, user_id } = await fetch_messages_from_api();
145
+ if (user_id && is_mounted_ref.current) {
146
+ set_current_user_id(user_id);
147
+ }
148
+ if (is_mounted_ref.current) {
149
+ const transformed = user_id
150
+ ? await transform_messages(db_messages, user_id)
151
+ : db_messages.map(msg => ({ ...msg, is_sender: false, send_status: 'sent' }));
152
+ set_messages(transformed);
153
+ set_has_more(db_messages.length >= messages_per_page);
154
+ cursor_ref.current = db_messages.length;
155
+ retry_count_ref.current = 0;
156
+ set_polling_status('connected');
157
+ }
158
+ }
159
+ catch (err) {
160
+ if (is_mounted_ref.current) {
161
+ set_error('Failed to load messages');
162
+ set_polling_status('error');
163
+ }
164
+ }
165
+ finally {
166
+ if (is_mounted_ref.current) {
167
+ set_is_loading(false);
168
+ }
169
+ }
170
+ }, [receiver_user_id, fetch_messages_from_api, transform_messages, messages_per_page]);
171
+ // -------------------------------------------------------------------------
172
+ // Load more (pagination) - Note: simplified, API should support pagination params
173
+ // -------------------------------------------------------------------------
174
+ const load_more = useCallback(async () => {
175
+ if (!current_user_id || !has_more || is_loading_more) {
176
+ return;
177
+ }
178
+ set_is_loading_more(true);
179
+ try {
180
+ // For now, reload all messages - pagination can be added to API later
181
+ const { messages: db_messages } = await fetch_messages_from_api();
182
+ const transformed = await transform_messages(db_messages, current_user_id);
183
+ if (is_mounted_ref.current) {
184
+ set_messages(transformed);
185
+ set_has_more(false); // Simplified - loaded all
186
+ cursor_ref.current = db_messages.length;
187
+ }
188
+ }
189
+ catch (err) {
190
+ console.error('[useChatMessages] Load more error:', err);
191
+ }
192
+ finally {
193
+ if (is_mounted_ref.current) {
194
+ set_is_loading_more(false);
195
+ }
196
+ }
197
+ }, [current_user_id, has_more, is_loading_more, fetch_messages_from_api, transform_messages]);
198
+ // -------------------------------------------------------------------------
199
+ // Poll for new messages
200
+ // -------------------------------------------------------------------------
201
+ const poll_for_new_messages = useCallback(async () => {
202
+ if (!current_user_id || !receiver_user_id) {
203
+ return;
204
+ }
205
+ try {
206
+ const { messages: db_messages } = await fetch_messages_from_api();
207
+ if (db_messages.length > 0 && is_mounted_ref.current) {
208
+ const transformed = await transform_messages(db_messages, current_user_id);
209
+ set_messages((prev) => {
210
+ // Merge new messages, avoiding duplicates
211
+ const existing_ids = new Set(prev.map(m => m.id));
212
+ const new_messages = transformed.filter(m => !existing_ids.has(m.id));
213
+ if (new_messages.length > 0) {
214
+ // Combine and sort by created_at
215
+ const combined = [...prev, ...new_messages];
216
+ combined.sort((a, b) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime());
217
+ return combined;
218
+ }
219
+ return prev;
220
+ });
221
+ }
222
+ retry_count_ref.current = 0;
223
+ if (is_mounted_ref.current) {
224
+ set_polling_status('connected');
225
+ }
226
+ }
227
+ catch (err) {
228
+ console.error('[useChatMessages] Polling error:', err);
229
+ retry_count_ref.current += 1;
230
+ if (is_mounted_ref.current) {
231
+ if (retry_count_ref.current >= MAX_RETRY_ATTEMPTS) {
232
+ set_polling_status('error');
233
+ }
234
+ else {
235
+ set_polling_status('reconnecting');
236
+ }
237
+ }
238
+ }
239
+ }, [current_user_id, receiver_user_id, fetch_messages_from_api, transform_messages]);
240
+ // -------------------------------------------------------------------------
241
+ // Start polling
242
+ // -------------------------------------------------------------------------
243
+ useEffect(() => {
244
+ if (!receiver_user_id) {
245
+ return;
246
+ }
247
+ // Clear any existing timer
248
+ if (polling_timer_ref.current) {
249
+ clearInterval(polling_timer_ref.current);
250
+ }
251
+ // Calculate delay with exponential backoff
252
+ const get_poll_delay = () => {
253
+ if (retry_count_ref.current === 0) {
254
+ return polling_interval;
255
+ }
256
+ return Math.min(polling_interval * Math.pow(2, retry_count_ref.current), RETRY_BASE_DELAY * 30 // Cap at 30 seconds
257
+ );
258
+ };
259
+ const start_polling = () => {
260
+ polling_timer_ref.current = setInterval(() => {
261
+ poll_for_new_messages();
262
+ }, get_poll_delay());
263
+ };
264
+ start_polling();
265
+ return () => {
266
+ if (polling_timer_ref.current) {
267
+ clearInterval(polling_timer_ref.current);
268
+ }
269
+ };
270
+ }, [receiver_user_id, polling_interval, poll_for_new_messages]);
271
+ // -------------------------------------------------------------------------
272
+ // Initial load effect
273
+ // -------------------------------------------------------------------------
274
+ useEffect(() => {
275
+ load_initial();
276
+ }, [load_initial]);
277
+ // -------------------------------------------------------------------------
278
+ // Send message via API
279
+ // -------------------------------------------------------------------------
280
+ const send_message = useCallback(async (payload) => {
281
+ if (!current_user_id) {
282
+ set_error('Not authenticated');
283
+ return false;
284
+ }
285
+ // Create optimistic message
286
+ const optimistic_id = `optimistic-${Date.now()}`;
287
+ const optimistic_message = {
288
+ id: optimistic_id,
289
+ reference_id: payload.reference_id,
290
+ reference_type: payload.reference_type,
291
+ sender_user_id: current_user_id,
292
+ receiver_user_id: payload.receiver_user_id,
293
+ message_text: payload.message_text,
294
+ reference_list: payload.reference_list || null,
295
+ read_at: null,
296
+ deleted_at: null,
297
+ created_at: new Date().toISOString(),
298
+ changed_at: new Date().toISOString(),
299
+ sender_profile: user_profiles_cache_ref.current.get(current_user_id),
300
+ receiver_profile: user_profiles_cache_ref.current.get(payload.receiver_user_id),
301
+ is_sender: true,
302
+ send_status: 'sending'
303
+ };
304
+ // Add optimistic message to state
305
+ set_messages((prev) => [...prev, optimistic_message]);
306
+ try {
307
+ const response = await fetch(`${api_base_url}/messages`, {
308
+ method: 'POST',
309
+ headers: { 'Content-Type': 'application/json' },
310
+ body: JSON.stringify({
311
+ receiver_user_id: payload.receiver_user_id,
312
+ message_text: payload.message_text,
313
+ reference_id: payload.reference_id,
314
+ reference_type: payload.reference_type,
315
+ }),
316
+ });
317
+ const data = await response.json();
318
+ if (data.success && data.message && is_mounted_ref.current) {
319
+ // Replace optimistic message with real one
320
+ const real_message = {
321
+ ...data.message,
322
+ sender_profile: user_profiles_cache_ref.current.get(current_user_id),
323
+ receiver_profile: user_profiles_cache_ref.current.get(payload.receiver_user_id),
324
+ is_sender: true,
325
+ send_status: 'sent'
326
+ };
327
+ set_messages((prev) => prev.map((msg) => msg.id === optimistic_id ? real_message : msg));
328
+ return true;
329
+ }
330
+ else {
331
+ throw new Error(data.error || 'Failed to send message');
332
+ }
333
+ }
334
+ catch (err) {
335
+ console.error('[useChatMessages] Send error:', err);
336
+ // Mark optimistic message as failed
337
+ if (is_mounted_ref.current) {
338
+ set_messages((prev) => prev.map((msg) => msg.id === optimistic_id
339
+ ? { ...msg, send_status: 'failed' }
340
+ : msg));
341
+ }
342
+ return false;
343
+ }
344
+ }, [current_user_id, api_base_url]);
345
+ // -------------------------------------------------------------------------
346
+ // Delete message (soft delete) via API
347
+ // -------------------------------------------------------------------------
348
+ const delete_message = useCallback(async (message_id) => {
349
+ if (!current_user_id) {
350
+ return false;
351
+ }
352
+ // Find the message to verify ownership
353
+ const message = messages.find((m) => m.id === message_id);
354
+ if (!message || message.sender_user_id !== current_user_id) {
355
+ set_error('Cannot delete this message');
356
+ return false;
357
+ }
358
+ // Optimistic update
359
+ set_messages((prev) => prev.map((msg) => msg.id === message_id
360
+ ? { ...msg, deleted_at: new Date().toISOString(), message_text: null }
361
+ : msg));
362
+ try {
363
+ const response = await fetch(`${api_base_url}/messages/${message_id}`, {
364
+ method: 'DELETE',
365
+ });
366
+ if (!response.ok) {
367
+ throw new Error('Failed to delete message');
368
+ }
369
+ return true;
370
+ }
371
+ catch (err) {
372
+ console.error('[useChatMessages] Delete error:', err);
373
+ // Rollback on error
374
+ if (is_mounted_ref.current) {
375
+ set_messages((prev) => prev.map((msg) => msg.id === message_id
376
+ ? { ...msg, deleted_at: message.deleted_at, message_text: message.message_text }
377
+ : msg));
378
+ }
379
+ return false;
380
+ }
381
+ }, [current_user_id, messages, api_base_url]);
382
+ // -------------------------------------------------------------------------
383
+ // Mark as read via API
384
+ // -------------------------------------------------------------------------
385
+ const mark_as_read = useCallback(async (message_id) => {
386
+ if (!current_user_id) {
387
+ return;
388
+ }
389
+ const message = messages.find((m) => m.id === message_id);
390
+ if (!message || message.read_at || message.sender_user_id === current_user_id) {
391
+ return;
392
+ }
393
+ try {
394
+ const response = await fetch(`${api_base_url}/messages/${message_id}/read`, {
395
+ method: 'PATCH',
396
+ });
397
+ if (response.ok && is_mounted_ref.current) {
398
+ set_messages((prev) => prev.map((msg) => msg.id === message_id
399
+ ? { ...msg, read_at: new Date().toISOString() }
400
+ : msg));
401
+ }
402
+ }
403
+ catch (err) {
404
+ console.error('[useChatMessages] Mark as read error:', err);
405
+ }
406
+ }, [current_user_id, messages, api_base_url]);
407
+ // -------------------------------------------------------------------------
408
+ // Refresh
409
+ // -------------------------------------------------------------------------
410
+ const refresh = useCallback(() => {
411
+ cursor_ref.current = 0;
412
+ set_messages([]);
413
+ load_initial();
414
+ }, [load_initial]);
415
+ // -------------------------------------------------------------------------
416
+ // Return
417
+ // -------------------------------------------------------------------------
418
+ return {
419
+ messages,
420
+ is_loading,
421
+ is_loading_more,
422
+ has_more,
423
+ error,
424
+ polling_status,
425
+ load_more,
426
+ send_message,
427
+ delete_message,
428
+ mark_as_read,
429
+ refresh
430
+ };
431
+ }
432
+ //# sourceMappingURL=use_chat_messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use_chat_messages.js","sourceRoot":"","sources":["../../src/hooks/use_chat_messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * useChatReferences Hook
3
+ *
4
+ * Manages chat references with:
5
+ * - Aggregating references from messages and props
6
+ * - Selection state management
7
+ * - Finding source message for a reference
8
+ */
9
+ import type { ChatReferenceItem, ChatMessage, ReferenceItem, UseChatReferencesReturn } from '../types/index.js';
10
+ interface UseChatReferencesParams {
11
+ messages: ChatMessage[];
12
+ initial_references?: ReferenceItem[];
13
+ on_selection_change?: (reference: ChatReferenceItem | null) => void;
14
+ }
15
+ export declare function useChatReferences({ messages, initial_references, on_selection_change }: UseChatReferencesParams): UseChatReferencesReturn;
16
+ export {};
17
+ //# sourceMappingURL=use_chat_references.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use_chat_references.d.ts","sourceRoot":"","sources":["../../src/hooks/use_chat_references.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EACV,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,uBAAuB,EACxB,MAAM,mBAAmB,CAAC;AAM3B,UAAU,uBAAuB;IAC/B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,kBAAkB,CAAC,EAAE,aAAa,EAAE,CAAC;IACrC,mBAAmB,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI,KAAK,IAAI,CAAC;CACrE;AAMD,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,kBAAuB,EACvB,mBAAmB,EACpB,EAAE,uBAAuB,GAAG,uBAAuB,CA6InD"}