ajaxter-chat 3.0.16 → 3.1.0

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 (147) hide show
  1. package/dist/components/BlockList/index.d.ts +1 -0
  2. package/dist/components/BlockList/index.d.ts.map +1 -0
  3. package/dist/components/BlockList/index.js +55 -28
  4. package/dist/components/BlockList/index.js.map +1 -0
  5. package/dist/components/CallScreen/index.d.ts +3 -0
  6. package/dist/components/CallScreen/index.d.ts.map +1 -0
  7. package/dist/components/CallScreen/index.js +107 -29
  8. package/dist/components/CallScreen/index.js.map +1 -0
  9. package/dist/components/ChatScreen/index.d.ts +1 -0
  10. package/dist/components/ChatScreen/index.d.ts.map +1 -0
  11. package/dist/components/ChatScreen/index.js +493 -294
  12. package/dist/components/ChatScreen/index.js.map +1 -0
  13. package/dist/components/ChatWidget.d.ts +1 -0
  14. package/dist/components/ChatWidget.d.ts.map +1 -0
  15. package/dist/components/ChatWidget.js +359 -250
  16. package/dist/components/ChatWidget.js.map +1 -0
  17. package/dist/components/EmojiPicker/index.d.ts +1 -0
  18. package/dist/components/EmojiPicker/index.d.ts.map +1 -0
  19. package/dist/components/EmojiPicker/index.js +19 -7
  20. package/dist/components/EmojiPicker/index.js.map +1 -0
  21. package/dist/components/ErrorBoundary/index.d.ts +20 -0
  22. package/dist/components/ErrorBoundary/index.d.ts.map +1 -0
  23. package/dist/components/ErrorBoundary/index.js +76 -0
  24. package/dist/components/ErrorBoundary/index.js.map +1 -0
  25. package/dist/components/HomeScreen/index.d.ts +1 -0
  26. package/dist/components/HomeScreen/index.d.ts.map +1 -0
  27. package/dist/components/HomeScreen/index.js +236 -158
  28. package/dist/components/HomeScreen/index.js.map +1 -0
  29. package/dist/components/MaintenanceView/index.d.ts +1 -0
  30. package/dist/components/MaintenanceView/index.d.ts.map +1 -0
  31. package/dist/components/MaintenanceView/index.js +28 -12
  32. package/dist/components/MaintenanceView/index.js.map +1 -0
  33. package/dist/components/MiniCallBar/index.d.ts +15 -0
  34. package/dist/components/MiniCallBar/index.d.ts.map +1 -0
  35. package/dist/components/MiniCallBar/index.js +116 -0
  36. package/dist/components/MiniCallBar/index.js.map +1 -0
  37. package/dist/components/PermissionsGateScreen/index.d.ts +1 -0
  38. package/dist/components/PermissionsGateScreen/index.d.ts.map +1 -0
  39. package/dist/components/PermissionsGateScreen/index.js +82 -28
  40. package/dist/components/PermissionsGateScreen/index.js.map +1 -0
  41. package/dist/components/RecentChatsScreen/index.d.ts +1 -0
  42. package/dist/components/RecentChatsScreen/index.d.ts.map +1 -0
  43. package/dist/components/RecentChatsScreen/index.js +79 -19
  44. package/dist/components/RecentChatsScreen/index.js.map +1 -0
  45. package/dist/components/SlideNavMenu.d.ts +1 -0
  46. package/dist/components/SlideNavMenu.d.ts.map +1 -0
  47. package/dist/components/SlideNavMenu.js +82 -63
  48. package/dist/components/SlideNavMenu.js.map +1 -0
  49. package/dist/components/Tabs/BottomTabs.d.ts +1 -0
  50. package/dist/components/Tabs/BottomTabs.d.ts.map +1 -0
  51. package/dist/components/Tabs/BottomTabs.js +34 -19
  52. package/dist/components/Tabs/BottomTabs.js.map +1 -0
  53. package/dist/components/TicketDetailScreen/index.d.ts +1 -0
  54. package/dist/components/TicketDetailScreen/index.d.ts.map +1 -0
  55. package/dist/components/TicketDetailScreen/index.js +66 -27
  56. package/dist/components/TicketDetailScreen/index.js.map +1 -0
  57. package/dist/components/TicketFormScreen/index.d.ts +1 -0
  58. package/dist/components/TicketFormScreen/index.d.ts.map +1 -0
  59. package/dist/components/TicketFormScreen/index.js +99 -49
  60. package/dist/components/TicketFormScreen/index.js.map +1 -0
  61. package/dist/components/TicketScreen/index.d.ts +1 -0
  62. package/dist/components/TicketScreen/index.d.ts.map +1 -0
  63. package/dist/components/TicketScreen/index.js +95 -26
  64. package/dist/components/TicketScreen/index.js.map +1 -0
  65. package/dist/components/UserListScreen/index.d.ts +1 -0
  66. package/dist/components/UserListScreen/index.d.ts.map +1 -0
  67. package/dist/components/UserListScreen/index.js +127 -53
  68. package/dist/components/UserListScreen/index.js.map +1 -0
  69. package/dist/components/ViewerBlockedScreen/index.d.ts +1 -0
  70. package/dist/components/ViewerBlockedScreen/index.d.ts.map +1 -0
  71. package/dist/components/ViewerBlockedScreen/index.js +113 -61
  72. package/dist/components/ViewerBlockedScreen/index.js.map +1 -0
  73. package/dist/config/index.d.ts +1 -0
  74. package/dist/config/index.d.ts.map +1 -0
  75. package/dist/config/index.js +7 -2
  76. package/dist/config/index.js.map +1 -0
  77. package/dist/hooks/useChat.d.ts +9 -1
  78. package/dist/hooks/useChat.d.ts.map +1 -0
  79. package/dist/hooks/useChat.js +60 -18
  80. package/dist/hooks/useChat.js.map +1 -0
  81. package/dist/hooks/useRemoteConfig.d.ts +1 -0
  82. package/dist/hooks/useRemoteConfig.d.ts.map +1 -0
  83. package/dist/hooks/useRemoteConfig.js +12 -8
  84. package/dist/hooks/useRemoteConfig.js.map +1 -0
  85. package/dist/hooks/useSocket.d.ts +40 -0
  86. package/dist/hooks/useSocket.d.ts.map +1 -0
  87. package/dist/hooks/useSocket.js +190 -0
  88. package/dist/hooks/useSocket.js.map +1 -0
  89. package/dist/hooks/useWebRTC.d.ts +10 -2
  90. package/dist/hooks/useWebRTC.d.ts.map +1 -0
  91. package/dist/hooks/useWebRTC.js +101 -69
  92. package/dist/hooks/useWebRTC.js.map +1 -0
  93. package/dist/index.d.ts +6 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +67 -21
  96. package/dist/index.js.map +1 -0
  97. package/dist/types/index.d.ts +1 -0
  98. package/dist/types/index.d.ts.map +1 -0
  99. package/dist/types/index.js +3 -1
  100. package/dist/types/index.js.map +1 -0
  101. package/dist/utils/chat.d.ts +1 -0
  102. package/dist/utils/chat.d.ts.map +1 -0
  103. package/dist/utils/chat.js +17 -7
  104. package/dist/utils/chat.js.map +1 -0
  105. package/dist/utils/fileName.d.ts +1 -0
  106. package/dist/utils/fileName.d.ts.map +1 -0
  107. package/dist/utils/fileName.js +5 -1
  108. package/dist/utils/fileName.js.map +1 -0
  109. package/dist/utils/messageSound.d.ts +1 -0
  110. package/dist/utils/messageSound.d.ts.map +1 -0
  111. package/dist/utils/messageSound.js +9 -3
  112. package/dist/utils/messageSound.js.map +1 -0
  113. package/dist/utils/presenceStatus.d.ts +1 -0
  114. package/dist/utils/presenceStatus.d.ts.map +1 -0
  115. package/dist/utils/presenceStatus.js +11 -4
  116. package/dist/utils/presenceStatus.js.map +1 -0
  117. package/dist/utils/privacyConsent.d.ts +1 -0
  118. package/dist/utils/privacyConsent.d.ts.map +1 -0
  119. package/dist/utils/privacyConsent.js +9 -3
  120. package/dist/utils/privacyConsent.js.map +1 -0
  121. package/dist/utils/reenableRequest.d.ts +1 -0
  122. package/dist/utils/reenableRequest.d.ts.map +1 -0
  123. package/dist/utils/reenableRequest.js +5 -1
  124. package/dist/utils/reenableRequest.js.map +1 -0
  125. package/dist/utils/theme.d.ts +1 -0
  126. package/dist/utils/theme.d.ts.map +1 -0
  127. package/dist/utils/theme.js +10 -4
  128. package/dist/utils/theme.js.map +1 -0
  129. package/dist/utils/widgetPermissions.d.ts +1 -0
  130. package/dist/utils/widgetPermissions.d.ts.map +1 -0
  131. package/dist/utils/widgetPermissions.js +13 -5
  132. package/dist/utils/widgetPermissions.js.map +1 -0
  133. package/dist/utils/widgetSession.d.ts +1 -0
  134. package/dist/utils/widgetSession.d.ts.map +1 -0
  135. package/dist/utils/widgetSession.js +9 -3
  136. package/dist/utils/widgetSession.js.map +1 -0
  137. package/package.json +3 -3
  138. package/src/components/CallScreen/index.tsx +23 -1
  139. package/src/components/ChatScreen/index.tsx +2 -1
  140. package/src/components/ChatWidget.tsx +314 -263
  141. package/src/components/ErrorBoundary/index.tsx +62 -0
  142. package/src/components/HomeScreen/index.tsx +0 -3
  143. package/src/components/MiniCallBar/index.tsx +150 -0
  144. package/src/hooks/useChat.ts +59 -12
  145. package/src/hooks/useSocket.ts +228 -0
  146. package/src/hooks/useWebRTC.ts +99 -64
  147. package/src/index.ts +7 -2
