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.
- package/package.json +1 -1
- package/template/_package-lock.json +82 -0
- package/template/android/app/build.gradle +8 -0
- package/template/android/build.gradle +3 -0
- package/template/bridge/rtc/webNg/RtcEngine.ts +581 -31
- package/template/bridge/rtc/webNg/RtcSurfaceView.tsx +2 -1
- package/template/bridge/rtm/web/index.ts +2 -1
- package/template/customization-api/customize.ts +29 -10
- package/template/index.js +17 -1
- package/template/index.web.js +2 -2
- package/template/package.json +3 -0
- package/template/src/SDKAppWrapper.tsx +44 -2
- package/template/src/app-state/useNoiseSupression.native.tsx +6 -0
- package/template/src/app-state/useNoiseSupression.tsx +17 -0
- package/template/src/auth/AuthProvider.tsx +145 -8
- package/template/src/auth/IDPAuth.electron.tsx +2 -1
- package/template/src/auth/IDPAuth.tsx +8 -2
- package/template/src/auth/openIDPURL.native.tsx +14 -3
- package/template/src/auth/useTokenAuth.tsx +7 -1
- package/template/src/components/Controls.tsx +2 -1
- package/template/src/components/DeviceConfigure.tsx +67 -17
- package/template/src/components/Precall.tsx +21 -0
- package/template/src/components/RTMConfigure.tsx +188 -24
- package/template/src/components/SettingsView.tsx +2 -0
- package/template/src/components/Share.tsx +11 -0
- package/template/src/components/StorageContext.tsx +32 -2
- package/template/src/components/chat-messages/useChatMessages.tsx +65 -5
- package/template/src/components/contexts/WaitingRoomContext.tsx +5 -1
- package/template/src/components/precall/joinCallBtn.tsx +6 -0
- package/template/src/components/precall/usePreCall.tsx +18 -2
- package/template/src/components/room-info/useRoomInfo.tsx +28 -25
- package/template/src/components/useUserPreference.tsx +13 -2
- package/template/src/components/useWakeLock.tsx +18 -4
- package/template/src/components/virtual-background/VBCard.tsx +40 -1
- package/template/src/components/virtual-background/VButils.native.ts +24 -5
- package/template/src/components/virtual-background/VButils.ts +29 -5
- package/template/src/components/virtual-background/VideoPreview.tsx +11 -1
- package/template/src/components/virtual-background/useVB.native.tsx +19 -3
- package/template/src/components/whiteboard/WhiteboardConfigure.tsx +32 -5
- package/template/src/components/whiteboard/WhiteboardToolBox.tsx +38 -8
- package/template/src/components/whiteboard/WhiteboardView.native.tsx +37 -13
- package/template/src/language/useLanguage.tsx +10 -4
- package/template/src/logger/AppBuilderLogger.tsx +215 -0
- package/template/src/logger/constants.ts +18 -0
- package/template/src/logger/transports/agora-transport.native.ts +58 -0
- package/template/src/logger/transports/agora-transport.ts +28 -0
- package/template/src/logger/transports/customer-transport.ts +115 -0
- package/template/src/pages/Create.tsx +27 -2
- package/template/src/pages/Endcall.tsx +6 -1
- package/template/src/pages/Join.tsx +31 -4
- package/template/src/pages/VideoCall.tsx +20 -56
- package/template/src/pages/video-call/DefaultLayouts.ts +11 -3
- package/template/src/pages/video-call/SidePanelHeader.tsx +12 -2
- package/template/src/pages/video-call/VideoCallScreen.tsx +8 -0
- package/template/src/pages/video-call/VideoRenderer.tsx +6 -0
- package/template/src/rtm/RTMEngine.ts +5 -0
- package/template/src/rtm-events-api/Events.ts +70 -16
- package/template/src/subComponents/LayoutIconDropdown.tsx +6 -0
- package/template/src/subComponents/LocalAudioMute.tsx +13 -3
- package/template/src/subComponents/LocalEndCall.tsx +8 -3
- package/template/src/subComponents/LocalVideoMute.tsx +15 -1
- package/template/src/subComponents/SelectDevice.tsx +111 -3
- package/template/src/subComponents/caption/CaptionContainer.tsx +17 -2
- package/template/src/subComponents/caption/useSTTAPI.tsx +62 -20
- package/template/src/subComponents/caption/useTranscriptDownload.native.ts +35 -5
- package/template/src/subComponents/caption/useTranscriptDownload.ts +12 -2
- package/template/src/subComponents/chat/ChatParticipants.tsx +6 -0
- package/template/src/subComponents/recording/useRecording.tsx +102 -15
- package/template/src/subComponents/screenshare/ScreenshareConfigure.native.tsx +33 -2
- package/template/src/subComponents/screenshare/ScreenshareConfigure.tsx +18 -2
- package/template/src/subComponents/waiting-rooms/useWaitingRoomAPI.ts +26 -0
- package/template/src/utils/axiomLogger.ts +2 -1
- package/template/src/utils/useCreateRoom.ts +30 -0
- package/template/src/utils/useFindActiveSpeaker.ts +43 -0
- package/template/src/utils/useFocus.tsx +8 -3
- package/template/src/utils/useIsLocalUserSpeaking.ts +19 -3
- package/template/src/utils/useJoinRoom.ts +27 -0
- package/template/src/utils/useLayout.tsx +9 -3
- package/template/src/utils/useSidePanel.tsx +14 -3
|
@@ -14,6 +14,7 @@ import {ILocalVideoTrack, IRemoteVideoTrack} from 'agora-rtc-sdk-ng';
|
|
|
14
14
|
import React, {useEffect} from 'react';
|
|
15
15
|
import {StyleProp, StyleSheet, ViewProps, ViewStyle} from 'react-native';
|
|
16
16
|
import {RenderModeType} from './Types';
|
|
17
|
+
import {LogSource, logger} from '../../../src/logger/AppBuilderLogger';
|
|
17
18
|
|
|
18
19
|
export interface RtcSurfaceViewProps extends ViewProps {
|
|
19
20
|
canvas: {
|
|
@@ -29,7 +30,7 @@ export interface StyleProps {
|
|
|
29
30
|
interface SurfaceViewInterface extends RtcSurfaceViewProps, StyleProps {}
|
|
30
31
|
|
|
31
32
|
const RtcSurfaceView = (props: SurfaceViewInterface) => {
|
|
32
|
-
|
|
33
|
+
logger.debug(LogSource.Internals, 'LAYOUT', 'Rtc Surface View props', props);
|
|
33
34
|
const {uid, renderMode} = props.canvas;
|
|
34
35
|
const stream: ILocalVideoTrack | IRemoteVideoTrack =
|
|
35
36
|
uid === 0
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
import {RtmClientEvents} from 'agora-react-native-rtm/lib/typescript/src/RtmEngine';
|
|
20
20
|
import AgoraRTM, {VERSION} from 'agora-rtm-sdk';
|
|
21
21
|
import RtmClient from 'agora-react-native-rtm';
|
|
22
|
+
import {LogSource, logger} from '../../../src/logger/AppBuilderLogger';
|
|
22
23
|
// export {RtmAttribute}
|
|
23
24
|
//
|
|
24
25
|
interface RtmAttributePlaceholder {}
|
|
@@ -59,7 +60,7 @@ export default class RtmEngine {
|
|
|
59
60
|
]);
|
|
60
61
|
constructor() {
|
|
61
62
|
this.appId = '';
|
|
62
|
-
|
|
63
|
+
logger.debug(LogSource.AgoraSDK, 'Log', 'Using RTM Bridge');
|
|
63
64
|
}
|
|
64
65
|
|
|
65
66
|
on(event: any, listener: any) {
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
information visit https://appbuilder.agora.io.
|
|
10
10
|
*********************************************
|
|
11
11
|
*/
|
|
12
|
+
import {LogSource, logger} from '../src/logger/AppBuilderLogger';
|
|
12
13
|
import {CustomizationApiInterface} from './typeDefinition';
|
|
13
14
|
import ReactIs from 'react-is';
|
|
14
15
|
/**
|
|
@@ -58,15 +59,21 @@ function validateComponents(components: any) {
|
|
|
58
59
|
validateComponents(comp);
|
|
59
60
|
}
|
|
60
61
|
} else {
|
|
61
|
-
|
|
62
|
-
|
|
62
|
+
logger.error(
|
|
63
|
+
LogSource.CustomizationAPI,
|
|
64
|
+
'Log',
|
|
65
|
+
`Error ${key} should be a react component or object`,
|
|
63
66
|
);
|
|
64
67
|
}
|
|
65
68
|
}
|
|
66
69
|
} else {
|
|
67
70
|
let comp = components[key];
|
|
68
71
|
if (comp && !isFunction(comp)) {
|
|
69
|
-
|
|
72
|
+
logger.error(
|
|
73
|
+
LogSource.CustomizationAPI,
|
|
74
|
+
'Log',
|
|
75
|
+
`Error ${key} should be an function`,
|
|
76
|
+
);
|
|
70
77
|
}
|
|
71
78
|
}
|
|
72
79
|
}
|
|
@@ -76,8 +83,10 @@ function validateLifecycle(data: any) {
|
|
|
76
83
|
for (const key in data) {
|
|
77
84
|
const callback = data[key];
|
|
78
85
|
if (callback && !isFunction(callback)) {
|
|
79
|
-
|
|
80
|
-
|
|
86
|
+
logger.error(
|
|
87
|
+
LogSource.CustomizationAPI,
|
|
88
|
+
'Log',
|
|
89
|
+
`Error ${key} should be a function that return async function`,
|
|
81
90
|
);
|
|
82
91
|
}
|
|
83
92
|
}
|
|
@@ -85,23 +94,33 @@ function validateLifecycle(data: any) {
|
|
|
85
94
|
|
|
86
95
|
function validateCustomRoutes(routes: any) {
|
|
87
96
|
if (routes && !Array.isArray(routes)) {
|
|
88
|
-
|
|
97
|
+
logger.error(
|
|
98
|
+
LogSource.CustomizationAPI,
|
|
99
|
+
'Log',
|
|
100
|
+
'Error customRoutes should be an array',
|
|
101
|
+
);
|
|
89
102
|
}
|
|
90
103
|
}
|
|
91
104
|
|
|
92
105
|
function validatei18n(data: any) {
|
|
93
106
|
if (data) {
|
|
94
107
|
if (!Array.isArray(data)) {
|
|
95
|
-
|
|
108
|
+
logger.error(
|
|
109
|
+
LogSource.CustomizationAPI,
|
|
110
|
+
'Log',
|
|
111
|
+
'Error i18n should be an array',
|
|
112
|
+
);
|
|
96
113
|
} else {
|
|
97
|
-
data.map(
|
|
114
|
+
data.map(item => {
|
|
98
115
|
const langData = item.data;
|
|
99
116
|
for (const key in langData) {
|
|
100
117
|
const value = langData[key];
|
|
101
118
|
if (value) {
|
|
102
119
|
if (!(isString(value) || isFunction(value))) {
|
|
103
|
-
|
|
104
|
-
|
|
120
|
+
logger.error(
|
|
121
|
+
LogSource.CustomizationAPI,
|
|
122
|
+
'Log',
|
|
123
|
+
`Error ${item.locale} ${key} should be a string or function`,
|
|
105
124
|
);
|
|
106
125
|
}
|
|
107
126
|
}
|
package/template/index.js
CHANGED
|
@@ -17,5 +17,21 @@ import {AppRegistry} from 'react-native';
|
|
|
17
17
|
import 'react-native-url-polyfill/auto';
|
|
18
18
|
import App from './src/App';
|
|
19
19
|
import {name as appName} from './app.json';
|
|
20
|
+
import React from 'react';
|
|
21
|
+
import {
|
|
22
|
+
DatadogProvider,
|
|
23
|
+
getConfig,
|
|
24
|
+
} from './src/logger/transports/agora-transport';
|
|
25
|
+
import {ENABLE_AGORA_LOGGER_TRANSPORT} from './src/logger/constants';
|
|
20
26
|
|
|
21
|
-
|
|
27
|
+
if (ENABLE_AGORA_LOGGER_TRANSPORT) {
|
|
28
|
+
const config = getConfig();
|
|
29
|
+
const AppWithLogs = () => (
|
|
30
|
+
<DatadogProvider configuration={config}>
|
|
31
|
+
<App />
|
|
32
|
+
</DatadogProvider>
|
|
33
|
+
);
|
|
34
|
+
AppRegistry.registerComponent(appName, () => AppWithLogs);
|
|
35
|
+
} else {
|
|
36
|
+
AppRegistry.registerComponent(appName, () => App);
|
|
37
|
+
}
|
package/template/index.web.js
CHANGED
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
information visit https://appbuilder.agora.io.
|
|
10
10
|
*********************************************
|
|
11
11
|
*/
|
|
12
|
-
import {
|
|
12
|
+
import {AppRegistry} from 'react-native';
|
|
13
13
|
import Video from './src/App';
|
|
14
|
-
import './src/assets/font-styles.css'
|
|
14
|
+
import './src/assets/font-styles.css';
|
|
15
15
|
|
|
16
16
|
AppRegistry.registerComponent('App', () => Video);
|
|
17
17
|
|
package/template/package.json
CHANGED
|
@@ -49,6 +49,8 @@
|
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"@apollo/client": "3.8.1",
|
|
52
|
+
"@datadog/browser-logs": "^5.15.0",
|
|
53
|
+
"@datadog/mobile-react-native": "^2.3.2",
|
|
52
54
|
"@gorhom/bottom-sheet": "4.4.7",
|
|
53
55
|
"@netless/react-native-whiteboard": "^0.0.14",
|
|
54
56
|
"@openspacelabs/react-native-zoomable-view": "^2.1.1",
|
|
@@ -86,6 +88,7 @@
|
|
|
86
88
|
"react-native-exit-app": "1.1.0",
|
|
87
89
|
"react-native-fs": "^2.20.0",
|
|
88
90
|
"react-native-gesture-handler": "2.8.0",
|
|
91
|
+
"react-native-get-random-values": "^1.11.0",
|
|
89
92
|
"react-native-hyperlink": "0.0.19",
|
|
90
93
|
"react-native-inappbrowser-reborn": "3.5.1",
|
|
91
94
|
"react-native-keep-awake": "4.0.0",
|
|
@@ -12,6 +12,7 @@ import App from './App';
|
|
|
12
12
|
import SdkApiContextProvider from './components/SdkApiContext';
|
|
13
13
|
import {Unsubscribe} from 'nanoevents';
|
|
14
14
|
import {deviceId} from './components/DeviceConfigure';
|
|
15
|
+
import {LogSource, logger} from './logger/AppBuilderLogger';
|
|
15
16
|
|
|
16
17
|
type meetingData = Partial<RoomInfoContextInterface['data']>;
|
|
17
18
|
|
|
@@ -54,16 +55,23 @@ export interface AppBuilderSdkApiInterface {
|
|
|
54
55
|
|
|
55
56
|
export const AppBuilderSdkApi: AppBuilderSdkApiInterface = {
|
|
56
57
|
login: async (token: string) => {
|
|
58
|
+
logger.log(LogSource.SDK, 'Event', 'emiting event - login');
|
|
57
59
|
return await SDKMethodEventsManager.emit('login', token);
|
|
58
60
|
},
|
|
59
61
|
logout: async () => {
|
|
62
|
+
logger.log(LogSource.SDK, 'Event', 'emiting event - logout');
|
|
60
63
|
return await SDKMethodEventsManager.emit('logout');
|
|
61
64
|
},
|
|
62
65
|
customize: async customization => {
|
|
66
|
+
logger.log(LogSource.SDK, 'Event', 'emiting event - customize');
|
|
63
67
|
return await SDKMethodEventsManager.emit('customize', customization);
|
|
64
68
|
},
|
|
65
69
|
customEvents: customEvents,
|
|
66
70
|
joinRoom: async (roomDetails, userName) => {
|
|
71
|
+
logger.log(LogSource.SDK, 'Event', 'emiting event for joinRoom - join', {
|
|
72
|
+
room: roomDetails,
|
|
73
|
+
userName: userName,
|
|
74
|
+
});
|
|
67
75
|
return await SDKMethodEventsManager.emit(
|
|
68
76
|
'join',
|
|
69
77
|
roomDetails,
|
|
@@ -72,8 +80,18 @@ export const AppBuilderSdkApi: AppBuilderSdkApiInterface = {
|
|
|
72
80
|
);
|
|
73
81
|
},
|
|
74
82
|
joinPrecall: async (roomDetails, userName, skipPrecall) => {
|
|
75
|
-
|
|
83
|
+
logger.log(LogSource.SDK, 'Event', 'emiting event for joinPrecall - join', {
|
|
84
|
+
room: roomDetails,
|
|
85
|
+
userName: userName,
|
|
86
|
+
});
|
|
87
|
+
if (!$config.PRECALL) {
|
|
88
|
+
logger.error(
|
|
89
|
+
LogSource.SDK,
|
|
90
|
+
'Log',
|
|
91
|
+
'Precall disabled in config, cant join precall',
|
|
92
|
+
);
|
|
76
93
|
throw new Error('Precall disabled in config, cant join precall');
|
|
94
|
+
}
|
|
77
95
|
const t = await SDKMethodEventsManager.emit(
|
|
78
96
|
'join',
|
|
79
97
|
roomDetails,
|
|
@@ -86,23 +104,47 @@ export const AppBuilderSdkApi: AppBuilderSdkApiInterface = {
|
|
|
86
104
|
];
|
|
87
105
|
},
|
|
88
106
|
setMicrophone: async deviceId => {
|
|
107
|
+
logger.log(
|
|
108
|
+
LogSource.SDK,
|
|
109
|
+
'Event',
|
|
110
|
+
'emiting event - microphoneDevice',
|
|
111
|
+
deviceId,
|
|
112
|
+
);
|
|
89
113
|
return await SDKMethodEventsManager.emit('microphoneDevice', deviceId);
|
|
90
114
|
},
|
|
91
115
|
setSpeaker: async deviceId => {
|
|
116
|
+
logger.log(
|
|
117
|
+
LogSource.SDK,
|
|
118
|
+
'Event',
|
|
119
|
+
'emiting event - speakerDevice',
|
|
120
|
+
deviceId,
|
|
121
|
+
);
|
|
92
122
|
return await SDKMethodEventsManager.emit('speakerDevice', deviceId);
|
|
93
123
|
},
|
|
94
124
|
setCamera: async deviceId => {
|
|
125
|
+
logger.log(
|
|
126
|
+
LogSource.SDK,
|
|
127
|
+
'Event',
|
|
128
|
+
'emiting event - cameraDevice',
|
|
129
|
+
deviceId,
|
|
130
|
+
);
|
|
95
131
|
return await SDKMethodEventsManager.emit('cameraDevice', deviceId);
|
|
96
132
|
},
|
|
97
133
|
muteAudio: async state => {
|
|
134
|
+
logger.log(LogSource.SDK, 'Event', 'emiting event - muteAudio', state);
|
|
98
135
|
return await SDKMethodEventsManager.emit('muteAudio', state);
|
|
99
136
|
},
|
|
100
137
|
muteVideo: async state => {
|
|
138
|
+
logger.log(LogSource.SDK, 'Event', 'emiting event - muteVideo', state);
|
|
101
139
|
return await SDKMethodEventsManager.emit('muteVideo', state);
|
|
102
140
|
},
|
|
103
141
|
createCustomization: customize,
|
|
104
142
|
on: (userEventName, cb) => {
|
|
105
|
-
|
|
143
|
+
logger.debug(
|
|
144
|
+
LogSource.SDK,
|
|
145
|
+
'Event',
|
|
146
|
+
`Event Registered for SDK event- ${userEventName}`,
|
|
147
|
+
);
|
|
106
148
|
return SDKEvents.on(userEventName, cb);
|
|
107
149
|
},
|
|
108
150
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React, {createContext, useState, useEffect} from 'react';
|
|
2
2
|
import {ToggleState} from '../../agora-rn-uikit';
|
|
3
3
|
import {createHook} from 'customization-implementation';
|
|
4
|
+
import {LogSource, logger} from '../logger/AppBuilderLogger';
|
|
4
5
|
|
|
5
6
|
export interface NoiseSupressionContextInterface {
|
|
6
7
|
isNoiseSupressionEnabled: ToggleState;
|
|
@@ -35,6 +36,11 @@ export function NoiseSupressionProvider(props) {
|
|
|
35
36
|
isNoiseSupressionEnabled === ToggleState.disabling ||
|
|
36
37
|
isNoiseSupressionEnabled === ToggleState.enabling
|
|
37
38
|
) {
|
|
39
|
+
logger.error(
|
|
40
|
+
LogSource.Internals,
|
|
41
|
+
'NOISE_CANCELLATION',
|
|
42
|
+
'Cant change noise supression, already in transition',
|
|
43
|
+
);
|
|
38
44
|
throw new Error('Cant change noise supression, already in transition');
|
|
39
45
|
}
|
|
40
46
|
let stateToBeSet =
|
|
@@ -8,6 +8,7 @@ import wasm1 from './../../node_modules/agora-extension-ai-denoiser/external/den
|
|
|
8
8
|
//@ts-ignore
|
|
9
9
|
import wasm2 from './../../node_modules/agora-extension-ai-denoiser/external/denoiser-wasm-simd.wasm';
|
|
10
10
|
import {createHook} from 'customization-implementation';
|
|
11
|
+
import {LogSource, logger} from '../logger/AppBuilderLogger';
|
|
11
12
|
// Necessary To bypass treeshaking, dont remove
|
|
12
13
|
console.log('wasm files loaded are', wasm1, wasm2);
|
|
13
14
|
|
|
@@ -59,13 +60,24 @@ export function NoiseSupressionProvider(props) {
|
|
|
59
60
|
localAudioTrack
|
|
60
61
|
?.pipe(processor.current)
|
|
61
62
|
.pipe(localAudioTrack?.processorDestination);
|
|
63
|
+
|
|
62
64
|
await processor?.current?.enable();
|
|
65
|
+
logger.log(
|
|
66
|
+
LogSource.Internals,
|
|
67
|
+
'NOISE_CANCELLATION',
|
|
68
|
+
'noise suppression enabled',
|
|
69
|
+
);
|
|
63
70
|
}
|
|
64
71
|
};
|
|
65
72
|
|
|
66
73
|
const disableNoiseSuppression = async () => {
|
|
67
74
|
if (processor?.current) {
|
|
68
75
|
await processor?.current?.disable();
|
|
76
|
+
logger.log(
|
|
77
|
+
LogSource.Internals,
|
|
78
|
+
'NOISE_CANCELLATION',
|
|
79
|
+
'noise suppression disabled',
|
|
80
|
+
);
|
|
69
81
|
}
|
|
70
82
|
};
|
|
71
83
|
|
|
@@ -75,6 +87,11 @@ export function NoiseSupressionProvider(props) {
|
|
|
75
87
|
isNoiseSupressionEnabled === ToggleState.disabling ||
|
|
76
88
|
isNoiseSupressionEnabled === ToggleState.enabling
|
|
77
89
|
) {
|
|
90
|
+
logger.error(
|
|
91
|
+
LogSource.Internals,
|
|
92
|
+
'NOISE_CANCELLATION',
|
|
93
|
+
'Cant change noise supression, already in transition',
|
|
94
|
+
);
|
|
78
95
|
throw new Error('Cant change noise supression, already in transition');
|
|
79
96
|
}
|
|
80
97
|
let stateToBeSet =
|
|
@@ -37,6 +37,7 @@ import {
|
|
|
37
37
|
authSessionTimeoutToastHeading,
|
|
38
38
|
loadingText,
|
|
39
39
|
} from '../language/default-labels/commonLabels';
|
|
40
|
+
import {LogSource, logger} from '../logger/AppBuilderLogger';
|
|
40
41
|
|
|
41
42
|
export const GET_USER = gql`
|
|
42
43
|
query getUser {
|
|
@@ -169,20 +170,37 @@ const AuthProvider = (props: AuthProviderProps) => {
|
|
|
169
170
|
})
|
|
170
171
|
.catch(() => {
|
|
171
172
|
setIsAuthenticated(false);
|
|
172
|
-
|
|
173
|
+
logger.error(
|
|
174
|
+
LogSource.Internals,
|
|
175
|
+
'AUTH',
|
|
176
|
+
'error on IDP token setting',
|
|
177
|
+
);
|
|
173
178
|
});
|
|
174
179
|
} else {
|
|
175
|
-
|
|
180
|
+
logger.error(
|
|
181
|
+
LogSource.Internals,
|
|
182
|
+
'AUTH',
|
|
183
|
+
'deep-linking token is empty',
|
|
184
|
+
);
|
|
176
185
|
history.push('/');
|
|
177
186
|
}
|
|
178
187
|
} else if (url?.indexOf('authorize') === -1) {
|
|
179
|
-
|
|
188
|
+
logger.error(
|
|
189
|
+
LogSource.Internals,
|
|
190
|
+
'AUTH',
|
|
191
|
+
`deep-linking setting return to - ${url}`,
|
|
192
|
+
);
|
|
180
193
|
setReturnTo(url);
|
|
181
194
|
} else {
|
|
182
195
|
history.push(url);
|
|
183
196
|
}
|
|
184
197
|
} catch (error) {
|
|
185
|
-
|
|
198
|
+
logger.error(
|
|
199
|
+
LogSource.Internals,
|
|
200
|
+
'AUTH',
|
|
201
|
+
'deep-linking error catch',
|
|
202
|
+
error,
|
|
203
|
+
);
|
|
186
204
|
history.push('/');
|
|
187
205
|
}
|
|
188
206
|
} else {
|
|
@@ -285,12 +303,18 @@ const AuthProvider = (props: AuthProviderProps) => {
|
|
|
285
303
|
useEffect(() => {
|
|
286
304
|
// Ignore if on sdk since IDP flow is not supported
|
|
287
305
|
// For unauthenticated flow authLogin should be called to get the token
|
|
306
|
+
logger.log(LogSource.Internals, 'AUTH', 'App loaded');
|
|
288
307
|
if (isSDK() && ENABLE_AUTH) {
|
|
289
308
|
setIsAuthenticated(true);
|
|
290
309
|
setLoading(false);
|
|
291
310
|
return () => {};
|
|
292
311
|
}
|
|
293
312
|
//if application in authorization state then don't call authlogin
|
|
313
|
+
logger.log(
|
|
314
|
+
LogSource.Internals,
|
|
315
|
+
'AUTH',
|
|
316
|
+
'check if application is in authorized state ?',
|
|
317
|
+
);
|
|
294
318
|
if (
|
|
295
319
|
//to check authoriztion
|
|
296
320
|
location?.pathname?.indexOf('authorize') === -1 &&
|
|
@@ -299,12 +323,22 @@ const AuthProvider = (props: AuthProviderProps) => {
|
|
|
299
323
|
location?.search?.indexOf('msg') === -1
|
|
300
324
|
) {
|
|
301
325
|
//fetch user details
|
|
326
|
+
logger.log(
|
|
327
|
+
LogSource.NetworkRest,
|
|
328
|
+
'user_details',
|
|
329
|
+
'API fetching user_details, to check if user is authenticated',
|
|
330
|
+
);
|
|
302
331
|
getUserDetails()
|
|
303
332
|
.then(_ => {
|
|
304
333
|
//Each time user refresh the page we have to redirect the user to IDP login.then only we can able to refresh the token
|
|
305
334
|
//because we can't read the cookie so we don't know expirytime.
|
|
306
335
|
//so each time page refresh will get new token
|
|
307
336
|
//then only
|
|
337
|
+
logger.log(
|
|
338
|
+
LogSource.NetworkRest,
|
|
339
|
+
'user_details',
|
|
340
|
+
'API user_details query succesful. User is authenticated',
|
|
341
|
+
);
|
|
308
342
|
if (isWeb() && $config.ENABLE_IDP_AUTH) {
|
|
309
343
|
//authLogin();this is for cookie based authentication
|
|
310
344
|
setIsAuthenticated(true);
|
|
@@ -312,7 +346,13 @@ const AuthProvider = (props: AuthProviderProps) => {
|
|
|
312
346
|
setIsAuthenticated(true);
|
|
313
347
|
}
|
|
314
348
|
})
|
|
315
|
-
.catch(
|
|
349
|
+
.catch(error => {
|
|
350
|
+
logger.error(
|
|
351
|
+
LogSource.NetworkRest,
|
|
352
|
+
'user_details',
|
|
353
|
+
'API user details query failed. User is un-authenticated',
|
|
354
|
+
error,
|
|
355
|
+
);
|
|
316
356
|
setIsAuthenticated(false);
|
|
317
357
|
authLogin();
|
|
318
358
|
});
|
|
@@ -338,11 +378,18 @@ const AuthProvider = (props: AuthProviderProps) => {
|
|
|
338
378
|
|
|
339
379
|
const authLogin = () => {
|
|
340
380
|
// Authenticated login flow
|
|
381
|
+
logger.log(LogSource.Internals, 'AUTH', 'Trying to authenticate the user');
|
|
341
382
|
if (ENABLE_AUTH) {
|
|
342
383
|
//AUTH -> IDP -> NATIVE and WEB and DESKTOP
|
|
343
384
|
if ($config.ENABLE_IDP_AUTH && !isSDK()) {
|
|
344
385
|
//it will open external web link and post authentication it will redirect to application
|
|
345
386
|
//@ts-ignore
|
|
387
|
+
logger.log(LogSource.Internals, 'AUTH', 'IDP auth enabled');
|
|
388
|
+
logger.log(
|
|
389
|
+
LogSource.NetworkRest,
|
|
390
|
+
'idp_login',
|
|
391
|
+
'API idp_login Trying to authenticate user',
|
|
392
|
+
);
|
|
346
393
|
enableIDPAuth(
|
|
347
394
|
isWeb()
|
|
348
395
|
? location.pathname
|
|
@@ -353,6 +400,12 @@ const AuthProvider = (props: AuthProviderProps) => {
|
|
|
353
400
|
: '',
|
|
354
401
|
timeoutHeading,
|
|
355
402
|
)?.then((response: any) => {
|
|
403
|
+
logger.log(
|
|
404
|
+
LogSource.NetworkRest,
|
|
405
|
+
'idp_login',
|
|
406
|
+
'API idp_login authentication successful',
|
|
407
|
+
response,
|
|
408
|
+
);
|
|
356
409
|
if (isAndroid() || isIOS()) {
|
|
357
410
|
if (response && response?.showNativePopup) {
|
|
358
411
|
setShowNativePopup(true);
|
|
@@ -364,8 +417,20 @@ const AuthProvider = (props: AuthProviderProps) => {
|
|
|
364
417
|
}
|
|
365
418
|
//AUTH -> IDP -> SDK ONLY
|
|
366
419
|
else if ($config.ENABLE_TOKEN_AUTH && isSDK()) {
|
|
420
|
+
logger.log(LogSource.Internals, 'AUTH', 'Token auth enabled');
|
|
421
|
+
logger.log(
|
|
422
|
+
LogSource.NetworkRest,
|
|
423
|
+
'token_login',
|
|
424
|
+
'API token_login Trying to authenticate user',
|
|
425
|
+
);
|
|
367
426
|
enableTokenAuth()
|
|
368
427
|
.then(res => {
|
|
428
|
+
logger.log(
|
|
429
|
+
LogSource.NetworkRest,
|
|
430
|
+
'token_login',
|
|
431
|
+
'API token_login User Authenticated successfully',
|
|
432
|
+
res,
|
|
433
|
+
);
|
|
369
434
|
setIsAuthenticated(true);
|
|
370
435
|
history.push('/create');
|
|
371
436
|
})
|
|
@@ -373,6 +438,12 @@ const AuthProvider = (props: AuthProviderProps) => {
|
|
|
373
438
|
//don't show token expire/not found toast in the sdk
|
|
374
439
|
//we have event emitter to inform the customer application
|
|
375
440
|
//they have to listen for those events
|
|
441
|
+
logger.error(
|
|
442
|
+
LogSource.NetworkRest,
|
|
443
|
+
'token_login',
|
|
444
|
+
'API token_login failed. There was an error',
|
|
445
|
+
error,
|
|
446
|
+
);
|
|
376
447
|
if (!isSDK()) {
|
|
377
448
|
if (error instanceof Error) {
|
|
378
449
|
setAuthError(error.message);
|
|
@@ -388,6 +459,16 @@ const AuthProvider = (props: AuthProviderProps) => {
|
|
|
388
459
|
}
|
|
389
460
|
// Unauthenticated login flow
|
|
390
461
|
else {
|
|
462
|
+
logger.log(
|
|
463
|
+
LogSource.Internals,
|
|
464
|
+
'AUTH',
|
|
465
|
+
'Project has No auth(token or idp) enabled',
|
|
466
|
+
);
|
|
467
|
+
logger.log(
|
|
468
|
+
LogSource.NetworkRest,
|
|
469
|
+
'unauth_login',
|
|
470
|
+
'API unauth_login Trying to authenticate user',
|
|
471
|
+
);
|
|
391
472
|
fetch(GET_UNAUTH_FLOW_API_ENDPOINT(), {
|
|
392
473
|
credentials: 'include',
|
|
393
474
|
})
|
|
@@ -395,7 +476,21 @@ const AuthProvider = (props: AuthProviderProps) => {
|
|
|
395
476
|
.then(response => {
|
|
396
477
|
// unauthenticated flow all platform we will have to handle the token manually
|
|
397
478
|
// we need to store token manually
|
|
479
|
+
logger.log(
|
|
480
|
+
LogSource.NetworkRest,
|
|
481
|
+
'unauth_login',
|
|
482
|
+
'API unauth_login authentication successful. User is logged in.',
|
|
483
|
+
response.token,
|
|
484
|
+
);
|
|
398
485
|
if (!response.token) {
|
|
486
|
+
logger.error(
|
|
487
|
+
LogSource.NetworkRest,
|
|
488
|
+
'unauth_login',
|
|
489
|
+
'API unauth_login failed. There was an error',
|
|
490
|
+
{
|
|
491
|
+
data: 'Token not received',
|
|
492
|
+
},
|
|
493
|
+
);
|
|
399
494
|
throw new Error('Token not received');
|
|
400
495
|
} else {
|
|
401
496
|
enableTokenAuth(response.token)
|
|
@@ -418,6 +513,12 @@ const AuthProvider = (props: AuthProviderProps) => {
|
|
|
418
513
|
}
|
|
419
514
|
})
|
|
420
515
|
.catch(error => {
|
|
516
|
+
logger.error(
|
|
517
|
+
LogSource.NetworkRest,
|
|
518
|
+
'unauth_login',
|
|
519
|
+
'API unauth_login failed. There was an error',
|
|
520
|
+
error,
|
|
521
|
+
);
|
|
421
522
|
if (error instanceof Error) {
|
|
422
523
|
setAuthError(error.message);
|
|
423
524
|
} else {
|
|
@@ -430,12 +531,30 @@ const AuthProvider = (props: AuthProviderProps) => {
|
|
|
430
531
|
|
|
431
532
|
const authLogout = () => {
|
|
432
533
|
if (ENABLE_AUTH && $config.ENABLE_IDP_AUTH && !isSDK()) {
|
|
534
|
+
logger.log(LogSource.Internals, 'AUTH', 'Request to log out');
|
|
535
|
+
logger.log(
|
|
536
|
+
LogSource.NetworkRest,
|
|
537
|
+
'idp_logout',
|
|
538
|
+
'API idp_logout Trying to log out IDP authenticated user',
|
|
539
|
+
);
|
|
433
540
|
idpLogout(isAndroid() || isIOS() ? setShowNativePopup : {})
|
|
434
541
|
.then(res => {
|
|
542
|
+
logger.log(
|
|
543
|
+
LogSource.NetworkRest,
|
|
544
|
+
'idp_logout',
|
|
545
|
+
'API idp_logout User logged out successfully',
|
|
546
|
+
res,
|
|
547
|
+
);
|
|
435
548
|
setIsAuthenticated(false);
|
|
436
549
|
})
|
|
437
|
-
.catch(
|
|
550
|
+
.catch(error => {
|
|
438
551
|
setIsAuthenticated(false);
|
|
552
|
+
logger.error(
|
|
553
|
+
LogSource.NetworkRest,
|
|
554
|
+
'idp_logout',
|
|
555
|
+
'API idp_logout failed. There was an error',
|
|
556
|
+
error,
|
|
557
|
+
);
|
|
439
558
|
console.error('user logout failed');
|
|
440
559
|
setAuthError('Error occured on Logout, please try again.');
|
|
441
560
|
setTimeout(() => {
|
|
@@ -449,10 +568,28 @@ const AuthProvider = (props: AuthProviderProps) => {
|
|
|
449
568
|
//sdk with auth flow will use sdk api for logout
|
|
450
569
|
history.push('/create');
|
|
451
570
|
} else {
|
|
571
|
+
logger.log(LogSource.Internals, 'AUTH', 'Request to log out');
|
|
572
|
+
logger.log(
|
|
573
|
+
LogSource.NetworkRest,
|
|
574
|
+
'token_logout',
|
|
575
|
+
'API token_logout Trying to log out token authenticated user',
|
|
576
|
+
);
|
|
452
577
|
tokenLogout()
|
|
453
|
-
.then(res => {
|
|
454
|
-
|
|
578
|
+
.then(res => {
|
|
579
|
+
logger.log(
|
|
580
|
+
LogSource.NetworkRest,
|
|
581
|
+
'token_logout',
|
|
582
|
+
'API token_logout. Logged out user successfully',
|
|
583
|
+
);
|
|
584
|
+
})
|
|
585
|
+
.catch(error => {
|
|
455
586
|
console.error('user logout failed');
|
|
587
|
+
logger.error(
|
|
588
|
+
LogSource.NetworkRest,
|
|
589
|
+
'token_logout',
|
|
590
|
+
'API token_logout failed. There was an error',
|
|
591
|
+
error,
|
|
592
|
+
);
|
|
456
593
|
setAuthError('Error occured on Logout, please try again.');
|
|
457
594
|
})
|
|
458
595
|
.finally(() => {
|
|
@@ -5,6 +5,7 @@ import Loading from '../subComponents/Loading';
|
|
|
5
5
|
import useTokenAuth from './useTokenAuth';
|
|
6
6
|
import {useString} from '../utils/useString';
|
|
7
7
|
import {authAuthorizingApplicationText} from '../language/default-labels/commonLabels';
|
|
8
|
+
import {LogSource, logger} from '../logger/AppBuilderLogger';
|
|
8
9
|
|
|
9
10
|
export const IDPAuth = () => {
|
|
10
11
|
const {setIsAuthenticated} = useAuth();
|
|
@@ -22,7 +23,7 @@ export const IDPAuth = () => {
|
|
|
22
23
|
})
|
|
23
24
|
.catch(() => {
|
|
24
25
|
setIsAuthenticated(false);
|
|
25
|
-
|
|
26
|
+
logger.error(LogSource.Internals, 'AUTH', 'electron login failed');
|
|
26
27
|
});
|
|
27
28
|
}
|
|
28
29
|
}, []);
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
authAuthorizingApplicationText,
|
|
12
12
|
authErrorOnLoginToastHeading,
|
|
13
13
|
} from '../language/default-labels/commonLabels';
|
|
14
|
+
import {LogSource, logger} from '../logger/AppBuilderLogger';
|
|
14
15
|
|
|
15
16
|
export const IDPAuth = () => {
|
|
16
17
|
const toastheading = useString(authErrorOnLoginToastHeading)();
|
|
@@ -45,9 +46,14 @@ export const IDPAuth = () => {
|
|
|
45
46
|
history.push('/');
|
|
46
47
|
}
|
|
47
48
|
})
|
|
48
|
-
.catch(
|
|
49
|
+
.catch(error => {
|
|
49
50
|
setIsAuthenticated(false);
|
|
50
|
-
|
|
51
|
+
logger.error(
|
|
52
|
+
LogSource.Internals,
|
|
53
|
+
'AUTH',
|
|
54
|
+
'error on IDP token setting',
|
|
55
|
+
error,
|
|
56
|
+
);
|
|
51
57
|
});
|
|
52
58
|
} else {
|
|
53
59
|
setIsAuthenticated(false);
|