View Mission
The mission as living document
Overview
This is where a mission stops being a row in a list and becomes a thing. The hero shows the three vision-board images at low opacity behind the mission name, with the agent code (e.g. AGENT 0086BBUL) and days remaining stamped in mono on top. Below that, the checkpoint list — every checkpoint is its own collapsible section with the goals scheduled under it. A 'supporters' row shows the avatar stack of agents who tapped 'I'm on this with you' — those agents see this mission in their own missions tab too. A share button generates a deep link (protocol-four://mission/[id]) that opens this exact screen on another agent's device.
How it works
Three queries: `missions.get` (the mission doc + signed cover image URLs), `checkpoints.listByMission`, and `goals.listByMission`.
The vision board renders as a stack of three overlapping `<Image>` elements at 30% opacity with a gradient overlay on top — this is where the VisionBoard component pays for itself the second time.
Checkpoints are sorted by `order` and rendered as accordion-style sections. Tapping one toggles its goals beneath. The default 'FOUNDATION' checkpoint is always first.
Supporters are pulled via `missions.listSupporters` and rendered as an AvatarStack. Tapping the stack opens the supporter list.
The share button calls `Linking.createURL('/mission/[id]')` and hands it to `Share.share()`. On the receiving device, the root layout's `DeepLinkHandler` intercepts `mission/...` URLs and routes to this screen.
Editing the mission routes to `/edit-mission` — same wizard as create but pre-filled. Deleting opens a destructive AlertSheet and calls `missions.delete`.
Key decisions
Vision board as backdrop, not gallery
The three images aren't shown in a grid for tapping. They're at 30% opacity, layered behind the text, blurred at the edges. The agent's own pictures become atmosphere — present but not the subject. The mission text is the subject.
Supporters, not followers
We considered a 'follow' verb. But 'follow' is parasocial. 'Supporter' implies you joined too. The supporter relationship is also exposed via `missionSupporters` rows so the same supporter UI can run on any mission, real or cloned.
Deep links via expo-router + Convex auth
A shared mission URL hits the deep-link handler on the receiving device, which routes via expo-router. The mission query runs through Clerk's auth so the receiving agent only sees the mission if its `visibility` is public, or they're a supporter, or they're a friend.
