@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 +21 -0
- package/dist/index.esm.js +2 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/server.esm.js +2 -0
- package/dist/server.esm.js.map +1 -0
- package/dist/server.js +8 -0
- package/dist/server.js.map +1 -0
- package/index.d.ts +147 -0
- package/package.json +47 -0
- package/readme.md +3 -0
- package/src/App.js +86 -0
- package/src/Head.js +92 -0
- package/src/HeadContext.js +6 -0
- package/src/Link.js +101 -0
- package/src/PageContext.js +6 -0
- package/src/createInertiaApp.js +45 -0
- package/src/index.js +7 -0
- package/src/server.js +1 -0
- package/src/useForm.js +219 -0
- package/src/usePage.js +12 -0
- package/src/useRemember.js +23 -0
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 @@
|
|
|
1
|
+
{"version":3,"file":"server.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/dist/server.js
ADDED
|
@@ -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
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
|
+
}
|
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,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
|
+
}
|