diff --git a/src/modules/main/modules/skills/components/Skills.tsx b/src/modules/main/modules/skills/components/Skills.tsx index 253bba8..bd54d32 100644 --- a/src/modules/main/modules/skills/components/Skills.tsx +++ b/src/modules/main/modules/skills/components/Skills.tsx @@ -1,53 +1,72 @@ -import {useEffect, useState} from 'react'; +import {useCallback, useEffect, useState} from 'react'; import type {CharacterData} from '@/types/CharacterJson.ts'; import {loadSkillsWithValues, type SkillWithValue} from '@/utils/loaders.ts'; export default function Skills({jsonData}: { jsonData: CharacterData }) { const [skills, setSkills] = useState([]); - const [loading, setLoading] = useState(true); + const [loading, setLoading] = useState(false); const [error, setError] = useState(null); - useEffect(() => { - let isMounted = true; + const resetToDefaults = useCallback(() => { + setSkills([]); + }, []); + + const loadData = useCallback(async (signal: AbortSignal) => { + setLoading(true); + setError(null); - const loadData = async () => { - try { - setLoading(true); - // Load skills with their values using the new loader function - const loadedSkills = await loadSkillsWithValues(jsonData.talents); - - if (isMounted) { - setSkills(loadedSkills); - setLoading(false); - } - } catch (error) { - console.error('Error loading skills:', error); - if (isMounted) { - setError('Failed to load skills. Please try again.'); - setLoading(false); - } + try { + // Load skills with their values using the new loader function + const loadedSkills = await loadSkillsWithValues(jsonData.talents); + + // Check if component is still mounted and request wasn't cancelled + if (signal.aborted) return; + + setSkills(loadedSkills); + } catch (err) { + if (signal.aborted) return; + + const errorMessage = err instanceof Error ? err.message : 'Unknown error occurred'; + console.error('Error loading skills:', errorMessage); + setError('Failed to load skills. Please try again.'); + + // Reset to default values on error + resetToDefaults(); + } finally { + if (!signal.aborted) { + setLoading(false); } - }; + } + }, [jsonData.talents, resetToDefaults]); + + useEffect(() => { + const abortController = new AbortController(); - loadData(); + loadData(abortController.signal); return () => { - isMounted = false; + abortController.abort(); }; - }, [jsonData.talents]); + }, [loadData]); if (loading) { - return
Loading skills...
; + return
Loading skills...
; } if (error) { - return
{error}
; + return ( +
+ Error loading skills: {error} +
+ ); } if (skills.length === 0) { return
No skills found.
; } + console.log(jsonData); + return (

Skills

@@ -56,7 +75,9 @@ export default function Skills({jsonData}: { jsonData: CharacterData }) {

{skill.name}

- + {skill.value}
@@ -70,12 +91,12 @@ export default function Skills({jsonData}: { jsonData: CharacterData }) { {/* */} {/*
*/} {/*)}*/} - {/*{skill.tools && (*/} - {/*
*/} - {/*

Tools:

*/} - {/*

{skill.tools}

*/} - {/*
*/} - {/*)}*/} + {skill.tools && ( +
+

Tools:

+

{skill.tools}

+
+ )}
))}