UNPKG

@fivexlabs/use-file-system

Version:

A comprehensive React hook for the File System Access API with TypeScript support

2 lines (1 loc) 2.65 kB
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react"),O=()=>typeof window<"u"&&"showOpenFilePicker"in window&&"showSaveFilePicker"in window&&"showDirectoryPicker"in window,p=async(t,w="text")=>new Promise((u,f)=>{const l=new FileReader;l.onload=()=>{u(l.result)},l.onerror=()=>{f(new Error("Failed to read file"))},w==="text"?l.readAsText(t):l.readAsArrayBuffer(t)}),F=async(t,w=null,u=null)=>({name:t.name,content:u,handle:w,size:t.size,type:t.type,lastModified:t.lastModified}),z=()=>{const[t,w]=s.useState(!1),[u,f]=s.useState(null),[l,b]=s.useState([]),[S,m]=s.useState(null),[k,a]=s.useState(!1),[A,n]=s.useState(null);s.useEffect(()=>{w(O())},[]);const E=s.useCallback(()=>f(null),[]),P=s.useCallback(()=>b([]),[]),C=s.useCallback(()=>m(null),[]),D=s.useCallback(()=>n(null),[]),g=s.useCallback(async o=>{if(!t){const e=new Error("File System Access API is not supported in this browser.");throw n(e),e}n(null),a(!0);try{const[e]=await window.showOpenFilePicker({multiple:!1,...o}),i=await e.getFile(),r=await p(i,"text"),c=await F(i,e,r);f(c)}catch(e){if(e instanceof Error&&e.name!=="AbortError")throw n(e),e}finally{a(!1)}},[t]),x=s.useCallback(async o=>{if(!t){const e=new Error("File System Access API is not supported in this browser.");throw n(e),e}n(null),a(!0);try{const i=(await window.showOpenFilePicker({multiple:!0,...o})).map(async c=>{const d=await c.getFile(),y=await p(d,"text");return F(d,c,y)}),r=await Promise.all(i);b(r)}catch(e){if(e instanceof Error&&e.name!=="AbortError")throw n(e),e}finally{a(!1)}},[t]),h=s.useCallback(async(o,e,i)=>{if(!t){const r=new Error("File System Access API is not supported in this browser.");throw n(r),r}n(null),a(!0);try{const r=await window.showSaveFilePicker({suggestedName:o,...i}),c=await r.createWritable(),d=new Blob(e);await c.write(d),await c.close();const y=await r.getFile(),H=await p(y,"text"),M=await F(y,r,H);f(M)}catch(r){if(r instanceof Error&&r.name!=="AbortError")throw n(r),r}finally{a(!1)}},[t]),v=s.useCallback(async(o,e="untitled.txt",i)=>h(e,typeof o=="string"?[o]:[o],i),[h]),I=s.useCallback(async o=>{if(!t){const e=new Error("File System Access API is not supported in this browser.");throw n(e),e}n(null),a(!0);try{const e=await window.showDirectoryPicker(o);m({name:e.name,handle:e})}catch(e){if(e instanceof Error&&e.name!=="AbortError")throw n(e),e}finally{a(!1)}},[t]);return{isSupported:t,file:u,files:l,directory:S,loading:k,error:A,openFile:g,openMultipleFiles:x,saveFile:h,saveAs:v,openDirectory:I,readFileContent:p,clearFile:E,clearFiles:P,clearDirectory:C,clearError:D}};exports.useFileSystem=z;