Wiring It Up
The entry point ties form submission, state, rendering, and the API together.
(bind form (document:get-element-by-id "shorten-form"))
(bind input (document:get-element-by-id "url-input"))
(form:add-event-listener "submit" (async (fn (:any event)
(event:prevent-default)
(bind url input:value)
(set-error null)
(match (await (shorten-url url))
((Ok data)
(set! input:value "")
(await (refresh-entries)))
((Err message)
(set-error message))))))
;; Initial load
(await (refresh-entries))
The flow:
- Page loads, compiled JS runs
refresh-entriesfetches existing URLs from the server- State updates,
renderruns, entries appear - User submits form →
shorten-urlPOSTs to server - On success: clear input, refresh entries
- On error: update state with error message, re-render
Every state change goes through update-state, which calls render.