Skip to content

Commit

Permalink
fix(model-viewer): handle page change
Browse files Browse the repository at this point in the history
  • Loading branch information
RomainLanz committed Jan 28, 2024
1 parent 4d16840 commit 18fad95
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 33 deletions.
60 changes: 29 additions & 31 deletions resources/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ import 'virtual:uno.css'
import '@unocss/reset/tailwind.css'
import 'floating-vue/dist/style.css'

import { createApp, h } from 'vue'
import { createApp, h, ref } from 'vue'
import { VTooltip } from 'floating-vue'
import { createInertiaApp } from '@inertiajs/vue3'

createInertiaApp({
void createInertiaApp({
progress: { color: '#5468FF' },

resolve: (name) => {
Expand All @@ -16,42 +16,40 @@ createInertiaApp({
},

setup({ el, App, props, plugin }) {
createApp({ render: () => h(App, props) })
const app = createApp({ render: () => h(App, props) })
.directive('tooltip', VTooltip)
.use(plugin)
.mount(el)
},
})

let modelViewerScriptLoaded = false
const modelViewerScriptLoaded = ref(false)

app.config.globalProperties.modelViewerScriptLoaded = modelViewerScriptLoaded

function loadModelViewerScript() {
if (!window.matchMedia('(min-width: 768px)').matches || modelViewerScriptLoaded) {
return
}
function loadModelViewerScript() {
if (modelViewerScriptLoaded.value || !window.matchMedia('(min-width: 768px)').matches) {
return
}

const scriptEl = document.createElement('script')
scriptEl.src = 'https://ajax.googleapis.com/ajax/libs/model-viewer/3.3.0/model-viewer.min.js'
scriptEl.async = true
scriptEl.type = 'module'
scriptEl.onload = () => {
const modelViewerEls = document.querySelectorAll('model-viewer[data-not-loaded]')
const scriptEl = document.createElement('script')
scriptEl.src = 'https://ajax.googleapis.com/ajax/libs/model-viewer/3.3.0/model-viewer.min.js'
scriptEl.async = true
scriptEl.type = 'module'
scriptEl.onload = () => {
modelViewerScriptLoaded.value = true
}

for (const modelViewerEl of modelViewerEls) {
modelViewerEl.removeAttribute('data-not-loaded')
document.body.appendChild(scriptEl)
}
}

document.body.appendChild(scriptEl)
modelViewerScriptLoaded = true
}
setTimeout(() => {
window.requestIdleCallback(() => {
loadModelViewerScript()
})

setTimeout(() => {
window.requestIdleCallback(() => {
loadModelViewerScript()
})
window.addEventListener('resize', () => {
loadModelViewerScript()
})
}, 100)

window.addEventListener('resize', () => {
loadModelViewerScript()
})
}, 100)
app.mount(el)
},
})
2 changes: 1 addition & 1 deletion resources/components/hero.vue
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ import Button from '@/components/ui/button.vue'
</div>

<model-viewer
data-not-loaded
:data-script-loaded="modelViewerScriptLoaded.value"
alt="AdonisJS 3d logo"
class="hidden h-110 flex-1"
md="block"
Expand Down
2 changes: 1 addition & 1 deletion resources/css/app.css
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,6 @@ body .v-popper--theme-tooltip .v-popper__arrow-outer {
@apply border-base4 backdrop-blur;
}

model-viewer[data-not-loaded] {
model-viewer[data-script-loaded='false'] {
@apply hidden;
}
8 changes: 8 additions & 0 deletions resources/types.ts
Original file line number Diff line number Diff line change
@@ -1 +1,9 @@
import type { Ref } from 'vue'

export * from '../types/main.js'

declare module 'vue' {
interface ComponentCustomProperties {
modelViewerScriptLoaded: Ref<boolean>
}
}

0 comments on commit 18fad95

Please sign in to comment.