From 9073c09c62686cd4d5b674adcab347afde71b890 Mon Sep 17 00:00:00 2001
From: Julius Härtl <jus@bitgrid.net>
Date: Fri, 12 Feb 2021 09:57:19 +0100
Subject: Avoid creating two share links when password is enforced
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Julius Härtl <jus@bitgrid.net>
Signed-off-by: npmbuildbot-nextcloud[bot] <npmbuildbot-nextcloud[bot]@users.noreply.github.com>
---
 .../src/components/SharingEntryLink.vue            | 27 +++++++++++++++++-----
 1 file changed, 21 insertions(+), 6 deletions(-)

(limited to 'apps/files_sharing/src/components/SharingEntryLink.vue')

diff --git a/apps/files_sharing/src/components/SharingEntryLink.vue b/apps/files_sharing/src/components/SharingEntryLink.vue
index 522e8e23355..44c3c986e17 100644
--- a/apps/files_sharing/src/components/SharingEntryLink.vue
+++ b/apps/files_sharing/src/components/SharingEntryLink.vue
@@ -44,7 +44,7 @@
 		</Actions>
 
 		<!-- pending actions -->
-		<Actions v-if="!loading && (pendingPassword || pendingExpirationDate)"
+		<Actions v-if="!pending && (pendingPassword || pendingExpirationDate)"
 			class="sharing-entry__actions"
 			menu-align="right"
 			:open.sync="open"
@@ -308,7 +308,7 @@
 			<!-- Create new share -->
 			<ActionButton v-else-if="canReshare"
 				class="new-share-link"
-				icon="icon-add"
+				:icon="loading ? 'icon-loading-small' : 'icon-add'"
 				@click.prevent.stop="onNewLinkShare">
 				{{ t('files_sharing', 'Create a new share link') }}
 			</ActionButton>
@@ -373,6 +373,9 @@ export default {
 			copySuccess: true,
 			copied: false,
 
+			// Are we waiting for password/expiration date
+			pending: false,
+
 			publicUploadRWValue: OC.PERMISSION_UPDATE | OC.PERMISSION_CREATE | OC.PERMISSION_READ | OC.PERMISSION_DELETE,
 			publicUploadRValue: OC.PERMISSION_READ,
 			publicUploadWValue: OC.PERMISSION_CREATE,
@@ -618,6 +621,11 @@ export default {
 		 * Create a new share link and append it to the list
 		 */
 		async onNewLinkShare() {
+			// do not run again if already loading
+			if (this.loading) {
+				return
+			}
+
 			const shareDefaults = {
 				share_type: OC.Share.SHARE_TYPE_LINK,
 			}
@@ -630,11 +638,13 @@ export default {
 				shareDefaults.password = await this.generatePassword()
 			}
 
-			// do not push yet if we need a password or an expiration date
+			// do not push yet if we need a password or an expiration date: show pending menu
 			if (this.config.enforcePasswordForPublicLink || this.config.isDefaultExpireDateEnforced) {
-				this.loading = true
+				this.pending = true
+
 				// if a share already exists, pushing it
 				if (this.share && !this.share.id) {
+					// if the share is valid, create it on the server
 					if (this.checkShare(this.share)) {
 						await this.pushNewLinkShare(this.share, true)
 						return true
@@ -660,10 +670,10 @@ export default {
 				// open the menu on the
 				// freshly created share component
 				this.open = false
-				this.loading = false
+				this.pending = false
 				component.open = true
 
-			// Nothing enforced, creating share directly
+			// Nothing is enforced, creating share directly
 			} else {
 				const share = new Share(shareDefaults)
 				await this.pushNewLinkShare(share)
@@ -680,6 +690,11 @@ export default {
 		 */
 		async pushNewLinkShare(share, update) {
 			try {
+				// do nothing if we're already pending creation
+				if (this.loading) {
+					return true
+				}
+
 				this.loading = true
 				this.errors = {}
 
-- 
cgit v1.2.3

