Skip to content

Commit 1a5831f

Browse files
authored
Merge pull request #507 from lowcoder-org/dev
Dev > Main - Agora Meeting Token Handling
2 parents d8fd3d4 + e12e0e5 commit 1a5831f

File tree

6 files changed

+122
-84
lines changed

6 files changed

+122
-84
lines changed

client/packages/lowcoder-design/src/components/Section.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,4 +142,5 @@ export const sectionNames = {
142142
validation: trans("prop.validation"),
143143
layout: trans("prop.layout"),
144144
style: trans("prop.style"),
145+
meetings : trans("prop.meetings"),
145146
};

client/packages/lowcoder-design/src/i18n/design/locales/en.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export const en = {
2323
validation: "Validation",
2424
layout: "Layout",
2525
style: "Style",
26+
meetings : "Meeting Settings",
2627
},
2728
passwordInput: {
2829
label: "Password:",

client/packages/lowcoder/src/comps/comps/meetingComp/controlButton.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ let ButtonTmpComp = (function () {
179179
iconSize: withDefault(StringControl, "20px"),
180180
type: dropdownControl(typeOptions, ""),
181181
autoHeight: withDefault(AutoHeightControl, "fixed"),
182+
aspectRatio: withDefault(StringControl, "1 / 1"),
182183
onEvent: ButtonEventHandlerControl,
183184
disabled: BoolCodeControl,
184185
loading: BoolCodeControl,
@@ -244,8 +245,16 @@ let ButtonTmpComp = (function () {
244245
loading={props.loading}
245246
style={
246247
props.autoHeight
247-
? { width: "100%", height: "100%" }
248-
: undefined
248+
? {
249+
width: "100%",
250+
height: "100%",
251+
aspectRatio: props.aspectRatio,
252+
borderRadius: props.style.radius,
253+
}
254+
: {
255+
aspectRatio: props.aspectRatio,
256+
borderRadius: props.style.radius,
257+
}
249258
}
250259
disabled={
251260
props.disabled ||
@@ -304,6 +313,9 @@ let ButtonTmpComp = (function () {
304313
</Section>
305314
<Section name={sectionNames.style}>
306315
{children.style.getPropertyView()}
316+
{children.aspectRatio.propertyView({
317+
label: "Video Aspect Ratio",
318+
})}
307319
</Section>
308320
</>
309321
))

client/packages/lowcoder/src/comps/comps/meetingComp/videoMeetingControllerComp.tsx

Lines changed: 87 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,10 @@ import { useUserViewMode } from "util/hooks";
4141
import { isNumeric } from "util/stringUtils";
4242
import { NameConfig, withExposingConfigs } from "../../generators/withExposing";
4343

44-
import axios from "axios";
44+
import { v4 as uuidv4 } from 'uuid';
45+
46+
// import axios from "axios";
47+
4548
import AgoraRTC, {
4649
ICameraVideoTrack,
4750
IMicrophoneAudioTrack,
@@ -51,7 +54,7 @@ import AgoraRTC, {
5154
ILocalVideoTrack,
5255
} from "agora-rtc-sdk-ng";
5356

54-
import { JSONValue } from "@lowcoder-ee/index.sdk";
57+
import { JSONValue, NumberControl } from "@lowcoder-ee/index.sdk";
5558
import { getData } from "../listViewComp/listViewUtils";
5659
import AgoraRTM, { RtmChannel, RtmClient } from "agora-rtm-sdk";
5760

@@ -103,28 +106,23 @@ export const client: IAgoraRTCClient = AgoraRTC.createClient({
103106
mode: "rtc",
104107
codec: "vp8",
105108
});
106-
AgoraRTC.setLogLevel(3);
109+
110+
AgoraRTC.setLogLevel(4);
111+
112+
/*
113+
0: DEBUG. Output all API logs.
114+
1: INFO. Output logs of the INFO, WARNING and ERROR level.
115+
2: WARNING. Output logs of the WARNING and ERROR level.
116+
3: ERROR. Output logs of the ERROR level.
117+
4: NONE. Do not output any log.
118+
*/
107119

108120
let audioTrack: IMicrophoneAudioTrack;
109121
let videoTrack: ICameraVideoTrack;
110122
let screenShareStream: ILocalVideoTrack;
111123
let userId: UID | null | undefined;
112124
let rtmChannelResponse: RtmChannel;
113125
let rtmClient: RtmClient;
114-
const agoraTokenUrl = `https://sandbox.wiggolive.com/token/rtc`;
115-
116-
const generateToken = async (
117-
appId: any,
118-
certificate: any,
119-
channelName: any
120-
) => {
121-
let response = await axios.post(agoraTokenUrl, {
122-
appId,
123-
certificate,
124-
channelName,
125-
});
126-
return response.data;
127-
};
128126

129127
const turnOnCamera = async (flag?: boolean) => {
130128
if (videoTrack) {
@@ -147,7 +145,7 @@ const turnOnMicrophone = async (flag?: boolean) => {
147145
};
148146
const shareScreen = async (sharing: boolean) => {
149147
try {
150-
if (sharing == false) {
148+
if (sharing === false) {
151149
await client.unpublish(screenShareStream);
152150
await client.publish(videoTrack);
153151
videoTrack.play(userId + "");
@@ -179,23 +177,18 @@ const leaveChannel = async () => {
179177
await rtmChannelResponse.leave();
180178
};
181179

182-
const hostChanged = (users: any) => {};
183-
184180
const publishVideo = async (
185181
appId: string,
186-
channel: any,
187-
height: any,
188-
certifiCateKey: string
182+
channel: string,
183+
rtmToken: string,
184+
rtcToken: string
189185
) => {
190-
let token = null;
191-
if (certifiCateKey) {
192-
token = await generateToken(appId, certifiCateKey, channel);
193-
}
194-
await turnOnCamera(true);
195-
await client.join(appId, channel, token, userId);
196-
await client.publish(videoTrack);
197-
198-
await rtmInit(appId, userId, channel);
186+
// initializing the Agora Meeting Client
187+
await turnOnCamera(true);
188+
await client.join(appId, channel, rtcToken, userId);
189+
await client.publish(videoTrack);
190+
// initializing the Agora RTM Client
191+
await rtmInit(appId, userId, rtmToken, channel);
199192
};
200193

201194
const sendMessageRtm = (message: any) => {
@@ -206,10 +199,11 @@ const sendPeerMessageRtm = (message: any, toId: string) => {
206199
rtmClient.sendMessageToPeer({ text: JSON.stringify(message) }, toId);
207200
};
208201

209-
const rtmInit = async (appId: any, uid: any, channel: any) => {
202+
const rtmInit = async (appId: any, uid: any, token: any, channel: any) => {
210203
rtmClient = AgoraRTM.createInstance(appId);
211204
let options = {
212205
uid: String(uid),
206+
token: token ? token : null,
213207
};
214208
await rtmClient.login(options);
215209

@@ -237,8 +231,10 @@ export const meetingControllerChildren = {
237231
participants: stateComp<JSONValue>([]),
238232
usersScreenShared: stateComp<JSONValue>([]),
239233
localUser: jsonObjectExposingStateControl(""),
240-
meetingName: stringStateControl("meetingName"),
241-
certifiCateKey: stringStateControl(""),
234+
localUserID : withDefault(stringStateControl(trans("meeting.localUserID")), uuidv4() + ""),
235+
meetingName: withDefault(stringStateControl(trans("meeting.meetingName")), uuidv4() + ""),
236+
rtmToken: stringStateControl(trans("meeting.rtmToken")),
237+
rtcToken: stringStateControl(trans("meeting.rtcToken")),
242238
messages: stateComp<JSONValue>([]),
243239
};
244240
let MTComp = (function () {
@@ -269,34 +265,29 @@ let MTComp = (function () {
269265
});
270266
const [rtmMessages, setRtmMessages] = useState<any>([]);
271267
const [localUserSpeaking, setLocalUserSpeaking] = useState<any>(false);
272-
const [localUserVideo, setLocalUserVideo] =
273-
useState<IAgoraRTCRemoteUser>();
268+
const [localUserVideo, setLocalUserVideo] = useState<IAgoraRTCRemoteUser>();
274269
const [userJoined, setUserJoined] = useState<IAgoraRTCRemoteUser>();
275270
const [userLeft, setUserLeft] = useState<IAgoraRTCRemoteUser>();
276271

277272
useEffect(() => {
278273
if (userJoined) {
274+
let prevUsers: any[] = props.participants as [];
279275
let userData = {
280276
user: userJoined.uid,
281-
host: false,
282277
audiostatus: userJoined.hasAudio,
283278
streamingVideo: true,
284279
};
285280
setUserIds((userIds: any) => [...userIds, userData]);
286-
if (userIds.length == 0) {
287-
userData.host = true;
288-
} else {
289-
userData.host = false;
290-
}
291281
dispatch(
292282
changeChildAction(
293283
"participants",
294-
removeDuplicates(getData([...userIds, userData]).data, "user"),
284+
removeDuplicates(getData([...prevUsers, userData]).data, "user"),
295285
false
296286
)
297287
);
298288
}
299289
}, [userJoined]);
290+
300291
function removeDuplicates(arr: any, prop: any) {
301292
const uniqueObjects = [];
302293
const seenValues = new Set();
@@ -320,7 +311,6 @@ let MTComp = (function () {
320311
let hostExists = newUsers.filter((f: any) => f.host === true);
321312
if (hostExists.length == 0 && newUsers.length > 0) {
322313
newUsers[0].host = true;
323-
hostChanged(newUsers);
324314
}
325315
setUserIds(newUsers);
326316
dispatch(
@@ -432,8 +422,6 @@ let MTComp = (function () {
432422
client.on(
433423
"user-unpublished",
434424
(user: IAgoraRTCRemoteUser, mediaType: "video" | "audio") => {
435-
console.log("user-unpublished");
436-
437425
setLocalUserVideo(user);
438426
}
439427
);
@@ -507,15 +495,6 @@ let MTComp = (function () {
507495
.setPropertyViewFn((children) => (
508496
<>
509497
<Section name={sectionNames.basic}>
510-
{children.appId.propertyView({ label: trans("meeting.appid") })}
511-
{children.certifiCateKey.propertyView({
512-
label: trans("meeting.certifiCateKey"),
513-
})}
514-
515-
{children.meetingName.propertyView({
516-
label: trans("meeting.meetingName"),
517-
})}
518-
519498
{children.placement.propertyView({
520499
label: trans("drawer.placement"),
521500
radioButton: true,
@@ -541,6 +520,23 @@ let MTComp = (function () {
541520
label: trans("prop.showMask"),
542521
})}
543522
</Section>
523+
<Section name={sectionNames.meetings}>
524+
{children.appId.propertyView({
525+
label: trans("meeting.appid")
526+
})}
527+
{children.meetingName.propertyView({
528+
label: trans("meeting.meetingName"),
529+
})}
530+
{children.localUserID.propertyView({
531+
label: trans("meeting.localUserID"),
532+
})}
533+
{children.rtmToken.propertyView({
534+
label: trans("meeting.rtmToken"),
535+
})}
536+
{children.rtcToken.propertyView({
537+
label: trans("meeting.rtcToken"),
538+
})}
539+
</Section>
544540
<Section name={sectionNames.interaction}>
545541
{children.onEvent.getPropertyView()}
546542
</Section>
@@ -636,7 +632,8 @@ MTComp = withMethodExposing(MTComp, [
636632
params: [],
637633
},
638634
execute: async (comp, values) => {
639-
userId = Math.floor(100000 + Math.random() * 900000);
635+
if (comp.children.meetingActive.getView().value) return;
636+
userId = comp.children.localUserID.getView().value === "" ? uuidv4() : comp.children.localUserID.getView().value;
640637
comp.children.localUser.change({
641638
user: userId + "",
642639
audiostatus: false,
@@ -659,11 +656,9 @@ MTComp = withMethodExposing(MTComp, [
659656
comp.children.videoControl.change(true);
660657
await publishVideo(
661658
comp.children.appId.getView(),
662-
comp.children.meetingName.getView().value == ""
663-
? "_meetingId"
664-
: comp.children.meetingName.getView().value,
665-
comp.children,
666-
comp.children.certifiCateKey.getView().value
659+
comp.children.meetingName.getView().value === "" ? uuidv4() : comp.children.meetingName.getView().value,
660+
comp.children.rtmToken.getView().value,
661+
comp.children.rtcToken.getView().value
667662
);
668663
comp.children.meetingActive.change(true);
669664
},
@@ -677,9 +672,9 @@ MTComp = withMethodExposing(MTComp, [
677672
execute: async (comp, values) => {
678673
if (!comp.children.meetingActive.getView().value) return;
679674
let otherData =
680-
values != undefined && values[1] !== undefined ? values[1] : "";
675+
values !== undefined && values[1] !== undefined ? values[1] : "";
681676
let toUsers: any =
682-
values != undefined && values[0] !== undefined ? values[0] : "";
677+
values !== undefined && values[0] !== undefined ? values[0] : "";
683678

684679
let message: any = {
685680
time: Date.now(),
@@ -711,7 +706,7 @@ MTComp = withMethodExposing(MTComp, [
711706
{
712707
method: {
713708
name: "setUserName",
714-
description: trans("meeting.meetingName"),
709+
description: trans("meeting.userName"),
715710
params: [],
716711
},
717712
execute: async (comp, values) => {
@@ -720,6 +715,28 @@ MTComp = withMethodExposing(MTComp, [
720715
comp.children.localUser.change({ ...userLocal, userName: userName });
721716
},
722717
},
718+
{
719+
method: {
720+
name: "setRTCToken",
721+
description: trans("meeting.rtcToken"),
722+
params: [],
723+
},
724+
execute: async (comp, values) => {
725+
let rtcToken: any = values[0];
726+
comp.children.rtcToken.change(rtcToken);
727+
},
728+
},
729+
{
730+
method: {
731+
name: "setRTMToken",
732+
description: trans("meeting.rtmToken"),
733+
params: [],
734+
},
735+
execute: async (comp, values) => {
736+
let rtmToken: any = values[0];
737+
comp.children.rtmToken.change(rtmToken);
738+
},
739+
},
723740
{
724741
method: {
725742
name: "endMeeting",
@@ -758,7 +775,10 @@ export const VideoMeetingControllerComp = withExposingConfigs(MTComp, [
758775
new NameConfig("appId", trans("meeting.appid")),
759776
new NameConfig("localUser", trans("meeting.host")),
760777
new NameConfig("participants", trans("meeting.participants")),
761-
new NameConfig("meetingActive", trans("meeting.meetingName")),
778+
new NameConfig("meetingActive", trans("meeting.meetingActive")),
762779
new NameConfig("meetingName", trans("meeting.meetingName")),
763-
new NameConfig("messages", trans("meeting.meetingName")),
780+
new NameConfig("localUserID", trans("meeting.localUserID")),
781+
new NameConfig("messages", trans("meeting.messages")),
782+
new NameConfig("rtmToken", trans("meeting.rtmToken")),
783+
new NameConfig("rtcToken", trans("meeting.rtcToken")),
764784
]);

client/packages/lowcoder/src/comps/comps/meetingComp/videoMeetingStreamComp.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,7 @@ export const meetingStreamChildren = {
151151
style: ButtonStyleControl,
152152
viewRef: RefControl<HTMLElement>,
153153
userId: stringExposingStateControl(""),
154-
profileImageUrl: withDefault(
155-
StringStateControl,
156-
"https://via.placeholder.com/120"
157-
),
154+
profileImageUrl: withDefault(StringStateControl, "https://api.dicebear.com/7.x/fun-emoji/svg?seed=Peanut&radius=50&backgroundColor=transparent&randomizeIds=true&eyes=wink,sleepClose"),
158155
noVideoText: stringExposingStateControl("No Video"),
159156
};
160157

0 commit comments

Comments
 (0)