Skip to content

Commit 84fdfac

Browse files
committed
fix: catch RiveFile initialization error in hook
1 parent b25c775 commit 84fdfac

File tree

2 files changed

+47
-15
lines changed

2 files changed

+47
-15
lines changed

src/hooks/useRiveFile.ts

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,25 @@ function useRiveFile(params: UseRiveFileParameters): RiveFileState {
2323
let file: RiveFile | null = null;
2424

2525
const loadRiveFile = async () => {
26-
setStatus('loading');
27-
file = new RiveFile(params);
28-
file.init();
29-
file.on(EventType.Load, () => {
30-
// We request an instance to add +1 to the referencesCount so it doesn't get destroyed
31-
// while this hook is active
32-
file?.getInstance();
26+
try {
27+
setStatus('loading');
28+
file = new RiveFile(params);
29+
file.init();
30+
file.on(EventType.Load, () => {
31+
// We request an instance to add +1 to the referencesCount so it doesn't get destroyed
32+
// while this hook is active
33+
file?.getInstance();
34+
setRiveFile(file);
35+
setStatus('success');
36+
});
37+
file.on(EventType.LoadError, () => {
38+
setStatus('failed');
39+
});
3340
setRiveFile(file);
34-
setStatus('success');
35-
});
36-
file.on(EventType.LoadError, () => {
41+
} catch (error) {
42+
console.error(error);
3743
setStatus('failed');
38-
});
39-
setRiveFile(file);
44+
}
4045
};
4146

4247
loadRiveFile();

test/useRiveFile.test.tsx

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ describe('useRiveFile', () => {
2323
mocked(RiveFile).mockClear();
2424
});
2525

26+
27+
2628
it('initializes RiveFile with provided parameters', async () => {
2729
const params = {
2830
src: 'file-src',
@@ -38,7 +40,7 @@ describe('useRiveFile', () => {
3840
it('cleans up RiveFile on unmount', async () => {
3941
const params = {
4042
src: 'file-src',
41-
enableRiveAssetCDN: false
43+
enableRiveAssetCDN: false
4244
};
4345

4446
const { result, unmount } = renderHook(() => useRiveFile(params));
@@ -54,7 +56,7 @@ describe('useRiveFile', () => {
5456
it('does not reinitialize RiveFile if src has not changed', async () => {
5557
const params = {
5658
src: 'file-src',
57-
enableRiveAssetCDN: false
59+
enableRiveAssetCDN: false
5860
};
5961

6062
const { rerender } = renderHook(() => useRiveFile(params));
@@ -64,7 +66,7 @@ describe('useRiveFile', () => {
6466
expect(RiveFile).toHaveBeenCalledTimes(1);
6567
});
6668

67-
it('does not reinitialize RiveFile if buffer has not changed', async () => {
69+
it('does not reinitialize RiveFile if buffer has not changed', async () => {
6870
const params = {
6971
buffer: new ArrayBuffer(10),
7072
enableRiveAssetCDN: false
@@ -112,4 +114,29 @@ describe('useRiveFile', () => {
112114

113115
expect(RiveFile).toHaveBeenCalledTimes(2);
114116
});
117+
118+
it('handles RiveFile initialization failure gracefully', async () => {
119+
120+
const consoleSpy = jest.spyOn(console, 'error').mockImplementation(() => { });
121+
const error = new Error("Initialization failed");
122+
123+
mocked(RiveFile).mockImplementation(() => {
124+
throw error;
125+
});
126+
127+
const params = {
128+
src: 'file-src',
129+
enableRiveAssetCDN: false,
130+
};
131+
132+
const { result, rerender } = renderHook(() => useRiveFile(params));
133+
134+
rerender();
135+
136+
expect(result.current.status).toBe('failed');
137+
expect(result.current.riveFile).toBeNull();
138+
expect(consoleSpy).toHaveBeenCalledWith(error);
139+
140+
consoleSpy.mockRestore();
141+
});
115142
});

0 commit comments

Comments
 (0)