Skip to content

Commit 95e9890

Browse files
committed
fix: type fixes
1 parent 520d1b5 commit 95e9890

6 files changed

Lines changed: 89 additions & 18 deletions

File tree

packages/react/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
"react-dom": ">=17.0.0"
3232
},
3333
"devDependencies": {
34+
"@testing-library/jest-dom": "^6.6.3",
3435
"@testing-library/react": "^16.1.0",
3536
"@types/react": "^19.0.0",
3637
"@types/react-dom": "^19.0.0",

packages/react/src/hooks/useVolatileState.test.tsx

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import React, { Component, type ReactNode } from "react";
12
import { describe, it, expect, vi, beforeEach } from "vitest";
23
import { render, act, screen } from "@testing-library/react";
34
import { VolatileProvider } from "../provider/VolatileProvider";
@@ -33,6 +34,23 @@ function renderWithProvider(ui: React.ReactElement, seed = 42) {
3334
);
3435
}
3536

37+
class ErrorBoundary extends Component<
38+
{ children: ReactNode },
39+
{ error: boolean }
40+
> {
41+
state = { error: false };
42+
static getDerivedStateFromError() {
43+
return { error: true };
44+
}
45+
render() {
46+
return this.state.error ? (
47+
<span data-testid="error">caught</span>
48+
) : (
49+
this.props.children
50+
);
51+
}
52+
}
53+
3654
describe("useVolatileState", () => {
3755
beforeEach(() => {
3856
vi.useFakeTimers();
@@ -92,23 +110,6 @@ describe("useVolatileState", () => {
92110
return <button onClick={() => setCount(count + 1)}>{count}</button>;
93111
}
94112

95-
class ErrorBoundary extends React.Component<
96-
{ children: React.ReactNode },
97-
{ error: boolean }
98-
> {
99-
state = { error: false };
100-
static getDerivedStateFromError() {
101-
return { error: true };
102-
}
103-
render() {
104-
return this.state.error ? (
105-
<span data-testid="error">caught</span>
106-
) : (
107-
this.props.children
108-
);
109-
}
110-
}
111-
112113
renderWithProvider(
113114
<ErrorBoundary>
114115
<ErrorCounter />

packages/react/src/hooks/useVolatileState.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,16 @@ export function useVolatileState<T>(
1515
): [T, React.Dispatch<React.SetStateAction<T>>] {
1616
const engine = useVolatileEngine();
1717
const [state, setState] = useState(initialState);
18+
const [pendingError, setPendingError] = useState<VolatileError | null>(null);
1819
const delayTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);
1920
const target = options.name ?? "useState";
2021
const component = options.component;
2122

23+
// Throw during render so ErrorBoundary can catch it
24+
if (pendingError) {
25+
throw pendingError;
26+
}
27+
2228
useEffect(() => {
2329
return () => {
2430
if (delayTimerRef.current) clearTimeout(delayTimerRef.current);
@@ -46,7 +52,8 @@ export function useVolatileState<T>(
4652
break;
4753
}
4854
case "error":
49-
throw new VolatileError("state", "error", target, component);
55+
setPendingError(new VolatileError("state", "error", target, component));
56+
break;
5057
case "corrupt": {
5158
const resolvedValue =
5259
typeof action === "function"

packages/react/vitest.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ export default defineConfig({
44
test: {
55
globals: true,
66
environment: "jsdom",
7+
setupFiles: ["./vitest.setup.ts"],
78
},
89
});

packages/react/vitest.setup.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import "@testing-library/jest-dom/vitest";

pnpm-lock.yaml

Lines changed: 60 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)