Primitives / Device

Start with one: where the device is

ts
import { Schema } from 'effect'
import type { HtmlBuilder } from 'foldkit/html'
import { Bundle } from 'foldkit-bundle'
import { Geolocation } from 'foldkit-primitives/device'

const Page = Bundle.compose({}).pipe(Bundle.withChild('here', Geolocation))
type Model = typeof Page.Model.Type
type Message = typeof Page.Message.Type
const { placements } = Page

const config = placements.complete({
  init: () => placements.initial({}),
  update: placements.update(model => ({ model })),
  view: (model: Model, h: HtmlBuilder<Message>) => h.div([], [model.here.status]),
  subscriptions: placements.subscriptions(),
})

The status starts unknown with no coordinates. Subscribing starts watchPosition; Located stores a fix and marks it ready. Denied is its own status (permission code 1), which a view can act on; any other error is Failed, which keeps the last fix and notes lastError. Unsubscribing clears the watch. Without a geolocation API the stream is empty.