You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ngcp-csc-ui/src/components/pages/Conference/CscConferenceJoin.vue

180 lines
5.5 KiB

<template>
<div
class="row justify-center items-center csc-conf-full-height"
>
<div
id="csc-conf-join-content"
:class="contentClasses"
>
<q-alert
v-if="!hasRtcEngineCapabilityEnabled"
class="csc-inline-alert csc-conf-alert"
appear
icon="info"
color="info"
>
{{ $t('call.rtcEngineNotEnabledConferencing') }}
</q-alert>
<p
id="csc-conf-join-text"
>{{ $t('conferencing.joinText') }}</p>
<q-input
ref="conferenceName"
id="csc-conf-link-input"
dark
:value="conferenceIdInput"
:placeholder="$t('conferencing.idPlaceholder')"
align="left"
@change="conferenceIdChanged"
:disable="isJoining || !hasRtcEngineCapabilityEnabled"
>
<q-btn
:disable="!hasConferenceId || isJoining || !hasRtcEngineCapabilityEnabled"
:color="shareButtonColor"
flat
icon="link"
@click="showShareDialog"
>{{ $t('conferencing.shareButtonLabel') }}</q-btn>
</q-input>
<q-btn
class="csc-button"
:color="joinButtonColor"
:disable="!hasConferenceId || isJoining || !hasRtcEngineCapabilityEnableds"
icon="call"
round
@click="join"
/>
<csc-object-spinner
:loading="isJoining"
/>
</div>
<csc-share-conference-dialog
ref="shareDialog"
:conference-url="conferenceUrl"
/>
</div>
</template>
<script>
import CscMedia from '../../CscMedia'
import {
randInRange
} from '../../../helpers/math-helper'
import {
QBtn,
QInput,
QAlert
} from 'quasar-framework'
import CscShareConferenceDialog from "./CscShareConferenceDialog";
import CscObjectSpinner from "../../CscObjectSpinner";
export default {
name: 'csc-conference-join',
data () {
return {
conferenceIdInput: this.conferenceId
}
},
props: [
'conferenceId',
'hasConferenceId',
'conferenceUrl',
'localMediaStream',
'isMicrophoneEnabled',
'isCameraEnabled',
'isScreenEnabled',
'isJoining',
'isJoined',
'hasRtcEngineCapabilityEnabled'
],
components: {
CscObjectSpinner,
CscShareConferenceDialog,
QBtn,
QInput,
CscMedia,
QAlert
},
mounted() {
if(!this.conferenceId){
this.conferenceIdChanged(this.createConferenceId())
}
},
computed: {
contentClasses() {
let classes = ['col', 'col-md-4', 'text-center'];
if(this.isCameraEnabled) {
classes.push('csc-camera-background');
}
else if (this.isScreenEnabled) {
classes.push('csc-screen-background');
}
return classes;
},
joinButtonColor() {
return 'primary';
},
shareButtonColor() {
if(this.hasConferenceId) {
return 'primary';
}
else {
return 'grey';
}
},
isMediaEnabled() {
return this.isCameraEnabled || this.isScreenEnabled || this.isMicrophoneEnabled;
}
},
watch: {
conferenceId(value) {
this.conferenceIdInput = value;
}
},
methods:{
join() {
this.$emit('join', this.conferenceId);
},
conferenceIdChanged(value) {
try {
this.$router.push({
path: '/conference/' + value
});
this.conferenceIdInput = value;
}
catch(err) {
this.conferenceIdInput = this.conferenceId;
}
},
showShareDialog() {
this.$refs.shareDialog.open();
},
createConferenceId() {
const prefixes = ['conf', 'room', 'space'];
const randPrefixIndex = randInRange(0, prefixes.length -1);
const randSuffix = randInRange(100000, 999999);
return prefixes[randPrefixIndex] + randSuffix;
}
}
}
</script>
<style lang="stylus" rel="stylesheet/stylus">
@import '../../../themes/app.common.styl'
.csc-conf-alert
margin-bottom $flex-gutter-md
#csc-conf-link-input
margin-bottom $flex-gutter-md
#csc-conf-join-text
margin-bottom $flex-gutter-md
font-weight bold
font-size 1rem
#csc-conf-join-content
padding $flex-gutter-md
position relative
z-index 2
#csc-conf-join-content.csc-camera-background
background-color alpha($main-menu-background, 0.5)
#csc-conf-join-content.csc-screen-background
background-color alpha($main-menu-background, 0.5)
</style>