@inertiajs/react 2.0.14 → 2.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.esm.js CHANGED
@@ -1,2 +1,911 @@
1
- import{router as St}from"@inertiajs/core";import{router as Ke,setupProgress as Be}from"@inertiajs/core";import{createElement as Ve}from"react";import{createHeadManager as Oe,router as fe}from"@inertiajs/core";import{createElement as O,useEffect as Me,useMemo as Le,useState as He}from"react";import{createContext as ke}from"react";var le=ke(void 0);le.displayName="InertiaHeadContext";var B=le;import{createContext as we}from"react";var de=we(void 0);de.displayName="InertiaPageContext";var V=de;var ne=!0,me=!1,ge=async()=>{ne=!1};function q({children:r,initialPage:e,initialComponent:i,resolveComponent:s,titleCallback:a,onHeadUpdate:f}){let[d,P]=He({component:i||null,page:e,key:null}),c=Le(()=>Oe(typeof window>"u",a||(l=>l),f||(()=>{})),[]);if(me||(fe.init({initialPage:e,resolveComponent:s,swapComponent:async l=>ge(l)}),me=!0),Me(()=>{ge=async({component:l,page:u,preserveState:o})=>{if(ne){ne=!1;return}P(t=>({component:l,page:u,key:o?t.key:Date.now()}))},fe.on("navigate",()=>c.forceUpdate())},[]),!d.component)return O(B.Provider,{value:c},O(V.Provider,{value:d.page},null));let m=r||(({Component:l,props:u,key:o})=>{let t=O(l,{key:o,...u});return typeof l.layout=="function"?l.layout(t):Array.isArray(l.layout)?l.layout.concat(t).reverse().reduce((g,F)=>O(F,{children:g,...u})):t});return O(B.Provider,{value:c},O(V.Provider,{value:d.page},m({Component:d.component,key:d.key,props:d.page.props})))}q.displayName="Inertia";async function ye({id:r="app",resolve:e,setup:i,title:s,progress:a={},page:f,render:d}){let P=typeof window>"u",c=P?null:document.getElementById(r),m=f||JSON.parse(c.dataset.page),l=t=>Promise.resolve(e(t)).then(g=>g.default||g),u=[],o=await Promise.all([l(m.component),Ke.decryptHistory().catch(()=>{})]).then(([t])=>i({el:c,App:q,props:{initialPage:m,initialComponent:t,resolveComponent:l,titleCallback:s,onHeadUpdate:P?g=>u=g:null}}));if(!P&&a&&Be(a),P){let t=await d(Ve("div",{id:r,"data-page":JSON.stringify(m)},o));return{head:u,body:t}}}import{useEffect as Pe,useMemo as Ne,useState as je}from"react";import{useContext as Ue}from"react";function J(){let r=Ue(V);if(!r)throw new Error("usePage must be used within the Inertia component");return r}var he=r=>(r=new URL(r.href),r.hash="",r),$e=(r,e)=>he(r).href===he(e).href,Fe=({children:r,data:e,fallback:i})=>{if(!e)throw new Error("`<Deferred>` requires a `data` prop to be a string or array of strings");let[s,a]=je(!1),f=J().props,d=Ne(()=>Array.isArray(e)?e:[e],[e]);return Pe(()=>{let P=Se.on("start",c=>{let m=c.detail.visit.only.length>0||c.detail.visit.except.length>0,l=c.detail.visit.only.find(u=>d.includes(u));$e(c.detail.visit.url,window.location)&&(!m||l)&&a(!1)});return()=>{P()}},[]),Pe(()=>{a(d.every(P=>f[P]!==void 0))},[f,d]),s?r:i};Fe.displayName="InertiaDeferred";var We=Fe;import Te,{useContext as _e,useEffect as qe,useMemo as Je}from"react";var ze=function({children:r,title:e}){let i=_e(B),s=Je(()=>i.createProvider(),[i]),a=typeof window>"u";qe(()=>(s.reconnect(),s.update(u(r)),()=>{s.disconnect()}),[s,r,e]);function f(o){return["area","base","br","col","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"].indexOf(o.type)>-1}function d(o){let t=Object.keys(o.props).reduce((g,F)=>{if(["head-key","children","dangerouslySetInnerHTML"].includes(F))return g;let b=o.props[F];return b===""?g+` ${F}`:g+` ${F}="${b}"`},"");return`<${o.type}${t}>`}function P(o){return typeof o.props.children=="string"?o.props.children:o.props.children.reduce((t,g)=>t+c(g),"")}function c(o){let t=d(o);return o.props.children&&(t+=P(o)),o.props.dangerouslySetInnerHTML&&(t+=o.props.dangerouslySetInnerHTML.__html),f(o)||(t+=`</${o.type}>`),t}function m(o){return Te.cloneElement(o,{inertia:o.props["head-key"]!==void 0?o.props["head-key"]:""})}function l(o){return c(m(o))}function u(o){let t=Te.Children.toArray(o).filter(g=>g).map(g=>l(g));return e&&!t.find(g=>g.startsWith("<title"))&&t.push(`<title inertia>${e}</title>`),t}return a&&s.update(u(r)),null},Qe=ze;import{mergeDataIntoQueryString as Ye,router as se,shouldIntercept as ae}from"@inertiajs/core";import{createElement as Ge,forwardRef as Xe,useEffect as ve,useMemo as be,useRef as Ze,useState as et}from"react";var x=()=>{},Ce=Xe(({children:r,as:e="a",data:i={},href:s,method:a="get",preserveScroll:f=!1,preserveState:d=null,replace:P=!1,only:c=[],except:m=[],headers:l={},queryStringArrayFormat:u="brackets",async:o=!1,onClick:t=x,onCancelToken:g=x,onBefore:F=x,onStart:b=x,onProgress:E=x,onFinish:Y=x,onCancel:j=x,onSuccess:G=x,onError:M=x,prefetch:T=!1,cacheFor:k=0,...R},X)=>{let[$,L]=et(0),H=Ze(null);e=e.toLowerCase(),a=typeof s=="object"?s.method:a.toLowerCase();let[Z,ee]=Ye(a,typeof s=="object"?s.url:s||"",i,u),w=Z;i=ee;let A={data:i,method:a,preserveScroll:f,preserveState:d??a!=="get",replace:P,only:c,except:m,headers:l,async:o},W={...A,onCancelToken:g,onBefore:F,onStart(p){L(y=>y+1),b(p)},onProgress:E,onFinish(p){L(y=>y-1),Y(p)},onCancel:j,onSuccess:G,onError:M},K=()=>{se.prefetch(w,A,{cacheFor:te})},D=be(()=>T===!0?["hover"]:T===!1?[]:Array.isArray(T)?T:[T],Array.isArray(T)?T:[T]),te=be(()=>k!==0?k:D.length===1&&D[0]==="click"?0:3e4,[k,D]);ve(()=>()=>{clearTimeout(H.current)},[]),ve(()=>{D.includes("mount")&&setTimeout(()=>K())},D);let _={onClick:p=>{t(p),ae(p)&&(p.preventDefault(),se.visit(w,W))}},re={onMouseEnter:()=>{H.current=window.setTimeout(()=>{K()},75)},onMouseLeave:()=>{clearTimeout(H.current)},onClick:_.onClick},oe={onMouseDown:p=>{ae(p)&&(p.preventDefault(),K())},onMouseUp:p=>{p.preventDefault(),se.visit(w,W)},onClick:p=>{t(p),ae(p)&&p.preventDefault()}};return a!=="get"&&(e="button"),Ge(e,{...R,...{a:{href:w},button:{type:"button"}}[e]||{},ref:X,...D.includes("hover")?re:D.includes("click")?oe:_,"data-loading":$>0?"":void 0},r)});Ce.displayName="InertiaLink";var tt=Ce;import{router as De}from"@inertiajs/core";import{cloneDeep as z,isEqual as nt}from"es-toolkit";import{get as st,has as at,set as ie}from"es-toolkit/compat";import{useCallback as v,useEffect as it,useLayoutEffect as pt,useMemo as ut,useRef as Q,useState as I}from"react";import{router as Re}from"@inertiajs/core";import{useEffect as rt,useState as ot}from"react";function U(r,e){let[i,s]=ot(()=>{let a=Re.restore(e);return a!==void 0?a:r});return rt(()=>{Re.remember(i,e)},[i,e]),[i,s]}function xe(r,e){let i=Q(null),s=typeof r=="string"?r:null,[a,f]=I((typeof r=="string"?e:r)||{}),d=Q(null),P=Q(null),[c,m]=s?U(a,`${s}:data`):I(a),[l,u]=s?U({},`${s}:errors`):I({}),[o,t]=I(!1),[g,F]=I(!1),[b,E]=I(null),[Y,j]=I(!1),[G,M]=I(!1),T=Q(n=>n),k=ut(()=>!nt(c,a),[c,a]);it(()=>(i.current=!0,()=>{i.current=!1}),[]);let R=v((...n)=>{let p=typeof n[0]=="object",y=p?n[0].method:n[0],C=p?n[0].url:n[1],h=(p?n[1]:n[2])??{},ce={...h,onCancelToken:S=>{if(d.current=S,h.onCancelToken)return h.onCancelToken(S)},onBefore:S=>{if(j(!1),M(!1),clearTimeout(P.current),h.onBefore)return h.onBefore(S)},onStart:S=>{if(F(!0),h.onStart)return h.onStart(S)},onProgress:S=>{if(E(S),h.onProgress)return h.onProgress(S)},onSuccess:S=>{if(i.current&&(F(!1),E(null),u({}),t(!1),j(!0),M(!0),f(z(c)),P.current=setTimeout(()=>{i.current&&M(!1)},2e3)),h.onSuccess)return h.onSuccess(S)},onError:S=>{if(i.current&&(F(!1),E(null),u(S),t(!0)),h.onError)return h.onError(S)},onCancel:()=>{if(i.current&&(F(!1),E(null)),h.onCancel)return h.onCancel()},onFinish:S=>{if(i.current&&(F(!1),E(null)),d.current=null,h.onFinish)return h.onFinish(S)}};y==="delete"?De.delete(C,{...ce,data:T.current(c)}):De[y](C,T.current(c),ce)},[c,u,T]),X=v((n,p)=>{m(typeof n=="string"?y=>ie(z(y),n,p):typeof n=="function"?y=>n(y):n)},[m]),[$,L]=I(!1),H=v((n,p)=>{typeof n>"u"?(f(c),L(!0)):f(y=>typeof n=="string"?ie(z(y),n,p):Object.assign(z(y),n))},[c,f]);pt(()=>{$&&(k&&f(c),L(!1))},[$]);let Z=v((...n)=>{n.length===0?m(a):m(p=>n.filter(y=>at(a,y)).reduce((y,C)=>ie(y,C,st(a,C)),{...p}))},[m,a]),ee=v((n,p)=>{u(y=>{let C={...y,...typeof n=="string"?{[n]:p}:n};return t(Object.keys(C).length>0),C})},[u,t]),w=v((...n)=>{u(p=>{let y=Object.keys(p).reduce((C,h)=>({...C,...n.length>0&&!n.includes(h)?{[h]:p[h]}:{}}),{});return t(Object.keys(y).length>0),y})},[u,t]),A=n=>(p,y)=>{R(n,p,y)},W=v(A("get"),[R]),K=v(A("post"),[R]),D=v(A("put"),[R]),te=v(A("patch"),[R]),_=v(A("delete"),[R]),re=v(()=>{d.current&&d.current.cancel()},[]),oe=v(n=>{T.current=n},[]);return{data:c,setData:X,isDirty:k,errors:l,hasErrors:o,processing:g,progress:b,wasSuccessful:Y,recentlySuccessful:G,transform:oe,setDefaults:H,reset:Z,setError:ee,clearErrors:w,submit:R,get:W,post:K,put:D,patch:te,delete:_,cancel:re}}import{router as ct}from"@inertiajs/core";import{useEffect as lt,useRef as dt}from"react";function Ie(r,e={},i={keepAlive:!1,autoStart:!0}){let s=dt(ct.poll(r,e,{...i,autoStart:!1}));return lt(()=>((i.autoStart??!0)&&s.current.start(),()=>s.current.stop()),[]),{stop:s.current.stop,start:s.current.start}}import{router as N}from"@inertiajs/core";import{useEffect as ft,useState as pe}from"react";function Ae(r={}){let e=typeof window>"u"?null:N.getCached(window.location.pathname,r),i=typeof window>"u"?null:N.getPrefetching(window.location.pathname,r),[s,a]=pe(e?.staleTimestamp||null),[f,d]=pe(i!==null),[P,c]=pe(e!==null);return ft(()=>{let m=N.on("prefetching",u=>{u.detail.visit.url.pathname===window.location.pathname&&d(!0)}),l=N.on("prefetched",u=>{u.detail.visit.url.pathname===window.location.pathname&&(d(!1),c(!0),a(u.detail.fetchedAt))});return()=>{l(),m()}},[]),{lastUpdatedAt:s,isPrefetching:f,isPrefetched:P,flush:()=>N.flush(window.location.pathname,r)}}import{router as mt}from"@inertiajs/core";import{createElement as gt,useCallback as yt,useEffect as Pt,useRef as ue,useState as ht}from"react";var Ee=({children:r,data:e,params:i,buffer:s,as:a,always:f,fallback:d})=>{f=f??!1,a=a??"div",d=d??null;let[P,c]=ht(!1),m=ue(!1),l=ue(!1),u=ue(null),o=yt(()=>{if(e)return{only:Array.isArray(e)?e:[e]};if(!i)throw new Error("You must provide either a `data` or `params` prop.");return i},[i,e]);return Pt(()=>{if(!u.current)return;let t=new IntersectionObserver(g=>{if(!g[0].isIntersecting||(!f&&m.current&&t.disconnect(),l.current))return;m.current=!0,l.current=!0;let F=o();mt.reload({...F,onStart:b=>{l.current=!0,F.onStart?.(b)},onFinish:b=>{c(!0),l.current=!1,F.onFinish?.(b),f||t.disconnect()}})},{rootMargin:`${s||0}px`});return t.observe(u.current),()=>{t.disconnect()}},[u,o,s]),f||!P?gt(a,{props:null,ref:u},P?r:d):P?r:null};Ee.displayName="InertiaWhenVisible";var Ft=Ee;var Se=St;export{We as Deferred,Qe as Head,tt as Link,Ft as WhenVisible,ye as createInertiaApp,Se as router,xe as useForm,J as usePage,Ie as usePoll,Ae as usePrefetch,U as useRemember};
1
+ // src/index.ts
2
+ import { router as Router } from "@inertiajs/core";
3
+
4
+ // src/createInertiaApp.ts
5
+ import { router as router2, setupProgress } from "@inertiajs/core";
6
+ import { createElement as createElement2 } from "react";
7
+
8
+ // src/App.ts
9
+ import { createHeadManager, router } from "@inertiajs/core";
10
+ import { createElement, useEffect, useMemo, useState } from "react";
11
+
12
+ // src/HeadContext.ts
13
+ import { createContext } from "react";
14
+ var headContext = createContext(void 0);
15
+ headContext.displayName = "InertiaHeadContext";
16
+ var HeadContext_default = headContext;
17
+
18
+ // src/PageContext.ts
19
+ import { createContext as createContext2 } from "react";
20
+ var pageContext = createContext2(void 0);
21
+ pageContext.displayName = "InertiaPageContext";
22
+ var PageContext_default = pageContext;
23
+
24
+ // src/App.ts
25
+ var currentIsInitialPage = true;
26
+ var routerIsInitialized = false;
27
+ var swapComponent = async () => {
28
+ currentIsInitialPage = false;
29
+ };
30
+ function App({
31
+ children,
32
+ initialPage,
33
+ initialComponent,
34
+ resolveComponent,
35
+ titleCallback,
36
+ onHeadUpdate
37
+ }) {
38
+ const [current, setCurrent] = useState({
39
+ component: initialComponent || null,
40
+ page: initialPage,
41
+ key: null
42
+ });
43
+ const headManager = useMemo(() => {
44
+ return createHeadManager(
45
+ typeof window === "undefined",
46
+ titleCallback || ((title) => title),
47
+ onHeadUpdate || (() => {
48
+ })
49
+ );
50
+ }, []);
51
+ if (!routerIsInitialized) {
52
+ router.init({
53
+ initialPage,
54
+ resolveComponent,
55
+ swapComponent: async (args) => swapComponent(args)
56
+ });
57
+ routerIsInitialized = true;
58
+ }
59
+ useEffect(() => {
60
+ swapComponent = async ({ component, page, preserveState }) => {
61
+ if (currentIsInitialPage) {
62
+ currentIsInitialPage = false;
63
+ return;
64
+ }
65
+ setCurrent((current2) => ({
66
+ component,
67
+ page,
68
+ key: preserveState ? current2.key : Date.now()
69
+ }));
70
+ };
71
+ router.on("navigate", () => headManager.forceUpdate());
72
+ }, []);
73
+ if (!current.component) {
74
+ return createElement(
75
+ HeadContext_default.Provider,
76
+ { value: headManager },
77
+ createElement(PageContext_default.Provider, { value: current.page }, null)
78
+ );
79
+ }
80
+ const renderChildren = children || (({ Component, props, key }) => {
81
+ const child = createElement(Component, { key, ...props });
82
+ if (typeof Component.layout === "function") {
83
+ return Component.layout(child);
84
+ }
85
+ if (Array.isArray(Component.layout)) {
86
+ return Component.layout.concat(child).reverse().reduce((children2, Layout) => createElement(Layout, { children: children2, ...props }));
87
+ }
88
+ return child;
89
+ });
90
+ return createElement(
91
+ HeadContext_default.Provider,
92
+ { value: headManager },
93
+ createElement(
94
+ PageContext_default.Provider,
95
+ { value: current.page },
96
+ renderChildren({
97
+ Component: current.component,
98
+ key: current.key,
99
+ props: current.page.props
100
+ })
101
+ )
102
+ );
103
+ }
104
+ App.displayName = "Inertia";
105
+
106
+ // src/createInertiaApp.ts
107
+ async function createInertiaApp({
108
+ id = "app",
109
+ resolve,
110
+ setup,
111
+ title,
112
+ progress = {},
113
+ page,
114
+ render
115
+ }) {
116
+ const isServer = typeof window === "undefined";
117
+ const el = isServer ? null : document.getElementById(id);
118
+ const initialPage = page || JSON.parse(el.dataset.page);
119
+ const resolveComponent = (name) => Promise.resolve(resolve(name)).then((module) => module.default || module);
120
+ let head = [];
121
+ const reactApp = await Promise.all([
122
+ resolveComponent(initialPage.component),
123
+ router2.decryptHistory().catch(() => {
124
+ })
125
+ ]).then(([initialComponent]) => {
126
+ return setup({
127
+ // @ts-expect-error
128
+ el,
129
+ App,
130
+ props: {
131
+ initialPage,
132
+ initialComponent,
133
+ resolveComponent,
134
+ titleCallback: title,
135
+ onHeadUpdate: isServer ? (elements) => head = elements : null
136
+ }
137
+ });
138
+ });
139
+ if (!isServer && progress) {
140
+ setupProgress(progress);
141
+ }
142
+ if (isServer) {
143
+ const body = await render(
144
+ createElement2(
145
+ "div",
146
+ {
147
+ id,
148
+ "data-page": JSON.stringify(initialPage)
149
+ },
150
+ // @ts-expect-error
151
+ reactApp
152
+ )
153
+ );
154
+ return { head, body };
155
+ }
156
+ }
157
+
158
+ // src/Deferred.ts
159
+ import { useEffect as useEffect2, useMemo as useMemo2, useState as useState2 } from "react";
160
+
161
+ // src/usePage.ts
162
+ import { useContext } from "react";
163
+ function usePage() {
164
+ const page = useContext(PageContext_default);
165
+ if (!page) {
166
+ throw new Error("usePage must be used within the Inertia component");
167
+ }
168
+ return page;
169
+ }
170
+
171
+ // src/Deferred.ts
172
+ var urlWithoutHash = (url) => {
173
+ url = new URL(url.href);
174
+ url.hash = "";
175
+ return url;
176
+ };
177
+ var isSameUrlWithoutHash = (url1, url2) => {
178
+ return urlWithoutHash(url1).href === urlWithoutHash(url2).href;
179
+ };
180
+ var Deferred = ({ children, data, fallback }) => {
181
+ if (!data) {
182
+ throw new Error("`<Deferred>` requires a `data` prop to be a string or array of strings");
183
+ }
184
+ const [loaded, setLoaded] = useState2(false);
185
+ const pageProps = usePage().props;
186
+ const keys = useMemo2(() => Array.isArray(data) ? data : [data], [data]);
187
+ useEffect2(() => {
188
+ const removeListener = router3.on("start", (e) => {
189
+ const isPartialVisit = e.detail.visit.only.length > 0 || e.detail.visit.except.length > 0;
190
+ const isReloadingKey = e.detail.visit.only.find((key) => keys.includes(key));
191
+ if (isSameUrlWithoutHash(e.detail.visit.url, window.location) && (!isPartialVisit || isReloadingKey)) {
192
+ setLoaded(false);
193
+ }
194
+ });
195
+ return () => {
196
+ removeListener();
197
+ };
198
+ }, []);
199
+ useEffect2(() => {
200
+ setLoaded(keys.every((key) => pageProps[key] !== void 0));
201
+ }, [pageProps, keys]);
202
+ return loaded ? children : fallback;
203
+ };
204
+ Deferred.displayName = "InertiaDeferred";
205
+ var Deferred_default = Deferred;
206
+
207
+ // src/Head.ts
208
+ import { escape } from "es-toolkit";
209
+ import React, { useContext as useContext2, useEffect as useEffect3, useMemo as useMemo3 } from "react";
210
+ var Head = function({ children, title }) {
211
+ const headManager = useContext2(HeadContext_default);
212
+ const provider = useMemo3(() => headManager.createProvider(), [headManager]);
213
+ const isServer = typeof window === "undefined";
214
+ useEffect3(() => {
215
+ provider.reconnect();
216
+ provider.update(renderNodes(children));
217
+ return () => {
218
+ provider.disconnect();
219
+ };
220
+ }, [provider, children, title]);
221
+ function isUnaryTag(node) {
222
+ return [
223
+ "area",
224
+ "base",
225
+ "br",
226
+ "col",
227
+ "embed",
228
+ "hr",
229
+ "img",
230
+ "input",
231
+ "keygen",
232
+ "link",
233
+ "meta",
234
+ "param",
235
+ "source",
236
+ "track",
237
+ "wbr"
238
+ ].indexOf(node.type) > -1;
239
+ }
240
+ function renderTagStart(node) {
241
+ const attrs = Object.keys(node.props).reduce((carry, name) => {
242
+ if (["head-key", "children", "dangerouslySetInnerHTML"].includes(name)) {
243
+ return carry;
244
+ }
245
+ const value = node.props[name];
246
+ if (value === "") {
247
+ return carry + ` ${name}`;
248
+ } else {
249
+ return carry + ` ${name}="${escape(value)}"`;
250
+ }
251
+ }, "");
252
+ return `<${node.type}${attrs}>`;
253
+ }
254
+ function renderTagChildren(node) {
255
+ return typeof node.props.children === "string" ? node.props.children : node.props.children.reduce((html, child) => html + renderTag(child), "");
256
+ }
257
+ function renderTag(node) {
258
+ let html = renderTagStart(node);
259
+ if (node.props.children) {
260
+ html += renderTagChildren(node);
261
+ }
262
+ if (node.props.dangerouslySetInnerHTML) {
263
+ html += node.props.dangerouslySetInnerHTML.__html;
264
+ }
265
+ if (!isUnaryTag(node)) {
266
+ html += `</${node.type}>`;
267
+ }
268
+ return html;
269
+ }
270
+ function ensureNodeHasInertiaProp(node) {
271
+ return React.cloneElement(node, {
272
+ inertia: node.props["head-key"] !== void 0 ? node.props["head-key"] : ""
273
+ });
274
+ }
275
+ function renderNode(node) {
276
+ return renderTag(ensureNodeHasInertiaProp(node));
277
+ }
278
+ function renderNodes(nodes) {
279
+ const computed = React.Children.toArray(nodes).filter((node) => node).map((node) => renderNode(node));
280
+ if (title && !computed.find((tag) => tag.startsWith("<title"))) {
281
+ computed.push(`<title inertia>${title}</title>`);
282
+ }
283
+ return computed;
284
+ }
285
+ if (isServer) {
286
+ provider.update(renderNodes(children));
287
+ }
288
+ return null;
289
+ };
290
+ var Head_default = Head;
291
+
292
+ // src/Link.ts
293
+ import {
294
+ mergeDataIntoQueryString,
295
+ router as router4,
296
+ shouldIntercept
297
+ } from "@inertiajs/core";
298
+ import { createElement as createElement3, forwardRef, useEffect as useEffect4, useMemo as useMemo4, useRef, useState as useState3 } from "react";
299
+ var noop = () => void 0;
300
+ var Link = forwardRef(
301
+ ({
302
+ children,
303
+ as = "a",
304
+ data = {},
305
+ href,
306
+ method = "get",
307
+ preserveScroll = false,
308
+ preserveState = null,
309
+ replace = false,
310
+ only = [],
311
+ except = [],
312
+ headers = {},
313
+ queryStringArrayFormat = "brackets",
314
+ async = false,
315
+ onClick = noop,
316
+ onCancelToken = noop,
317
+ onBefore = noop,
318
+ onStart = noop,
319
+ onProgress = noop,
320
+ onFinish = noop,
321
+ onCancel = noop,
322
+ onSuccess = noop,
323
+ onError = noop,
324
+ prefetch = false,
325
+ cacheFor = 0,
326
+ ...props
327
+ }, ref) => {
328
+ const [inFlightCount, setInFlightCount] = useState3(0);
329
+ const hoverTimeout = useRef(null);
330
+ const _method = useMemo4(() => {
331
+ return typeof href === "object" ? href.method : method.toLowerCase();
332
+ }, [href, method]);
333
+ const _as = useMemo4(() => {
334
+ as = as.toLowerCase();
335
+ return _method !== "get" ? "button" : as;
336
+ }, [as, _method]);
337
+ const mergeDataArray = useMemo4(
338
+ () => mergeDataIntoQueryString(
339
+ _method,
340
+ typeof href === "object" ? href.url : href || "",
341
+ data,
342
+ queryStringArrayFormat
343
+ ),
344
+ [href, _method, data, queryStringArrayFormat]
345
+ );
346
+ const url = useMemo4(() => mergeDataArray[0], [mergeDataArray]);
347
+ const _data = useMemo4(() => mergeDataArray[1], [mergeDataArray]);
348
+ const baseParams = useMemo4(
349
+ () => ({
350
+ data: _data,
351
+ method: _method,
352
+ preserveScroll,
353
+ preserveState: preserveState ?? _method !== "get",
354
+ replace,
355
+ only,
356
+ except,
357
+ headers,
358
+ async
359
+ }),
360
+ [_data, _method, preserveScroll, preserveState, replace, only, except, headers, async]
361
+ );
362
+ const visitParams = useMemo4(
363
+ () => ({
364
+ ...baseParams,
365
+ onCancelToken,
366
+ onBefore,
367
+ onStart(event) {
368
+ setInFlightCount((count) => count + 1);
369
+ onStart(event);
370
+ },
371
+ onProgress,
372
+ onFinish(event) {
373
+ setInFlightCount((count) => count - 1);
374
+ onFinish(event);
375
+ },
376
+ onCancel,
377
+ onSuccess,
378
+ onError
379
+ }),
380
+ [baseParams, onCancelToken, onBefore, onStart, onProgress, onFinish, onCancel, onSuccess, onError]
381
+ );
382
+ const doPrefetch = () => {
383
+ router4.prefetch(url, baseParams, { cacheFor: cacheForValue });
384
+ };
385
+ const prefetchModes = useMemo4(
386
+ () => {
387
+ if (prefetch === true) {
388
+ return ["hover"];
389
+ }
390
+ if (prefetch === false) {
391
+ return [];
392
+ }
393
+ if (Array.isArray(prefetch)) {
394
+ return prefetch;
395
+ }
396
+ return [prefetch];
397
+ },
398
+ Array.isArray(prefetch) ? prefetch : [prefetch]
399
+ );
400
+ const cacheForValue = useMemo4(() => {
401
+ if (cacheFor !== 0) {
402
+ return cacheFor;
403
+ }
404
+ if (prefetchModes.length === 1 && prefetchModes[0] === "click") {
405
+ return 0;
406
+ }
407
+ return 3e4;
408
+ }, [cacheFor, prefetchModes]);
409
+ useEffect4(() => {
410
+ return () => {
411
+ clearTimeout(hoverTimeout.current);
412
+ };
413
+ }, []);
414
+ useEffect4(() => {
415
+ if (prefetchModes.includes("mount")) {
416
+ setTimeout(() => doPrefetch());
417
+ }
418
+ }, prefetchModes);
419
+ const regularEvents = {
420
+ onClick: (event) => {
421
+ onClick(event);
422
+ if (shouldIntercept(event)) {
423
+ event.preventDefault();
424
+ router4.visit(url, visitParams);
425
+ }
426
+ }
427
+ };
428
+ const prefetchHoverEvents = {
429
+ onMouseEnter: () => {
430
+ hoverTimeout.current = window.setTimeout(() => {
431
+ doPrefetch();
432
+ }, 75);
433
+ },
434
+ onMouseLeave: () => {
435
+ clearTimeout(hoverTimeout.current);
436
+ },
437
+ onClick: regularEvents.onClick
438
+ };
439
+ const prefetchClickEvents = {
440
+ onMouseDown: (event) => {
441
+ if (shouldIntercept(event)) {
442
+ event.preventDefault();
443
+ doPrefetch();
444
+ }
445
+ },
446
+ onMouseUp: (event) => {
447
+ event.preventDefault();
448
+ router4.visit(url, visitParams);
449
+ },
450
+ onClick: (event) => {
451
+ onClick(event);
452
+ if (shouldIntercept(event)) {
453
+ event.preventDefault();
454
+ }
455
+ }
456
+ };
457
+ const elProps = useMemo4(
458
+ () => ({
459
+ a: { href: url },
460
+ button: { type: "button" }
461
+ }),
462
+ [url]
463
+ );
464
+ return createElement3(
465
+ _as,
466
+ {
467
+ ...props,
468
+ ...elProps[_as] || {},
469
+ ref,
470
+ ...(() => {
471
+ if (prefetchModes.includes("hover")) {
472
+ return prefetchHoverEvents;
473
+ }
474
+ if (prefetchModes.includes("click")) {
475
+ return prefetchClickEvents;
476
+ }
477
+ return regularEvents;
478
+ })(),
479
+ "data-loading": inFlightCount > 0 ? "" : void 0
480
+ },
481
+ children
482
+ );
483
+ }
484
+ );
485
+ Link.displayName = "InertiaLink";
486
+ var Link_default = Link;
487
+
488
+ // src/useForm.ts
489
+ import {
490
+ router as router6
491
+ } from "@inertiajs/core";
492
+ import { cloneDeep, isEqual } from "es-toolkit";
493
+ import { get, has, set } from "es-toolkit/compat";
494
+ import { useCallback, useEffect as useEffect6, useLayoutEffect, useMemo as useMemo5, useRef as useRef2, useState as useState5 } from "react";
495
+
496
+ // src/useRemember.ts
497
+ import { router as router5 } from "@inertiajs/core";
498
+ import { useEffect as useEffect5, useState as useState4 } from "react";
499
+ function useRemember(initialState, key) {
500
+ const [state, setState] = useState4(() => {
501
+ const restored = router5.restore(key);
502
+ return restored !== void 0 ? restored : initialState;
503
+ });
504
+ useEffect5(() => {
505
+ router5.remember(state, key);
506
+ }, [state, key]);
507
+ return [state, setState];
508
+ }
509
+
510
+ // src/useForm.ts
511
+ function useForm(rememberKeyOrInitialValues, maybeInitialValues) {
512
+ const isMounted = useRef2(null);
513
+ const rememberKey = typeof rememberKeyOrInitialValues === "string" ? rememberKeyOrInitialValues : null;
514
+ const [defaults, setDefaults] = useState5(
515
+ (typeof rememberKeyOrInitialValues === "string" ? maybeInitialValues : rememberKeyOrInitialValues) || {}
516
+ );
517
+ const cancelToken = useRef2(null);
518
+ const recentlySuccessfulTimeoutId = useRef2(null);
519
+ const [data, setData] = rememberKey ? useRemember(defaults, `${rememberKey}:data`) : useState5(defaults);
520
+ const [errors, setErrors] = rememberKey ? useRemember({}, `${rememberKey}:errors`) : useState5({});
521
+ const [hasErrors, setHasErrors] = useState5(false);
522
+ const [processing, setProcessing] = useState5(false);
523
+ const [progress, setProgress] = useState5(null);
524
+ const [wasSuccessful, setWasSuccessful] = useState5(false);
525
+ const [recentlySuccessful, setRecentlySuccessful] = useState5(false);
526
+ const transform = useRef2((data2) => data2);
527
+ const isDirty = useMemo5(() => !isEqual(data, defaults), [data, defaults]);
528
+ useEffect6(() => {
529
+ isMounted.current = true;
530
+ return () => {
531
+ isMounted.current = false;
532
+ };
533
+ }, []);
534
+ const submit = useCallback(
535
+ (...args) => {
536
+ const objectPassed = typeof args[0] === "object";
537
+ const method = objectPassed ? args[0].method : args[0];
538
+ const url = objectPassed ? args[0].url : args[1];
539
+ const options = (objectPassed ? args[1] : args[2]) ?? {};
540
+ const _options = {
541
+ ...options,
542
+ onCancelToken: (token) => {
543
+ cancelToken.current = token;
544
+ if (options.onCancelToken) {
545
+ return options.onCancelToken(token);
546
+ }
547
+ },
548
+ onBefore: (visit) => {
549
+ setWasSuccessful(false);
550
+ setRecentlySuccessful(false);
551
+ clearTimeout(recentlySuccessfulTimeoutId.current);
552
+ if (options.onBefore) {
553
+ return options.onBefore(visit);
554
+ }
555
+ },
556
+ onStart: (visit) => {
557
+ setProcessing(true);
558
+ if (options.onStart) {
559
+ return options.onStart(visit);
560
+ }
561
+ },
562
+ onProgress: (event) => {
563
+ setProgress(event);
564
+ if (options.onProgress) {
565
+ return options.onProgress(event);
566
+ }
567
+ },
568
+ onSuccess: (page) => {
569
+ if (isMounted.current) {
570
+ setProcessing(false);
571
+ setProgress(null);
572
+ setErrors({});
573
+ setHasErrors(false);
574
+ setWasSuccessful(true);
575
+ setRecentlySuccessful(true);
576
+ setDefaults(cloneDeep(data));
577
+ recentlySuccessfulTimeoutId.current = setTimeout(() => {
578
+ if (isMounted.current) {
579
+ setRecentlySuccessful(false);
580
+ }
581
+ }, 2e3);
582
+ }
583
+ if (options.onSuccess) {
584
+ return options.onSuccess(page);
585
+ }
586
+ },
587
+ onError: (errors2) => {
588
+ if (isMounted.current) {
589
+ setProcessing(false);
590
+ setProgress(null);
591
+ setErrors(errors2);
592
+ setHasErrors(true);
593
+ }
594
+ if (options.onError) {
595
+ return options.onError(errors2);
596
+ }
597
+ },
598
+ onCancel: () => {
599
+ if (isMounted.current) {
600
+ setProcessing(false);
601
+ setProgress(null);
602
+ }
603
+ if (options.onCancel) {
604
+ return options.onCancel();
605
+ }
606
+ },
607
+ onFinish: (visit) => {
608
+ if (isMounted.current) {
609
+ setProcessing(false);
610
+ setProgress(null);
611
+ }
612
+ cancelToken.current = null;
613
+ if (options.onFinish) {
614
+ return options.onFinish(visit);
615
+ }
616
+ }
617
+ };
618
+ if (method === "delete") {
619
+ router6.delete(url, { ..._options, data: transform.current(data) });
620
+ } else {
621
+ router6[method](url, transform.current(data), _options);
622
+ }
623
+ },
624
+ [data, setErrors, transform]
625
+ );
626
+ const setDataFunction = useCallback(
627
+ (keyOrData, maybeValue) => {
628
+ if (typeof keyOrData === "string") {
629
+ setData((data2) => set(cloneDeep(data2), keyOrData, maybeValue));
630
+ } else if (typeof keyOrData === "function") {
631
+ setData((data2) => keyOrData(data2));
632
+ } else {
633
+ setData(keyOrData);
634
+ }
635
+ },
636
+ [setData]
637
+ );
638
+ const [dataAsDefaults, setDataAsDefaults] = useState5(false);
639
+ const setDefaultsFunction = useCallback(
640
+ (fieldOrFields, maybeValue) => {
641
+ if (typeof fieldOrFields === "undefined") {
642
+ setDefaults(data);
643
+ setDataAsDefaults(true);
644
+ } else {
645
+ setDefaults((defaults2) => {
646
+ return typeof fieldOrFields === "string" ? set(cloneDeep(defaults2), fieldOrFields, maybeValue) : Object.assign(cloneDeep(defaults2), fieldOrFields);
647
+ });
648
+ }
649
+ },
650
+ [data, setDefaults]
651
+ );
652
+ useLayoutEffect(() => {
653
+ if (!dataAsDefaults) {
654
+ return;
655
+ }
656
+ if (isDirty) {
657
+ setDefaults(data);
658
+ }
659
+ setDataAsDefaults(false);
660
+ }, [dataAsDefaults]);
661
+ const reset = useCallback(
662
+ (...fields) => {
663
+ if (fields.length === 0) {
664
+ setData(defaults);
665
+ } else {
666
+ setData(
667
+ (data2) => fields.filter((key) => has(defaults, key)).reduce(
668
+ (carry, key) => {
669
+ return set(carry, key, get(defaults, key));
670
+ },
671
+ { ...data2 }
672
+ )
673
+ );
674
+ }
675
+ },
676
+ [setData, defaults]
677
+ );
678
+ const setError = useCallback(
679
+ (fieldOrFields, maybeValue) => {
680
+ setErrors((errors2) => {
681
+ const newErrors = {
682
+ ...errors2,
683
+ ...typeof fieldOrFields === "string" ? { [fieldOrFields]: maybeValue } : fieldOrFields
684
+ };
685
+ setHasErrors(Object.keys(newErrors).length > 0);
686
+ return newErrors;
687
+ });
688
+ },
689
+ [setErrors, setHasErrors]
690
+ );
691
+ const clearErrors = useCallback(
692
+ (...fields) => {
693
+ setErrors((errors2) => {
694
+ const newErrors = Object.keys(errors2).reduce(
695
+ (carry, field) => ({
696
+ ...carry,
697
+ ...fields.length > 0 && !fields.includes(field) ? { [field]: errors2[field] } : {}
698
+ }),
699
+ {}
700
+ );
701
+ setHasErrors(Object.keys(newErrors).length > 0);
702
+ return newErrors;
703
+ });
704
+ },
705
+ [setErrors, setHasErrors]
706
+ );
707
+ const resetAndClearErrors = useCallback(
708
+ (...fields) => {
709
+ reset(...fields);
710
+ clearErrors(...fields);
711
+ },
712
+ [reset, clearErrors]
713
+ );
714
+ const createSubmitMethod = (method) => (url, options) => {
715
+ submit(method, url, options);
716
+ };
717
+ const getMethod = useCallback(createSubmitMethod("get"), [submit]);
718
+ const post = useCallback(createSubmitMethod("post"), [submit]);
719
+ const put = useCallback(createSubmitMethod("put"), [submit]);
720
+ const patch = useCallback(createSubmitMethod("patch"), [submit]);
721
+ const deleteMethod = useCallback(createSubmitMethod("delete"), [submit]);
722
+ const cancel = useCallback(() => {
723
+ if (cancelToken.current) {
724
+ cancelToken.current.cancel();
725
+ }
726
+ }, []);
727
+ const transformFunction = useCallback((callback) => {
728
+ transform.current = callback;
729
+ }, []);
730
+ return {
731
+ data,
732
+ setData: setDataFunction,
733
+ isDirty,
734
+ errors,
735
+ hasErrors,
736
+ processing,
737
+ progress,
738
+ wasSuccessful,
739
+ recentlySuccessful,
740
+ transform: transformFunction,
741
+ setDefaults: setDefaultsFunction,
742
+ reset,
743
+ setError,
744
+ clearErrors,
745
+ resetAndClearErrors,
746
+ submit,
747
+ get: getMethod,
748
+ post,
749
+ put,
750
+ patch,
751
+ delete: deleteMethod,
752
+ cancel
753
+ };
754
+ }
755
+
756
+ // src/usePoll.ts
757
+ import { router as router7 } from "@inertiajs/core";
758
+ import { useEffect as useEffect7, useRef as useRef3 } from "react";
759
+ function usePoll(interval, requestOptions = {}, options = {
760
+ keepAlive: false,
761
+ autoStart: true
762
+ }) {
763
+ const pollRef = useRef3(
764
+ router7.poll(interval, requestOptions, {
765
+ ...options,
766
+ autoStart: false
767
+ })
768
+ );
769
+ useEffect7(() => {
770
+ if (options.autoStart ?? true) {
771
+ pollRef.current.start();
772
+ }
773
+ return () => pollRef.current.stop();
774
+ }, []);
775
+ return {
776
+ stop: pollRef.current.stop,
777
+ start: pollRef.current.start
778
+ };
779
+ }
780
+
781
+ // src/usePrefetch.ts
782
+ import { router as router8 } from "@inertiajs/core";
783
+ import { useEffect as useEffect8, useState as useState6 } from "react";
784
+ function usePrefetch(options = {}) {
785
+ const cached = typeof window === "undefined" ? null : router8.getCached(window.location.pathname, options);
786
+ const inFlight = typeof window === "undefined" ? null : router8.getPrefetching(window.location.pathname, options);
787
+ const [lastUpdatedAt, setLastUpdatedAt] = useState6(cached?.staleTimestamp || null);
788
+ const [isPrefetching, setIsPrefetching] = useState6(inFlight !== null);
789
+ const [isPrefetched, setIsPrefetched] = useState6(cached !== null);
790
+ useEffect8(() => {
791
+ const onPrefetchingListener = router8.on("prefetching", (e) => {
792
+ if (e.detail.visit.url.pathname === window.location.pathname) {
793
+ setIsPrefetching(true);
794
+ }
795
+ });
796
+ const onPrefetchedListener = router8.on("prefetched", (e) => {
797
+ if (e.detail.visit.url.pathname === window.location.pathname) {
798
+ setIsPrefetching(false);
799
+ setIsPrefetched(true);
800
+ setLastUpdatedAt(e.detail.fetchedAt);
801
+ }
802
+ });
803
+ return () => {
804
+ onPrefetchedListener();
805
+ onPrefetchingListener();
806
+ };
807
+ }, []);
808
+ return {
809
+ lastUpdatedAt,
810
+ isPrefetching,
811
+ isPrefetched,
812
+ flush: () => router8.flush(window.location.pathname, options)
813
+ };
814
+ }
815
+
816
+ // src/WhenVisible.ts
817
+ import { router as router9 } from "@inertiajs/core";
818
+ import { createElement as createElement4, useCallback as useCallback2, useEffect as useEffect9, useRef as useRef4, useState as useState7 } from "react";
819
+ var WhenVisible = ({ children, data, params, buffer, as, always, fallback }) => {
820
+ always = always ?? false;
821
+ as = as ?? "div";
822
+ fallback = fallback ?? null;
823
+ const [loaded, setLoaded] = useState7(false);
824
+ const hasFetched = useRef4(false);
825
+ const fetching = useRef4(false);
826
+ const ref = useRef4(null);
827
+ const getReloadParams = useCallback2(() => {
828
+ if (data) {
829
+ return {
830
+ only: Array.isArray(data) ? data : [data]
831
+ };
832
+ }
833
+ if (!params) {
834
+ throw new Error("You must provide either a `data` or `params` prop.");
835
+ }
836
+ return params;
837
+ }, [params, data]);
838
+ useEffect9(() => {
839
+ if (!ref.current) {
840
+ return;
841
+ }
842
+ const observer = new IntersectionObserver(
843
+ (entries) => {
844
+ if (!entries[0].isIntersecting) {
845
+ return;
846
+ }
847
+ if (!always && hasFetched.current) {
848
+ observer.disconnect();
849
+ }
850
+ if (fetching.current) {
851
+ return;
852
+ }
853
+ hasFetched.current = true;
854
+ fetching.current = true;
855
+ const reloadParams = getReloadParams();
856
+ router9.reload({
857
+ ...reloadParams,
858
+ onStart: (e) => {
859
+ fetching.current = true;
860
+ reloadParams.onStart?.(e);
861
+ },
862
+ onFinish: (e) => {
863
+ setLoaded(true);
864
+ fetching.current = false;
865
+ reloadParams.onFinish?.(e);
866
+ if (!always) {
867
+ observer.disconnect();
868
+ }
869
+ }
870
+ });
871
+ },
872
+ {
873
+ rootMargin: `${buffer || 0}px`
874
+ }
875
+ );
876
+ observer.observe(ref.current);
877
+ return () => {
878
+ observer.disconnect();
879
+ };
880
+ }, [ref, getReloadParams, buffer]);
881
+ if (always || !loaded) {
882
+ return createElement4(
883
+ as,
884
+ {
885
+ props: null,
886
+ ref
887
+ },
888
+ loaded ? children : fallback
889
+ );
890
+ }
891
+ return loaded ? children : null;
892
+ };
893
+ WhenVisible.displayName = "InertiaWhenVisible";
894
+ var WhenVisible_default = WhenVisible;
895
+
896
+ // src/index.ts
897
+ var router3 = Router;
898
+ export {
899
+ Deferred_default as Deferred,
900
+ Head_default as Head,
901
+ Link_default as Link,
902
+ WhenVisible_default as WhenVisible,
903
+ createInertiaApp,
904
+ router3 as router,
905
+ useForm,
906
+ usePage,
907
+ usePoll,
908
+ usePrefetch,
909
+ useRemember
910
+ };
2
911
  //# sourceMappingURL=index.esm.js.map