@@ -1,30 +1,72 @@
1
- import { useState, useCallback } from 'react';
2
- export function useChat(initialMessages = []) {
3
- const [messages, setMessages] = useState(initialMessages);
4
- const [activeUser, setActiveUser] = useState(null);
5
- const [isPaused, setIsPaused] = useState(false);
6
- const [isReported, setIsReported] = useState(false);
7
- const selectUser = useCallback((user, history = []) => {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useChat = useChat;
4
+ const react_1 = require("react");
5
+ function useChat(initialMessages = [], opts = {}) {
6
+ const [messages, setMessages] = (0, react_1.useState)(initialMessages);
7
+ const [activeUser, setActiveUser] = (0, react_1.useState)(null);
8
+ const [isPaused, setIsPaused] = (0, react_1.useState)(false);
9
+ const [isReported, setIsReported] = (0, react_1.useState)(false);
10
+ const activeUserRef = (0, react_1.useRef)(null);
11
+ const isPausedRef = (0, react_1.useRef)(false);
12
+ const { onEmitMessage, onEmitPause, onEmitReport } = opts;
13
+ const selectUser = (0, react_1.useCallback)((user, history = []) => {
8
14
  setActiveUser(user);
15
+ activeUserRef.current = user;
9
16
  setMessages(history);
10
17
  setIsPaused(false);
18
+ isPausedRef.current = false;
11
19
  setIsReported(false);
12
- // TODO: socket.emit('join', { roomId: user.uid });
13
- // TODO: socket.on('message', msg => setMessages(prev => [...prev, msg]));
14
20
  }, []);
15
- const sendMessage = useCallback((text, type = 'text', extra = {}) => {
16
- if (!activeUser || isPaused)
21
+ const sendMessage = (0, react_1.useCallback)((text, type = 'text', extra = {}) => {
22
+ const user = activeUserRef.current;
23
+ if (!user || isPausedRef.current)
17
24
  return;
18
- const msg = Object.assign({ id: `msg_${Date.now()}_${Math.random().toString(36).slice(2)}`, senderId: 'me', receiverId: activeUser.uid, text, timestamp: new Date().toISOString(), type, status: 'sent' }, extra);
25
+ const msg = Object.assign({ id: `msg_${Date.now()}_${Math.random().toString(36).slice(2)}`, senderId: 'me', receiverId: user.uid, text, timestamp: new Date().toISOString(), type, status: 'sent' }, extra);
19
26
  setMessages(prev => [...prev, msg]);
20
- // TODO: socket.emit('message', msg);
21
- }, [activeUser, isPaused]);
22
- const togglePause = useCallback(() => setIsPaused(p => !p), []);
23
- const reportChat = useCallback(() => { setIsReported(true); /* TODO: API call */ }, []);
24
- const clearChat = useCallback(() => { setMessages([]); setActiveUser(null); }, []);
27
+ onEmitMessage === null || onEmitMessage === void 0 ? void 0 : onEmitMessage(msg);
28
+ }, [onEmitMessage]);
29
+ const receiveMessage = (0, react_1.useCallback)((msg) => {
30
+ setMessages(prev => {
31
+ if (prev.some(m => m.id === msg.id))
32
+ return prev;
33
+ return [...prev, msg];
34
+ });
35
+ }, []);
36
+ const updateMessageStatus = (0, react_1.useCallback)((messageId, status) => {
37
+ setMessages(prev => prev.map(m => m.id === messageId ? Object.assign(Object.assign({}, m), { status }) : m));
38
+ }, []);
39
+ const togglePause = (0, react_1.useCallback)(() => {
40
+ const user = activeUserRef.current;
41
+ if (!user)
42
+ return;
43
+ const next = !isPausedRef.current;
44
+ setIsPaused(next);
45
+ isPausedRef.current = next;
46
+ const roomId = [user.uid, 'me'].sort().join('_');
47
+ onEmitPause === null || onEmitPause === void 0 ? void 0 : onEmitPause(roomId, user.uid, next);
48
+ }, [onEmitPause]);
49
+ const reportChat = (0, react_1.useCallback)(() => {
50
+ const user = activeUserRef.current;
51
+ setIsReported(true);
52
+ if (user) {
53
+ const roomId = [user.uid, 'me'].sort().join('_');
54
+ onEmitReport === null || onEmitReport === void 0 ? void 0 : onEmitReport(roomId);
55
+ }
56
+ }, [onEmitReport]);
57
+ const clearChat = (0, react_1.useCallback)(() => {
58
+ setMessages([]);
59
+ setActiveUser(null);
60
+ activeUserRef.current = null;
61
+ setIsPaused(false);
62
+ isPausedRef.current = false;
63
+ setIsReported(false);
64
+ }, []);
25
65
  return {
26
66
  messages, activeUser, isPaused, isReported,
27
- selectUser, sendMessage, togglePause, reportChat, clearChat,
67
+ selectUser, sendMessage, receiveMessage, updateMessageStatus,
68
+ togglePause, reportChat, clearChat,
28
69
  setMessages,
29
70
  };
30
71
  }
72
+ //# sourceMappingURL=useChat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChat.js","sourceRoot":"","sources":["../../src/hooks/useChat.ts"],"names":[],"mappings":"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"}
@@ -4,3 +4,4 @@ export declare function useRemoteConfig(apiKey: string, widgetId: string): {
4
4
  loading: boolean;
5
5
  error: string | null;
6
6
  };
7
+ //# sourceMappingURL=useRemoteConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRemoteConfig.d.ts","sourceRoot":"","sources":["../../src/hooks/useRemoteConfig.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG1C,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;;;;EAqB/D"}
@@ -1,13 +1,16 @@
1
- import { useState, useEffect } from 'react';
2
- import { fetchRemoteChatData } from '../config';
3
- export function useRemoteConfig(apiKey, widgetId) {
4
- const [data, setData] = useState(null);
5
- const [loading, setLoading] = useState(true);
6
- const [error, setError] = useState(null);
7
- useEffect(() => {
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useRemoteConfig = useRemoteConfig;
4
+ const react_1 = require("react");
5
+ const config_1 = require("../config");
6
+ function useRemoteConfig(apiKey, widgetId) {
7
+ const [data, setData] = (0, react_1.useState)(null);
8
+ const [loading, setLoading] = (0, react_1.useState)(true);
9
+ const [error, setError] = (0, react_1.useState)(null);
10
+ (0, react_1.useEffect)(() => {
8
11
  let cancelled = false;
9
12
  setLoading(true);
10
- fetchRemoteChatData(apiKey, widgetId)
13
+ (0, config_1.fetchRemoteChatData)(apiKey, widgetId)
11
14
  .then(d => { if (!cancelled) {
12
15
  setData(d);
13
16
  setError(null);
@@ -24,3 +27,4 @@ export function useRemoteConfig(apiKey, widgetId) {
24
27
  }, [apiKey, widgetId]);
25
28
  return { data, loading, error };
26
29
  }
30
+ //# sourceMappingURL=useRemoteConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRemoteConfig.js","sourceRoot":"","sources":["../../src/hooks/useRemoteConfig.ts"],"names":[],"mappings":";;AAIA,0CAqBC;AAzBD,iCAA4C;AAE5C,sCAAgD;AAEhD,SAAgB,eAAe,CAAC,MAAc,EAAE,QAAgB;IAC9D,MAAM,CAAC,IAAI,EAAK,OAAO,CAAC,GAAM,IAAA,gBAAQ,EAAwB,IAAI,CAAC,CAAC;IACpE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,IAAA,gBAAQ,EAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAI,QAAQ,CAAC,GAAK,IAAA,gBAAQ,EAAgB,IAAI,CAAC,CAAC;IAE5D,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,IAAA,4BAAmB,EAAC,MAAM,EAAE,QAAQ,CAAC;aAClC,IAAI,CAAC,CAAC,CAAE,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAAC,CAAC,CAAC,CAAC,CAAC;aAClF,KAAK,CAAC,CAAC,CAAC,EAAE;YACT,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACvD,QAAQ,CAAC,GAAG,IAAI,2CAA2C,CAAC,CAAC;gBAC7D,UAAU,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;QACH,CAAC,CAAC,CAAC;QACL,OAAO,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEvB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { ChatMessage } from '../types';
2
+ export type SocketStatus = 'connecting' | 'connected' | 'disconnected' | 'error';
3
+ export interface SocketMessageAck {
4
+ messageId: string;
5
+ status: 'delivered' | 'read';
6
+ }
7
+ export interface UseSocketOptions {
8
+ widgetId: string;
9
+ viewerUid: string;
10
+ /** WebSocket server URL — defaults to http://localhost:3005 */
11
+ serverUrl?: string;
12
+ onMessage?: (msg: ChatMessage) => void;
13
+ onMessageAck?: (ack: SocketMessageAck) => void;
14
+ onChatPaused?: (roomId: string, paused: boolean) => void;
15
+ onCallOffer?: (offer: RTCSessionDescriptionInit, fromUid: string, callId: string) => void;
16
+ onCallAnswer?: (answer: RTCSessionDescriptionInit, fromUid: string, callId: string) => void;
17
+ onIceCandidate?: (candidate: RTCIceCandidateInit, fromUid: string) => void;
18
+ onCallEnd?: (callId: string) => void;
19
+ onError?: (code: string, message: string) => void;
20
+ onUserStatus?: (uid: string, status: 'online' | 'away' | 'offline') => void;
21
+ }
22
+ export declare function useSocket(opts: UseSocketOptions): {
23
+ status: SocketStatus;
24
+ joinRoom: (roomId: string) => void;
25
+ leaveRoom: (roomId: string) => void;
26
+ emitMessage: (msg: ChatMessage) => void;
27
+ emitTypingStart: (roomId: string) => void;
28
+ emitTypingStop: (roomId: string) => void;
29
+ emitPauseToggle: (roomId: string, targetUserId: string, paused: boolean) => void;
30
+ emitReport: (roomId: string, reason?: string) => void;
31
+ emitBlock: (blockedUid: string) => void;
32
+ emitUnblock: (blockedUid: string) => void;
33
+ emitTransfer: (fromRoomId: string, toUserId: string, note?: string) => void;
34
+ emitCallOffer: (offer: RTCSessionDescriptionInit, toUid: string, callId: string) => void;
35
+ emitCallAnswer: (answer: RTCSessionDescriptionInit, toUid: string, callId: string) => void;
36
+ emitIceCandidate: (candidate: RTCIceCandidateInit, toUid: string) => void;
37
+ emitCallEnd: (callId: string, toUid?: string) => void;
38
+ emitAddParticipant: (roomId: string, uid: string) => void;
39
+ };
40
+ //# sourceMappingURL=useSocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSocket.d.ts","sourceRoot":"","sources":["../../src/hooks/useSocket.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,GAAG,OAAO,CAAC;AAEjF,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC/C,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACzD,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1F,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5F,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3E,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CAC7E;AAMD,wBAAgB,SAAS,CAAC,IAAI,EAAE,gBAAgB;;uBA6HR,MAAM;wBAKL,MAAM;uBAKP,WAAW;8BAIJ,MAAM;6BAIP,MAAM;8BAIL,MAAM,gBAAgB,MAAM,UAAU,OAAO;yBAIlD,MAAM,WAAW,MAAM;4BAIpB,MAAM;8BAIJ,MAAM;+BAIL,MAAM,YAAY,MAAM,SAAS,MAAM;2BAI3C,yBAAyB,SAAS,MAAM,UAAU,MAAM;6BAItD,yBAAyB,SAAS,MAAM,UAAU,MAAM;kCAInD,mBAAmB,SAAS,MAAM;0BAI1C,MAAM,UAAU,MAAM;iCAIf,MAAM,OAAO,MAAM;EAYpE"}
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.useSocket = useSocket;
5
+ const react_1 = require("react");
6
+ const SOCKET_URL = 'http://localhost:3005';
7
+ const RECONNECT_DELAY = 3000;
8
+ const MAX_RECONNECT = 5;
9
+ function useSocket(opts) {
10
+ const { widgetId, viewerUid, serverUrl = SOCKET_URL, onMessage, onMessageAck, onChatPaused, onCallOffer, onCallAnswer, onIceCandidate, onCallEnd, onError, onUserStatus, } = opts;
11
+ const [status, setStatus] = (0, react_1.useState)('disconnected');
12
+ const wsRef = (0, react_1.useRef)(null);
13
+ const reconnectCount = (0, react_1.useRef)(0);
14
+ const reconnectTimer = (0, react_1.useRef)(null);
15
+ const currentRoomRef = (0, react_1.useRef)(null);
16
+ const mountedRef = (0, react_1.useRef)(true);
17
+ const send = (0, react_1.useCallback)((event, payload) => {
18
+ var _a;
19
+ if (((_a = wsRef.current) === null || _a === void 0 ? void 0 : _a.readyState) === WebSocket.OPEN) {
20
+ wsRef.current.send(JSON.stringify({ event, payload }));
21
+ }
22
+ }, []);
23
+ const connect = (0, react_1.useCallback)(() => {
24
+ if (!mountedRef.current)
25
+ return;
26
+ if (wsRef.current) {
27
+ wsRef.current.onclose = null;
28
+ wsRef.current.close();
29
+ }
30
+ setStatus('connecting');
31
+ const url = `${serverUrl}?widgetId=${encodeURIComponent(widgetId)}&uid=${encodeURIComponent(viewerUid)}`;
32
+ let ws;
33
+ try {
34
+ ws = new WebSocket(url);
35
+ }
36
+ catch (e) {
37
+ setStatus('error');
38
+ return;
39
+ }
40
+ wsRef.current = ws;
41
+ ws.onopen = () => {
42
+ if (!mountedRef.current) {
43
+ ws.close();
44
+ return;
45
+ }
46
+ reconnectCount.current = 0;
47
+ setStatus('connected');
48
+ // Re-join current room if we were in one
49
+ if (currentRoomRef.current) {
50
+ send('join', { roomId: currentRoomRef.current, widgetId });
51
+ }
52
+ };
53
+ ws.onmessage = (event) => {
54
+ let parsed;
55
+ try {
56
+ parsed = JSON.parse(event.data);
57
+ }
58
+ catch (_a) {
59
+ return;
60
+ }
61
+ const { event: ev, payload } = parsed;
62
+ switch (ev) {
63
+ case 'message':
64
+ onMessage === null || onMessage === void 0 ? void 0 : onMessage(payload);
65
+ break;
66
+ case 'message:ack':
67
+ onMessageAck === null || onMessageAck === void 0 ? void 0 : onMessageAck(payload);
68
+ break;
69
+ case 'chat:paused': {
70
+ const p = payload;
71
+ onChatPaused === null || onChatPaused === void 0 ? void 0 : onChatPaused(p.roomId, p.paused);
72
+ break;
73
+ }
74
+ case 'call-offer': {
75
+ const p = payload;
76
+ onCallOffer === null || onCallOffer === void 0 ? void 0 : onCallOffer(p.offer, p.from, p.callId);
77
+ break;
78
+ }
79
+ case 'call-answer': {
80
+ const p = payload;
81
+ onCallAnswer === null || onCallAnswer === void 0 ? void 0 : onCallAnswer(p.answer, p.from, p.callId);
82
+ break;
83
+ }
84
+ case 'ice-candidate': {
85
+ const p = payload;
86
+ onIceCandidate === null || onIceCandidate === void 0 ? void 0 : onIceCandidate(p.candidate, p.from);
87
+ break;
88
+ }
89
+ case 'call-end': {
90
+ const p = payload;
91
+ onCallEnd === null || onCallEnd === void 0 ? void 0 : onCallEnd(p.callId);
92
+ break;
93
+ }
94
+ case 'user:status': {
95
+ const p = payload;
96
+ onUserStatus === null || onUserStatus === void 0 ? void 0 : onUserStatus(p.uid, p.status);
97
+ break;
98
+ }
99
+ case 'error': {
100
+ const p = payload;
101
+ onError === null || onError === void 0 ? void 0 : onError(p.code, p.message);
102
+ break;
103
+ }
104
+ }
105
+ };
106
+ ws.onerror = () => {
107
+ if (!mountedRef.current)
108
+ return;
109
+ setStatus('error');
110
+ };
111
+ ws.onclose = () => {
112
+ if (!mountedRef.current)
113
+ return;
114
+ setStatus('disconnected');
115
+ if (reconnectCount.current < MAX_RECONNECT) {
116
+ reconnectCount.current++;
117
+ reconnectTimer.current = setTimeout(connect, RECONNECT_DELAY * reconnectCount.current);
118
+ }
119
+ };
120
+ }, [widgetId, viewerUid, serverUrl, send, onMessage, onMessageAck, onChatPaused, onCallOffer, onCallAnswer, onIceCandidate, onCallEnd, onError, onUserStatus]);
121
+ (0, react_1.useEffect)(() => {
122
+ mountedRef.current = true;
123
+ if (widgetId && viewerUid)
124
+ connect();
125
+ return () => {
126
+ var _a;
127
+ mountedRef.current = false;
128
+ if (reconnectTimer.current)
129
+ clearTimeout(reconnectTimer.current);
130
+ (_a = wsRef.current) === null || _a === void 0 ? void 0 : _a.close();
131
+ };
132
+ // eslint-disable-next-line react-hooks/exhaustive-deps
133
+ }, [widgetId, viewerUid, serverUrl]);
134
+ const joinRoom = (0, react_1.useCallback)((roomId) => {
135
+ currentRoomRef.current = roomId;
136
+ send('join', { roomId, widgetId });
137
+ }, [send, widgetId]);
138
+ const leaveRoom = (0, react_1.useCallback)((roomId) => {
139
+ currentRoomRef.current = null;
140
+ send('leave', { roomId });
141
+ }, [send]);
142
+ const emitMessage = (0, react_1.useCallback)((msg) => {
143
+ send('message', msg);
144
+ }, [send]);
145
+ const emitTypingStart = (0, react_1.useCallback)((roomId) => {
146
+ send('typing_start', { roomId, userId: viewerUid });
147
+ }, [send, viewerUid]);
148
+ const emitTypingStop = (0, react_1.useCallback)((roomId) => {
149
+ send('typing_stop', { roomId, userId: viewerUid });
150
+ }, [send, viewerUid]);
151
+ const emitPauseToggle = (0, react_1.useCallback)((roomId, targetUserId, paused) => {
152
+ send('chat:pause', { roomId, targetUserId, paused });
153
+ }, [send]);
154
+ const emitReport = (0, react_1.useCallback)((roomId, reason) => {
155
+ send('chat:report', { roomId, reporterId: viewerUid, reason });
156
+ }, [send, viewerUid]);
157
+ const emitBlock = (0, react_1.useCallback)((blockedUid) => {
158
+ send('user:block', { blockedUid });
159
+ }, [send]);
160
+ const emitUnblock = (0, react_1.useCallback)((blockedUid) => {
161
+ send('user:unblock', { blockedUid });
162
+ }, [send]);
163
+ const emitTransfer = (0, react_1.useCallback)((fromRoomId, toUserId, note) => {
164
+ send('transfer', { fromRoomId, toUserId, note });
165
+ }, [send]);
166
+ const emitCallOffer = (0, react_1.useCallback)((offer, toUid, callId) => {
167
+ send('call-offer', { offer, to: toUid, from: viewerUid, callId });
168
+ }, [send, viewerUid]);
169
+ const emitCallAnswer = (0, react_1.useCallback)((answer, toUid, callId) => {
170
+ send('call-answer', { answer, to: toUid, callId });
171
+ }, [send]);
172
+ const emitIceCandidate = (0, react_1.useCallback)((candidate, toUid) => {
173
+ send('ice-candidate', { candidate, to: toUid });
174
+ }, [send]);
175
+ const emitCallEnd = (0, react_1.useCallback)((callId, toUid) => {
176
+ send('call-end', { callId, to: toUid });
177
+ }, [send]);
178
+ const emitAddParticipant = (0, react_1.useCallback)((roomId, uid) => {
179
+ send('room:add-participant', { roomId, uid });
180
+ }, [send]);
181
+ return {
182
+ status,
183
+ joinRoom, leaveRoom,
184
+ emitMessage, emitTypingStart, emitTypingStop,
185
+ emitPauseToggle, emitReport, emitBlock, emitUnblock, emitTransfer,
186
+ emitCallOffer, emitCallAnswer, emitIceCandidate, emitCallEnd,
187
+ emitAddParticipant,
188
+ };
189
+ }
190
+ //# sourceMappingURL=useSocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSocket.js","sourceRoot":"","sources":["../../src/hooks/useSocket.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,19 @@
1
1
  import { CallSession, ChatUser } from '../types';
2
- export declare function useWebRTC(): {
2
+ export interface UseWebRTCOptions {
3
+ onOfferReady?: (offer: RTCSessionDescriptionInit, toUid: string, callId: string) => void;
4
+ onAnswerReady?: (answer: RTCSessionDescriptionInit, toUid: string, callId: string) => void;
5
+ onIceCandidateReady?: (candidate: RTCIceCandidateInit, toUid: string) => void;
6
+ onCallEnded?: (callId: string, toUid?: string) => void;
7
+ }
8
+ export declare function useWebRTC(opts?: UseWebRTCOptions): {
3
9
  session: CallSession;
4
10
  localVideoRef: import("react").MutableRefObject<HTMLVideoElement | null>;
5
11
  remoteVideoRef: import("react").MutableRefObject<HTMLVideoElement | null>;
6
12
  startCall: (peer: ChatUser, withVideo?: boolean) => Promise<void>;
7
- acceptCall: (offer: RTCSessionDescriptionInit, peer: ChatUser, withVideo?: boolean) => Promise<void>;
13
+ acceptCall: (offer: RTCSessionDescriptionInit, peer: ChatUser, callId: string, withVideo?: boolean) => Promise<void>;
14
+ addIceCandidate: (candidate: RTCIceCandidateInit) => Promise<void>;
8
15
  endCall: () => void;
9
16
  toggleMute: () => void;
10
17
  toggleCamera: () => void;
11
18
  };
19
+ //# sourceMappingURL=useWebRTC.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useWebRTC.d.ts","sourceRoot":"","sources":["../../src/hooks/useWebRTC.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAa,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE5D,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACzF,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,yBAAyB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3F,mBAAmB,CAAC,EAAE,CAAC,SAAS,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9E,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACxD;AAOD,wBAAgB,SAAS,CAAC,IAAI,GAAE,gBAAqB;;;;sBA+CR,QAAQ;wBA8B1C,yBAAyB,QAC1B,QAAQ,UACN,MAAM;iCAyBsC,mBAAmB;;;;EA6C1E"}
@@ -1,112 +1,144 @@
1
- import { useState, useRef, useCallback, useEffect } from 'react';
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useWebRTC = useWebRTC;
4
+ const react_1 = require("react");
2
5
  const ICE_SERVERS = [
3
6
  { urls: 'stun:stun.l.google.com:19302' },
4
7
  { urls: 'stun:stun1.l.google.com:19302' },
5
8
  ];
6
- export function useWebRTC() {
7
- const [session, setSession] = useState({
9
+ function useWebRTC(opts = {}) {
10
+ const { onOfferReady, onAnswerReady, onIceCandidateReady, onCallEnded } = opts;
11
+ const [session, setSession] = (0, react_1.useState)({
8
12
  state: 'idle',
9
13
  peer: null,
10
14
  startedAt: null,
11
15
  isMuted: false,
12
16
  isCameraOn: false,
13
17
  });
14
- const pcRef = useRef(null);
15
- const localStream = useRef(null);
16
- const localVideoRef = useRef(null);
17
- const remoteVideoRef = useRef(null);
18
- const updateSession = (patch) => setSession(prev => (Object.assign(Object.assign({}, prev), patch)));
19
- /** Start an outgoing call */
20
- const startCall = useCallback(async (peer, withVideo = false) => {
21
- updateSession({ state: 'calling', peer });
22
- const stream = await navigator.mediaDevices.getUserMedia({
23
- audio: true,
24
- video: withVideo,
25
- });
26
- localStream.current = stream;
27
- if (localVideoRef.current)
28
- localVideoRef.current.srcObject = stream;
18
+ const pcRef = (0, react_1.useRef)(null);
19
+ const localStream = (0, react_1.useRef)(null);
20
+ const localVideoRef = (0, react_1.useRef)(null);
21
+ const remoteVideoRef = (0, react_1.useRef)(null);
22
+ const currentCallId = (0, react_1.useRef)(null);
23
+ const peerUidRef = (0, react_1.useRef)(null);
24
+ const updateSession = (0, react_1.useCallback)((patch) => setSession(prev => (Object.assign(Object.assign({}, prev), patch))), []);
25
+ const buildPc = (0, react_1.useCallback)((peer) => {
29
26
  const pc = new RTCPeerConnection({ iceServers: ICE_SERVERS });
30
27
  pcRef.current = pc;
31
- stream.getTracks().forEach(t => pc.addTrack(t, stream));
28
+ peerUidRef.current = peer.uid;
32
29
  pc.ontrack = e => {
33
30
  if (remoteVideoRef.current)
34
31
  remoteVideoRef.current.srcObject = e.streams[0];
35
- updateSession({ state: 'connected', startedAt: new Date(), isCameraOn: withVideo });
32
+ updateSession({ state: 'connected', startedAt: new Date() });
36
33
  };
37
34
  pc.onicecandidate = e => {
38
- if (e.candidate) {
39
- // TODO: socket.emit('ice-candidate', { candidate: e.candidate, to: peer.uid });
40
- console.log('[WebRTC] ICE candidate ready — send via signalling:', e.candidate);
35
+ if (e.candidate && peerUidRef.current) {
36
+ onIceCandidateReady === null || onIceCandidateReady === void 0 ? void 0 : onIceCandidateReady(e.candidate.toJSON(), peerUidRef.current);
41
37
  }
42
38
  };
43
- const offer = await pc.createOffer();
44
- await pc.setLocalDescription(offer);
45
- // TODO: socket.emit('call-offer', { offer, to: peer.uid, from: 'me' });
46
- console.log('[WebRTC] Offer created send via signalling server:', offer);
47
- }, []);
48
- /** Accept an incoming call offer */
49
- const acceptCall = useCallback(async (offer, peer, withVideo = false) => {
39
+ pc.onconnectionstatechange = () => {
40
+ if (pc.connectionState === 'failed' || pc.connectionState === 'disconnected') {
41
+ updateSession({ state: 'ended' });
42
+ setTimeout(() => updateSession({ state: 'idle' }), 1800);
43
+ }
44
+ };
45
+ return pc;
46
+ }, [onIceCandidateReady, updateSession]);
47
+ const startCall = (0, react_1.useCallback)(async (peer, withVideo = false) => {
48
+ const callId = `call_${Date.now()}`;
49
+ currentCallId.current = callId;
50
+ updateSession({ state: 'calling', peer });
51
+ let stream;
52
+ try {
53
+ stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: withVideo });
54
+ }
55
+ catch (err) {
56
+ console.error('[WebRTC] getUserMedia failed:', err);
57
+ updateSession({ state: 'idle' });
58
+ return;
59
+ }
60
+ localStream.current = stream;
61
+ if (localVideoRef.current)
62
+ localVideoRef.current.srcObject = stream;
63
+ const pc = buildPc(peer);
64
+ stream.getTracks().forEach(t => pc.addTrack(t, stream));
65
+ try {
66
+ const offer = await pc.createOffer();
67
+ await pc.setLocalDescription(offer);
68
+ onOfferReady === null || onOfferReady === void 0 ? void 0 : onOfferReady(offer, peer.uid, callId);
69
+ updateSession({ isCameraOn: withVideo });
70
+ }
71
+ catch (err) {
72
+ console.error('[WebRTC] createOffer failed:', err);
73
+ }
74
+ }, [buildPc, onOfferReady, updateSession]);
75
+ const acceptCall = (0, react_1.useCallback)(async (offer, peer, callId, withVideo = false) => {
76
+ currentCallId.current = callId;
50
77
  updateSession({ state: 'connected', peer, startedAt: new Date(), isCameraOn: withVideo });
51
- const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: withVideo });
78
+ let stream;
79
+ try {
80
+ stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: withVideo });
81
+ }
82
+ catch (err) {
83
+ console.error('[WebRTC] getUserMedia failed:', err);
84
+ return;
85
+ }
52
86
  localStream.current = stream;
53
87
  if (localVideoRef.current)
54
88
  localVideoRef.current.srcObject = stream;
55
- const pc = new RTCPeerConnection({ iceServers: ICE_SERVERS });
56
- pcRef.current = pc;
89
+ const pc = buildPc(peer);
57
90
  stream.getTracks().forEach(t => pc.addTrack(t, stream));
58
- pc.ontrack = e => {
59
- if (remoteVideoRef.current)
60
- remoteVideoRef.current.srcObject = e.streams[0];
61
- };
62
- pc.onicecandidate = e => {
63
- if (e.candidate) {
64
- // TODO: socket.emit('ice-candidate', { candidate: e.candidate, to: peer.uid });
65
- }
66
- };
67
91
  await pc.setRemoteDescription(offer);
68
92
  const answer = await pc.createAnswer();
69
93
  await pc.setLocalDescription(answer);
70
- // TODO: socket.emit('call-answer', { answer, to: peer.uid });
94
+ onAnswerReady === null || onAnswerReady === void 0 ? void 0 : onAnswerReady(answer, peer.uid, callId);
95
+ }, [buildPc, onAnswerReady, updateSession]);
96
+ const addIceCandidate = (0, react_1.useCallback)(async (candidate) => {
97
+ var _a;
98
+ try {
99
+ await ((_a = pcRef.current) === null || _a === void 0 ? void 0 : _a.addIceCandidate(new RTCIceCandidate(candidate)));
100
+ }
101
+ catch (err) {
102
+ console.warn('[WebRTC] addIceCandidate failed:', err);
103
+ }
71
104
  }, []);
72
- /** Hang up */
73
- const endCall = useCallback(() => {
74
- var _a, _b;
75
- (_a = localStream.current) === null || _a === void 0 ? void 0 : _a.getTracks().forEach(t => t.stop());
76
- (_b = pcRef.current) === null || _b === void 0 ? void 0 : _b.close();
105
+ const endCall = (0, react_1.useCallback)(() => {
106
+ var _a, _b, _c;
107
+ const callId = currentCallId.current;
108
+ const peerUid = (_a = peerUidRef.current) !== null && _a !== void 0 ? _a : undefined;
109
+ (_b = localStream.current) === null || _b === void 0 ? void 0 : _b.getTracks().forEach(t => t.stop());
110
+ (_c = pcRef.current) === null || _c === void 0 ? void 0 : _c.close();
77
111
  pcRef.current = null;
78
112
  localStream.current = null;
113
+ currentCallId.current = null;
114
+ if (callId)
115
+ onCallEnded === null || onCallEnded === void 0 ? void 0 : onCallEnded(callId, peerUid);
79
116
  updateSession({ state: 'ended', peer: null, startedAt: null });
80
117
  setTimeout(() => updateSession({ state: 'idle' }), 1800);
81
- }, []);
82
- const toggleMute = useCallback(() => {
118
+ }, [onCallEnded, updateSession]);
119
+ const toggleMute = (0, react_1.useCallback)(() => {
83
120
  if (!localStream.current)
84
121
  return;
85
- const enabled = !session.isMuted;
86
- localStream.current.getAudioTracks().forEach(t => { t.enabled = enabled; });
87
- updateSession({ isMuted: !session.isMuted });
88
- }, [session.isMuted]);
89
- const toggleCamera = useCallback(() => {
122
+ const muted = !session.isMuted;
123
+ localStream.current.getAudioTracks().forEach(t => { t.enabled = !muted; });
124
+ updateSession({ isMuted: muted });
125
+ }, [session.isMuted, updateSession]);
126
+ const toggleCamera = (0, react_1.useCallback)(() => {
90
127
  if (!localStream.current)
91
128
  return;
92
- const enabled = !session.isCameraOn;
93
- localStream.current.getVideoTracks().forEach(t => { t.enabled = enabled; });
94
- updateSession({ isCameraOn: enabled });
95
- }, [session.isCameraOn]);
96
- // Cleanup on unmount
97
- useEffect(() => () => {
129
+ const on = !session.isCameraOn;
130
+ localStream.current.getVideoTracks().forEach(t => { t.enabled = on; });
131
+ updateSession({ isCameraOn: on });
132
+ }, [session.isCameraOn, updateSession]);
133
+ (0, react_1.useEffect)(() => () => {
98
134
  var _a, _b;
99
135
  (_a = localStream.current) === null || _a === void 0 ? void 0 : _a.getTracks().forEach(t => t.stop());
100
136
  (_b = pcRef.current) === null || _b === void 0 ? void 0 : _b.close();
101
137
  }, []);
102
138
  return {
103
- session,
104
- localVideoRef,
105
- remoteVideoRef,
106
- startCall,
107
- acceptCall,
108
- endCall,
109
- toggleMute,
110
- toggleCamera,
139
+ session, localVideoRef, remoteVideoRef,
140
+ startCall, acceptCall, addIceCandidate, endCall,
141
+ toggleMute, toggleCamera,
111
142
  };
112
143
  }
144
+ //# sourceMappingURL=useWebRTC.js.map