diff --git a/packages/core/src/initialVisit.ts b/packages/core/src/initialVisit.ts index cc33f3d99..4dafc7b7d 100644 --- a/packages/core/src/initialVisit.ts +++ b/packages/core/src/initialVisit.ts @@ -78,7 +78,7 @@ export class InitialVisit { Scroll.restore(scrollRegions) } - fireNavigateEvent(currentPage.get()) + this.fireInitialEvents() }) }) .catch(() => { @@ -100,15 +100,17 @@ export class InitialVisit { Scroll.scrollToAnchor() } - const page = currentPage.get() + this.fireInitialEvents() + }) + } - fireNavigateEvent(page) + protected static fireInitialEvents(): void { + const page = currentPage.get() - const flash = page.flash + fireNavigateEvent(page) - if (Object.keys(flash).length > 0) { - queueMicrotask(() => fireFlashEvent(flash)) - } - }) + if (Object.keys(page.flash).length > 0) { + queueMicrotask(() => fireFlashEvent(page.flash)) + } } } diff --git a/tests/app/server.js b/tests/app/server.js index 3d3b2fcce..9fb92f1f8 100644 --- a/tests/app/server.js +++ b/tests/app/server.js @@ -2436,6 +2436,7 @@ app.get('/flash/initial', (req, res) => flash: { message: 'Hello from server' }, }), ) +app.get('/flash/location-visit', (req, res) => inertia.location(res, '/flash/initial')) app.get('/flash/with-infinite-scroll', (req, res) => { const page = req.query.page ? parseInt(req.query.page) : 1 const partialReload = !!req.headers['x-inertia-partial-data'] diff --git a/tests/flash.spec.ts b/tests/flash.spec.ts index 2ca3cbf65..e796bc3ba 100644 --- a/tests/flash.spec.ts +++ b/tests/flash.spec.ts @@ -20,6 +20,17 @@ test.describe('Flash Data', () => { await expect(page.locator('#flash-events')).toContainText('Hello from server') }) + test('fires flash event after a location visit triggers a full page reload', async ({ page }) => { + await page.goto('/flash/initial') + await expect(page.locator('#flash-events')).toContainText('Hello from server') + + await page.evaluate(() => (window as any).testing.Inertia.visit('/flash/location-visit')) + await page.waitForURL('**/flash/initial') + + await expect(page.locator('#flash')).toContainText('Hello from server') + await expect(page.locator('#flash-events')).toContainText('Hello from server') + }) + test('preserves flash data after deferred props load and does not fire event again', async ({ page }) => { // Set up response listener before navigating to catch the deferred request const deferredResponse = page.waitForResponse((res) => res.url().includes('/flash/with-deferred'))