|
1 | 1 | import type { Attachment } from 'svelte/attachments'; |
2 | 2 |
|
3 | | -import type { LinkNavigateFunction, LinkNavigateOptions } from '~/models/link.model.js'; |
| 3 | +import type { LinkNavigateOptions } from '~/models/link.model.js'; |
4 | 4 |
|
5 | | -import { ensureLinkRouter, getNavigateFunction, getResolveFunction, normalizeLinkAttributes } from '~/models/link.model.js'; |
6 | | -import { getRouter } from '~/router/context.svelte.js'; |
| 5 | +import { link } from '~/action/link.action.svelte.js'; |
7 | 6 |
|
8 | 7 | /** |
9 | 8 | * A svelte attachment to add to an element to navigate to a new location using the router. |
@@ -38,27 +37,5 @@ import { getRouter } from '~/router/context.svelte.js'; |
38 | 37 | * ``` |
39 | 38 | */ |
40 | 39 | export function useLink(options: LinkNavigateOptions = {}): Attachment<HTMLElement> { |
41 | | - return (element) => { |
42 | | - const _options = $state(normalizeLinkAttributes(element, options)); |
43 | | - |
44 | | - const router = _options?.router || getRouter(); |
45 | | - if (!ensureLinkRouter(element, router)) return; |
46 | | - |
47 | | - const navigate = $derived<LinkNavigateFunction | undefined>(getNavigateFunction(router, options)); |
48 | | - const navigateHandler = async (event: MouseEvent | KeyboardEvent) => navigate?.(event, element); |
49 | | - |
50 | | - const resolve = $derived(getResolveFunction(navigate, _options)); |
51 | | - const resolveHandler = async (event: FocusEvent | PointerEvent) => resolve(event, element); |
52 | | - |
53 | | - element.addEventListener('click', navigateHandler); |
54 | | - element.addEventListener('keydown', navigateHandler); |
55 | | - element.addEventListener('pointerenter', resolveHandler); |
56 | | - element.addEventListener('focus', resolveHandler); |
57 | | - return () => { |
58 | | - element.removeEventListener('click', navigateHandler); |
59 | | - element.removeEventListener('keydown', navigateHandler); |
60 | | - element.removeEventListener('pointerenter', resolveHandler); |
61 | | - element.removeEventListener('focus', resolveHandler); |
62 | | - }; |
63 | | - }; |
| 40 | + return element => link(element, options).destroy; |
64 | 41 | } |
0 commit comments