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 @@
+
+
+
+ {{ message }}
+
+
+ {{ $t('buttons.exit') }}
+
+
+
+
+
+
+
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);
+ });
+ }
}
}
}