@ -179,21 +179,18 @@
<!-- Admit Pending Members Dialog Component -- >
< AdmitPendingMembersDialog
: visible = "showAdmitPendingDialog"
: pending - members - data = "pendingMembersData"
ref = "admitPendingMembersDialog"
: active - did = "activeDid"
: api - server = "apiServer"
: pending - members - data = "pendingMembersData"
@ close = "closeAdmitPendingDialog"
@ success = "onAdmitPendingSuccess"
/ >
<!-- Set Visibility Dialog Component -- >
< SetBulkVisibilityDialog
: visible = "showSetVisibilityDialog"
: members - data = "visibilityDialogMembers"
: visible = "visibleBulkVisibilityDialog"
: active - did = "activeDid"
: api - server = "apiServer"
@ close = "closeSetVisibilityDialog"
: members - data = "pendingMembersData"
@ close = "closeSetBulkVisibilityDialog"
/ >
< / template >
@ -217,8 +214,8 @@ import {
NOTIFY_CONTINUE_WITHOUT_ADDING ,
} from "@/constants/notifications" ;
import { SOMEONE_UNNAMED } from "@/constants/entities" ;
import SetBulkVisibilityDialog from "./SetBulkVisibilityDialog.vue" ;
import AdmitPendingMembersDialog from "./AdmitPendingMembersDialog.vue" ;
import SetBulkVisibilityDialog from "./SetBulkVisibilityDialog.vue" ;
interface Member {
admitted : boolean ;
@ -235,8 +232,8 @@ interface DecryptedMember {
@ Component ( {
components : {
SetBulkVisibilityDialog ,
AdmitPendingMembersDialog ,
SetBulkVisibilityDialog ,
} ,
mixins : [ PlatformServiceMixin ] ,
} )
@ -255,6 +252,7 @@ export default class MembersList extends Vue {
return message ;
}
contacts : Array < Contact > = [ ] ;
decryptedMembers : DecryptedMember [ ] = [ ] ;
firstName = "" ;
isLoading = true ;
@ -266,32 +264,20 @@ export default class MembersList extends Vue {
apiServer = "" ;
/ / A d m i t P e n d i n g M e m b e r s D i a l o g s t a t e
showAdmitPendingDialog = false ;
pendingMembersData : Array < {
did : string ;
name : string ;
isContact : boolean ;
member : { memberId : string } ;
} > = [ ] ;
admitDialogDismissed = false ;
isManualRefresh = false ;
/ / S e t V i s i b i l i t y D i a l o g s t a t e
showSetVisibilityDialog = false ;
visibilityDialogMembers : Array < {
did : string ;
name : string ;
isContact : boolean ;
member : { memberId : string } ;
} > = [ ] ;
contacts : Array < Contact > = [ ] ;
visibleBulkVisibilityDialog = false ;
/ / A u t o - r e f r e s h f u n c t i o n a l i t y
countdownTimer = 10 ;
autoRefreshInterval : NodeJS . Timeout | null = null ;
/ / T r a c k p r e v i o u s v i s i b i l i t y m e m b e r s t o d e t e c t c h a n g e s
previousVisibilityMembers : string [ ] = [ ] ;
lastRefreshTime = 0 ;
previousMemberDidsIgnored : string [ ] = [ ] ;
/ * *
* Get the unnamed member constant
@ -312,33 +298,18 @@ export default class MembersList extends Vue {
this . apiServer = settings . apiServer || "" ;
this . firstName = settings . firstName || "" ;
await this . fetchMembers ( ) ;
await this . loadContacts ( ) ;
/ / S t a r t a u t o - r e f r e s h
this . startAutoRefresh ( ) ;
/ / C h e c k i f w e s h o u l d s h o w t h e a d m i t p e n d i n g m e m b e r s d i a l o g f i r s t
this . checkAndShowAdmitPendingDialog ( ) ;
/ / I f n o p e n d i n g m e m b e r s , c h e c k f o r v i s i b i l i t y d i a l o g
if ( ! this . showAdmitPendingDialog ) {
this . checkAndShowVisibilityDialog ( ) ;
}
this . refreshData ( ) ;
}
async refreshData ( ) {
async refreshData ( showPendingEvenIfAllWereIgnored = false ) {
/ / F o r c e r e f r e s h b o t h c o n t a c t s a n d m e m b e r s
await this . loadContacts ( ) ;
this . contacts = await this . $getAllContacts ( )
await this . fetchMembers ( ) ;
/ / C h e c k i f w e s h o u l d s h o w t h e a d m i t p e n d i n g m e m b e r s d i a l o g f i r s t
this . checkAndShowAdmitPendingDialog ( ) ;
/ / I f n o p e n d i n g m e m b e r s , c h e c k f o r v i s i b i l i t y d i a l o g
if ( ! this . showAdmitPendingDialog ) {
this . checkAndShowVisibilityDialog ( ) ;
}
this . checkAndShowAdmitPendingDialog ( showPendingEvenIfAllWereIgnored ) ;
}
async fetchMembers ( ) {
@ -487,15 +458,11 @@ export default class MembersList extends Vue {
}
}
async loadContacts ( ) {
this . contacts = await this . $getAllContacts ( ) ;
}
getContactFor ( did : string ) : Contact | undefined {
return this . contacts . find ( ( contact ) => contact . did === did ) ;
}
getPendingMembers ( ) {
getPendingMembers ( ) : { did : string ; name : string ; isContact : boolean ; member : { memberId : string ; } ; } [ ] {
return this . decryptedMembers
. filter ( ( member ) => {
/ / E x c l u d e t h e c u r r e n t u s e r
@ -515,132 +482,64 @@ export default class MembersList extends Vue {
} ) ) ;
}
getMembersForVisibility ( ) {
const membersForVisibility = this . decryptedMembers
. filter ( ( member ) => {
/ / E x c l u d e t h e c u r r e n t u s e r
if ( member . did === this . activeDid ) {
return false ;
}
const contact = this . getContactFor ( member . did ) ;
/ / I n c l u d e m e m b e r s w h o :
/ / 1 . H a v e n ' t b e e n a d d e d a s c o n t a c t s y e t , O R
/ / 2 . A r e c o n t a c t s b u t d o n ' t h a v e v i s i b i l i t y s e t ( s e e s M e p r o p e r t y )
return ! contact || ! contact . seesMe ;
} )
getNonContactMembers ( ) : { did : string ; name : string ; isContact : boolean ; member : { memberId : string ; } ; } [ ] {
return this . decryptedMembers
. filter ( ( member ) => ! this . getContactFor ( member . did ) )
. map ( ( member ) => ( {
did : member . did ,
name : member . name ,
isContact : ! ! this . getContactFor ( member . did ) ,
isContact : false ,
member : {
memberId : member . member . memberId . toString ( ) ,
} ,
} ) ) ;
/ / D e d u p l i c a t e m e m b e r s b y D I D t o p r e v e n t d u p l i c a t e e n t r i e s
const uniqueMembers = membersForVisibility . filter (
( member , index , self ) =>
index === self . findIndex ( ( m ) => m . did === member . did ) ,
) ;
return uniqueMembers ;
}
/ * *
* 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 ) , OR
* - This is a manual refresh ( isManualRefresh flag is set )
* Show the admit pending members dialog if conditions are met
* /
shouldShowVisibilityDialog ( ) : boolean {
/ / O n l y s h o w f o r m e m b e r s w h o c a n s e e o t h e r m e m b e r s ( i . e . , t h e y a r e i n t h e d e c r y p t e d m e m b e r s l i s t )
const currentUserMember = this . decryptedMembers . find (
( member ) => member . did === this . activeDid ,
) ;
/ / I f t h e c u r r e n t u s e r i s n o t i n t h e d e c r y p t e d m e m b e r s l i s t , t h e y c a n ' t s e e a n y o n e
if ( ! currentUserMember ) {
return false ;
}
const currentMembers = this . getMembersForVisibility ( ) ;
if ( currentMembers . length === 0 ) {
return false ;
checkAndShowAdmitPendingDialog ( showPendingEvenIfAllWereIgnored = false ) {
const pendingMembers =
this . isOrganizer ? this . getPendingMembers ( ) : this . getNonContactMembers ( ) ;
if ( pendingMembers . length === 0 ) {
this . startAutoRefresh ( ) ;
return ;
}
/ / I f n o p r e v i o u s m e m b e r s t r a c k e d , s h o w d i a l o g
if ( this . previousVisibilityMembers . length === 0 ) {
return true ;
if ( ! showPendingEvenIfAllWereIgnored ) {
/ / o n l y s h o w i f t h e r e a r e p e n d i n g m e m b e r s t h a t h a v e n o t b e e n i g n o r e d
const pendingMembersNotIgnored =
pendingMembers . filter (
( member ) => ! this . previousMemberDidsIgnored . includes ( member . did )
) ;
if ( pendingMembersNotIgnored . length === 0 ) {
this . startAutoRefresh ( ) ;
/ / e v e r y o n e w a i t i n g h a s b e e n i g n o r e d
return ;
}
}
/ / I f t h i s i s a m a n u a l r e f r e s h , a l w a y s s h o w d i a l o g i f t h e r e a r e m e m b e r s
if ( this . isManualRefresh ) {
return true ;
this . stopAutoRefresh ( ) ;
this . pendingMembersData = pendingMembers ;
if ( this . isOrganizer ) {
( this . $refs . admitPendingMembersDialog as AdmitPendingMembersDialog ) . open ( ) ;
} else {
this . visibleBulkVisibilityDialog = true ;
}
/ / C h e c k i f n e w m e m b e r s h a v e b e e n a d d e d ( n o t j u s t a n y c h a n g e )
const currentMemberIds = currentMembers . map ( ( m ) => m . did ) ;
const previousMemberIds = this . previousVisibilityMembers ;
/ / F i n d n e w m e m b e r s ( m e m b e r s i n c u r r e n t b u t n o t i n p r e v i o u s )
const newMembers = currentMemberIds . filter (
( id ) => ! previousMemberIds . includes ( id ) ,
) ;
/ / O n l y s h o w d i a l o g i f t h e r e a r e n e w m e m b e r s a d d e d
return newMembers . length > 0 ;
}
/ * *
* Update the tracking of previous visibility members
* /
updatePreviousVisibilityMembers ( ) {
const currentMembers = this . getMembersForVisibility ( ) ;
this . previousVisibilityMembers = currentMembers . map ( ( m ) => m . did ) ;
}
/ * *
* Check if we should show the admit pending members dialog
* /
shouldShowAdmitPendingDialog ( ) : boolean {
/ / D o n ' t s h o w i f a l r e a d y d i s m i s s e d
if ( this . admitDialogDismissed ) {
return false ;
}
/ / O n l y s h o w f o r t h e o r g a n i z e r o f t h e m e e t i n g
if ( ! this . isOrganizer ) {
return false ;
}
/ / A d m i t P e n d i n g M e m b e r s D i a l o g m e t h o d s
async closeAdmitPendingDialog ( result : { notSelectedMemberDids : string [ ] } | undefined ) {
this . pendingMembersData = [ ] ;
this . previousMemberDidsIgnored = result ? . notSelectedMemberDids || [ ] ;
const pendingMembers = this . getPendingMembers ( ) ;
return pendingMembers . length > 0 ;
await this . refreshData ( ) ;
}
/ * *
* Show the admit pending members dialog if conditions are met
* /
checkAndShowAdmitPendingDialog ( ) {
if ( this . shouldShowAdmitPendingDialog ( ) ) {
this . showAdmitPendingDialogMethod ( ) ;
} else {
/ / E n s u r e d i a l o g s t a t e i s f a l s e w h e n n o p e n d i n g m e m b e r s
this . showAdmitPendingDialog = false ;
}
}
async closeSetBulkVisibilityDialog ( result : { notSelectedMemberDids : string [ ] } | undefined ) {
this . visibleBulkVisibilityDialog = false ;
this . pendingMembersData = [ ] ;
this . previousMemberDidsIgnored = result ? . notSelectedMemberDids || [ ] ;
/ * *
* Show the visibility dialog if conditions are met
* /
checkAndShowVisibilityDialog ( ) {
if ( this . shouldShowVisibilityDialog ( ) ) {
this . showSetBulkVisibilityDialog ( ) ;
}
this . updatePreviousVisibilityMembers ( ) ;
await this . refreshData ( ) ;
}
checkWhetherContactBeforeAdmitting ( decrMember : DecryptedMember ) {
@ -781,51 +680,19 @@ export default class MembersList extends Vue {
}
}
showAdmitPendingDialogMethod ( ) {
/ / F i l t e r m e m b e r s t o s h o w o n l y p e n d i n g ( n o n - a d m i t t e d ) m e m b e r s
const pendingMembers = this . getPendingMembers ( ) ;
/ / O n l y s h o w d i a l o g i f t h e r e a r e p e n d i n g m e m b e r s
if ( pendingMembers . length === 0 ) {
this . showAdmitPendingDialog = false ;
return ;
}
/ / P a u s e a u t o - r e f r e s h w h e n d i a l o g o p e n s
this . stopAutoRefresh ( ) ;
/ / O p e n t h e d i a l o g d i r e c t l y
this . pendingMembersData = pendingMembers ;
this . showAdmitPendingDialog = true ;
}
showSetBulkVisibilityDialog ( ) {
/ / F i l t e r m e m b e r s t o s h o w o n l y t h o s e w h o n e e d v i s i b i l i t y s e t
const membersForVisibility = this . getMembersForVisibility ( ) ;
/ / P a u s e a u t o - r e f r e s h w h e n d i a l o g o p e n s
this . stopAutoRefresh ( ) ;
/ / O p e n t h e d i a l o g d i r e c t l y
this . visibilityDialogMembers = membersForVisibility ;
this . showSetVisibilityDialog = true ;
/ / R e s e t m a n u a l r e f r e s h f l a g a f t e r d i a l o g i s s h o w n
this . isManualRefresh = false ;
}
startAutoRefresh ( ) {
le t lastRefreshTime = Date . now ( ) ;
this . lastRefreshTime = Date . now ( ) ;
this . countdownTimer = 10 ;
this . autoRefreshInterval = setInterval ( ( ) => {
const now = Date . now ( ) ;
const timeSinceLastRefresh = ( now - lastRefreshTime ) / 1000 ;
const timeSinceLastRefresh = ( now - this . lastRefreshTime ) / 1000 ;
if ( timeSinceLastRefresh >= 10 ) {
/ / T i m e t o r e f r e s h
this . refreshData ( ) ;
lastRefreshTime = now ;
this . lastRefreshTime = now ;
this . countdownTimer = 10 ;
} else {
/ / U p d a t e c o u n t d o w n
@ -851,68 +718,8 @@ export default class MembersList extends Vue {
this . autoRefreshInterval = null ;
}
/ / S e t m a n u a l r e f r e s h f l a g
this . isManualRefresh = true ;
/ / R e s e t t h e d i s m i s s e d f l a g o n m a n u a l r e f r e s h
this . admitDialogDismissed = false ;
/ / T r i g g e r i m m e d i a t e r e f r e s h
await this . refreshData ( ) ;
/ / O n l y s t a r t a u t o - r e f r e s h i f n o d i a l o g s a r e s h o w i n g
if ( ! this . showAdmitPendingDialog && ! this . showSetVisibilityDialog ) {
this . startAutoRefresh ( ) ;
}
}
/ / A d m i t P e n d i n g M e m b e r s D i a l o g m e t h o d s
async closeAdmitPendingDialog ( ) {
this . showAdmitPendingDialog = false ;
this . pendingMembersData = [ ] ;
this . admitDialogDismissed = true ;
/ / H a n d l e m a n u a l r e f r e s h f l o w
if ( this . isManualRefresh ) {
await this . handleManualRefreshFlow ( ) ;
this . isManualRefresh = false ;
} else {
/ / N o r m a l f l o w : r e f r e s h d a t a a n d r e s u m e a u t o - r e f r e s h
this . refreshData ( ) ;
this . startAutoRefresh ( ) ;
}
}
async handleManualRefreshFlow ( ) {
/ / R e f r e s h d a t a t o r e f l e c t a n y c h a n g e s m a d e i n t h e a d m i t d i a l o g
await this . refreshData ( ) ;
/ / U s e t h e s a m e l o g i c a s n o r m a l f l o w t o c h e c k f o r v i s i b i l i t y d i a l o g
this . checkAndShowVisibilityDialog ( ) ;
/ / I f n o v i s i b i l i t y d i a l o g w a s s h o w n , r e s u m e a u t o - r e f r e s h
if ( ! this . showSetVisibilityDialog ) {
this . startAutoRefresh ( ) ;
}
}
async onAdmitPendingSuccess ( _result : {
admittedCount : number ;
contactAddedCount : number ;
visibilitySetCount : number ;
} ) {
/ / A f t e r a d m i t t i n g p e n d i n g m e m b e r s , c l o s e t h e a d m i t d i a l o g
/ / T h e v i s i b i l i t y d i a l o g w i l l b e h a n d l e d b y t h e c l o s e A d m i t P e n d i n g D i a l o g f l o w
await this . closeAdmitPendingDialog ( ) ;
}
/ / S e t V i s i b i l i t y D i a l o g m e t h o d s
closeSetVisibilityDialog ( ) {
this . showSetVisibilityDialog = false ;
this . visibilityDialogMembers = [ ] ;
/ / R e f r e s h d a t a w h e n d i a l o g i s c l o s e d t o r e f l e c t a n y c h a n g e s m a d e
this . refreshData ( ) ;
/ / R e s u m e a u t o - r e f r e s h w h e n d i a l o g i s c l o s e d
this . startAutoRefresh ( ) ;
await this . refreshData ( true ) ;
}
beforeDestroy ( ) {