← back to Dw Theme Compact Toolbar
assets/element.model.js
61 lines
import BaseMedia from 'element.base-media'
import { loadProduct } from 'util.product-loader'
export class ModelMedia extends BaseMedia {
getPlayerTarget() {
return new Promise((resolve) => {
this.setAttribute('loaded', '')
window.Shopify.loadFeatures([
{
name: 'shopify-xr',
version: '1.0',
onLoad: this.setupShopifyXr.bind(this)
},
{
name: 'model-viewer-ui',
version: '1.0',
onLoad: () => {
const modelViewerUi = this.setupModelViewerUi()
resolve(modelViewerUi)
}
}
])
})
}
playerHandler(target, prop) {
target[prop]()
}
async setupShopifyXr() {
if (!window.ShopifyXR) {
document.addEventListener('shopify_xr_initialized', this.setupShopifyXr.bind(this))
} else {
const productJSON = await loadProduct(this.getAttribute('handle'))
const productModels = productJSON['media'].filter((media) => media['media_type'] === 'model')
window.ShopifyXR.addModels(productModels)
window.ShopifyXR.setupXRElements()
}
}
setupModelViewerUi() {
const modelViewer = this.querySelector('model-viewer')
modelViewer.addEventListener('shopify_model_viewer_ui_toggle_play', () => {
this.setAttribute('playing', '')
})
modelViewer.addEventListener('shopify_model_viewer_ui_toggle_pause', () => {
this.removeAttribute('playing')
})
return new window.Shopify.ModelViewerUI(modelViewer, {
focusOnPlay: false
})
}
}
customElements.define('model-media', ModelMedia)