diff --git a/packages/core/src/page.ts b/packages/core/src/page.ts index f53f23dd4..5d37cb083 100644 --- a/packages/core/src/page.ts +++ b/packages/core/src/page.ts @@ -50,7 +50,7 @@ class CurrentPage { history.clear() } - return this.resolve(page.component).then((component) => { + return this.resolve(page.component, page).then((component) => { if (componentId !== this.componentId) { // Component has changed since we started resolving this component, bail return @@ -102,7 +102,7 @@ class CurrentPage { preserveState?: PreserveStateOption } = {}, ) { - return this.resolve(page.component).then((component) => { + return this.resolve(page.component, page).then((component) => { this.page = page this.cleared = false history.setCurrent(page) @@ -148,8 +148,8 @@ class CurrentPage { return this.swapComponent({ component, page, preserveState }) } - public resolve(component: string): Promise { - return Promise.resolve(this.resolveComponent(component)) + public resolve(component: string, page: Page): Promise { + return Promise.resolve(this.resolveComponent(component, page)) } public isTheSame(page: Page): boolean { diff --git a/packages/core/src/router.ts b/packages/core/src/router.ts index 06a1715ba..365677745 100644 --- a/packages/core/src/router.ts +++ b/packages/core/src/router.ts @@ -306,7 +306,7 @@ export class Router { } public resolveComponent(component: string): Promise { - return currentPage.resolve(component) + return currentPage.resolve(component, currentPage.get()) } public replace(params: ClientSideVisitOptions): void { diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index be8b8d753..722a0f63c 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -144,7 +144,7 @@ export interface ClientSideVisitOptions { onSuccess?: (page: Page) => void } -export type PageResolver = (name: string) => Component +export type PageResolver = (name: string, page: Page) => Component export type PageHandler = ({ component, diff --git a/packages/react/src/createInertiaApp.ts b/packages/react/src/createInertiaApp.ts index fc75a1496..f0aefc386 100644 --- a/packages/react/src/createInertiaApp.ts +++ b/packages/react/src/createInertiaApp.ts @@ -77,13 +77,14 @@ export default async function createInertiaApp Promise.resolve(resolve(name)).then((module) => module.default || module) + + const resolveComponent = (name, page) => + Promise.resolve(resolve(name, page)).then((module: any) => module.default || module) let head = [] const reactApp = await Promise.all([ - resolveComponent(initialPage.component), + resolveComponent(initialPage.component, initialPage), router.decryptHistory().catch(() => {}), ]).then(([initialComponent]) => { return setup({ diff --git a/packages/svelte/src/createInertiaApp.ts b/packages/svelte/src/createInertiaApp.ts index 88a04e038..905b4438b 100644 --- a/packages/svelte/src/createInertiaApp.ts +++ b/packages/svelte/src/createInertiaApp.ts @@ -36,10 +36,10 @@ export default async function createInertiaApp({ const isServer = typeof window === 'undefined' const el = isServer ? null : document.getElementById(id) const initialPage: Page = page || JSON.parse(el?.dataset.page || '{}') - const resolveComponent = (name: string) => Promise.resolve(resolve(name)) + const resolveComponent = (name: string, page: Page) => Promise.resolve(resolve(name, page)) const [initialComponent] = await Promise.all([ - resolveComponent(initialPage.component), + resolveComponent(initialPage.component, initialPage), router.decryptHistory().catch(() => {}), ]) diff --git a/packages/svelte/src/types.ts b/packages/svelte/src/types.ts index 6367e9c7e..9cc1c1196 100644 --- a/packages/svelte/src/types.ts +++ b/packages/svelte/src/types.ts @@ -1,7 +1,8 @@ +import { type Page } from '@inertiajs/core' import type { ComponentType } from 'svelte' import type { RenderFunction, RenderProps } from './components/Render.svelte' -export type ComponentResolver = (name: string) => ResolvedComponent | Promise +export type ComponentResolver = (name: string, page: Page) => ResolvedComponent | Promise export type LayoutResolver = (h: RenderFunction, page: RenderProps) => RenderProps diff --git a/packages/vue3/src/app.ts b/packages/vue3/src/app.ts index 51340187a..fd034e7c3 100755 --- a/packages/vue3/src/app.ts +++ b/packages/vue3/src/app.ts @@ -18,7 +18,7 @@ import useForm from './useForm' export interface InertiaAppProps { initialPage: Page initialComponent?: object - resolveComponent?: (name: string) => DefineComponent | Promise + resolveComponent?: (name: string, page: Page) => DefineComponent | Promise titleCallback?: (title: string) => string onHeadUpdate?: (elements: string[]) => void } @@ -43,7 +43,7 @@ const App: InertiaApp = defineComponent({ required: false, }, resolveComponent: { - type: Function as PropType<(name: string) => DefineComponent | Promise>, + type: Function as PropType<(name: string, page: Page) => DefineComponent | Promise>, required: false, }, titleCallback: { diff --git a/packages/vue3/src/createInertiaApp.ts b/packages/vue3/src/createInertiaApp.ts index b58857611..b3b6c0d69 100644 --- a/packages/vue3/src/createInertiaApp.ts +++ b/packages/vue3/src/createInertiaApp.ts @@ -4,7 +4,7 @@ import App, { InertiaApp, InertiaAppProps, plugin } from './app' interface CreateInertiaAppProps { id?: string - resolve: (name: string) => DefineComponent | Promise | { default: DefineComponent } + resolve: (name: string, page: Page) => DefineComponent | Promise | { default: DefineComponent } setup: (props: { el: Element; App: InertiaApp; props: InertiaAppProps; plugin: Plugin }) => void | VueApp title?: (title: string) => string progress?: @@ -31,12 +31,13 @@ export default async function createInertiaApp({ const isServer = typeof window === 'undefined' const el = isServer ? null : document.getElementById(id) const initialPage = page || JSON.parse(el.dataset.page) - const resolveComponent = (name) => Promise.resolve(resolve(name)).then((module) => module.default || module) + const resolveComponent = (name, page) => + Promise.resolve(resolve(name, page)).then((module) => module.default || module) let head = [] const vueApp = await Promise.all([ - resolveComponent(initialPage.component), + resolveComponent(initialPage.component, initialPage), router.decryptHistory().catch(() => {}), ]).then(([initialComponent]) => { return setup({