fix: add null/undefined guards for array access and navigation
- MasteryDisplay.svelte: Use optional chaining for split()[0] array access
- formatRingStat().split('+')[0] -> split('+')[0]?.trim() ?? ''
- formatEarringStat().split('+')[0] -> split('+')[0]?.trim() ?? ''
- TeamView.svelte: Same fix for formatAxSkill().split('+')[0]
- +layout.svelte: Add null guards for 'to' parameter and 'mainContent' in callback
- Check !to before accessing to.url
- Re-check !mainContent inside requestAnimationFrame callback
Fixes "Object is possibly 'undefined'" and "is possibly 'null'" errors with
noUncheckedIndexedAccess: true and strict null checks.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
de73c1937e
commit
bbaa5bf221
3 changed files with 7 additions and 6 deletions
|
|
@ -88,7 +88,7 @@
|
||||||
<ModificationSection title="AX Skills" visible={true}>
|
<ModificationSection title="AX Skills" visible={true}>
|
||||||
{#each weapon.ax as axSkill}
|
{#each weapon.ax as axSkill}
|
||||||
<StatModifierItem
|
<StatModifierItem
|
||||||
label={formatAxSkill(axSkill).split('+')[0].trim()}
|
label={formatAxSkill(axSkill).split('+')[0]?.trim() ?? ''}
|
||||||
value={`+${axSkill.strength}`}
|
value={`+${axSkill.strength}`}
|
||||||
suffix={axSkill.modifier <= 2 ? '' : '%'}
|
suffix={axSkill.modifier <= 2 ? '' : '%'}
|
||||||
variant="enhanced"
|
variant="enhanced"
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@
|
||||||
{#if iconUrl}
|
{#if iconUrl}
|
||||||
<img
|
<img
|
||||||
src={iconUrl}
|
src={iconUrl}
|
||||||
alt={formatRingStat(ring.modifier, ring.strength, locale).split('+')[0].trim()}
|
alt={formatRingStat(ring.modifier, ring.strength, locale).split('+')[0]?.trim() ?? ''}
|
||||||
class="mastery-icon"
|
class="mastery-icon"
|
||||||
/>
|
/>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
@ -54,7 +54,7 @@
|
||||||
<span class="mastery-content">
|
<span class="mastery-content">
|
||||||
{#if variant === 'detailed'}
|
{#if variant === 'detailed'}
|
||||||
<strong class="mastery-label">
|
<strong class="mastery-label">
|
||||||
{formatRingStat(ring.modifier, ring.strength, locale).split('+')[0].trim()}
|
{formatRingStat(ring.modifier, ring.strength, locale).split('+')[0]?.trim() ?? ''}
|
||||||
</strong>
|
</strong>
|
||||||
<span class="mastery-value">
|
<span class="mastery-value">
|
||||||
+{ring.strength}{getRingStat(ring.modifier)?.suffix || ''}
|
+{ring.strength}{getRingStat(ring.modifier)?.suffix || ''}
|
||||||
|
|
@ -81,7 +81,7 @@
|
||||||
{#if iconUrl}
|
{#if iconUrl}
|
||||||
<img
|
<img
|
||||||
src={iconUrl}
|
src={iconUrl}
|
||||||
alt={formatEarringStat(earring.modifier, earring.strength, locale, characterElement).split('+')[0].trim()}
|
alt={formatEarringStat(earring.modifier, earring.strength, locale, characterElement).split('+')[0]?.trim() ?? ''}
|
||||||
class="mastery-icon"
|
class="mastery-icon"
|
||||||
/>
|
/>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
@ -89,7 +89,7 @@
|
||||||
<span class="mastery-content">
|
<span class="mastery-content">
|
||||||
{#if variant === 'detailed'}
|
{#if variant === 'detailed'}
|
||||||
<strong class="mastery-label">
|
<strong class="mastery-label">
|
||||||
{formatEarringStat(earring.modifier, earring.strength, locale, characterElement).split('+')[0].trim()}
|
{formatEarringStat(earring.modifier, earring.strength, locale, characterElement).split('+')[0]?.trim() ?? ''}
|
||||||
</strong>
|
</strong>
|
||||||
<span class="mastery-value enhanced">
|
<span class="mastery-value enhanced">
|
||||||
+{earring.strength}{getElementalizedEarringStat(earring.modifier, characterElement, locale)?.suffix || ''}
|
+{earring.strength}{getElementalizedEarringStat(earring.modifier, characterElement, locale)?.suffix || ''}
|
||||||
|
|
|
||||||
|
|
@ -58,10 +58,11 @@
|
||||||
|
|
||||||
// Handle scroll restoration or reset after navigation
|
// Handle scroll restoration or reset after navigation
|
||||||
afterNavigate(({ from, to, type }) => {
|
afterNavigate(({ from, to, type }) => {
|
||||||
if (!mainContent) return;
|
if (!mainContent || !to) return;
|
||||||
|
|
||||||
// Use requestAnimationFrame to ensure DOM has updated
|
// Use requestAnimationFrame to ensure DOM has updated
|
||||||
requestAnimationFrame(() => {
|
requestAnimationFrame(() => {
|
||||||
|
if (!mainContent) return;
|
||||||
const key = to.url.pathname + to.url.search;
|
const key = to.url.pathname + to.url.search;
|
||||||
|
|
||||||
// Only restore scroll for browser back/forward navigation
|
// Only restore scroll for browser back/forward navigation
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue