mirror of
https://github.com/immich-app/immich.git
synced 2026-03-23 23:09:45 +03:00
* feat: expand/collapse sidebar * fix: general PR cleanup - add skip link unit test - remove unused tailwind styles - adjust asset grid spacing - fix event propogation * fix: cleaning up event listeners * fix: purchase modal and button on small screens * fix: explicit tailwind classes * fix: no animation on initial page load * fix: sidebar spacing and reactivity * chore: reverting changes to icons in nav and account info panel * fix: remove left margin from the asset grid after merging in new timeline * chore: extract search-bar changes for a separate PR * fix: add margin to memories
48 lines
1.2 KiB
TypeScript
48 lines
1.2 KiB
TypeScript
import { matchesShortcut } from '$lib/actions/shortcut';
|
|
import type { ActionReturn } from 'svelte/action';
|
|
|
|
interface Options {
|
|
onOutclick?: () => void;
|
|
onEscape?: () => void;
|
|
}
|
|
|
|
/**
|
|
* Calls a function when a click occurs outside of the element, or when the escape key is pressed.
|
|
* @param node
|
|
* @param options Object containing onOutclick and onEscape functions
|
|
* @returns
|
|
*/
|
|
export function clickOutside(node: HTMLElement, options: Options = {}): ActionReturn {
|
|
const { onOutclick, onEscape } = options;
|
|
|
|
const handleClick = (event: MouseEvent) => {
|
|
const targetNode = event.target as Node | null;
|
|
if (node.contains(targetNode)) {
|
|
return;
|
|
}
|
|
|
|
onOutclick?.();
|
|
};
|
|
|
|
const handleKey = (event: KeyboardEvent) => {
|
|
if (!matchesShortcut(event, { key: 'Escape' })) {
|
|
return;
|
|
}
|
|
|
|
if (onEscape) {
|
|
event.stopPropagation();
|
|
onEscape();
|
|
}
|
|
};
|
|
|
|
document.addEventListener('mousedown', handleClick, false);
|
|
node.addEventListener('keydown', handleKey, false);
|
|
|
|
return {
|
|
destroy() {
|
|
document.removeEventListener('mousedown', handleClick, false);
|
|
node.removeEventListener('keydown', handleKey, false);
|
|
},
|
|
};
|
|
}
|