Skip to content

Commit a06cd03

Browse files
committed
fix(transition): simplify logic & rework keyed transition
1 parent b92c205 commit a06cd03

File tree

1 file changed

+21
-24
lines changed

1 file changed

+21
-24
lines changed

src/lib/components/RouteComponent.svelte

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
let _properties: ComponentProps | undefined = $state();
7171
7272
// If we should force a remount on route change
73-
const force = $derived(transition?.updateOnRouteChange || router?.routing?.options?.force);
73+
const force = $derived<boolean>(!!(transition?.updateOnRouteChange || router?.routing?.options?.force));
7474
// Final unique identifier for the current route change
7575
let resolvedID = $state();
7676
@@ -83,7 +83,6 @@
8383
},
8484
onLoading: () => {
8585
if (change.uuid !== _uuid) return;
86-
ResolvedComponent = loading;
8786
return untrack(() => view.load());
8887
},
8988
onLoaded: (_component?: AnyComponent | AnySnippet) => {
@@ -95,7 +94,6 @@
9594
},
9695
onError: (err: unknown) => {
9796
if (change.uuid !== _uuid) return;
98-
ResolvedComponent = error;
9997
if (force) resolvedID = _uuid;
10098
return untrack(() => view.fail(err));
10199
},
@@ -107,42 +105,41 @@
107105
resolveComponent(component, listeners);
108106
});
109107
108+
const routedComponent = $derived.by(() => {
109+
if (view.loading && loading) return loading;
110+
else if (view.loading && loadingSnippet) return loadingSnippet;
111+
else if (view.error && error) return error;
112+
else if (view.error && errorSnippet) return errorSnippet;
113+
else if (ResolvedComponent) return ResolvedComponent;
114+
});
115+
110116
// Trigger transition on route change or component update
111117
const transitionKey = $derived.by(() => {
112-
const _keys: any[] = [ResolvedComponent];
118+
const _keys: any[] = [routedComponent];
119+
113120
if (transition?.updateOnPropsChange) _keys.push(_properties);
114121
if (routingSnippet) _keys.push(routing);
122+
123+
console.info('Transition key changed:', _keys);
115124
return _keys;
116125
});
117126
</script>
118127

119128
{#snippet resolved(ComponentOrSnippet: ComponentOrSnippet)}
120-
<!-- {#if ResolvedComponent} -->
121-
{#if isSnippet(ComponentOrSnippet)}
122-
{@render ComponentOrSnippet(view.error ?? (view.loading ? route : _properties))}
123-
{:else}
124-
<ComponentOrSnippet error={view.error} {..._properties} />
125-
{/if}
126-
<!-- {/if} -->
127-
{/snippet}
128-
129-
{#snippet routed()}
130-
{#if ResolvedComponent}
131-
{#key resolvedID}
132-
{@render resolved(ResolvedComponent)}
133-
{/key}
134-
{:else if view.loading}
135-
{@render loadingSnippet?.(route)}
136-
{:else if view.error}
137-
{@render errorSnippet?.(view.error)}
138-
{/if}
129+
{#key resolvedID}
130+
{#if isSnippet(ComponentOrSnippet)}
131+
{@render ComponentOrSnippet(view.error ?? (view.loading ? route : _properties))}
132+
{:else}
133+
<ComponentOrSnippet error={view.error} {..._properties} />
134+
{/if}
135+
{/key}
139136
{/snippet}
140137

141138
{#snippet result()}
142139
{#if routing && routingSnippet}
143140
{@render routingSnippet(router.routing)}
144141
{:else}
145-
{@render routed()}
142+
{@render resolved(routedComponent)}
146143
{/if}
147144
{/snippet}
148145

0 commit comments

Comments
 (0)