|
48 | 48 | routingSnippet?: RouterViewProps['routing'];
|
49 | 49 | } = $props();
|
50 | 50 |
|
51 |
| - type ComponentOrSnippet = Component | Snippet<[any]>; |
| 51 | + type IComponentOrSnippet = Component | Snippet<[any]>; |
52 | 52 |
|
53 | 53 | // If we should force a remount on route change
|
54 | 54 | const force = $derived<boolean>(!!(transition?.updateOnRouteChange || router?.routing?.options?.force));
|
|
70 | 70 | let _properties: ComponentProps | undefined = $state();
|
71 | 71 |
|
72 | 72 | // Resolved route component when async loading & error handling is complete
|
73 |
| - let resolvedComponent = $state<ComponentOrSnippet>(); |
| 73 | + let resolvedComponent = $state<IComponentOrSnippet>(); |
74 | 74 |
|
75 | 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; |
| 76 | + const routedComponent = $derived.by<IComponentOrSnippet | undefined>(() => { |
| 77 | + if (routing && routingSnippet) return routingSnippet; |
| 78 | + else if (view.loading && loading) return loading; |
78 | 79 | else if (view.loading && loadingSnippet) return loadingSnippet;
|
79 | 80 | else if (view.error && error) return error;
|
80 | 81 | else if (view.error && errorSnippet) return errorSnippet;
|
81 | 82 | else if (resolvedComponent) return resolvedComponent;
|
82 | 83 | });
|
83 | 84 |
|
| 85 | + // Routed snippet properties |
| 86 | + const routedProps = $derived.by(() => { |
| 87 | + if (routedComponent === errorSnippet) return view.error; |
| 88 | + if (routedComponent === routingSnippet) return router.routing; |
| 89 | + if (routedComponent === loadingSnippet) return route; |
| 90 | + return _properties; |
| 91 | + }); |
| 92 | +
|
84 | 93 | // Trigger transition on route change or component update
|
85 | 94 | const transitionKey = $derived.by(() => {
|
86 |
| - const _keys: any[] = [routedComponent]; |
87 |
| -
|
| 95 | + const _keys = [routedComponent]; |
88 | 96 | if (transition?.updateOnPropsChange) _keys.push(_properties);
|
89 |
| - if (routingSnippet) _keys.push(routing); |
90 |
| -
|
91 | 97 | return _keys;
|
92 | 98 | });
|
93 | 99 | // Final unique identifier for the current route change
|
|
125 | 131 | });
|
126 | 132 | </script>
|
127 | 133 |
|
128 |
| -{#snippet resolved(ComponentOrSnippet: ComponentOrSnippet)} |
| 134 | +{#snippet resolved(ComponentOrSnippet: IComponentOrSnippet)} |
129 | 135 | {#key resolvedID}
|
130 | 136 | {#if isSnippet(ComponentOrSnippet)}
|
131 |
| - {@render ComponentOrSnippet(view.error ?? (view.loading ? route : _properties))} |
| 137 | + {@render ComponentOrSnippet(routedProps)} |
132 | 138 | {:else}
|
133 | 139 | <ComponentOrSnippet error={view.error} {..._properties} />
|
134 | 140 | {/if}
|
135 | 141 | {/key}
|
136 | 142 | {/snippet}
|
137 | 143 |
|
138 | 144 | {#snippet result()}
|
139 |
| - {#if routing && routingSnippet} |
140 |
| - {@render routingSnippet(router.routing)} |
141 |
| - {:else if routedComponent} |
| 145 | + {#if routedComponent} |
142 | 146 | {@render resolved(routedComponent)}
|
143 | 147 | {/if}
|
144 | 148 | {/snippet}
|
|
0 commit comments