@droppii-org/chat-sdk 0.0.4 → 0.0.5

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 (124) hide show
  1. package/dist/tsconfig.tsbuildinfo +1 -0
  2. package/package.json +11 -4
  3. package/dist/components/AutoScrollAnchor.d.ts +0 -2
  4. package/dist/components/AutoScrollAnchor.d.ts.map +0 -1
  5. package/dist/components/AutoScrollAnchor.js +0 -12
  6. package/dist/components/AutoScrollAnchor.jsx +0 -11
  7. package/dist/components/ChatBubble.d.ts +0 -2
  8. package/dist/components/ChatBubble.d.ts.map +0 -1
  9. package/dist/components/ChatBubble.js +0 -18
  10. package/dist/components/ChatBubble.jsx +0 -80
  11. package/dist/components/ChatHeader.d.ts +0 -8
  12. package/dist/components/ChatHeader.d.ts.map +0 -1
  13. package/dist/components/ChatHeader.js +0 -32
  14. package/dist/components/ChatHeader.jsx +0 -72
  15. package/dist/components/ChatInput.d.ts +0 -3
  16. package/dist/components/ChatInput.d.ts.map +0 -1
  17. package/dist/components/ChatInput.js +0 -379
  18. package/dist/components/ChatInput.jsx +0 -444
  19. package/dist/components/ChatInputDemo.d.ts +0 -2
  20. package/dist/components/ChatInputDemo.d.ts.map +0 -1
  21. package/dist/components/ChatInputDemo.js +0 -38
  22. package/dist/components/ChatInputDemo.jsx +0 -53
  23. package/dist/components/ChatInputWithCustomIcon.d.ts +0 -16
  24. package/dist/components/ChatInputWithCustomIcon.d.ts.map +0 -1
  25. package/dist/components/ChatInputWithCustomIcon.js +0 -85
  26. package/dist/components/ChatInputWithCustomIcon.jsx +0 -167
  27. package/dist/components/ChatLayout.d.ts +0 -6
  28. package/dist/components/ChatLayout.d.ts.map +0 -1
  29. package/dist/components/ChatLayout.js +0 -48
  30. package/dist/components/ChatLayout.jsx +0 -122
  31. package/dist/components/ConversationItem.d.ts +0 -9
  32. package/dist/components/ConversationItem.d.ts.map +0 -1
  33. package/dist/components/ConversationItem.js +0 -27
  34. package/dist/components/ConversationItem.jsx +0 -51
  35. package/dist/components/ConversationList.d.ts +0 -8
  36. package/dist/components/ConversationList.d.ts.map +0 -1
  37. package/dist/components/ConversationList.js +0 -11
  38. package/dist/components/ConversationList.jsx +0 -22
  39. package/dist/components/DateDivider.d.ts +0 -7
  40. package/dist/components/DateDivider.d.ts.map +0 -1
  41. package/dist/components/DateDivider.js +0 -27
  42. package/dist/components/DateDivider.jsx +0 -28
  43. package/dist/components/EmojiPicker.d.ts +0 -4
  44. package/dist/components/EmojiPicker.d.ts.map +0 -1
  45. package/dist/components/EmojiPicker.js +0 -191
  46. package/dist/components/EmojiPicker.jsx +0 -229
  47. package/dist/components/ImageLightbox.d.ts +0 -8
  48. package/dist/components/ImageLightbox.d.ts.map +0 -1
  49. package/dist/components/ImageLightbox.js +0 -8
  50. package/dist/components/ImageLightbox.jsx +0 -16
  51. package/dist/components/ImagePreviewModal.d.ts +0 -12
  52. package/dist/components/ImagePreviewModal.d.ts.map +0 -1
  53. package/dist/components/ImagePreviewModal.js +0 -55
  54. package/dist/components/ImagePreviewModal.jsx +0 -84
  55. package/dist/components/MessageItem.d.ts +0 -3
  56. package/dist/components/MessageItem.d.ts.map +0 -1
  57. package/dist/components/MessageItem.js +0 -38
  58. package/dist/components/MessageItem.jsx +0 -99
  59. package/dist/components/MessageItemDemo.d.ts +0 -2
  60. package/dist/components/MessageItemDemo.d.ts.map +0 -1
  61. package/dist/components/MessageItemDemo.js +0 -166
  62. package/dist/components/MessageItemDemo.jsx +0 -179
  63. package/dist/components/MessageList.d.ts +0 -15
  64. package/dist/components/MessageList.d.ts.map +0 -1
  65. package/dist/components/MessageList.js +0 -243
  66. package/dist/components/MessageList.jsx +0 -306
  67. package/dist/components/MessageListDemo.d.ts +0 -2
  68. package/dist/components/MessageListDemo.d.ts.map +0 -1
  69. package/dist/components/MessageListDemo.js +0 -165
  70. package/dist/components/MessageListDemo.jsx +0 -183
  71. package/dist/components/StickerPicker.d.ts +0 -4
  72. package/dist/components/StickerPicker.d.ts.map +0 -1
  73. package/dist/components/StickerPicker.js +0 -68
  74. package/dist/components/StickerPicker.jsx +0 -106
  75. package/dist/components/SwipeIndicator.d.ts +0 -9
  76. package/dist/components/SwipeIndicator.d.ts.map +0 -1
  77. package/dist/components/SwipeIndicator.js +0 -24
  78. package/dist/components/SwipeIndicator.jsx +0 -28
  79. package/dist/components/TextFormattingToolbar.d.ts +0 -4
  80. package/dist/components/TextFormattingToolbar.d.ts.map +0 -1
  81. package/dist/components/TextFormattingToolbar.js +0 -29
  82. package/dist/components/TextFormattingToolbar.jsx +0 -52
  83. package/dist/components/TypingIndicator.d.ts +0 -6
  84. package/dist/components/TypingIndicator.d.ts.map +0 -1
  85. package/dist/components/TypingIndicator.js +0 -21
  86. package/dist/components/TypingIndicator.jsx +0 -27
  87. package/dist/components/VoiceWaveIcon.d.ts +0 -7
  88. package/dist/components/VoiceWaveIcon.d.ts.map +0 -1
  89. package/dist/components/VoiceWaveIcon.js +0 -5
  90. package/dist/components/VoiceWaveIcon.jsx +0 -11
  91. package/dist/context/ChatContext.d.ts +0 -72
  92. package/dist/context/ChatContext.d.ts.map +0 -1
  93. package/dist/context/ChatContext.js +0 -347
  94. package/dist/context/ChatContext.jsx +0 -346
  95. package/dist/hooks/useChat.d.ts +0 -5
  96. package/dist/hooks/useChat.d.ts.map +0 -1
  97. package/dist/hooks/useChat.js +0 -73
  98. package/dist/hooks/useConversationList.d.ts +0 -5
  99. package/dist/hooks/useConversationList.d.ts.map +0 -1
  100. package/dist/hooks/useConversationList.js +0 -9
  101. package/dist/hooks/useMessages.d.ts +0 -5
  102. package/dist/hooks/useMessages.d.ts.map +0 -1
  103. package/dist/hooks/useMessages.js +0 -192
  104. package/dist/hooks/useSocket.d.ts +0 -7
  105. package/dist/hooks/useSocket.d.ts.map +0 -1
  106. package/dist/hooks/useSocket.js +0 -120
  107. package/dist/hooks/useSwipeGesture.d.ts +0 -11
  108. package/dist/hooks/useSwipeGesture.d.ts.map +0 -1
  109. package/dist/hooks/useSwipeGesture.js +0 -54
  110. package/dist/hooks/useTextSelection.d.ts +0 -13
  111. package/dist/hooks/useTextSelection.d.ts.map +0 -1
  112. package/dist/hooks/useTextSelection.js +0 -132
  113. package/dist/hooks/useTyping.d.ts +0 -7
  114. package/dist/hooks/useTyping.d.ts.map +0 -1
  115. package/dist/hooks/useTyping.js +0 -64
  116. package/dist/index.d.ts +0 -28
  117. package/dist/index.d.ts.map +0 -1
  118. package/dist/index.js +0 -29
  119. package/dist/types/chat.d.ts +0 -39
  120. package/dist/types/chat.d.ts.map +0 -1
  121. package/dist/types/chat.js +0 -1
  122. package/dist/types/index.d.ts +0 -86
  123. package/dist/types/index.d.ts.map +0 -1
  124. package/dist/types/index.js +0 -1
