Files
kjol/go/wasmruntime/router.go

39 lines
951 B
Go

//go:build js && wasm
package wasmruntime
import (
"syscall/js"
"kjol/vdom"
)
// Router holds the current path in a signal, so reading Path() during render
// re-renders on navigation (and browser back/forward).
type Router struct {
path *vdom.Signal[string]
}
func NewRouter() *Router {
r := &Router{path: vdom.NewSignal(currentPath())}
popstate := js.FuncOf(func(this js.Value, args []js.Value) any {
r.path.Set(currentPath())
return nil
})
js.Global().Call("addEventListener", "popstate", popstate)
return r
}
func currentPath() string {
return js.Global().Get("location").Get("pathname").String()
}
// Path returns the current route (reactive when read during render).
func (r *Router) Path() string { return r.path.Get() }
// Navigate pushes a history entry and re-renders (client-side SPA navigation).
func (r *Router) Navigate(path string) {
js.Global().Get("history").Call("pushState", nil, "", path)
r.path.Set(path)
}