57 lines
1.3 KiB
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 />
|