feat(client): port account, network, education screens (#184) #205
No reviewers
Labels
No labels
area:auth
area:ci
area:db
area:infra
area:native
area:pwa
area:service
epic
feature
foundation
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
james/carol!205
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "184-people-account-slice"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Scope
Slice 2 of #184 — porting more existing screens to Expo Router on the universal client per ADR-0027. Slice 1 (Profile + Skills + Experience-Jobs) shipped in #201; this slice covers Account, Network, and extends the existing Experience screen with an Education section.
What changed
apps/client/app/(app)/account.tsx— Personal Access Tokens management. Lists active tokens, mints a new one (reveals the plaintext exactly once with a copy-to-clipboard affordance on web; native gets manual-copy until expo-clipboard lands), revokes with an inline confirm step. Also surfaces the signed-in identity. Mirrors the behaviour of the Next.jsaccount/tokens/tokens-client.tsxbut rebuilt from spec against@carol/api-client.apps/client/app/(app)/network.tsx— Placeholder port. The Next.js PWA's/networkis itself a Placeholder today (epic #5 inidea.md) — there are no people/orgs tables, repos, or routes yet, so a working list + drill-down isn't shippable without standing up the backend. This port mirrors that placeholder shape on the universal client using DS tokens + i18n; when the network endpoints land the file's render swaps to the real list + drill-down with the same screen contract.apps/client/app/(app)/experience.tsx— Education tab alongside the existing Jobs → Positions → Contributions drill-down. Education is a flat list viauseEducations()(cursor-paginated; the hook fetches one page atlimit=200) with inline create / edit / delete. Jobs tree extracted into aJobsTreesubcomponent so each tab owns its own loading + error state. Contracts stays out of the segmented control until its ticket lands.packages/api-client/src/hooks/{account-tokens,contacts,educations}.ts— Unwrap the cursor envelope ({ data, next_cursor, has_more }) added by #191 and request?limit=200so the existing array-shaped consumers stay working. Without this, all three hooks were silently handing consumers an undefined-shaped value pretending to be a list.packages/i18n/messages/en.json— Catalog keys for the new surfaces:network.comingSoon.*,account.tokens.screen.{confirmRevoke,cancelRevoke}.DS tokens via
useTheme(); strings viareact-i18next; no hardcoded colours or copy.Out of scope
expo-clipboard; web'snavigator.clipboardcovers the PWA target.Test plan
pnpm install --frozen-lockfilepnpm -F @carol/api typecheckpnpm -F @carol/api lintpnpm -F @carol/api test(574 passed, 107 skipped — SQLite + Postgres matrix)pnpm -F @carol/api openapi:checkpnpm -F @carol/api openapi:coveragepnpm -F @carol/api-client typecheckpnpm -F @carol/api-client lintpnpm -F @carol/api-client testpnpm -F @carol/api-client checkpnpm -F @carol/client typecheckpnpm -F @carol/client lintpnpm -F @carol/client testpnpm -F @carol/client export:webCloses part of #184.
Adds the translation keys the new Account, Network, and Education surfaces consume: - account.tokens.screen.confirmRevoke / cancelRevoke — confirm step on the revoke action; the existing revokeConfirm string is the web confirm() copy and not reused on the universal client. - network.comingSoon.{title,body} — the placeholder copy that mirrors the existing Next.js Placeholder layout until the people/orgs backend lands. Sibling locales fall back to English per-key per ADR-0025.Trivy (container image)
Threshold:
high· Total findings: 121 · At/above threshold: 16.27.0, 7.28.0, 8.5.0📊 Test coverage
Patch coverage: no testable lines changed.
Overall (
app/,lib/,db/, excluding UI per ADR-0019):Soft thresholds per ADR-0019. Coverage is informational and does not block merge.