Skip to content

Radio Screen shell + Chat Timeline Store #44

@zeevenn

Description

@zeevenn

Parent

#39 — PRD: AI Radio — Host-driven Channel experience with chat timeline

What to build

Build the Radio Screen UI and the Chat Timeline Store. In this slice, the Host is not yet wired — use a stub Programme of local Tracks (no Interludes) to keep the screen live during development.

Chat Timeline Store (Radio context, @flow/radio or apps/mobile):

  • In-memory Zustand store (not persisted)
  • messages: ChatMessage[] — append-only ordered list
  • appendMessage(message: ChatMessage) → void
  • clearTimeline() → void
  • Write unit tests: given a sequence of appendMessage calls, assert messages contains the right items in the right order

Radio Screen (mobile app) — three vertical zones:

  • Top — Now Playing bar: Track title, artist name, play/pause button. Waveform visualiser is a placeholder ([~~~]) in this slice — filled in by a later issue (Waveform visualisation in Now Playing bar #49)
  • Middle — Chat timeline: FlashList (or FlatList) rendering ChatMessage items. now-playing messages are pushed to the timeline each time a new TrackSegment begins playing. Auto-scrolls to the latest message.
  • Bottom — Input bar: Text input field + microphone icon button (mic button is a stub — no action yet). Submitting text is a stub in this slice — wired in the Intervention issue (Interlude playback + chat timeline sync #47).

The stub Programme is just the first N tracks from queryCandidateSet with no Interludes. The goal is a navigable, scrollable screen with live now-playing cards.

Acceptance criteria

  • Chat Timeline Store exports messages, appendMessage, clearTimeline; unit tests pass
  • Radio Screen renders with the three-zone layout
  • Now Playing bar shows the current Track title and artist
  • A now-playing ChatMessage is appended and rendered in the timeline each time a new Track begins
  • Timeline auto-scrolls to the latest message
  • Text input and mic button are present in the bottom bar (stubs OK for this slice)
  • Navigating back to Channel Selection stops playback

Blocked by

Metadata

Metadata

Assignees

No one assigned

    Labels

    ready-for-agentReady for an AI agent to implement

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions