From b37051f25d7349cb75a2d89624a2153a33c31b69 Mon Sep 17 00:00:00 2001 From: Jose Olarte III Date: Wed, 29 Oct 2025 18:21:32 +0800 Subject: [PATCH] refactor: unify member dialogs into reusable BulkMembersDialog component - Merge AdmitPendingMembersDialog and SetBulkVisibilityDialog into single BulkMembersDialog - Add dynamic props for dialog type, title, description, button text, and empty state - Support both 'admit' and 'visibility' modes with conditional behavior - Rename setVisibilityForSelectedMembers to addContactWithVisibility for clarity - Update success counting to track contacts added vs visibility set - Improve error messages to reflect primary action of adding contacts - Update MembersList to use unified dialog with role-based configuration - Remove unused libsUtil import from MembersList - Update comments and method names to reflect unified functionality - Rename closeMemberSelectionDialogCallback to closeBulkMembersDialogCallback This consolidation eliminates ~200 lines of duplicate code while maintaining all existing functionality and improving maintainability through a single source of truth for bulk member operations. --- ...embersDialog.vue => BulkMembersDialog.vue} | 100 +++++- src/components/MembersList.vue | 58 ++-- src/components/SetBulkVisibilityDialog.vue | 324 ------------------ 3 files changed, 114 insertions(+), 368 deletions(-) rename src/components/{AdmitPendingMembersDialog.vue => BulkMembersDialog.vue} (78%) delete mode 100644 src/components/SetBulkVisibilityDialog.vue diff --git a/src/components/AdmitPendingMembersDialog.vue b/src/components/BulkMembersDialog.vue similarity index 78% rename from src/components/AdmitPendingMembersDialog.vue rename to src/components/BulkMembersDialog.vue index 8b6a6662..d93a3069 100644 --- a/src/components/AdmitPendingMembersDialog.vue +++ b/src/components/BulkMembersDialog.vue @@ -3,18 +3,18 @@

- Admit Pending Members + {{ title }}

- Would you like to admit these members to the meeting and add them to - your contacts? + {{ description }}

- +
+ - + + +
@@ -31,14 +31,15 @@
- No pending members to admit + {{ emptyStateText }}
@@ -97,20 +99,23 @@
+
+ +
- - + - -
@@ -235,11 +238,9 @@ import { import { decryptMessage } from "@/libs/crypto"; import { Contact } from "@/db/tables/contacts"; import { MemberData } from "@/interfaces"; -import * as libsUtil from "@/libs/util"; import { PlatformServiceMixin } from "@/utils/PlatformServiceMixin"; import { createNotifyHelpers, TIMEOUTS } from "@/utils/notify"; -import AdmitPendingMembersDialog from "./AdmitPendingMembersDialog.vue"; -import SetBulkVisibilityDialog from "./SetBulkVisibilityDialog.vue"; +import BulkMembersDialog from "./BulkMembersDialog.vue"; interface Member { admitted: boolean; @@ -256,8 +257,7 @@ interface DecryptedMember { @Component({ components: { - AdmitPendingMembersDialog, - SetBulkVisibilityDialog, + BulkMembersDialog, }, mixins: [PlatformServiceMixin], }) @@ -265,7 +265,6 @@ export default class MembersList extends Vue { $notify!: (notification: NotificationIface, timeout?: number) => void; notify!: ReturnType; - libsUtil = libsUtil; @Prop({ required: true }) password!: string; @Prop({ default: false }) showOrganizerTools!: boolean; @@ -532,7 +531,8 @@ export default class MembersList extends Vue { } /** - * Show the admit pending members dialog if conditions are met + * Show the bulk members dialog if conditions are met + * (admit pending members for organizers, add to contacts for non-organizers) */ async refreshData(bypassPromptIfAllWereIgnored = true) { // Force refresh both contacts and members @@ -547,7 +547,7 @@ export default class MembersList extends Vue { return; } if (bypassPromptIfAllWereIgnored) { - // only show if there are pending members that have not been ignored + // only show if there are members that have not been ignored const pendingMembersNotIgnored = pendingMembers.filter( (member) => !this.previousMemberDidsIgnored.includes(member.did), ); @@ -558,19 +558,11 @@ export default class MembersList extends Vue { } } this.stopAutoRefresh(); - if (this.isOrganizer) { - (this.$refs.admitPendingMembersDialog as AdmitPendingMembersDialog).open( - pendingMembers, - ); - } else { - (this.$refs.setBulkVisibilityDialog as SetBulkVisibilityDialog).open( - pendingMembers, - ); - } + (this.$refs.bulkMembersDialog as BulkMembersDialog).open(pendingMembers); } - // Admit Pending Members Dialog methods - async closeMemberSelectionDialogCallback( + // Bulk Members Dialog methods + async closeBulkMembersDialogCallback( result: { notSelectedMemberDids: string[] } | undefined, ) { this.previousMemberDidsIgnored = result?.notSelectedMemberDids || []; diff --git a/src/components/SetBulkVisibilityDialog.vue b/src/components/SetBulkVisibilityDialog.vue deleted file mode 100644 index 2effd010..00000000 --- a/src/components/SetBulkVisibilityDialog.vue +++ /dev/null @@ -1,324 +0,0 @@ - - -