Skip to content

Commit 8b16ed3

Browse files
feat!: React 19 (#81)
1 parent 13702e5 commit 8b16ed3

File tree

18 files changed

+892
-412
lines changed

18 files changed

+892
-412
lines changed

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -544,9 +544,9 @@ interface RootState {
544544
xr: XRManager
545545
// Frameloop internals for custom render loops
546546
priority: number
547-
subscribed: React.MutableRefObject<Subscription>[]
548-
subscribe: (refCallback: React.MutableRefObject<Subscription>, renderPriority?: number) => void
549-
unsubscribe: (refCallback: React.MutableRefObject<Subscription>, renderPriority?: number) => void
547+
subscribed: React.RefObject<Subscription>[]
548+
subscribe: (refCallback: React.RefObject<Subscription>, renderPriority?: number) => void
549+
unsubscribe: (refCallback: React.RefObject<Subscription>, renderPriority?: number) => void
550550
// Optional canvas event manager and its state
551551
events?: EventManager
552552
mouse: OGL.Vec2
@@ -796,13 +796,13 @@ In addition to `createRoot` (see [custom canvas](#custom-canvas)), react-ogl exp
796796
```tsx
797797
import * as React from 'react'
798798
import * as OGL from 'ogl'
799-
import { type Root, type RootStore, type RootState, createRoot, act } from 'react-ogl'
799+
import { type Root, type RootStore, type RootState, createRoot } from 'react-ogl'
800800

801801
it('tests against a react-ogl component or scene', async () => {
802802
const transform = React.createRef<OGL.Transform>()
803803

804804
const root: Root = createRoot(document.createElement('canvas'))
805-
const store: RootStore = await act(async () => root.render(<transform ref={transform} />))
805+
const store: RootStore = await React.act(async () => root.render(<transform ref={transform} />))
806806
const state: RootState = store.getState()
807807

808808
expect(transform.current).toBeInstanceOf(OGL.Transform)

examples/src/cubes.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import * as OGL from 'ogl'
22
import * as React from 'react'
3-
import { useFrame, Canvas } from 'react-ogl'
3+
import { type OGLElements, useFrame, Canvas } from 'react-ogl'
44

55
const hotpink = new OGL.Color(0xfba2d4)
66
const orange = new OGL.Color(0xf5ce54)
77

8-
const Box = (props: JSX.IntrinsicElements['mesh']) => {
8+
const Box = (props: OGLElements['mesh']) => {
99
const mesh = React.useRef<OGL.Mesh>(null!)
1010
const [hovered, setHover] = React.useState(false)
1111
const [active, setActive] = React.useState(false)

package.json

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,30 +46,30 @@
4646
"jest-environment-jsdom": "^28.1.3",
4747
"ogl": "^1.0.3",
4848
"prettier": "^2.7.1",
49-
"react": "^18.2.0",
50-
"react-dom": "^18.2.0",
49+
"react": "^19.0.0",
50+
"react-dom": "^19.0.0",
5151
"react-native": "^0.69.4",
52-
"react-test-renderer": "^18.2.0",
53-
"rimraf": "^3.0.2",
54-
"typescript": "^4.7.4",
55-
"vite": "^3.0.9"
52+
"react-test-renderer": "^19.0.0",
53+
"rimraf": "^5.0.0",
54+
"typescript": "^5.7.3",
55+
"vite": "^6.0.11"
5656
},
5757
"dependencies": {
58-
"@types/react-reconciler": "^0.26.7",
58+
"@types/react-reconciler": "^0.28.9",
5959
"@types/webxr": "*",
60-
"its-fine": "^1.1.1",
61-
"react-reconciler": "^0.27.0",
60+
"its-fine": "^1.2.5",
61+
"react-reconciler": "^0.31.0",
6262
"react-use-measure": "^2.1.1",
63-
"scheduler": "^0.23.0",
63+
"scheduler": "^0.25.0",
6464
"suspend-react": "^0.1.3",
6565
"zustand": "^4.5.2"
6666
},
6767
"peerDependencies": {
6868
"expo-gl": ">=11.4",
6969
"ogl": ">=1",
70-
"react": ">=18.0",
71-
"react-dom": ">=18.0",
72-
"react-native": ">=0.69"
70+
"react": "^19.0",
71+
"react-dom": "^19.0",
72+
"react-native": ">=0.78"
7373
},
7474
"peerDependenciesMeta": {
7575
"react-dom": {

src/Canvas.native.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ import { events as createTouchEvents } from './events.native' // explicitly requ
77
import { RenderProps } from './types'
88
import { render, unmountComponentAtNode } from './renderer'
99

10-
export interface CanvasProps extends Omit<RenderProps, 'size' | 'dpr'>, ViewProps {
10+
// TODO: React 19 needs support from react-native
11+
const _View = View as any
12+
13+
export interface CanvasProps extends Omit<RenderProps, 'size' | 'dpr'>, Omit<ViewProps, 'children'> {
1114
children: React.ReactNode
1215
style?: ViewStyle
1316
}
@@ -51,6 +54,7 @@ const CanvasImpl = React.forwardRef<View, CanvasProps>(function Canvas(
5154
// Render to screen
5255
if (canvas && width > 0 && height > 0) {
5356
render(
57+
// @ts-expect-error
5458
<Bridge>
5559
<ErrorBoundary set={setError}>
5660
<React.Suspense fallback={<Block set={setBlock} />}>{children}</React.Suspense>
@@ -95,9 +99,9 @@ const CanvasImpl = React.forwardRef<View, CanvasProps>(function Canvas(
9599
}, [canvas])
96100

97101
return (
98-
<View {...props} ref={forwardedRef} onLayout={onLayout} style={{ flex: 1, ...style }} {...bind}>
102+
<_View {...props} ref={forwardedRef} onLayout={onLayout} style={{ flex: 1, ...style }} {...bind}>
99103
{width > 0 && <GLView onContextCreate={onContextCreate} style={StyleSheet.absoluteFill} />}
100-
</View>
104+
</_View>
101105
)
102106
})
103107

@@ -106,6 +110,7 @@ const CanvasImpl = React.forwardRef<View, CanvasProps>(function Canvas(
106110
*/
107111
export const Canvas = React.forwardRef<View, CanvasProps>(function CanvasWrapper(props, ref) {
108112
return (
113+
// @ts-expect-error
109114
<FiberProvider>
110115
<CanvasImpl {...props} ref={ref} />
111116
</FiberProvider>

src/Canvas.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ const CanvasImpl = React.forwardRef<HTMLCanvasElement, CanvasProps>(function Can
4949
// Render to screen
5050
if (canvas && width > 0 && height > 0) {
5151
render(
52+
// @ts-expect-error
5253
<Bridge>
5354
<ErrorBoundary set={setError}>
5455
<React.Suspense fallback={<Block set={setBlock} />}>{children}</React.Suspense>
@@ -99,6 +100,7 @@ const CanvasImpl = React.forwardRef<HTMLCanvasElement, CanvasProps>(function Can
99100
*/
100101
export const Canvas = React.forwardRef<HTMLCanvasElement, CanvasProps>(function CanvasWrapper(props, ref) {
101102
return (
103+
// @ts-expect-error
102104
<FiberProvider>
103105
<CanvasImpl {...props} ref={ref} />
104106
</FiberProvider>

src/hooks.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export const useIsomorphicLayoutEffect =
2323
*
2424
* **Note**: this is an escape hatch to react-internal fields. Expect this to change significantly between versions.
2525
*/
26-
export function useInstanceHandle<O>(ref: React.MutableRefObject<O>): React.MutableRefObject<Instance> {
26+
export function useInstanceHandle<O>(ref: React.RefObject<O>): React.RefObject<Instance> {
2727
const instance = React.useRef<Instance>(null!)
2828
useIsomorphicLayoutEffect(
2929
() => void (instance.current = (ref.current as unknown as Instance<O>['object']).__ogl!),

0 commit comments

Comments
 (0)