From 1b070aaa8a0e59a6550fe6b129266b7723d07708 Mon Sep 17 00:00:00 2001 From: Hans-Peter Herzog Date: Fri, 17 May 2019 11:25:34 +0200 Subject: [PATCH] TT#44291 Conferencing: As a Customer, I want to leave the conference gracefully Change-Id: Ib8ccc18c910a86f06666f7dd94f67ead23a4031c --- src/components/CscConfirmationDialog.vue | 66 ++++++++++++++++++++++++ src/components/layouts/Conference.vue | 24 +++++++-- src/locales/en.json | 4 +- src/plugins/conference.js | 4 ++ src/store/conference.js | 33 ++++++++++++ 5 files changed, 127 insertions(+), 4 deletions(-) create mode 100644 src/components/CscConfirmationDialog.vue diff --git a/src/components/CscConfirmationDialog.vue b/src/components/CscConfirmationDialog.vue new file mode 100644 index 00000000..dc8246d7 --- /dev/null +++ b/src/components/CscConfirmationDialog.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/src/components/layouts/Conference.vue b/src/components/layouts/Conference.vue index a283998c..cd33b376 100644 --- a/src/components/layouts/Conference.vue +++ b/src/components/layouts/Conference.vue @@ -83,8 +83,13 @@ :disable="!hasConferenceId || isJoining" /> - + @@ -100,6 +105,7 @@ QLayout, QBtn } from 'quasar-framework' + import CscConfirmDialog from "../CscConfirmationDialog"; export default { data () { return {} @@ -108,6 +114,7 @@ this.$store.dispatch('user/initUser'); }, components: { + CscConfirmDialog, CscSpinner, CscMedia, CscConferenceJoin, @@ -156,8 +163,14 @@ }, methods: { close() { - this.$router.push({path: '/user/home'}); - this.$store.commit('conference/disposeLocalMedia'); + if(!this.isJoined) { + this.$router.push({path: '/user/home'}); + this.$store.commit('conference/disposeLocalMedia'); + } + else { + this.$refs.confirmDialog.open(); + } + }, toggleMicrophone() { if(this.hasConferenceId) { @@ -178,6 +191,11 @@ if(this.hasConferenceId) { this.$store.dispatch('conference/join', conferenceId); } + }, + leave() { + if(this.isJoined) { + this.$store.dispatch('conference/leave'); + } } }, watch: { diff --git a/src/locales/en.json b/src/locales/en.json index c3a3bd62..5a11e1d3 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -28,7 +28,9 @@ "resetDefaults": "Reset to defaults", "install": "Install", "addNew": "Add new", - "removeFile": "Remove file" + "removeFile": "Remove file", + "confirm": "Confirm", + "exit": "Exit" }, "form": { "destinationLabel": "Destination" diff --git a/src/plugins/conference.js b/src/plugins/conference.js index 5c99d206..2cf7f506 100644 --- a/src/plugins/conference.js +++ b/src/plugins/conference.js @@ -66,6 +66,10 @@ export class ConferencePlugin { }); } + leaveConference() { + return this.getNetwork().leaveConference(); + } + onLeft(listener) { this.events.on('left', listener); return this; diff --git a/src/store/conference.js b/src/store/conference.js index c0070c88..4c3d748f 100644 --- a/src/store/conference.js +++ b/src/store/conference.js @@ -23,6 +23,8 @@ export default { localMediaError: null, joinState: RequestState.initiated, joinError: null, + leaveState: RequestState.initiated, + leaveError: null, participants: [] }, getters: { @@ -44,6 +46,12 @@ export default { isJoining(state) { return state.joinState === RequestState.requesting; }, + isLeft(state) { + return state.leaveState === RequestState.succeeded; + }, + isLeaving(state) { + return state.leaveState === RequestState.requesting; + }, isConferencingEnabled(state) { return state.conferencingEnabled; }, @@ -130,6 +138,20 @@ export default { state.joinState = RequestState.failed; state.joinError = error; }, + leaveRequesting(state) { + state.leaveState = RequestState.requesting; + state.leaveError = null; + }, + leaveSucceeded(state) { + state.leaveState = RequestState.succeeded; + state.leaveError = null; + state.joinState = RequestState.initiated; + state.joinError = null; + }, + leaveFailed(state, error) { + state.leaveState = RequestState.failed; + state.leaveError = error; + }, participantJoined(state, participant) { state.participants.push(participant.getId()); @@ -313,6 +335,17 @@ export default { context.commit('joinFailed', err.message); }); } + }, + leave(context) { + if(context.getters.isJoined) { + context.commit('leaveRequesting'); + Vue.$conference.leaveConference().then(()=>{ + context.commit('leaveSucceeded'); + context.commit('disposeLocalMedia'); + }).catch((err)=>{ + context.commit('leaveFailed', err.message); + }); + } } } }