Files
2026-05-23 17:17:56 -07:00

56 lines
1.7 KiB
TypeScript

import { type MouseEvent } from 'react'
export const KEY_PREFIX_UPLOAD = 'upload_'
let route_index = 0
let route_state: { path: string; with: any; keep: any }[] = [{ path: getWindowPath(), with: null, keep: null }]
window.addEventListener('popstate', (e) => {
if (e.state?.route_index !== undefined) {
route_index = e.state.route_index
}
})
export function getWindowPath() {
return window.location.href.slice(window.location.origin.length)
}
export function setTitle(title: string) {
document.title = `${title} • gifuu`
}
export function routeTo(path: string, withData?: any, keepData?: any) {
route_state[route_index].keep = keepData ?? null
route_state.splice(route_index + 1)
route_state.push({ path, with: withData, keep: null })
route_index++
window.history.pushState({ route_index }, '', path)
window.dispatchEvent(new PopStateEvent('popstate'))
}
export function routeIntercept(event: MouseEvent<HTMLAnchorElement>, withData?: any, keepData?: any) {
if (event.currentTarget instanceof HTMLAnchorElement) {
event.preventDefault()
routeTo(event.currentTarget.getAttribute('href') ?? '/', withData, keepData)
}
}
export function routeBack() {
if (route_index <= 0) {
routeTo('/')
return
}
route_index--
const entry = route_state[route_index]
window.history.pushState({ route_index }, '', entry.path)
window.dispatchEvent(new PopStateEvent('popstate'))
}
export function routeBackURI() {
return route_state[route_index - 1]?.path ?? '/'
}
export function stateRecover<T>(): T | undefined {
return (route_state[route_index]?.with ?? route_state[route_index]?.keep) as T
}