@callpromn/rtc-kit-react 0.0.2
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/LICENSE.txt +32 -0
- package/README.md +655 -0
- package/dist/index.d.mts +146 -0
- package/dist/index.d.ts +146 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +59 -0
package/LICENSE.txt
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
SOFTWARE LICENSE AGREEMENT
|
|
2
|
+
|
|
3
|
+
Copyright © 2025 CallPro LLC. All rights reserved.
|
|
4
|
+
|
|
5
|
+
This Software License Agreement (“Agreement”) is a legal agreement between you (“Licensee”) and CallPro LLC (“Licensor”) for the use of the "rtc-kit-react" software (“Software”). By installing, copying, or otherwise using the Software, you agree to be bound by the terms of this Agreement.
|
|
6
|
+
|
|
7
|
+
1. Grant of License
|
|
8
|
+
Licensor grants Licensee a non-exclusive, non-transferable, revocable license to use the Software solely for the purpose of developing applications that interact with or make use of the Software’s functionality.
|
|
9
|
+
|
|
10
|
+
2. Restrictions
|
|
11
|
+
Licensee shall not, directly or indirectly:
|
|
12
|
+
a. Copy, modify, adapt, translate, or create derivative works of the Software.
|
|
13
|
+
b. Reverse-engineer, decompile, disassemble, or otherwise attempt to discover the source code of the Software.
|
|
14
|
+
c. Distribute, sublicense, rent, lease, or sell the Software, in whole or in part, to any third party.
|
|
15
|
+
d. Remove or alter any proprietary notices, labels, or marks from the Software.
|
|
16
|
+
|
|
17
|
+
3. Ownership
|
|
18
|
+
The Software is licensed, not sold. Licensor retains all rights, title, and interest in and to the Software, including all intellectual property rights therein.
|
|
19
|
+
|
|
20
|
+
4. Termination
|
|
21
|
+
This Agreement is effective until terminated. Licensor may terminate this Agreement at any time if Licensee breaches any provision. Upon termination, Licensee must cease all use of the Software and destroy all copies in its possession.
|
|
22
|
+
|
|
23
|
+
5. Disclaimer of Warranty
|
|
24
|
+
The Software is provided “AS IS” without warranty of any kind, whether express, implied, or statutory, including but not limited to warranties of merchantability, fitness for a particular purpose, and non-infringement.
|
|
25
|
+
|
|
26
|
+
6. Limitation of Liability
|
|
27
|
+
In no event shall Licensor be liable for any indirect, incidental, consequential, special, or punitive damages arising out of or related to the use of the Software.
|
|
28
|
+
|
|
29
|
+
7. Governing Law
|
|
30
|
+
This Agreement shall be governed by and construed in accordance with the laws of Mongolia, without regard to conflict of law principles.
|
|
31
|
+
|
|
32
|
+
BY USING THE SOFTWARE, YOU ACKNOWLEDGE THAT YOU HAVE READ THIS AGREEMENT, UNDERSTOOD IT, AND AGREE TO BE BOUND BY ITS TERMS.
|
package/README.md
ADDED
|
@@ -0,0 +1,655 @@
|
|
|
1
|
+
# RTC Kit UI React
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@callpromn/rtc-kit-react)
|
|
4
|
+
[](https://www.npmjs.com/package/@callpromn/rtc-kit-react)
|
|
5
|
+
[](https://www.npmjs.com/package/@callpromn/rtc-kit-react?activeTab=code)
|
|
6
|
+
|
|
7
|
+
RTC Kit UI-ийн React компонентууд - TypeScript дэмжлэг болон интеграцлагдсан дуудлагын удирдлагатай "real-time communication" програм бүтээхэд зориулсан React сан юм.
|
|
8
|
+
|
|
9
|
+
## Онцлогууд
|
|
10
|
+
|
|
11
|
+
⚛️ **React-Анхдагч дизайн** - Hooks болон context бүхий React компонентууд
|
|
12
|
+
🔄 **Интеграцлагдсан дуудлагын удирдлага** - Дуудлагын төлөвийн зориулсан Built-in context provider
|
|
13
|
+
🎨 **Загвар дэмжлэг** - Тохируулга бүхий Light болон Dark mode
|
|
14
|
+
🔧 **Бүрэн TypeScript** - Complete type safety and IntelliSense
|
|
15
|
+
🪝 **React Hooks** - Дуудлагын төлөв удирдахад зориулсан тусгай hooks
|
|
16
|
+
🚀 **Гүйцэтгэл оновчтой** - Үр ашигтай дахин рендер болон санах ойн ашиглалт
|
|
17
|
+
|
|
18
|
+
## Суулгах - Installation
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install @callpromn/rtc-kit-react
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Peer Dependencies:**
|
|
25
|
+
- `react` >= 18.0.0
|
|
26
|
+
- `react-dom` >= 18.0.0
|
|
27
|
+
- `rtc-sdk` >= 1.0.0
|
|
28
|
+
|
|
29
|
+
## Quick start
|
|
30
|
+
|
|
31
|
+
### 1. ClientProvider тохируулах
|
|
32
|
+
|
|
33
|
+
Дуудлагын удирдлагыг идэвхжүүлэхийн тулд өөрийн project-ийг `ClientProvider`-аар wrap хийх ёстой:
|
|
34
|
+
|
|
35
|
+
```tsx
|
|
36
|
+
import React from 'react';
|
|
37
|
+
import { ClientProvider } from '@callpromn/rtc-kit-react';
|
|
38
|
+
|
|
39
|
+
const config = {
|
|
40
|
+
socketUrl: 'wss://your-rtc-server.com',
|
|
41
|
+
socketToken: 'your-socket-token',
|
|
42
|
+
phoneNumber: 'your-company-number',
|
|
43
|
+
socketConnectionOptions: undefined,
|
|
44
|
+
outboundRoom: 'out-bound-room-name',
|
|
45
|
+
inboundRoom: 'in-bound-room-name',
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
function App() {
|
|
49
|
+
return (
|
|
50
|
+
<ClientProvider config={config}>
|
|
51
|
+
<YourAppComponents />
|
|
52
|
+
</ClientProvider>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export default App;
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 2. RTC Компонентуудыг ашиглах
|
|
60
|
+
|
|
61
|
+
```tsx
|
|
62
|
+
import React, { useState } from 'react';
|
|
63
|
+
import {
|
|
64
|
+
CallButton,
|
|
65
|
+
Numpad,
|
|
66
|
+
NumberField,
|
|
67
|
+
NumberDeleteButton,
|
|
68
|
+
useClientContext
|
|
69
|
+
} from '@callpromn/rtc-kit-react';
|
|
70
|
+
|
|
71
|
+
function Dialer() {
|
|
72
|
+
const { isOutboundCall, isCallActive, toPhoneNumber, setToPhoneNumber } = useClientContext();
|
|
73
|
+
|
|
74
|
+
return (
|
|
75
|
+
<div className="dialer">
|
|
76
|
+
{/* Дугаар харуулах */}
|
|
77
|
+
<NumberField
|
|
78
|
+
phoneNumber={toPhoneNumber}
|
|
79
|
+
theme="dark"
|
|
80
|
+
/>
|
|
81
|
+
|
|
82
|
+
{/* Тоон самбар */}
|
|
83
|
+
<Numpad
|
|
84
|
+
phoneNumber={toPhoneNumber}
|
|
85
|
+
onNumberClick={setToPhoneNumber}
|
|
86
|
+
maxLength={15}
|
|
87
|
+
theme="dark"
|
|
88
|
+
/>
|
|
89
|
+
|
|
90
|
+
{/* Удирдлага */}
|
|
91
|
+
<div className="controls">
|
|
92
|
+
<NumberDeleteButton
|
|
93
|
+
phoneNumber={toPhoneNumber}
|
|
94
|
+
onClick={() => setToPhoneNumber(prev => prev.slice(0, -1))}
|
|
95
|
+
theme="dark"
|
|
96
|
+
/>
|
|
97
|
+
|
|
98
|
+
<CallButton
|
|
99
|
+
toPhoneNumber={toPhoneNumber}
|
|
100
|
+
disabled={!toPhoneNumber || isCallActive}
|
|
101
|
+
theme="dark"
|
|
102
|
+
onClick={() => console.log(`${toPhoneNumber} руу дуудаж байна`)}
|
|
103
|
+
/>
|
|
104
|
+
</div>
|
|
105
|
+
|
|
106
|
+
{/* Дуудлагын төлөв */}
|
|
107
|
+
{isOutboundCall && <p>Дуудаж байна...</p>}
|
|
108
|
+
{isCallActive && <p>Дуудлага идэвхтэй</p>}
|
|
109
|
+
</div>
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Компонентууд
|
|
115
|
+
|
|
116
|
+
### 🔗 ClientProvider
|
|
117
|
+
|
|
118
|
+
Дуудлагын төлөв удирдлага болон RTC клиент.
|
|
119
|
+
|
|
120
|
+
```tsx
|
|
121
|
+
import { ClientProvider } from '@callpromn/rtc-kit-react';
|
|
122
|
+
|
|
123
|
+
const config = {
|
|
124
|
+
socketUrl: 'wss://your-rtc-server.com',
|
|
125
|
+
socketToken: 'your-socket-token',
|
|
126
|
+
phoneNumber: 'your-company-number',
|
|
127
|
+
socketConnectionOptions: undefined,
|
|
128
|
+
outboundRoom: 'out-bound-room-name',
|
|
129
|
+
inboundRoom: 'in-bound-room-name',
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
<ClientProvider config={config}>
|
|
133
|
+
{children}
|
|
134
|
+
</ClientProvider>
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**Props:**
|
|
138
|
+
- `config: CallClientConfig` - RTC клиентийн тохиргоо
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
### 🪝 useClientContext Hook
|
|
143
|
+
|
|
144
|
+
Аппын бүх хэсэгт дуудлагын төлөв болон аргуудад хандах.
|
|
145
|
+
|
|
146
|
+
```tsx
|
|
147
|
+
import { useClientContext } from '@callpromn/rtc-kit-react';
|
|
148
|
+
|
|
149
|
+
function CallStatus() {
|
|
150
|
+
const {
|
|
151
|
+
isIncomingCall,
|
|
152
|
+
isOutboundCall,
|
|
153
|
+
isCallActive,
|
|
154
|
+
isConnected,
|
|
155
|
+
inboundUserData,
|
|
156
|
+
createCall,
|
|
157
|
+
acceptCall,
|
|
158
|
+
declineCall,
|
|
159
|
+
endCall,
|
|
160
|
+
toggleMic,
|
|
161
|
+
isMicOn
|
|
162
|
+
} = useClientContext();
|
|
163
|
+
|
|
164
|
+
return (
|
|
165
|
+
<div>
|
|
166
|
+
<p>Холбогдсон: {isConnected ? 'Тийм' : 'Үгүй'}</p>
|
|
167
|
+
<p>Дуудлага идэвхтэй: {isCallActive ? 'Тийм' : 'Үгүй'}</p>
|
|
168
|
+
{isIncomingCall && (
|
|
169
|
+
<div>
|
|
170
|
+
<p>Ирж буй дуудлага: {inboundUserData?.phoneNumber}</p>
|
|
171
|
+
<button onClick={acceptCall}>Хүлээн авах</button>
|
|
172
|
+
<button onClick={declineCall}>Татгалзах</button>
|
|
173
|
+
</div>
|
|
174
|
+
)}
|
|
175
|
+
</div>
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**Буцаах утгууд:**
|
|
181
|
+
- `isIncomingCall: boolean` - Ирж буй дуудлагын төлөв
|
|
182
|
+
- `isOutboundCall: boolean` - Гарч буй дуудлагын төлөв
|
|
183
|
+
- `isCallActive: boolean` - Идэвхтэй дуудлагын төлөв
|
|
184
|
+
- `isConnected: boolean` - Холболтын төлөв
|
|
185
|
+
- `inboundUserData: object` - Ирж буй дуудагчийн өгөгдөл
|
|
186
|
+
- `createCall(phoneNumber: string)` - Дуудлага эхлүүлэх
|
|
187
|
+
- `acceptCall()` - Ирж буй дуудлагыг хүлээн авах
|
|
188
|
+
- `declineCall()` - Ирж буй дуудлагыг татгалзах
|
|
189
|
+
- `endCall()` - Идэвхтэй дуудлагыг дуусгах
|
|
190
|
+
- `toggleMic()` - Микрофоныг асаах/унтраах
|
|
191
|
+
- `isMicOn: boolean` - Микрофоны төлөв
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
### 📞 CallButton
|
|
196
|
+
|
|
197
|
+
Гадагшаа дуудлага хийх.
|
|
198
|
+
|
|
199
|
+
```tsx
|
|
200
|
+
import { CallButton } from '@callpromn/rtc-kit-react';
|
|
201
|
+
|
|
202
|
+
<CallButton
|
|
203
|
+
toPhoneNumber="+1234567890"
|
|
204
|
+
disabled={false}
|
|
205
|
+
theme="dark"
|
|
206
|
+
onClick={(event) => console.log('Тусгай дарах боловсруулагч')}
|
|
207
|
+
style={{ borderRadius: '8px' }}
|
|
208
|
+
/>
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
**Props:**
|
|
212
|
+
- `toPhoneNumber?: string` - Залгах утасны дугаар
|
|
213
|
+
- `disabled?: boolean` - Товчлуурыг идэвхгүй болгох
|
|
214
|
+
- `theme?: 'light' | 'dark'` - Dark болон Light mode
|
|
215
|
+
- `onClick?: (event) => void` - onClick функц
|
|
216
|
+
- `style?: React.CSSProperties` - Inline styling загвар
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
### ✅ AcceptButton
|
|
221
|
+
|
|
222
|
+
Ирж буй дуудлагыг хүлээн авах.
|
|
223
|
+
|
|
224
|
+
```tsx
|
|
225
|
+
import { AcceptButton } from '@callpromn/rtc-kit-react';
|
|
226
|
+
|
|
227
|
+
<AcceptButton
|
|
228
|
+
disabled={!isIncomingCall}
|
|
229
|
+
theme="dark"
|
|
230
|
+
onClick={() => console.log('Дуудлага хүлээн авлаа')}
|
|
231
|
+
/>
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
### ❌ DeclineButton
|
|
237
|
+
|
|
238
|
+
Ирж буй дуудлагыг таслах.
|
|
239
|
+
|
|
240
|
+
```tsx
|
|
241
|
+
import { DeclineButton } from '@callpromn/rtc-kit-react';
|
|
242
|
+
|
|
243
|
+
<DeclineButton
|
|
244
|
+
disabled={!isIncomingCall}
|
|
245
|
+
theme="dark"
|
|
246
|
+
onClick={() => console.log('Дуудлагыг татгалзав')}
|
|
247
|
+
/>
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
### 📞 EndButton
|
|
253
|
+
|
|
254
|
+
Идэвхтэй дуудлагыг дуусгах.
|
|
255
|
+
|
|
256
|
+
```tsx
|
|
257
|
+
import { EndButton } from '@callpromn/rtc-kit-react';
|
|
258
|
+
|
|
259
|
+
<EndButton
|
|
260
|
+
disabled={!isCallActive}
|
|
261
|
+
theme="dark"
|
|
262
|
+
onClick={() => console.log('Дуудлагыг дуусгав')}
|
|
263
|
+
/>
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
### 🎙️ MicButton
|
|
269
|
+
|
|
270
|
+
Дуудлагын үеэр микрофоныг асаах/унтраах.
|
|
271
|
+
|
|
272
|
+
```tsx
|
|
273
|
+
import { MicButton } from '@callpromn/rtc-kit-react';
|
|
274
|
+
|
|
275
|
+
<MicButton
|
|
276
|
+
disabled={!isCallActive}
|
|
277
|
+
theme="dark"
|
|
278
|
+
onClick={() => console.log('Микрофоныг эргүүлэв')}
|
|
279
|
+
/>
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
### 🔢 Numpad
|
|
285
|
+
|
|
286
|
+
Утасны дугаар оруулахад зориулсан интерактив тоон самбар.
|
|
287
|
+
|
|
288
|
+
```tsx
|
|
289
|
+
import { Numpad } from '@callpromn/rtc-kit-react';
|
|
290
|
+
import { useClientContext } from '@callpromn/rtc-kit-react';
|
|
291
|
+
|
|
292
|
+
const { toPhoneNumber, setToPhoneNumber } = useClientContext();
|
|
293
|
+
|
|
294
|
+
<Numpad
|
|
295
|
+
phoneNumber={toPhoneNumber}
|
|
296
|
+
onNumberClick={setToPhoneNumber}
|
|
297
|
+
maxLength={15}
|
|
298
|
+
theme="dark"
|
|
299
|
+
style={{ margin: '20px' }}
|
|
300
|
+
/>
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
**Props:**
|
|
304
|
+
- `phoneNumber: string` - Залгах утасны дугаар
|
|
305
|
+
- `onNumberClick: (value: string) => void` - onNumberClick функц
|
|
306
|
+
- `maxLength?: number` - Оронын хамгийн их тоо (анхдагч: 8)
|
|
307
|
+
- `theme?: 'light' | 'dark'` - Харагдах загвар
|
|
308
|
+
- `style?: React.CSSProperties` - Inline styling загвар
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
### 📱 NumberField
|
|
313
|
+
|
|
314
|
+
Залгах утасны дугаарыг харуулах.
|
|
315
|
+
|
|
316
|
+
```tsx
|
|
317
|
+
import { NumberField } from '@callpromn/rtc-kit-react';
|
|
318
|
+
|
|
319
|
+
<NumberField
|
|
320
|
+
phoneNumber="1234567890"
|
|
321
|
+
theme="dark"
|
|
322
|
+
/>
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
**Props:**
|
|
326
|
+
- `phoneNumber: string` - Залгах утасны дугаар
|
|
327
|
+
- `theme?: 'light' | 'dark'` - Dark болон Light mode
|
|
328
|
+
- `style?: React.CSSProperties` - Inline styling загвар
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
332
|
+
### ⌫ NumberDeleteButton
|
|
333
|
+
|
|
334
|
+
Дугаар устгах товчлуур.
|
|
335
|
+
|
|
336
|
+
```tsx
|
|
337
|
+
import { NumberDeleteButton } from '@callpromn/rtc-kit-react';
|
|
338
|
+
|
|
339
|
+
<NumberDeleteButton
|
|
340
|
+
phoneNumber={phoneNumber}
|
|
341
|
+
onClick={() => setPhoneNumber(prev => prev.slice(0, -1))}
|
|
342
|
+
theme="dark"
|
|
343
|
+
/>
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
**Props:**
|
|
347
|
+
- `phoneNumber: string` - Залгах утасны дугаар
|
|
348
|
+
- `onClick: () => void` - onClick функц
|
|
349
|
+
- `theme?: 'light' | 'dark'` - Dark болон Light mode
|
|
350
|
+
- `style?: React.CSSProperties` - Inline styling загвар
|
|
351
|
+
|
|
352
|
+
## Бүрэн жишээ
|
|
353
|
+
|
|
354
|
+
### Бүрэн функцтэй диалер компонент
|
|
355
|
+
|
|
356
|
+
```tsx
|
|
357
|
+
import React, { useState } from 'react';
|
|
358
|
+
import {
|
|
359
|
+
ClientProvider,
|
|
360
|
+
CallButton,
|
|
361
|
+
AcceptButton,
|
|
362
|
+
DeclineButton,
|
|
363
|
+
EndButton,
|
|
364
|
+
MicButton,
|
|
365
|
+
Numpad,
|
|
366
|
+
NumberField,
|
|
367
|
+
NumberDeleteButton,
|
|
368
|
+
useClientContext
|
|
369
|
+
} from '@callpromn/rtc-kit-react';
|
|
370
|
+
import { CallClientConfig } from 'rtc-sdk';
|
|
371
|
+
|
|
372
|
+
const config: CallClientConfig = {
|
|
373
|
+
apiUrl: 'wss://your-rtc-server.com',
|
|
374
|
+
apiKey: 'your-api-key',
|
|
375
|
+
userId: 'user123'
|
|
376
|
+
};
|
|
377
|
+
|
|
378
|
+
function DialerApp() {
|
|
379
|
+
return (
|
|
380
|
+
<ClientProvider config={config}>
|
|
381
|
+
<MainDialer />
|
|
382
|
+
</ClientProvider>
|
|
383
|
+
);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
function MainDialer() {
|
|
387
|
+
const [phoneNumber, setPhoneNumber] = useState('');
|
|
388
|
+
const {
|
|
389
|
+
isIncomingCall,
|
|
390
|
+
isOutboundCall,
|
|
391
|
+
isCallActive,
|
|
392
|
+
isConnected,
|
|
393
|
+
inboundUserData,
|
|
394
|
+
isMicOn
|
|
395
|
+
} = useClientContext();
|
|
396
|
+
|
|
397
|
+
const handleDeleteNumber = () => {
|
|
398
|
+
setPhoneNumber(prev => prev.slice(0, -1));
|
|
399
|
+
};
|
|
400
|
+
|
|
401
|
+
const clearNumber = () => {
|
|
402
|
+
setPhoneNumber('');
|
|
403
|
+
};
|
|
404
|
+
|
|
405
|
+
return (
|
|
406
|
+
<div className="dialer-app">
|
|
407
|
+
{/* Холболтын төлөв */}
|
|
408
|
+
<div className="status-bar">
|
|
409
|
+
<span>Төлөв: {isConnected ? '🟢 Холбогдсон' : '🔴 Салсан'}</span>
|
|
410
|
+
</div>
|
|
411
|
+
|
|
412
|
+
{/* Ирж буй дуудлагын UI */}
|
|
413
|
+
{isIncomingCall && (
|
|
414
|
+
<div className="incoming-call">
|
|
415
|
+
<h2>Ирж буй дуудлага</h2>
|
|
416
|
+
<p>Хэнээс: {inboundUserData?.phoneNumber || 'Үл мэдэгдэх'}</p>
|
|
417
|
+
<div className="call-actions">
|
|
418
|
+
<AcceptButton theme="dark" />
|
|
419
|
+
<DeclineButton theme="dark" />
|
|
420
|
+
</div>
|
|
421
|
+
</div>
|
|
422
|
+
)}
|
|
423
|
+
|
|
424
|
+
{/* Идэвхтэй дуудлагын UI */}
|
|
425
|
+
{isCallActive && (
|
|
426
|
+
<div className="active-call">
|
|
427
|
+
<h2>Дуудлага идэвхтэй</h2>
|
|
428
|
+
<div className="call-controls">
|
|
429
|
+
<MicButton theme="dark" />
|
|
430
|
+
<EndButton theme="dark" />
|
|
431
|
+
</div>
|
|
432
|
+
<p>Микрофон: {isMicOn ? '🎤 Асаалттай' : '🎤 Унтраалттай'}</p>
|
|
433
|
+
</div>
|
|
434
|
+
)}
|
|
435
|
+
|
|
436
|
+
{/* Диалерын UI (дуудлагагүй үед) */}
|
|
437
|
+
{!isCallActive && !isIncomingCall && (
|
|
438
|
+
<div className="dialer">
|
|
439
|
+
<NumberField
|
|
440
|
+
phoneNumber={phoneNumber}
|
|
441
|
+
theme="dark"
|
|
442
|
+
className="number-display"
|
|
443
|
+
/>
|
|
444
|
+
|
|
445
|
+
<Numpad
|
|
446
|
+
phoneNumber={phoneNumber}
|
|
447
|
+
onNumberClick={setPhoneNumber}
|
|
448
|
+
maxLength={15}
|
|
449
|
+
theme="dark"
|
|
450
|
+
/>
|
|
451
|
+
|
|
452
|
+
<div className="dialer-actions">
|
|
453
|
+
<NumberDeleteButton
|
|
454
|
+
phoneNumber={phoneNumber}
|
|
455
|
+
onClick={handleDeleteNumber}
|
|
456
|
+
theme="dark"
|
|
457
|
+
/>
|
|
458
|
+
|
|
459
|
+
<CallButton
|
|
460
|
+
toPhoneNumber={phoneNumber}
|
|
461
|
+
disabled={!phoneNumber || !isConnected}
|
|
462
|
+
theme="dark"
|
|
463
|
+
/>
|
|
464
|
+
|
|
465
|
+
<button onClick={clearNumber} className="clear-btn">
|
|
466
|
+
Арилгах
|
|
467
|
+
</button>
|
|
468
|
+
</div>
|
|
469
|
+
</div>
|
|
470
|
+
)}
|
|
471
|
+
|
|
472
|
+
{/* Гарч буй дуудлагын төлөв */}
|
|
473
|
+
{isOutboundCall && (
|
|
474
|
+
<div className="outbound-call">
|
|
475
|
+
<p>📞 {phoneNumber} руу дуудаж байна...</p>
|
|
476
|
+
</div>
|
|
477
|
+
)}
|
|
478
|
+
</div>
|
|
479
|
+
);
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
export default DialerApp;
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
### Компонент загварын жишээнүүд
|
|
486
|
+
|
|
487
|
+
```tsx
|
|
488
|
+
// CallButton with custom styles
|
|
489
|
+
<CallButton
|
|
490
|
+
toPhoneNumber={phoneNumber}
|
|
491
|
+
style={{
|
|
492
|
+
backgroundColor: '#007bff',
|
|
493
|
+
width: '80px',
|
|
494
|
+
height: '80px',
|
|
495
|
+
borderRadius: '50%',
|
|
496
|
+
boxShadow: '0 4px 20px rgba(0, 123, 255, 0.4)',
|
|
497
|
+
border: 'none',
|
|
498
|
+
transition: 'all 0.3s ease'
|
|
499
|
+
}}
|
|
500
|
+
theme="dark"
|
|
501
|
+
/>
|
|
502
|
+
|
|
503
|
+
// Numpad with glass effect styling
|
|
504
|
+
<Numpad
|
|
505
|
+
phoneNumber={phoneNumber}
|
|
506
|
+
onNumberClick={setPhoneNumber}
|
|
507
|
+
style={{
|
|
508
|
+
background: 'rgba(255, 255, 255, 0.1)',
|
|
509
|
+
backdropFilter: 'blur(20px)',
|
|
510
|
+
border: '1px solid rgba(255, 255, 255, 0.2)',
|
|
511
|
+
borderRadius: '20px',
|
|
512
|
+
padding: '25px',
|
|
513
|
+
boxShadow: '0 8px 32px rgba(0, 0, 0, 0.1)'
|
|
514
|
+
}}
|
|
515
|
+
theme="dark"
|
|
516
|
+
/>
|
|
517
|
+
|
|
518
|
+
// NumberField with modern input styling
|
|
519
|
+
<NumberField
|
|
520
|
+
phoneNumber={phoneNumber}
|
|
521
|
+
style={{
|
|
522
|
+
background: 'rgba(255, 255, 255, 0.05)',
|
|
523
|
+
border: '2px solid #007bff',
|
|
524
|
+
borderRadius: '12px',
|
|
525
|
+
padding: '16px 20px',
|
|
526
|
+
fontSize: '24px',
|
|
527
|
+
fontWeight: '600',
|
|
528
|
+
color: '#007bff',
|
|
529
|
+
textAlign: 'center',
|
|
530
|
+
minHeight: '60px',
|
|
531
|
+
backdropFilter: 'blur(10px)'
|
|
532
|
+
}}
|
|
533
|
+
theme="dark"
|
|
534
|
+
/>
|
|
535
|
+
|
|
536
|
+
// Button group with consistent styling
|
|
537
|
+
<div style={{ display: 'flex', gap: '15px', justifyContent: 'center' }}>
|
|
538
|
+
<AcceptButton
|
|
539
|
+
style={{
|
|
540
|
+
background: '#28a745',
|
|
541
|
+
width: '70px',
|
|
542
|
+
height: '70px',
|
|
543
|
+
borderRadius: '50%',
|
|
544
|
+
boxShadow: '0 6px 20px rgba(40, 167, 69, 0.4)',
|
|
545
|
+
transition: 'all 0.3s ease'
|
|
546
|
+
}}
|
|
547
|
+
theme="dark"
|
|
548
|
+
/>
|
|
549
|
+
<DeclineButton
|
|
550
|
+
style={{
|
|
551
|
+
background: '#dc3545',
|
|
552
|
+
width: '70px',
|
|
553
|
+
height: '70px',
|
|
554
|
+
borderRadius: '50%',
|
|
555
|
+
boxShadow: '0 6px 20px rgba(220, 53, 69, 0.4)',
|
|
556
|
+
transition: 'all 0.3s ease'
|
|
557
|
+
}}
|
|
558
|
+
theme="dark"
|
|
559
|
+
/>
|
|
560
|
+
<EndButton
|
|
561
|
+
style={{
|
|
562
|
+
background: '#6c757d',
|
|
563
|
+
width: '70px',
|
|
564
|
+
height: '70px',
|
|
565
|
+
borderRadius: '50%',
|
|
566
|
+
boxShadow: '0 6px 20px rgba(108, 117, 125, 0.4)',
|
|
567
|
+
transition: 'all 0.3s ease'
|
|
568
|
+
}}
|
|
569
|
+
theme="dark"
|
|
570
|
+
/>
|
|
571
|
+
</div>
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
## TypeScript дэмжлэг
|
|
575
|
+
|
|
576
|
+
Бүрэн TypeScript type тодорхойлолт багтсан:
|
|
577
|
+
|
|
578
|
+
```tsx
|
|
579
|
+
import type {
|
|
580
|
+
CallClient,
|
|
581
|
+
BaseButtonProps,
|
|
582
|
+
CallButtonProps,
|
|
583
|
+
AcceptButtonProps,
|
|
584
|
+
DeclineButtonProps,
|
|
585
|
+
EndButtonProps,
|
|
586
|
+
MicButtonProps,
|
|
587
|
+
NumpadProps,
|
|
588
|
+
NumberFieldProps,
|
|
589
|
+
NumberDeleteButtonProps,
|
|
590
|
+
ClientProviderProps
|
|
591
|
+
} from '@callpromn/rtc-kit-react';
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
## Next.js интеграци
|
|
595
|
+
|
|
596
|
+
```tsx
|
|
597
|
+
// components/ClientWrapper.tsx
|
|
598
|
+
'use client';
|
|
599
|
+
|
|
600
|
+
import { ClientProvider } from '@callpromn/rtc-kit-react';
|
|
601
|
+
|
|
602
|
+
const config = {
|
|
603
|
+
socketUrl: 'wss://your-rtc-server.com',
|
|
604
|
+
socketToken: 'your-socket-token',
|
|
605
|
+
phoneNumber: 'your-company-number',
|
|
606
|
+
socketConnectionOptions: undefined,
|
|
607
|
+
outboundRoom: 'out-bound-room-name',
|
|
608
|
+
inboundRoom: 'in-bound-room-name',
|
|
609
|
+
};
|
|
610
|
+
|
|
611
|
+
export function ClientWrapper({ children }: { children: React.ReactNode }) {
|
|
612
|
+
return (
|
|
613
|
+
<ClientProvider config={config}>
|
|
614
|
+
{children}
|
|
615
|
+
</ClientProvider>
|
|
616
|
+
);
|
|
617
|
+
}
|
|
618
|
+
```
|
|
619
|
+
|
|
620
|
+
```tsx
|
|
621
|
+
// app/page.tsx
|
|
622
|
+
import { ClientWrapper } from '@/components/ClientWrapper';
|
|
623
|
+
import { Dialer } from '@/components/Dialer';
|
|
624
|
+
|
|
625
|
+
export default function Home() {
|
|
626
|
+
return (
|
|
627
|
+
<ClientWrapper>
|
|
628
|
+
<Dialer />
|
|
629
|
+
</ClientWrapper>
|
|
630
|
+
);
|
|
631
|
+
}
|
|
632
|
+
```
|
|
633
|
+
|
|
634
|
+
## Шаардлага
|
|
635
|
+
|
|
636
|
+
- React 18+
|
|
637
|
+
- TypeScript 4.5+ (санал болгох)
|
|
638
|
+
- Web Components дэмжлэг бүхий modern browser
|
|
639
|
+
|
|
640
|
+
## Холбогдох сангууд - Related Packages
|
|
641
|
+
|
|
642
|
+
- [`rtc-kit`](https://www.npmjs.com/package/@callpromn/rtc-kit) - Vanilla Web Components
|
|
643
|
+
|
|
644
|
+
## Лиценз - License
|
|
645
|
+
|
|
646
|
+
Энэ төсөл нь CallPro LLC-ийн өмчийн програм хангамж юм. Дэлгэрэнгүй мэдээллийг [LICENSE.txt](https://www.npmjs.com/package/@callpromn/rtc-kit-react?activeTab=code)-ээс үзнэ үү.
|
|
647
|
+
|
|
648
|
+
## Дэмжлэг
|
|
649
|
+
|
|
650
|
+
- 📧 И-мэйл: dev@callpro.mn
|
|
651
|
+
- 📖 Баримт бичиг - documentation: [https://docs.callpro.mn](https://docs.callpro.mn)
|
|
652
|
+
|
|
653
|
+
---
|
|
654
|
+
|
|
655
|
+
Made with ❤️ by [CallPro LLC](https://callpro.mn)
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import React$1 from 'react';
|
|
2
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
|
+
import { CallClientConfig } from '@callpromn/rtc-sdk';
|
|
4
|
+
|
|
5
|
+
declare global {
|
|
6
|
+
namespace JSX {
|
|
7
|
+
interface IntrinsicElements {
|
|
8
|
+
'call-button': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
|
|
9
|
+
'to-phone-number'?: string;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
style?: React.CSSProperties;
|
|
12
|
+
theme?: 'light' | 'dark';
|
|
13
|
+
};
|
|
14
|
+
'accept-button': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
style?: React.CSSProperties;
|
|
17
|
+
theme?: 'light' | 'dark';
|
|
18
|
+
};
|
|
19
|
+
'decline-button': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
|
|
20
|
+
disabled?: boolean;
|
|
21
|
+
style?: React.CSSProperties;
|
|
22
|
+
theme?: 'light' | 'dark';
|
|
23
|
+
};
|
|
24
|
+
'endcall-button': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
|
|
25
|
+
disabled?: boolean;
|
|
26
|
+
style?: React.CSSProperties;
|
|
27
|
+
theme?: 'light' | 'dark';
|
|
28
|
+
};
|
|
29
|
+
'mic-button': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
|
|
30
|
+
disabled?: boolean;
|
|
31
|
+
'mic-on'?: string;
|
|
32
|
+
style?: React.CSSProperties;
|
|
33
|
+
theme?: 'light' | 'dark';
|
|
34
|
+
};
|
|
35
|
+
'rtc-numpad': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
|
|
36
|
+
'phone-number'?: string;
|
|
37
|
+
'max-length'?: string;
|
|
38
|
+
style?: React.CSSProperties;
|
|
39
|
+
theme?: 'light' | 'dark';
|
|
40
|
+
};
|
|
41
|
+
'rtc-number-field': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
|
|
42
|
+
'phone-number'?: string;
|
|
43
|
+
style?: React.CSSProperties;
|
|
44
|
+
theme?: 'light' | 'dark';
|
|
45
|
+
};
|
|
46
|
+
'rtc-number-delete-button': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
|
|
47
|
+
'phone-number'?: string;
|
|
48
|
+
visible?: string;
|
|
49
|
+
style?: React.CSSProperties;
|
|
50
|
+
theme?: 'light' | 'dark';
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
interface CallClient {
|
|
57
|
+
acceptCall(): Promise<void>;
|
|
58
|
+
createCall(phoneNumber: string): Promise<void>;
|
|
59
|
+
declineCall(): Promise<void>;
|
|
60
|
+
endCall(): Promise<void>;
|
|
61
|
+
toggleMic(): Promise<void>;
|
|
62
|
+
}
|
|
63
|
+
interface BaseButtonProps {
|
|
64
|
+
className?: string;
|
|
65
|
+
disabled?: boolean;
|
|
66
|
+
onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;
|
|
67
|
+
children?: React.ReactNode;
|
|
68
|
+
style?: React.CSSProperties;
|
|
69
|
+
theme?: 'light' | 'dark';
|
|
70
|
+
}
|
|
71
|
+
interface CallButtonProps extends BaseButtonProps {
|
|
72
|
+
toPhoneNumber?: string;
|
|
73
|
+
}
|
|
74
|
+
type MicButtonProps = BaseButtonProps;
|
|
75
|
+
type AcceptButtonProps = BaseButtonProps;
|
|
76
|
+
type DeclineButtonProps = BaseButtonProps;
|
|
77
|
+
type EndButtonProps = BaseButtonProps;
|
|
78
|
+
interface NumpadProps$1 {
|
|
79
|
+
phoneNumber: string;
|
|
80
|
+
onNumberClick: React.Dispatch<React.SetStateAction<string>>;
|
|
81
|
+
maxLength?: number;
|
|
82
|
+
style?: React.CSSProperties;
|
|
83
|
+
className?: string;
|
|
84
|
+
theme?: 'light' | 'dark';
|
|
85
|
+
}
|
|
86
|
+
interface NumberFieldProps$1 {
|
|
87
|
+
phoneNumber: string;
|
|
88
|
+
style?: React.CSSProperties;
|
|
89
|
+
className?: string;
|
|
90
|
+
theme?: 'light' | 'dark';
|
|
91
|
+
}
|
|
92
|
+
interface NumberDeleteButtonProps$1 {
|
|
93
|
+
phoneNumber: string;
|
|
94
|
+
onClick: () => void;
|
|
95
|
+
style?: React.CSSProperties;
|
|
96
|
+
className?: string;
|
|
97
|
+
theme?: 'light' | 'dark';
|
|
98
|
+
}
|
|
99
|
+
interface ClientProviderProps {
|
|
100
|
+
children: React.ReactNode;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
declare const AcceptButton: React$1.FC<AcceptButtonProps>;
|
|
104
|
+
|
|
105
|
+
declare const CallButton: React$1.FC<CallButtonProps>;
|
|
106
|
+
|
|
107
|
+
declare const DeclineButton: React$1.FC<DeclineButtonProps>;
|
|
108
|
+
|
|
109
|
+
declare const EndButton: React$1.FC<EndButtonProps>;
|
|
110
|
+
|
|
111
|
+
declare const MicButton: React$1.FC<MicButtonProps>;
|
|
112
|
+
|
|
113
|
+
interface NumpadProps {
|
|
114
|
+
phoneNumber: string;
|
|
115
|
+
onNumberClick: React.Dispatch<React.SetStateAction<string>>;
|
|
116
|
+
maxLength?: number;
|
|
117
|
+
style?: React.CSSProperties;
|
|
118
|
+
className?: string;
|
|
119
|
+
theme?: 'light' | 'dark';
|
|
120
|
+
}
|
|
121
|
+
declare const Numpad: React.FC<NumpadProps>;
|
|
122
|
+
|
|
123
|
+
interface NumberFieldProps {
|
|
124
|
+
phoneNumber: string;
|
|
125
|
+
style?: React.CSSProperties;
|
|
126
|
+
className?: string;
|
|
127
|
+
theme?: 'light' | 'dark';
|
|
128
|
+
}
|
|
129
|
+
declare const NumberField: React.FC<NumberFieldProps>;
|
|
130
|
+
|
|
131
|
+
interface NumberDeleteButtonProps {
|
|
132
|
+
phoneNumber: string;
|
|
133
|
+
onClick: () => void;
|
|
134
|
+
style?: React.CSSProperties;
|
|
135
|
+
className?: string;
|
|
136
|
+
theme?: 'light' | 'dark';
|
|
137
|
+
}
|
|
138
|
+
declare const NumberDeleteButton: React.FC<NumberDeleteButtonProps>;
|
|
139
|
+
|
|
140
|
+
declare const ClientProvider: ({ children, config, }: {
|
|
141
|
+
children: React.ReactNode;
|
|
142
|
+
config: CallClientConfig;
|
|
143
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
144
|
+
declare const useClientContext: () => any;
|
|
145
|
+
|
|
146
|
+
export { AcceptButton, type AcceptButtonProps, type BaseButtonProps, CallButton, type CallButtonProps, type CallClient, ClientProvider, type ClientProviderProps, DeclineButton, type DeclineButtonProps, EndButton, type EndButtonProps, MicButton, type MicButtonProps, NumberDeleteButton, type NumberDeleteButtonProps$1 as NumberDeleteButtonProps, NumberField, type NumberFieldProps$1 as NumberFieldProps, Numpad, type NumpadProps$1 as NumpadProps, useClientContext };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import React$1 from 'react';
|
|
2
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
|
+
import { CallClientConfig } from '@callpromn/rtc-sdk';
|
|
4
|
+
|
|
5
|
+
declare global {
|
|
6
|
+
namespace JSX {
|
|
7
|
+
interface IntrinsicElements {
|
|
8
|
+
'call-button': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
|
|
9
|
+
'to-phone-number'?: string;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
style?: React.CSSProperties;
|
|
12
|
+
theme?: 'light' | 'dark';
|
|
13
|
+
};
|
|
14
|
+
'accept-button': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
style?: React.CSSProperties;
|
|
17
|
+
theme?: 'light' | 'dark';
|
|
18
|
+
};
|
|
19
|
+
'decline-button': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
|
|
20
|
+
disabled?: boolean;
|
|
21
|
+
style?: React.CSSProperties;
|
|
22
|
+
theme?: 'light' | 'dark';
|
|
23
|
+
};
|
|
24
|
+
'endcall-button': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
|
|
25
|
+
disabled?: boolean;
|
|
26
|
+
style?: React.CSSProperties;
|
|
27
|
+
theme?: 'light' | 'dark';
|
|
28
|
+
};
|
|
29
|
+
'mic-button': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
|
|
30
|
+
disabled?: boolean;
|
|
31
|
+
'mic-on'?: string;
|
|
32
|
+
style?: React.CSSProperties;
|
|
33
|
+
theme?: 'light' | 'dark';
|
|
34
|
+
};
|
|
35
|
+
'rtc-numpad': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
|
|
36
|
+
'phone-number'?: string;
|
|
37
|
+
'max-length'?: string;
|
|
38
|
+
style?: React.CSSProperties;
|
|
39
|
+
theme?: 'light' | 'dark';
|
|
40
|
+
};
|
|
41
|
+
'rtc-number-field': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
|
|
42
|
+
'phone-number'?: string;
|
|
43
|
+
style?: React.CSSProperties;
|
|
44
|
+
theme?: 'light' | 'dark';
|
|
45
|
+
};
|
|
46
|
+
'rtc-number-delete-button': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
|
|
47
|
+
'phone-number'?: string;
|
|
48
|
+
visible?: string;
|
|
49
|
+
style?: React.CSSProperties;
|
|
50
|
+
theme?: 'light' | 'dark';
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
interface CallClient {
|
|
57
|
+
acceptCall(): Promise<void>;
|
|
58
|
+
createCall(phoneNumber: string): Promise<void>;
|
|
59
|
+
declineCall(): Promise<void>;
|
|
60
|
+
endCall(): Promise<void>;
|
|
61
|
+
toggleMic(): Promise<void>;
|
|
62
|
+
}
|
|
63
|
+
interface BaseButtonProps {
|
|
64
|
+
className?: string;
|
|
65
|
+
disabled?: boolean;
|
|
66
|
+
onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;
|
|
67
|
+
children?: React.ReactNode;
|
|
68
|
+
style?: React.CSSProperties;
|
|
69
|
+
theme?: 'light' | 'dark';
|
|
70
|
+
}
|
|
71
|
+
interface CallButtonProps extends BaseButtonProps {
|
|
72
|
+
toPhoneNumber?: string;
|
|
73
|
+
}
|
|
74
|
+
type MicButtonProps = BaseButtonProps;
|
|
75
|
+
type AcceptButtonProps = BaseButtonProps;
|
|
76
|
+
type DeclineButtonProps = BaseButtonProps;
|
|
77
|
+
type EndButtonProps = BaseButtonProps;
|
|
78
|
+
interface NumpadProps$1 {
|
|
79
|
+
phoneNumber: string;
|
|
80
|
+
onNumberClick: React.Dispatch<React.SetStateAction<string>>;
|
|
81
|
+
maxLength?: number;
|
|
82
|
+
style?: React.CSSProperties;
|
|
83
|
+
className?: string;
|
|
84
|
+
theme?: 'light' | 'dark';
|
|
85
|
+
}
|
|
86
|
+
interface NumberFieldProps$1 {
|
|
87
|
+
phoneNumber: string;
|
|
88
|
+
style?: React.CSSProperties;
|
|
89
|
+
className?: string;
|
|
90
|
+
theme?: 'light' | 'dark';
|
|
91
|
+
}
|
|
92
|
+
interface NumberDeleteButtonProps$1 {
|
|
93
|
+
phoneNumber: string;
|
|
94
|
+
onClick: () => void;
|
|
95
|
+
style?: React.CSSProperties;
|
|
96
|
+
className?: string;
|
|
97
|
+
theme?: 'light' | 'dark';
|
|
98
|
+
}
|
|
99
|
+
interface ClientProviderProps {
|
|
100
|
+
children: React.ReactNode;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
declare const AcceptButton: React$1.FC<AcceptButtonProps>;
|
|
104
|
+
|
|
105
|
+
declare const CallButton: React$1.FC<CallButtonProps>;
|
|
106
|
+
|
|
107
|
+
declare const DeclineButton: React$1.FC<DeclineButtonProps>;
|
|
108
|
+
|
|
109
|
+
declare const EndButton: React$1.FC<EndButtonProps>;
|
|
110
|
+
|
|
111
|
+
declare const MicButton: React$1.FC<MicButtonProps>;
|
|
112
|
+
|
|
113
|
+
interface NumpadProps {
|
|
114
|
+
phoneNumber: string;
|
|
115
|
+
onNumberClick: React.Dispatch<React.SetStateAction<string>>;
|
|
116
|
+
maxLength?: number;
|
|
117
|
+
style?: React.CSSProperties;
|
|
118
|
+
className?: string;
|
|
119
|
+
theme?: 'light' | 'dark';
|
|
120
|
+
}
|
|
121
|
+
declare const Numpad: React.FC<NumpadProps>;
|
|
122
|
+
|
|
123
|
+
interface NumberFieldProps {
|
|
124
|
+
phoneNumber: string;
|
|
125
|
+
style?: React.CSSProperties;
|
|
126
|
+
className?: string;
|
|
127
|
+
theme?: 'light' | 'dark';
|
|
128
|
+
}
|
|
129
|
+
declare const NumberField: React.FC<NumberFieldProps>;
|
|
130
|
+
|
|
131
|
+
interface NumberDeleteButtonProps {
|
|
132
|
+
phoneNumber: string;
|
|
133
|
+
onClick: () => void;
|
|
134
|
+
style?: React.CSSProperties;
|
|
135
|
+
className?: string;
|
|
136
|
+
theme?: 'light' | 'dark';
|
|
137
|
+
}
|
|
138
|
+
declare const NumberDeleteButton: React.FC<NumberDeleteButtonProps>;
|
|
139
|
+
|
|
140
|
+
declare const ClientProvider: ({ children, config, }: {
|
|
141
|
+
children: React.ReactNode;
|
|
142
|
+
config: CallClientConfig;
|
|
143
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
144
|
+
declare const useClientContext: () => any;
|
|
145
|
+
|
|
146
|
+
export { AcceptButton, type AcceptButtonProps, type BaseButtonProps, CallButton, type CallButtonProps, type CallClient, ClientProvider, type ClientProviderProps, DeclineButton, type DeclineButtonProps, EndButton, type EndButtonProps, MicButton, type MicButtonProps, NumberDeleteButton, type NumberDeleteButtonProps$1 as NumberDeleteButtonProps, NumberField, type NumberFieldProps$1 as NumberFieldProps, Numpad, type NumpadProps$1 as NumpadProps, useClientContext };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var rtcSdk=require('@callpromn/rtc-sdk'),react=require('react'),jsxRuntime=require('react/jsx-runtime');var P=react.createContext(null),q=({children:t,config:a})=>{let o=rtcSdk.CallClient(),e=react.useRef(null),[c,l]=react.useState(null),[s,n]=react.useState(false),[i,r]=react.useState(false),[m,C]=react.useState(false),[p,d]=react.useState(false),[h,S]=react.useState(""),[v,D]=react.useState(true);react.useEffect(()=>{w();},[]);let w=async()=>{try{e.current=await o.createClient(a),e.current.on("call_init",async f=>{if(f==="incoming"){let U=await e.current.getInboundUserData();l(U),n(!0);}}),e.current.on("hangup",()=>{console.log("\u{1F4DE} [CallClientProvider] \u0414\u0443\u0443\u0434\u043B\u0430\u0433\u044B\u0433 \u0442\u0430\u0441\u0430\u043B\u043B\u0430\u0430."),n(!1),r(!1),d(!1);}),e.current.on("busy",()=>{console.log("\u{1F4DE} [CallClientProvider] \u0414\u0443\u0443\u0434\u043B\u0430\u0433\u044B\u0433 \u0430\u0432\u0430\u0445\u044B\u0433 \u0442\u0430\u0442\u0433\u0430\u043B\u0437\u043B\u0430\u0430."),n(!1),r(!1),d(!1);}),e.current.on("answered",()=>{console.log("\u{1F4DE} [CallClientProvider] \u0414\u0443\u0443\u0434\u043B\u0430\u0433\u044B\u0433 \u0445\u04AF\u043B\u044D\u044D\u0436 \u0430\u0432\u043B\u0430\u0430."),n(!1),r(!1),d(!0);}),e.current.on("bye",()=>{console.log("\u{1F4DE} [CallClientProvider] \u0414\u0443\u0443\u0434\u043B\u0430\u0433\u044B\u0433 \u0442\u0430\u0441\u0430\u043B\u043B\u0430\u0430."),n(!1),r(!1),d(!1);}),C(e.current.isConnected()),console.log("\u2705 \u0414\u0443\u0443\u0434\u043B\u0430\u0433\u044B\u043D \u043A\u043B\u0438\u0435\u043D\u0442 \u0430\u043C\u0436\u0438\u043B\u0442\u0442\u0430\u0439 \u0445\u043E\u043B\u0431\u043E\u0433\u0434\u043E\u0436 \u0431\u044D\u043B\u044D\u043D \u0431\u043E\u043B\u043B\u043E\u043E.");}catch(f){console.error("\u274C \u0414\u0443\u0443\u0434\u043B\u0430\u0433\u044B\u043D \u043A\u043B\u0438\u0435\u043D\u0442 \u04AF\u04AF\u0441\u0433\u044D\u0445\u044D\u0434 \u0430\u043B\u0434\u0430\u0430 \u0433\u0430\u0440\u043B\u0430\u0430:",f);}},x=async()=>{e.current&&(await e.current.declineCall(),n(false));},F=async()=>{e.current&&(await e.current.acceptCall(),n(false),r(false),d(true));},A=async f=>{e.current&&(await e.current.createCall(f),r(true));},I=async()=>{e.current&&(await e.current.endCall(),d(false),r(false));},O=async()=>{e.current&&await e.current.toggleMic();},W=()=>{C(false),setTimeout(()=>{if(e.current){let f=e.current.isConnected();return C(f),console.log(`\u{1F50C} \u0414\u0443\u0443\u0434\u043B\u0430\u0433\u044B\u043D \u0441\u0435\u0440\u0432\u0435\u0440: ${f?"\u0425\u043E\u043B\u0431\u043E\u0433\u0434\u0441\u043E\u043D":"\u0425\u043E\u043B\u0431\u043E\u0433\u0434\u043E\u043E\u0433\u04AF\u0439"}`),f}return false},1e3);};return jsxRuntime.jsx(P.Provider,{value:{isIncomingCall:s,isOutboundCall:i,isConnected:m,isCallActive:p,checkConnectionStatus:W,inboundUserData:c,declineCall:x,acceptCall:F,createCall:A,endCall:I,toggleMic:O,toPhoneNumber:h,setToPhoneNumber:S,isMicOn:v,setIsMicOn:D},children:t})},u=()=>{let t=react.useContext(P);if(!t)throw new Error("useClientContext-\u0433 \u0437\u04E9\u0432\u0445\u04E9\u043D ClientProvider-\u0438\u0439\u043D \u0434\u043E\u0442\u043E\u0440 \u0430\u0448\u0438\u0433\u043B\u0430\u0445 \u0451\u0441\u0442\u043E\u0439!");return t};var G=({className:t="",disabled:a,onClick:o,style:e,theme:c="dark",...l})=>{let{acceptCall:s}=u();return jsxRuntime.jsx("accept-button",{disabled:a,className:t,onClick:async i=>{try{await s(),o&&o(i);}catch(r){console.error("Failed to accept call:",r);}},style:e,theme:c,...l})},R=G;var Q=({toPhoneNumber:t="",className:a="",disabled:o,onClick:e,style:c,theme:l="dark",...s})=>{let{createCall:n}=u();return jsxRuntime.jsx("call-button",{"to-phone-number":t,disabled:o,className:a,onClick:async r=>{try{t&&await n(t),e&&e(r);}catch(m){console.error("Failed to create call:",m);}},style:c,theme:l,...s})},g=Q;var Z=({className:t="",disabled:a,onClick:o,style:e,...c})=>{let{declineCall:l}=u();return jsxRuntime.jsx("decline-button",{disabled:a,className:t,onClick:async n=>{try{await l(),o&&o(n);}catch(i){console.error("Failed to decline call:",i);}},style:e,...c})},M=Z;var ee=({className:t="",disabled:a,onClick:o,style:e,...c})=>{let{endCall:l}=u();return jsxRuntime.jsx("endcall-button",{disabled:a,className:t,onClick:async n=>{try{await l(),o&&o(n);}catch(i){console.error("Failed to end call:",i);}},style:e,...c})},E=ee;var ne=({className:t="",disabled:a,onClick:o,style:e,...c})=>{let{toggleMic:l,isMicOn:s,setIsMicOn:n}=u();return jsxRuntime.jsx("mic-button",{disabled:a,"mic-on":s?"":void 0,className:t,onClick:async r=>{try{await l(),n(!s),o&&o(r);}catch(m){console.error("Failed to toggle mic:",m);}},style:e,...c})},B=ne;var se=({phoneNumber:t,onNumberClick:a,maxLength:o=8,style:e,className:c,theme:l="dark"})=>{let s=react.useRef(null),[n,i]=react.useState(false);return react.useEffect(()=>{typeof window<"u"&&import('@callpromn/rtc-kit').then(()=>{customElements.get("rtc-numpad")?i(true):customElements.whenDefined("rtc-numpad").then(()=>{i(true);});}).catch(console.error);},[]),react.useEffect(()=>{let r=s.current;if(!r||!n)return;let m=C=>{let p=C;if(p.detail){let{value:d}=p.detail;a(h=>h.length<o?h+d:h);}};return r.addEventListener("number-click",m),()=>{r.removeEventListener("number-click",m);}},[a,o,n]),react.useEffect(()=>{if(s.current&&n){let r=s.current;r.setPhoneNumber&&r.setPhoneNumber(t);}},[t,n]),n?jsxRuntime.jsx("rtc-numpad",{ref:s,"phone-number":t,"max-length":o.toString(),style:e,className:c,theme:l}):null},T=se;var ue=({phoneNumber:t,style:a,className:o,theme:e="dark"})=>{let c=react.useRef(null),[l,s]=react.useState(false);return react.useEffect(()=>{typeof window<"u"&&import('@callpromn/rtc-kit').then(()=>{customElements.get("rtc-number-field")?s(true):customElements.whenDefined("rtc-number-field").then(()=>{s(true);});}).catch(console.error);},[]),react.useEffect(()=>{if(c.current&&l){let n=c.current;n.setPhoneNumber&&n.setPhoneNumber(t);}},[t,l]),l?jsxRuntime.jsx("rtc-number-field",{ref:c,"phone-number":t,style:a,className:o,theme:e}):null},N=ue;var pe=({phoneNumber:t,onClick:a,style:o,className:e,theme:c="dark"})=>{let{toPhoneNumber:l,setToPhoneNumber:s}=u(),n=react.useRef(null),[i,r]=react.useState(false),m=t.length>0;react.useEffect(()=>{typeof window<"u"&&import('@callpromn/rtc-kit').then(()=>{customElements.get("rtc-number-delete-button")?r(true):customElements.whenDefined("rtc-number-delete-button").then(()=>{r(true);});}).catch(console.error);},[]);let C=async p=>{try{l&&s(l.slice(0,-1)),a&&a();}catch(d){console.error("Failed to create call:",d);}};return react.useEffect(()=>{if(n.current&&i){let p=n.current;p.setPhoneNumber&&p.setPhoneNumber(t);}},[t,i]),!i||!m?null:jsxRuntime.jsx("rtc-number-delete-button",{ref:n,"phone-number":t,visible:m.toString(),style:o,className:e,theme:c,onClick:C})},k=pe;exports.AcceptButton=R;exports.CallButton=g;exports.ClientProvider=q;exports.DeclineButton=M;exports.EndButton=E;exports.MicButton=B;exports.NumberDeleteButton=k;exports.NumberField=N;exports.Numpad=T;exports.useClientContext=u;//# sourceMappingURL=index.js.map
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/context/ClientProvider.tsx","../src/components/AcceptButton.tsx","../src/components/CallButton.tsx","../src/components/DeclineButton.tsx","../src/components/EndButton.tsx","../src/components/MicButton.tsx","../src/components/Numpad.tsx","../src/components/NumberField.tsx","../src/components/NumberDeleteButton.tsx"],"names":["ClientContext","createContext","ClientProvider","children","config","callClient","CallClient","callClientInstance","useRef","inboundUserData","setInboundUserData","useState","isIncomingCall","setIsIncomingCall","isOutboundCall","setIsOutboundCall","isConnected","setIsConnected","isCallActive","setIsCallActive","toPhoneNumber","setToPhoneNumber","isMicOn","setIsMicOn","useEffect","createCallClient","data","error","declineCall","acceptCall","createCall","endCall","toggleMic","checkConnectionStatus","connected","jsx","useClientContext","context","useContext","AcceptButton","className","disabled","onClick","style","theme","props","event","AcceptButton_default","CallButton","CallButton_default","DeclineButton","DeclineButton_default","EndButton","EndButton_default","MicButton","MicButton_default","Numpad","phoneNumber","onNumberClick","maxLength","numpadRef","isWebComponentReady","setIsWebComponentReady","numpadElement","handleNumberClick","customEvent","value","prev","webComponent","Numpad_default","NumberField","numberFieldRef","NumberField_default","NumberDeleteButton","deleteButtonRef","isVisible","handleClick","NumberDeleteButton_default"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\n\nimport { CallClientConfig, CallClient } from '@callpromn/rtc-sdk';\nimport { createContext, useContext, useEffect, useRef, useState } from 'react';\n\nconst ClientContext = createContext<any>(null);\n\nconst ClientProvider = ({\n children,\n config,\n}: {\n children: React.ReactNode;\n config: CallClientConfig;\n}) => {\n const callClient = CallClient();\n const callClientInstance = useRef<any>(null);\n\n const [inboundUserData, setInboundUserData] = useState<any>(null);\n const [isIncomingCall, setIsIncomingCall] = useState(false);\n const [isOutboundCall, setIsOutboundCall] = useState(false);\n const [isConnected, setIsConnected] = useState(false);\n const [isCallActive, setIsCallActive] = useState(false);\n const [toPhoneNumber, setToPhoneNumber] = useState('');\n const [isMicOn, setIsMicOn] = useState(true);\n\n useEffect(() => {\n createCallClient();\n }, []);\n\n const createCallClient = async () => {\n try {\n callClientInstance.current = await callClient.createClient(config);\n\n callClientInstance.current.on('call_init', async (data: any) => {\n if (data === 'incoming') {\n const inboundUserData =\n await callClientInstance.current.getInboundUserData();\n setInboundUserData(inboundUserData);\n setIsIncomingCall(true);\n }\n });\n\n callClientInstance.current.on('hangup', () => {\n console.log('📞 [CallClientProvider] Дуудлагыг тасаллаа.');\n setIsIncomingCall(false);\n setIsOutboundCall(false);\n setIsCallActive(false);\n });\n\n callClientInstance.current.on('busy', () => {\n console.log('📞 [CallClientProvider] Дуудлагыг авахыг татгалзлаа.');\n setIsIncomingCall(false);\n setIsOutboundCall(false);\n setIsCallActive(false);\n });\n\n callClientInstance.current.on('answered', () => {\n console.log('📞 [CallClientProvider] Дуудлагыг хүлээж авлаа.');\n setIsIncomingCall(false);\n setIsOutboundCall(false);\n setIsCallActive(true);\n });\n\n callClientInstance.current.on('bye', () => {\n console.log('📞 [CallClientProvider] Дуудлагыг тасаллаа.');\n setIsIncomingCall(false);\n setIsOutboundCall(false);\n setIsCallActive(false);\n });\n\n // Socket-ын холболтын төлөвийг шалгах\n setIsConnected(callClientInstance.current.isConnected());\n console.log('✅ Дуудлагын клиент амжилттай холбогдож бэлэн боллоо.');\n } catch (error) {\n console.error('❌ Дуудлагын клиент үүсгэхэд алдаа гарлаа:', error);\n }\n };\n\n const declineCall = async () => {\n if (callClientInstance.current) {\n await callClientInstance.current.declineCall();\n setIsIncomingCall(false);\n }\n };\n\n const acceptCall = async () => {\n if (callClientInstance.current) {\n await callClientInstance.current.acceptCall();\n setIsIncomingCall(false);\n setIsOutboundCall(false);\n setIsCallActive(true);\n }\n };\n\n const createCall = async (toPhoneNumber: string) => {\n if (callClientInstance.current) {\n await callClientInstance.current.createCall(toPhoneNumber);\n setIsOutboundCall(true);\n }\n };\n\n const endCall = async () => {\n if (callClientInstance.current) {\n await callClientInstance.current.endCall();\n setIsCallActive(false);\n setIsOutboundCall(false);\n }\n };\n\n const toggleMic = async () => {\n if (callClientInstance.current) {\n await callClientInstance.current.toggleMic();\n }\n };\n\n const checkConnectionStatus = () => {\n setIsConnected(false);\n setTimeout(() => {\n if (callClientInstance.current) {\n const connected = callClientInstance.current.isConnected();\n setIsConnected(connected);\n console.log(\n `🔌 Дуудлагын сервер: ${connected ? 'Холбогдсон' : 'Холбогдоогүй'}`\n );\n return connected;\n }\n return false;\n }, 1000);\n };\n\n return (\n <ClientContext.Provider\n value={{\n isIncomingCall,\n isOutboundCall,\n isConnected,\n isCallActive,\n checkConnectionStatus,\n inboundUserData,\n declineCall,\n acceptCall,\n createCall,\n endCall,\n toggleMic,\n toPhoneNumber,\n setToPhoneNumber,\n isMicOn,\n setIsMicOn,\n }}\n >\n {children}\n </ClientContext.Provider>\n );\n};\n\nconst useClientContext = () => {\n const context = useContext(ClientContext);\n if (!context) {\n throw new Error(\n 'useClientContext-г зөвхөн ClientProvider-ийн дотор ашиглах ёстой!'\n );\n }\n return context;\n};\n\nexport { ClientProvider, useClientContext };\n","import React from 'react';\nimport '../types/web-components';\nimport { AcceptButtonProps } from '../types';\nimport { useClientContext } from '../context/ClientProvider';\n\nconst AcceptButton: React.FC<AcceptButtonProps> = ({\n className = '',\n disabled,\n onClick,\n style,\n theme = 'dark',\n ...props\n}) => {\n const { acceptCall } = useClientContext();\n\n const handleClick = async (event: React.MouseEvent) => {\n try {\n await acceptCall();\n\n if (onClick) onClick(event as any);\n } catch (error) {\n console.error('Failed to accept call:', error);\n }\n };\n\n return (\n <accept-button\n disabled={disabled}\n className={className}\n onClick={handleClick}\n style={style}\n theme={theme}\n {...props}\n />\n );\n};\n\nexport default AcceptButton;\n","import React from 'react';\nimport '../types/web-components';\nimport { CallButtonProps } from '../types';\nimport { useClientContext } from '../context/ClientProvider';\n\nconst CallButton: React.FC<CallButtonProps> = ({\n toPhoneNumber = '',\n className = '',\n disabled,\n onClick,\n style,\n theme = 'dark',\n ...props\n}) => {\n const { createCall } = useClientContext();\n\n const handleClick = async (event: React.MouseEvent) => {\n try {\n if (toPhoneNumber) await createCall(toPhoneNumber);\n\n if (onClick) onClick(event as any);\n } catch (error) {\n console.error('Failed to create call:', error);\n }\n };\n\n return (\n <call-button\n to-phone-number={toPhoneNumber}\n disabled={disabled}\n className={className}\n onClick={handleClick}\n style={style}\n theme={theme}\n {...props}\n />\n );\n};\n\nexport default CallButton;\n","import React from 'react';\nimport '../types/web-components';\nimport { DeclineButtonProps } from '../types';\nimport { useClientContext } from '../context/ClientProvider';\n\nconst DeclineButton: React.FC<DeclineButtonProps> = ({\n className = '',\n disabled,\n onClick,\n style,\n ...props\n}) => {\n const { declineCall } = useClientContext();\n\n const handleClick = async (event: React.MouseEvent) => {\n try {\n await declineCall();\n if (onClick) onClick(event as any);\n } catch (error) {\n console.error('Failed to decline call:', error);\n }\n };\n\n return (\n <decline-button\n disabled={disabled}\n className={className}\n onClick={handleClick}\n style={style}\n {...props}\n />\n );\n};\n\nexport default DeclineButton;\n","import React from 'react';\nimport '../types/web-components';\nimport { EndButtonProps } from '../types';\nimport { useClientContext } from '../context/ClientProvider';\n\nconst EndButton: React.FC<EndButtonProps> = ({\n className = '',\n disabled,\n onClick,\n style,\n ...props\n}) => {\n const { endCall } = useClientContext();\n\n const handleClick = async (event: React.MouseEvent) => {\n try {\n await endCall();\n\n if (onClick) onClick(event as any);\n } catch (error) {\n console.error('Failed to end call:', error);\n }\n };\n\n return (\n <endcall-button\n disabled={disabled}\n className={className}\n onClick={handleClick}\n style={style}\n {...props}\n />\n );\n};\n\nexport default EndButton;\n","import React from 'react';\nimport '../types/web-components';\nimport { MicButtonProps } from '../types';\nimport { useClientContext } from '../context/ClientProvider';\n\nconst MicButton: React.FC<MicButtonProps> = ({\n className = '',\n disabled,\n onClick,\n style,\n ...props\n}) => {\n const { toggleMic, isMicOn, setIsMicOn } = useClientContext();\n\n const handleClick = async (event: React.MouseEvent) => {\n try {\n await toggleMic();\n setIsMicOn(!isMicOn);\n\n if (onClick) onClick(event as any);\n } catch (error) {\n console.error('Failed to toggle mic:', error);\n }\n };\n\n return (\n <mic-button\n disabled={disabled}\n mic-on={isMicOn ? '' : undefined}\n className={className}\n onClick={handleClick}\n style={style}\n {...props}\n />\n );\n};\n\nexport default MicButton;\n","'use client';\n\nimport '../types/web-components';\nimport { useEffect, useRef, useState } from 'react';\n\ninterface NumpadProps {\n phoneNumber: string;\n onNumberClick: React.Dispatch<React.SetStateAction<string>>;\n maxLength?: number;\n style?: React.CSSProperties;\n className?: string;\n theme?: 'light' | 'dark';\n}\n\nconst Numpad: React.FC<NumpadProps> = ({\n phoneNumber,\n onNumberClick,\n maxLength = 8,\n style,\n className,\n theme = 'dark',\n}) => {\n const numpadRef = useRef<HTMLElement>(null);\n const [isWebComponentReady, setIsWebComponentReady] = useState(false);\n\n useEffect(() => {\n if (typeof window !== 'undefined') {\n import('@callpromn/rtc-kit')\n .then(() => {\n // Wait for the web component to be defined\n if (customElements.get('rtc-numpad')) {\n setIsWebComponentReady(true);\n } else {\n customElements.whenDefined('rtc-numpad').then(() => {\n setIsWebComponentReady(true);\n });\n }\n })\n .catch(console.error);\n }\n }, []);\n\n useEffect(() => {\n const numpadElement = numpadRef.current;\n if (!numpadElement || !isWebComponentReady) return;\n\n const handleNumberClick = (event: Event) => {\n const customEvent = event as CustomEvent<{\n value: string;\n phoneNumber: string;\n }>;\n if (customEvent.detail) {\n const { value } = customEvent.detail;\n onNumberClick((prev: string) => {\n if (prev.length < maxLength) {\n return prev + value;\n }\n return prev;\n });\n }\n };\n\n numpadElement.addEventListener('number-click', handleNumberClick);\n\n return () => {\n numpadElement.removeEventListener('number-click', handleNumberClick);\n };\n }, [onNumberClick, maxLength, isWebComponentReady]);\n\n // Sync phoneNumber prop with web component attribute\n useEffect(() => {\n if (numpadRef.current && isWebComponentReady) {\n const webComponent = numpadRef.current as any;\n if (webComponent.setPhoneNumber) {\n webComponent.setPhoneNumber(phoneNumber);\n }\n }\n }, [phoneNumber, isWebComponentReady]);\n\n if (!isWebComponentReady) {\n // Loading fallback while web component loads\n return null;\n }\n\n return (\n <rtc-numpad\n ref={numpadRef}\n phone-number={phoneNumber}\n max-length={maxLength.toString()}\n style={style}\n className={className}\n theme={theme}\n />\n );\n};\n\nexport default Numpad;\n","'use client';\n\nimport '../types/web-components';\nimport { useEffect, useRef, useState } from 'react';\n\ninterface NumberFieldProps {\n phoneNumber: string;\n style?: React.CSSProperties;\n className?: string;\n theme?: 'light' | 'dark';\n}\n\nconst NumberField: React.FC<NumberFieldProps> = ({\n phoneNumber,\n style,\n className,\n theme = 'dark',\n}) => {\n const numberFieldRef = useRef<HTMLElement>(null);\n const [isWebComponentReady, setIsWebComponentReady] = useState(false);\n\n useEffect(() => {\n if (typeof window !== 'undefined') {\n import('@callpromn/rtc-kit')\n .then(() => {\n // Wait for the web component to be defined\n if (customElements.get('rtc-number-field')) {\n setIsWebComponentReady(true);\n } else {\n customElements.whenDefined('rtc-number-field').then(() => {\n setIsWebComponentReady(true);\n });\n }\n })\n .catch(console.error);\n }\n }, []);\n\n // Sync phoneNumber prop with web component attribute\n useEffect(() => {\n if (numberFieldRef.current && isWebComponentReady) {\n const webComponent = numberFieldRef.current as any;\n if (webComponent.setPhoneNumber) {\n webComponent.setPhoneNumber(phoneNumber);\n }\n }\n }, [phoneNumber, isWebComponentReady]);\n\n if (!isWebComponentReady) {\n // Loading fallback while web component loads\n return null;\n }\n\n return (\n <rtc-number-field\n ref={numberFieldRef}\n phone-number={phoneNumber}\n style={style}\n className={className}\n theme={theme}\n />\n );\n};\n\nexport default NumberField;\n","'use client';\n\nimport '../types/web-components';\nimport { useEffect, useRef, useState } from 'react';\nimport { useClientContext } from '../context/ClientProvider';\n\ninterface NumberDeleteButtonProps {\n phoneNumber: string;\n onClick: () => void;\n style?: React.CSSProperties;\n className?: string;\n theme?: 'light' | 'dark';\n}\n\nconst NumberDeleteButton: React.FC<NumberDeleteButtonProps> = ({\n phoneNumber,\n onClick,\n style,\n className,\n theme = 'dark',\n}) => {\n const { toPhoneNumber, setToPhoneNumber } = useClientContext();\n const deleteButtonRef = useRef<HTMLElement>(null);\n const [isWebComponentReady, setIsWebComponentReady] = useState(false);\n const isVisible = phoneNumber.length > 0;\n\n useEffect(() => {\n if (typeof window !== 'undefined') {\n import('@callpromn/rtc-kit')\n .then(() => {\n // Wait for the web component to be defined\n if (customElements.get('rtc-number-delete-button')) {\n setIsWebComponentReady(true);\n } else {\n customElements.whenDefined('rtc-number-delete-button').then(() => {\n setIsWebComponentReady(true);\n });\n }\n })\n .catch(console.error);\n }\n }, []);\n\n const handleClick = async (event: React.MouseEvent) => {\n try {\n if (toPhoneNumber) setToPhoneNumber(toPhoneNumber.slice(0, -1));\n if (onClick) onClick();\n } catch (error) {\n console.error('Failed to create call:', error);\n }\n };\n\n // Sync phoneNumber prop with web component attribute\n useEffect(() => {\n if (deleteButtonRef.current && isWebComponentReady) {\n const webComponent = deleteButtonRef.current as any;\n if (webComponent.setPhoneNumber) {\n webComponent.setPhoneNumber(phoneNumber);\n }\n }\n }, [phoneNumber, isWebComponentReady]);\n\n if (!isWebComponentReady || !isVisible) {\n return null;\n }\n\n return (\n <rtc-number-delete-button\n ref={deleteButtonRef}\n phone-number={phoneNumber}\n visible={isVisible.toString()}\n style={style}\n className={className}\n theme={theme}\n onClick={handleClick}\n />\n );\n};\n\nexport default NumberDeleteButton;\n"]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {CallClient}from'@callpromn/rtc-sdk';import {createContext,useRef,useState,useEffect,useContext}from'react';import {jsx}from'react/jsx-runtime';var P=createContext(null),q=({children:t,config:a})=>{let o=CallClient(),e=useRef(null),[c,l]=useState(null),[s,n]=useState(false),[i,r]=useState(false),[m,C]=useState(false),[p,d]=useState(false),[h,S]=useState(""),[v,D]=useState(true);useEffect(()=>{w();},[]);let w=async()=>{try{e.current=await o.createClient(a),e.current.on("call_init",async f=>{if(f==="incoming"){let U=await e.current.getInboundUserData();l(U),n(!0);}}),e.current.on("hangup",()=>{console.log("\u{1F4DE} [CallClientProvider] \u0414\u0443\u0443\u0434\u043B\u0430\u0433\u044B\u0433 \u0442\u0430\u0441\u0430\u043B\u043B\u0430\u0430."),n(!1),r(!1),d(!1);}),e.current.on("busy",()=>{console.log("\u{1F4DE} [CallClientProvider] \u0414\u0443\u0443\u0434\u043B\u0430\u0433\u044B\u0433 \u0430\u0432\u0430\u0445\u044B\u0433 \u0442\u0430\u0442\u0433\u0430\u043B\u0437\u043B\u0430\u0430."),n(!1),r(!1),d(!1);}),e.current.on("answered",()=>{console.log("\u{1F4DE} [CallClientProvider] \u0414\u0443\u0443\u0434\u043B\u0430\u0433\u044B\u0433 \u0445\u04AF\u043B\u044D\u044D\u0436 \u0430\u0432\u043B\u0430\u0430."),n(!1),r(!1),d(!0);}),e.current.on("bye",()=>{console.log("\u{1F4DE} [CallClientProvider] \u0414\u0443\u0443\u0434\u043B\u0430\u0433\u044B\u0433 \u0442\u0430\u0441\u0430\u043B\u043B\u0430\u0430."),n(!1),r(!1),d(!1);}),C(e.current.isConnected()),console.log("\u2705 \u0414\u0443\u0443\u0434\u043B\u0430\u0433\u044B\u043D \u043A\u043B\u0438\u0435\u043D\u0442 \u0430\u043C\u0436\u0438\u043B\u0442\u0442\u0430\u0439 \u0445\u043E\u043B\u0431\u043E\u0433\u0434\u043E\u0436 \u0431\u044D\u043B\u044D\u043D \u0431\u043E\u043B\u043B\u043E\u043E.");}catch(f){console.error("\u274C \u0414\u0443\u0443\u0434\u043B\u0430\u0433\u044B\u043D \u043A\u043B\u0438\u0435\u043D\u0442 \u04AF\u04AF\u0441\u0433\u044D\u0445\u044D\u0434 \u0430\u043B\u0434\u0430\u0430 \u0433\u0430\u0440\u043B\u0430\u0430:",f);}},x=async()=>{e.current&&(await e.current.declineCall(),n(false));},F=async()=>{e.current&&(await e.current.acceptCall(),n(false),r(false),d(true));},A=async f=>{e.current&&(await e.current.createCall(f),r(true));},I=async()=>{e.current&&(await e.current.endCall(),d(false),r(false));},O=async()=>{e.current&&await e.current.toggleMic();},W=()=>{C(false),setTimeout(()=>{if(e.current){let f=e.current.isConnected();return C(f),console.log(`\u{1F50C} \u0414\u0443\u0443\u0434\u043B\u0430\u0433\u044B\u043D \u0441\u0435\u0440\u0432\u0435\u0440: ${f?"\u0425\u043E\u043B\u0431\u043E\u0433\u0434\u0441\u043E\u043D":"\u0425\u043E\u043B\u0431\u043E\u0433\u0434\u043E\u043E\u0433\u04AF\u0439"}`),f}return false},1e3);};return jsx(P.Provider,{value:{isIncomingCall:s,isOutboundCall:i,isConnected:m,isCallActive:p,checkConnectionStatus:W,inboundUserData:c,declineCall:x,acceptCall:F,createCall:A,endCall:I,toggleMic:O,toPhoneNumber:h,setToPhoneNumber:S,isMicOn:v,setIsMicOn:D},children:t})},u=()=>{let t=useContext(P);if(!t)throw new Error("useClientContext-\u0433 \u0437\u04E9\u0432\u0445\u04E9\u043D ClientProvider-\u0438\u0439\u043D \u0434\u043E\u0442\u043E\u0440 \u0430\u0448\u0438\u0433\u043B\u0430\u0445 \u0451\u0441\u0442\u043E\u0439!");return t};var G=({className:t="",disabled:a,onClick:o,style:e,theme:c="dark",...l})=>{let{acceptCall:s}=u();return jsx("accept-button",{disabled:a,className:t,onClick:async i=>{try{await s(),o&&o(i);}catch(r){console.error("Failed to accept call:",r);}},style:e,theme:c,...l})},R=G;var Q=({toPhoneNumber:t="",className:a="",disabled:o,onClick:e,style:c,theme:l="dark",...s})=>{let{createCall:n}=u();return jsx("call-button",{"to-phone-number":t,disabled:o,className:a,onClick:async r=>{try{t&&await n(t),e&&e(r);}catch(m){console.error("Failed to create call:",m);}},style:c,theme:l,...s})},g=Q;var Z=({className:t="",disabled:a,onClick:o,style:e,...c})=>{let{declineCall:l}=u();return jsx("decline-button",{disabled:a,className:t,onClick:async n=>{try{await l(),o&&o(n);}catch(i){console.error("Failed to decline call:",i);}},style:e,...c})},M=Z;var ee=({className:t="",disabled:a,onClick:o,style:e,...c})=>{let{endCall:l}=u();return jsx("endcall-button",{disabled:a,className:t,onClick:async n=>{try{await l(),o&&o(n);}catch(i){console.error("Failed to end call:",i);}},style:e,...c})},E=ee;var ne=({className:t="",disabled:a,onClick:o,style:e,...c})=>{let{toggleMic:l,isMicOn:s,setIsMicOn:n}=u();return jsx("mic-button",{disabled:a,"mic-on":s?"":void 0,className:t,onClick:async r=>{try{await l(),n(!s),o&&o(r);}catch(m){console.error("Failed to toggle mic:",m);}},style:e,...c})},B=ne;var se=({phoneNumber:t,onNumberClick:a,maxLength:o=8,style:e,className:c,theme:l="dark"})=>{let s=useRef(null),[n,i]=useState(false);return useEffect(()=>{typeof window<"u"&&import('@callpromn/rtc-kit').then(()=>{customElements.get("rtc-numpad")?i(true):customElements.whenDefined("rtc-numpad").then(()=>{i(true);});}).catch(console.error);},[]),useEffect(()=>{let r=s.current;if(!r||!n)return;let m=C=>{let p=C;if(p.detail){let{value:d}=p.detail;a(h=>h.length<o?h+d:h);}};return r.addEventListener("number-click",m),()=>{r.removeEventListener("number-click",m);}},[a,o,n]),useEffect(()=>{if(s.current&&n){let r=s.current;r.setPhoneNumber&&r.setPhoneNumber(t);}},[t,n]),n?jsx("rtc-numpad",{ref:s,"phone-number":t,"max-length":o.toString(),style:e,className:c,theme:l}):null},T=se;var ue=({phoneNumber:t,style:a,className:o,theme:e="dark"})=>{let c=useRef(null),[l,s]=useState(false);return useEffect(()=>{typeof window<"u"&&import('@callpromn/rtc-kit').then(()=>{customElements.get("rtc-number-field")?s(true):customElements.whenDefined("rtc-number-field").then(()=>{s(true);});}).catch(console.error);},[]),useEffect(()=>{if(c.current&&l){let n=c.current;n.setPhoneNumber&&n.setPhoneNumber(t);}},[t,l]),l?jsx("rtc-number-field",{ref:c,"phone-number":t,style:a,className:o,theme:e}):null},N=ue;var pe=({phoneNumber:t,onClick:a,style:o,className:e,theme:c="dark"})=>{let{toPhoneNumber:l,setToPhoneNumber:s}=u(),n=useRef(null),[i,r]=useState(false),m=t.length>0;useEffect(()=>{typeof window<"u"&&import('@callpromn/rtc-kit').then(()=>{customElements.get("rtc-number-delete-button")?r(true):customElements.whenDefined("rtc-number-delete-button").then(()=>{r(true);});}).catch(console.error);},[]);let C=async p=>{try{l&&s(l.slice(0,-1)),a&&a();}catch(d){console.error("Failed to create call:",d);}};return useEffect(()=>{if(n.current&&i){let p=n.current;p.setPhoneNumber&&p.setPhoneNumber(t);}},[t,i]),!i||!m?null:jsx("rtc-number-delete-button",{ref:n,"phone-number":t,visible:m.toString(),style:o,className:e,theme:c,onClick:C})},k=pe;export{R as AcceptButton,g as CallButton,q as ClientProvider,M as DeclineButton,E as EndButton,B as MicButton,k as NumberDeleteButton,N as NumberField,T as Numpad,u as useClientContext};//# sourceMappingURL=index.mjs.map
|
|
2
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/context/ClientProvider.tsx","../src/components/AcceptButton.tsx","../src/components/CallButton.tsx","../src/components/DeclineButton.tsx","../src/components/EndButton.tsx","../src/components/MicButton.tsx","../src/components/Numpad.tsx","../src/components/NumberField.tsx","../src/components/NumberDeleteButton.tsx"],"names":["ClientContext","createContext","ClientProvider","children","config","callClient","CallClient","callClientInstance","useRef","inboundUserData","setInboundUserData","useState","isIncomingCall","setIsIncomingCall","isOutboundCall","setIsOutboundCall","isConnected","setIsConnected","isCallActive","setIsCallActive","toPhoneNumber","setToPhoneNumber","isMicOn","setIsMicOn","useEffect","createCallClient","data","error","declineCall","acceptCall","createCall","endCall","toggleMic","checkConnectionStatus","connected","jsx","useClientContext","context","useContext","AcceptButton","className","disabled","onClick","style","theme","props","event","AcceptButton_default","CallButton","CallButton_default","DeclineButton","DeclineButton_default","EndButton","EndButton_default","MicButton","MicButton_default","Numpad","phoneNumber","onNumberClick","maxLength","numpadRef","isWebComponentReady","setIsWebComponentReady","numpadElement","handleNumberClick","customEvent","value","prev","webComponent","Numpad_default","NumberField","numberFieldRef","NumberField_default","NumberDeleteButton","deleteButtonRef","isVisible","handleClick","NumberDeleteButton_default"],"mappings":"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","file":"index.mjs","sourcesContent":["'use client';\n\nimport { CallClientConfig, CallClient } from '@callpromn/rtc-sdk';\nimport { createContext, useContext, useEffect, useRef, useState } from 'react';\n\nconst ClientContext = createContext<any>(null);\n\nconst ClientProvider = ({\n children,\n config,\n}: {\n children: React.ReactNode;\n config: CallClientConfig;\n}) => {\n const callClient = CallClient();\n const callClientInstance = useRef<any>(null);\n\n const [inboundUserData, setInboundUserData] = useState<any>(null);\n const [isIncomingCall, setIsIncomingCall] = useState(false);\n const [isOutboundCall, setIsOutboundCall] = useState(false);\n const [isConnected, setIsConnected] = useState(false);\n const [isCallActive, setIsCallActive] = useState(false);\n const [toPhoneNumber, setToPhoneNumber] = useState('');\n const [isMicOn, setIsMicOn] = useState(true);\n\n useEffect(() => {\n createCallClient();\n }, []);\n\n const createCallClient = async () => {\n try {\n callClientInstance.current = await callClient.createClient(config);\n\n callClientInstance.current.on('call_init', async (data: any) => {\n if (data === 'incoming') {\n const inboundUserData =\n await callClientInstance.current.getInboundUserData();\n setInboundUserData(inboundUserData);\n setIsIncomingCall(true);\n }\n });\n\n callClientInstance.current.on('hangup', () => {\n console.log('📞 [CallClientProvider] Дуудлагыг тасаллаа.');\n setIsIncomingCall(false);\n setIsOutboundCall(false);\n setIsCallActive(false);\n });\n\n callClientInstance.current.on('busy', () => {\n console.log('📞 [CallClientProvider] Дуудлагыг авахыг татгалзлаа.');\n setIsIncomingCall(false);\n setIsOutboundCall(false);\n setIsCallActive(false);\n });\n\n callClientInstance.current.on('answered', () => {\n console.log('📞 [CallClientProvider] Дуудлагыг хүлээж авлаа.');\n setIsIncomingCall(false);\n setIsOutboundCall(false);\n setIsCallActive(true);\n });\n\n callClientInstance.current.on('bye', () => {\n console.log('📞 [CallClientProvider] Дуудлагыг тасаллаа.');\n setIsIncomingCall(false);\n setIsOutboundCall(false);\n setIsCallActive(false);\n });\n\n // Socket-ын холболтын төлөвийг шалгах\n setIsConnected(callClientInstance.current.isConnected());\n console.log('✅ Дуудлагын клиент амжилттай холбогдож бэлэн боллоо.');\n } catch (error) {\n console.error('❌ Дуудлагын клиент үүсгэхэд алдаа гарлаа:', error);\n }\n };\n\n const declineCall = async () => {\n if (callClientInstance.current) {\n await callClientInstance.current.declineCall();\n setIsIncomingCall(false);\n }\n };\n\n const acceptCall = async () => {\n if (callClientInstance.current) {\n await callClientInstance.current.acceptCall();\n setIsIncomingCall(false);\n setIsOutboundCall(false);\n setIsCallActive(true);\n }\n };\n\n const createCall = async (toPhoneNumber: string) => {\n if (callClientInstance.current) {\n await callClientInstance.current.createCall(toPhoneNumber);\n setIsOutboundCall(true);\n }\n };\n\n const endCall = async () => {\n if (callClientInstance.current) {\n await callClientInstance.current.endCall();\n setIsCallActive(false);\n setIsOutboundCall(false);\n }\n };\n\n const toggleMic = async () => {\n if (callClientInstance.current) {\n await callClientInstance.current.toggleMic();\n }\n };\n\n const checkConnectionStatus = () => {\n setIsConnected(false);\n setTimeout(() => {\n if (callClientInstance.current) {\n const connected = callClientInstance.current.isConnected();\n setIsConnected(connected);\n console.log(\n `🔌 Дуудлагын сервер: ${connected ? 'Холбогдсон' : 'Холбогдоогүй'}`\n );\n return connected;\n }\n return false;\n }, 1000);\n };\n\n return (\n <ClientContext.Provider\n value={{\n isIncomingCall,\n isOutboundCall,\n isConnected,\n isCallActive,\n checkConnectionStatus,\n inboundUserData,\n declineCall,\n acceptCall,\n createCall,\n endCall,\n toggleMic,\n toPhoneNumber,\n setToPhoneNumber,\n isMicOn,\n setIsMicOn,\n }}\n >\n {children}\n </ClientContext.Provider>\n );\n};\n\nconst useClientContext = () => {\n const context = useContext(ClientContext);\n if (!context) {\n throw new Error(\n 'useClientContext-г зөвхөн ClientProvider-ийн дотор ашиглах ёстой!'\n );\n }\n return context;\n};\n\nexport { ClientProvider, useClientContext };\n","import React from 'react';\nimport '../types/web-components';\nimport { AcceptButtonProps } from '../types';\nimport { useClientContext } from '../context/ClientProvider';\n\nconst AcceptButton: React.FC<AcceptButtonProps> = ({\n className = '',\n disabled,\n onClick,\n style,\n theme = 'dark',\n ...props\n}) => {\n const { acceptCall } = useClientContext();\n\n const handleClick = async (event: React.MouseEvent) => {\n try {\n await acceptCall();\n\n if (onClick) onClick(event as any);\n } catch (error) {\n console.error('Failed to accept call:', error);\n }\n };\n\n return (\n <accept-button\n disabled={disabled}\n className={className}\n onClick={handleClick}\n style={style}\n theme={theme}\n {...props}\n />\n );\n};\n\nexport default AcceptButton;\n","import React from 'react';\nimport '../types/web-components';\nimport { CallButtonProps } from '../types';\nimport { useClientContext } from '../context/ClientProvider';\n\nconst CallButton: React.FC<CallButtonProps> = ({\n toPhoneNumber = '',\n className = '',\n disabled,\n onClick,\n style,\n theme = 'dark',\n ...props\n}) => {\n const { createCall } = useClientContext();\n\n const handleClick = async (event: React.MouseEvent) => {\n try {\n if (toPhoneNumber) await createCall(toPhoneNumber);\n\n if (onClick) onClick(event as any);\n } catch (error) {\n console.error('Failed to create call:', error);\n }\n };\n\n return (\n <call-button\n to-phone-number={toPhoneNumber}\n disabled={disabled}\n className={className}\n onClick={handleClick}\n style={style}\n theme={theme}\n {...props}\n />\n );\n};\n\nexport default CallButton;\n","import React from 'react';\nimport '../types/web-components';\nimport { DeclineButtonProps } from '../types';\nimport { useClientContext } from '../context/ClientProvider';\n\nconst DeclineButton: React.FC<DeclineButtonProps> = ({\n className = '',\n disabled,\n onClick,\n style,\n ...props\n}) => {\n const { declineCall } = useClientContext();\n\n const handleClick = async (event: React.MouseEvent) => {\n try {\n await declineCall();\n if (onClick) onClick(event as any);\n } catch (error) {\n console.error('Failed to decline call:', error);\n }\n };\n\n return (\n <decline-button\n disabled={disabled}\n className={className}\n onClick={handleClick}\n style={style}\n {...props}\n />\n );\n};\n\nexport default DeclineButton;\n","import React from 'react';\nimport '../types/web-components';\nimport { EndButtonProps } from '../types';\nimport { useClientContext } from '../context/ClientProvider';\n\nconst EndButton: React.FC<EndButtonProps> = ({\n className = '',\n disabled,\n onClick,\n style,\n ...props\n}) => {\n const { endCall } = useClientContext();\n\n const handleClick = async (event: React.MouseEvent) => {\n try {\n await endCall();\n\n if (onClick) onClick(event as any);\n } catch (error) {\n console.error('Failed to end call:', error);\n }\n };\n\n return (\n <endcall-button\n disabled={disabled}\n className={className}\n onClick={handleClick}\n style={style}\n {...props}\n />\n );\n};\n\nexport default EndButton;\n","import React from 'react';\nimport '../types/web-components';\nimport { MicButtonProps } from '../types';\nimport { useClientContext } from '../context/ClientProvider';\n\nconst MicButton: React.FC<MicButtonProps> = ({\n className = '',\n disabled,\n onClick,\n style,\n ...props\n}) => {\n const { toggleMic, isMicOn, setIsMicOn } = useClientContext();\n\n const handleClick = async (event: React.MouseEvent) => {\n try {\n await toggleMic();\n setIsMicOn(!isMicOn);\n\n if (onClick) onClick(event as any);\n } catch (error) {\n console.error('Failed to toggle mic:', error);\n }\n };\n\n return (\n <mic-button\n disabled={disabled}\n mic-on={isMicOn ? '' : undefined}\n className={className}\n onClick={handleClick}\n style={style}\n {...props}\n />\n );\n};\n\nexport default MicButton;\n","'use client';\n\nimport '../types/web-components';\nimport { useEffect, useRef, useState } from 'react';\n\ninterface NumpadProps {\n phoneNumber: string;\n onNumberClick: React.Dispatch<React.SetStateAction<string>>;\n maxLength?: number;\n style?: React.CSSProperties;\n className?: string;\n theme?: 'light' | 'dark';\n}\n\nconst Numpad: React.FC<NumpadProps> = ({\n phoneNumber,\n onNumberClick,\n maxLength = 8,\n style,\n className,\n theme = 'dark',\n}) => {\n const numpadRef = useRef<HTMLElement>(null);\n const [isWebComponentReady, setIsWebComponentReady] = useState(false);\n\n useEffect(() => {\n if (typeof window !== 'undefined') {\n import('@callpromn/rtc-kit')\n .then(() => {\n // Wait for the web component to be defined\n if (customElements.get('rtc-numpad')) {\n setIsWebComponentReady(true);\n } else {\n customElements.whenDefined('rtc-numpad').then(() => {\n setIsWebComponentReady(true);\n });\n }\n })\n .catch(console.error);\n }\n }, []);\n\n useEffect(() => {\n const numpadElement = numpadRef.current;\n if (!numpadElement || !isWebComponentReady) return;\n\n const handleNumberClick = (event: Event) => {\n const customEvent = event as CustomEvent<{\n value: string;\n phoneNumber: string;\n }>;\n if (customEvent.detail) {\n const { value } = customEvent.detail;\n onNumberClick((prev: string) => {\n if (prev.length < maxLength) {\n return prev + value;\n }\n return prev;\n });\n }\n };\n\n numpadElement.addEventListener('number-click', handleNumberClick);\n\n return () => {\n numpadElement.removeEventListener('number-click', handleNumberClick);\n };\n }, [onNumberClick, maxLength, isWebComponentReady]);\n\n // Sync phoneNumber prop with web component attribute\n useEffect(() => {\n if (numpadRef.current && isWebComponentReady) {\n const webComponent = numpadRef.current as any;\n if (webComponent.setPhoneNumber) {\n webComponent.setPhoneNumber(phoneNumber);\n }\n }\n }, [phoneNumber, isWebComponentReady]);\n\n if (!isWebComponentReady) {\n // Loading fallback while web component loads\n return null;\n }\n\n return (\n <rtc-numpad\n ref={numpadRef}\n phone-number={phoneNumber}\n max-length={maxLength.toString()}\n style={style}\n className={className}\n theme={theme}\n />\n );\n};\n\nexport default Numpad;\n","'use client';\n\nimport '../types/web-components';\nimport { useEffect, useRef, useState } from 'react';\n\ninterface NumberFieldProps {\n phoneNumber: string;\n style?: React.CSSProperties;\n className?: string;\n theme?: 'light' | 'dark';\n}\n\nconst NumberField: React.FC<NumberFieldProps> = ({\n phoneNumber,\n style,\n className,\n theme = 'dark',\n}) => {\n const numberFieldRef = useRef<HTMLElement>(null);\n const [isWebComponentReady, setIsWebComponentReady] = useState(false);\n\n useEffect(() => {\n if (typeof window !== 'undefined') {\n import('@callpromn/rtc-kit')\n .then(() => {\n // Wait for the web component to be defined\n if (customElements.get('rtc-number-field')) {\n setIsWebComponentReady(true);\n } else {\n customElements.whenDefined('rtc-number-field').then(() => {\n setIsWebComponentReady(true);\n });\n }\n })\n .catch(console.error);\n }\n }, []);\n\n // Sync phoneNumber prop with web component attribute\n useEffect(() => {\n if (numberFieldRef.current && isWebComponentReady) {\n const webComponent = numberFieldRef.current as any;\n if (webComponent.setPhoneNumber) {\n webComponent.setPhoneNumber(phoneNumber);\n }\n }\n }, [phoneNumber, isWebComponentReady]);\n\n if (!isWebComponentReady) {\n // Loading fallback while web component loads\n return null;\n }\n\n return (\n <rtc-number-field\n ref={numberFieldRef}\n phone-number={phoneNumber}\n style={style}\n className={className}\n theme={theme}\n />\n );\n};\n\nexport default NumberField;\n","'use client';\n\nimport '../types/web-components';\nimport { useEffect, useRef, useState } from 'react';\nimport { useClientContext } from '../context/ClientProvider';\n\ninterface NumberDeleteButtonProps {\n phoneNumber: string;\n onClick: () => void;\n style?: React.CSSProperties;\n className?: string;\n theme?: 'light' | 'dark';\n}\n\nconst NumberDeleteButton: React.FC<NumberDeleteButtonProps> = ({\n phoneNumber,\n onClick,\n style,\n className,\n theme = 'dark',\n}) => {\n const { toPhoneNumber, setToPhoneNumber } = useClientContext();\n const deleteButtonRef = useRef<HTMLElement>(null);\n const [isWebComponentReady, setIsWebComponentReady] = useState(false);\n const isVisible = phoneNumber.length > 0;\n\n useEffect(() => {\n if (typeof window !== 'undefined') {\n import('@callpromn/rtc-kit')\n .then(() => {\n // Wait for the web component to be defined\n if (customElements.get('rtc-number-delete-button')) {\n setIsWebComponentReady(true);\n } else {\n customElements.whenDefined('rtc-number-delete-button').then(() => {\n setIsWebComponentReady(true);\n });\n }\n })\n .catch(console.error);\n }\n }, []);\n\n const handleClick = async (event: React.MouseEvent) => {\n try {\n if (toPhoneNumber) setToPhoneNumber(toPhoneNumber.slice(0, -1));\n if (onClick) onClick();\n } catch (error) {\n console.error('Failed to create call:', error);\n }\n };\n\n // Sync phoneNumber prop with web component attribute\n useEffect(() => {\n if (deleteButtonRef.current && isWebComponentReady) {\n const webComponent = deleteButtonRef.current as any;\n if (webComponent.setPhoneNumber) {\n webComponent.setPhoneNumber(phoneNumber);\n }\n }\n }, [phoneNumber, isWebComponentReady]);\n\n if (!isWebComponentReady || !isVisible) {\n return null;\n }\n\n return (\n <rtc-number-delete-button\n ref={deleteButtonRef}\n phone-number={phoneNumber}\n visible={isVisible.toString()}\n style={style}\n className={className}\n theme={theme}\n onClick={handleClick}\n />\n );\n};\n\nexport default NumberDeleteButton;\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@callpromn/rtc-kit-react",
|
|
3
|
+
"version": "0.0.2",
|
|
4
|
+
"description": "RTC Kit React UI components - CallPro LLC",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.mjs",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.mjs",
|
|
11
|
+
"require": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
"README.md",
|
|
16
|
+
"LICENSE"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsup",
|
|
20
|
+
"dev": "tsup --watch",
|
|
21
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
22
|
+
"prepublishOnly": "npm run build",
|
|
23
|
+
"pk": "sudo npm run build && sudo npm link",
|
|
24
|
+
"clean": "rimraf dist"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"react",
|
|
28
|
+
"ui",
|
|
29
|
+
"components",
|
|
30
|
+
"rtc",
|
|
31
|
+
"calling",
|
|
32
|
+
"voip",
|
|
33
|
+
"callpro"
|
|
34
|
+
],
|
|
35
|
+
"author": "CallPro LLC",
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@types/node": "^20.0.0",
|
|
39
|
+
"@types/react": "^18.2.0",
|
|
40
|
+
"@types/react-dom": "^18.2.0",
|
|
41
|
+
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
|
42
|
+
"@typescript-eslint/parser": "^6.0.0",
|
|
43
|
+
"eslint": "^8.0.0",
|
|
44
|
+
"eslint-config-prettier": "^9.0.0",
|
|
45
|
+
"eslint-plugin-prettier": "^5.0.0",
|
|
46
|
+
"eslint-plugin-react": "^7.33.0",
|
|
47
|
+
"eslint-plugin-react-hooks": "^4.6.0",
|
|
48
|
+
"prettier": "^3.0.0",
|
|
49
|
+
"react": "^18.2.0",
|
|
50
|
+
"react-dom": "^18.2.0",
|
|
51
|
+
"tsup": "^8.0.0",
|
|
52
|
+
"typescript": "^5.0.0",
|
|
53
|
+
"rimraf": "^6.0.1"
|
|
54
|
+
},
|
|
55
|
+
"dependencies": {
|
|
56
|
+
"@callpromn/rtc-kit": "0.0.3",
|
|
57
|
+
"@callpromn/rtc-sdk": "0.0.3"
|
|
58
|
+
}
|
|
59
|
+
}
|