agora-appbuilder-core 4.0.7 → 4.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/package.json +1 -1
  2. package/template/_package-lock.json +82 -0
  3. package/template/android/app/build.gradle +8 -0
  4. package/template/android/build.gradle +3 -0
  5. package/template/bridge/rtc/webNg/RtcEngine.ts +581 -31
  6. package/template/bridge/rtc/webNg/RtcSurfaceView.tsx +2 -1
  7. package/template/bridge/rtm/web/index.ts +2 -1
  8. package/template/customization-api/customize.ts +29 -10
  9. package/template/index.js +17 -1
  10. package/template/index.web.js +2 -2
  11. package/template/package.json +3 -0
  12. package/template/src/SDKAppWrapper.tsx +44 -2
  13. package/template/src/app-state/useNoiseSupression.native.tsx +6 -0
  14. package/template/src/app-state/useNoiseSupression.tsx +17 -0
  15. package/template/src/auth/AuthProvider.tsx +145 -8
  16. package/template/src/auth/IDPAuth.electron.tsx +2 -1
  17. package/template/src/auth/IDPAuth.tsx +8 -2
  18. package/template/src/auth/openIDPURL.native.tsx +14 -3
  19. package/template/src/auth/useTokenAuth.tsx +7 -1
  20. package/template/src/components/Controls.tsx +2 -1
  21. package/template/src/components/DeviceConfigure.tsx +67 -17
  22. package/template/src/components/Precall.tsx +21 -0
  23. package/template/src/components/RTMConfigure.tsx +188 -24
  24. package/template/src/components/SettingsView.tsx +2 -0
  25. package/template/src/components/Share.tsx +11 -0
  26. package/template/src/components/StorageContext.tsx +32 -2
  27. package/template/src/components/chat-messages/useChatMessages.tsx +65 -5
  28. package/template/src/components/contexts/WaitingRoomContext.tsx +5 -1
  29. package/template/src/components/precall/joinCallBtn.tsx +6 -0
  30. package/template/src/components/precall/usePreCall.tsx +18 -2
  31. package/template/src/components/room-info/useRoomInfo.tsx +28 -25
  32. package/template/src/components/useUserPreference.tsx +13 -2
  33. package/template/src/components/useWakeLock.tsx +18 -4
  34. package/template/src/components/virtual-background/VBCard.tsx +40 -1
  35. package/template/src/components/virtual-background/VButils.native.ts +24 -5
  36. package/template/src/components/virtual-background/VButils.ts +29 -5
  37. package/template/src/components/virtual-background/VideoPreview.tsx +11 -1
  38. package/template/src/components/virtual-background/useVB.native.tsx +19 -3
  39. package/template/src/components/whiteboard/WhiteboardConfigure.tsx +32 -5
  40. package/template/src/components/whiteboard/WhiteboardToolBox.tsx +38 -8
  41. package/template/src/components/whiteboard/WhiteboardView.native.tsx +37 -13
  42. package/template/src/language/useLanguage.tsx +10 -4
  43. package/template/src/logger/AppBuilderLogger.tsx +215 -0
  44. package/template/src/logger/constants.ts +18 -0
  45. package/template/src/logger/transports/agora-transport.native.ts +58 -0
  46. package/template/src/logger/transports/agora-transport.ts +28 -0
  47. package/template/src/logger/transports/customer-transport.ts +115 -0
  48. package/template/src/pages/Create.tsx +27 -2
  49. package/template/src/pages/Endcall.tsx +6 -1
  50. package/template/src/pages/Join.tsx +31 -4
  51. package/template/src/pages/VideoCall.tsx +20 -56
  52. package/template/src/pages/video-call/DefaultLayouts.ts +11 -3
  53. package/template/src/pages/video-call/SidePanelHeader.tsx +12 -2
  54. package/template/src/pages/video-call/VideoCallScreen.tsx +8 -0
  55. package/template/src/pages/video-call/VideoRenderer.tsx +6 -0
  56. package/template/src/rtm/RTMEngine.ts +5 -0
  57. package/template/src/rtm-events-api/Events.ts +70 -16
  58. package/template/src/subComponents/LayoutIconDropdown.tsx +6 -0
  59. package/template/src/subComponents/LocalAudioMute.tsx +13 -3
  60. package/template/src/subComponents/LocalEndCall.tsx +8 -3
  61. package/template/src/subComponents/LocalVideoMute.tsx +15 -1
  62. package/template/src/subComponents/SelectDevice.tsx +111 -3
  63. package/template/src/subComponents/caption/CaptionContainer.tsx +17 -2
  64. package/template/src/subComponents/caption/useSTTAPI.tsx +62 -20
  65. package/template/src/subComponents/caption/useTranscriptDownload.native.ts +35 -5
  66. package/template/src/subComponents/caption/useTranscriptDownload.ts +12 -2
  67. package/template/src/subComponents/chat/ChatParticipants.tsx +6 -0
  68. package/template/src/subComponents/recording/useRecording.tsx +102 -15
  69. package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +33 -2
  70. package/template/src/subComponents/screenshare/ScreenshareConfigure.tsx +18 -2
  71. package/template/src/subComponents/waiting-rooms/useWaitingRoomAPI.ts +26 -0
  72. package/template/src/utils/axiomLogger.ts +2 -1
  73. package/template/src/utils/useCreateRoom.ts +30 -0
  74. package/template/src/utils/useFindActiveSpeaker.ts +43 -0
  75. package/template/src/utils/useFocus.tsx +8 -3
  76. package/template/src/utils/useIsLocalUserSpeaking.ts +19 -3
  77. package/template/src/utils/useJoinRoom.ts +27 -0
  78. package/template/src/utils/useLayout.tsx +9 -3
  79. package/template/src/utils/useSidePanel.tsx +14 -3
