@@ -4,11 +4,12 @@ import Toast from "libs/toast";
44import messages from "messages" ;
55import React from "react" ;
66import { call , cancel , cancelled , delay , fork , put , retry , takeEvery } from "typed-redux-saga" ;
7- import type { APIUserCompact } from "types/api_types" ;
87import {
8+ type SetIsMutexAcquiredAction ,
99 type SetOthersMayEditForAnnotationAction ,
1010 setAnnotationAllowUpdateAction ,
1111 setBlockedByUserAction ,
12+ setIsMutexAcquiredAction ,
1213} from "viewer/model/actions/annotation_actions" ;
1314import type { Saga } from "viewer/model/sagas/effect-generators" ;
1415import { select } from "viewer/model/sagas/effect-generators" ;
@@ -25,12 +26,16 @@ const DISABLE_EAGER_MUTEX_ACQUISITION = true;
2526type MutexLogicState = {
2627 isInitialRequest : boolean ;
2728 doesHaveMutexFromBeginning : boolean ;
28- doesHaveMutex : boolean ;
2929 shallTryAcquireMutex : boolean ;
3030} ;
3131
32+ function * getDoesHaveMutex ( ) : Saga < boolean > {
33+ return yield * select ( ( state ) => state . annotation . isMutexAcquired ) ;
34+ }
35+
3236export function * acquireAnnotationMutexMaybe ( ) : Saga < void > {
3337 yield * call ( ensureWkReady ) ;
38+ yield * fork ( watchMutexStateChanges ) ;
3439 if ( DISABLE_EAGER_MUTEX_ACQUISITION ) {
3540 return ;
3641 }
@@ -43,7 +48,6 @@ export function* acquireAnnotationMutexMaybe(): Saga<void> {
4348 const mutexLogicState : MutexLogicState = {
4449 isInitialRequest : true ,
4550 doesHaveMutexFromBeginning : false ,
46- doesHaveMutex : false ,
4751 shallTryAcquireMutex : othersMayEdit ,
4852 } ;
4953
@@ -97,14 +101,11 @@ function* tryAcquireMutexContinuously(mutexLogicState: MutexLogicState): Saga<vo
97101 mutexLogicState . doesHaveMutexFromBeginning = false ;
98102 yield * put ( setAnnotationAllowUpdateAction ( false ) ) ;
99103 }
100- if ( canEdit ) {
101- yield * put ( setBlockedByUserAction ( activeUser ) ) ;
102- } else {
103- yield * put ( setBlockedByUserAction ( blockedByUser ) ) ;
104- }
105- if ( canEdit !== mutexLogicState . doesHaveMutex || mutexLogicState . isInitialRequest ) {
106- mutexLogicState . doesHaveMutex = canEdit ;
107- onMutexStateChanged ( mutexLogicState . isInitialRequest , canEdit , blockedByUser ) ;
104+
105+ yield * put ( setBlockedByUserAction ( canEdit ? activeUser : blockedByUser ) ) ;
106+
107+ if ( canEdit !== ( yield * call ( getDoesHaveMutex ) ) || mutexLogicState . isInitialRequest ) {
108+ yield * put ( setIsMutexAcquiredAction ( canEdit ) ) ;
108109 }
109110 } catch ( error ) {
110111 if ( process . env . IS_TESTING ) {
@@ -120,9 +121,8 @@ function* tryAcquireMutexContinuously(mutexLogicState: MutexLogicState): Saga<vo
120121 yield * put ( setBlockedByUserAction ( undefined ) ) ;
121122 yield * put ( setAnnotationAllowUpdateAction ( false ) ) ;
122123 mutexLogicState . doesHaveMutexFromBeginning = false ;
123- if ( mutexLogicState . doesHaveMutex || mutexLogicState . isInitialRequest ) {
124- onMutexStateChanged ( mutexLogicState . isInitialRequest , false , null ) ;
125- mutexLogicState . doesHaveMutex = false ;
124+ if ( ( yield * call ( getDoesHaveMutex ) ) || mutexLogicState . isInitialRequest ) {
125+ yield * put ( setIsMutexAcquiredAction ( false ) ) ;
126126 }
127127 }
128128 }
@@ -131,31 +131,35 @@ function* tryAcquireMutexContinuously(mutexLogicState: MutexLogicState): Saga<vo
131131 }
132132}
133133
134- // todop: this should automatically react to store changes / actions. there could be a "SET_MUTEX_INFO" action
135- function onMutexStateChanged (
136- isInitialRequest : boolean ,
137- canEdit : boolean ,
138- blockedByUser : APIUserCompact | null | undefined ,
139- ) {
140- if ( canEdit ) {
141- Toast . close ( MUTEX_NOT_ACQUIRED_KEY ) ;
142- if ( ! isInitialRequest ) {
143- const message = (
144- < React . Fragment >
145- { messages [ "annotation.acquiringMutexSucceeded" ] } " "
146- < Button onClick = { ( ) => location . reload ( ) } > Reload the annotation</ Button >
147- </ React . Fragment >
148- ) ;
149- Toast . success ( message , { sticky : true , key : MUTEX_ACQUIRED_KEY } ) ;
150- }
151- } else {
152- Toast . close ( MUTEX_ACQUIRED_KEY ) ;
153- const message =
154- blockedByUser != null
155- ? messages [ "annotation.acquiringMutexFailed" ] ( {
156- userName : `${ blockedByUser . firstName } ${ blockedByUser . lastName } ` ,
157- } )
158- : messages [ "annotation.acquiringMutexFailed.noUser" ] ;
159- Toast . warning ( message , { sticky : true , key : MUTEX_NOT_ACQUIRED_KEY } ) ;
160- }
134+ function * watchMutexStateChanges ( ) : Saga < void > {
135+ // todop: wrong?
136+ let isInitialRequest = true ;
137+ yield * takeEvery (
138+ "SET_IS_MUTEX_ACQUIRED" ,
139+ function * ( { isMutexAcquired } : SetIsMutexAcquiredAction ) {
140+ if ( isMutexAcquired ) {
141+ Toast . close ( MUTEX_NOT_ACQUIRED_KEY ) ;
142+ if ( ! isInitialRequest ) {
143+ const message = (
144+ < React . Fragment >
145+ { messages [ "annotation.acquiringMutexSucceeded" ] } " "
146+ < Button onClick = { ( ) => location . reload ( ) } > Reload the annotation</ Button >
147+ </ React . Fragment >
148+ ) ;
149+ Toast . success ( message , { sticky : true , key : MUTEX_ACQUIRED_KEY } ) ;
150+ }
151+ } else {
152+ Toast . close ( MUTEX_ACQUIRED_KEY ) ;
153+ const blockedByUser = yield * select ( ( state ) => state . annotation . blockedByUser ) ;
154+ const message =
155+ blockedByUser != null
156+ ? messages [ "annotation.acquiringMutexFailed" ] ( {
157+ userName : `${ blockedByUser . firstName } ${ blockedByUser . lastName } ` ,
158+ } )
159+ : messages [ "annotation.acquiringMutexFailed.noUser" ] ;
160+ Toast . warning ( message , { sticky : true , key : MUTEX_NOT_ACQUIRED_KEY } ) ;
161+ }
162+ isInitialRequest = false ;
163+ } ,
164+ ) ;
161165}
0 commit comments