feat(client): port profile/skills/experience screens (#184) #201
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!201
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "184-career-core-screens"
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?
Summary
Ports the career core slice of #184 — profile, skills, and experience — to the Expo Router universal client, consumed exclusively through
@carol/api-clientper ADR-0027. The screens follow the Notes reference pattern (apps/client/app/(app)/notes.tsx): TanStack Query via the typed hooks, DS tokens viauseTheme(), every user-facing string throughreact-i18next.profile.tsx) — bundled GET, basics edit, contacts CRUD with kind picker. Picture is read-only this slice (initials avatar + manage-from-web hint); upload needsexpo-image-pickerand lands in a follow-up.skills.tsx) — sections + skills with collapse, page-level Edit toggle, per-section rename/move/delete and per-skill move/delete. Collapse state is local-only here (localStorage isn't available on native; a persisted preference can come later).experience.tsx) — Jobs → Positions → Contributions drill-down on the bundleduseJobs()tree. Each level supports create/edit/delete; drill-down state survives refetches via id lookup. Education + Contracts tabs are out of scope this slice.No new hooks were needed — every operation maps to a hook already exported by
@carol/api-client. The drift gate stays green.Test plan
pnpm install --frozen-lockfilepnpm -F @carol/api typecheckpnpm -F @carol/api lintpnpm -F @carol/api test(44 files, 515 passed | 107 skipped — Postgres skips, expected withoutTEST_POSTGRES_URL)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:webOut of scope
expo-image-picker, follow-up ticket.Links: #184, ADR-0027.
Mirrors the Notes reference pattern (apps/client/app/(app)/notes.tsx): useProfile() + useUpdateProfileBasics() for the basics card, the useCreate/Update/DeleteContact() trio for the contact rows. View-by- default — a per-card Edit affordance reveals the form for basics, and contact rows get inline Edit/Remove tools. Profile picture is read-only on this slice: the existing PWA wires it through a file input + multipart upload, which doesn't translate cleanly to the universal client without expo-image-picker. The card shows the initials fallback and a "manage from web" hint until a follow-up wires picture upload through @carol/api-client. Strings flow through react-i18next ("profile" + "common" namespaces); colour comes from useTheme() tokens — no hardcoded values.OSV-Scanner
Threshold:
high· Total findings: 8 · At/above threshold: 24.1.08.0.16📊 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.
Trivy (container image)
Threshold:
high· Total findings: 121 · At/above threshold: 16.27.0, 7.28.0, 8.5.0