diff --git a/client/packages/lowcoder-design/src/components/Section.tsx b/client/packages/lowcoder-design/src/components/Section.tsx index feae5402a..a0c18134f 100644 --- a/client/packages/lowcoder-design/src/components/Section.tsx +++ b/client/packages/lowcoder-design/src/components/Section.tsx @@ -142,4 +142,5 @@ export const sectionNames = { validation: trans("prop.validation"), layout: trans("prop.layout"), style: trans("prop.style"), + meetings : trans("prop.meetings"), }; diff --git a/client/packages/lowcoder-design/src/i18n/design/locales/en.ts b/client/packages/lowcoder-design/src/i18n/design/locales/en.ts index 0082f6f98..59e045b55 100644 --- a/client/packages/lowcoder-design/src/i18n/design/locales/en.ts +++ b/client/packages/lowcoder-design/src/i18n/design/locales/en.ts @@ -23,6 +23,7 @@ export const en = { validation: "Validation", layout: "Layout", style: "Style", + meetings : "Meeting Settings", }, passwordInput: { label: "Password:", diff --git a/client/packages/lowcoder/src/comps/comps/meetingComp/controlButton.tsx b/client/packages/lowcoder/src/comps/comps/meetingComp/controlButton.tsx index d3ad399a5..b6034a6db 100644 --- a/client/packages/lowcoder/src/comps/comps/meetingComp/controlButton.tsx +++ b/client/packages/lowcoder/src/comps/comps/meetingComp/controlButton.tsx @@ -179,6 +179,7 @@ let ButtonTmpComp = (function () { iconSize: withDefault(StringControl, "20px"), type: dropdownControl(typeOptions, ""), autoHeight: withDefault(AutoHeightControl, "fixed"), + aspectRatio: withDefault(StringControl, "1 / 1"), onEvent: ButtonEventHandlerControl, disabled: BoolCodeControl, loading: BoolCodeControl, @@ -244,8 +245,16 @@ let ButtonTmpComp = (function () { loading={props.loading} style={ props.autoHeight - ? { width: "100%", height: "100%" } - : undefined + ? { + width: "100%", + height: "100%", + aspectRatio: props.aspectRatio, + borderRadius: props.style.radius, + } + : { + aspectRatio: props.aspectRatio, + borderRadius: props.style.radius, + } } disabled={ props.disabled || @@ -304,6 +313,9 @@ let ButtonTmpComp = (function () {
{children.style.getPropertyView()} + {children.aspectRatio.propertyView({ + label: "Video Aspect Ratio", + })}
)) diff --git a/client/packages/lowcoder/src/comps/comps/meetingComp/videoMeetingControllerComp.tsx b/client/packages/lowcoder/src/comps/comps/meetingComp/videoMeetingControllerComp.tsx index ae67cebaf..49a5f2cbb 100644 --- a/client/packages/lowcoder/src/comps/comps/meetingComp/videoMeetingControllerComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/meetingComp/videoMeetingControllerComp.tsx @@ -41,7 +41,10 @@ import { useUserViewMode } from "util/hooks"; import { isNumeric } from "util/stringUtils"; import { NameConfig, withExposingConfigs } from "../../generators/withExposing"; -import axios from "axios"; +import { v4 as uuidv4 } from 'uuid'; + +// import axios from "axios"; + import AgoraRTC, { ICameraVideoTrack, IMicrophoneAudioTrack, @@ -51,7 +54,7 @@ import AgoraRTC, { ILocalVideoTrack, } from "agora-rtc-sdk-ng"; -import { JSONValue } from "@lowcoder-ee/index.sdk"; +import { JSONValue, NumberControl } from "@lowcoder-ee/index.sdk"; import { getData } from "../listViewComp/listViewUtils"; import AgoraRTM, { RtmChannel, RtmClient } from "agora-rtm-sdk"; @@ -103,7 +106,16 @@ export const client: IAgoraRTCClient = AgoraRTC.createClient({ mode: "rtc", codec: "vp8", }); -AgoraRTC.setLogLevel(3); + +AgoraRTC.setLogLevel(4); + +/* +0: DEBUG. Output all API logs. +1: INFO. Output logs of the INFO, WARNING and ERROR level. +2: WARNING. Output logs of the WARNING and ERROR level. +3: ERROR. Output logs of the ERROR level. +4: NONE. Do not output any log. +*/ let audioTrack: IMicrophoneAudioTrack; let videoTrack: ICameraVideoTrack; @@ -112,23 +124,6 @@ let userId: UID | null | undefined; let rtmChannelResponse: RtmChannel; let rtmClient: RtmClient; -const generateToken = async ( - appId: any, - certificate: any, - channelName: any, - serverurl: any -) => { - let response = await axios.post( - serverurl ?? "https://sandbox.wiggolive.com/token/rtc", - { - appId, - certificate, - channelName, - } - ); - return response.data; -}; - const turnOnCamera = async (flag?: boolean) => { if (videoTrack) { return videoTrack.setEnabled(flag!); @@ -150,7 +145,7 @@ const turnOnMicrophone = async (flag?: boolean) => { }; const shareScreen = async (sharing: boolean) => { try { - if (sharing == false) { + if (sharing === false) { await client.unpublish(screenShareStream); await client.publish(videoTrack); videoTrack.play(userId + ""); @@ -184,20 +179,16 @@ const leaveChannel = async () => { const publishVideo = async ( appId: string, - channel: any, - height: any, - certifiCateKey: string, - serverurl: string + channel: string, + rtmToken: string, + rtcToken: string ) => { - let token = null; - if (certifiCateKey) { - token = await generateToken(appId, certifiCateKey, channel, serverurl); - } - await turnOnCamera(true); - await client.join(appId, channel, token, userId); - await client.publish(videoTrack); - - await rtmInit(appId, userId, channel); + // initializing the Agora Meeting Client + await turnOnCamera(true); + await client.join(appId, channel, rtcToken, userId); + await client.publish(videoTrack); + // initializing the Agora RTM Client + await rtmInit(appId, userId, rtmToken, channel); }; const sendMessageRtm = (message: any) => { @@ -208,10 +199,11 @@ const sendPeerMessageRtm = (message: any, toId: string) => { rtmClient.sendMessageToPeer({ text: JSON.stringify(message) }, toId); }; -const rtmInit = async (appId: any, uid: any, channel: any) => { +const rtmInit = async (appId: any, uid: any, token: any, channel: any) => { rtmClient = AgoraRTM.createInstance(appId); let options = { uid: String(uid), + token: token ? token : null, }; await rtmClient.login(options); @@ -236,12 +228,13 @@ export const meetingControllerChildren = { endCall: withDefault(BooleanStateControl, "false"), sharing: withDefault(BooleanStateControl, "false"), appId: withDefault(StringControl, trans("meeting.appid")), - tokenServerUrl: withDefault(StringControl, trans("meeting.serverurl")), participants: stateComp([]), usersScreenShared: stateComp([]), localUser: jsonObjectExposingStateControl(""), - meetingName: stringStateControl("meetingName"), - certifiCateKey: stringStateControl(""), + localUserID : withDefault(stringStateControl(trans("meeting.localUserID")), uuidv4() + ""), + meetingName: withDefault(stringStateControl(trans("meeting.meetingName")), uuidv4() + ""), + rtmToken: stringStateControl(trans("meeting.rtmToken")), + rtcToken: stringStateControl(trans("meeting.rtcToken")), messages: stateComp([]), }; let MTComp = (function () { @@ -272,8 +265,7 @@ let MTComp = (function () { }); const [rtmMessages, setRtmMessages] = useState([]); const [localUserSpeaking, setLocalUserSpeaking] = useState(false); - const [localUserVideo, setLocalUserVideo] = - useState(); + const [localUserVideo, setLocalUserVideo] = useState(); const [userJoined, setUserJoined] = useState(); const [userLeft, setUserLeft] = useState(); @@ -503,17 +495,6 @@ let MTComp = (function () { .setPropertyViewFn((children) => ( <>
- {children.appId.propertyView({ label: trans("meeting.appid") })} - {children.certifiCateKey.propertyView({ - label: trans("meeting.certifiCateKey"), - })} - {children.meetingName.propertyView({ - label: trans("meeting.meetingName"), - })} - {children.tokenServerUrl.propertyView({ - label: trans("meeting.serverurl"), - })} - {children.placement.propertyView({ label: trans("drawer.placement"), radioButton: true, @@ -539,6 +520,23 @@ let MTComp = (function () { label: trans("prop.showMask"), })}
+
+ {children.appId.propertyView({ + label: trans("meeting.appid") + })} + {children.meetingName.propertyView({ + label: trans("meeting.meetingName"), + })} + {children.localUserID.propertyView({ + label: trans("meeting.localUserID"), + })} + {children.rtmToken.propertyView({ + label: trans("meeting.rtmToken"), + })} + {children.rtcToken.propertyView({ + label: trans("meeting.rtcToken"), + })} +
{children.onEvent.getPropertyView()}
@@ -635,7 +633,7 @@ MTComp = withMethodExposing(MTComp, [ }, execute: async (comp, values) => { if (comp.children.meetingActive.getView().value) return; - userId = Math.floor(100000 + Math.random() * 900000); + userId = comp.children.localUserID.getView().value === "" ? uuidv4() : comp.children.localUserID.getView().value; comp.children.localUser.change({ user: userId + "", audiostatus: false, @@ -658,12 +656,9 @@ MTComp = withMethodExposing(MTComp, [ comp.children.videoControl.change(true); await publishVideo( comp.children.appId.getView(), - comp.children.meetingName.getView().value == "" - ? "_meetingId" - : comp.children.meetingName.getView().value, - comp.children, - comp.children.certifiCateKey.getView().value, - comp.children.tokenServerUrl.getView() + comp.children.meetingName.getView().value === "" ? uuidv4() : comp.children.meetingName.getView().value, + comp.children.rtmToken.getView().value, + comp.children.rtcToken.getView().value ); comp.children.meetingActive.change(true); }, @@ -677,9 +672,9 @@ MTComp = withMethodExposing(MTComp, [ execute: async (comp, values) => { if (!comp.children.meetingActive.getView().value) return; let otherData = - values != undefined && values[1] !== undefined ? values[1] : ""; + values !== undefined && values[1] !== undefined ? values[1] : ""; let toUsers: any = - values != undefined && values[0] !== undefined ? values[0] : ""; + values !== undefined && values[0] !== undefined ? values[0] : ""; let message: any = { time: Date.now(), @@ -711,7 +706,7 @@ MTComp = withMethodExposing(MTComp, [ { method: { name: "setUserName", - description: trans("meeting.meetingName"), + description: trans("meeting.userName"), params: [], }, execute: async (comp, values) => { @@ -720,6 +715,28 @@ MTComp = withMethodExposing(MTComp, [ comp.children.localUser.change({ ...userLocal, userName: userName }); }, }, + { + method: { + name: "setRTCToken", + description: trans("meeting.rtcToken"), + params: [], + }, + execute: async (comp, values) => { + let rtcToken: any = values[0]; + comp.children.rtcToken.change(rtcToken); + }, + }, + { + method: { + name: "setRTMToken", + description: trans("meeting.rtmToken"), + params: [], + }, + execute: async (comp, values) => { + let rtmToken: any = values[0]; + comp.children.rtmToken.change(rtmToken); + }, + }, { method: { name: "endMeeting", @@ -758,7 +775,10 @@ export const VideoMeetingControllerComp = withExposingConfigs(MTComp, [ new NameConfig("appId", trans("meeting.appid")), new NameConfig("localUser", trans("meeting.host")), new NameConfig("participants", trans("meeting.participants")), - new NameConfig("meetingActive", trans("meeting.meetingName")), + new NameConfig("meetingActive", trans("meeting.meetingActive")), new NameConfig("meetingName", trans("meeting.meetingName")), - new NameConfig("messages", trans("meeting.meetingName")), + new NameConfig("localUserID", trans("meeting.localUserID")), + new NameConfig("messages", trans("meeting.messages")), + new NameConfig("rtmToken", trans("meeting.rtmToken")), + new NameConfig("rtcToken", trans("meeting.rtcToken")), ]); diff --git a/client/packages/lowcoder/src/comps/comps/meetingComp/videoMeetingStreamComp.tsx b/client/packages/lowcoder/src/comps/comps/meetingComp/videoMeetingStreamComp.tsx index 2218ba0c3..5fbc372b7 100644 --- a/client/packages/lowcoder/src/comps/comps/meetingComp/videoMeetingStreamComp.tsx +++ b/client/packages/lowcoder/src/comps/comps/meetingComp/videoMeetingStreamComp.tsx @@ -151,10 +151,7 @@ export const meetingStreamChildren = { style: ButtonStyleControl, viewRef: RefControl, userId: stringExposingStateControl(""), - profileImageUrl: withDefault( - StringStateControl, - "https://via.placeholder.com/120" - ), + profileImageUrl: withDefault(StringStateControl, "https://api.dicebear.com/7.x/fun-emoji/svg?seed=Peanut&radius=50&backgroundColor=transparent&randomizeIds=true&eyes=wink,sleepClose"), noVideoText: stringExposingStateControl("No Video"), }; diff --git a/client/packages/lowcoder/src/i18n/locales/en.ts b/client/packages/lowcoder/src/i18n/locales/en.ts index 717764bb4..40138fb17 100644 --- a/client/packages/lowcoder/src/i18n/locales/en.ts +++ b/client/packages/lowcoder/src/i18n/locales/en.ts @@ -1442,6 +1442,7 @@ export const en = { height: "Drawer height", }, meeting: { + logLevel: "Agora SDK Log Level", placement: "Meeting placement", meeting: "Meeting Settings", cameraView: "Camera View", @@ -1455,18 +1456,21 @@ export const en = { videoOn: "Video On", size: "Size", top: "Top", - host: "Host", - participants: "Participants", - shareScreen: "Share Screen", - appid: "Application Id", - serverurl: "Token Server url", + host: "Host of the Meetingroom", + participants: "Participants of the Meetingroom", + shareScreen: "Local Screenshare", + appid: "Agora Application Id", meetingName: "Meeting Name", + localUserID: "Host User Id", + userName: "Host User Name", + rtmToken : "Agora RTM Token", + rtcToken : "Agora RTC Token", videoCompText: "No video Text", profileImageUrl: "Profile Image Url", right: "Right", bottom: "Bottom", - videoId: "Video Id", - audioStatus: "audio status", + videoId: "Video Stream Id", + audioStatus: "Audio status", left: "Left", widthTooltip: "Number or percentage, e.g. 520, 60%", heightTooltip: "Number, e.g. 378", @@ -1476,11 +1480,10 @@ export const en = { height: "Drawer height", actionBtnDesc: "Action Button", broadCast: "BroadCast Messages", - certifiCateKey: "certifiCate Key", - title: "Meeting title", + title: "Meeting Title", meetingCompName: "Meeting Controller", videoCompName: "Video Stream", - videoSharingCompName: "Video Sharing", + videoSharingCompName: "Screen Sharing", meetingControlCompName: "Controls Buttons", meetingCompDesc: "Meeting component", meetingCompControls: "Meeting control", @@ -1488,6 +1491,8 @@ export const en = { iconSize: "Icon Size", userId: "userId", roomId: "roomId", + meetingActive : "Ongoing Meeting", + messages : "Broadcasted Messages", }, settings: { title: "Settings",