hazo_chat 2.0.2 → 2.0.4

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 +263 -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 +438 -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,CAigB/C"}
@@ -0,0 +1,438 @@
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
+ credentials: 'include'
64
+ });
65
+ if (response.ok) {
66
+ const data = await response.json();
67
+ if (data.success && data.profiles) {
68
+ data.profiles.forEach((profile) => {
69
+ user_profiles_cache_ref.current.set(profile.id, profile);
70
+ });
71
+ }
72
+ }
73
+ }
74
+ catch (err) {
75
+ console.error('[useChatMessages] Failed to fetch user profiles:', err);
76
+ }
77
+ }
78
+ return user_profiles_cache_ref.current;
79
+ }, []);
80
+ // -------------------------------------------------------------------------
81
+ // Transform DB messages to ChatMessage
82
+ // -------------------------------------------------------------------------
83
+ const transform_messages = useCallback(async (db_messages, user_id) => {
84
+ // Collect all unique user IDs
85
+ const user_ids = new Set();
86
+ db_messages.forEach((msg) => {
87
+ user_ids.add(msg.sender_user_id);
88
+ user_ids.add(msg.receiver_user_id);
89
+ });
90
+ // Fetch profiles
91
+ const profiles = await fetch_user_profiles(Array.from(user_ids));
92
+ // Transform messages
93
+ return db_messages.map((msg) => ({
94
+ ...msg,
95
+ sender_profile: profiles.get(msg.sender_user_id),
96
+ receiver_profile: profiles.get(msg.receiver_user_id),
97
+ is_sender: msg.sender_user_id === user_id,
98
+ send_status: 'sent'
99
+ }));
100
+ }, [fetch_user_profiles]);
101
+ // -------------------------------------------------------------------------
102
+ // Fetch messages via API
103
+ // -------------------------------------------------------------------------
104
+ const fetch_messages_from_api = useCallback(async () => {
105
+ if (!receiver_user_id) {
106
+ return { messages: [], user_id: null };
107
+ }
108
+ try {
109
+ const params = new URLSearchParams({
110
+ receiver_user_id,
111
+ ...(reference_id && { reference_id }),
112
+ ...(reference_type && { reference_type }),
113
+ });
114
+ const response = await fetch(`${api_base_url}/messages?${params.toString()}`, {
115
+ credentials: 'include'
116
+ });
117
+ if (!response.ok) {
118
+ throw new Error(`HTTP ${response.status}`);
119
+ }
120
+ const data = await response.json();
121
+ if (data.success) {
122
+ return {
123
+ messages: data.messages || [],
124
+ user_id: data.current_user_id || null
125
+ };
126
+ }
127
+ else {
128
+ throw new Error(data.error || 'Failed to fetch messages');
129
+ }
130
+ }
131
+ catch (err) {
132
+ console.error('[useChatMessages] Fetch error:', err);
133
+ throw err;
134
+ }
135
+ }, [receiver_user_id, reference_id, reference_type, api_base_url]);
136
+ // -------------------------------------------------------------------------
137
+ // Initial load
138
+ // -------------------------------------------------------------------------
139
+ const load_initial = useCallback(async () => {
140
+ if (!receiver_user_id) {
141
+ set_is_loading(false);
142
+ return;
143
+ }
144
+ set_is_loading(true);
145
+ set_error(null);
146
+ try {
147
+ const { messages: db_messages, user_id } = await fetch_messages_from_api();
148
+ if (user_id && is_mounted_ref.current) {
149
+ set_current_user_id(user_id);
150
+ }
151
+ if (is_mounted_ref.current) {
152
+ const transformed = user_id
153
+ ? await transform_messages(db_messages, user_id)
154
+ : db_messages.map(msg => ({ ...msg, is_sender: false, send_status: 'sent' }));
155
+ set_messages(transformed);
156
+ set_has_more(db_messages.length >= messages_per_page);
157
+ cursor_ref.current = db_messages.length;
158
+ retry_count_ref.current = 0;
159
+ set_polling_status('connected');
160
+ }
161
+ }
162
+ catch (err) {
163
+ if (is_mounted_ref.current) {
164
+ set_error('Failed to load messages');
165
+ set_polling_status('error');
166
+ }
167
+ }
168
+ finally {
169
+ if (is_mounted_ref.current) {
170
+ set_is_loading(false);
171
+ }
172
+ }
173
+ }, [receiver_user_id, fetch_messages_from_api, transform_messages, messages_per_page]);
174
+ // -------------------------------------------------------------------------
175
+ // Load more (pagination) - Note: simplified, API should support pagination params
176
+ // -------------------------------------------------------------------------
177
+ const load_more = useCallback(async () => {
178
+ if (!current_user_id || !has_more || is_loading_more) {
179
+ return;
180
+ }
181
+ set_is_loading_more(true);
182
+ try {
183
+ // For now, reload all messages - pagination can be added to API later
184
+ const { messages: db_messages } = await fetch_messages_from_api();
185
+ const transformed = await transform_messages(db_messages, current_user_id);
186
+ if (is_mounted_ref.current) {
187
+ set_messages(transformed);
188
+ set_has_more(false); // Simplified - loaded all
189
+ cursor_ref.current = db_messages.length;
190
+ }
191
+ }
192
+ catch (err) {
193
+ console.error('[useChatMessages] Load more error:', err);
194
+ }
195
+ finally {
196
+ if (is_mounted_ref.current) {
197
+ set_is_loading_more(false);
198
+ }
199
+ }
200
+ }, [current_user_id, has_more, is_loading_more, fetch_messages_from_api, transform_messages]);
201
+ // -------------------------------------------------------------------------
202
+ // Poll for new messages
203
+ // -------------------------------------------------------------------------
204
+ const poll_for_new_messages = useCallback(async () => {
205
+ if (!current_user_id || !receiver_user_id) {
206
+ return;
207
+ }
208
+ try {
209
+ const { messages: db_messages } = await fetch_messages_from_api();
210
+ if (db_messages.length > 0 && is_mounted_ref.current) {
211
+ const transformed = await transform_messages(db_messages, current_user_id);
212
+ set_messages((prev) => {
213
+ // Merge new messages, avoiding duplicates
214
+ const existing_ids = new Set(prev.map(m => m.id));
215
+ const new_messages = transformed.filter(m => !existing_ids.has(m.id));
216
+ if (new_messages.length > 0) {
217
+ // Combine and sort by created_at
218
+ const combined = [...prev, ...new_messages];
219
+ combined.sort((a, b) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime());
220
+ return combined;
221
+ }
222
+ return prev;
223
+ });
224
+ }
225
+ retry_count_ref.current = 0;
226
+ if (is_mounted_ref.current) {
227
+ set_polling_status('connected');
228
+ }
229
+ }
230
+ catch (err) {
231
+ console.error('[useChatMessages] Polling error:', err);
232
+ retry_count_ref.current += 1;
233
+ if (is_mounted_ref.current) {
234
+ if (retry_count_ref.current >= MAX_RETRY_ATTEMPTS) {
235
+ set_polling_status('error');
236
+ }
237
+ else {
238
+ set_polling_status('reconnecting');
239
+ }
240
+ }
241
+ }
242
+ }, [current_user_id, receiver_user_id, fetch_messages_from_api, transform_messages]);
243
+ // -------------------------------------------------------------------------
244
+ // Start polling
245
+ // -------------------------------------------------------------------------
246
+ useEffect(() => {
247
+ if (!receiver_user_id) {
248
+ return;
249
+ }
250
+ // Clear any existing timer
251
+ if (polling_timer_ref.current) {
252
+ clearInterval(polling_timer_ref.current);
253
+ }
254
+ // Calculate delay with exponential backoff
255
+ const get_poll_delay = () => {
256
+ if (retry_count_ref.current === 0) {
257
+ return polling_interval;
258
+ }
259
+ return Math.min(polling_interval * Math.pow(2, retry_count_ref.current), RETRY_BASE_DELAY * 30 // Cap at 30 seconds
260
+ );
261
+ };
262
+ const start_polling = () => {
263
+ polling_timer_ref.current = setInterval(() => {
264
+ poll_for_new_messages();
265
+ }, get_poll_delay());
266
+ };
267
+ start_polling();
268
+ return () => {
269
+ if (polling_timer_ref.current) {
270
+ clearInterval(polling_timer_ref.current);
271
+ }
272
+ };
273
+ }, [receiver_user_id, polling_interval, poll_for_new_messages]);
274
+ // -------------------------------------------------------------------------
275
+ // Initial load effect
276
+ // -------------------------------------------------------------------------
277
+ useEffect(() => {
278
+ load_initial();
279
+ }, [load_initial]);
280
+ // -------------------------------------------------------------------------
281
+ // Send message via API
282
+ // -------------------------------------------------------------------------
283
+ const send_message = useCallback(async (payload) => {
284
+ if (!current_user_id) {
285
+ set_error('Not authenticated');
286
+ return false;
287
+ }
288
+ // Create optimistic message
289
+ const optimistic_id = `optimistic-${Date.now()}`;
290
+ const optimistic_message = {
291
+ id: optimistic_id,
292
+ reference_id: payload.reference_id,
293
+ reference_type: payload.reference_type,
294
+ sender_user_id: current_user_id,
295
+ receiver_user_id: payload.receiver_user_id,
296
+ message_text: payload.message_text,
297
+ reference_list: payload.reference_list || null,
298
+ read_at: null,
299
+ deleted_at: null,
300
+ created_at: new Date().toISOString(),
301
+ changed_at: new Date().toISOString(),
302
+ sender_profile: user_profiles_cache_ref.current.get(current_user_id),
303
+ receiver_profile: user_profiles_cache_ref.current.get(payload.receiver_user_id),
304
+ is_sender: true,
305
+ send_status: 'sending'
306
+ };
307
+ // Add optimistic message to state
308
+ set_messages((prev) => [...prev, optimistic_message]);
309
+ try {
310
+ const response = await fetch(`${api_base_url}/messages`, {
311
+ method: 'POST',
312
+ headers: { 'Content-Type': 'application/json' },
313
+ credentials: 'include',
314
+ body: JSON.stringify({
315
+ receiver_user_id: payload.receiver_user_id,
316
+ message_text: payload.message_text,
317
+ reference_id: payload.reference_id,
318
+ reference_type: payload.reference_type,
319
+ }),
320
+ });
321
+ const data = await response.json();
322
+ if (data.success && data.message && is_mounted_ref.current) {
323
+ // Replace optimistic message with real one
324
+ const real_message = {
325
+ ...data.message,
326
+ sender_profile: user_profiles_cache_ref.current.get(current_user_id),
327
+ receiver_profile: user_profiles_cache_ref.current.get(payload.receiver_user_id),
328
+ is_sender: true,
329
+ send_status: 'sent'
330
+ };
331
+ set_messages((prev) => prev.map((msg) => msg.id === optimistic_id ? real_message : msg));
332
+ return true;
333
+ }
334
+ else {
335
+ throw new Error(data.error || 'Failed to send message');
336
+ }
337
+ }
338
+ catch (err) {
339
+ console.error('[useChatMessages] Send error:', err);
340
+ // Mark optimistic message as failed
341
+ if (is_mounted_ref.current) {
342
+ set_messages((prev) => prev.map((msg) => msg.id === optimistic_id
343
+ ? { ...msg, send_status: 'failed' }
344
+ : msg));
345
+ }
346
+ return false;
347
+ }
348
+ }, [current_user_id, api_base_url]);
349
+ // -------------------------------------------------------------------------
350
+ // Delete message (soft delete) via API
351
+ // -------------------------------------------------------------------------
352
+ const delete_message = useCallback(async (message_id) => {
353
+ if (!current_user_id) {
354
+ return false;
355
+ }
356
+ // Find the message to verify ownership
357
+ const message = messages.find((m) => m.id === message_id);
358
+ if (!message || message.sender_user_id !== current_user_id) {
359
+ set_error('Cannot delete this message');
360
+ return false;
361
+ }
362
+ // Optimistic update
363
+ set_messages((prev) => prev.map((msg) => msg.id === message_id
364
+ ? { ...msg, deleted_at: new Date().toISOString(), message_text: null }
365
+ : msg));
366
+ try {
367
+ const response = await fetch(`${api_base_url}/messages/${message_id}`, {
368
+ method: 'DELETE',
369
+ credentials: 'include'
370
+ });
371
+ if (!response.ok) {
372
+ throw new Error('Failed to delete message');
373
+ }
374
+ return true;
375
+ }
376
+ catch (err) {
377
+ console.error('[useChatMessages] Delete error:', err);
378
+ // Rollback on error
379
+ if (is_mounted_ref.current) {
380
+ set_messages((prev) => prev.map((msg) => msg.id === message_id
381
+ ? { ...msg, deleted_at: message.deleted_at, message_text: message.message_text }
382
+ : msg));
383
+ }
384
+ return false;
385
+ }
386
+ }, [current_user_id, messages, api_base_url]);
387
+ // -------------------------------------------------------------------------
388
+ // Mark as read via API
389
+ // -------------------------------------------------------------------------
390
+ const mark_as_read = useCallback(async (message_id) => {
391
+ if (!current_user_id) {
392
+ return;
393
+ }
394
+ const message = messages.find((m) => m.id === message_id);
395
+ if (!message || message.read_at || message.sender_user_id === current_user_id) {
396
+ return;
397
+ }
398
+ try {
399
+ const response = await fetch(`${api_base_url}/messages/${message_id}/read`, {
400
+ method: 'PATCH',
401
+ credentials: 'include'
402
+ });
403
+ if (response.ok && is_mounted_ref.current) {
404
+ set_messages((prev) => prev.map((msg) => msg.id === message_id
405
+ ? { ...msg, read_at: new Date().toISOString() }
406
+ : msg));
407
+ }
408
+ }
409
+ catch (err) {
410
+ console.error('[useChatMessages] Mark as read error:', err);
411
+ }
412
+ }, [current_user_id, messages, api_base_url]);
413
+ // -------------------------------------------------------------------------
414
+ // Refresh
415
+ // -------------------------------------------------------------------------
416
+ const refresh = useCallback(() => {
417
+ cursor_ref.current = 0;
418
+ set_messages([]);
419
+ load_initial();
420
+ }, [load_initial]);
421
+ // -------------------------------------------------------------------------
422
+ // Return
423
+ // -------------------------------------------------------------------------
424
+ return {
425
+ messages,
426
+ is_loading,
427
+ is_loading_more,
428
+ has_more,
429
+ error,
430
+ polling_status,
431
+ load_more,
432
+ send_message,
433
+ delete_message,
434
+ mark_as_read,
435
+ refresh
436
+ };
437
+ }
438
+ //# 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"}