Skip to content

Commit f61e710

Browse files
committed
fix: rive crash in New Folder/Subfolder dialogs and folder components (#1409)
1 parent bdf23c8 commit f61e710

File tree

3 files changed

+74
-14
lines changed

3 files changed

+74
-14
lines changed

apps/web/app/(org)/dashboard/caps/components/Folders.tsx

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,19 @@ export const NormalFolder = React.forwardRef<
2929
() => ({
3030
play: (animationName: string) => {
3131
if (!rive) return;
32-
rive.play(animationName);
32+
try {
33+
rive.play(animationName);
34+
} catch (error) {
35+
console.warn("Failed to play folder animation", error);
36+
}
3337
},
3438
stop: () => {
3539
if (!rive) return;
36-
rive.stop();
40+
try {
41+
rive.stop();
42+
} catch (error) {
43+
console.warn("Failed to stop folder animation", error);
44+
}
3745
},
3846
}),
3947
[rive],
@@ -66,11 +74,19 @@ export const BlueFolder = React.forwardRef<
6674
() => ({
6775
play: (animationName: string) => {
6876
if (!rive) return;
69-
rive.play(animationName);
77+
try {
78+
rive.play(animationName);
79+
} catch (error) {
80+
console.warn("Failed to play folder animation", error);
81+
}
7082
},
7183
stop: () => {
7284
if (!rive) return;
73-
rive.stop();
85+
try {
86+
rive.stop();
87+
} catch (error) {
88+
console.warn("Failed to stop folder animation", error);
89+
}
7490
},
7591
}),
7692
[rive],
@@ -98,11 +114,19 @@ export const RedFolder = React.forwardRef<
98114
() => ({
99115
play: (animationName: string) => {
100116
if (!rive) return;
101-
rive.play(animationName);
117+
try {
118+
rive.play(animationName);
119+
} catch (error) {
120+
console.warn("Failed to play folder animation", error);
121+
}
102122
},
103123
stop: () => {
104124
if (!rive) return;
105-
rive.stop();
125+
try {
126+
rive.stop();
127+
} catch (error) {
128+
console.warn("Failed to stop folder animation", error);
129+
}
106130
},
107131
}),
108132
[rive],
@@ -130,11 +154,19 @@ export const YellowFolder = React.forwardRef<
130154
() => ({
131155
play: (animationName: string) => {
132156
if (!rive) return;
133-
rive.play(animationName);
157+
try {
158+
rive.play(animationName);
159+
} catch (error) {
160+
console.warn("Failed to play folder animation", error);
161+
}
134162
},
135163
stop: () => {
136164
if (!rive) return;
137-
rive.stop();
165+
try {
166+
rive.stop();
167+
} catch (error) {
168+
console.warn("Failed to stop folder animation", error);
169+
}
138170
},
139171
}),
140172
[rive],
@@ -177,11 +209,19 @@ export const AllFolders = React.forwardRef<FolderHandle, AllFoldersProps>(
177209
() => ({
178210
play: (animationName: string) => {
179211
if (!rive) return;
180-
rive.play(animationName);
212+
try {
213+
rive.play(animationName);
214+
} catch (error) {
215+
console.warn("Failed to play folder animation", error);
216+
}
181217
},
182218
stop: () => {
183219
if (!rive) return;
184-
rive.stop();
220+
try {
221+
rive.stop();
222+
} catch (error) {
223+
console.warn("Failed to stop folder animation", error);
224+
}
185225
},
186226
}),
187227
[rive],

apps/web/app/(org)/dashboard/caps/components/NewFolderDialog.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,14 @@ export const NewFolderDialog: React.FC<Props> = ({
8383
src: "/rive/dashboard.riv",
8484
});
8585

86-
useEffect(() => {
87-
if (!open) setSelectedColor(null);
86+
useEffect(() => {
87+
if (!open) {
88+
setSelectedColor(null);
89+
// Stop all animations when dialog closes
90+
Object.values(folderRefs.current).forEach((ref) => {
91+
ref.current?.stop();
92+
});
93+
}
8894
}, [open]);
8995

9096
const folderRefs = useRef(
@@ -156,22 +162,27 @@ export const NewFolderDialog: React.FC<Props> = ({
156162
setSelectedColor(option.value);
157163
}}
158164
onMouseEnter={() => {
165+
if (!riveFile) return;
159166
const folderRef = folderRefs.current[option.value]?.current;
160167
if (!folderRef) return;
161168
folderRef.stop();
162169
folderRef.play("folder-open");
163170
}}
164171
onMouseLeave={() => {
172+
if (!riveFile) return;
165173
const folderRef = folderRefs.current[option.value]?.current;
166174
if (!folderRef) return;
167175
folderRef.stop();
168176
folderRef.play("folder-close");
169177
}}
170178
>
171-
{option.component(
179+
{riveFile && option.component(
172180
riveFile as RiveFile,
173181
folderRefs.current[option.value],
174182
)}
183+
{!riveFile && (
184+
<div className="w-[50px] h-[50px] bg-gray-4 rounded animate-pulse" />
185+
)}
175186
<p className="text-xs text-gray-10">{option.label}</p>
176187
</div>
177188
);

apps/web/app/(org)/dashboard/folder/[id]/components/SubfolderDialog.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ export const SubfolderDialog: React.FC<Props> = ({
9191
if (!open) {
9292
setSelectedColor(null);
9393
setFolderName("");
94+
// Stop any running animations when the dialog closes
95+
Object.values(folderRefs.current).forEach((ref) => {
96+
ref.current?.stop();
97+
});
9498
}
9599
}, [open]);
96100

@@ -163,21 +167,26 @@ export const SubfolderDialog: React.FC<Props> = ({
163167
setSelectedColor(option.value);
164168
}}
165169
onMouseEnter={() => {
170+
if (!riveFile) return;
166171
const folderRef = folderRefs.current[option.value]?.current;
167172
if (!folderRef) return;
168173
folderRef.stop();
169174
folderRef.play("folder-open");
170175
}}
171176
onMouseLeave={() => {
177+
if (!riveFile) return;
172178
const folderRef = folderRefs.current[option.value]?.current;
173179
if (!folderRef) return;
174180
folderRef.stop();
175181
folderRef.play("folder-close");
176182
}}
177183
>
178-
{option.component(
184+
{riveFile && option.component(
179185
riveFile as RiveFile,
180186
folderRefs.current[option.value],
187+
)}
188+
{!riveFile && (
189+
<div className="w-[50px] h-[50px] rounded bg-gray-4 animate-pulse" />
181190
)}
182191
<p className="text-xs text-gray-10">{option.label}</p>
183192
</div>

0 commit comments

Comments
 (0)