@@ -41,6 +41,7 @@ import {
41
41
  settingsPanelSystemDefaultSpeakerText,
42
42
  settingsPanelUpdatingText,
43
43
  } from '../language/default-labels/precallScreenLabels';
44
+ import {LogSource, logger} from '../logger/AppBuilderLogger';
44
45
  // import {dropdown} from '../../theme.json';
45
46
 
46
47
  /*
@@ -72,9 +73,19 @@ const useSelectDevice = (): [boolean, string] => {
72
73
  $config.EVENT_MODE &&
73
74
  rtcProps.role === ClientRoleType.ClientRoleAudience
74
75
  ) {
76
+ logger.log(
77
+ LogSource.Internals,
78
+ 'DEVICE_CONFIGURE',
79
+ 'User is AUDIENCE and in Live mode - device picker is disabled',
80
+ );
75
81
  setPickerDisabled(true);
76
82
  setBtnTheme('rgba(16, 16, 16, 0.3)');
77
83
  } else {
84
+ logger.log(
85
+ LogSource.Internals,
86
+ 'DEVICE_CONFIGURE',
87
+ 'User is HOST - device picker is enabled',
88
+ );
78
89
  setPickerDisabled(false);
79
90
  setBtnTheme(primaryColor);
80
91
  }
@@ -161,11 +172,30 @@ const SelectVideoDevice = (props: SelectVideoDeviceProps) => {
161
172
  onSelect={({label, value}) => {
162
173
  setIsFocussed(true);
163
174
  try {
175
+ logger.log(
176
+ LogSource.Internals,
177
+ 'DEVICE_CONFIGURE',
178
+ `Trying to set camera - ${label} - ${value}`,
179
+ );
164
180
  pendingStateUpdateHelper(
165
181
  async () => await setSelectedCam(value),
166
182
  setIsPendingUpdate,
167
183
  );
184
+ logger.log(
185
+ LogSource.Internals,
186
+ 'DEVICE_CONFIGURE',
187
+ `Camera set - ${value}`,
188
+ );
168
189
  } catch (e) {
190
+ logger.error(
191
+ LogSource.Internals,
192
+ 'DEVICE_CONFIGURE',
193
+ `There was an error setting camera - ${value}`,
194
+ {
195
+ data: value,
196
+ error: e,
197
+ },
198
+ );
169
199
  setIsPendingUpdate(false);
170
200
  }
171
201
  }}
@@ -258,11 +288,30 @@ const SelectAudioDevice = (props: SelectAudioDeviceProps) => {
258
288
  onSelect={({label, value}) => {
259
289
  setIsFocussed(true);
260
290
  try {
291
+ logger.log(
292
+ LogSource.Internals,
293
+ 'DEVICE_CONFIGURE',
294
+ `Trying to set mic - ${label} - ${value}`,
295
+ );
261
296
  pendingStateUpdateHelper(
262
297
  async () => await setSelectedMic(value),
263
298
  setIsPendingUpdate,
264
299
  );
300
+ logger.log(
301
+ LogSource.Internals,
302
+ 'DEVICE_CONFIGURE',
303
+ `Mic set - ${value}`,
304
+ );
265
305
  } catch (e) {
306
+ logger.error(
307
+ LogSource.Internals,
308
+ 'DEVICE_CONFIGURE',
309
+ `There was an error setting mic - ${value}`,
310
+ {
311
+ data: value,
312
+ error: e,
313
+ },
314
+ );
266
315
  setIsPendingUpdate(false);
267
316
  }
268
317
  }}
@@ -351,11 +400,30 @@ const SelectSpeakerDevice = (props: SelectSpeakerDeviceProps) => {
351
400
  onSelect={({label, value}) => {
352
401
  setIsFocussed(true);
353
402
  try {
403
+ logger.log(
404
+ LogSource.Internals,
405
+ 'DEVICE_CONFIGURE',
406
+ `Trying to set speaker - ${label} - ${value}`,
407
+ );
354
408
  pendingStateUpdateHelper(
355
409
  async () => await setSelectedSpeaker(value),
356
410
  setIsPendingUpdate,
357
411
  );
412
+ logger.log(
413
+ LogSource.Internals,
414
+ 'DEVICE_CONFIGURE',
415
+ `Speaker set - ${value}`,
416
+ );
358
417
  } catch (e) {
418
+ logger.error(
419
+ LogSource.Internals,
420
+ 'DEVICE_CONFIGURE',
421
+ `There was an error setting speaker - ${value}`,
422
+ {
423
+ data: value,
424
+ error: e,
425
+ },
426
+ );
359
427
  setIsPendingUpdate(false);
360
428
  }
361
429
  }}
@@ -439,19 +507,59 @@ const SelectDevice = (props: SelectDeviceProps) => {
439
507
  // });
440
508
 
441
509
  useEffect(() => {
442
- if (audioDevices && audioDevices.length) {
510
+ const isDeviceAvailable = audioDevices && audioDevices.length;
511
+ logger.log(
512
+ LogSource.Internals,
513
+ 'DEVICE_CONFIGURE',
514
+ 'audio devices changed',
515
+ {
516
+ devices: [...audioDevices],
517
+ isDeviceAvailable: isDeviceAvailable
518
+ ? 'Yes, setting mic'
519
+ : 'No audio devices available',
520
+ },
521
+ );
522
+ if (isDeviceAvailable) {
443
523
  setMicAvailable(true);
444
524
  }
445
525
  }, [audioDevices]);
446
526
 
447
527
  useEffect(() => {
448
- if (videoDevices && videoDevices.length) {
528
+ const isDeviceAvailable = videoDevices && videoDevices.length;
529
+ logger.log(
530
+ LogSource.Internals,
531
+ 'DEVICE_CONFIGURE',
532
+ 'camera devices changed',
533
+ {
534
+ data: {
535
+ devices: [...videoDevices],
536
+ isDeviceAvailable: isDeviceAvailable
537
+ ? 'Yes, setting camera'
538
+ : 'No video devices available',
539
+ },
540
+ },
541
+ );
542
+ if (isDeviceAvailable) {
449
543
  setCameraAvailable(true);
450
544
  }
451
545
  }, [videoDevices]);
452
546
 
453
547
  useEffect(() => {
454
- if (speakerDevices && speakerDevices.length) {
548
+ const isDeviceAvailable = speakerDevices && speakerDevices.length;
549
+ logger.log(
550
+ LogSource.Internals,
551
+ 'DEVICE_CONFIGURE',
552
+ 'speaker devices changed',
553
+ {
554
+ data: {
555
+ devices: [...speakerDevices],
556
+ isDeviceAvailable: isDeviceAvailable
557
+ ? 'Yes, setting speaker'
558
+ : 'No speaker devices available',
559
+ },
560
+ },
561
+ );
562
+ if (isDeviceAvailable) {
455
563
  setSpeakerAvailable(true);
456
564
  }
457
565
  }, [speakerDevices]);
@@ -35,6 +35,7 @@ import {
35
35
  sttChangeSpokenLanguageText,
36
36
  toolbarItemCaptionText,
37
37
  } from '../../language/default-labels/videoCallScreenLabels';
38
+ import {logger, LogSource} from '../../logger/AppBuilderLogger';
38
39
 
39
40
  const CaptionContainer = () => {
40
41
  const moreIconRef = React.useRef<View>(null);
@@ -223,12 +224,26 @@ const CaptionsActionMenu = (props: CaptionsActionMenuProps) => {
223
224
  const onLanguageChange = (langChanged = false, language: LanguageType[]) => {
224
225
  setLanguagePopup(false);
225
226
  if (langChanged) {
227
+ logger.log(
228
+ LogSource.Internals,
229
+ 'STT',
230
+ `Language changed to ${language}. Restarting STT`,
231
+ );
226
232
  restart(language)
227
233
  .then(() => {
228
- console.log('stt restarted successfully');
234
+ logger.debug(
235
+ LogSource.Internals,
236
+ 'STT',
237
+ 'stt restarted successfully',
238
+ );
229
239
  })
230
240
  .catch(error => {
231
- console.log('Error in restarting', error);
241
+ logger.error(
242
+ LogSource.Internals,
243
+ 'STT',
244
+ 'Error in restarting',
245
+ error,
246
+ );
232
247
  // Handle the error case
233
248
  });
234
249
  }
@@ -8,6 +8,7 @@ import {getLanguageLabel, LanguageType} from './utils';
8
8
  import useGetName from '../../utils/useGetName';
9
9
  import {capitalizeFirstLetter} from '../../utils/common';
10
10
  import {PropsContext, useLocalUid} from '../../../agora-rn-uikit';
11
+ import {logger, LogSource} from '../../logger/AppBuilderLogger';
11
12
 
12
13
  interface IuseSTTAPI {
13
14
  start: (lang: LanguageType[]) => Promise<{message: string} | null>;
@@ -42,23 +43,31 @@ const useSTTAPI = (): IuseSTTAPI => {
42
43
  }, [language]);
43
44
 
44
45
  const apiCall = async (method: string, lang: LanguageType[] = []) => {
45
- const response = await fetch(`${STT_API_URL}/${method}`, {
46
- method: 'POST',
47
- headers: {
48
- 'Content-Type': 'application/json',
49
- authorization: store.token ? `Bearer ${store.token}` : '',
50
- },
51
- body: JSON.stringify({
52
- passphrase: roomId?.host || '',
53
- lang: lang,
54
- dataStream_uid: 111111, // bot ID
55
- encryption_mode: $config.ENCRYPTION_ENABLED
56
- ? rtcProps.encryption.mode
57
- : null,
58
- }),
59
- });
60
- const res = await response.json();
61
- return res;
46
+ logger.log(
47
+ LogSource.NetworkRest,
48
+ 'stt',
49
+ `Trying to ${method} stt for lang ${lang}`,
50
+ );
51
+ try {
52
+ const response = await fetch(`${STT_API_URL}/${method}`, {
53
+ method: 'POST',
54
+ headers: {
55
+ 'Content-Type': 'application/json',
56
+ authorization: store.token ? `Bearer ${store.token}` : '',
57
+ },
58
+ body: JSON.stringify({
59
+ passphrase: roomId?.host || '',
60
+ lang: lang,
61
+ dataStream_uid: 111111, // bot ID
62
+ encryption_mode: $config.ENCRYPTION_ENABLED
63
+ ? rtcProps.encryption.mode
64
+ : null,
65
+ }),
66
+ });
67
+ const res = await response.json();
68
+
69
+ return res;
70
+ } catch (error) {}
62
71
  };
63
72
 
64
73
  const startWithDelay = (lang: LanguageType[]): Promise<string> =>
@@ -81,7 +90,19 @@ const useSTTAPI = (): IuseSTTAPI => {
81
90
 
82
91
  if (res?.error?.message) {
83
92
  setIsSTTError(true);
93
+ logger.error(
94
+ LogSource.NetworkRest,
95
+ 'stt',
96
+ `start stt for lang ${lang} failed`,
97
+ res?.error?.message,
98
+ );
84
99
  } else {
100
+ logger.log(
101
+ LogSource.NetworkRest,
102
+ 'stt',
103
+ `start stt for lang ${lang} succesfull`,
104
+ res,
105
+ );
85
106
  setIsSTTError(false);
86
107
  }
87
108
  if (res === null || isSTTAlreadyActive) {
@@ -92,8 +113,11 @@ const useSTTAPI = (): IuseSTTAPI => {
92
113
  PersistanceLevel.Sender,
93
114
  );
94
115
  setIsSTTActive(true);
95
-
96
- console.log(`stt lang update from: ${language} to ${lang}`);
116
+ logger.debug(
117
+ LogSource.NetworkRest,
118
+ 'stt',
119
+ `stt lang update from: ${language} to ${lang}`,
120
+ );
97
121
  // inform about the language set for stt
98
122
  events.send(
99
123
  EventNames.STT_LANGUAGE,
@@ -129,6 +153,12 @@ const useSTTAPI = (): IuseSTTAPI => {
129
153
  }
130
154
  return res;
131
155
  } catch (errorMsg) {
156
+ logger.error(
157
+ LogSource.NetworkRest,
158
+ 'stt',
159
+ 'There was error in start stt',
160
+ errorMsg,
161
+ );
132
162
  throw errorMsg;
133
163
  } finally {
134
164
  setIsLangChangeInProgress(false);
@@ -148,10 +178,17 @@ const useSTTAPI = (): IuseSTTAPI => {
148
178
  if (res?.error?.message) {
149
179
  setIsSTTError(true);
150
180
  } else {
181
+ logger.log(LogSource.NetworkRest, 'stt', 'stop stt succesfull', res);
151
182
  setIsSTTError(false);
152
183
  }
153
184
  return res;
154
185
  } catch (error) {
186
+ logger.error(
187
+ LogSource.NetworkRest,
188
+ 'stt',
189
+ 'There was error in stop stt',
190
+ error,
191
+ );
155
192
  throw error;
156
193
  }
157
194
  };
@@ -162,7 +199,12 @@ const useSTTAPI = (): IuseSTTAPI => {
162
199
  await startWithDelay(lang);
163
200
  return Promise.resolve();
164
201
  } catch (error) {
165
- console.log('error in re-starting STT', error);
202
+ logger.error(
203
+ LogSource.NetworkRest,
204
+ 'stt',
205
+ 'There was error error in re-starting STT',
206
+ error,
207
+ );
166
208
  return Promise.reject(error);
167
209
  } finally {
168
210
  setIsLangChangeInProgress(false);
@@ -3,6 +3,7 @@ import {useCaption} from './useCaption';
3
3
  import RNFetchBlob from 'rn-fetch-blob';
4
4
  import {isAndroid, isIOS, useRoomInfo, useContent} from 'customization-api';
5
5
  import Share from 'react-native-share';
6
+ import {LogSource, logger} from '../../logger/AppBuilderLogger';
6
7
 
7
8
  const useTranscriptDownload = (): {
8
9
  downloadTranscript: () => Promise<string | null>;
@@ -16,6 +17,11 @@ const useTranscriptDownload = (): {
16
17
  const downloadTranscript = (): Promise<string | null> => {
17
18
  return new Promise((resolve, reject) => {
18
19
  try {
20
+ logger.log(
21
+ LogSource.Internals,
22
+ 'TRANSCRIPT',
23
+ 'Trying to download transcript',
24
+ );
19
25
  const [finalContent, fileName] = formatTranscriptContent(
20
26
  meetingTranscript,
21
27
  meetingTitle,
@@ -32,26 +38,50 @@ const useTranscriptDownload = (): {
32
38
  RNFetchBlob.fs
33
39
  .writeFile(filePath, finalContent, 'utf8')
34
40
  .then(() => {
35
- console.warn('Content downloaded successfully on native.');
41
+ logger.warn(
42
+ LogSource.Internals,
43
+ 'TRANSCRIPT',
44
+ 'Content downloaded successfully on native',
45
+ );
36
46
  // need to show the preview of downloaded file
37
47
  Share.open({url: `file://${filePath}`, type: 'text/plain'})
38
48
  .then(res => {
39
- // console.warn('File shared successfully:', res);
49
+ logger.warn(
50
+ LogSource.Internals,
51
+ 'TRANSCRIPT',
52
+ 'File shared successfully:',
53
+ res,
54
+ );
40
55
  resolve(filePath);
41
56
  })
42
57
  .catch(error => {
43
- // console.error('Error sharing file:', error);
58
+ logger.error(
59
+ LogSource.Internals,
60
+ 'TRANSCRIPT',
61
+ 'Error sharing file:',
62
+ error,
63
+ );
44
64
  reject(error);
45
65
  });
46
66
 
47
67
  resolve(filePath);
48
68
  })
49
69
  .catch(error => {
50
- console.error('Error downloading content:', error);
70
+ logger.error(
71
+ LogSource.Internals,
72
+ 'TRANSCRIPT',
73
+ 'Error downloading content:',
74
+ error,
75
+ );
51
76
  reject(error);
52
77
  });
53
78
  } catch (error) {
54
- console.error('Error downloading content:', error);
79
+ logger.error(
80
+ LogSource.Internals,
81
+ 'TRANSCRIPT',
82
+ 'Error downloading content:',
83
+ error,
84
+ );
55
85
  reject(error);
56
86
  }
57
87
  });
@@ -1,6 +1,7 @@
1
1
  import {formatTranscriptContent} from './utils';
2
2
  import {useCaption} from './useCaption';
3
3
  import {useRoomInfo, useContent} from 'customization-api';
4
+ import {LogSource, logger} from '../../logger/AppBuilderLogger';
4
5
 
5
6
  const useTranscriptDownload = (): {
6
7
  downloadTranscript: () => Promise<string | null>;
@@ -37,10 +38,19 @@ const useTranscriptDownload = (): {
37
38
 
38
39
  // revoke download url
39
40
  URL.revokeObjectURL(downloadUrl);
40
- console.log('Content downloaded successfully.');
41
+ logger.debug(
42
+ LogSource.Internals,
43
+ 'TRANSCRIPT',
44
+ 'content donwloaded successfully',
45
+ );
41
46
  resolve(downloadUrl);
42
47
  } catch (error) {
43
- console.error('Error downloading content:', error);
48
+ logger.error(
49
+ LogSource.Internals,
50
+ 'TRANSCRIPT',
51
+ 'failed to download content',
52
+ error,
53
+ );
44
54
  reject(error);
45
55
  }
46
56
  });
@@ -25,6 +25,7 @@ import {
25
25
  inviteTileNoElseJoinedYetText,
26
26
  videoRoomUserFallbackText,
27
27
  } from '../../language/default-labels/videoCallScreenLabels';
28
+ import {LogSource, logger} from '../../logger/AppBuilderLogger';
28
29
 
29
30
  const ChatIcon = () => (
30
31
  <View style={{alignSelf: 'center', marginRight: 20}}>
@@ -124,6 +125,11 @@ const ChatParticipants = (props: any) => {
124
125
  return (
125
126
  <Pressable
126
127
  onPress={() => {
128
+ logger.log(
129
+ LogSource.Internals,
130
+ 'CHAT',
131
+ `Starting chat with ${name}`,
132
+ );
127
133
  selectUser(uidAsNumber);
128
134
  }}>
129
135
  <View style={style.participantContainer}>