Skip to content

Commit

Permalink
Wait for Inertia router to be initialized
Browse files Browse the repository at this point in the history
  • Loading branch information
pascalbaljet committed Oct 5, 2024
1 parent 75cc5e0 commit a8a0aab
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 23 deletions.
2 changes: 1 addition & 1 deletion demo-app/database/seeders/DatabaseSeeder.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public function run(): void

UserFactory::new()
->recycle(Role::all())
->count(200)
->count(20)
->create();
}
}
44 changes: 23 additions & 21 deletions react/src/ModalRoot.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useState } from 'react'
import { default as Axios } from 'axios'
import { except, only } from './helpers'
import { except, only, resolveInteriaPageFromRouter } from './helpers'
import { router } from '@inertiajs/react'
import { mergeDataIntoQueryString } from '@inertiajs/core'
import { createContext, useContext } from 'react'
Expand Down Expand Up @@ -205,27 +205,29 @@ export const ModalStackProvider = ({ children }) => {

const [url, data] = mergeDataIntoQueryString(method, href || '', payload, queryStringArrayFormat)

Axios({
url,
method,
data,
headers: {
...headers,
Accept: 'text/html, application/xhtml+xml',
'X-Requested-With': 'XMLHttpRequest',
'X-Inertia': true,
'X-Inertia-Version': router.page.version,
'X-InertiaUI-Modal': true,
},
})
.then((response) => {
router.resolveComponent(response.data.component).then((component) => {
resolve(push(component, response.data, modalProps, onClose, onAfterLeave))
})
})
.catch((error) => {
reject(error)
resolveInteriaPageFromRouter().then((inertiaPage) => {
Axios({
url,
method,
data,
headers: {
...headers,
Accept: 'text/html, application/xhtml+xml',
'X-Requested-With': 'XMLHttpRequest',
'X-Inertia': true,
'X-Inertia-Version': inertiaPage.version,
'X-InertiaUI-Modal': true,
},
})
.then((response) => {
router.resolveComponent(response.data.component).then((component) => {
resolve(push(component, response.data, modalProps, onClose, onAfterLeave))
})
})
.catch((error) => {
reject(error)
})
})
})
}

Expand Down
35 changes: 34 additions & 1 deletion react/src/helpers.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,36 @@
import { router } from '@inertiajs/react'
import { except, only, rejectNullValues } from './../../vue/src/helpers.js'

export { except, only, rejectNullValues }
/**
* Resolves router.page from the Inertia router or waits for it to be available
*/
function resolveInteriaPageFromRouter(waitForSeconds = 3, checkIntervalMilliseconds = 100) {
const resolvePage = () => router.page || null

return new Promise((resolve, reject) => {
let page = resolvePage()

if (page) {
resolve(page)
return
}

let maxAttempts = (waitForSeconds * 1000) / checkIntervalMilliseconds

const interval = setInterval(() => {
page = resolvePage()

if (page) {
clearInterval(interval)
resolve(page)
}

if (--maxAttempts <= 0) {
clearInterval(interval)
reject(new Error('Inertia page not available'))
}
}, checkIntervalMilliseconds)
})
}

export { except, only, rejectNullValues, resolveInteriaPageFromRouter }

0 comments on commit a8a0aab

Please sign in to comment.