Skip to content

Commit d062380

Browse files
committed
fix #352: in nextjs ReferenceError: HTMLElement is not defined
1 parent 4f7cc72 commit d062380

File tree

3 files changed

+29
-16
lines changed

3 files changed

+29
-16
lines changed

packages/react/xr/src/dom-overlay.tsx

+3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ export const XRDomOverlay = forwardRef<HTMLDivElement, HTMLProps<HTMLDivElement>
1010
const domOverlayRoot = useXR((xr) => xr.domOverlayRoot)
1111
const { In, Out } = useMemo(tunnel, [])
1212
useEffect(() => {
13+
if (domOverlayRoot == null) {
14+
return
15+
}
1316
const root = createRoot(domOverlayRoot)
1417
root.render(<Out />)
1518
return () => root.unmount()

packages/xr/src/init.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export type XRSessionInitOptions = {
5151

5252
export function buildXRSessionInit(
5353
mode: XRSessionMode,
54-
domOverlayRoot: Element,
54+
domOverlayRoot: Element | undefined,
5555
{
5656
anchors = true,
5757
handTracking = true,
@@ -90,7 +90,10 @@ export function buildXRSessionInit(
9090
const init: XRSessionInit = {
9191
requiredFeatures,
9292
optionalFeatures,
93-
domOverlay: { root: domOverlayRoot },
93+
}
94+
95+
if (domOverlayRoot != null) {
96+
init.domOverlay = { root: domOverlayRoot }
9497
}
9598

9699
//TODO: replace with call to isSupportedFeature (unbounded, ...)

packages/xr/src/store.ts

+21-14
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export type XRState<T extends XRElementImplementations> = Readonly<
3737
/**
3838
* the HTML element for doing dom overlays in handheld AR experiences
3939
*/
40-
domOverlayRoot: Element
40+
domOverlayRoot?: Element
4141
/**
4242
* the session visibility state
4343
* e.g. `"visible-blurred"` typically occurs when the user sees an OS overlay
@@ -309,7 +309,12 @@ export function createXRStore<T extends XRElementImplementations>(options?: XRSt
309309
window.addEventListener('keydown', keydownListener)
310310
cleanupEmulate = () => window.removeEventListener('keydown', keydownListener)
311311
}
312-
const domOverlayRoot = options?.domOverlay instanceof HTMLElement ? options.domOverlay : document.createElement('div')
312+
const domOverlayRoot =
313+
typeof HTMLElement === 'undefined'
314+
? undefined
315+
: options?.domOverlay instanceof HTMLElement
316+
? options.domOverlay
317+
: document.createElement('div')
313318
const store = createStore<XRState<XRElementImplementations>>(() => ({
314319
...baseInitialState,
315320
controller: options?.controller,
@@ -321,19 +326,21 @@ export function createXRStore<T extends XRElementImplementations>(options?: XRSt
321326
}))
322327

323328
let cleanupDomOverlayRoot: (() => void) | undefined
324-
if (domOverlayRoot.parentNode == null) {
325-
const setupDisplay = (state: XRState<any>) => {
326-
domOverlayRoot.style.display = state.session != null ? 'block' : 'none'
327-
}
328-
const unsubscribe = store.subscribe(setupDisplay)
329-
setupDisplay(store.getState())
330-
document.body.appendChild(domOverlayRoot)
331-
cleanupDomOverlayRoot = () => {
332-
domOverlayRoot.remove()
333-
unsubscribe()
329+
if (domOverlayRoot != null) {
330+
if (domOverlayRoot.parentNode == null) {
331+
const setupDisplay = (state: XRState<any>) => {
332+
domOverlayRoot.style.display = state.session != null ? 'block' : 'none'
333+
}
334+
const unsubscribe = store.subscribe(setupDisplay)
335+
setupDisplay(store.getState())
336+
document.body.appendChild(domOverlayRoot)
337+
cleanupDomOverlayRoot = () => {
338+
domOverlayRoot.remove()
339+
unsubscribe()
340+
}
334341
}
342+
document.body.append(domOverlayRoot)
335343
}
336-
document.body.append(domOverlayRoot)
337344

338345
const syncXRInputSourceStates = createSyncXRInputSourceStates(
339346
(state) => store.setState({ inputSourceStates: [...store.getState().inputSourceStates, state] }),
@@ -548,7 +555,7 @@ async function setFrameRate(session: XRSession, frameRate: FrameRateOption): Pro
548555
}
549556

550557
async function enterXR(
551-
domOverlayRoot: Element,
558+
domOverlayRoot: Element | undefined,
552559
mode: XRSessionMode,
553560
options: XRStoreOptions<XRElementImplementations> | undefined,
554561
xrManager: WebXRManager | undefined,

0 commit comments

Comments
 (0)