ajaxter-chat 3.0.17 → 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 (143) 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 +1 -0
  6. package/dist/components/CallScreen/index.d.ts.map +1 -0
  7. package/dist/components/CallScreen/index.js +107 -39
  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 +350 -255
  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 +1 -0
  34. package/dist/components/MiniCallBar/index.d.ts.map +1 -0
  35. package/dist/components/MiniCallBar/index.js +85 -37
  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/ChatWidget.tsx +291 -269
  139. package/src/components/ErrorBoundary/index.tsx +62 -0
  140. package/src/hooks/useChat.ts +59 -12
  141. package/src/hooks/useSocket.ts +228 -0
  142. package/src/hooks/useWebRTC.ts +99 -64
  143. package/src/index.ts +7 -2
@@ -1,13 +1,48 @@
1
+ "use strict";
1
2
  'use client';
2
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useState } from 'react';
4
- import { submitReenableRequest } from '../../utils/reenableRequest';
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.ViewerBlockedScreen = void 0;
38
+ const react_1 = __importStar(require("react"));
39
+ const reenableRequest_1 = require("../../utils/reenableRequest");
5
40
  const DEFAULT_MESSAGE = 'You have been marked as Blocked user due to spam';
6
- export const ViewerBlockedScreen = ({ config, apiKey, onClose }) => {
41
+ const ViewerBlockedScreen = ({ config, apiKey, onClose }) => {
7
42
  var _a, _b;
8
- const [text, setText] = useState('');
9
- const [status, setStatus] = useState('idle');
10
- const [error, setError] = useState(null);
43
+ const [text, setText] = (0, react_1.useState)('');
44
+ const [status, setStatus] = (0, react_1.useState)('idle');
45
+ const [error, setError] = (0, react_1.useState)(null);
11
46
  const primary = config.primaryColor;
12
47
  const body = (((_a = config.blockedViewerMessage) === null || _a === void 0 ? void 0 : _a.trim()) || DEFAULT_MESSAGE);
13
48
  const url = (_b = config.reenableRequestUrl) === null || _b === void 0 ? void 0 : _b.trim();
@@ -26,7 +61,7 @@ export const ViewerBlockedScreen = ({ config, apiKey, onClose }) => {
26
61
  setError(null);
27
62
  setStatus('sending');
28
63
  try {
29
- await submitReenableRequest(url, {
64
+ await (0, reenableRequest_1.submitReenableRequest)(url, {
30
65
  widgetId: config.id,
31
66
  apiKey,
32
67
  viewerUid: ((_a = config.viewerUid) === null || _a === void 0 ? void 0 : _a.trim()) || undefined,
@@ -40,7 +75,7 @@ export const ViewerBlockedScreen = ({ config, apiKey, onClose }) => {
40
75
  setError(e instanceof Error ? e.message : 'Request failed');
41
76
  }
42
77
  };
43
- return (_jsx("div", { className: "cw-scroll", style: {
78
+ return (react_1.default.createElement("div", { className: "cw-scroll", style: {
44
79
  flex: 1,
45
80
  display: 'flex',
46
81
  flexDirection: 'column',
@@ -50,58 +85,75 @@ export const ViewerBlockedScreen = ({ config, apiKey, onClose }) => {
50
85
  textAlign: 'center',
51
86
  overflowY: 'auto',
52
87
  minHeight: 0,
53
- }, children: _jsxs("div", { style: { maxWidth: 380, width: '100%' }, children: [_jsx("div", { style: { fontSize: 44, marginBottom: 16 }, children: "\uD83D\uDEAB" }), _jsx("p", { style: {
54
- margin: '0 0 28px',
88
+ } },
89
+ react_1.default.createElement("div", { style: { maxWidth: 380, width: '100%' } },
90
+ react_1.default.createElement("div", { style: { fontSize: 44, marginBottom: 16 } }, "\uD83D\uDEAB"),
91
+ react_1.default.createElement("p", { style: {
92
+ margin: '0 0 28px',
93
+ fontSize: 15,
94
+ fontWeight: 600,
95
+ color: '#1e293b',
96
+ lineHeight: 1.55,
97
+ } }, body),
98
+ status === 'sent' ? (react_1.default.createElement(react_1.default.Fragment, null,
99
+ react_1.default.createElement("p", { style: { margin: '0 0 16px', fontSize: 14, color: '#16a34a', fontWeight: 600 } }, "Your request was sent. We will review it shortly."),
100
+ react_1.default.createElement("button", { type: "button", onClick: onClose, style: {
101
+ width: '100%',
102
+ padding: '12px 16px',
103
+ borderRadius: 12,
104
+ border: '2px solid #ef4444',
105
+ background: '#fff',
106
+ color: '#ef4444',
107
+ fontWeight: 700,
55
108
  fontSize: 15,
56
- fontWeight: 600,
109
+ cursor: 'pointer',
110
+ fontFamily: 'inherit',
111
+ } }, "Close"))) : (react_1.default.createElement(react_1.default.Fragment, null,
112
+ react_1.default.createElement("label", { htmlFor: "cw-reenable-msg", style: { display: 'block', textAlign: 'left', fontSize: 13, fontWeight: 600, color: '#475569', marginBottom: 8 } }, "Request access restoration"),
113
+ react_1.default.createElement("textarea", { id: "cw-reenable-msg", value: text, onChange: e => { setText(e.target.value); setError(null); setStatus('idle'); }, placeholder: "Explain briefly why your access should be restored\u2026", rows: 4, maxLength: 500, minLength: 50, disabled: status === 'sending', style: {
114
+ width: '100%',
115
+ boxSizing: 'border-box',
116
+ padding: '12px 14px',
117
+ borderRadius: 12,
118
+ border: '1.5px solid #e2e8f0',
119
+ fontSize: 14,
120
+ fontFamily: 'inherit',
57
121
  color: '#1e293b',
58
- lineHeight: 1.55,
59
- }, children: body }), status === 'sent' ? (_jsxs(_Fragment, { children: [_jsx("p", { style: { margin: '0 0 16px', fontSize: 14, color: '#16a34a', fontWeight: 600 }, children: "Your request was sent. We will review it shortly." }), _jsx("button", { type: "button", onClick: onClose, style: {
60
- width: '100%',
61
- padding: '12px 16px',
62
- borderRadius: 12,
63
- border: '2px solid #ef4444',
64
- background: '#fff',
65
- color: '#ef4444',
66
- fontWeight: 700,
67
- fontSize: 15,
68
- cursor: 'pointer',
69
- fontFamily: 'inherit',
70
- }, children: "Close" })] })) : (_jsxs(_Fragment, { children: [_jsx("label", { htmlFor: "cw-reenable-msg", style: { display: 'block', textAlign: 'left', fontSize: 13, fontWeight: 600, color: '#475569', marginBottom: 8 }, children: "Request access restoration" }), _jsx("textarea", { id: "cw-reenable-msg", value: text, onChange: e => { setText(e.target.value); setError(null); setStatus('idle'); }, placeholder: "Explain briefly why your access should be restored\u2026", rows: 4, maxLength: 500, minLength: 50, disabled: status === 'sending', style: {
71
- width: '100%',
72
- boxSizing: 'border-box',
73
- padding: '12px 14px',
74
- borderRadius: 12,
75
- border: '1.5px solid #e2e8f0',
76
- fontSize: 14,
77
- fontFamily: 'inherit',
78
- color: '#1e293b',
79
- resize: 'none',
80
- minHeight: 100,
81
- maxHeight: 250,
82
- marginBottom: 14,
83
- outline: 'none',
84
- } }), _jsx("button", { type: "button", onClick: handleSubmit, disabled: status === 'sending' || !text.trim(), style: {
85
- width: '100%',
86
- padding: '12px 16px',
87
- borderRadius: 12,
88
- border: 'none',
89
- background: text.trim() && status !== 'sending' ? primary : '#e2e8f0',
90
- color: text.trim() && status !== 'sending' ? '#fff' : '#94a3b8',
91
- fontWeight: 700,
92
- fontSize: 15,
93
- cursor: text.trim() && status !== 'sending' ? 'pointer' : 'default',
94
- }, children: status === 'sending' ? 'Sending…' : 'Submit request' }), _jsx("button", { type: "button", onClick: onClose, style: {
95
- width: '100%',
96
- marginTop: 12,
97
- padding: '12px 16px',
98
- borderRadius: 12,
99
- border: '2px solid #ef4444',
100
- background: '#fff',
101
- color: '#ef4444',
102
- fontWeight: 700,
103
- fontSize: 15,
104
- cursor: 'pointer',
105
- fontFamily: 'inherit',
106
- }, children: "Close" }), error && (_jsx("p", { style: { margin: '12px 0 0', fontSize: 13, color: '#dc2626', lineHeight: 1.45 }, children: error })), !url && (_jsxs("p", { style: { margin: '14px 0 0', fontSize: 12, color: '#94a3b8', lineHeight: 1.5 }, children: ["Your administrator must set ", _jsx("code", { style: { fontSize: 11 }, children: "reenableRequestUrl" }), " in widget config for online requests."] }))] }))] }) }));
122
+ resize: 'none',
123
+ minHeight: 100,
124
+ maxHeight: 250,
125
+ marginBottom: 14,
126
+ outline: 'none',
127
+ } }),
128
+ react_1.default.createElement("button", { type: "button", onClick: handleSubmit, disabled: status === 'sending' || !text.trim(), style: {
129
+ width: '100%',
130
+ padding: '12px 16px',
131
+ borderRadius: 12,
132
+ border: 'none',
133
+ background: text.trim() && status !== 'sending' ? primary : '#e2e8f0',
134
+ color: text.trim() && status !== 'sending' ? '#fff' : '#94a3b8',
135
+ fontWeight: 700,
136
+ fontSize: 15,
137
+ cursor: text.trim() && status !== 'sending' ? 'pointer' : 'default',
138
+ } }, status === 'sending' ? 'Sending…' : 'Submit request'),
139
+ react_1.default.createElement("button", { type: "button", onClick: onClose, style: {
140
+ width: '100%',
141
+ marginTop: 12,
142
+ padding: '12px 16px',
143
+ borderRadius: 12,
144
+ border: '2px solid #ef4444',
145
+ background: '#fff',
146
+ color: '#ef4444',
147
+ fontWeight: 700,
148
+ fontSize: 15,
149
+ cursor: 'pointer',
150
+ fontFamily: 'inherit',
151
+ } }, "Close"),
152
+ error && (react_1.default.createElement("p", { style: { margin: '12px 0 0', fontSize: 13, color: '#dc2626', lineHeight: 1.45 } }, error)),
153
+ !url && (react_1.default.createElement("p", { style: { margin: '14px 0 0', fontSize: 12, color: '#94a3b8', lineHeight: 1.5 } },
154
+ "Your administrator must set ",
155
+ react_1.default.createElement("code", { style: { fontSize: 11 } }, "reenableRequestUrl"),
156
+ " in widget config for online requests.")))))));
107
157
  };
158
+ exports.ViewerBlockedScreen = ViewerBlockedScreen;
159
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ViewerBlockedScreen/index.tsx"],"names":[],"mappings":"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"}
@@ -5,3 +5,4 @@ import { LocalEnvConfig, RemoteChatData } from '../types';
5
5
  */
6
6
  export declare function fetchRemoteChatData(apiKey: string, widgetId: string): Promise<RemoteChatData>;
7
7
  export declare function loadLocalConfig(): LocalEnvConfig;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AA2B1D;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,CAAC,CAczB;AAED,wBAAgB,eAAe,IAAI,cAAc,CAKhD"}
@@ -1,3 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchRemoteChatData = fetchRemoteChatData;
4
+ exports.loadLocalConfig = loadLocalConfig;
1
5
  /**
2
6
  * Default JSON endpoint. Override with `REACT_APP_CHAT_CONFIG_URL` / `NEXT_PUBLIC_CHAT_CONFIG_URL`.
3
7
  * If the remote host does not send CORS headers, set this to a same-origin path (e.g. `/api/chat-config`)
@@ -21,7 +25,7 @@ function getChatDataBaseUrl() {
21
25
  * Loads remote widget config once via GET. Uses query params `key` and `widget` so the
22
26
  * server can validate the request without custom headers (avoids CORS preflight failures).
23
27
  */
24
- export async function fetchRemoteChatData(apiKey, widgetId) {
28
+ async function fetchRemoteChatData(apiKey, widgetId) {
25
29
  const base = getChatDataBaseUrl();
26
30
  const url = new URL(base, typeof window !== 'undefined' ? window.location.origin : 'https://localhost');
27
31
  url.searchParams.set('key', apiKey);
@@ -36,10 +40,11 @@ export async function fetchRemoteChatData(apiKey, widgetId) {
36
40
  throw new Error(`Failed to load chat config: ${res.status}`);
37
41
  return res.json();
38
42
  }
39
- export function loadLocalConfig() {
43
+ function loadLocalConfig() {
40
44
  var _a, _b;
41
45
  return {
42
46
  apiKey: (_a = getEnv('CHAT_API_KEY')) !== null && _a !== void 0 ? _a : DEMO_API_KEY,
43
47
  widgetId: (_b = getEnv('CHAT_WIDGET_ID')) !== null && _b !== void 0 ? _b : DEMO_WIDGET_ID,
44
48
  };
45
49
  }
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":";;AA+BA,kDAiBC;AAED,0CAKC;AArDD;;;;GAIG;AACH,MAAM,sBAAsB,GAAG,iDAAiD,CAAC;AACjF,MAAM,YAAY,GAAK,UAAU,CAAC;AAClC,MAAM,cAAc,GAAG,MAAM,CAAC;AAE9B,SAAS,MAAM,CAAC,GAAW;;IACzB,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAClD,OAAO,CACL,MAAA,MAAA,MAAA,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,EAAE,CAAC,mCACjC,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,EAAE,CAAC,mCAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,mCAChB,SAAS,CACV,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,kBAAkB;;IACzB,OAAO,CAAA,MAAA,MAAM,CAAC,iBAAiB,CAAC,0CAAE,IAAI,EAAE,KAAI,sBAAsB,CAAC;AACrE,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,mBAAmB,CACvC,MAAc,EACd,QAAgB;IAEhB,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;IACxG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACpC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEzC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;QACtC,MAAM,EAAE,KAAK;QACb,WAAW,EAAE,MAAM;QACnB,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;KACxC,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1E,OAAO,GAAG,CAAC,IAAI,EAA6B,CAAC;AAC/C,CAAC;AAED,SAAgB,eAAe;;IAC7B,OAAO;QACL,MAAM,EAAI,MAAA,MAAM,CAAC,cAAc,CAAC,mCAAO,YAAY;QACnD,QAAQ,EAAE,MAAA,MAAM,CAAC,gBAAgB,CAAC,mCAAK,cAAc;KACtD,CAAC;AACJ,CAAC"}
@@ -1,13 +1,21 @@
1
1
  import { ChatMessage, ChatUser } from '../types';
2
- export declare function useChat(initialMessages?: ChatMessage[]): {
2
+ export interface UseChatOptions {
3
+ onEmitMessage?: (msg: ChatMessage) => void;
4
+ onEmitPause?: (roomId: string, targetUid: string, paused: boolean) => void;
5
+ onEmitReport?: (roomId: string) => void;
6
+ }
7
+ export declare function useChat(initialMessages?: ChatMessage[], opts?: UseChatOptions): {
3
8
  messages: ChatMessage[];
4
9
  activeUser: ChatUser | null;
5
10
  isPaused: boolean;
6
11
  isReported: boolean;
7
12
  selectUser: (user: ChatUser, history?: ChatMessage[]) => void;
8
13
  sendMessage: (text: string, type?: ChatMessage["type"], extra?: Partial<ChatMessage>) => void;
14
+ receiveMessage: (msg: ChatMessage) => void;
15
+ updateMessageStatus: (messageId: string, status: ChatMessage["status"]) => void;
9
16
  togglePause: () => void;
10
17
  reportChat: () => void;
11
18
  clearChat: () => void;
12
19
  setMessages: import("react").Dispatch<import("react").SetStateAction<ChatMessage[]>>;
13
20
  };
21
+ //# sourceMappingURL=useChat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChat.d.ts","sourceRoot":"","sources":["../../src/hooks/useChat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IAC3C,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3E,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,wBAAgB,OAAO,CAAC,eAAe,GAAE,WAAW,EAAO,EAAE,IAAI,GAAE,cAAmB;;;;;uBAU9C,QAAQ,YAAW,WAAW,EAAE;wBAU9D,MAAM,SACN,WAAW,CAAC,MAAM,CAAC,UAClB,OAAO,CAAC,WAAW,CAAC;0BAkBY,WAAW;qCAOA,MAAM,UAAU,WAAW,CAAC,QAAQ,CAAC;;;;;EAsC1F"}
@@ -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":";;AASA,0BAqFC;AA9FD,iCAAsD;AAStD,SAAgB,OAAO,CAAC,kBAAiC,EAAE,EAAE,OAAuB,EAAE;IACpF,MAAM,CAAC,QAAQ,EAAI,WAAW,CAAC,GAAK,IAAA,gBAAQ,EAAgB,eAAe,CAAC,CAAC;IAC7E,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,IAAA,gBAAQ,EAAkB,IAAI,CAAC,CAAC;IACpE,MAAM,CAAC,QAAQ,EAAI,WAAW,CAAC,GAAK,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IACpD,MAAM,aAAa,GAAG,IAAA,cAAM,EAAkB,IAAI,CAAC,CAAC;IACpD,MAAM,WAAW,GAAK,IAAA,cAAM,EAAC,KAAK,CAAC,CAAC;IAEpC,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAE1D,MAAM,UAAU,GAAG,IAAA,mBAAW,EAAC,CAAC,IAAc,EAAE,UAAyB,EAAE,EAAE,EAAE;QAC7E,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;QAC7B,WAAW,CAAC,OAAO,CAAC,CAAC;QACrB,WAAW,CAAC,KAAK,CAAC,CAAC;QACnB,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC;QAC5B,aAAa,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,WAAW,GAAG,IAAA,mBAAW,EAAC,CAC9B,IAAY,EACZ,OAA4B,MAAM,EAClC,QAA8B,EAAE,EAChC,EAAE;QACF,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC;QACnC,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC,OAAO;YAAE,OAAO;QACzC,MAAM,GAAG,mBACP,EAAE,EAAU,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EACtE,QAAQ,EAAI,IAAI,EAChB,UAAU,EAAE,IAAI,CAAC,GAAG,EACpB,IAAI,EACJ,SAAS,EAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EACpC,IAAI,EACJ,MAAM,EAAM,MAAM,IACf,KAAK,CACT,CAAC;QACF,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QACpC,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAG,GAAG,CAAC,CAAC;IACvB,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,MAAM,cAAc,GAAG,IAAA,mBAAW,EAAC,CAAC,GAAgB,EAAE,EAAE;QACtD,WAAW,CAAC,IAAI,CAAC,EAAE;YACjB,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;gBAAE,OAAO,IAAI,CAAC;YACjD,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,mBAAmB,GAAG,IAAA,mBAAW,EAAC,CAAC,SAAiB,EAAE,MAA6B,EAAE,EAAE;QAC3F,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,iCAAM,CAAC,KAAE,MAAM,IAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,WAAW,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE;QACnC,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC;QACnC,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,IAAI,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC;QAClC,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;QAC3B,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjD,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAG,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,MAAM,UAAU,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE;QAClC,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC;QACnC,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjD,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAG,MAAM,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,MAAM,SAAS,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE;QACjC,WAAW,CAAC,EAAE,CAAC,CAAC;QAChB,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;QAC7B,WAAW,CAAC,KAAK,CAAC,CAAC;QACnB,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC;QAC5B,aAAa,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU;QAC1C,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,mBAAmB;QAC5D,WAAW,EAAE,UAAU,EAAE,SAAS;QAClC,WAAW;KACZ,CAAC;AACJ,CAAC"}
@@ -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"}