Skip to content

Commit 52dcbd3

Browse files
committed
chore(component): refactor to simplify flow
1 parent a06cd03 commit 52dcbd3

File tree

1 file changed

+27
-26
lines changed

1 file changed

+27
-26
lines changed

src/lib/components/RouteComponent.svelte

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,10 @@
4848
routingSnippet?: RouterViewProps['routing'];
4949
} = $props();
5050
51-
type ComponentOrSnippet = Component | Snippet<[unknown]>;
51+
type ComponentOrSnippet = Component | Snippet<[any]>;
5252
53-
// Resolve route, loading or error component to be rendered
54-
let ResolvedComponent = $state<ComponentOrSnippet>();
53+
// If we should force a remount on route change
54+
const force = $derived<boolean>(!!(transition?.updateOnRouteChange || router?.routing?.options?.force));
5555
5656
// Generate a unique identifier for each loading state, to prevent cancelled navigations from updating the view
5757
const change: ViewChangeEvent = $derived(new ViewChangeEvent({ view: { id: view.id, name: view.name }, route }));
@@ -69,8 +69,28 @@
6969
// Delay properties update until component is resolved
7070
let _properties: ComponentProps | undefined = $state();
7171
72-
// If we should force a remount on route change
73-
const force = $derived<boolean>(!!(transition?.updateOnRouteChange || router?.routing?.options?.force));
72+
// Resolved route component when async loading & error handling is complete
73+
let resolvedComponent = $state<ComponentOrSnippet>();
74+
75+
// Routed component to be rendered (loading, error, or resolved component)
76+
const routedComponent = $derived.by<ComponentOrSnippet | undefined>(() => {
77+
if (view.loading && loading) return loading;
78+
else if (view.loading && loadingSnippet) return loadingSnippet;
79+
else if (view.error && error) return error;
80+
else if (view.error && errorSnippet) return errorSnippet;
81+
else if (resolvedComponent) return resolvedComponent;
82+
});
83+
84+
// Trigger transition on route change or component update
85+
const transitionKey = $derived.by(() => {
86+
const _keys: any[] = [routedComponent];
87+
88+
if (transition?.updateOnPropsChange) _keys.push(_properties);
89+
if (routingSnippet) _keys.push(routing);
90+
91+
console.info('Transition key changed:', _keys);
92+
return _keys;
93+
});
7494
// Final unique identifier for the current route change
7595
let resolvedID = $state();
7696
@@ -87,7 +107,7 @@
87107
},
88108
onLoaded: (_component?: AnyComponent | AnySnippet) => {
89109
if (change.uuid !== _uuid) return;
90-
ResolvedComponent = _component;
110+
resolvedComponent = _component;
91111
_properties = properties;
92112
if (force) resolvedID = _uuid;
93113
return untrack(() => view.complete());
@@ -104,25 +124,6 @@
104124
$effect(() => {
105125
resolveComponent(component, listeners);
106126
});
107-
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-
116-
// Trigger transition on route change or component update
117-
const transitionKey = $derived.by(() => {
118-
const _keys: any[] = [routedComponent];
119-
120-
if (transition?.updateOnPropsChange) _keys.push(_properties);
121-
if (routingSnippet) _keys.push(routing);
122-
123-
console.info('Transition key changed:', _keys);
124-
return _keys;
125-
});
126127
</script>
127128

128129
{#snippet resolved(ComponentOrSnippet: ComponentOrSnippet)}
@@ -138,7 +139,7 @@
138139
{#snippet result()}
139140
{#if routing && routingSnippet}
140141
{@render routingSnippet(router.routing)}
141-
{:else}
142+
{:else if routedComponent}
142143
{@render resolved(routedComponent)}
143144
{/if}
144145
{/snippet}

0 commit comments

Comments
 (0)