@inertiajs/react 1.0.0-beta.1

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) Jonathan Reinink <jonathan@reinink.ca>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,2 @@
1
+ import{createHeadManager as n,router as e,setupProgress as r,shouldIntercept as t,mergeDataIntoQueryString as o}from"@inertiajs/core";export{router}from"@inertiajs/core";import i,{createContext as u,useState as a,useMemo as c,useEffect as s,createElement as l,useContext as f,forwardRef as p,useCallback as d,useRef as v}from"react";import y from"lodash.isequal";function h(){return(h=Object.assign?Object.assign.bind():function(n){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var t in r)Object.prototype.hasOwnProperty.call(r,t)&&(n[t]=r[t])}return n}).apply(this,arguments)}var m=u();m.displayName="InertiaHeadContext";var g=u();function k(r){var t=r.children,o=r.initialPage,i=r.resolveComponent,u=r.titleCallback,f=r.onHeadUpdate,p=a({component:r.initialComponent||null,page:o,key:null}),d=p[0],v=p[1],y=c(function(){return n("undefined"==typeof window,u||function(n){return n},f||function(){})},[]);if(s(function(){e.init({initialPage:o,resolveComponent:i,swapComponent:function(n){var e=n.component,r=n.page,t=n.preserveState;try{return v(function(n){return{component:e,page:r,key:t?n.key:Date.now()}}),Promise.resolve()}catch(n){return Promise.reject(n)}}}),e.on("navigate",function(){return y.forceUpdate()})},[]),!d.component)return l(m.Provider,{value:y},l(g.Provider,{value:d.page},null));var k=t||function(n){var e=n.Component,r=n.props,t=l(e,h({key:n.key},r));return"function"==typeof e.layout?e.layout(t):Array.isArray(e.layout)?e.layout.concat(t).reverse().reduce(function(n,e){return l(e,h({children:n},r))}):t};return l(m.Provider,{value:y},l(g.Provider,{value:d.page},k({Component:d.component,key:d.key,props:d.page.props})))}g.displayName="InertiaPageContext",k.displayName="Inertia";var C=function(n){try{var e,t,o,i,u,a,c,s,f;t=void 0===(e=n.id)?"app":e,o=n.resolve,i=n.setup,u=n.title,c=void 0===(a=n.progress)?{}:a,s=n.page,f=n.render;var p="undefined"==typeof window,d=p?null:document.getElementById(t),v=s||JSON.parse(d.dataset.page),y=function(n){return Promise.resolve(o(n)).then(function(n){return n.default||n})},h=[];return Promise.resolve(y(v.component).then(function(n){return i({el:d,App:k,props:{initialPage:v,initialComponent:n,resolveComponent:y,titleCallback:u,onHeadUpdate:p?function(n){return h=n}:null}})})).then(function(n){return!p&&c&&r(c),function(){if(p)return Promise.resolve(f(l("div",{id:t,"data-page":JSON.stringify(v)},n))).then(function(n){return{head:h,body:n}})}()})}catch(n){return Promise.reject(n)}};function S(n){var e,r,t=n.children,o=n.title,u=f(m),a=c(function(){return u.createProvider()},[u]);return s(function(){return function(){a.disconnect()}},[a]),a.update((e=t,r=(Array.isArray(e)?e:[e]).filter(function(n){return n}).map(function(n){return function(n){return function n(e){var r=function(n){var e=Object.keys(n.props).reduce(function(e,r){if(["head-key","children","dangerouslySetInnerHTML"].includes(r))return e;var t=n.props[r];return""===t?e+" "+r:e+" "+r+'="'+t+'"'},"");return"<"+n.type+e+">"}(e);return e.props.children&&(r+=function(e){return"string"==typeof e.props.children?e.props.children:e.props.children.reduce(function(e,r){return e+n(r)},"")}(e)),e.props.dangerouslySetInnerHTML&&(r+=e.props.dangerouslySetInnerHTML.__html),function(n){return["area","base","br","col","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"].indexOf(n.type)>-1}(e)||(r+="</"+e.type+">"),r}(function(n){return i.cloneElement(n,{inertia:void 0!==n.props["head-key"]?n.props["head-key"]:""})}(n))}(n)}),o&&!r.find(function(n){return n.startsWith("<title")})&&r.push("<title inertia>"+o+"</title>"),r)),null}var P=["children","as","data","href","method","preserveScroll","preserveState","replace","only","headers","queryStringArrayFormat","onClick","onCancelToken","onBefore","onStart","onProgress","onFinish","onCancel","onSuccess","onError"],b=function(){},w=p(function(n,r){var i=n.children,u=n.as,a=void 0===u?"a":u,c=n.data,s=void 0===c?{}:c,f=n.href,p=n.method,v=void 0===p?"get":p,y=n.preserveScroll,m=void 0!==y&&y,g=n.preserveState,k=void 0===g?null:g,C=n.replace,S=void 0!==C&&C,w=n.only,O=void 0===w?[]:w,T=n.headers,E=void 0===T?{}:T,j=n.queryStringArrayFormat,F=void 0===j?"brackets":j,L=n.onClick,A=void 0===L?b:L,I=n.onCancelToken,x=void 0===I?b:I,B=n.onBefore,H=void 0===B?b:B,D=n.onStart,N=void 0===D?b:D,U=n.onProgress,q=void 0===U?b:U,M=n.onFinish,J=void 0===M?b:M,W=n.onCancel,_=void 0===W?b:W,z=n.onSuccess,G=void 0===z?b:z,K=n.onError,Q=void 0===K?b:K,R=function(n,e){if(null==n)return{};var r,t,o={},i=Object.keys(n);for(t=0;t<i.length;t++)e.indexOf(r=i[t])>=0||(o[r]=n[r]);return o}(n,P),V=d(function(n){A(n),t(n)&&(n.preventDefault(),e.visit(f,{data:s,method:v,preserveScroll:m,preserveState:null!=k?k:"get"!==v,replace:S,only:O,headers:E,onCancelToken:x,onBefore:H,onStart:N,onProgress:q,onFinish:J,onCancel:_,onSuccess:G,onError:Q}))},[s,f,v,m,k,S,O,E,A,x,H,N,q,J,_,G,Q]);a=a.toLowerCase(),v=v.toLowerCase();var X=o(v,f||"",s,F);return f=X[0],s=X[1],"a"===a&&"get"!==v&&console.warn('Creating POST/PUT/PATCH/DELETE <a> links is discouraged as it causes "Open Link in New Tab/Window" accessibility issues.\n\nPlease specify a more appropriate element using the "as" attribute. For example:\n\n<Link href="'+f+'" method="'+v+'" as="button">...</Link>'),l(a,h({},R,"a"===a?{href:f}:{},{ref:r,onClick:V}),i)});function O(n,r){var t=a(function(){var t=e.restore(r);return void 0!==t?t:n}),o=t[0],i=t[1];return s(function(){e.remember(o,r)},[o,r]),[o,i]}function T(){var n=[].slice.call(arguments),r=v(null),t="string"==typeof n[0]?n[0]:null,o=a(("string"==typeof n[0]?n[1]:n[0])||{}),i=o[0],u=o[1],c=v(null),l=v(null),f=t?O(i,t+":data"):a(i),p=f[0],m=f[1],g=t?O({},t+":errors"):a({}),k=g[0],C=g[1],S=a(!1),P=S[0],b=S[1],w=a(!1),T=w[0],E=w[1],j=a(null),F=j[0],L=j[1],A=a(!1),I=A[0],x=A[1],B=a(!1),H=B[0],D=B[1],N=function(n){return n};s(function(){return r.current=!0,function(){r.current=!1}},[]);var U=d(function(n,t,o){void 0===o&&(o={});var i=h({},o,{onCancelToken:function(n){if(c.current=n,o.onCancelToken)return o.onCancelToken(n)},onBefore:function(n){if(x(!1),D(!1),clearTimeout(l.current),o.onBefore)return o.onBefore(n)},onStart:function(n){if(E(!0),o.onStart)return o.onStart(n)},onProgress:function(n){if(L(n),o.onProgress)return o.onProgress(n)},onSuccess:function(n){if(r.current&&(E(!1),L(null),C({}),b(!1),x(!0),D(!0),l.current=setTimeout(function(){r.current&&D(!1)},2e3)),o.onSuccess)return o.onSuccess(n)},onError:function(n){if(r.current&&(E(!1),L(null),C(n),b(!0)),o.onError)return o.onError(n)},onCancel:function(){if(r.current&&(E(!1),L(null)),o.onCancel)return o.onCancel()},onFinish:function(){if(r.current&&(E(!1),L(null)),c.current=null,o.onFinish)return o.onFinish()}});"delete"===n?e.delete(t,h({},i,{data:N(p)})):e[n](t,N(p),i)},[p,C]);return{data:p,setData:function(n,e){var r;m("string"==typeof n?h({},p,((r={})[n]=e,r)):"function"==typeof n?function(e){return n(e)}:n)},isDirty:!y(p,i),errors:k,hasErrors:P,processing:T,progress:F,wasSuccessful:I,recentlySuccessful:H,transform:function(n){N=n},setDefaults:function(n,e){u(void 0===n?function(){return p}:function(r){var t;return h({},r,e?((t={})[n]=e,t):n)})},reset:function(){var n=[].slice.call(arguments);m(0===n.length?i:Object.keys(i).filter(function(e){return n.includes(e)}).reduce(function(n,e){return n[e]=i[e],n},h({},p)))},setError:function(n,e){C(function(r){var t,o=h({},r,e?((t={})[n]=e,t):n);return b(Object.keys(o).length>0),o})},clearErrors:function(){var n=[].slice.call(arguments);C(function(e){var r=Object.keys(e).reduce(function(r,t){var o;return h({},r,n.length>0&&!n.includes(t)?((o={})[t]=e[t],o):{})},{});return b(Object.keys(r).length>0),r})},submit:U,get:function(n,e){U("get",n,e)},post:function(n,e){U("post",n,e)},put:function(n,e){U("put",n,e)},patch:function(n,e){U("patch",n,e)},delete:function(n,e){U("delete",n,e)},cancel:function(){c.current&&c.current.cancel()}}}function E(){var n=f(g);if(!n)throw new Error("usePage must be used within the Inertia component");return n}export{S as Head,w as Link,C as createInertiaApp,T as useForm,E as usePage,O as useRemember};
2
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":["../src/HeadContext.js","../src/PageContext.js","../src/App.js","../src/createInertiaApp.js","../src/Head.js","../src/Link.js","../src/useRemember.js","../src/useForm.js","../src/usePage.js"],"sourcesContent":["import { createContext } from 'react'\n\nconst headContext = createContext()\nheadContext.displayName = 'InertiaHeadContext'\n\nexport default headContext\n","import { createContext } from 'react'\n\nconst pageContext = createContext()\npageContext.displayName = 'InertiaPageContext'\n\nexport default pageContext\n","import { createHeadManager, router } from '@inertiajs/core'\nimport { createElement, useEffect, useMemo, useState } from 'react'\nimport HeadContext from './HeadContext'\nimport PageContext from './PageContext'\n\nexport default function App({\n children,\n initialPage,\n initialComponent,\n resolveComponent,\n titleCallback,\n onHeadUpdate,\n}) {\n const [current, setCurrent] = useState({\n component: initialComponent || null,\n page: initialPage,\n key: null,\n })\n\n const headManager = useMemo(() => {\n return createHeadManager(\n typeof window === 'undefined',\n titleCallback || ((title) => title),\n onHeadUpdate || (() => {}),\n )\n }, [])\n\n useEffect(() => {\n router.init({\n initialPage,\n resolveComponent,\n swapComponent: async ({ component, page, preserveState }) => {\n setCurrent((current) => ({\n component,\n page,\n key: preserveState ? current.key : Date.now(),\n }))\n },\n })\n\n router.on('navigate', () => headManager.forceUpdate())\n }, [])\n\n if (!current.component) {\n return createElement(\n HeadContext.Provider,\n { value: headManager },\n createElement(PageContext.Provider, { value: current.page }, null),\n )\n }\n\n const renderChildren =\n children ||\n (({ Component, props, key }) => {\n const child = createElement(Component, { key, ...props })\n\n if (typeof Component.layout === 'function') {\n return Component.layout(child)\n }\n\n if (Array.isArray(Component.layout)) {\n return Component.layout\n .concat(child)\n .reverse()\n .reduce((children, Layout) => createElement(Layout, { children, ...props }))\n }\n\n return child\n })\n\n return createElement(\n HeadContext.Provider,\n { value: headManager },\n createElement(\n PageContext.Provider,\n { value: current.page },\n renderChildren({\n Component: current.component,\n key: current.key,\n props: current.page.props,\n }),\n ),\n )\n}\n\nApp.displayName = 'Inertia'\n","import { setupProgress } from '@inertiajs/core'\nimport { createElement } from 'react'\nimport App from './App'\n\nexport default async function createInertiaApp({ id = 'app', resolve, setup, title, progress = {}, page, render }) {\n const isServer = typeof window === 'undefined'\n const el = isServer ? null : document.getElementById(id)\n const initialPage = page || JSON.parse(el.dataset.page)\n const resolveComponent = (name) => Promise.resolve(resolve(name)).then((module) => module.default || module)\n\n let head = []\n\n const reactApp = await resolveComponent(initialPage.component).then((initialComponent) => {\n return setup({\n el,\n App,\n props: {\n initialPage,\n initialComponent,\n resolveComponent,\n titleCallback: title,\n onHeadUpdate: isServer ? (elements) => (head = elements) : null,\n },\n })\n })\n\n if (!isServer && progress) {\n setupProgress(progress)\n }\n\n if (isServer) {\n const body = await render(\n createElement(\n 'div',\n {\n id,\n 'data-page': JSON.stringify(initialPage),\n },\n reactApp,\n ),\n )\n\n return { head, body }\n }\n}\n","import React, { useContext, useEffect, useMemo } from 'react'\nimport HeadContext from './HeadContext'\n\nexport default function Head({ children, title }) {\n const headManager = useContext(HeadContext)\n const provider = useMemo(() => headManager.createProvider(), [headManager])\n\n useEffect(() => {\n return () => {\n provider.disconnect()\n }\n }, [provider])\n\n function isUnaryTag(node) {\n return (\n [\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n ].indexOf(node.type) > -1\n )\n }\n\n function renderTagStart(node) {\n const attrs = Object.keys(node.props).reduce((carry, name) => {\n if (['head-key', 'children', 'dangerouslySetInnerHTML'].includes(name)) {\n return carry\n }\n const value = node.props[name]\n if (value === '') {\n return carry + ` ${name}`\n } else {\n return carry + ` ${name}=\"${value}\"`\n }\n }, '')\n return `<${node.type}${attrs}>`\n }\n\n function renderTagChildren(node) {\n return typeof node.props.children === 'string'\n ? node.props.children\n : node.props.children.reduce((html, child) => html + renderTag(child), '')\n }\n\n function renderTag(node) {\n let html = renderTagStart(node)\n if (node.props.children) {\n html += renderTagChildren(node)\n }\n if (node.props.dangerouslySetInnerHTML) {\n html += node.props.dangerouslySetInnerHTML.__html\n }\n if (!isUnaryTag(node)) {\n html += `</${node.type}>`\n }\n return html\n }\n\n function ensureNodeHasInertiaProp(node) {\n return React.cloneElement(node, {\n inertia: node.props['head-key'] !== undefined ? node.props['head-key'] : '',\n })\n }\n\n function renderNode(node) {\n return renderTag(ensureNodeHasInertiaProp(node))\n }\n\n function renderNodes(nodes) {\n const computed = (Array.isArray(nodes) ? nodes : [nodes]).filter((node) => node).map((node) => renderNode(node))\n if (title && !computed.find((tag) => tag.startsWith('<title'))) {\n computed.push(`<title inertia>${title}</title>`)\n }\n return computed\n }\n\n provider.update(renderNodes(children))\n\n return null\n}\n","import { mergeDataIntoQueryString, router, shouldIntercept } from '@inertiajs/core'\nimport { createElement, forwardRef, useCallback } from 'react'\n\nconst noop = () => undefined\n\nexport default forwardRef(function Link(\n {\n children,\n as = 'a',\n data = {},\n href,\n method = 'get',\n preserveScroll = false,\n preserveState = null,\n replace = false,\n only = [],\n headers = {},\n queryStringArrayFormat = 'brackets',\n onClick = noop,\n onCancelToken = noop,\n onBefore = noop,\n onStart = noop,\n onProgress = noop,\n onFinish = noop,\n onCancel = noop,\n onSuccess = noop,\n onError = noop,\n ...props\n },\n ref,\n) {\n const visit = useCallback(\n (event) => {\n onClick(event)\n\n if (shouldIntercept(event)) {\n event.preventDefault()\n\n router.visit(href, {\n data,\n method,\n preserveScroll,\n preserveState: preserveState ?? method !== 'get',\n replace,\n only,\n headers,\n onCancelToken,\n onBefore,\n onStart,\n onProgress,\n onFinish,\n onCancel,\n onSuccess,\n onError,\n })\n }\n },\n [\n data,\n href,\n method,\n preserveScroll,\n preserveState,\n replace,\n only,\n headers,\n onClick,\n onCancelToken,\n onBefore,\n onStart,\n onProgress,\n onFinish,\n onCancel,\n onSuccess,\n onError,\n ],\n )\n\n as = as.toLowerCase()\n method = method.toLowerCase()\n const [_href, _data] = mergeDataIntoQueryString(method, href || '', data, queryStringArrayFormat)\n href = _href\n data = _data\n\n if (as === 'a' && method !== 'get') {\n console.warn(\n `Creating POST/PUT/PATCH/DELETE <a> links is discouraged as it causes \"Open Link in New Tab/Window\" accessibility issues.\\n\\nPlease specify a more appropriate element using the \"as\" attribute. For example:\\n\\n<Link href=\"${href}\" method=\"${method}\" as=\"button\">...</Link>`,\n )\n }\n\n return createElement(\n as,\n {\n ...props,\n ...(as === 'a' ? { href } : {}),\n ref,\n onClick: visit,\n },\n children,\n )\n})\n","import { router } from '@inertiajs/core'\nimport { useEffect, useState } from 'react'\n\nexport default function useRemember(initialState, key) {\n const [state, setState] = useState(() => {\n const restored = router.restore(key)\n\n return restored !== undefined ? restored : initialState\n })\n\n useEffect(() => {\n router.remember(state, key)\n }, [state, key])\n\n return [state, setState]\n}\n\nexport function useRememberedState(initialState, key) {\n console.warn(\n 'The \"useRememberedState\" hook has been deprecated and will be removed in a future release. Use \"useRemember\" instead.',\n )\n return useRemember(initialState, key)\n}\n","import { router } from '@inertiajs/core'\nimport isEqual from 'lodash.isequal'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport useRemember from './useRemember'\n\nexport default function useForm(...args) {\n const isMounted = useRef(null)\n const rememberKey = typeof args[0] === 'string' ? args[0] : null\n const [defaults, setDefaults] = useState((typeof args[0] === 'string' ? args[1] : args[0]) || {})\n const cancelToken = useRef(null)\n const recentlySuccessfulTimeoutId = useRef(null)\n const [data, setData] = rememberKey ? useRemember(defaults, `${rememberKey}:data`) : useState(defaults)\n const [errors, setErrors] = rememberKey ? useRemember({}, `${rememberKey}:errors`) : useState({})\n const [hasErrors, setHasErrors] = useState(false)\n const [processing, setProcessing] = useState(false)\n const [progress, setProgress] = useState(null)\n const [wasSuccessful, setWasSuccessful] = useState(false)\n const [recentlySuccessful, setRecentlySuccessful] = useState(false)\n let transform = (data) => data\n\n useEffect(() => {\n isMounted.current = true\n return () => {\n isMounted.current = false\n }\n }, [])\n\n const submit = useCallback(\n (method, url, options = {}) => {\n const _options = {\n ...options,\n onCancelToken: (token) => {\n cancelToken.current = token\n\n if (options.onCancelToken) {\n return options.onCancelToken(token)\n }\n },\n onBefore: (visit) => {\n setWasSuccessful(false)\n setRecentlySuccessful(false)\n clearTimeout(recentlySuccessfulTimeoutId.current)\n\n if (options.onBefore) {\n return options.onBefore(visit)\n }\n },\n onStart: (visit) => {\n setProcessing(true)\n\n if (options.onStart) {\n return options.onStart(visit)\n }\n },\n onProgress: (event) => {\n setProgress(event)\n\n if (options.onProgress) {\n return options.onProgress(event)\n }\n },\n onSuccess: (page) => {\n if (isMounted.current) {\n setProcessing(false)\n setProgress(null)\n setErrors({})\n setHasErrors(false)\n setWasSuccessful(true)\n setRecentlySuccessful(true)\n recentlySuccessfulTimeoutId.current = setTimeout(() => {\n if (isMounted.current) {\n setRecentlySuccessful(false)\n }\n }, 2000)\n }\n\n if (options.onSuccess) {\n return options.onSuccess(page)\n }\n },\n onError: (errors) => {\n if (isMounted.current) {\n setProcessing(false)\n setProgress(null)\n setErrors(errors)\n setHasErrors(true)\n }\n\n if (options.onError) {\n return options.onError(errors)\n }\n },\n onCancel: () => {\n if (isMounted.current) {\n setProcessing(false)\n setProgress(null)\n }\n\n if (options.onCancel) {\n return options.onCancel()\n }\n },\n onFinish: () => {\n if (isMounted.current) {\n setProcessing(false)\n setProgress(null)\n }\n\n cancelToken.current = null\n\n if (options.onFinish) {\n return options.onFinish()\n }\n },\n }\n\n if (method === 'delete') {\n router.delete(url, { ..._options, data: transform(data) })\n } else {\n router[method](url, transform(data), _options)\n }\n },\n [data, setErrors],\n )\n\n return {\n data,\n setData(key, value) {\n if (typeof key === 'string') {\n setData({ ...data, [key]: value })\n } else if (typeof key === 'function') {\n setData((data) => key(data))\n } else {\n setData(key)\n }\n },\n isDirty: !isEqual(data, defaults),\n errors,\n hasErrors,\n processing,\n progress,\n wasSuccessful,\n recentlySuccessful,\n transform(callback) {\n transform = callback\n },\n setDefaults(key, value) {\n if (typeof key === 'undefined') {\n setDefaults(() => data)\n } else {\n setDefaults((defaults) => ({\n ...defaults,\n ...(value ? { [key]: value } : key),\n }))\n }\n },\n reset(...fields) {\n if (fields.length === 0) {\n setData(defaults)\n } else {\n setData(\n Object.keys(defaults)\n .filter((key) => fields.includes(key))\n .reduce(\n (carry, key) => {\n carry[key] = defaults[key]\n return carry\n },\n { ...data },\n ),\n )\n }\n },\n setError(key, value) {\n setErrors((errors) => {\n const newErrors = {\n ...errors,\n ...(value ? { [key]: value } : key),\n }\n setHasErrors(Object.keys(newErrors).length > 0)\n return newErrors\n })\n },\n clearErrors(...fields) {\n setErrors((errors) => {\n const newErrors = Object.keys(errors).reduce(\n (carry, field) => ({\n ...carry,\n ...(fields.length > 0 && !fields.includes(field) ? { [field]: errors[field] } : {}),\n }),\n {},\n )\n setHasErrors(Object.keys(newErrors).length > 0)\n return newErrors\n })\n },\n submit,\n get(url, options) {\n submit('get', url, options)\n },\n post(url, options) {\n submit('post', url, options)\n },\n put(url, options) {\n submit('put', url, options)\n },\n patch(url, options) {\n submit('patch', url, options)\n },\n delete(url, options) {\n submit('delete', url, options)\n },\n cancel() {\n if (cancelToken.current) {\n cancelToken.current.cancel()\n }\n },\n }\n}\n","import { useContext } from 'react'\nimport PageContext from './PageContext'\n\nexport default function usePage() {\n const page = useContext(PageContext)\n\n if (!page) {\n throw new Error('usePage must be used within the Inertia component')\n }\n\n return page\n}\n"],"names":["createContext","headContext","displayName","children","initialPage","resolveComponent","titleCallback","onHeadUpdate","useState","component","initialComponent","page","key","current","setCurrent","useMemo","title","useEffect","router","init","swapComponent","preserveState","Date","now","on","forceUpdate","HeadContext","Provider","value","headManager","createElement","PageContext","Component","props","layout","child","Array","isArray","concat","reverse","reduce","Layout","renderChildren","pageContext","App","id","resolve","setup","progress","render","isServer","document","getElementById","JSON","parse","el","dataset","name","then","module","elements","reactApp","setupProgress","data-page","stringify","head","body","nodes","useContext","createProvider","provider","disconnect","update","filter","node","map","Object","keys","carry","includes","type","attrs","renderTagStart","html","renderTag","renderTagChildren","dangerouslySetInnerHTML","__html","indexOf","isUnaryTag","cloneElement","inertia","undefined","ensureNodeHasInertiaProp","computed","find","tag","startsWith","push","ref","as","data","href","method","preserveScroll","replace","only","headers","queryStringArrayFormat","onClick","noop","onCancelToken","onBefore","onStart","onProgress","onFinish","onCancel","onSuccess","onError","useCallback","event","shouldIntercept","preventDefault","visit","toLowerCase","mergeDataIntoQueryString","console","warn","initialState","restore","restored","state","setState","remember","useRef","args","defaults","setDefaults","rememberKey","useRemember","setData","errors","setErrors","hasErrors","setHasErrors","processing","setProcessing","setProgress","wasSuccessful","setWasSuccessful","recentlySuccessful","setRecentlySuccessful","isMounted","url","options","token","cancelToken","clearTimeout","recentlySuccessfulTimeoutId","setTimeout","_options","transform","isDirty","isEqual","callback","reset","fields","length","setError","newErrors","clearErrors","field","submit","get","post","put","patch","cancel"],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}var n=require("@inertiajs/core"),r=require("react"),t=e(r),o=e(require("lodash.isequal"));function u(){return(u=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var t in r)Object.prototype.hasOwnProperty.call(r,t)&&(e[t]=r[t])}return e}).apply(this,arguments)}var i=r.createContext();i.displayName="InertiaHeadContext";var a=r.createContext();function c(e){var t=e.children,o=e.initialPage,c=e.resolveComponent,s=e.titleCallback,l=e.onHeadUpdate,f=r.useState({component:e.initialComponent||null,page:o,key:null}),p=f[0],d=f[1],v=r.useMemo(function(){return n.createHeadManager("undefined"==typeof window,s||function(e){return e},l||function(){})},[]);if(r.useEffect(function(){n.router.init({initialPage:o,resolveComponent:c,swapComponent:function(e){var n=e.component,r=e.page,t=e.preserveState;try{return d(function(e){return{component:n,page:r,key:t?e.key:Date.now()}}),Promise.resolve()}catch(e){return Promise.reject(e)}}}),n.router.on("navigate",function(){return v.forceUpdate()})},[]),!p.component)return r.createElement(i.Provider,{value:v},r.createElement(a.Provider,{value:p.page},null));var m=t||function(e){var n=e.Component,t=e.props,o=r.createElement(n,u({key:e.key},t));return"function"==typeof n.layout?n.layout(o):Array.isArray(n.layout)?n.layout.concat(o).reverse().reduce(function(e,n){return r.createElement(n,u({children:e},t))}):o};return r.createElement(i.Provider,{value:v},r.createElement(a.Provider,{value:p.page},m({Component:p.component,key:p.key,props:p.page.props})))}a.displayName="InertiaPageContext",c.displayName="Inertia";var s=["children","as","data","href","method","preserveScroll","preserveState","replace","only","headers","queryStringArrayFormat","onClick","onCancelToken","onBefore","onStart","onProgress","onFinish","onCancel","onSuccess","onError"],l=function(){},f=r.forwardRef(function(e,t){var o=e.children,i=e.as,a=void 0===i?"a":i,c=e.data,f=void 0===c?{}:c,p=e.href,d=e.method,v=void 0===d?"get":d,m=e.preserveScroll,y=void 0!==m&&m,g=e.preserveState,h=void 0===g?null:g,S=e.replace,k=void 0!==S&&S,C=e.only,b=void 0===C?[]:C,P=e.headers,E=void 0===P?{}:P,w=e.queryStringArrayFormat,O=void 0===w?"brackets":w,x=e.onClick,T=void 0===x?l:x,j=e.onCancelToken,I=void 0===j?l:j,F=e.onBefore,L=void 0===F?l:F,A=e.onStart,H=void 0===A?l:A,B=e.onProgress,D=void 0===B?l:B,q=e.onFinish,M=void 0===q?l:q,N=e.onCancel,R=void 0===N?l:N,U=e.onSuccess,J=void 0===U?l:U,W=e.onError,_=void 0===W?l:W,Q=function(e,n){if(null==e)return{};var r,t,o={},u=Object.keys(e);for(t=0;t<u.length;t++)n.indexOf(r=u[t])>=0||(o[r]=e[r]);return o}(e,s),z=r.useCallback(function(e){T(e),n.shouldIntercept(e)&&(e.preventDefault(),n.router.visit(p,{data:f,method:v,preserveScroll:y,preserveState:null!=h?h:"get"!==v,replace:k,only:b,headers:E,onCancelToken:I,onBefore:L,onStart:H,onProgress:D,onFinish:M,onCancel:R,onSuccess:J,onError:_}))},[f,p,v,y,h,k,b,E,T,I,L,H,D,M,R,J,_]);a=a.toLowerCase(),v=v.toLowerCase();var G=n.mergeDataIntoQueryString(v,p||"",f,O);return p=G[0],f=G[1],"a"===a&&"get"!==v&&console.warn('Creating POST/PUT/PATCH/DELETE <a> links is discouraged as it causes "Open Link in New Tab/Window" accessibility issues.\n\nPlease specify a more appropriate element using the "as" attribute. For example:\n\n<Link href="'+p+'" method="'+v+'" as="button">...</Link>'),r.createElement(a,u({},Q,"a"===a?{href:p}:{},{ref:t,onClick:z}),o)});function p(e,t){var o=r.useState(function(){var r=n.router.restore(t);return void 0!==r?r:e}),u=o[0],i=o[1];return r.useEffect(function(){n.router.remember(u,t)},[u,t]),[u,i]}Object.defineProperty(exports,"router",{enumerable:!0,get:function(){return n.router}}),exports.Head=function(e){var n,o,u=e.children,a=e.title,c=r.useContext(i),s=r.useMemo(function(){return c.createProvider()},[c]);return r.useEffect(function(){return function(){s.disconnect()}},[s]),s.update((n=u,o=(Array.isArray(n)?n:[n]).filter(function(e){return e}).map(function(e){return function(e){return function e(n){var r=function(e){var n=Object.keys(e.props).reduce(function(n,r){if(["head-key","children","dangerouslySetInnerHTML"].includes(r))return n;var t=e.props[r];return""===t?n+" "+r:n+" "+r+'="'+t+'"'},"");return"<"+e.type+n+">"}(n);return n.props.children&&(r+=function(n){return"string"==typeof n.props.children?n.props.children:n.props.children.reduce(function(n,r){return n+e(r)},"")}(n)),n.props.dangerouslySetInnerHTML&&(r+=n.props.dangerouslySetInnerHTML.__html),function(e){return["area","base","br","col","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"].indexOf(e.type)>-1}(n)||(r+="</"+n.type+">"),r}(function(e){return t.cloneElement(e,{inertia:void 0!==e.props["head-key"]?e.props["head-key"]:""})}(e))}(e)}),a&&!o.find(function(e){return e.startsWith("<title")})&&o.push("<title inertia>"+a+"</title>"),o)),null},exports.Link=f,exports.createInertiaApp=function(e){try{var t,o,u,i,a,s,l,f,p;o=void 0===(t=e.id)?"app":t,u=e.resolve,i=e.setup,a=e.title,l=void 0===(s=e.progress)?{}:s,f=e.page,p=e.render;var d="undefined"==typeof window,v=d?null:document.getElementById(o),m=f||JSON.parse(v.dataset.page),y=function(e){return Promise.resolve(u(e)).then(function(e){return e.default||e})},g=[];return Promise.resolve(y(m.component).then(function(e){return i({el:v,App:c,props:{initialPage:m,initialComponent:e,resolveComponent:y,titleCallback:a,onHeadUpdate:d?function(e){return g=e}:null}})})).then(function(e){return!d&&l&&n.setupProgress(l),function(){if(d)return Promise.resolve(p(r.createElement("div",{id:o,"data-page":JSON.stringify(m)},e))).then(function(e){return{head:g,body:e}})}()})}catch(e){return Promise.reject(e)}},exports.useForm=function(){var e=[].slice.call(arguments),t=r.useRef(null),i="string"==typeof e[0]?e[0]:null,a=r.useState(("string"==typeof e[0]?e[1]:e[0])||{}),c=a[0],s=a[1],l=r.useRef(null),f=r.useRef(null),d=i?p(c,i+":data"):r.useState(c),v=d[0],m=d[1],y=i?p({},i+":errors"):r.useState({}),g=y[0],h=y[1],S=r.useState(!1),k=S[0],C=S[1],b=r.useState(!1),P=b[0],E=b[1],w=r.useState(null),O=w[0],x=w[1],T=r.useState(!1),j=T[0],I=T[1],F=r.useState(!1),L=F[0],A=F[1],H=function(e){return e};r.useEffect(function(){return t.current=!0,function(){t.current=!1}},[]);var B=r.useCallback(function(e,r,o){void 0===o&&(o={});var i=u({},o,{onCancelToken:function(e){if(l.current=e,o.onCancelToken)return o.onCancelToken(e)},onBefore:function(e){if(I(!1),A(!1),clearTimeout(f.current),o.onBefore)return o.onBefore(e)},onStart:function(e){if(E(!0),o.onStart)return o.onStart(e)},onProgress:function(e){if(x(e),o.onProgress)return o.onProgress(e)},onSuccess:function(e){if(t.current&&(E(!1),x(null),h({}),C(!1),I(!0),A(!0),f.current=setTimeout(function(){t.current&&A(!1)},2e3)),o.onSuccess)return o.onSuccess(e)},onError:function(e){if(t.current&&(E(!1),x(null),h(e),C(!0)),o.onError)return o.onError(e)},onCancel:function(){if(t.current&&(E(!1),x(null)),o.onCancel)return o.onCancel()},onFinish:function(){if(t.current&&(E(!1),x(null)),l.current=null,o.onFinish)return o.onFinish()}});"delete"===e?n.router.delete(r,u({},i,{data:H(v)})):n.router[e](r,H(v),i)},[v,h]);return{data:v,setData:function(e,n){var r;m("string"==typeof e?u({},v,((r={})[e]=n,r)):"function"==typeof e?function(n){return e(n)}:e)},isDirty:!o(v,c),errors:g,hasErrors:k,processing:P,progress:O,wasSuccessful:j,recentlySuccessful:L,transform:function(e){H=e},setDefaults:function(e,n){s(void 0===e?function(){return v}:function(r){var t;return u({},r,n?((t={})[e]=n,t):e)})},reset:function(){var e=[].slice.call(arguments);m(0===e.length?c:Object.keys(c).filter(function(n){return e.includes(n)}).reduce(function(e,n){return e[n]=c[n],e},u({},v)))},setError:function(e,n){h(function(r){var t,o=u({},r,n?((t={})[e]=n,t):e);return C(Object.keys(o).length>0),o})},clearErrors:function(){var e=[].slice.call(arguments);h(function(n){var r=Object.keys(n).reduce(function(r,t){var o;return u({},r,e.length>0&&!e.includes(t)?((o={})[t]=n[t],o):{})},{});return C(Object.keys(r).length>0),r})},submit:B,get:function(e,n){B("get",e,n)},post:function(e,n){B("post",e,n)},put:function(e,n){B("put",e,n)},patch:function(e,n){B("patch",e,n)},delete:function(e,n){B("delete",e,n)},cancel:function(){l.current&&l.current.cancel()}}},exports.usePage=function(){var e=r.useContext(a);if(!e)throw new Error("usePage must be used within the Inertia component");return e},exports.useRemember=p;
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/HeadContext.js","../src/PageContext.js","../src/App.js","../src/Link.js","../src/useRemember.js","../src/Head.js","../src/createInertiaApp.js","../src/useForm.js","../src/usePage.js"],"sourcesContent":["import { createContext } from 'react'\n\nconst headContext = createContext()\nheadContext.displayName = 'InertiaHeadContext'\n\nexport default headContext\n","import { createContext } from 'react'\n\nconst pageContext = createContext()\npageContext.displayName = 'InertiaPageContext'\n\nexport default pageContext\n","import { createHeadManager, router } from '@inertiajs/core'\nimport { createElement, useEffect, useMemo, useState } from 'react'\nimport HeadContext from './HeadContext'\nimport PageContext from './PageContext'\n\nexport default function App({\n children,\n initialPage,\n initialComponent,\n resolveComponent,\n titleCallback,\n onHeadUpdate,\n}) {\n const [current, setCurrent] = useState({\n component: initialComponent || null,\n page: initialPage,\n key: null,\n })\n\n const headManager = useMemo(() => {\n return createHeadManager(\n typeof window === 'undefined',\n titleCallback || ((title) => title),\n onHeadUpdate || (() => {}),\n )\n }, [])\n\n useEffect(() => {\n router.init({\n initialPage,\n resolveComponent,\n swapComponent: async ({ component, page, preserveState }) => {\n setCurrent((current) => ({\n component,\n page,\n key: preserveState ? current.key : Date.now(),\n }))\n },\n })\n\n router.on('navigate', () => headManager.forceUpdate())\n }, [])\n\n if (!current.component) {\n return createElement(\n HeadContext.Provider,\n { value: headManager },\n createElement(PageContext.Provider, { value: current.page }, null),\n )\n }\n\n const renderChildren =\n children ||\n (({ Component, props, key }) => {\n const child = createElement(Component, { key, ...props })\n\n if (typeof Component.layout === 'function') {\n return Component.layout(child)\n }\n\n if (Array.isArray(Component.layout)) {\n return Component.layout\n .concat(child)\n .reverse()\n .reduce((children, Layout) => createElement(Layout, { children, ...props }))\n }\n\n return child\n })\n\n return createElement(\n HeadContext.Provider,\n { value: headManager },\n createElement(\n PageContext.Provider,\n { value: current.page },\n renderChildren({\n Component: current.component,\n key: current.key,\n props: current.page.props,\n }),\n ),\n )\n}\n\nApp.displayName = 'Inertia'\n","import { mergeDataIntoQueryString, router, shouldIntercept } from '@inertiajs/core'\nimport { createElement, forwardRef, useCallback } from 'react'\n\nconst noop = () => undefined\n\nexport default forwardRef(function Link(\n {\n children,\n as = 'a',\n data = {},\n href,\n method = 'get',\n preserveScroll = false,\n preserveState = null,\n replace = false,\n only = [],\n headers = {},\n queryStringArrayFormat = 'brackets',\n onClick = noop,\n onCancelToken = noop,\n onBefore = noop,\n onStart = noop,\n onProgress = noop,\n onFinish = noop,\n onCancel = noop,\n onSuccess = noop,\n onError = noop,\n ...props\n },\n ref,\n) {\n const visit = useCallback(\n (event) => {\n onClick(event)\n\n if (shouldIntercept(event)) {\n event.preventDefault()\n\n router.visit(href, {\n data,\n method,\n preserveScroll,\n preserveState: preserveState ?? method !== 'get',\n replace,\n only,\n headers,\n onCancelToken,\n onBefore,\n onStart,\n onProgress,\n onFinish,\n onCancel,\n onSuccess,\n onError,\n })\n }\n },\n [\n data,\n href,\n method,\n preserveScroll,\n preserveState,\n replace,\n only,\n headers,\n onClick,\n onCancelToken,\n onBefore,\n onStart,\n onProgress,\n onFinish,\n onCancel,\n onSuccess,\n onError,\n ],\n )\n\n as = as.toLowerCase()\n method = method.toLowerCase()\n const [_href, _data] = mergeDataIntoQueryString(method, href || '', data, queryStringArrayFormat)\n href = _href\n data = _data\n\n if (as === 'a' && method !== 'get') {\n console.warn(\n `Creating POST/PUT/PATCH/DELETE <a> links is discouraged as it causes \"Open Link in New Tab/Window\" accessibility issues.\\n\\nPlease specify a more appropriate element using the \"as\" attribute. For example:\\n\\n<Link href=\"${href}\" method=\"${method}\" as=\"button\">...</Link>`,\n )\n }\n\n return createElement(\n as,\n {\n ...props,\n ...(as === 'a' ? { href } : {}),\n ref,\n onClick: visit,\n },\n children,\n )\n})\n","import { router } from '@inertiajs/core'\nimport { useEffect, useState } from 'react'\n\nexport default function useRemember(initialState, key) {\n const [state, setState] = useState(() => {\n const restored = router.restore(key)\n\n return restored !== undefined ? restored : initialState\n })\n\n useEffect(() => {\n router.remember(state, key)\n }, [state, key])\n\n return [state, setState]\n}\n\nexport function useRememberedState(initialState, key) {\n console.warn(\n 'The \"useRememberedState\" hook has been deprecated and will be removed in a future release. Use \"useRemember\" instead.',\n )\n return useRemember(initialState, key)\n}\n","import React, { useContext, useEffect, useMemo } from 'react'\nimport HeadContext from './HeadContext'\n\nexport default function Head({ children, title }) {\n const headManager = useContext(HeadContext)\n const provider = useMemo(() => headManager.createProvider(), [headManager])\n\n useEffect(() => {\n return () => {\n provider.disconnect()\n }\n }, [provider])\n\n function isUnaryTag(node) {\n return (\n [\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n ].indexOf(node.type) > -1\n )\n }\n\n function renderTagStart(node) {\n const attrs = Object.keys(node.props).reduce((carry, name) => {\n if (['head-key', 'children', 'dangerouslySetInnerHTML'].includes(name)) {\n return carry\n }\n const value = node.props[name]\n if (value === '') {\n return carry + ` ${name}`\n } else {\n return carry + ` ${name}=\"${value}\"`\n }\n }, '')\n return `<${node.type}${attrs}>`\n }\n\n function renderTagChildren(node) {\n return typeof node.props.children === 'string'\n ? node.props.children\n : node.props.children.reduce((html, child) => html + renderTag(child), '')\n }\n\n function renderTag(node) {\n let html = renderTagStart(node)\n if (node.props.children) {\n html += renderTagChildren(node)\n }\n if (node.props.dangerouslySetInnerHTML) {\n html += node.props.dangerouslySetInnerHTML.__html\n }\n if (!isUnaryTag(node)) {\n html += `</${node.type}>`\n }\n return html\n }\n\n function ensureNodeHasInertiaProp(node) {\n return React.cloneElement(node, {\n inertia: node.props['head-key'] !== undefined ? node.props['head-key'] : '',\n })\n }\n\n function renderNode(node) {\n return renderTag(ensureNodeHasInertiaProp(node))\n }\n\n function renderNodes(nodes) {\n const computed = (Array.isArray(nodes) ? nodes : [nodes]).filter((node) => node).map((node) => renderNode(node))\n if (title && !computed.find((tag) => tag.startsWith('<title'))) {\n computed.push(`<title inertia>${title}</title>`)\n }\n return computed\n }\n\n provider.update(renderNodes(children))\n\n return null\n}\n","import { setupProgress } from '@inertiajs/core'\nimport { createElement } from 'react'\nimport App from './App'\n\nexport default async function createInertiaApp({ id = 'app', resolve, setup, title, progress = {}, page, render }) {\n const isServer = typeof window === 'undefined'\n const el = isServer ? null : document.getElementById(id)\n const initialPage = page || JSON.parse(el.dataset.page)\n const resolveComponent = (name) => Promise.resolve(resolve(name)).then((module) => module.default || module)\n\n let head = []\n\n const reactApp = await resolveComponent(initialPage.component).then((initialComponent) => {\n return setup({\n el,\n App,\n props: {\n initialPage,\n initialComponent,\n resolveComponent,\n titleCallback: title,\n onHeadUpdate: isServer ? (elements) => (head = elements) : null,\n },\n })\n })\n\n if (!isServer && progress) {\n setupProgress(progress)\n }\n\n if (isServer) {\n const body = await render(\n createElement(\n 'div',\n {\n id,\n 'data-page': JSON.stringify(initialPage),\n },\n reactApp,\n ),\n )\n\n return { head, body }\n }\n}\n","import { router } from '@inertiajs/core'\nimport isEqual from 'lodash.isequal'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport useRemember from './useRemember'\n\nexport default function useForm(...args) {\n const isMounted = useRef(null)\n const rememberKey = typeof args[0] === 'string' ? args[0] : null\n const [defaults, setDefaults] = useState((typeof args[0] === 'string' ? args[1] : args[0]) || {})\n const cancelToken = useRef(null)\n const recentlySuccessfulTimeoutId = useRef(null)\n const [data, setData] = rememberKey ? useRemember(defaults, `${rememberKey}:data`) : useState(defaults)\n const [errors, setErrors] = rememberKey ? useRemember({}, `${rememberKey}:errors`) : useState({})\n const [hasErrors, setHasErrors] = useState(false)\n const [processing, setProcessing] = useState(false)\n const [progress, setProgress] = useState(null)\n const [wasSuccessful, setWasSuccessful] = useState(false)\n const [recentlySuccessful, setRecentlySuccessful] = useState(false)\n let transform = (data) => data\n\n useEffect(() => {\n isMounted.current = true\n return () => {\n isMounted.current = false\n }\n }, [])\n\n const submit = useCallback(\n (method, url, options = {}) => {\n const _options = {\n ...options,\n onCancelToken: (token) => {\n cancelToken.current = token\n\n if (options.onCancelToken) {\n return options.onCancelToken(token)\n }\n },\n onBefore: (visit) => {\n setWasSuccessful(false)\n setRecentlySuccessful(false)\n clearTimeout(recentlySuccessfulTimeoutId.current)\n\n if (options.onBefore) {\n return options.onBefore(visit)\n }\n },\n onStart: (visit) => {\n setProcessing(true)\n\n if (options.onStart) {\n return options.onStart(visit)\n }\n },\n onProgress: (event) => {\n setProgress(event)\n\n if (options.onProgress) {\n return options.onProgress(event)\n }\n },\n onSuccess: (page) => {\n if (isMounted.current) {\n setProcessing(false)\n setProgress(null)\n setErrors({})\n setHasErrors(false)\n setWasSuccessful(true)\n setRecentlySuccessful(true)\n recentlySuccessfulTimeoutId.current = setTimeout(() => {\n if (isMounted.current) {\n setRecentlySuccessful(false)\n }\n }, 2000)\n }\n\n if (options.onSuccess) {\n return options.onSuccess(page)\n }\n },\n onError: (errors) => {\n if (isMounted.current) {\n setProcessing(false)\n setProgress(null)\n setErrors(errors)\n setHasErrors(true)\n }\n\n if (options.onError) {\n return options.onError(errors)\n }\n },\n onCancel: () => {\n if (isMounted.current) {\n setProcessing(false)\n setProgress(null)\n }\n\n if (options.onCancel) {\n return options.onCancel()\n }\n },\n onFinish: () => {\n if (isMounted.current) {\n setProcessing(false)\n setProgress(null)\n }\n\n cancelToken.current = null\n\n if (options.onFinish) {\n return options.onFinish()\n }\n },\n }\n\n if (method === 'delete') {\n router.delete(url, { ..._options, data: transform(data) })\n } else {\n router[method](url, transform(data), _options)\n }\n },\n [data, setErrors],\n )\n\n return {\n data,\n setData(key, value) {\n if (typeof key === 'string') {\n setData({ ...data, [key]: value })\n } else if (typeof key === 'function') {\n setData((data) => key(data))\n } else {\n setData(key)\n }\n },\n isDirty: !isEqual(data, defaults),\n errors,\n hasErrors,\n processing,\n progress,\n wasSuccessful,\n recentlySuccessful,\n transform(callback) {\n transform = callback\n },\n setDefaults(key, value) {\n if (typeof key === 'undefined') {\n setDefaults(() => data)\n } else {\n setDefaults((defaults) => ({\n ...defaults,\n ...(value ? { [key]: value } : key),\n }))\n }\n },\n reset(...fields) {\n if (fields.length === 0) {\n setData(defaults)\n } else {\n setData(\n Object.keys(defaults)\n .filter((key) => fields.includes(key))\n .reduce(\n (carry, key) => {\n carry[key] = defaults[key]\n return carry\n },\n { ...data },\n ),\n )\n }\n },\n setError(key, value) {\n setErrors((errors) => {\n const newErrors = {\n ...errors,\n ...(value ? { [key]: value } : key),\n }\n setHasErrors(Object.keys(newErrors).length > 0)\n return newErrors\n })\n },\n clearErrors(...fields) {\n setErrors((errors) => {\n const newErrors = Object.keys(errors).reduce(\n (carry, field) => ({\n ...carry,\n ...(fields.length > 0 && !fields.includes(field) ? { [field]: errors[field] } : {}),\n }),\n {},\n )\n setHasErrors(Object.keys(newErrors).length > 0)\n return newErrors\n })\n },\n submit,\n get(url, options) {\n submit('get', url, options)\n },\n post(url, options) {\n submit('post', url, options)\n },\n put(url, options) {\n submit('put', url, options)\n },\n patch(url, options) {\n submit('patch', url, options)\n },\n delete(url, options) {\n submit('delete', url, options)\n },\n cancel() {\n if (cancelToken.current) {\n cancelToken.current.cancel()\n }\n },\n }\n}\n","import { useContext } from 'react'\nimport PageContext from './PageContext'\n\nexport default function usePage() {\n const page = useContext(PageContext)\n\n if (!page) {\n throw new Error('usePage must be used within the Inertia component')\n }\n\n return page\n}\n"],"names":["createContext","headContext","displayName","children","initialPage","resolveComponent","titleCallback","onHeadUpdate","useState","component","initialComponent","page","key","current","setCurrent","useMemo","title","useEffect","router","init","swapComponent","preserveState","Date","now","on","forceUpdate","HeadContext","Provider","value","headManager","createElement","PageContext","Component","props","layout","child","Array","isArray","concat","reverse","reduce","Layout","renderChildren","pageContext","App","ref","as","data","href","method","preserveScroll","replace","only","headers","queryStringArrayFormat","onClick","noop","onCancelToken","onBefore","onStart","onProgress","onFinish","onCancel","onSuccess","onError","useCallback","event","shouldIntercept","preventDefault","visit","toLowerCase","mergeDataIntoQueryString","console","warn","initialState","restore","undefined","restored","state","setState","remember","nodes","useContext","createProvider","provider","disconnect","update","filter","node","map","Object","keys","carry","name","includes","type","attrs","renderTagStart","html","renderTag","renderTagChildren","dangerouslySetInnerHTML","__html","indexOf","isUnaryTag","cloneElement","inertia","ensureNodeHasInertiaProp","computed","find","tag","startsWith","push","id","resolve","setup","progress","render","isServer","document","getElementById","JSON","parse","el","dataset","then","module","elements","reactApp","setupProgress","data-page","stringify","head","body","useRef","args","defaults","setDefaults","rememberKey","useRemember","setData","errors","setErrors","hasErrors","setHasErrors","processing","setProcessing","setProgress","wasSuccessful","setWasSuccessful","recentlySuccessful","setRecentlySuccessful","isMounted","url","options","token","cancelToken","clearTimeout","recentlySuccessfulTimeoutId","setTimeout","_options","transform","isDirty","isEqual","callback","reset","fields","length","setError","newErrors","clearErrors","field","submit","get","post","put","patch","cancel"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { default } from '@inertiajs/core/server';
2
+ //# sourceMappingURL=server.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
package/dist/server.js ADDED
@@ -0,0 +1,8 @@
1
+ function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
2
+
3
+ var server = _interopDefault(require('@inertiajs/core/server'));
4
+
5
+
6
+
7
+ module.exports = server;
8
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
package/index.d.ts ADDED
@@ -0,0 +1,147 @@
1
+ import * as Inertia from '@inertiajs/core'
2
+ import * as React from 'react'
3
+ import { renderToString } from 'react-dom/server'
4
+
5
+ export type ReactInstance = React.ReactElement
6
+ export type ReactComponent = React.ReactNode
7
+
8
+ export type PageResolver = (name: string) => ReactComponent | Promise<ReactComponent> | NodeRequire // TODO: When shipped, replace with: Inertia.PageResolver<ReactComponent>
9
+ export type HeadManagerOnUpdate = (elements: string[]) => void // TODO: When shipped, replace with: Inertia.HeadManagerOnUpdate
10
+ export type HeadManagerTitleCallback = (title: string) => string // TODO: When shipped, replace with: Inertia.HeadManagerTitleCallback
11
+
12
+ export type AppType<SharedProps = Inertia.PageProps> = React.FunctionComponent<
13
+ {
14
+ children?: (props: {
15
+ Component: React.ComponentType
16
+ key: React.Key
17
+ props: Inertia.Page<SharedProps>['props']
18
+ }) => React.ReactNode
19
+ } & SetupOptions<unknown, SharedProps>['props']
20
+ >
21
+
22
+ interface BaseInertiaLinkProps {
23
+ as?: string
24
+ data?: object
25
+ href: string
26
+ method?: string
27
+ headers?: object
28
+ onClick?: (event: React.MouseEvent<HTMLAnchorElement> | React.KeyboardEvent<HTMLAnchorElement>) => void
29
+ preserveScroll?: boolean | ((props: Inertia.PageProps) => boolean)
30
+ preserveState?: boolean | ((props: Inertia.PageProps) => boolean) | null
31
+ replace?: boolean
32
+ only?: string[]
33
+ onCancelToken?: (cancelToken: import('axios').CancelTokenSource) => void
34
+ onBefore?: () => void
35
+ onStart?: () => void
36
+ onProgress?: (progress: Inertia.Progress) => void
37
+ onFinish?: () => void
38
+ onCancel?: () => void
39
+ onSuccess?: () => void
40
+ }
41
+
42
+ type InertiaLinkProps = BaseInertiaLinkProps &
43
+ Omit<React.HTMLAttributes<HTMLElement>, keyof BaseInertiaLinkProps> &
44
+ Omit<React.AllHTMLAttributes<HTMLElement>, keyof BaseInertiaLinkProps>
45
+
46
+ type InertiaLink = React.FunctionComponent<InertiaLinkProps>
47
+
48
+ type InertiaHeadProps = {
49
+ title?: string
50
+ }
51
+
52
+ type InertiaHead = React.FunctionComponent<InertiaHeadProps>
53
+
54
+ export function usePage<Page extends Inertia.Page = Inertia.Page>(): Page
55
+
56
+ export function useRemember<State>(
57
+ initialState: State,
58
+ key?: string,
59
+ ): [State, React.Dispatch<React.SetStateAction<State>>]
60
+
61
+ export const InertiaLink: InertiaLink
62
+
63
+ export const Link: InertiaLink
64
+
65
+ export const InertiaHead: InertiaHead
66
+
67
+ export const Head: InertiaHead
68
+
69
+ export const InertiaApp: AppType
70
+
71
+ export const App: AppType
72
+
73
+ type setDataByObject<TForm> = (data: TForm) => void
74
+ type setDataByMethod<TForm> = (data: (previousData: TForm) => TForm) => void
75
+ type setDataByKeyValuePair<TForm> = <K extends keyof TForm>(key: K, value: TForm[K]) => void
76
+
77
+ export interface InertiaFormProps<TForm = Record<string, any>> {
78
+ data: TForm
79
+ isDirty: boolean
80
+ errors: Record<keyof TForm, string>
81
+ hasErrors: boolean
82
+ processing: boolean
83
+ progress: Inertia.Progress | null
84
+ wasSuccessful: boolean
85
+ recentlySuccessful: boolean
86
+ setData: setDataByObject<TForm> & setDataByMethod<TForm> & setDataByKeyValuePair<TForm>
87
+ transform: (callback: (data: TForm) => TForm) => void
88
+ setDefaults(): void
89
+ setDefaults(field: keyof TForm, value: string): void
90
+ setDefaults(fields: Record<keyof TForm, string>): void
91
+ reset: (...fields: (keyof TForm)[]) => void
92
+ clearErrors: (...fields: (keyof TForm)[]) => void
93
+ setError(field: keyof TForm, value: string): void
94
+ setError(errors: Record<keyof TForm, string>): void
95
+ submit: (method: Inertia.Method, url: string, options?: Inertia.VisitOptions) => void
96
+ get: (url: string, options?: Inertia.VisitOptions) => void
97
+ patch: (url: string, options?: Inertia.VisitOptions) => void
98
+ post: (url: string, options?: Inertia.VisitOptions) => void
99
+ put: (url: string, options?: Inertia.VisitOptions) => void
100
+ delete: (url: string, options?: Inertia.VisitOptions) => void
101
+ }
102
+
103
+ export function useForm<TForm = Record<string, any>>(initialValues?: TForm): InertiaFormProps<TForm>
104
+ export function useForm<TForm = Record<string, any>>(
105
+ rememberKey: string,
106
+ initialValues?: TForm,
107
+ ): InertiaFormProps<TForm>
108
+
109
+ export type SetupOptions<ElementType, SharedProps> = {
110
+ el: ElementType
111
+ App: AppType
112
+ props: {
113
+ initialPage: Inertia.Page<SharedProps>
114
+ initialComponent: ReactComponent
115
+ resolveComponent: PageResolver
116
+ titleCallback?: HeadManagerTitleCallback
117
+ onHeadUpdate?: HeadManagerOnUpdate
118
+ }
119
+ }
120
+
121
+ export type BaseInertiaAppOptions = {
122
+ title?: HeadManagerTitleCallback
123
+ resolve: PageResolver
124
+ }
125
+
126
+ export type CreateInertiaAppSetupReturnType = ReactInstance | void
127
+ export type InertiaAppOptionsForCSR<SharedProps> = BaseInertiaAppOptions & {
128
+ id?: string
129
+ page?: Inertia.Page | string
130
+ render?: undefined
131
+ setup(options: SetupOptions<HTMLElement, SharedProps>): CreateInertiaAppSetupReturnType
132
+ }
133
+
134
+ export type CreateInertiaAppSSRContent = { head: string[]; body: string }
135
+ export type InertiaAppOptionsForSSR<SharedProps> = BaseInertiaAppOptions & {
136
+ id?: undefined
137
+ page: Inertia.Page | string
138
+ render: typeof renderToString
139
+ setup(options: SetupOptions<null, SharedProps>): ReactInstance
140
+ }
141
+
142
+ export function createInertiaApp<SharedProps = Inertia.PageProps>(
143
+ options: InertiaAppOptionsForCSR<SharedProps>,
144
+ ): Promise<CreateInertiaAppSetupReturnType>
145
+ export function createInertiaApp<SharedProps = Inertia.PageProps>(
146
+ options: InertiaAppOptionsForSSR<SharedProps>,
147
+ ): Promise<CreateInertiaAppSSRContent>
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@inertiajs/react",
3
+ "version": "1.0.0-beta.1",
4
+ "license": "MIT",
5
+ "description": "The React adapter for Inertia.js",
6
+ "contributors": [
7
+ "Jonathan Reinink <jonathan@reinink.ca>",
8
+ "Sebastian De Deyne <sebastiandedeyne@gmail.com>"
9
+ ],
10
+ "homepage": "https://inertiajs.com/",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/inertiajs/inertia.git",
14
+ "directory": "packages/react"
15
+ },
16
+ "bugs": {
17
+ "url": "https://github.com/inertiajs/inertia/issues"
18
+ },
19
+ "source": "src/index.js",
20
+ "main": "dist/index.js",
21
+ "typings": "index.d.ts",
22
+ "exports": {
23
+ ".": "./dist/index.js",
24
+ "./server": "./dist/server.js"
25
+ },
26
+ "scripts": {
27
+ "build": "npm run clean && npm run build:browser && npm run build:server",
28
+ "build:browser": "microbundle --format es,cjs",
29
+ "build:server": "microbundle --format es,cjs --target node --output ./dist/server.js ./src/server.js",
30
+ "clean": "rm -rf dist",
31
+ "prepublishOnly": "npm run build",
32
+ "watch": "microbundle watch --format es,cjs"
33
+ },
34
+ "devDependencies": {
35
+ "@types/react": "^16.9.1",
36
+ "@types/react-dom": "^17.0.9",
37
+ "microbundle": "^0.12.0",
38
+ "react": "^16.9.0 || ^17.0.0 || ^18.0.0"
39
+ },
40
+ "peerDependencies": {
41
+ "react": "^16.9.0 || ^17.0.0 || ^18.0.0"
42
+ },
43
+ "dependencies": {
44
+ "@inertiajs/core": "1.0.0-beta.1",
45
+ "lodash.isequal": "^4.5.0"
46
+ }
47
+ }
package/readme.md ADDED
@@ -0,0 +1,3 @@
1
+ # Inertia.js React Adapter
2
+
3
+ Visit [inertiajs.com](https://inertiajs.com/) to learn more.
package/src/App.js ADDED
@@ -0,0 +1,86 @@
1
+ import { createHeadManager, router } from '@inertiajs/core'
2
+ import { createElement, useEffect, useMemo, useState } from 'react'
3
+ import HeadContext from './HeadContext'
4
+ import PageContext from './PageContext'
5
+
6
+ export default function App({
7
+ children,
8
+ initialPage,
9
+ initialComponent,
10
+ resolveComponent,
11
+ titleCallback,
12
+ onHeadUpdate,
13
+ }) {
14
+ const [current, setCurrent] = useState({
15
+ component: initialComponent || null,
16
+ page: initialPage,
17
+ key: null,
18
+ })
19
+
20
+ const headManager = useMemo(() => {
21
+ return createHeadManager(
22
+ typeof window === 'undefined',
23
+ titleCallback || ((title) => title),
24
+ onHeadUpdate || (() => {}),
25
+ )
26
+ }, [])
27
+
28
+ useEffect(() => {
29
+ router.init({
30
+ initialPage,
31
+ resolveComponent,
32
+ swapComponent: async ({ component, page, preserveState }) => {
33
+ setCurrent((current) => ({
34
+ component,
35
+ page,
36
+ key: preserveState ? current.key : Date.now(),
37
+ }))
38
+ },
39
+ })
40
+
41
+ router.on('navigate', () => headManager.forceUpdate())
42
+ }, [])
43
+
44
+ if (!current.component) {
45
+ return createElement(
46
+ HeadContext.Provider,
47
+ { value: headManager },
48
+ createElement(PageContext.Provider, { value: current.page }, null),
49
+ )
50
+ }
51
+
52
+ const renderChildren =
53
+ children ||
54
+ (({ Component, props, key }) => {
55
+ const child = createElement(Component, { key, ...props })
56
+
57
+ if (typeof Component.layout === 'function') {
58
+ return Component.layout(child)
59
+ }
60
+
61
+ if (Array.isArray(Component.layout)) {
62
+ return Component.layout
63
+ .concat(child)
64
+ .reverse()
65
+ .reduce((children, Layout) => createElement(Layout, { children, ...props }))
66
+ }
67
+
68
+ return child
69
+ })
70
+
71
+ return createElement(
72
+ HeadContext.Provider,
73
+ { value: headManager },
74
+ createElement(
75
+ PageContext.Provider,
76
+ { value: current.page },
77
+ renderChildren({
78
+ Component: current.component,
79
+ key: current.key,
80
+ props: current.page.props,
81
+ }),
82
+ ),
83
+ )
84
+ }
85
+
86
+ App.displayName = 'Inertia'
package/src/Head.js ADDED
@@ -0,0 +1,92 @@
1
+ import React, { useContext, useEffect, useMemo } from 'react'
2
+ import HeadContext from './HeadContext'
3
+
4
+ export default function Head({ children, title }) {
5
+ const headManager = useContext(HeadContext)
6
+ const provider = useMemo(() => headManager.createProvider(), [headManager])
7
+
8
+ useEffect(() => {
9
+ return () => {
10
+ provider.disconnect()
11
+ }
12
+ }, [provider])
13
+
14
+ function isUnaryTag(node) {
15
+ return (
16
+ [
17
+ 'area',
18
+ 'base',
19
+ 'br',
20
+ 'col',
21
+ 'embed',
22
+ 'hr',
23
+ 'img',
24
+ 'input',
25
+ 'keygen',
26
+ 'link',
27
+ 'meta',
28
+ 'param',
29
+ 'source',
30
+ 'track',
31
+ 'wbr',
32
+ ].indexOf(node.type) > -1
33
+ )
34
+ }
35
+
36
+ function renderTagStart(node) {
37
+ const attrs = Object.keys(node.props).reduce((carry, name) => {
38
+ if (['head-key', 'children', 'dangerouslySetInnerHTML'].includes(name)) {
39
+ return carry
40
+ }
41
+ const value = node.props[name]
42
+ if (value === '') {
43
+ return carry + ` ${name}`
44
+ } else {
45
+ return carry + ` ${name}="${value}"`
46
+ }
47
+ }, '')
48
+ return `<${node.type}${attrs}>`
49
+ }
50
+
51
+ function renderTagChildren(node) {
52
+ return typeof node.props.children === 'string'
53
+ ? node.props.children
54
+ : node.props.children.reduce((html, child) => html + renderTag(child), '')
55
+ }
56
+
57
+ function renderTag(node) {
58
+ let html = renderTagStart(node)
59
+ if (node.props.children) {
60
+ html += renderTagChildren(node)
61
+ }
62
+ if (node.props.dangerouslySetInnerHTML) {
63
+ html += node.props.dangerouslySetInnerHTML.__html
64
+ }
65
+ if (!isUnaryTag(node)) {
66
+ html += `</${node.type}>`
67
+ }
68
+ return html
69
+ }
70
+
71
+ function ensureNodeHasInertiaProp(node) {
72
+ return React.cloneElement(node, {
73
+ inertia: node.props['head-key'] !== undefined ? node.props['head-key'] : '',
74
+ })
75
+ }
76
+
77
+ function renderNode(node) {
78
+ return renderTag(ensureNodeHasInertiaProp(node))
79
+ }
80
+
81
+ function renderNodes(nodes) {
82
+ const computed = (Array.isArray(nodes) ? nodes : [nodes]).filter((node) => node).map((node) => renderNode(node))
83
+ if (title && !computed.find((tag) => tag.startsWith('<title'))) {
84
+ computed.push(`<title inertia>${title}</title>`)
85
+ }
86
+ return computed
87
+ }
88
+
89
+ provider.update(renderNodes(children))
90
+
91
+ return null
92
+ }
@@ -0,0 +1,6 @@
1
+ import { createContext } from 'react'
2
+
3
+ const headContext = createContext()
4
+ headContext.displayName = 'InertiaHeadContext'
5
+
6
+ export default headContext
package/src/Link.js ADDED
@@ -0,0 +1,101 @@
1
+ import { mergeDataIntoQueryString, router, shouldIntercept } from '@inertiajs/core'
2
+ import { createElement, forwardRef, useCallback } from 'react'
3
+
4
+ const noop = () => undefined
5
+
6
+ export default forwardRef(function Link(
7
+ {
8
+ children,
9
+ as = 'a',
10
+ data = {},
11
+ href,
12
+ method = 'get',
13
+ preserveScroll = false,
14
+ preserveState = null,
15
+ replace = false,
16
+ only = [],
17
+ headers = {},
18
+ queryStringArrayFormat = 'brackets',
19
+ onClick = noop,
20
+ onCancelToken = noop,
21
+ onBefore = noop,
22
+ onStart = noop,
23
+ onProgress = noop,
24
+ onFinish = noop,
25
+ onCancel = noop,
26
+ onSuccess = noop,
27
+ onError = noop,
28
+ ...props
29
+ },
30
+ ref,
31
+ ) {
32
+ const visit = useCallback(
33
+ (event) => {
34
+ onClick(event)
35
+
36
+ if (shouldIntercept(event)) {
37
+ event.preventDefault()
38
+
39
+ router.visit(href, {
40
+ data,
41
+ method,
42
+ preserveScroll,
43
+ preserveState: preserveState ?? method !== 'get',
44
+ replace,
45
+ only,
46
+ headers,
47
+ onCancelToken,
48
+ onBefore,
49
+ onStart,
50
+ onProgress,
51
+ onFinish,
52
+ onCancel,
53
+ onSuccess,
54
+ onError,
55
+ })
56
+ }
57
+ },
58
+ [
59
+ data,
60
+ href,
61
+ method,
62
+ preserveScroll,
63
+ preserveState,
64
+ replace,
65
+ only,
66
+ headers,
67
+ onClick,
68
+ onCancelToken,
69
+ onBefore,
70
+ onStart,
71
+ onProgress,
72
+ onFinish,
73
+ onCancel,
74
+ onSuccess,
75
+ onError,
76
+ ],
77
+ )
78
+
79
+ as = as.toLowerCase()
80
+ method = method.toLowerCase()
81
+ const [_href, _data] = mergeDataIntoQueryString(method, href || '', data, queryStringArrayFormat)
82
+ href = _href
83
+ data = _data
84
+
85
+ if (as === 'a' && method !== 'get') {
86
+ console.warn(
87
+ `Creating POST/PUT/PATCH/DELETE <a> links is discouraged as it causes "Open Link in New Tab/Window" accessibility issues.\n\nPlease specify a more appropriate element using the "as" attribute. For example:\n\n<Link href="${href}" method="${method}" as="button">...</Link>`,
88
+ )
89
+ }
90
+
91
+ return createElement(
92
+ as,
93
+ {
94
+ ...props,
95
+ ...(as === 'a' ? { href } : {}),
96
+ ref,
97
+ onClick: visit,
98
+ },
99
+ children,
100
+ )
101
+ })
@@ -0,0 +1,6 @@
1
+ import { createContext } from 'react'
2
+
3
+ const pageContext = createContext()
4
+ pageContext.displayName = 'InertiaPageContext'
5
+
6
+ export default pageContext
@@ -0,0 +1,45 @@
1
+ import { setupProgress } from '@inertiajs/core'
2
+ import { createElement } from 'react'
3
+ import App from './App'
4
+
5
+ export default async function createInertiaApp({ id = 'app', resolve, setup, title, progress = {}, page, render }) {
6
+ const isServer = typeof window === 'undefined'
7
+ const el = isServer ? null : document.getElementById(id)
8
+ const initialPage = page || JSON.parse(el.dataset.page)
9
+ const resolveComponent = (name) => Promise.resolve(resolve(name)).then((module) => module.default || module)
10
+
11
+ let head = []
12
+
13
+ const reactApp = await resolveComponent(initialPage.component).then((initialComponent) => {
14
+ return setup({
15
+ el,
16
+ App,
17
+ props: {
18
+ initialPage,
19
+ initialComponent,
20
+ resolveComponent,
21
+ titleCallback: title,
22
+ onHeadUpdate: isServer ? (elements) => (head = elements) : null,
23
+ },
24
+ })
25
+ })
26
+
27
+ if (!isServer && progress) {
28
+ setupProgress(progress)
29
+ }
30
+
31
+ if (isServer) {
32
+ const body = await render(
33
+ createElement(
34
+ 'div',
35
+ {
36
+ id,
37
+ 'data-page': JSON.stringify(initialPage),
38
+ },
39
+ reactApp,
40
+ ),
41
+ )
42
+
43
+ return { head, body }
44
+ }
45
+ }
package/src/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export { router } from '@inertiajs/core'
2
+ export { default as createInertiaApp } from './createInertiaApp'
3
+ export { default as Head } from './Head'
4
+ export { default as Link } from './Link'
5
+ export { default as useForm } from './useForm'
6
+ export { default as usePage } from './usePage'
7
+ export { default as useRemember } from './useRemember'
package/src/server.js ADDED
@@ -0,0 +1 @@
1
+ export { default as default } from '@inertiajs/core/server'
package/src/useForm.js ADDED
@@ -0,0 +1,219 @@
1
+ import { router } from '@inertiajs/core'
2
+ import isEqual from 'lodash.isequal'
3
+ import { useCallback, useEffect, useRef, useState } from 'react'
4
+ import useRemember from './useRemember'
5
+
6
+ export default function useForm(...args) {
7
+ const isMounted = useRef(null)
8
+ const rememberKey = typeof args[0] === 'string' ? args[0] : null
9
+ const [defaults, setDefaults] = useState((typeof args[0] === 'string' ? args[1] : args[0]) || {})
10
+ const cancelToken = useRef(null)
11
+ const recentlySuccessfulTimeoutId = useRef(null)
12
+ const [data, setData] = rememberKey ? useRemember(defaults, `${rememberKey}:data`) : useState(defaults)
13
+ const [errors, setErrors] = rememberKey ? useRemember({}, `${rememberKey}:errors`) : useState({})
14
+ const [hasErrors, setHasErrors] = useState(false)
15
+ const [processing, setProcessing] = useState(false)
16
+ const [progress, setProgress] = useState(null)
17
+ const [wasSuccessful, setWasSuccessful] = useState(false)
18
+ const [recentlySuccessful, setRecentlySuccessful] = useState(false)
19
+ let transform = (data) => data
20
+
21
+ useEffect(() => {
22
+ isMounted.current = true
23
+ return () => {
24
+ isMounted.current = false
25
+ }
26
+ }, [])
27
+
28
+ const submit = useCallback(
29
+ (method, url, options = {}) => {
30
+ const _options = {
31
+ ...options,
32
+ onCancelToken: (token) => {
33
+ cancelToken.current = token
34
+
35
+ if (options.onCancelToken) {
36
+ return options.onCancelToken(token)
37
+ }
38
+ },
39
+ onBefore: (visit) => {
40
+ setWasSuccessful(false)
41
+ setRecentlySuccessful(false)
42
+ clearTimeout(recentlySuccessfulTimeoutId.current)
43
+
44
+ if (options.onBefore) {
45
+ return options.onBefore(visit)
46
+ }
47
+ },
48
+ onStart: (visit) => {
49
+ setProcessing(true)
50
+
51
+ if (options.onStart) {
52
+ return options.onStart(visit)
53
+ }
54
+ },
55
+ onProgress: (event) => {
56
+ setProgress(event)
57
+
58
+ if (options.onProgress) {
59
+ return options.onProgress(event)
60
+ }
61
+ },
62
+ onSuccess: (page) => {
63
+ if (isMounted.current) {
64
+ setProcessing(false)
65
+ setProgress(null)
66
+ setErrors({})
67
+ setHasErrors(false)
68
+ setWasSuccessful(true)
69
+ setRecentlySuccessful(true)
70
+ recentlySuccessfulTimeoutId.current = setTimeout(() => {
71
+ if (isMounted.current) {
72
+ setRecentlySuccessful(false)
73
+ }
74
+ }, 2000)
75
+ }
76
+
77
+ if (options.onSuccess) {
78
+ return options.onSuccess(page)
79
+ }
80
+ },
81
+ onError: (errors) => {
82
+ if (isMounted.current) {
83
+ setProcessing(false)
84
+ setProgress(null)
85
+ setErrors(errors)
86
+ setHasErrors(true)
87
+ }
88
+
89
+ if (options.onError) {
90
+ return options.onError(errors)
91
+ }
92
+ },
93
+ onCancel: () => {
94
+ if (isMounted.current) {
95
+ setProcessing(false)
96
+ setProgress(null)
97
+ }
98
+
99
+ if (options.onCancel) {
100
+ return options.onCancel()
101
+ }
102
+ },
103
+ onFinish: () => {
104
+ if (isMounted.current) {
105
+ setProcessing(false)
106
+ setProgress(null)
107
+ }
108
+
109
+ cancelToken.current = null
110
+
111
+ if (options.onFinish) {
112
+ return options.onFinish()
113
+ }
114
+ },
115
+ }
116
+
117
+ if (method === 'delete') {
118
+ router.delete(url, { ..._options, data: transform(data) })
119
+ } else {
120
+ router[method](url, transform(data), _options)
121
+ }
122
+ },
123
+ [data, setErrors],
124
+ )
125
+
126
+ return {
127
+ data,
128
+ setData(key, value) {
129
+ if (typeof key === 'string') {
130
+ setData({ ...data, [key]: value })
131
+ } else if (typeof key === 'function') {
132
+ setData((data) => key(data))
133
+ } else {
134
+ setData(key)
135
+ }
136
+ },
137
+ isDirty: !isEqual(data, defaults),
138
+ errors,
139
+ hasErrors,
140
+ processing,
141
+ progress,
142
+ wasSuccessful,
143
+ recentlySuccessful,
144
+ transform(callback) {
145
+ transform = callback
146
+ },
147
+ setDefaults(key, value) {
148
+ if (typeof key === 'undefined') {
149
+ setDefaults(() => data)
150
+ } else {
151
+ setDefaults((defaults) => ({
152
+ ...defaults,
153
+ ...(value ? { [key]: value } : key),
154
+ }))
155
+ }
156
+ },
157
+ reset(...fields) {
158
+ if (fields.length === 0) {
159
+ setData(defaults)
160
+ } else {
161
+ setData(
162
+ Object.keys(defaults)
163
+ .filter((key) => fields.includes(key))
164
+ .reduce(
165
+ (carry, key) => {
166
+ carry[key] = defaults[key]
167
+ return carry
168
+ },
169
+ { ...data },
170
+ ),
171
+ )
172
+ }
173
+ },
174
+ setError(key, value) {
175
+ setErrors((errors) => {
176
+ const newErrors = {
177
+ ...errors,
178
+ ...(value ? { [key]: value } : key),
179
+ }
180
+ setHasErrors(Object.keys(newErrors).length > 0)
181
+ return newErrors
182
+ })
183
+ },
184
+ clearErrors(...fields) {
185
+ setErrors((errors) => {
186
+ const newErrors = Object.keys(errors).reduce(
187
+ (carry, field) => ({
188
+ ...carry,
189
+ ...(fields.length > 0 && !fields.includes(field) ? { [field]: errors[field] } : {}),
190
+ }),
191
+ {},
192
+ )
193
+ setHasErrors(Object.keys(newErrors).length > 0)
194
+ return newErrors
195
+ })
196
+ },
197
+ submit,
198
+ get(url, options) {
199
+ submit('get', url, options)
200
+ },
201
+ post(url, options) {
202
+ submit('post', url, options)
203
+ },
204
+ put(url, options) {
205
+ submit('put', url, options)
206
+ },
207
+ patch(url, options) {
208
+ submit('patch', url, options)
209
+ },
210
+ delete(url, options) {
211
+ submit('delete', url, options)
212
+ },
213
+ cancel() {
214
+ if (cancelToken.current) {
215
+ cancelToken.current.cancel()
216
+ }
217
+ },
218
+ }
219
+ }
package/src/usePage.js ADDED
@@ -0,0 +1,12 @@
1
+ import { useContext } from 'react'
2
+ import PageContext from './PageContext'
3
+
4
+ export default function usePage() {
5
+ const page = useContext(PageContext)
6
+
7
+ if (!page) {
8
+ throw new Error('usePage must be used within the Inertia component')
9
+ }
10
+
11
+ return page
12
+ }
@@ -0,0 +1,23 @@
1
+ import { router } from '@inertiajs/core'
2
+ import { useEffect, useState } from 'react'
3
+
4
+ export default function useRemember(initialState, key) {
5
+ const [state, setState] = useState(() => {
6
+ const restored = router.restore(key)
7
+
8
+ return restored !== undefined ? restored : initialState
9
+ })
10
+
11
+ useEffect(() => {
12
+ router.remember(state, key)
13
+ }, [state, key])
14
+
15
+ return [state, setState]
16
+ }
17
+
18
+ export function useRememberedState(initialState, key) {
19
+ console.warn(
20
+ 'The "useRememberedState" hook has been deprecated and will be removed in a future release. Use "useRemember" instead.',
21
+ )
22
+ return useRemember(initialState, key)
23
+ }