1
1
import React , { createContext , useCallback , useContext , useEffect , useMemo , useRef , useState } from 'react' ;
2
- import { withOnyx } from 'react-native-onyx' ;
3
- import type { OnyxCollection } from 'react-native-onyx' ;
2
+ import { useOnyx } from 'react-native-onyx' ;
4
3
import usePrevious from '@hooks/usePrevious' ;
5
4
import * as OptionsListUtils from '@libs/OptionsListUtils' ;
6
5
import type { OptionList } from '@libs/OptionsListUtils' ;
@@ -17,14 +16,11 @@ type OptionsListContextProps = {
17
16
initializeOptions : ( ) => void ;
18
17
/** Flag to check if the options are initialized */
19
18
areOptionsInitialized : boolean ;
19
+ /** Function to reset the options */
20
+ resetOptions : ( ) => void ;
20
21
} ;
21
22
22
- type OptionsListProviderOnyxProps = {
23
- /** Collection of reports */
24
- reports : OnyxCollection < Report > ;
25
- } ;
26
-
27
- type OptionsListProviderProps = OptionsListProviderOnyxProps & {
23
+ type OptionsListProviderProps = {
28
24
/** Actual content wrapped by this component */
29
25
children : React . ReactNode ;
30
26
} ;
@@ -36,6 +32,7 @@ const OptionsListContext = createContext<OptionsListContextProps>({
36
32
} ,
37
33
initializeOptions : ( ) => { } ,
38
34
areOptionsInitialized : false ,
35
+ resetOptions : ( ) => { } ,
39
36
} ) ;
40
37
41
38
const isEqualPersonalDetail = ( prevPersonalDetail : PersonalDetails | null , personalDetail : PersonalDetails | null ) =>
@@ -44,12 +41,13 @@ const isEqualPersonalDetail = (prevPersonalDetail: PersonalDetails | null, perso
44
41
prevPersonalDetail ?. login === personalDetail ?. login &&
45
42
prevPersonalDetail ?. displayName === personalDetail ?. displayName ;
46
43
47
- function OptionsListContextProvider ( { reports , children} : OptionsListProviderProps ) {
44
+ function OptionsListContextProvider ( { children} : OptionsListProviderProps ) {
48
45
const areOptionsInitialized = useRef ( false ) ;
49
46
const [ options , setOptions ] = useState < OptionList > ( {
50
47
reports : [ ] ,
51
48
personalDetails : [ ] ,
52
49
} ) ;
50
+ const [ reports ] = useOnyx ( ONYXKEYS . COLLECTION . REPORT ) ;
53
51
54
52
const personalDetails = usePersonalDetails ( ) || CONST . EMPTY_OBJECT ;
55
53
const prevPersonalDetails = usePrevious ( personalDetails ) ;
@@ -144,9 +142,22 @@ function OptionsListContextProvider({reports, children}: OptionsListProviderProp
144
142
areOptionsInitialized . current = true ;
145
143
} , [ loadOptions ] ) ;
146
144
145
+ const resetOptions = useCallback ( ( ) => {
146
+ if ( ! areOptionsInitialized . current ) {
147
+ return ;
148
+ }
149
+
150
+ areOptionsInitialized . current = false ;
151
+ setOptions ( {
152
+ reports : [ ] ,
153
+ personalDetails : [ ] ,
154
+ } ) ;
155
+ } , [ ] ) ;
156
+
147
157
return (
148
- // eslint-disable-next-line react-compiler/react-compiler
149
- < OptionsListContext . Provider value = { useMemo ( ( ) => ( { options, initializeOptions, areOptionsInitialized : areOptionsInitialized . current } ) , [ options , initializeOptions ] ) } >
158
+ < OptionsListContext . Provider // eslint-disable-next-line react-compiler/react-compiler
159
+ value = { useMemo ( ( ) => ( { options, initializeOptions, areOptionsInitialized : areOptionsInitialized . current , resetOptions} ) , [ options , initializeOptions , resetOptions ] ) }
160
+ >
150
161
{ children }
151
162
</ OptionsListContext . Provider >
152
163
) ;
@@ -157,7 +168,7 @@ const useOptionsListContext = () => useContext(OptionsListContext);
157
168
// Hook to use the OptionsListContext with an initializer to load the options
158
169
const useOptionsList = ( options ?: { shouldInitialize : boolean } ) => {
159
170
const { shouldInitialize = true } = options ?? { } ;
160
- const { initializeOptions, options : optionsList , areOptionsInitialized} = useOptionsListContext ( ) ;
171
+ const { initializeOptions, options : optionsList , areOptionsInitialized, resetOptions } = useOptionsListContext ( ) ;
161
172
162
173
useEffect ( ( ) => {
163
174
if ( ! shouldInitialize || areOptionsInitialized ) {
@@ -171,13 +182,10 @@ const useOptionsList = (options?: {shouldInitialize: boolean}) => {
171
182
initializeOptions,
172
183
options : optionsList ,
173
184
areOptionsInitialized,
185
+ resetOptions,
174
186
} ;
175
187
} ;
176
188
177
- export default withOnyx < OptionsListProviderProps , OptionsListProviderOnyxProps > ( {
178
- reports : {
179
- key : ONYXKEYS . COLLECTION . REPORT ,
180
- } ,
181
- } ) ( OptionsListContextProvider ) ;
189
+ export default OptionsListContextProvider ;
182
190
183
191
export { useOptionsListContext , useOptionsList , OptionsListContext } ;
0 commit comments