generateur_v3/frontend/src/context/Navigation.svelte

57 lines
1.3 KiB
Svelte

<script lang="ts">
import { browser } from '$app/environment';
import { goto, afterNavigate } from '$app/navigation';
import { setContext } from 'svelte';
import { page } from '$app/stores';
import { base } from '$app/paths';
let previous: string[] = [base];
let first = true;
const insertUrl = (url: string, id: number = -1)=>{
if(id >= 0){
previous.splice(id, 0, `${base}/${url}`)}
else if(id == -1){
previous.push(`${base}/${url}`)
}
}
const navigate = (
url: string | number,
params: object | undefined,
options:
| {
replaceState?: boolean | undefined;
noScroll?: boolean | undefined;
keepFocus?: boolean | undefined;
state?: any;
invalidateAll?: boolean | undefined;
}
| undefined
) => {
if (browser) {
if (typeof url == 'number' && previous != null) {
const id = Math.abs(url);
if (previous.length > id) {
goto(previous.reverse()[id-1]);
} else{
goto(previous.reverse()[0])
}
} else {
const parsedParams = new URLSearchParams(params as Record<string, string>);
goto(`${url}?${parsedParams.toString()}`, { ...options });
}
first = false;
}
};
afterNavigate(({ from }) => {
if (from ) {
previous.push(from?.url.toString());
}
});
setContext('navigation', { navigate, insertUrl });
</script>
<slot />