@dora-cell/sdk-react 0.1.1-beta.9 → 1.0.1
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.
- package/README.md +85 -290
- package/dist/index.d.mts +29 -29
- package/dist/index.d.ts +29 -29
- package/dist/index.js +343 -149
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +341 -150
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +3 -0
- package/package.json +18 -7
package/dist/index.mjs
CHANGED
|
@@ -2,7 +2,7 @@ import { forwardRef, createElement, createContext, useState, useRef, useEffect,
|
|
|
2
2
|
import { DoraCell } from '@dora-cell/sdk';
|
|
3
3
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
4
4
|
|
|
5
|
-
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.
|
|
5
|
+
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.3/node_modules/lucide-react/dist/esm/shared/src/utils.js
|
|
6
6
|
var toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
|
|
7
7
|
var toCamelCase = (string) => string.replace(
|
|
8
8
|
/^([A-Z])|[\s-_]+(\w)/g,
|
|
@@ -23,7 +23,7 @@ var hasA11yProp = (props) => {
|
|
|
23
23
|
}
|
|
24
24
|
};
|
|
25
25
|
|
|
26
|
-
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.
|
|
26
|
+
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.3/node_modules/lucide-react/dist/esm/defaultAttributes.js
|
|
27
27
|
var defaultAttributes = {
|
|
28
28
|
xmlns: "http://www.w3.org/2000/svg",
|
|
29
29
|
width: 24,
|
|
@@ -36,7 +36,7 @@ var defaultAttributes = {
|
|
|
36
36
|
strokeLinejoin: "round"
|
|
37
37
|
};
|
|
38
38
|
|
|
39
|
-
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.
|
|
39
|
+
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.3/node_modules/lucide-react/dist/esm/Icon.js
|
|
40
40
|
var Icon = forwardRef(
|
|
41
41
|
({
|
|
42
42
|
color = "currentColor",
|
|
@@ -67,7 +67,7 @@ var Icon = forwardRef(
|
|
|
67
67
|
)
|
|
68
68
|
);
|
|
69
69
|
|
|
70
|
-
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.
|
|
70
|
+
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.3/node_modules/lucide-react/dist/esm/createLucideIcon.js
|
|
71
71
|
var createLucideIcon = (iconName, iconNode) => {
|
|
72
72
|
const Component = forwardRef(
|
|
73
73
|
({ className, ...props }, ref) => createElement(Icon, {
|
|
@@ -85,22 +85,26 @@ var createLucideIcon = (iconName, iconNode) => {
|
|
|
85
85
|
return Component;
|
|
86
86
|
};
|
|
87
87
|
|
|
88
|
-
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.
|
|
88
|
+
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/arrow-down-left.js
|
|
89
89
|
var __iconNode = [
|
|
90
90
|
["path", { d: "M17 7 7 17", key: "15tmo1" }],
|
|
91
91
|
["path", { d: "M17 17H7V7", key: "1org7z" }]
|
|
92
92
|
];
|
|
93
93
|
var ArrowDownLeft = createLucideIcon("arrow-down-left", __iconNode);
|
|
94
94
|
|
|
95
|
-
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.
|
|
95
|
+
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/arrow-up-right.js
|
|
96
96
|
var __iconNode2 = [
|
|
97
97
|
["path", { d: "M7 7h10v10", key: "1tivn9" }],
|
|
98
98
|
["path", { d: "M7 17 17 7", key: "1vkiza" }]
|
|
99
99
|
];
|
|
100
100
|
var ArrowUpRight = createLucideIcon("arrow-up-right", __iconNode2);
|
|
101
101
|
|
|
102
|
-
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.
|
|
103
|
-
var __iconNode3 = [
|
|
102
|
+
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/chevron-down.js
|
|
103
|
+
var __iconNode3 = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
|
|
104
|
+
var ChevronDown = createLucideIcon("chevron-down", __iconNode3);
|
|
105
|
+
|
|
106
|
+
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/delete.js
|
|
107
|
+
var __iconNode4 = [
|
|
104
108
|
[
|
|
105
109
|
"path",
|
|
106
110
|
{
|
|
@@ -111,19 +115,19 @@ var __iconNode3 = [
|
|
|
111
115
|
["path", { d: "m12 9 6 6", key: "anjzzh" }],
|
|
112
116
|
["path", { d: "m18 9-6 6", key: "1fp51s" }]
|
|
113
117
|
];
|
|
114
|
-
var Delete = createLucideIcon("delete",
|
|
118
|
+
var Delete = createLucideIcon("delete", __iconNode4);
|
|
115
119
|
|
|
116
|
-
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.
|
|
117
|
-
var
|
|
120
|
+
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/maximize.js
|
|
121
|
+
var __iconNode5 = [
|
|
118
122
|
["path", { d: "M8 3H5a2 2 0 0 0-2 2v3", key: "1dcmit" }],
|
|
119
123
|
["path", { d: "M21 8V5a2 2 0 0 0-2-2h-3", key: "1e4gt3" }],
|
|
120
124
|
["path", { d: "M3 16v3a2 2 0 0 0 2 2h3", key: "wsl5sc" }],
|
|
121
125
|
["path", { d: "M16 21h3a2 2 0 0 0 2-2v-3", key: "18trek" }]
|
|
122
126
|
];
|
|
123
|
-
var Maximize = createLucideIcon("maximize",
|
|
127
|
+
var Maximize = createLucideIcon("maximize", __iconNode5);
|
|
124
128
|
|
|
125
|
-
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.
|
|
126
|
-
var
|
|
129
|
+
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/mic-off.js
|
|
130
|
+
var __iconNode6 = [
|
|
127
131
|
["path", { d: "M12 19v3", key: "npa21l" }],
|
|
128
132
|
["path", { d: "M15 9.34V5a3 3 0 0 0-5.68-1.33", key: "1gzdoj" }],
|
|
129
133
|
["path", { d: "M16.95 16.95A7 7 0 0 1 5 12v-2", key: "cqa7eg" }],
|
|
@@ -131,27 +135,27 @@ var __iconNode5 = [
|
|
|
131
135
|
["path", { d: "m2 2 20 20", key: "1ooewy" }],
|
|
132
136
|
["path", { d: "M9 9v3a3 3 0 0 0 5.12 2.12", key: "r2i35w" }]
|
|
133
137
|
];
|
|
134
|
-
var MicOff = createLucideIcon("mic-off",
|
|
138
|
+
var MicOff = createLucideIcon("mic-off", __iconNode6);
|
|
135
139
|
|
|
136
|
-
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.
|
|
137
|
-
var
|
|
140
|
+
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/mic.js
|
|
141
|
+
var __iconNode7 = [
|
|
138
142
|
["path", { d: "M12 19v3", key: "npa21l" }],
|
|
139
143
|
["path", { d: "M19 10v2a7 7 0 0 1-14 0v-2", key: "1vc78b" }],
|
|
140
144
|
["rect", { x: "9", y: "2", width: "6", height: "13", rx: "3", key: "s6n7sd" }]
|
|
141
145
|
];
|
|
142
|
-
var Mic = createLucideIcon("mic",
|
|
146
|
+
var Mic = createLucideIcon("mic", __iconNode7);
|
|
143
147
|
|
|
144
|
-
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.
|
|
145
|
-
var
|
|
148
|
+
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/minimize-2.js
|
|
149
|
+
var __iconNode8 = [
|
|
146
150
|
["path", { d: "m14 10 7-7", key: "oa77jy" }],
|
|
147
151
|
["path", { d: "M20 10h-6V4", key: "mjg0md" }],
|
|
148
152
|
["path", { d: "m3 21 7-7", key: "tjx5ai" }],
|
|
149
153
|
["path", { d: "M4 14h6v6", key: "rmj7iw" }]
|
|
150
154
|
];
|
|
151
|
-
var Minimize2 = createLucideIcon("minimize-2",
|
|
155
|
+
var Minimize2 = createLucideIcon("minimize-2", __iconNode8);
|
|
152
156
|
|
|
153
|
-
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.
|
|
154
|
-
var
|
|
157
|
+
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/phone.js
|
|
158
|
+
var __iconNode9 = [
|
|
155
159
|
[
|
|
156
160
|
"path",
|
|
157
161
|
{
|
|
@@ -160,21 +164,21 @@ var __iconNode8 = [
|
|
|
160
164
|
}
|
|
161
165
|
]
|
|
162
166
|
];
|
|
163
|
-
var Phone = createLucideIcon("phone",
|
|
167
|
+
var Phone = createLucideIcon("phone", __iconNode9);
|
|
164
168
|
|
|
165
|
-
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.
|
|
166
|
-
var
|
|
169
|
+
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/user.js
|
|
170
|
+
var __iconNode10 = [
|
|
167
171
|
["path", { d: "M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2", key: "975kel" }],
|
|
168
172
|
["circle", { cx: "12", cy: "7", r: "4", key: "17ys0d" }]
|
|
169
173
|
];
|
|
170
|
-
var User = createLucideIcon("user",
|
|
174
|
+
var User = createLucideIcon("user", __iconNode10);
|
|
171
175
|
|
|
172
|
-
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.
|
|
173
|
-
var
|
|
176
|
+
// ../../node_modules/.pnpm/lucide-react@0.555.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/x.js
|
|
177
|
+
var __iconNode11 = [
|
|
174
178
|
["path", { d: "M18 6 6 18", key: "1bl5f8" }],
|
|
175
179
|
["path", { d: "m6 6 12 12", key: "d8bk6v" }]
|
|
176
180
|
];
|
|
177
|
-
var X = createLucideIcon("x",
|
|
181
|
+
var X = createLucideIcon("x", __iconNode11);
|
|
178
182
|
function CallInterface({
|
|
179
183
|
isOpen = false,
|
|
180
184
|
onOpenChange,
|
|
@@ -189,10 +193,10 @@ function CallInterface({
|
|
|
189
193
|
isMuted,
|
|
190
194
|
hangup,
|
|
191
195
|
answerCall,
|
|
192
|
-
toggleMute
|
|
196
|
+
toggleMute,
|
|
197
|
+
callError
|
|
193
198
|
} = useCall();
|
|
194
199
|
const [isMinimized, setIsMinimized] = useState(false);
|
|
195
|
-
const [localMuted, setLocalMuted] = useState(false);
|
|
196
200
|
const [wasConnected, setWasConnected] = useState(false);
|
|
197
201
|
const [closeCountdown, setCloseCountdown] = useState(null);
|
|
198
202
|
const [connectingCountdown, setConnectingCountdown] = useState(null);
|
|
@@ -202,15 +206,18 @@ function CallInterface({
|
|
|
202
206
|
const remoteNumber = currentCall?.remoteNumber || "Unknown";
|
|
203
207
|
const displayName = remoteNumber;
|
|
204
208
|
useEffect(() => {
|
|
205
|
-
if (
|
|
206
|
-
|
|
209
|
+
if (currentCall && audioRef.current) {
|
|
210
|
+
const stream = currentCall.getRemoteStream();
|
|
211
|
+
if (stream && audioRef.current.srcObject !== stream) {
|
|
212
|
+
audioRef.current.srcObject = stream;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}, [currentCall, callStatus]);
|
|
207
216
|
useEffect(() => {
|
|
208
217
|
if (callStatus === "ringing" && isIncoming) {
|
|
209
218
|
onOpenChange?.(true);
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
});
|
|
213
|
-
}
|
|
219
|
+
ringtoneRef.current?.play().catch(() => {
|
|
220
|
+
});
|
|
214
221
|
} else {
|
|
215
222
|
if (ringtoneRef.current) {
|
|
216
223
|
ringtoneRef.current.pause();
|
|
@@ -219,6 +226,9 @@ function CallInterface({
|
|
|
219
226
|
}
|
|
220
227
|
}, [callStatus, isIncoming, onOpenChange]);
|
|
221
228
|
useEffect(() => {
|
|
229
|
+
if (callStatus === "connecting" || callStatus === "ringing") {
|
|
230
|
+
setWasConnected(false);
|
|
231
|
+
}
|
|
222
232
|
if (callStatus === "ongoing") {
|
|
223
233
|
setWasConnected(true);
|
|
224
234
|
}
|
|
@@ -226,33 +236,31 @@ function CallInterface({
|
|
|
226
236
|
useEffect(() => {
|
|
227
237
|
if (isOpen && callStatus === "ended") {
|
|
228
238
|
onCallEnded?.();
|
|
229
|
-
const closeDelay = wasConnected ?
|
|
230
|
-
const
|
|
231
|
-
const
|
|
232
|
-
const
|
|
233
|
-
|
|
234
|
-
const seconds = Math.ceil(remaining / 1e3);
|
|
235
|
-
setCloseCountdown(seconds);
|
|
239
|
+
const closeDelay = wasConnected ? 1500 : 3e3;
|
|
240
|
+
const start = Date.now();
|
|
241
|
+
const iv = setInterval(() => {
|
|
242
|
+
const remaining = Math.max(0, closeDelay - (Date.now() - start));
|
|
243
|
+
setCloseCountdown(Math.ceil(remaining / 1e3));
|
|
236
244
|
if (remaining <= 0) {
|
|
237
|
-
clearInterval(
|
|
245
|
+
clearInterval(iv);
|
|
238
246
|
onOpenChange?.(false);
|
|
247
|
+
setIsMinimized(false);
|
|
239
248
|
}
|
|
240
249
|
}, 100);
|
|
241
|
-
return () => clearInterval(
|
|
250
|
+
return () => clearInterval(iv);
|
|
242
251
|
} else {
|
|
243
252
|
setCloseCountdown(null);
|
|
244
253
|
}
|
|
245
254
|
}, [callStatus, isOpen, onOpenChange, wasConnected, onCallEnded]);
|
|
246
255
|
useEffect(() => {
|
|
247
|
-
let
|
|
248
|
-
|
|
249
|
-
if (isOpen && isConnecting && !isIncoming) {
|
|
256
|
+
let iv;
|
|
257
|
+
if (isOpen && callStatus === "connecting" && !isIncoming) {
|
|
250
258
|
setConnectingCountdown(60);
|
|
251
|
-
|
|
259
|
+
iv = setInterval(() => {
|
|
252
260
|
setConnectingCountdown((prev) => {
|
|
253
261
|
if (prev === null || prev <= 0) {
|
|
254
|
-
clearInterval(
|
|
255
|
-
hangup();
|
|
262
|
+
clearInterval(iv);
|
|
263
|
+
if (callStatus === "connecting") hangup();
|
|
256
264
|
return 0;
|
|
257
265
|
}
|
|
258
266
|
return prev - 1;
|
|
@@ -261,7 +269,7 @@ function CallInterface({
|
|
|
261
269
|
} else {
|
|
262
270
|
setConnectingCountdown(null);
|
|
263
271
|
}
|
|
264
|
-
return () => clearInterval(
|
|
272
|
+
return () => clearInterval(iv);
|
|
265
273
|
}, [callStatus, isOpen, isIncoming, hangup]);
|
|
266
274
|
if (!isOpen && callStatus === "idle") return null;
|
|
267
275
|
return /* @__PURE__ */ jsxs(
|
|
@@ -269,9 +277,9 @@ function CallInterface({
|
|
|
269
277
|
{
|
|
270
278
|
role: "dialog",
|
|
271
279
|
"aria-label": "Call interface",
|
|
272
|
-
className: `fixed top-14 md:top-16 right-0 md:right-4 z-50 transform transition-all duration-300 ease-in-out bg-[#1E1E1E] shadow-xl
|
|
280
|
+
className: `dora-fixed dora-top-14 md:dora-top-16 dora-right-0 md:dora-right-4 dora-z-50 dora-transform dora-transition-all dora-duration-300 dora-ease-in-out dora-bg-[#1E1E1E] dora-shadow-xl ${isOpen ? "dora-translate-x-0" : "dora-translate-x-[110%]"} ${isMinimized ? "dora-w-48 dora-h-20 dora-rounded-2xl dora-p-4 dora-flex dora-items-center dora-justify-between" : "dora-w-full sm:dora-w-96 md:dora-max-w-sm max-h-[calc(100vh-3.5rem)] md:dora-max-h-[calc(100vh-4rem)] dora-rounded-none md:dora-rounded-2xl"}`,
|
|
273
281
|
children: [
|
|
274
|
-
/* @__PURE__ */ jsx("audio", { ref: audioRef, autoPlay: true, className: "hidden" }),
|
|
282
|
+
/* @__PURE__ */ jsx("audio", { ref: audioRef, autoPlay: true, className: "dora-hidden" }),
|
|
275
283
|
/* @__PURE__ */ jsx(
|
|
276
284
|
"audio",
|
|
277
285
|
{
|
|
@@ -279,75 +287,73 @@ function CallInterface({
|
|
|
279
287
|
src: "https://assets.mixkit.co/active_storage/sfx/2358/2358-preview.mp3",
|
|
280
288
|
loop: true,
|
|
281
289
|
preload: "auto",
|
|
282
|
-
className: "hidden"
|
|
290
|
+
className: "dora-hidden"
|
|
283
291
|
}
|
|
284
292
|
),
|
|
285
|
-
isMinimized ? /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between w-full h-full", children: [
|
|
293
|
+
isMinimized ? /* @__PURE__ */ jsxs("div", { className: "dora-flex dora-items-center dora-justify-between dora-w-full dora-h-full", children: [
|
|
286
294
|
/* @__PURE__ */ jsx(
|
|
287
295
|
"button",
|
|
288
296
|
{
|
|
289
297
|
onClick: () => setIsMinimized(false),
|
|
290
|
-
className: "w-10 h-10 rounded-full bg-[#2A2A2A] flex items-center justify-center text-slate-400 hover:text-white transition-colors",
|
|
291
|
-
"aria-label": "Maximize
|
|
298
|
+
className: "dora-w-10 dora-h-10 dora-rounded-full dora-bg-[#2A2A2A] dora-flex dora-items-center dora-justify-center dora-text-slate-400 hover:dora-text-white dora-transition-colors",
|
|
299
|
+
"aria-label": "Maximize",
|
|
292
300
|
children: maximizeIcon || /* @__PURE__ */ jsx(Maximize, { size: 18 })
|
|
293
301
|
}
|
|
294
302
|
),
|
|
295
|
-
/* @__PURE__ */ jsxs("div", { className: "relative flex items-center", children: [
|
|
296
|
-
/* @__PURE__ */ jsx("div", { className: "w-11 h-11 rounded-full bg-white flex items-center justify-center
|
|
303
|
+
/* @__PURE__ */ jsxs("div", { className: "dora-relative dora-flex dora-items-center", children: [
|
|
304
|
+
/* @__PURE__ */ jsx("div", { className: "dora-w-11 dora-h-11 dora-rounded-full dora-bg-white dora-flex dora-items-center dora-justify-center dora--mr-3", children: /* @__PURE__ */ jsx("span", { className: "dora-text-xl dora-text-slate-900 dora-font-bold", children: displayName.charAt(0).toUpperCase() }) }),
|
|
297
305
|
/* @__PURE__ */ jsx(
|
|
298
306
|
"button",
|
|
299
307
|
{
|
|
300
308
|
onClick: hangup,
|
|
301
|
-
className: "w-11 h-11 rounded-full bg-red-500 text-white flex items-center justify-center shadow-lg hover:bg-red-600 transition-colors z-10",
|
|
309
|
+
className: "dora-w-11 dora-h-11 dora-rounded-full dora-bg-red-500 dora-text-white dora-flex dora-items-center dora-justify-center dora-shadow-lg hover:dora-bg-red-600 dora-transition-colors dora-z-10",
|
|
302
310
|
"aria-label": "End call",
|
|
303
|
-
children: /* @__PURE__ */ jsx(Phone, { size: 18, className: "transform rotate-
|
|
311
|
+
children: /* @__PURE__ */ jsx(Phone, { size: 18, className: "dora-transform dora-rotate-[135deg]" })
|
|
304
312
|
}
|
|
305
313
|
)
|
|
306
314
|
] })
|
|
307
|
-
] }) : /* @__PURE__ */ jsxs("div", { className: "flex flex-col py-4 md:py-6 gap-2.5 md:gap-3.5 px-3 md:px-5 relative", children: [
|
|
315
|
+
] }) : /* @__PURE__ */ jsxs("div", { className: "dora-flex dora-flex-col dora-py-4 md:dora-py-6 dora-gap-2.5 md:dora-gap-3.5 dora-px-3 md:dora-px-5 dora-relative", children: [
|
|
308
316
|
/* @__PURE__ */ jsx(
|
|
309
317
|
"button",
|
|
310
318
|
{
|
|
311
319
|
onClick: () => setIsMinimized(true),
|
|
312
|
-
className: "absolute top-2 right-2 text-slate-500 hover:text-white transition-colors",
|
|
320
|
+
className: "dora-absolute dora-top-2 dora-right-2 dora-text-slate-500 hover:dora-text-white dora-transition-colors",
|
|
313
321
|
"aria-label": "Minimize",
|
|
314
322
|
children: minimizeIcon || /* @__PURE__ */ jsx(Minimize2, { size: 16 })
|
|
315
323
|
}
|
|
316
324
|
),
|
|
317
|
-
/* @__PURE__ */ jsxs("div", { className: "flex justify-between gap-2 items-start md:items-center", children: [
|
|
318
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2.5 md:gap-4 min-w-0", children: [
|
|
319
|
-
/* @__PURE__ */ jsx("div", { className: "w-9 md:w-11 h-9 md:h-11 rounded-full bg-white flex items-center justify-center shrink-0", children: /* @__PURE__ */ jsx("span", { className: "text-lg md:text-2xl text-slate-900 font-bold", children: displayName.charAt(0).toUpperCase() }) }),
|
|
320
|
-
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
321
|
-
/* @__PURE__ */ jsx("h2", { className: "text-base md:text-xl font-normal text-white truncate", children: isIncoming ? displayName : displayName === "Unknown" ? "Outgoing Call" : displayName }),
|
|
322
|
-
/* @__PURE__ */ jsxs("p", { className: "text-slate-400 text-xs md:text-sm truncate", children: [
|
|
325
|
+
/* @__PURE__ */ jsxs("div", { className: "dora-flex dora-justify-between dora-gap-2 dora-items-start md:dora-items-center", children: [
|
|
326
|
+
/* @__PURE__ */ jsxs("div", { className: "dora-flex dora-items-center dora-gap-2.5 md:dora-gap-4 dora-min-w-0", children: [
|
|
327
|
+
/* @__PURE__ */ jsx("div", { className: "dora-w-9 md:dora-w-11 dora-h-9 md:dora-h-11 dora-rounded-full dora-bg-white dora-flex dora-items-center dora-justify-center dora-shrink-0", children: /* @__PURE__ */ jsx("span", { className: "dora-text-lg md:dora-text-2xl dora-text-slate-900 dora-font-bold", children: displayName.charAt(0).toUpperCase() }) }),
|
|
328
|
+
/* @__PURE__ */ jsxs("div", { className: "dora-min-w-0 dora-flex-1", children: [
|
|
329
|
+
/* @__PURE__ */ jsx("h2", { className: "dora-text-base md:dora-text-xl dora-font-normal dora-text-white dora-truncate", children: isIncoming ? displayName : displayName === "Unknown" ? "Outgoing Call" : displayName }),
|
|
330
|
+
/* @__PURE__ */ jsxs("p", { className: "dora-text-slate-400 dora-text-xs md:dora-text-sm dora-truncate", children: [
|
|
323
331
|
remoteNumber,
|
|
324
332
|
" \u2022",
|
|
325
333
|
" ",
|
|
326
|
-
isMuted ? /* @__PURE__ */ jsx("span", { className: "
|
|
334
|
+
isMuted ? /* @__PURE__ */ jsx("span", { className: "dora-text-[#F99578]", children: "Call muted" }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
327
335
|
(callStatus === "connecting" || callStatus === "ringing") && /* @__PURE__ */ jsx("span", { children: isIncoming ? "Incoming Call..." : callStatus === "connecting" ? "Connecting..." : "Ringing..." }),
|
|
328
|
-
callStatus === "ongoing" && /* @__PURE__ */ jsx("span", { children: "On Call" })
|
|
336
|
+
callStatus === "ongoing" && /* @__PURE__ */ jsx("span", { children: "On Call" }),
|
|
337
|
+
callStatus === "ended" && /* @__PURE__ */ jsx("span", { children: "Call Ended" })
|
|
329
338
|
] })
|
|
330
339
|
] })
|
|
331
340
|
] })
|
|
332
341
|
] }),
|
|
333
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center gap-1.5 md:gap-3 shrink-0", children: [
|
|
342
|
+
/* @__PURE__ */ jsxs("div", { className: "dora-flex dora-items-center dora-justify-center dora-gap-1.5 md:dora-gap-3 dora-shrink-0", children: [
|
|
334
343
|
isIncoming && callStatus === "ringing" && /* @__PURE__ */ jsx(
|
|
335
344
|
"button",
|
|
336
345
|
{
|
|
337
346
|
onClick: answerCall,
|
|
338
|
-
className: "rounded-full bg-green-500 text-white hover:bg-green-600 transition-colors w-8 md:w-9 h-8 md:h-9 flex items-center justify-center shrink-0",
|
|
339
|
-
"aria-label": "Answer
|
|
347
|
+
className: "dora-rounded-full dora-bg-green-500 dora-text-white hover:dora-bg-green-600 dora-transition-colors dora-w-8 md:dora-w-9 dora-h-8 md:dora-h-9 dora-flex dora-items-center dora-justify-center dora-shrink-0",
|
|
348
|
+
"aria-label": "Answer",
|
|
340
349
|
children: /* @__PURE__ */ jsx(Phone, { size: 18 })
|
|
341
350
|
}
|
|
342
351
|
),
|
|
343
352
|
(callStatus === "ongoing" || isIncoming && callStatus === "ringing") && /* @__PURE__ */ jsx(
|
|
344
353
|
"button",
|
|
345
354
|
{
|
|
346
|
-
onClick:
|
|
347
|
-
|
|
348
|
-
setLocalMuted((s) => !s);
|
|
349
|
-
},
|
|
350
|
-
className: `rounded-full transition-colors w-8 md:w-9 h-8 md:h-9 flex items-center justify-center shrink-0 bg-slate-700 hover:bg-slate-600 ${isMuted ? "text-white " : " text-slate-400 "}`,
|
|
355
|
+
onClick: toggleMute,
|
|
356
|
+
className: `dora-rounded-full dora-transition-colors dora-w-8 md:dora-w-9 dora-h-8 md:dora-h-9 dora-flex dora-items-center dora-justify-center dora-shrink-0 ${isMuted ? "dora-bg-slate-700 hover:dora-bg-slate-600 dora-text-white" : "dora-bg-[#2A2A2A] hover:dora-bg-[#333333] dora-text-slate-400"}`,
|
|
351
357
|
"aria-label": "Toggle mute",
|
|
352
358
|
children: isMuted ? /* @__PURE__ */ jsx(MicOff, { size: 18 }) : /* @__PURE__ */ jsx(Mic, { size: 18 })
|
|
353
359
|
}
|
|
@@ -356,31 +362,53 @@ function CallInterface({
|
|
|
356
362
|
"button",
|
|
357
363
|
{
|
|
358
364
|
onClick: hangup,
|
|
359
|
-
className: "rounded-full bg-red-600 text-white hover:bg-red-700 transition-colors w-8 md:w-9 h-8 md:h-9 flex items-center justify-center shrink-0",
|
|
360
|
-
"aria-label": isIncoming && callStatus === "ringing" ? "Decline
|
|
361
|
-
children: /* @__PURE__ */ jsx(Phone, { size: 18, className: "transform rotate-
|
|
365
|
+
className: "dora-rounded-full dora-bg-red-600 dora-text-white hover:dora-bg-red-700 dora-transition-colors dora-w-8 md:dora-w-9 dora-h-8 md:dora-h-9 dora-flex dora-items-center dora-justify-center dora-shrink-0",
|
|
366
|
+
"aria-label": isIncoming && callStatus === "ringing" ? "Decline" : "End call",
|
|
367
|
+
children: /* @__PURE__ */ jsx(Phone, { size: 18, className: "dora-transform dora-rotate-[135deg]" })
|
|
362
368
|
}
|
|
363
369
|
)
|
|
364
370
|
] })
|
|
365
371
|
] }),
|
|
366
|
-
/* @__PURE__ */ jsx("div", { className: "flex-1 border border-[#282828]" }),
|
|
367
|
-
/* @__PURE__ */ jsxs("div", { className: "
|
|
368
|
-
/* @__PURE__ */
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
372
|
+
/* @__PURE__ */ jsx("div", { className: "dora-flex-1 dora-border-t dora-border-[#282828] dora-mt-2 dora-mb-2" }),
|
|
373
|
+
callError && callStatus === "ended" && /* @__PURE__ */ jsxs("div", { className: "dora-bg-red-900/20 dora-border dora-border-red-500/30 dora-rounded-lg dora-p-2 md:dora-p-3 dora-mb-2 md:dora-mb-3", children: [
|
|
374
|
+
/* @__PURE__ */ jsx("p", { className: "dora-text-red-400 dora-text-xs md:dora-text-sm dora-font-medium", children: "Call Failed" }),
|
|
375
|
+
/* @__PURE__ */ jsx("p", { className: "dora-text-red-300 dora-text-xs dora-mt-0.5 md:dora-mt-1", children: callError }),
|
|
376
|
+
closeCountdown !== null && /* @__PURE__ */ jsxs("div", { className: "dora-mt-1.5 md:dora-mt-2", children: [
|
|
377
|
+
/* @__PURE__ */ jsx("div", { className: "dora-w-full dora-bg-red-900/30 dora-rounded-full dora-h-1.5 dora-overflow-hidden", children: /* @__PURE__ */ jsx(
|
|
378
|
+
"div",
|
|
379
|
+
{
|
|
380
|
+
className: "dora-bg-red-500 dora-h-full dora-transition-all dora-duration-100",
|
|
381
|
+
style: {
|
|
382
|
+
width: `${Math.max(
|
|
383
|
+
0,
|
|
384
|
+
closeCountdown / (wasConnected ? 1 : 5) * 100
|
|
385
|
+
)}%`
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
) }),
|
|
389
|
+
/* @__PURE__ */ jsxs("p", { className: "dora-text-xs dora-text-red-300 dora-mt-0.5 md:dora-mt-1 dora-text-center", children: [
|
|
390
|
+
"Closing in ",
|
|
391
|
+
closeCountdown,
|
|
392
|
+
"s"
|
|
393
|
+
] })
|
|
394
|
+
] })
|
|
395
|
+
] }),
|
|
396
|
+
/* @__PURE__ */ jsxs("div", { className: "dora-flex dora-justify-between dora-items-center", children: [
|
|
397
|
+
/* @__PURE__ */ jsxs("div", { className: "dora-text-slate-400 dora-text-xs md:dora-text-sm dora-font-light dora-tracking-wide dora-flex dora-items-center dora-gap-1", children: [
|
|
398
|
+
(callStatus === "connecting" || callStatus === "ringing") && /* @__PURE__ */ jsx("span", { children: isIncoming ? "Incoming call" : "Outgoing call" }),
|
|
399
|
+
callStatus === "ongoing" && /* @__PURE__ */ jsx("span", { children: "Ongoing" }),
|
|
400
|
+
callStatus === "ended" && /* @__PURE__ */ jsx("span", { children: "Call ended" }),
|
|
401
|
+
(callStatus === "connecting" || callStatus === "ringing" || callStatus === "ongoing") && (isIncoming ? /* @__PURE__ */ jsx(ArrowDownLeft, { className: "dora-inline-block dora-ml-1 dora-text-green-400", size: 16 }) : /* @__PURE__ */ jsx(ArrowUpRight, { className: "dora-inline-block dora-ml-1 dora-text-blue-400", size: 16 }))
|
|
375
402
|
] }),
|
|
376
|
-
callStatus === "ongoing" && /* @__PURE__ */ jsx("div", { className: "bg-[#272727] h-6 md:h-7
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
403
|
+
callStatus === "ongoing" && /* @__PURE__ */ jsx("div", { className: "dora-bg-[#272727] dora-h-6 md:dora-h-7 dora-rounded-full dora-px-3 md:dora-px-4 dora-text-white dora-font-normal dora-text-xs md:dora-text-sm dora-flex dora-items-center dora-justify-center", children: /* @__PURE__ */ jsx("span", { children: callDuration }) }),
|
|
404
|
+
callStatus === "ended" && closeCountdown !== null && /* @__PURE__ */ jsx("div", { className: "dora-bg-[#272727] dora-h-6 md:dora-h-7 dora-rounded-full dora-px-3 md:dora-px-4 dora-text-slate-400 dora-font-normal dora-text-xs dora-flex dora-items-center dora-justify-center dora-gap-1", children: /* @__PURE__ */ jsxs("span", { children: [
|
|
405
|
+
"Closing in ",
|
|
406
|
+
closeCountdown,
|
|
407
|
+
"s"
|
|
380
408
|
] }) }),
|
|
381
|
-
(connectingCountdown !== null || callStatus === "ringing") && !isIncoming && callStatus !== "ongoing" && /* @__PURE__ */ jsxs("div", { className: "bg-[#272727] h-8 rounded-full px-3 md:px-4 text-white font-normal text-xs md:text-sm flex items-center justify-center gap-2", children: [
|
|
382
|
-
/* @__PURE__ */ jsx("span", { className: "text-[#F99578] whitespace-nowrap", children: callStatus === "ringing" ? "Ringing..." : "
|
|
383
|
-
callStatus === "connecting" && connectingCountdown && /* @__PURE__ */ jsxs("span", { className: "font-mono ml-1", children: [
|
|
409
|
+
(connectingCountdown !== null || callStatus === "ringing") && !isIncoming && callStatus !== "ongoing" && callStatus !== "ended" && /* @__PURE__ */ jsxs("div", { className: "dora-bg-[#272727] dora-h-8 dora-rounded-full dora-px-3 md:dora-px-4 dora-text-white dora-font-normal dora-text-xs md:dora-text-sm dora-flex dora-items-center dora-justify-center dora-gap-2", children: [
|
|
410
|
+
/* @__PURE__ */ jsx("span", { className: "dora-text-[#F99578] dora-whitespace-nowrap", children: callStatus === "ringing" ? "Ringing..." : "Connecting..." }),
|
|
411
|
+
callStatus === "connecting" && connectingCountdown && /* @__PURE__ */ jsxs("span", { className: "dora-font-mono dora-ml-1 dora-text-slate-400", children: [
|
|
384
412
|
Math.floor(connectingCountdown / 60),
|
|
385
413
|
":",
|
|
386
414
|
String(connectingCountdown % 60).padStart(2, "0")
|
|
@@ -397,42 +425,94 @@ function Dialpad({
|
|
|
397
425
|
initialNumber = "",
|
|
398
426
|
showKeys = true,
|
|
399
427
|
className = "",
|
|
400
|
-
availableExtensions
|
|
401
|
-
selectedExtension,
|
|
428
|
+
availableExtensions: providedExtensions,
|
|
429
|
+
selectedExtension: providedSelectedExtension,
|
|
402
430
|
onExtensionChange
|
|
403
431
|
}) {
|
|
404
432
|
const { call, callStatus } = useCall();
|
|
433
|
+
const { isConnected } = useConnectionStatus();
|
|
434
|
+
const { extensions: fetchedExtensions, setExtension } = useExtensions();
|
|
405
435
|
const [number, setNumber] = useState(initialNumber);
|
|
406
436
|
const [keysVisible, setKeysVisible] = useState(showKeys);
|
|
437
|
+
const [localSelectedExt, setLocalSelectedExt] = useState("");
|
|
438
|
+
const extensions = providedExtensions?.length ? providedExtensions : fetchedExtensions.map((ext) => ({
|
|
439
|
+
label: ext.extension,
|
|
440
|
+
value: ext.extension
|
|
441
|
+
}));
|
|
442
|
+
const activeExtension = providedSelectedExtension || localSelectedExt || (extensions.length > 0 ? extensions[0].value : "");
|
|
443
|
+
useEffect(() => {
|
|
444
|
+
if (!localSelectedExt && extensions.length > 0 && !providedSelectedExtension) {
|
|
445
|
+
setLocalSelectedExt(extensions[0].value);
|
|
446
|
+
}
|
|
447
|
+
}, [extensions, providedSelectedExtension]);
|
|
407
448
|
const append = (digit) => setNumber((s) => s + digit);
|
|
408
449
|
const backspace = () => setNumber((s) => s.slice(0, -1));
|
|
450
|
+
const handleExtensionChange = async (ext) => {
|
|
451
|
+
setLocalSelectedExt(ext);
|
|
452
|
+
onExtensionChange?.(ext);
|
|
453
|
+
await setExtension(ext);
|
|
454
|
+
};
|
|
409
455
|
const handleCall = async () => {
|
|
410
456
|
if (!number || number.trim() === "") return;
|
|
411
457
|
try {
|
|
412
|
-
await call(number,
|
|
458
|
+
await call(number, activeExtension);
|
|
413
459
|
onCallInitiated?.(number);
|
|
414
460
|
} catch (e) {
|
|
415
461
|
console.error("Call failed", e);
|
|
416
462
|
}
|
|
417
463
|
};
|
|
418
|
-
const isCallDisabled = !number || number.trim() === "" || callStatus === "ringing" || callStatus === "ongoing" || callStatus === "connecting";
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
464
|
+
const isCallDisabled = !number || number.trim() === "" || !isConnected || callStatus === "ringing" || callStatus === "ongoing" || callStatus === "connecting";
|
|
465
|
+
const keypad_icon = /* @__PURE__ */ jsx(
|
|
466
|
+
"svg",
|
|
467
|
+
{
|
|
468
|
+
width: "20",
|
|
469
|
+
height: "20",
|
|
470
|
+
viewBox: "0 0 20 20",
|
|
471
|
+
fill: "none",
|
|
472
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
473
|
+
children: /* @__PURE__ */ jsx(
|
|
474
|
+
"path",
|
|
424
475
|
{
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
onChange: (e) => onExtensionChange?.(e.target.value),
|
|
428
|
-
children: availableExtensions.map((ext) => /* @__PURE__ */ jsx("option", { value: ext.value, children: ext.label }, ext.value))
|
|
476
|
+
d: "M11.5333 3.2006C11.5339 3.50413 11.4444 3.801 11.2759 4.05352C11.1075 4.30605 10.8679 4.50284 10.5874 4.61891C10.3069 4.73499 9.99832 4.76512 9.70071 4.70548C9.40309 4.64584 9.12991 4.49911 8.91583 4.28393C8.77351 4.14156 8.66063 3.97254 8.58363 3.78654C8.50662 3.60054 8.46701 3.4012 8.46705 3.19989C8.46709 2.99858 8.50678 2.79925 8.58385 2.61328C8.66093 2.4273 8.77387 2.25834 8.91625 2.11602C9.05862 1.9737 9.22764 1.86081 9.41364 1.78381C9.59964 1.70681 9.79898 1.6672 10.0003 1.66723C10.2016 1.66727 10.4009 1.70696 10.5869 1.78404C10.7729 1.86111 10.9418 1.97406 11.0842 2.11643C11.3717 2.40393 11.5342 2.7931 11.5342 3.19977M14.5333 4.73227C14.7376 4.73703 14.9408 4.7009 15.131 4.62601C15.3211 4.55111 15.4944 4.43896 15.6406 4.29614C15.7868 4.15333 15.9029 3.98273 15.9822 3.79438C16.0616 3.60602 16.1024 3.40372 16.1024 3.19935C16.1024 2.99498 16.0616 2.79267 15.9822 2.60432C15.9029 2.41597 15.7868 2.24537 15.6406 2.10255C15.4944 1.95974 15.3211 1.84759 15.131 1.77269C14.9408 1.6978 14.7376 1.66167 14.5333 1.66643C14.1267 1.66643 13.7367 1.82798 13.4491 2.11554C13.1615 2.40309 13 2.7931 13 3.19977C13 3.60643 13.1615 3.99644 13.4491 4.284C13.7367 4.57155 14.1267 4.73227 14.5333 4.73227ZM7 3.2006C7.00061 3.50413 6.91102 3.801 6.7426 4.05352C6.57419 4.30605 6.33454 4.50284 6.05408 4.61891C5.77362 4.73499 5.46499 4.76512 5.16737 4.70548C4.86976 4.64584 4.59657 4.49911 4.3825 4.28393C4.24018 4.14161 4.12728 3.97265 4.05026 3.7867C3.97324 3.60075 3.93359 3.40145 3.93359 3.20018C3.93359 2.99891 3.97324 2.79961 4.05026 2.61366C4.12728 2.42771 4.24018 2.25875 4.3825 2.11643C4.52482 1.97411 4.69378 1.86122 4.87973 1.78419C5.06568 1.70717 5.26498 1.66753 5.46625 1.66753C5.66752 1.66753 5.86682 1.70717 6.05277 1.78419C6.23872 1.86122 6.40768 1.97411 6.55 2.11643C6.8375 2.40393 6.99917 2.7931 6.99917 3.19977M11.5333 7.7306C11.5352 7.93448 11.4964 8.1367 11.4192 8.32539C11.342 8.51409 11.2279 8.68548 11.0836 8.82952C10.9392 8.97357 10.7677 9.08737 10.5788 9.16426C10.39 9.24114 10.1877 9.27958 9.98381 9.2773C9.77993 9.27503 9.57856 9.2321 9.39148 9.15102C9.2044 9.06994 9.03538 8.95234 8.89433 8.80511C8.75327 8.65789 8.64301 8.484 8.57 8.29362C8.497 8.10325 8.46272 7.90022 8.46917 7.69643C8.48185 7.29562 8.65113 6.91575 8.94068 6.63833C9.23024 6.3609 9.617 6.20802 10.018 6.21249C10.419 6.21697 10.8022 6.37843 11.0855 6.66224C11.3688 6.94606 11.5296 7.32961 11.5333 7.7306ZM14.5333 9.2631C14.7376 9.26786 14.9408 9.23174 15.131 9.15684C15.3211 9.08194 15.4944 8.96979 15.6406 8.82698C15.7868 8.68416 15.9029 8.51356 15.9822 8.32521C16.0616 8.13686 16.1024 7.93455 16.1024 7.73018C16.1024 7.52581 16.0616 7.32351 15.9822 7.13515C15.9029 6.9468 15.7868 6.7762 15.6406 6.63339C15.4944 6.49057 15.3211 6.37842 15.131 6.30352C14.9408 6.22863 14.7376 6.1925 14.5333 6.19727C14.1267 6.19727 13.7367 6.35881 13.4491 6.64637C13.1615 6.93392 13 7.32393 13 7.7306C13 8.13726 13.1615 8.52727 13.4491 8.81483C13.7367 9.10239 14.1267 9.26393 14.5333 9.26393M7 7.7306C7.00021 8.03395 6.91038 8.33054 6.7419 8.58281C6.57341 8.83507 6.33385 9.03165 6.05356 9.14766C5.77326 9.26367 5.46485 9.29389 5.16737 9.23448C4.86989 9.17506 4.59673 9.0287 4.3825 8.81393C4.20461 8.63559 4.07342 8.41615 4.00054 8.17503C3.92766 7.93391 3.91534 7.67854 3.96468 7.43152C4.01401 7.1845 4.12347 6.95345 4.28337 6.75882C4.44328 6.56419 4.64869 6.41197 4.88144 6.31564C5.11419 6.21931 5.36709 6.18184 5.61777 6.20654C5.86845 6.23124 6.10918 6.31735 6.31865 6.45725C6.52812 6.59716 6.69988 6.78654 6.81872 7.00864C6.93756 7.23073 6.99982 7.4787 7 7.7306ZM11.5333 12.2623C11.5348 12.4893 11.4857 12.7138 11.3897 12.9196C11.2937 13.1253 11.1532 13.3071 10.9783 13.4519C10.8034 13.5967 10.5985 13.7007 10.3784 13.7566C10.1583 13.8124 9.9286 13.8186 9.70583 13.7748C9.42088 13.7191 9.1576 13.5836 8.94662 13.3841C8.73564 13.1847 8.58563 12.9294 8.51403 12.648C8.44244 12.3666 8.4522 12.0707 8.5422 11.7947C8.63219 11.5186 8.79871 11.2738 9.02238 11.0887C9.24606 10.9036 9.51769 10.7857 9.8057 10.7489C10.0937 10.7122 10.3862 10.7579 10.6493 10.8808C10.9123 11.0038 11.135 11.1989 11.2915 11.4434C11.448 11.688 11.5319 11.9719 11.5333 12.2623ZM11.5333 16.8006C11.5337 17.0274 11.4836 17.2515 11.3868 17.4567C11.29 17.6618 11.1488 17.8429 10.9735 17.9868C10.7981 18.1308 10.593 18.2339 10.3729 18.2889C10.1528 18.3439 9.92326 18.3493 9.70083 18.3048C9.40375 18.2453 9.13093 18.0992 8.91681 17.8849C8.70269 17.6705 8.55688 17.3975 8.49777 17.1004C8.43866 16.8032 8.46891 16.4952 8.58469 16.2152C8.70048 15.9353 8.89661 15.6959 9.14833 15.5273C9.37915 15.3731 9.64749 15.2845 9.92473 15.2708C10.202 15.2572 10.4777 15.3191 10.7225 15.4499C10.9673 15.5807 11.1721 15.7755 11.3149 16.0135C11.4577 16.2515 11.5332 16.523 11.5333 16.8006ZM16.0667 12.2623C16.0681 12.4893 16.019 12.7138 15.923 12.9196C15.827 13.1253 15.6865 13.3071 15.5116 13.4519C15.3367 13.5967 15.1318 13.7007 14.9117 13.7566C14.6917 13.8124 14.4619 13.8186 14.2392 13.7748C14.0165 13.7312 13.8062 13.6388 13.6236 13.5041C13.4409 13.3695 13.2904 13.1959 13.183 12.9961C13.0755 12.7962 13.0137 12.575 13.0021 12.3484C12.9905 12.1218 13.0294 11.8954 13.1158 11.6856C13.2509 11.3581 13.4952 11.0875 13.8072 10.9197C14.1193 10.7519 14.4797 10.6974 14.8274 10.7653C15.1751 10.8333 15.4886 11.0195 15.7145 11.2924C15.9404 11.5653 16.0648 11.908 16.0667 12.2623ZM7 12.2623C7.00227 12.5661 6.91412 12.8638 6.74675 13.1174C6.57939 13.371 6.34039 13.5691 6.06013 13.6864C5.77987 13.8038 5.47104 13.8352 5.1729 13.7766C4.87476 13.718 4.60079 13.572 4.38583 13.3573C4.20705 13.1796 4.07483 12.9606 4.00086 12.7196C3.9269 12.4787 3.91347 12.2232 3.96176 11.9759C4.01006 11.7285 4.11859 11.4968 4.27776 11.3014C4.43692 11.106 4.64181 10.9528 4.87428 10.8554C5.10676 10.758 5.35966 10.7194 5.61059 10.7431C5.86153 10.7668 6.10276 10.8519 6.31294 10.991C6.52313 11.1301 6.69578 11.3189 6.81561 11.5406C6.93545 11.7624 6.99878 12.0102 7 12.2623Z",
|
|
477
|
+
fill: "#677289"
|
|
429
478
|
}
|
|
430
479
|
)
|
|
480
|
+
}
|
|
481
|
+
);
|
|
482
|
+
return /* @__PURE__ */ jsxs("div", { className: `dora-space-y-4 ${className} dora-font-sans`, children: [
|
|
483
|
+
/* @__PURE__ */ jsxs("div", { className: "dora-flex dora-items-center dora-justify-between dora-mb-2", children: [
|
|
484
|
+
/* @__PURE__ */ jsxs("div", { className: "dora-flex dora-items-center dora-gap-2", children: [
|
|
485
|
+
/* @__PURE__ */ jsx("div", { className: "dora-w-8 dora-h-8 dora-rounded-lg dora-bg-emerald-500 dora-flex dora-items-center dora-justify-center dora-shadow-sm", children: /* @__PURE__ */ jsx(Phone, { size: 16, className: "dora-text-white", fill: "white" }) }),
|
|
486
|
+
/* @__PURE__ */ jsx("span", { className: "dora-text-sm dora-font-bold dora-text-zinc-900", children: "Dora Cell" })
|
|
487
|
+
] }),
|
|
488
|
+
/* @__PURE__ */ jsx(CreditBalance, {})
|
|
489
|
+
] }),
|
|
490
|
+
/* @__PURE__ */ jsx("div", { className: "dora-h-px dora-bg-zinc-100 dora-w-full dora-mb-4" }),
|
|
491
|
+
extensions.length > 0 && /* @__PURE__ */ jsxs("div", { className: "dora-gap-2 dora-bg-[#F6F7F9] dora-rounded-xl dora-flex dora-items-center dora-justify-between dora-p-2.5 dora-mb-4 dora-border dora-border-zinc-100", children: [
|
|
492
|
+
/* @__PURE__ */ jsx("div", { className: "dora-text-xs md:dora-text-sm dora-text-zinc-500 dora-font-medium dora-whitespace-nowrap", children: "Caller ID" }),
|
|
493
|
+
/* @__PURE__ */ jsxs("div", { className: "dora-relative dora-flex dora-items-center", children: [
|
|
494
|
+
/* @__PURE__ */ jsx(
|
|
495
|
+
"select",
|
|
496
|
+
{
|
|
497
|
+
className: "dora-appearance-none dora-bg-white dora-px-3 dora-py-1.5 dora-rounded-lg dora-border dora-border-zinc-200 dora-text-sm dora-font-medium dora-outline-none dora-pr-8 dora-cursor-pointer hover:dora-border-emerald-500 dora-transition-colors dora-shadow-sm",
|
|
498
|
+
value: activeExtension,
|
|
499
|
+
onChange: (e) => handleExtensionChange(e.target.value),
|
|
500
|
+
children: extensions.map((ext) => /* @__PURE__ */ jsx("option", { value: ext.value, children: ext.label }, ext.value))
|
|
501
|
+
}
|
|
502
|
+
),
|
|
503
|
+
/* @__PURE__ */ jsx(
|
|
504
|
+
ChevronDown,
|
|
505
|
+
{
|
|
506
|
+
size: 14,
|
|
507
|
+
className: "dora-absolute dora-right-2.5 dora-pointer-events-none dora-text-zinc-400"
|
|
508
|
+
}
|
|
509
|
+
)
|
|
510
|
+
] })
|
|
431
511
|
] }),
|
|
432
|
-
/* @__PURE__ */ jsxs("div", { className: "
|
|
433
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center
|
|
434
|
-
/* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0 flex items-center bg-white rounded-
|
|
435
|
-
/* @__PURE__ */ jsx(User, { className: "text-
|
|
512
|
+
/* @__PURE__ */ jsxs("div", { className: "dora-space-y-3 dora-bg-[#F6F7F9] dora-p-3 dora-rounded-xl dora-border dora-border-zinc-100", children: [
|
|
513
|
+
/* @__PURE__ */ jsxs("div", { className: "dora-flex dora-items-center dora-gap-3", children: [
|
|
514
|
+
/* @__PURE__ */ jsxs("div", { className: "dora-flex-1 dora-min-w-0 dora-flex dora-items-center dora-bg-white dora-rounded-xl dora-px-4 dora-h-12 dora-border dora-border-zinc-200 focus-within:dora-border-emerald-500 focus-within:dora-ring-4 focus-within:dora-ring-emerald-500/10 dora-transition-all dora-shadow-sm", children: [
|
|
515
|
+
/* @__PURE__ */ jsx(User, { className: "dora-text-zinc-400 dora-mr-2", size: 18 }),
|
|
436
516
|
/* @__PURE__ */ jsx(
|
|
437
517
|
"input",
|
|
438
518
|
{
|
|
@@ -440,53 +520,64 @@ function Dialpad({
|
|
|
440
520
|
placeholder: "Enter number",
|
|
441
521
|
value: number,
|
|
442
522
|
onChange: (e) => setNumber(e.target.value),
|
|
443
|
-
className: "bg-transparent border-none outline-none w-full text-base"
|
|
523
|
+
className: "dora-bg-transparent dora-border-none dora-outline-none dora-w-full dora-text-base dora-text-zinc-900 dora-placeholder-zinc-400 dora-font-medium"
|
|
444
524
|
}
|
|
445
525
|
)
|
|
446
526
|
] }),
|
|
447
|
-
/* @__PURE__ */ jsx(
|
|
527
|
+
/* @__PURE__ */ jsx(
|
|
448
528
|
"button",
|
|
449
529
|
{
|
|
450
530
|
disabled: isCallDisabled,
|
|
451
|
-
className: "bg-green-500 text-white hover:bg-green-600 rounded-lg h-9 md:h-10 w-9 md:w-11 flex items-center justify-center disabled:opacity-50 disabled:cursor-not-allowed transition-colors",
|
|
452
531
|
onClick: handleCall,
|
|
453
532
|
title: "Place Call",
|
|
454
|
-
|
|
533
|
+
className: "dora-bg-emerald-500 dora-text-white hover:dora-bg-emerald-600 dora-rounded-xl dora-h-12 dora-w-14 dora-flex dora-items-center dora-justify-center disabled:dora-opacity-50 disabled:dora-cursor-not-allowed dora-transition-all dora-shadow-lg dora-shadow-emerald-500/20 active:dora-scale-95",
|
|
534
|
+
children: /* @__PURE__ */ jsx(Phone, { size: 20, fill: "white", className: "dora-text-white" })
|
|
455
535
|
}
|
|
456
|
-
)
|
|
536
|
+
)
|
|
457
537
|
] }),
|
|
458
|
-
/* @__PURE__ */ jsx("div", { children: keysVisible ? /* @__PURE__ */ jsxs("div", { className: "pt-3", children: [
|
|
459
|
-
/* @__PURE__ */ jsx("div", { className: "flex items-center gap-3 mb-3", children: /* @__PURE__ */ jsxs(
|
|
538
|
+
/* @__PURE__ */ jsx("div", { children: keysVisible ? /* @__PURE__ */ jsxs("div", { className: "dora-pt-3", children: [
|
|
539
|
+
/* @__PURE__ */ jsx("div", { className: "dora-flex dora-items-center dora-gap-3 dora-mb-3", children: /* @__PURE__ */ jsxs(
|
|
460
540
|
"button",
|
|
461
541
|
{
|
|
462
542
|
onClick: () => setKeysVisible(false),
|
|
463
|
-
className: "px-2 md:px-2.5 h-8 bg-white rounded-full shadow text-neutral-500 flex items-center gap-1.5 md:gap-2 text-xs md:text-sm font-normal hover:bg-gray-50 transition-colors",
|
|
543
|
+
className: "dora-px-2 md:dora-px-2.5 dora-h-8 dora-bg-white dora-rounded-full dora-shadow dora-text-neutral-500 dora-flex dora-items-center dora-gap-1.5 md:dora-gap-2 dora-text-xs md:dora-text-sm dora-font-normal hover:dora-bg-gray-50 dora-transition-colors",
|
|
464
544
|
children: [
|
|
465
545
|
/* @__PURE__ */ jsx(X, { color: "red", size: 16 }),
|
|
466
546
|
" Close keypad"
|
|
467
547
|
]
|
|
468
548
|
}
|
|
469
549
|
) }),
|
|
470
|
-
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-3 gap-2 md:gap-3", children: [
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
550
|
+
/* @__PURE__ */ jsx("div", { className: "dora-grid dora-grid-cols-3 dora-gap-2 md:dora-gap-3", children: [
|
|
551
|
+
"1",
|
|
552
|
+
"2",
|
|
553
|
+
"3",
|
|
554
|
+
"4",
|
|
555
|
+
"5",
|
|
556
|
+
"6",
|
|
557
|
+
"7",
|
|
558
|
+
"8",
|
|
559
|
+
"9",
|
|
560
|
+
"+",
|
|
561
|
+
"0",
|
|
562
|
+
"del"
|
|
563
|
+
].map((d) => /* @__PURE__ */ jsx(
|
|
564
|
+
"button",
|
|
565
|
+
{
|
|
566
|
+
onClick: () => d === "del" ? backspace() : append(d),
|
|
567
|
+
className: "dora-h-10 md:dora-h-12 dora-bg-white dora-rounded-xl dora-shadow dora-flex dora-items-center dora-justify-center dora-text-base md:dora-text-lg dora-font-medium dora-text-slate-900 hover:dora-bg-gray-50 active:dora-bg-gray-100 dora-transition-colors",
|
|
568
|
+
"aria-label": d === "del" ? "Delete" : `Dial ${d}`,
|
|
569
|
+
children: d === "del" ? /* @__PURE__ */ jsx(Delete, { size: 18 }) : d
|
|
570
|
+
},
|
|
571
|
+
d
|
|
572
|
+
)) })
|
|
573
|
+
] }) : /* @__PURE__ */ jsx("div", { className: "dora-pt-3", children: /* @__PURE__ */ jsxs(
|
|
483
574
|
"button",
|
|
484
575
|
{
|
|
485
576
|
onClick: () => setKeysVisible(true),
|
|
486
|
-
className: "rounded-full bg-
|
|
577
|
+
className: "dora-rounded-full dora-bg-white dora-border dora-border-zinc-200 dora-h-11 dora-flex dora-justify-center dora-items-center dora-px-5 dora-w-full dora-text-sm hover:dora-bg-zinc-50 dora-transition-all dora-shadow-sm active:dora-scale-[0.98]",
|
|
487
578
|
children: [
|
|
488
|
-
/* @__PURE__ */ jsx("span", { className: "mr-2", children:
|
|
489
|
-
/* @__PURE__ */ jsx("span", { className: "
|
|
579
|
+
/* @__PURE__ */ jsx("span", { className: "dora-mr-2", children: keypad_icon }),
|
|
580
|
+
/* @__PURE__ */ jsx("span", { className: "dora-text-sm dora-text-zinc-600 dora-font-medium", children: "Open dialer keypad" })
|
|
490
581
|
]
|
|
491
582
|
}
|
|
492
583
|
) }) })
|
|
@@ -507,6 +598,7 @@ function DoraCellProvider({
|
|
|
507
598
|
const [callDuration, setCallDuration] = useState("00:00");
|
|
508
599
|
const [isMuted, setIsMuted] = useState(false);
|
|
509
600
|
const [error, setError] = useState(null);
|
|
601
|
+
const [extension, setExtension] = useState(null);
|
|
510
602
|
const durationIntervalRef = useRef(null);
|
|
511
603
|
useEffect(() => {
|
|
512
604
|
if (!autoInitialize) return;
|
|
@@ -527,6 +619,9 @@ function DoraCellProvider({
|
|
|
527
619
|
if (!sdk) return;
|
|
528
620
|
const handleConnectionStatus = (state) => {
|
|
529
621
|
setConnectionStatus(state.status);
|
|
622
|
+
if (state.extension) {
|
|
623
|
+
setExtension(state.extension);
|
|
624
|
+
}
|
|
530
625
|
if (state.error) {
|
|
531
626
|
setError(new Error(state.error));
|
|
532
627
|
}
|
|
@@ -601,10 +696,10 @@ function DoraCellProvider({
|
|
|
601
696
|
}
|
|
602
697
|
};
|
|
603
698
|
}, [callStatus, currentCall]);
|
|
604
|
-
const call = async (phoneNumber,
|
|
699
|
+
const call = async (phoneNumber, extension2) => {
|
|
605
700
|
try {
|
|
606
701
|
setError(null);
|
|
607
|
-
await sdk.call(phoneNumber, { extension });
|
|
702
|
+
await sdk.call(phoneNumber, { extension: extension2 });
|
|
608
703
|
} catch (err) {
|
|
609
704
|
setError(err instanceof Error ? err : new Error("Failed to make call"));
|
|
610
705
|
throw err;
|
|
@@ -646,7 +741,8 @@ function DoraCellProvider({
|
|
|
646
741
|
call,
|
|
647
742
|
hangup,
|
|
648
743
|
toggleMute,
|
|
649
|
-
answerCall
|
|
744
|
+
answerCall,
|
|
745
|
+
extension
|
|
650
746
|
};
|
|
651
747
|
return /* @__PURE__ */ jsx(DoraCellContext.Provider, { value: contextValue, children });
|
|
652
748
|
}
|
|
@@ -658,7 +754,7 @@ function useDoraCell() {
|
|
|
658
754
|
return context;
|
|
659
755
|
}
|
|
660
756
|
function useCall() {
|
|
661
|
-
const { call, hangup, toggleMute, answerCall, callStatus, callDuration, isMuted, currentCall } = useDoraCell();
|
|
757
|
+
const { call, hangup, toggleMute, answerCall, callStatus, callDuration, isMuted, currentCall, error } = useDoraCell();
|
|
662
758
|
return {
|
|
663
759
|
call,
|
|
664
760
|
hangup,
|
|
@@ -667,17 +763,111 @@ function useCall() {
|
|
|
667
763
|
callStatus,
|
|
668
764
|
callDuration,
|
|
669
765
|
isMuted,
|
|
670
|
-
currentCall
|
|
766
|
+
currentCall,
|
|
767
|
+
callError: error?.message
|
|
671
768
|
};
|
|
672
769
|
}
|
|
673
770
|
function useConnectionStatus() {
|
|
674
|
-
const { connectionStatus, isInitialized, error } = useDoraCell();
|
|
771
|
+
const { connectionStatus, isInitialized, error, extension } = useDoraCell();
|
|
675
772
|
return {
|
|
676
773
|
connectionStatus,
|
|
677
774
|
isInitialized,
|
|
678
775
|
isConnected: connectionStatus === "registered",
|
|
679
|
-
error
|
|
776
|
+
error,
|
|
777
|
+
extension
|
|
778
|
+
};
|
|
779
|
+
}
|
|
780
|
+
function useWallet() {
|
|
781
|
+
const { sdk, isInitialized } = useDoraCell();
|
|
782
|
+
const [data, setData] = useState(null);
|
|
783
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
784
|
+
const [error, setError] = useState(null);
|
|
785
|
+
const fetchData = async () => {
|
|
786
|
+
if (!sdk || !isInitialized) return;
|
|
787
|
+
setIsLoading(true);
|
|
788
|
+
setError(null);
|
|
789
|
+
try {
|
|
790
|
+
const val = await sdk.getWallet();
|
|
791
|
+
setData(val);
|
|
792
|
+
} catch (err) {
|
|
793
|
+
setError(err instanceof Error ? err : new Error("Failed to fetch wallet"));
|
|
794
|
+
} finally {
|
|
795
|
+
setIsLoading(false);
|
|
796
|
+
}
|
|
680
797
|
};
|
|
798
|
+
useEffect(() => {
|
|
799
|
+
if (isInitialized) {
|
|
800
|
+
console.log("SDK: useWallet fetching data...");
|
|
801
|
+
fetchData();
|
|
802
|
+
}
|
|
803
|
+
}, [isInitialized, sdk]);
|
|
804
|
+
useEffect(() => {
|
|
805
|
+
if (!sdk || !isInitialized) return;
|
|
806
|
+
const handleCallEnded = () => {
|
|
807
|
+
console.log("SDK: Call ended, refreshing wallet balance in 2 seconds...");
|
|
808
|
+
setTimeout(fetchData, 2e3);
|
|
809
|
+
};
|
|
810
|
+
sdk.on("call:ended", handleCallEnded);
|
|
811
|
+
return () => {
|
|
812
|
+
sdk.off("call:ended", handleCallEnded);
|
|
813
|
+
};
|
|
814
|
+
}, [sdk, isInitialized]);
|
|
815
|
+
return {
|
|
816
|
+
balance: data?.balance ?? 0,
|
|
817
|
+
currency: data?.currency ?? "NGN",
|
|
818
|
+
isLoading,
|
|
819
|
+
error,
|
|
820
|
+
refresh: fetchData
|
|
821
|
+
};
|
|
822
|
+
}
|
|
823
|
+
function useExtensions() {
|
|
824
|
+
const { sdk, isInitialized } = useDoraCell();
|
|
825
|
+
const [extensions, setExtensions] = useState([]);
|
|
826
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
827
|
+
const [error, setError] = useState(null);
|
|
828
|
+
const fetchExtensions = async () => {
|
|
829
|
+
if (!sdk || !isInitialized) return;
|
|
830
|
+
setIsLoading(true);
|
|
831
|
+
setError(null);
|
|
832
|
+
try {
|
|
833
|
+
const data = await sdk.fetchExtensions();
|
|
834
|
+
setExtensions(data);
|
|
835
|
+
} catch (err) {
|
|
836
|
+
setError(err instanceof Error ? err : new Error("Failed to fetch extensions"));
|
|
837
|
+
} finally {
|
|
838
|
+
setIsLoading(false);
|
|
839
|
+
}
|
|
840
|
+
};
|
|
841
|
+
const setExtension = async (extension) => {
|
|
842
|
+
if (!sdk) return;
|
|
843
|
+
await sdk.setExtension(extension);
|
|
844
|
+
};
|
|
845
|
+
useEffect(() => {
|
|
846
|
+
if (isInitialized) {
|
|
847
|
+
fetchExtensions();
|
|
848
|
+
}
|
|
849
|
+
}, [isInitialized, sdk]);
|
|
850
|
+
return {
|
|
851
|
+
extensions,
|
|
852
|
+
isLoading,
|
|
853
|
+
error,
|
|
854
|
+
setExtension,
|
|
855
|
+
refresh: fetchExtensions
|
|
856
|
+
};
|
|
857
|
+
}
|
|
858
|
+
function CreditBalance() {
|
|
859
|
+
const { balance, currency, isLoading, error } = useWallet();
|
|
860
|
+
if (error) {
|
|
861
|
+
console.warn("SDK: CreditBalance error:", error);
|
|
862
|
+
}
|
|
863
|
+
const formatted = new Intl.NumberFormat("en-NG", {
|
|
864
|
+
style: "currency",
|
|
865
|
+
currency: currency === "NGN" ? "NGN" : currency || "NGN"
|
|
866
|
+
}).format(balance);
|
|
867
|
+
return /* @__PURE__ */ jsxs("div", { className: "dora-credit-balance px-3 md:px-5 py-2 md:py-3 bg-[#F6F7F9] border border-[#EDEEF1] rounded-full text-xs md:text-sm text-slate-700 whitespace-nowrap", children: [
|
|
868
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs md:text-sm text-slate-500 mr-1 md:mr-2", children: "Credit balance:" }),
|
|
869
|
+
/* @__PURE__ */ jsx("span", { className: "font-semibold", children: isLoading ? "..." : formatted })
|
|
870
|
+
] });
|
|
681
871
|
}
|
|
682
872
|
/*! Bundled license information:
|
|
683
873
|
|
|
@@ -687,6 +877,7 @@ lucide-react/dist/esm/Icon.js:
|
|
|
687
877
|
lucide-react/dist/esm/createLucideIcon.js:
|
|
688
878
|
lucide-react/dist/esm/icons/arrow-down-left.js:
|
|
689
879
|
lucide-react/dist/esm/icons/arrow-up-right.js:
|
|
880
|
+
lucide-react/dist/esm/icons/chevron-down.js:
|
|
690
881
|
lucide-react/dist/esm/icons/delete.js:
|
|
691
882
|
lucide-react/dist/esm/icons/maximize.js:
|
|
692
883
|
lucide-react/dist/esm/icons/mic-off.js:
|
|
@@ -704,6 +895,6 @@ lucide-react/dist/esm/lucide-react.js:
|
|
|
704
895
|
*)
|
|
705
896
|
*/
|
|
706
897
|
|
|
707
|
-
export { CallInterface, Dialpad, DoraCellProvider, useCall, useConnectionStatus, useDoraCell };
|
|
898
|
+
export { CallInterface, CreditBalance, Dialpad, DoraCellProvider, useCall, useConnectionStatus, useDoraCell, useExtensions, useWallet };
|
|
708
899
|
//# sourceMappingURL=index.mjs.map
|
|
709
900
|
//# sourceMappingURL=index.mjs.map
|