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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy