bigbluebutton-strapi
Version:
Integrate online classes into Strapi CMS via BigBlueButton open-source video conferencing. This free plugin also provides API end-points to easily setup start and join buttons for web conferencing into any frontend app.
149 lines (137 loc) • 4.76 kB
JavaScript
/* eslint-disable no-unused-expressions */
import React, { useState, useEffect } from 'react';
import { useParams } from 'react-router-dom';
import { Box } from '@strapi/design-system/Box';
import { Typography } from '@strapi/design-system/Typography';
import { Grid, GridItem } from '@strapi/design-system/Grid';
import { TextInput } from '@strapi/design-system/TextInput';
import { Button } from '@strapi/design-system/Button';
import { Divider } from '@strapi/design-system/Divider';
import { Link } from '@strapi/design-system/Link';
import ExternalLink from '@strapi/icons/ExternalLink';
import ArrowLeft from '@strapi/icons/ArrowLeft';
import { getClassByMeetingId, startBBB } from '../../utils/apiCalls';
const Join = () => {
const { userRole, meetingId } = useParams();
const [name, setName] = useState('');
const [accessCode, setAccessCode] = useState('');
const [nameError, setNameError] = useState('');
const [codeError, setCodeError] = useState('');
const [classDetail, setClassDetail] = useState({});
const [isLoading, setIsLoading] = useState(false);
useEffect(() => {
(async () => {
const response = await getClassByMeetingId(meetingId);
if (response.status === 200) {
setClassDetail(response.data);
userRole === 'moderator' ? setAccessCode(response.data.moderatorAccessCode) : '';
}
})();
}, [meetingId, userRole]);
const handleNameChange = e => {
setName(e.target.value);
setNameError('');
};
const handleAccessCodeChange = e => {
setAccessCode(e.target.value);
setCodeError('');
};
const handleJoinClass = async classParams => {
setIsLoading(true);
if (!name && !accessCode) {
setNameError('Name is required');
setCodeError('Access code is required');
setIsLoading(false);
} else if (!name) {
setNameError('Name is required');
setIsLoading(false);
} else if (!accessCode) {
setCodeError('Access code is required');
setIsLoading(false);
} else if (
accessCode !== classParams.moderatorAccessCode &&
accessCode !== classParams.viewerAccessCode
) {
setCodeError('Please enter valid access code');
setIsLoading(false);
} else {
const res = await startBBB(classParams.meetingId, name);
if (res.status === 200) {
window.open(res.data.joinURL, '_blank');
setIsLoading(false);
}
}
};
return (
<>
<Box paddingLeft={7} paddingTop={6}>
<Link to="/plugins/bigbluebutton-strapi" startIcon={<ArrowLeft />}>
Back
</Link>
</Box>
<Box paddingTop={4} paddingLeft={7}>
<Typography variant="alpha">Join {classDetail.className} Class</Typography>
</Box>
<Box padding={3}>
<Divider />
</Box>
<Box paddingTop={6} paddingLeft={7} paddingRight={7}>
<Grid>
<GridItem col={12}>
<Box
shadow="tableShadow"
background="neutral0"
paddingTop={6}
paddingBottom={6}
paddingLeft={7}
paddingRight={7}
>
<Grid gap={5} justifyContent="center" alignItems="center">
<GridItem col={5}>
<Box>
<TextInput
placeholder="Enter your name"
aria-label="name"
name="name"
value={name}
error={nameError || ''}
onChange={handleNameChange}
data-testid="moderator-name"
/>
</Box>
</GridItem>
<GridItem col={5}>
<Box>
<TextInput
placeholder="Enter access Code"
type="number"
aria-label="accessCode"
name="accessCode"
value={accessCode}
error={codeError || ''}
onChange={handleAccessCodeChange}
/>
</Box>
</GridItem>
<GridItem col={2}>
<Box>
<Button
variant="default"
loading={isLoading}
startIcon={<ExternalLink />}
onClick={() => handleJoinClass(classDetail)}
data-testid="join-class"
>
Join Class
</Button>
</Box>
</GridItem>
</Grid>
</Box>
</GridItem>
</Grid>
</Box>
</>
);
};
export default Join;