diff --git a/src/components/MembersList.vue b/src/components/MembersList.vue index f39676ed..e26613bf 100644 --- a/src/components/MembersList.vue +++ b/src/components/MembersList.vue @@ -66,16 +66,6 @@ Refresh ({{ countdownTimer }}s) - -
@@ -272,6 +252,9 @@ export default class MembersList extends Vue { autoRefreshInterval: NodeJS.Timeout | null = null; lastRefreshTime = 0; + // Track previous visibility members to detect changes + previousVisibilityMembers: string[] = []; + /** * Get the unnamed member constant */ @@ -296,12 +279,18 @@ export default class MembersList extends Vue { // Start auto-refresh this.startAutoRefresh(); + + // Check if we should show the visibility dialog on initial load + this.checkAndShowVisibilityDialog(); } async refreshData() { // Force refresh both contacts and members await this.loadContacts(); await this.fetchMembers(); + + // Check if we should show the visibility dialog after refresh + this.checkAndShowVisibilityDialog(); } async fetchMembers() { @@ -456,6 +445,55 @@ export default class MembersList extends Vue { })); } + /** + * Check if we should show the visibility dialog + * Returns true if there are members for visibility and either: + * - This is the first time (no previous members tracked), OR + * - New members have been added since last check (not removed) + */ + shouldShowVisibilityDialog(): boolean { + const currentMembers = this.getMembersForVisibility(); + + if (currentMembers.length === 0) { + return false; + } + + // If no previous members tracked, show dialog + if (this.previousVisibilityMembers.length === 0) { + return true; + } + + // Check if new members have been added (not just any change) + const currentMemberIds = currentMembers.map((m) => m.did); + const previousMemberIds = this.previousVisibilityMembers; + + // Find new members (members in current but not in previous) + const newMembers = currentMemberIds.filter( + (id) => !previousMemberIds.includes(id), + ); + + // Only show dialog if there are new members added + return newMembers.length > 0; + } + + /** + * Update the tracking of previous visibility members + */ + updatePreviousVisibilityMembers() { + const currentMembers = this.getMembersForVisibility(); + this.previousVisibilityMembers = currentMembers.map((m) => m.did); + } + + /** + * Show the visibility dialog if conditions are met + */ + checkAndShowVisibilityDialog() { + if (this.shouldShowVisibilityDialog()) { + this.showSetBulkVisibilityDialog(); + } + this.updatePreviousVisibilityMembers(); + } + checkWhetherContactBeforeAdmitting(decrMember: DecryptedMember) { const contact = this.getContactFor(decrMember.did); if (!decrMember.member.admitted && !contact) { @@ -616,7 +654,7 @@ export default class MembersList extends Vue { if (timeSinceLastRefresh >= 10) { // Time to refresh - this.fetchMembers(); + this.refreshData(); this.lastRefreshTime = now; this.countdownTimer = 10; } else { @@ -644,8 +682,13 @@ export default class MembersList extends Vue { } // Trigger immediate refresh and restart timer - this.fetchMembers(); + this.refreshData(); this.startAutoRefresh(); + + // Always show dialog on manual refresh if there are members for visibility + if (this.getMembersForVisibility().length > 0) { + this.showSetBulkVisibilityDialog(); + } } // Set Visibility Dialog methods