11import { IMCMessage , IMCMessageTypeEnum } from "@pulse-editor/shared-utils" ;
22import { useCallback , useEffect , useState } from "react" ;
3+ import { useDebouncedCallback } from "use-debounce" ;
34import useIMC from "../imc/use-imc" ;
45
5- export default function useFile ( uri : string | undefined ) {
6+ /**
7+ *
8+ * @param uri The file URI to read/write
9+ * @param debounce Debounce time in ms for write operations
10+ * @returns
11+ */
12+ export default function useFile ( uri : string | undefined , debounce = 0 ) {
613 const [ file , setFile ] = useState < File | undefined > ( undefined ) ;
714
815 const receiverHandlerMap = new Map <
@@ -20,26 +27,32 @@ export default function useFile(uri: string | undefined) {
2027
2128 const { imc, isReady } = useIMC ( receiverHandlerMap , "file" ) ;
2229
30+ const sendFileDebounced = useDebouncedCallback (
31+ async ( newFile : File ) => {
32+ if ( ! isReady || ! uri ) return ;
33+ await imc ?. sendMessage ( IMCMessageTypeEnum . PlatformWriteFile , {
34+ uri,
35+ file : newFile ,
36+ } ) ;
37+ } ,
38+ debounce ,
39+ { maxWait : debounce * 2 } ,
40+ ) ;
41+
2342 const saveFile = useCallback (
24- ( fileContent : string ) => {
25- if ( ! uri ) return ;
26- else if ( ! file ) return ;
43+ async ( fileContent : string ) => {
44+ if ( ! uri || ! file ) return ;
2745
28- // Update file content
2946 const newFile = new File ( [ fileContent ] , file . name , {
3047 type : file . type ,
3148 lastModified : Date . now ( ) ,
3249 } ) ;
3350 setFile ( newFile ) ;
3451
35- if ( isReady && uri ) {
36- imc ?. sendMessage ( IMCMessageTypeEnum . PlatformWriteFile , {
37- uri,
38- file : newFile ,
39- } ) ;
40- }
52+ // ✅ This now waits until the debounced write actually finishes
53+ await sendFileDebounced ( newFile ) ;
4154 } ,
42- [ uri , file , isReady ] ,
55+ [ file , uri , sendFileDebounced ] ,
4356 ) ;
4457
4558 // Read file when uri changes
0 commit comments