react-usedrafty
Version:
📝 A React hook to auto-save and restore form state using localStorage or sessionStorage.
2 lines • 2.36 kB
JavaScript
;var D=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var N=(e,r)=>{for(var f in r)D(e,f,{get:r[f],enumerable:!0})},E=(e,r,f,d)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of k(r))!x.call(e,s)&&s!==f&&D(e,s,{get:()=>r[s],enumerable:!(d=U(r,s))||d.enumerable});return e};var J=e=>E(D({},"__esModule",{value:!0}),e);var $={};N($,{default:()=>L,useDrafty:()=>h});module.exports=J($);var n=require("react");function h(e,r,f,d){let{useSession:s=!1,debounce:y=300,warnOnLeave:l=!1,onRestore:m,router:i}=d||{},u=s?sessionStorage:localStorage,b=`submitted:${e}`,c=(0,n.useRef)(null),g=(0,n.useRef)(!1),[O,v]=(0,n.useState)(!1),[I,p]=(0,n.useState)(null);(0,n.useEffect)(()=>{if(typeof window!="undefined")try{if(u.getItem(b)==="true"){console.info(`[useDrafty] Skipping restore for "${e}" (submitted)`);return}let o=u.getItem(e);if(o){let a=JSON.parse(o);f(a),p(a),v(!0),m==null||m(a),console.info(`[useDrafty] Draft restored for "${e}"`)}}catch(t){console.warn("[useDrafty] Failed to load saved draft:",t)}finally{g.current=!0}},[e]),(0,n.useEffect)(()=>{if(typeof window!="undefined"&&g.current)return c.current&&clearTimeout(c.current),c.current=setTimeout(()=>{w()},y),()=>{c.current&&clearTimeout(c.current)}},[r,y]),(0,n.useEffect)(()=>{if(!l)return;let t=()=>{let a=typeof l=="function"?l():l;return typeof a=="string"?a:"You have unsaved changes."},o=a=>{let S=t();return a.preventDefault(),a.returnValue=S,S};return window.addEventListener("beforeunload",o),()=>window.removeEventListener("beforeunload",o)},[l]),(0,n.useEffect)(()=>{var o;if(!i)return;let t=()=>{T(),console.info(`[useDrafty] Draft cleared for "${e}" on navigation`)};if((o=i.events)!=null&&o.on)return i.events.on("routeChangeStart",t),()=>i.events.off("routeChangeStart",t);if(i.block)return i.block(()=>(t(),!0))},[i]);let w=()=>{try{u.setItem(e,JSON.stringify(r)),v(!0),u.removeItem(b)}catch(t){console.warn("[useDrafty] Failed to save draft:",t)}},T=t=>{try{u.removeItem(e),t!=null&&t.submitted?u.setItem(b,"true"):u.removeItem(b),v(!1),p(null)}catch(o){console.warn("[useDrafty] Failed to clear draft:",o)}},R=JSON.stringify(I)!==JSON.stringify(r);return{saveDraft:w,clearDraft:T,hasDraft:O,isDirty:R}}var L=h;0&&(module.exports={useDrafty});
//# sourceMappingURL=index.js.map