@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 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
+ [![npm](https://badge.fury.io/js/@callpromn%2Frtc-kit-react.svg)](https://www.npmjs.com/package/@callpromn/rtc-kit-react)
4
+ [![npm downloads](https://img.shields.io/npm/dm/@callpromn/rtc-kit-react.svg)](https://www.npmjs.com/package/@callpromn/rtc-kit-react)
5
+ [![License](https://img.shields.io/npm/l/@callpromn/rtc-kit-react.svg)](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)
@@ -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 };
@@ -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
+ }