New react app for seahaven
Find a file
Codex Review Integration 038ce263da fix(vendors): vendor detail parity with the design prototype (SH-253)
Three divergences in the vendor detail drawer:

- The header rendered the company as a subtitle under a title that had
  already fallen back to the company, printing the same name twice when
  the row carried no technician. The subtitle is now dropped when it
  would repeat the title.
- The Google Maps link appeared only when a URL was stored, unlabelled,
  so an empty value left no trace of the field. It is now a labelled
  field below Address that reads em-dash when unset, as every other
  field in the panel does.
- The status sat immediately beside Total Jobs. It now sits opposite it
  at the right edge, and reuses the vendors table's dot-plus-text badge
  so the state never reads by colour alone.
2026-08-19 13:22:11 -03:00
.cursor/rules Feat/vite typescript migration (#16) 2026-06-18 14:41:17 -03:00
.github fix(vendors): complete shell and visual parity gates 2026-08-10 12:11:38 -03:00
.husky Feat/vite typescript migration (#16) 2026-06-18 14:41:17 -03:00
config chore: correct Sea Haven branding and rewrite README (#25) 2026-07-17 13:17:21 -04:00
docs Merge branch 'dev' into feature/wo-multi-poc-contacts 2026-08-19 09:42:54 -03:00
e2e chore(work-orders): sync platform-polish with wizard-board-create tip 2026-08-12 14:34:38 -03:00
eslint-rules fix(lint): enforce error typography composition 2026-07-24 11:36:30 -03:00
infra/cdk chore: correct Sea Haven branding and rewrite README (#25) 2026-07-17 13:17:21 -04:00
public Merge pull request #35 from Sea-Haven-Industries/feature/wo-shared-ui 2026-07-21 14:03:58 -03:00
scripts fix(work-orders): drop vendor collateral from slide-over PR 2026-08-11 13:54:31 -03:00
src fix(vendors): vendor detail parity with the design prototype (SH-253) 2026-08-19 13:22:11 -03:00
tmp/pr-descriptions Merge remote-tracking branch 'origin/dev' into feature/wo-uplift-pending-close-gate 2026-08-17 13:50:22 -03:00
.env Feat/vite typescript migration (#16) 2026-06-18 14:41:17 -03:00
.env.development Feat/vite typescript migration (#16) 2026-06-18 14:41:17 -03:00
.env.example Feat/vite typescript migration (#16) 2026-06-18 14:41:17 -03:00
.env.production feat(infra): AWS S3 + CloudFront CD pipeline on dev.seahaven.com (#21) 2026-07-07 06:14:06 -03:00
.gitignore fix(vendors): complete shell and visual parity gates 2026-08-10 12:11:38 -03:00
.prettierignore fix(vendors): complete shell and visual parity gates 2026-08-10 12:11:38 -03:00
.prettierrc Feat/vite typescript migration (#16) 2026-06-18 14:41:17 -03:00
AGENTS.md chore(governance): enforce frontend quality system (#53) 2026-07-24 16:47:34 -03:00
ARCHITECTURE_AND_CODE_QUALITY.md chore(governance): enforce frontend quality system (#53) 2026-07-24 16:47:34 -03:00
commitlint.config.js Feat/vite typescript migration (#16) 2026-06-18 14:41:17 -03:00
eslint.config.js fix(lint): enforce error typography composition 2026-07-24 11:36:30 -03:00
index.html chore: correct Sea Haven branding and rewrite README (#25) 2026-07-17 13:17:21 -04:00
package-lock.json feat(work-orders): query broadcast, remove auth bypass, dispatch polish (#100) 2026-08-14 11:52:48 -03:00
package.json feat(work-orders): query broadcast, remove auth bypass, dispatch polish (#100) 2026-08-14 11:52:48 -03:00
playwright.config.ts fix(vendors): complete shell and visual parity gates 2026-08-10 12:11:38 -03:00
playwright.visual.config.ts fix(vendors): complete shell and visual parity gates 2026-08-10 12:11:38 -03:00
QUALITY_GATES.md chore(governance): enforce frontend quality system (#53) 2026-07-24 16:47:34 -03:00
README.md chore(governance): enforce frontend quality system (#53) 2026-07-24 16:47:34 -03:00
REVIEW_AND_PR_FRAMEWORK.md chore(governance): enforce frontend quality system (#53) 2026-07-24 16:47:34 -03:00
tsconfig.json chore: upgrade frontend dependencies (#24) 2026-07-14 21:35:59 -03:00
tsconfig.node.json chore: correct Sea Haven branding and rewrite README (#25) 2026-07-17 13:17:21 -04:00
vite.config.ts chore: upgrade frontend dependencies (#24) 2026-07-14 21:35:59 -03:00
vitest.config.ts Feat/vite typescript migration (#16) 2026-06-18 14:41:17 -03:00

SHOC Frontend (shoc-frontend-new)

CI Deploy TypeScript React Vite AWS CDK

Vite + React SPA for Sea Haven facility management (SHOC): work orders, vendor portal, uplifts, and related admin features. This is the selective rebuild of the legacy SHOC frontend — new code follows the IrisLoan.Admin conventions documented in docs/ARCHITECTURE_PLAN.md.

  • GitHub: Sea-Haven-Industries/shoc-frontend-new
  • Hosted at: https://dev.seahaven.com (dev environment; the only environment today)
  • Backend API: https://api.dev.seahaven.com/api (called directly, cross-origin) — source: Sea-Haven-Industries/shoc-backend

Architecture

Static SPA hosting on AWS, provisioned by a CDK app local to this repo (infra/cdk/). CloudFront serves the built dist/ from a private S3 bucket; the SPA calls the backend directly over HTTPS at VITE_API_URL (no /api proxy at the CDN — the backend allows CORS).

graph LR
    U[Browser] -->|HTTPS dev.seahaven.com| CF[CloudFront]
    CF -->|OAC| S3[S3 seahaven-shoc-frontend-dev]
    CF -.->|viewer-request fn| FN[SPA rewrite → /index.html]
    U -->|HTTPS api.dev.seahaven.com/api CORS| API[SHOC backend API]
    GH[GitHub Actions push to dev] -->|OIDC| ROLE[githubdeploy-shoc-frontend-new-dev]
    ROLE -->|cdk deploy + s3 sync + invalidation| S3

Frontend stack: React 19, TypeScript, Vite, Tailwind CSS 4 + MUI, TanStack Query, React Router (via @generouted/react-router), React Hook Form + Zod, Ky HTTP client. Source layout: src/api/, src/domain/, src/app/ (see the architecture plan for the keep/discard migration matrix).

AWS Resources

Stack shoc-frontend-dev — CDK, account 396287094661, region us-east-1. Defined in infra/cdk/lib/frontend-stack.ts.

Resource Name Purpose
S3 bucket seahaven-shoc-frontend-dev Private origin (BLOCK_ALL, SSE, versioned; OAC-only reads)
CloudFront distribution (stack output DistributionId) HTTPS static hosting on dev.seahaven.com, ACM *.seahaven.com
CloudFront Function SpaRewrite Viewer-request rewrite of extensionless paths to /index.html (deep links)
IAM role githubdeploy-shoc-frontend-new-dev GitHub Actions OIDC deploy role, trust scoped to repo:Sea-Haven-Industries/shoc-frontend-new:ref:refs/heads/dev
Route 53 records A/AAAA apex alias in zone dev.seahaven.com (Z07671212N75U4YLPWZR8) Points the custom domain at CloudFront

No Lambdas, queues, or databases — this stack is static hosting only.

Configuration

Secrets

No Secrets Manager or SSM parameters. The one secret is a GitHub Actions repo secret:

Secret Purpose
AWS_DEPLOY_ROLE_ARN ARN of githubdeploy-shoc-frontend-new-dev, passed to the org reusable CD workflow

Environment variables (build-time, VITE_*)

Variable Description Dev value
VITE_API_URL Ky API base prefix, baked into the build at vite build /api (dev server) / https://api.dev.seahaven.com/api (production build)
VITE_API_TARGET Dev-proxy target for /api (Vite dev server only) http://localhost:5141

VITE_API_URL supplies the full API prefix — route paths in API_PATHS do not include /api. Absolute values must end with /api; vite.config.ts enforces this via config/api-url-contract.ts and fails the build otherwise. See .env.example, .env.development, and .env.production.

CDK context (domain, certificate ARN, hosted zone) lives in infra/cdk/cdk.json so CI runs cdk deploy with no flags.

Local Development

Requirements: Node.js ≥ 22.22.1 (CI/CD run Node 24), npm 11.16.0 (pinned via packageManager).

npm ci
cp .env.example .env   # then set VITE_API_URL=/api for local dev
npm run dev            # Vite dev server on port 3000, proxies /api → VITE_API_TARGET

The dev proxy expects the shoc-backend API at http://localhost:5141; override with VITE_API_TARGET (e.g. https://api.dev.seahaven.com to use the deployed dev API).

Command Description
npm run dev Start Vite dev server on port 3000
npm run build Type-check (tsc -b) and production build to dist/
npm run preview Preview the production build locally
npm test / npm run test:watch Vitest unit tests (once / watch)
npm run test:e2e / npm run test:e2e:ui Playwright e2e tests (headless / UI mode)
npm run lint / npm run lint:fix ESLint (check / auto-fix)
npm run format / npm run format:check Prettier (write / check)
npm run governance Frontend governance checks (godfile + maintainability)
npm run verify All gates: format + lint + build + test + governance

Husky + lint-staged run ESLint and Prettier on staged files at commit; commitlint enforces conventional commit messages. Run npx tsc --noEmit (or npm run build) before pushing to catch type errors early.

Contributing

  • Branch from dev with a kebab-case description and a prefix matching the work: feature/, bug/, hotfix/, chore/, docs/, or refactor/ (e.g. feature/vendor-portal-filters, chore/sea-haven-branding).
  • Commit messages follow Conventional Commits — commitlint rejects anything else at commit time.
  • Open PRs against dev. Both dev and main are protected: every PR needs a green CI run and an approving review from a code owner (@Sea-Haven-Industries/internal-dev); new pushes dismiss stale approvals. Merged branches are deleted automatically.
  • Promotion flow: feature/* → dev (auto-deployed and verified on dev.seahaven.com) → main (production promotion — no prod environment exists yet).

Deployment

CI/CD uses the org's reusable workflows (no stored AWS keys — OIDC only):

One-time provisioning (OIDC provider, CDK bootstrap, first local deploy, setting AWS_DEPLOY_ROLE_ARN) is documented in infra/cdk/README.md.

Manual deploy (emergency/reference only — needs credentials for the external-dev AWS account; the normal path is push to dev):

(cd infra/cdk && npx cdk deploy)
STACK_NAME=shoc-frontend-dev AWS_REGION=us-east-1 bash scripts/deploy-web.sh

Operations

  • Verify: open https://dev.seahaven.com after a green Deploy run in the Actions tab; confirm a deep link (e.g. a work-orders route) loads directly and API calls succeed.
  • Logs: deploy logs live in GitHub Actions (CI + Deploy workflows). There are no CloudWatch application logs — the stack is static hosting; runtime errors surface in the browser and on the backend API's side.
  • Common failure modes:
    • Stale content after deploy — the CloudFront invalidation step failed or is still propagating; re-run the Deploy workflow or invalidate /* manually.
    • OIDC AssumeRole errors — the trust policy is scoped to pushes to dev on this repo; deploys from other branches/repos are rejected by design.
    • Broken API requests after a build — VITE_API_URL missing the /api suffix or carrying the wrong environment's host (it is baked in at build time).
    • CORS errors — the backend must allow the frontend origin; CloudFront does not proxy /api.
  • CI and CD both fire on push to dev in parallel — a red-CI commit still deploys (matches the org's push-time-CD model; gating deploy on CI is known follow-up work).

Documentation