//build +js,wasm package navigation import ( "syscall/js" ) type HistoryManager struct { router *Router window js.Value } func NewHistoryManager(router *Router) *HistoryManager { return &HistoryManager{ router: router, window: js.Global().Get("window"), } } func (h *HistoryManager) Start() { // Handle initial navigation currentPath := h.getCurrentPath() h.router.Navigate(currentPath) // Listen for browser back/forward events h.window.Call("addEventListener", "popstate", js.FuncOf(func(this js.Value, args []js.Value) interface{} { path := h.getCurrentPath() h.router.Navigate(path) return nil })) } func (h *HistoryManager) PushState(path string) { h.window.Get("history").Call("pushState", nil, "", path) h.router.Navigate(path) } func (h *HistoryManager) ReplaceState(path string) { h.window.Get("history").Call("replaceState", nil, "", path) h.router.Navigate(path) } func (h *HistoryManager) Back() { h.window.Get("history").Call("back") } func (h *HistoryManager) Forward() { h.window.Get("history").Call("forward") } func (h *HistoryManager) getCurrentPath() string { location := h.window.Get("location") pathname := location.Get("pathname").String() search := location.Get("search").String() path := pathname if search != "" { path += search } return path }