UNPKG

@pastable/react

Version:
3 lines (2 loc) 4.24 kB
import{atom as t}from"jotai";import{atomWithStorage as r}from"jotai/utils";import{useRef as n,useEffect as e,useState as o,useCallback as c,useMemo as s}from"react";import{on as u,off as a,isBrowser as i,format as f,isDefined as l,isType as p,sortBy as d}from"@pastable/utils";function m(r,n=t){const e=n(r);return t(t=>t(e),(t,r,n)=>{const o=null!=n?n:!t(e);r(e,o)})}function h(t,n,e){return m(n,n=>r(t,n,e))}const y=["mousedown","touchstart"],w=(t,r,o=y)=>{const c=n(r);e(()=>{c.current=r},[r]),e(()=>{const r=r=>{t.current&&!t.current.contains(r.target)&&c.current(r)};for(const t of o)u(document,t,r);return()=>{for(const t of o)a(document,t,r)}},[o,t])};function g(){const t=n(null);return e(()=>(t.current=!0,()=>{t.current=!1}),[]),t}const j=()=>{const[t,r]=o(!1);return e(()=>(r(!0),()=>r(!1)),[]),t};function v(t,r,o=window){const c=n(),s=n(),a=g(),i=n(function(){a.current&&c.current.apply(null,arguments)});e(()=>(r===c.current||(null==s.current||s.current(),c.current=r,c.current&&(s.current=u(o,t,i.current))),()=>null==s.current?void 0:s.current()),[r,o])}const b=()=>{const[t,r]=o({});return c(()=>r({}),[])};function I(){return I=Object.assign||function(t){for(var r=1;r<arguments.length;r++){var n=arguments[r];for(var e in n)Object.prototype.hasOwnProperty.call(n,e)&&(t[e]=n[e])}return t},I.apply(this,arguments)}const O=(t={})=>{const{getterFormater:r,setterFormater:n,toPath:o}=t,c=S(r),s=E({formater:n,toPath:o});return e(()=>{t.defaultValues&&s(I({},t.defaultValues,c))},[]),[c,s,t=>s(Object.fromEntries((t||Object.keys(c)).map(t=>[t,void 0])))]},P=()=>i()?window.location:{search:{}},S=t=>{const r=P(),n=new URLSearchParams(r.search),e=B(Object.fromEntries(n.entries()));return v("pushstate",b()),t?f(e,t):e},A=(t,r={})=>{const{getterFormater:n,setterFormater:e,toPath:o,defaultValue:c}=r,s=S(n),u=E({formater:e,toPath:o}),a=s[t]||c;return[a,r=>{const n=p(r,"function"==typeof r)?r(a):r;u({[t]:n})}]},F=()=>{},x=()=>i()?window.history:{pushState:F,replaceState:F},E=({toPath:t,formater:r}={})=>{const n=U(r);return(r,e="push",o)=>{const c=x(),s=P().pathname,u=s.endsWith("/")?s.slice(0,-1):s,a=o||t,i=(a?"string"==typeof a?a:a(u):u)+n(r);"push"===e?c.pushState(r,"",i):c.replaceState(r,"",i)}},U=t=>{const r=S();return n=>C(I({},r,n),t)},B=t=>f(t,decodeURIComponent),C=(t,r)=>"?"+Object.entries(t).map(([t,n])=>[t,R(n,r,t)]).filter(([t,r])=>function(t,r){return Array.isArray(t)?t.length:"object"==typeof t?t instanceof Date:l(t)}(r)).map(([t,r])=>`${t}=${decodeURIComponent(r)}`).join("&");function R(t,r,n){return(null==r?void 0:r(t,n))||t}function V(t){const r=window.history,n=r[t];r[t]=function(r){const e=n.apply(this,arguments),o=new Event(t.toLowerCase());return o.state=r,window.dispatchEvent(o),e}}i()&&(V("pushState"),V("replaceState"));const D=(t,r)=>{const n=g();return e(()=>{n.current&&t()},r),n.current};function L({getId:t,max:r,initial:n=[],sortBy:e,sortDirection:u="asc",sortFn:a,updateFromInitial:i,onUpdate:f}){const[l,p]=o(n),m=g(),h=c(t=>{if(m.current&&(p(t),f)){const r="function"==typeof t?t(l):t;f(r)}},[f]),y=c(t=>{let n=Array.isArray(t)?[...t]:I({},t);if(r){if(l.length>=r)return;Array.isArray(t)&&(n=t.slice(0,r-l.length))}h(l.concat(n))},[l,r]),w=c(t=>{let r=t;"number"!=typeof t&&(r=v(t,!0));const n=[...l];n.splice(r,1),h([...n])},[l]),j=c(()=>h([]),[]),v=c((r,n)=>l[n?"findIndex":"find"](n=>t(n)===t(r)),[l]),b=c((r,n)=>l[n?"findIndex":"find"](n=>t(n)===r),[l]),O=c(t=>void 0!==v(t),[l]),P=t=>{h(r=>{const n=[...r];return n[v(t,!0)]=t,n})},S=c(t=>{const r=O(t);return r?w(t):y(t),r},[l]),A=c(t=>{h(r=>[...r].sort(t))},[]),F=s(()=>e?d(l,e,u):a?[...l].sort(a):l,[l,e,a]),x=c(()=>F,[F]),E=s(()=>n,[n]),U=c(()=>h(n),[n]);return D(()=>{i&&h(E)},[E,i]),[F,{get:x,set:h,clear:j,reset:U,add:y,remove:w,find:v,findById:b,has:O,toggle:S,update:P,upsert:t=>O(t)?P(t):y(t),sortBy:A}]}export{m as atomWithToggle,h as atomWithToggleAndStorage,C as formatObjToQueryString,x as getHistory,P as getLocation,w as useClickAway,S as useCurrentQueryParams,v as useEvent,b as useForceUpdate,j as useIsMounted,g as useIsMountedRef,O as useQueryParams,U as useQueryParamsMerger,A as useQueryParamsState,L as useSelection,E as useSetQueryParams,D as useUpdateEffect}; //# sourceMappingURL=index.modern.js.map