@@ -1,120 +0,0 @@
1
- "use client";
2
- import { useEffect, useRef, useCallback } from "react";
3
- import { useChatContext } from "../context/ChatContext";
4
- export function useSocket() {
5
- const { state, dispatch } = useChatContext();
6
- const socketRef = useRef(null);
7
- const reconnectTimeoutRef = useRef();
8
- const reconnectAttempts = useRef(0);
9
- const maxReconnectAttempts = 3;
10
- const connect = useCallback(() => {
11
- var _a;
12
- // Skip WebSocket connection in demo mode or if no URL provided
13
- if (!((_a = state.config) === null || _a === void 0 ? void 0 : _a.wsUrl) || state.config.wsUrl.includes("localhost") || state.config.wsUrl === "demo") {
14
- console.log("WebSocket disabled for demo mode");
15
- dispatch({ type: "SET_CONNECTION_STATUS", payload: false });
16
- return;
17
- }
18
- if (reconnectAttempts.current >= maxReconnectAttempts) {
19
- console.log("Max reconnection attempts reached");
20
- return;
21
- }
22
- try {
23
- const ws = new WebSocket(`${state.config.wsUrl}?token=${state.config.token}`);
24
- ws.onopen = () => {
25
- console.log("WebSocket connected");
26
- dispatch({ type: "SET_CONNECTION_STATUS", payload: true });
27
- socketRef.current = ws;
28
- reconnectAttempts.current = 0;
29
- };
30
- ws.onmessage = (event) => {
31
- try {
32
- const message = JSON.parse(event.data);
33
- handleSocketMessage(message);
34
- }
35
- catch (error) {
36
- console.error("Failed to parse socket message:", error);
37
- }
38
- };
39
- ws.onclose = (event) => {
40
- console.log("WebSocket disconnected", event.code, event.reason);
41
- dispatch({ type: "SET_CONNECTION_STATUS", payload: false });
42
- socketRef.current = null;
43
- // Only attempt to reconnect if it wasn't a manual close
44
- if (event.code !== 1000 && reconnectAttempts.current < maxReconnectAttempts) {
45
- reconnectAttempts.current++;
46
- reconnectTimeoutRef.current = setTimeout(() => {
47
- console.log(`Reconnection attempt ${reconnectAttempts.current}`);
48
- connect();
49
- }, 3000 * reconnectAttempts.current); // Exponential backoff
50
- }
51
- };
52
- ws.onerror = (error) => {
53
- console.warn("WebSocket connection failed - running in offline mode");
54
- dispatch({ type: "SET_CONNECTION_STATUS", payload: false });
55
- // Don't attempt to reconnect on error to avoid spam
56
- reconnectAttempts.current = maxReconnectAttempts;
57
- };
58
- }
59
- catch (error) {
60
- console.warn("Failed to create WebSocket connection - running in offline mode");
61
- dispatch({ type: "SET_CONNECTION_STATUS", payload: false });
62
- }
63
- }, [state.config]);
64
- const handleSocketMessage = useCallback((message) => {
65
- switch (message.type) {
66
- case "message":
67
- dispatch({ type: "ADD_MESSAGE", payload: message.data });
68
- break;
69
- case "typing":
70
- if (message.data.isTyping) {
71
- dispatch({ type: "SET_TYPING", payload: message.data });
72
- }
73
- else {
74
- dispatch({
75
- type: "REMOVE_TYPING",
76
- payload: {
77
- userId: message.data.userId,
78
- conversationId: message.data.conversationId,
79
- },
80
- });
81
- }
82
- break;
83
- case "read":
84
- dispatch({ type: "UPDATE_MESSAGE", payload: message.data });
85
- break;
86
- case "user_status":
87
- dispatch({ type: "UPDATE_USER", payload: message.data });
88
- break;
89
- }
90
- }, [dispatch]);
91
- const sendMessage = useCallback((message) => {
92
- var _a;
93
- if (((_a = socketRef.current) === null || _a === void 0 ? void 0 : _a.readyState) === WebSocket.OPEN) {
94
- socketRef.current.send(JSON.stringify(message));
95
- return true;
96
- }
97
- console.log("WebSocket not connected - message not sent:", message);
98
- return false;
99
- }, []);
100
- const disconnect = useCallback(() => {
101
- if (reconnectTimeoutRef.current) {
102
- clearTimeout(reconnectTimeoutRef.current);
103
- }
104
- if (socketRef.current) {
105
- socketRef.current.close(1000, "Manual disconnect");
106
- socketRef.current = null;
107
- }
108
- reconnectAttempts.current = maxReconnectAttempts;
109
- }, []);
110
- useEffect(() => {
111
- connect();
112
- return disconnect;
113
- }, [connect, disconnect]);
114
- return {
115
- isConnected: state.isConnected,
116
- sendMessage,
117
- disconnect,
118
- reconnect: connect,
119
- };
120
- }
@@ -1,11 +0,0 @@
1
- interface SwipeGestureOptions {
2
- onSwipeRight?: () => void;
3
- onSwipeLeft?: () => void;
4
- threshold?: number;
5
- restraint?: number;
6
- allowedTime?: number;
7
- enabled?: boolean;
8
- }
9
- export declare function useSwipeGesture({ onSwipeRight, onSwipeLeft, threshold, restraint, allowedTime, enabled, }: SwipeGestureOptions): import("react").RefObject<HTMLElement>;
10
- export {};
11
- //# sourceMappingURL=useSwipeGesture.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useSwipeGesture.d.ts","sourceRoot":"","sources":["../../src/hooks/useSwipeGesture.ts"],"names":[],"mappings":"AAIA,UAAU,mBAAmB;IAC3B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAgB,eAAe,CAAC,EAC9B,YAAY,EACZ,WAAW,EACX,SAAe,EACf,SAAe,EACf,WAAiB,EACjB,OAAc,GACf,EAAE,mBAAmB,0CA+DrB"}
@@ -1,54 +0,0 @@
1
- "use client";
2
- import { useEffect, useRef, useCallback } from "react";
3
- export function useSwipeGesture({ onSwipeRight, onSwipeLeft, threshold = 100, restraint = 100, allowedTime = 300, enabled = true, }) {
4
- const touchStartX = useRef(0);
5
- const touchStartY = useRef(0);
6
- const touchStartTime = useRef(0);
7
- const elementRef = useRef(null);
8
- const handleTouchStart = useCallback((e) => {
9
- if (!enabled)
10
- return;
11
- const touch = e.touches[0];
12
- touchStartX.current = touch.clientX;
13
- touchStartY.current = touch.clientY;
14
- touchStartTime.current = Date.now();
15
- }, [enabled]);
16
- const handleTouchEnd = useCallback((e) => {
17
- if (!enabled)
18
- return;
19
- const touch = e.changedTouches[0];
20
- const touchEndX = touch.clientX;
21
- const touchEndY = touch.clientY;
22
- const touchEndTime = Date.now();
23
- const distanceX = touchEndX - touchStartX.current;
24
- const distanceY = touchEndY - touchStartY.current;
25
- const elapsedTime = touchEndTime - touchStartTime.current;
26
- // Check if the swipe meets our criteria
27
- if (elapsedTime <= allowedTime) {
28
- // Check if horizontal distance is sufficient and vertical distance is within restraint
29
- if (Math.abs(distanceX) >= threshold && Math.abs(distanceY) <= restraint) {
30
- if (distanceX > 0) {
31
- // Swipe right
32
- onSwipeRight === null || onSwipeRight === void 0 ? void 0 : onSwipeRight();
33
- }
34
- else {
35
- // Swipe left
36
- onSwipeLeft === null || onSwipeLeft === void 0 ? void 0 : onSwipeLeft();
37
- }
38
- }
39
- }
40
- }, [enabled, threshold, restraint, allowedTime, onSwipeRight, onSwipeLeft]);
41
- useEffect(() => {
42
- const element = elementRef.current;
43
- if (!element || !enabled)
44
- return;
45
- // Add passive event listeners for better performance
46
- element.addEventListener("touchstart", handleTouchStart, { passive: true });
47
- element.addEventListener("touchend", handleTouchEnd, { passive: true });
48
- return () => {
49
- element.removeEventListener("touchstart", handleTouchStart);
50
- element.removeEventListener("touchend", handleTouchEnd);
51
- };
52
- }, [handleTouchStart, handleTouchEnd, enabled]);
53
- return elementRef;
54
- }
@@ -1,13 +0,0 @@
1
- export declare function useTextSelection(): {
2
- textareaRef: import("react").RefObject<HTMLTextAreaElement>;
3
- getSelection: () => {
4
- start: number;
5
- end: number;
6
- selectedText: string;
7
- hasSelection: boolean;
8
- } | null;
9
- replaceSelection: (newText: string, selectReplaced?: boolean) => void;
10
- wrapSelection: (prefix: string, suffix?: string) => void;
11
- applyFormat: (format: string) => void;
12
- };
13
- //# sourceMappingURL=useTextSelection.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useTextSelection.d.ts","sourceRoot":"","sources":["../../src/hooks/useTextSelection.ts"],"names":[],"mappings":"AAIA,wBAAgB,gBAAgB;;;;;;;;gCAmBiB,MAAM;4BA4B1C,MAAM,WAAU,MAAM;0BAqBtB,MAAM;EA0ElB"}
@@ -1,132 +0,0 @@
1
- "use client";
2
- import { useCallback, useRef } from "react";
3
- export function useTextSelection() {
4
- const textareaRef = useRef(null);
5
- const getSelection = useCallback(() => {
6
- const textarea = textareaRef.current;
7
- if (!textarea)
8
- return null;
9
- const start = textarea.selectionStart;
10
- const end = textarea.selectionEnd;
11
- const selectedText = textarea.value.substring(start, end);
12
- return {
13
- start,
14
- end,
15
- selectedText,
16
- hasSelection: start !== end,
17
- };
18
- }, []);
19
- const replaceSelection = useCallback((newText, selectReplaced = false) => {
20
- const textarea = textareaRef.current;
21
- if (!textarea)
22
- return;
23
- const start = textarea.selectionStart;
24
- const end = textarea.selectionEnd;
25
- const value = textarea.value;
26
- const newValue = value.substring(0, start) + newText + value.substring(end);
27
- // Update the textarea value
28
- textarea.value = newValue;
29
- // Trigger change event
30
- const event = new Event("input", { bubbles: true });
31
- textarea.dispatchEvent(event);
32
- // Set cursor position
33
- if (selectReplaced) {
34
- textarea.setSelectionRange(start, start + newText.length);
35
- }
36
- else {
37
- textarea.setSelectionRange(start + newText.length, start + newText.length);
38
- }
39
- textarea.focus();
40
- }, []);
41
- const wrapSelection = useCallback((prefix, suffix = prefix) => {
42
- const selection = getSelection();
43
- if (!selection)
44
- return;
45
- const { selectedText, hasSelection } = selection;
46
- if (hasSelection) {
47
- // Wrap selected text
48
- const wrappedText = `${prefix}${selectedText}${suffix}`;
49
- replaceSelection(wrappedText, true);
50
- }
51
- else {
52
- // Insert formatting markers at cursor
53
- const placeholder = prefix === suffix ? "text" : "link";
54
- const wrappedText = `${prefix}${placeholder}${suffix}`;
55
- replaceSelection(wrappedText, true);
56
- }
57
- }, [getSelection, replaceSelection]);
58
- const applyFormat = useCallback((format) => {
59
- const selection = getSelection();
60
- if (!selection)
61
- return;
62
- const { selectedText, hasSelection, start } = selection;
63
- switch (format) {
64
- case "bold":
65
- wrapSelection("**");
66
- break;
67
- case "italic":
68
- wrapSelection("*");
69
- break;
70
- case "strikethrough":
71
- wrapSelection("~~");
72
- break;
73
- case "code":
74
- wrapSelection("`");
75
- break;
76
- case "quote":
77
- if (hasSelection) {
78
- const quotedText = selectedText
79
- .split("\n")
80
- .map((line) => `> ${line}`)
81
- .join("\n");
82
- replaceSelection(quotedText);
83
- }
84
- else {
85
- replaceSelection("> ");
86
- }
87
- break;
88
- case "link":
89
- if (hasSelection) {
90
- const linkText = `[${selectedText}](url)`;
91
- replaceSelection(linkText, true);
92
- }
93
- else {
94
- replaceSelection("[text](url)", true);
95
- }
96
- break;
97
- case "numbered-list":
98
- if (hasSelection) {
99
- const listText = selectedText
100
- .split("\n")
101
- .map((line, index) => `${index + 1}. ${line}`)
102
- .join("\n");
103
- replaceSelection(listText);
104
- }
105
- else {
106
- replaceSelection("1. ");
107
- }
108
- break;
109
- case "bullet-list":
110
- if (hasSelection) {
111
- const listText = selectedText
112
- .split("\n")
113
- .map((line) => `• ${line}`)
114
- .join("\n");
115
- replaceSelection(listText);
116
- }
117
- else {
118
- replaceSelection("• ");
119
- }
120
- break;
121
- default:
122
- break;
123
- }
124
- }, [getSelection, wrapSelection, replaceSelection]);
125
- return {
126
- textareaRef,
127
- getSelection,
128
- replaceSelection,
129
- wrapSelection,
130
- applyFormat,
131
- };
132
- }
@@ -1,7 +0,0 @@
1
- export declare function useTyping(conversationId: string): {
2
- startTyping: () => void;
3
- stopTyping: () => void;
4
- typingUsers: import("..").User[];
5
- isTyping: boolean;
6
- };
7
- //# sourceMappingURL=useTyping.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useTyping.d.ts","sourceRoot":"","sources":["../../src/hooks/useTyping.ts"],"names":[],"mappings":"AAMA,wBAAgB,SAAS,CAAC,cAAc,EAAE,MAAM;;;;;EAgE/C"}
@@ -1,64 +0,0 @@
1
- "use client";
2
- import { useCallback, useEffect, useRef } from "react";
3
- import { useChatContext } from "../context/ChatContext";
4
- import { useSocket } from "./useSocket";
5
- export function useTyping(conversationId) {
6
- var _a, _b;
7
- const { state } = useChatContext();
8
- const { sendMessage } = useSocket();
9
- const typingTimeoutRef = useRef();
10
- const startTyping = useCallback(() => {
11
- var _a;
12
- if (!((_a = state.config) === null || _a === void 0 ? void 0 : _a.userId) || !conversationId)
13
- return;
14
- sendMessage({
15
- type: "typing",
16
- data: {
17
- userId: state.config.userId,
18
- conversationId,
19
- isTyping: true,
20
- },
21
- });
22
- // Clear existing timeout
23
- if (typingTimeoutRef.current) {
24
- clearTimeout(typingTimeoutRef.current);
25
- }
26
- // Stop typing after 3 seconds of inactivity
27
- typingTimeoutRef.current = setTimeout(() => {
28
- stopTyping();
29
- }, 3000);
30
- }, [(_a = state.config) === null || _a === void 0 ? void 0 : _a.userId, conversationId, sendMessage]);
31
- const stopTyping = useCallback(() => {
32
- var _a;
33
- if (!((_a = state.config) === null || _a === void 0 ? void 0 : _a.userId) || !conversationId)
34
- return;
35
- sendMessage({
36
- type: "typing",
37
- data: {
38
- userId: state.config.userId,
39
- conversationId,
40
- isTyping: false,
41
- },
42
- });
43
- if (typingTimeoutRef.current) {
44
- clearTimeout(typingTimeoutRef.current);
45
- }
46
- }, [(_b = state.config) === null || _b === void 0 ? void 0 : _b.userId, conversationId, sendMessage]);
47
- const typingUsers = state.typingStatuses
48
- .filter((t) => { var _a; return t.conversationId === conversationId && t.userId !== ((_a = state.config) === null || _a === void 0 ? void 0 : _a.userId) && t.isTyping; })
49
- .map((t) => state.users[t.userId])
50
- .filter(Boolean);
51
- useEffect(() => {
52
- return () => {
53
- if (typingTimeoutRef.current) {
54
- clearTimeout(typingTimeoutRef.current);
55
- }
56
- };
57
- }, []);
58
- return {
59
- startTyping,
60
- stopTyping,
61
- typingUsers,
62
- isTyping: typingUsers.length > 0,
63
- };
64
- }
package/dist/index.d.ts DELETED
@@ -1,28 +0,0 @@
1
- export { ChatProvider, useChatContext } from "./context/ChatContext";
2
- export { useChat } from "./hooks/useChat";
3
- export { useMessages } from "./hooks/useMessages";
4
- export { useTyping } from "./hooks/useTyping";
5
- export { useSocket } from "./hooks/useSocket";
6
- export { useTextSelection } from "./hooks/useTextSelection";
7
- export { useSwipeGesture } from "./hooks/useSwipeGesture";
8
- export { ChatLayout } from "./components/ChatLayout";
9
- export { ChatHeader } from "./components/ChatHeader";
10
- export { MessageList } from "./components/MessageList";
11
- export { MessageItem } from "./components/MessageItem";
12
- export { ChatInput } from "./components/ChatInput";
13
- export { ConversationList } from "./components/ConversationList";
14
- export { ConversationItem } from "./components/ConversationItem";
15
- export { DateDivider } from "./components/DateDivider";
16
- export { MessageItemDemo } from "./components/MessageItemDemo";
17
- export { ChatBubble } from "./components/ChatBubble";
18
- export { TypingIndicator } from "./components/TypingIndicator";
19
- export { VoiceWaveIcon } from "./components/VoiceWaveIcon";
20
- export { TextFormattingToolbar } from "./components/TextFormattingToolbar";
21
- export { SwipeIndicator } from "./components/SwipeIndicator";
22
- export { ImagePreviewModal } from "./components/ImagePreviewModal";
23
- export { ChatInputWithCustomIcon } from "./components/ChatInputWithCustomIcon";
24
- export { EmojiPicker } from "./components/EmojiPicker";
25
- export { ChatInputDemo } from "./components/ChatInputDemo";
26
- export { ImageLightbox } from "./components/ImageLightbox";
27
- export type { User, Message, Conversation, TypingStatus, ChatConfig, MessageItemProps, } from "./types";
28
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAGpE,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAGzD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAA;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAA;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAG1D,YAAY,EACV,IAAI,EACJ,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,gBAAgB,GACjB,MAAM,SAAS,CAAA"}
package/dist/index.js DELETED
@@ -1,29 +0,0 @@
1
- // Main exports for the SDK
2
- export { ChatProvider, useChatContext } from "./context/ChatContext";
3
- // Hooks
4
- export { useChat } from "./hooks/useChat";
5
- export { useMessages } from "./hooks/useMessages";
6
- export { useTyping } from "./hooks/useTyping";
7
- export { useSocket } from "./hooks/useSocket";
8
- export { useTextSelection } from "./hooks/useTextSelection";
9
- export { useSwipeGesture } from "./hooks/useSwipeGesture";
10
- // Components
11
- export { ChatLayout } from "./components/ChatLayout";
12
- export { ChatHeader } from "./components/ChatHeader";
13
- export { MessageList } from "./components/MessageList";
14
- export { MessageItem } from "./components/MessageItem";
15
- export { ChatInput } from "./components/ChatInput";
16
- export { ConversationList } from "./components/ConversationList";
17
- export { ConversationItem } from "./components/ConversationItem";
18
- export { DateDivider } from "./components/DateDivider";
19
- export { MessageItemDemo } from "./components/MessageItemDemo";
20
- export { ChatBubble } from "./components/ChatBubble";
21
- export { TypingIndicator } from "./components/TypingIndicator";
22
- export { VoiceWaveIcon } from "./components/VoiceWaveIcon";
23
- export { TextFormattingToolbar } from "./components/TextFormattingToolbar";
24
- export { SwipeIndicator } from "./components/SwipeIndicator";
25
- export { ImagePreviewModal } from "./components/ImagePreviewModal";
26
- export { ChatInputWithCustomIcon } from "./components/ChatInputWithCustomIcon";
27
- export { EmojiPicker } from "./components/EmojiPicker";
28
- export { ChatInputDemo } from "./components/ChatInputDemo";
29
- export { ImageLightbox } from "./components/ImageLightbox";
@@ -1,39 +0,0 @@
1
- import type React from "react";
2
- export interface ChatInputProps {
3
- onSendMessage?: (message: string) => void;
4
- onEmojiClick?: (emoji: string) => void;
5
- onFileUpload?: (file: File) => void;
6
- onImageUpload?: (file: File) => void;
7
- onContactShare?: () => void;
8
- onVoiceRecord?: () => void;
9
- onVoiceMessage?: () => void;
10
- onQuickReact?: () => void;
11
- placeholder?: string;
12
- disabled?: boolean;
13
- className?: string;
14
- onStickerClick?: (sticker: string) => void;
15
- conversationId?: string;
16
- }
17
- export interface EmojiPickerProps {
18
- onEmojiSelect?: (emoji: string) => void;
19
- onClose?: () => void;
20
- isOpen?: boolean;
21
- ref?: React.Ref<HTMLDivElement>;
22
- style?: React.CSSProperties;
23
- }
24
- export interface StickerPickerProps {
25
- onStickerSelect?: (sticker: string) => void;
26
- onClose?: () => void;
27
- isOpen?: boolean;
28
- ref?: React.Ref<HTMLDivElement>;
29
- style?: React.CSSProperties;
30
- }
31
- export interface TextFormattingToolbarProps {
32
- isOpen: boolean;
33
- onClose: () => void;
34
- onFormatSelect: (format: string) => void;
35
- selectedFormats?: string[];
36
- ref?: React.Ref<HTMLDivElement>;
37
- style?: React.CSSProperties;
38
- }
39
- //# sourceMappingURL=chat.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/types/chat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACtC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAA;IACnC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAA;IACpC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IAC3B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;IAC1B,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IAC3B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IAC/B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IAC/B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;CAC5B;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IAC/B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;CAC5B"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,86 +0,0 @@
1
- export type MessageStatus = "sending" | "sent" | "delivered" | "read";
2
- export interface User {
3
- id: string;
4
- name: string;
5
- avatar?: string;
6
- status: "online" | "offline" | "away";
7
- lastSeen?: Date;
8
- }
9
- export interface Message {
10
- id: string;
11
- conversationId: string;
12
- senderId: string;
13
- content: string;
14
- type: "text" | "image" | "file" | "promo";
15
- timestamp: Date;
16
- status: MessageStatus;
17
- attachments?: Attachment[];
18
- promoData?: PromotionalMessageData;
19
- }
20
- export interface Attachment {
21
- id: string;
22
- name: string;
23
- url: string;
24
- type: string;
25
- size: number;
26
- }
27
- export interface Conversation {
28
- id: string;
29
- participants: User[];
30
- lastMessage?: Message;
31
- unreadCount: number;
32
- updatedAt: Date;
33
- type: "direct" | "group";
34
- name?: string;
35
- avatar?: string;
36
- }
37
- export interface TypingStatus {
38
- userId: string;
39
- conversationId: string;
40
- isTyping: boolean;
41
- }
42
- export interface ChatConfig {
43
- userId: string;
44
- token: string;
45
- apiUrl?: string;
46
- wsUrl?: string;
47
- onTokenRefresh?: () => Promise<string>;
48
- }
49
- export interface SocketMessage {
50
- type: "message" | "typing" | "read" | "user_status";
51
- data: any;
52
- }
53
- export type MessageAttachment = {
54
- id: string;
55
- type: "image" | "file";
56
- url: string;
57
- name?: string;
58
- size?: number;
59
- };
60
- export type PromotionalMessageData = {
61
- imageUrl: string;
62
- title: string;
63
- description: string;
64
- buttonText: string;
65
- buttonUrl: string;
66
- };
67
- export type DisplayMessage = {
68
- id: string;
69
- senderId: string;
70
- type: "text" | "media" | "promo";
71
- text?: string;
72
- attachments?: MessageAttachment[];
73
- promoData?: PromotionalMessageData;
74
- createdAt: string;
75
- isMine: boolean;
76
- };
77
- export type MessageItemProps = {
78
- message: DisplayMessage;
79
- isGrouped?: boolean;
80
- onImageClick?: (imageId: string, images: {
81
- id: string;
82
- url: string;
83
- name?: string;
84
- }[]) => void;
85
- };
86
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};