@ -9,28 +9,56 @@ interface State {
// It should be update when any state change.
// It should be update when any state change.
stateId : string ;
stateId : string ;
memoMapByName : Record < string , Memo > ;
memoMapByName : Record < string , Memo > ;
currentRequest : AbortController | null ;
}
}
const getDefaultState = ( ) : State = > ( {
const getDefaultState = ( ) : State = > ( {
stateId : uniqueId ( ) ,
stateId : uniqueId ( ) ,
memoMapByName : { } ,
memoMapByName : { } ,
currentRequest : null ,
} ) ;
} ) ;
export const useMemoStore = create (
export const useMemoStore = create (
combine ( getDefaultState ( ) , ( set , get ) = > ( {
combine ( getDefaultState ( ) , ( set , get ) = > ( {
setState : ( state : State ) = > set ( state ) ,
setState : ( state : State ) = > set ( state ) ,
getState : ( ) = > get ( ) ,
getState : ( ) = > get ( ) ,
updateStateId : ( ) = > set ( { stateId : uniqueId ( ) } ) ,
fetchMemos : async ( request : Partial < ListMemosRequest > ) = > {
fetchMemos : async ( request : Partial < ListMemosRequest > ) = > {
const { memos , nextPageToken } = await memoServiceClient . listMemos ( {
const currentRequest = get ( ) . currentRequest ;
. . . request ,
if ( currentRequest ) {
view : MemoView.MEMO_VIEW_FULL ,
currentRequest . abort ( ) ;
} ) ;
}
const memoMap = { . . . get ( ) . memoMapByName } ;
for ( const memo of memos ) {
const controller = new AbortController ( ) ;
memoMap [ memo . name ] = memo ;
set ( { currentRequest : controller } ) ;
try {
const { memos , nextPageToken } = await memoServiceClient . listMemos (
{
. . . request ,
view : MemoView.MEMO_VIEW_FULL ,
} ,
{ signal : controller.signal } ,
) ;
if ( ! controller . signal . aborted ) {
const memoMap = request . pageToken ? { . . . get ( ) . memoMapByName } : { } ;
for ( const memo of memos ) {
memoMap [ memo . name ] = memo ;
}
set ( { stateId : uniqueId ( ) , memoMapByName : memoMap } ) ;
return { memos , nextPageToken } ;
}
} catch ( error : any ) {
if ( error . name === "AbortError" ) {
return ;
}
throw error ;
} finally {
if ( get ( ) . currentRequest === controller ) {
set ( { currentRequest : null } ) ;
}
}
}
set ( { stateId : uniqueId ( ) , memoMapByName : memoMap } ) ;
return { memos , nextPageToken } ;
} ,
} ,
getOrFetchMemoByName : async ( name : string , options ? : { skipCache? : boolean ; skipStore? : boolean } ) = > {
getOrFetchMemoByName : async ( name : string , options ? : { skipCache? : boolean ; skipStore? : boolean } ) = > {
const memoMap = get ( ) . memoMapByName ;
const memoMap = get ( ) . memoMapByName ;
@ -99,7 +127,7 @@ export const useMemoList = () => {
const memos = Object . values ( memoStore . getState ( ) . memoMapByName ) ;
const memos = Object . values ( memoStore . getState ( ) . memoMapByName ) ;
const reset = ( ) = > {
const reset = ( ) = > {
memoStore . setState( { stateId : uniqueId ( ) , memoMapByName : { } } ) ;
memoStore . updateStateId( ) ;
} ;
} ;
const size = ( ) = > {
const size = ( ) = > {