From 9facd8fbf3621df573f0e56e54da0612482c3c62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Molakvo=C3=A6=20=28skjnldsv=29?= Date: Tue, 27 Apr 2021 19:38:41 +0200 Subject: Refactor circle actions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: John Molakvoæ (skjnldsv) --- src/mixins/CircleActionsMixin.js | 152 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 src/mixins/CircleActionsMixin.js (limited to 'src/mixins/CircleActionsMixin.js') diff --git a/src/mixins/CircleActionsMixin.js b/src/mixins/CircleActionsMixin.js new file mode 100644 index 00000000..a11cc1c0 --- /dev/null +++ b/src/mixins/CircleActionsMixin.js @@ -0,0 +1,152 @@ +/** + * @copyright Copyright (c) 2021 John Molakvoæ + * + * @author John Molakvoæ + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ +import { emit } from '@nextcloud/event-bus' +import { showError } from '@nextcloud/dialogs' + +import { joinCircle } from '../services/circles.ts' +import Circle from '../models/circle.ts' +import CopyToClipboardMixin from './CopyToClipboardMixin' + +export default { + + props: { + circle: { + type: Circle, + required: true, + }, + }, + + mixins: [CopyToClipboardMixin], + + data() { + return { + loadingAction: false, + } + }, + + computed: { + copyButtonText() { + if (this.copied) { + return this.copySuccess + ? t('contacts', 'Copied') + : t('contacts', 'Could not copy') + } + return t('contacts', 'Copy link') + }, + + circleUrl() { + const route = this.$router.resolve(this.circle.router) + return window.location.origin + route.href + }, + + joinButtonTitle() { + if (this.circle.requireJoinAccept) { + return t('contacts', 'Request to join') + } + return t('contacts', 'Join circle') + }, + }, + + methods: { + confirmLeaveCircle() { + OC.dialogs.confirmDestructive( + t('contacts', 'You are about to leave {circle}.\n Are you sure ?', { + circle: this.circle.displayName, + }), + t('contacts', 'Please confirm circle leave'), + OC.dialogs.YES_NO_BUTTONS, + this.leaveCircle, + true + ) + }, + async leaveCircle(confirm) { + if (!confirm) { + console.debug('Circle leave cancelled') + return + } + + this.loadingAction = true + const member = this.circle.initiator + + try { + await this.$store.dispatch('deleteMemberFromCircle', { + member, + leave: true, + }) + } catch (error) { + console.error('Could not leave the circle', member, error) + showError(t('contacts', 'Could not leave the circle {displayName}', this.circle)) + } finally { + this.loadingAction = false + } + + }, + + async joinCircle() { + this.loadingAction = true + try { + await joinCircle(this.circle.id) + } catch (error) { + showError(t('contacts', 'Unable to join the circle')) + } finally { + this.loadingAction = false + } + + }, + + confirmDeleteCircle() { + OC.dialogs.confirmDestructive( + t('contacts', 'You are about to delete {circle}.\n Are you sure ?', { + circle: this.circle.displayName, + }), + t('contacts', 'Please confirm circle deletion'), + OC.dialogs.YES_NO_BUTTONS, + this.deleteCircle, + true + ) + }, + async deleteCircle(confirm) { + if (!confirm) { + console.debug('Circle deletion cancelled') + return + } + + this.loadingAction = true + + try { + this.$store.dispatch('deleteCircle', this.circle.id) + } catch (error) { + showError(t('contacts', 'Unable to delete the circle')) + } finally { + this.loadingAction = false + } + }, + + /** + * Trigger the entity picker view + */ + async addMemberToCircle() { + await this.$router.push(this.circle.router) + emit('contacts:circles:append', this.circle.id) + }, + }, +} -- cgit v1.2.3