11/* eslint-disable react-hooks/rules-of-hooks */
2- import { useContext , useLayoutEffect , useRef , useState } from 'react' ;
2+ import { useContext , useLayoutEffect } from 'react' ;
33import { Class , AllPropertiesOptional , Maybe } from 'yummies/utils/types' ;
44
55import { viewModelsConfig } from '../config/global-config.js' ;
@@ -10,6 +10,7 @@ import {
1010import { ActiveViewModelContext } from '../contexts/active-view-context.js' ;
1111import { ViewModelsContext } from '../contexts/view-models-context.js' ;
1212import { useIsomorphicLayoutEffect } from '../lib/hooks/use-isomorphic-layout-effect.js' ;
13+ import { useValue } from '../lib/hooks/use-value.js' ;
1314import { generateVMId } from '../utils/create-vm-id-generator.js' ;
1415import { ViewModelSimple } from '../view-model/view-model-simple.js' ;
1516import { ViewModelCreateConfig } from '../view-model/view-model.store.types.js' ;
@@ -41,19 +42,11 @@ const useCreateViewModelSimple = (
4142 payload ?: any ,
4243) => {
4344 const viewModels = useContext ( ViewModelsContext ) ;
44- const lastInstance = useRef < ViewModelSimple | null > ( null ) ;
45-
46- const [ instance ] = useState ( ( ) => {
47- if ( lastInstance . current ) {
48- return lastInstance . current ;
49- }
50-
45+ const instance = useValue ( ( ) => {
5146 const instance = new VM ( ) ;
47+
5248 viewModels ?. markToBeAttached ( instance ) ;
5349
54- if ( viewModels && instance . linkStore ) {
55- instance . linkStore ( viewModels ) ;
56- }
5750 return instance ;
5851 } ) ;
5952
@@ -68,16 +61,14 @@ const useCreateViewModelSimple = (
6861 viewModels . attach ( instance ) ;
6962 return ( ) => {
7063 viewModels . detach ( instance . id ) ;
71- lastInstance . current = null ;
7264 } ;
7365 } else {
7466 instance . mount ?.( ) ;
7567 return ( ) => {
7668 instance . unmount ?.( ) ;
77- lastInstance . current = null ;
7869 } ;
7970 }
80- } , [ ] ) ;
71+ } , [ instance ] ) ;
8172
8273 return instance ;
8374} ;
@@ -134,14 +125,13 @@ export function useCreateViewModel(VM: Class<any>, ...args: any[]) {
134125 return useCreateViewModelSimple ( VM , payload ) ;
135126 }
136127
137- const idRef = useRef < string > ( '' ) ;
138128 const viewModels = useContext ( ViewModelsContext ) ;
139129 const parentViewModel = useContext ( ActiveViewModelContext ) || null ;
140130
141131 const ctx = config ?. ctx ?? { } ;
142132
143- if ( ! idRef . current ) {
144- idRef . current =
133+ const instance = useValue ( ( ) => {
134+ const id =
145135 viewModels ?. generateViewModelId ( {
146136 ...config ,
147137 ctx,
@@ -150,16 +140,11 @@ export function useCreateViewModel(VM: Class<any>, ...args: any[]) {
150140 } ) ??
151141 config ?. id ??
152142 generateVMId ( ctx ) ;
153- }
154143
155- const id = idRef . current ;
144+ const instanceFromStore = viewModels ? viewModels . get ( id ) : null ;
156145
157- const instanceFromStore = viewModels ? viewModels . get ( id ) : null ;
158- const instanceRef = useRef < AnyViewModel | null > ( null ) ;
159-
160- if ( ! instanceRef . current ) {
161146 if ( instanceFromStore ) {
162- instanceRef . current = instanceFromStore as AnyViewModel ;
147+ return instanceFromStore as AnyViewModel ;
163148 } else {
164149 const configCreate : ViewModelCreateConfig < any > = {
165150 ...config ,
@@ -180,32 +165,28 @@ export function useCreateViewModel(VM: Class<any>, ...args: any[]) {
180165 viewModels ?. createViewModel < any > ( configCreate ) ??
181166 viewModelsConfig . factory ( configCreate ) ;
182167
183- instanceRef . current = instance ;
184-
185168 instance . willMount ( ) ;
186169
187170 viewModels ?. markToBeAttached ( instance ) ;
188- }
189- }
190171
191- const instance = instanceRef . current ;
172+ return instance ;
173+ }
174+ } ) ;
192175
193176 useIsomorphicLayoutEffect ( ( ) => {
194177 if ( viewModels ) {
195178 viewModels . attach ( instance ) ;
196179 return ( ) => {
197180 viewModels . detach ( instance . id ) ;
198- instanceRef . current = null ;
199181 } ;
200182 } else {
201183 instance . mount ( ) ;
202184 return ( ) => {
203185 instance . willUnmount ( ) ;
204186 instance . unmount ( ) ;
205- instanceRef . current = null ;
206187 } ;
207188 }
208- } , [ ] ) ;
189+ } , [ instance ] ) ;
209190
210191 instance . setPayload ( payload ?? { } ) ;
211192
0 commit comments