drop-make-integration-plan
Plan: Drop Figma Make Frontend Integration
Research Summary
Make Export (source: ~/ALAI/products/Drop/mockups/figma-make-export/)
- 10 screens, all custom Tailwind styling (NO shadcn imports despite package.json having them)
- react-router navigation (Link, useLocation, useState)
- All hardcoded mock data — no API calls
- 2 shared components: BottomNav (5 items: Hjem, Kontoer, Skann, Historikk, Profil), Logo (gradient square + wordmark)
- lucide-react icons throughout
- Norwegian text, DM Sans + Fraunces fonts, #0B6E35 green + #D4A017 gold
- Total: ~1,200 lines across 12 component files
Existing Drop (source: ~/ALAI/products/Drop/src/drop-app/)
- 10 routes, all "use client" components with real API integration
- API calls: auth (login/register), transactions (list/create), recipients, rates, cards, merchants
- Auth: useAuth hook, JWT httpOnly cookies
- Feature flags: cards gated behind useFeatureFlag()
- shadcn/ui components used (Card, Button, Badge, Tabs, ScrollArea, etc.)
- BottomNav with different icons (Home, Send, QrScan, CreditCard, User)
- DropLogo components (broken SVG from task #947 — needs replacement)
- Total: ~2,350 lines across page components
Key Difference
Make export = beautiful UI with mock data. Existing Drop = ugly UI with working backend. Goal: merge both — Make's design + Drop's API integration.
Conversion Needs Per Screen
| Make Screen | react-router → Next.js | Mock Data → API | Lines |
|---|---|---|---|
| Login | Link → next/link, form → POST /api/auth/login | Remove mock, add auth | 80 |
| Onboarding | Link → next/link, form → POST /api/auth/register | Remove mock, add validation | 117 |
| Dashboard | Link → next/link | Mock txns → GET /api/transactions, mock balance → GET /api/bank-accounts | 129 |
| SendMoney | Link → next/link, useState kept | Mock recipients → GET /api/recipients, mock rates → GET /api/rates, submit → POST /api/transactions/remittance | 168 |
| BankAccounts | Link → next/link | Mock accounts → GET /api/bank-accounts | 82 |
| TransactionHistory | Link → next/link, useState kept | Mock txns → GET /api/transactions | 181 |
| ScanQR | Link → next/link, useState kept | Mock merchant → POST /api/transactions/qr-payment | 125 |
| Profile | Link → next/link | Mock user → GET /api/auth/me, logout → POST /api/auth/logout | 113 |
| Notifications | Link → next/link | Mock notifs → static for MVP (no API yet) | 96 |
| MerchantDashboard | useState kept | Mock stats → GET /api/merchants/dashboard, mock txns → GET /api/merchants/transactions | 147 |
Objective
Replace all 10 Drop frontend page components with Figma Make export designs, converting from Vite/react-router to Next.js App Router, and wiring mock data to existing Drop API endpoints. Backend stays 100% untouched.
Team Orchestration
Team Members
| ID | Name | Role | Agent Type | Model |
|---|---|---|---|---|
| B1 | foundation-builder | Setup shared components + theme | builder | sonnet |
| V1 | foundation-validator | Validate shared components | validator | sonnet |
| B2 | screens-builder-1 | Convert Login, Onboarding, Dashboard, Profile | builder | sonnet |
| B3 | screens-builder-2 | Convert SendMoney, BankAccounts, TransactionHistory | builder | sonnet |
| B4 | screens-builder-3 | Convert ScanQR, Notifications, MerchantDashboard | builder | sonnet |
| V2 | screens-validator | Validate all 10 screens build + API wiring | validator | sonnet |
| B5 | integration-builder | Final integration, build test, fix issues | builder | sonnet |
| V3 | final-validator | Full app build + visual check | validator | sonnet |
Step-by-Step Tasks
Phase 1: Foundation (shared components + theme)
Task 1: Replace shared components and merge theme
- Owner: B1
- BlockedBy: none
- Files owned:
src/components/bottom-nav.tsx— REPLACE with Make's BottomNav (convert react-router Link/useLocation → next/link + usePathname)src/components/drop-logo.tsx— REPLACE with Make's Logo componentsrc/app/globals.css— MERGE Make's theme.css variables into existing globals.css (keep existing Tailwind @theme inline, add missing CSS vars from Make)src/components/ui/— keep all existing shadcn components, no changes
- Read FIRST:
- Make:
mockups/figma-make-export/src/app/components/BottomNav.tsx - Make:
mockups/figma-make-export/src/app/components/Logo.tsx - Make:
mockups/figma-make-export/src/styles/theme.css - Existing:
src/components/bottom-nav.tsx - Existing:
src/components/drop-logo.tsx - Existing:
src/app/globals.css
- Make:
- Conversion rules:
import { Link } from 'react-router'→import Link from 'next/link'import { useLocation } from 'react-router'→import { usePathname } from 'next/navigation'const { pathname } = useLocation()→const pathname = usePathname()to=→href=- Add
"use client"at top of each file - BottomNav: 5 items — Hjem(/dashboard), Kontoer(/accounts), Skann QR(/scan, center green circle), Historikk(/transactions), Profil(/profile)
- Acceptance:
- bottom-nav.tsx uses next/link + usePathname, 5 items, center QR button elevated
- drop-logo.tsx renders green gradient square + gold dot + "drop" wordmark
- globals.css has all Make theme variables merged (--primary-green, --gold-accent, etc.)
- No react-router imports remain
-
npx tsc --noEmitpasses for changed files
Task 2: Validate foundation
- Owner: V1
- BlockedBy: 1
- Acceptance:
- bottom-nav.tsx: no react-router, uses next/link + usePathname, "use client" present
- drop-logo.tsx: renders correctly, no broken SVG paths, "use client" present
- globals.css: valid CSS, no duplicate custom properties, Tailwind @theme inline still present
- All existing imports of BottomNav and DropLogo from other files still resolve
Phase 2: Screen Conversion (parallel — 3 builders)
Task 3: Convert Login, Onboarding, Dashboard, Profile
- Owner: B2
- BlockedBy: 1
- Files owned:
src/app/login/page.tsx— REPLACE with Make's Login.tsx + add POST /api/auth/loginsrc/app/register/page.tsx— REPLACE with Make's Onboarding.tsx + add POST /api/auth/register (keep age validation, OTP, PIN from existing)src/app/dashboard/page.tsx— REPLACE with Make's Dashboard.tsx + add GET /api/transactions + GET /api/bank-accountssrc/app/profile/page.tsx— REPLACE with Make's Profile.tsx + add GET /api/auth/me + POST /api/auth/logout
- Read FIRST:
- Make screens: Login.tsx, Onboarding.tsx, Dashboard.tsx, Profile.tsx
- Existing pages: login/page.tsx, register/page.tsx, dashboard/page.tsx, profile/page.tsx
- API spec: ~/ALAI/products/Drop/project/architecture/api-specification.md
- Conversion rules (SAME for all screens):
import { Link } from 'react-router'→import Link from 'next/link'to=→href=- Add
"use client"at top - Replace hardcoded mock data with
useState+useEffect+fetch('/api/...')from existing pages - Import BottomNav from
@/components/bottom-nav - Import Logo from
@/components/drop-logo(use DropLogo/DropLogoFull as appropriate) - Keep Make's visual layout/structure, replace data layer
- Login: add form onSubmit → POST /api/auth/login, router.push('/dashboard') on success
- Register: keep existing multi-step validation (age 18+, password strength, OTP) but use Make's visual design
- Dashboard: fetch transactions + bank accounts on mount, show real data in Make's layout
- Profile: show real user data from /api/auth/me, logout → POST /api/auth/logout + router.push('/login')
- Acceptance:
- All 4 pages render with Make's visual design
- Login form submits to /api/auth/login
- Register validates age 18+, password, creates account
- Dashboard shows real API data (transactions, bank accounts)
- Profile shows real user, logout works
- No react-router imports, all use next/link
-
npx tsc --noEmitpasses
Task 4: Convert SendMoney, BankAccounts, TransactionHistory
- Owner: B3
- BlockedBy: 1
- Files owned:
src/app/send/page.tsx— REPLACE with Make's SendMoney.tsx + add GET /api/recipients, GET /api/rates, POST /api/transactions/remittancesrc/app/accounts/page.tsx— REPLACE with Make's BankAccounts.tsx + add GET /api/bank-accountssrc/app/transactions/page.tsx— REPLACE with Make's TransactionHistory.tsx + add GET /api/transactions
- Read FIRST:
- Make screens: SendMoney.tsx, BankAccounts.tsx, TransactionHistory.tsx
- Existing pages: send/page.tsx, accounts/page.tsx, transactions/page.tsx
- API spec: ~/ALAI/products/Drop/project/architecture/api-specification.md
- Conversion rules: Same as Task 3 + specific:
- SendMoney: 4-step flow (recipient → amount → review → success), real recipients from API, real exchange rates, POST remittance on confirm
- BankAccounts: real bank accounts from GET /api/bank-accounts, no mock data
- TransactionHistory: real transactions with filters (all/sendt/qr), grouped by date
- Acceptance:
- SendMoney fetches real recipients + rates, creates real remittance
- BankAccounts shows real linked accounts from API
- TransactionHistory shows real transactions with filter tabs
- No react-router imports
-
npx tsc --noEmitpasses
Task 5: Convert ScanQR, Notifications, MerchantDashboard
- Owner: B4
- BlockedBy: 1
- Files owned:
src/app/scan/page.tsx— REPLACE with Make's ScanQR.tsx + add POST /api/transactions/qr-paymentsrc/app/notifications/page.tsx— REPLACE with Make's Notifications.tsx (keep mock data for MVP — no notifications API yet)src/app/(merchant)/merchant/page.tsxor appropriate route — REPLACE with Make's MerchantDashboard.tsx + add GET /api/merchants/dashboard + GET /api/merchants/transactions
- Read FIRST:
- Make screens: ScanQR.tsx, Notifications.tsx, MerchantDashboard.tsx
- Existing pages: scan/page.tsx, notifications/page.tsx
- API spec sections 7, 9 (QR Payment, Merchants)
- Conversion rules: Same as Task 3 + specific:
- ScanQR: keep demo simulation mode, POST /api/transactions/qr-payment on confirm, show bank account info
- Notifications: keep Make's mock data (no backend API for notifications in MVP)
- MerchantDashboard: real stats from /api/merchants/dashboard, real transactions from /api/merchants/transactions
- Acceptance:
- ScanQR simulates scan, creates real QR payment
- Notifications renders with demo data
- MerchantDashboard shows real merchant stats
- No react-router imports
-
npx tsc --noEmitpasses
Task 6: Validate all 10 screens
- Owner: V2
- BlockedBy: 3, 4, 5
- Acceptance:
- All 10 page.tsx files exist and compile
- No react-router imports anywhere in src/
- All pages have "use client" directive
- All API calls match api-specification.md endpoints
- BottomNav appears on all pages except Login and Onboarding
- All text is Norwegian
- Brand colors (#0B6E35, #D4A017) used consistently
-
npx tsc --noEmitpasses for entire project
Phase 3: Integration & Build
Task 7: Build test + fix issues
- Owner: B5
- BlockedBy: 6
- Steps:
- Run
npm run build(ornext build) - Fix any TypeScript errors
- Fix any import path issues
- Fix any missing dependencies
- Ensure all routes accessible
- Remove unused old components if any
- Remove /cards route or keep as feature-flagged placeholder
- Run
- Files owned: Any file that needs fixing from build errors
- Acceptance:
-
next buildsucceeds with 0 errors -
next devstarts without errors - All 10 routes load in browser
- No console errors on any page
-
Task 8: Final validation
- Owner: V3
- BlockedBy: 7
- Steps:
- Verify
next buildpasses - Check each route renders (curl localhost:3000/login, /dashboard, etc.)
- Verify API endpoints still work (GET /api/auth/me, GET /api/transactions)
- Check no old broken SVG logos remain
- Verify BottomNav navigation works between pages
- Verify
- Acceptance:
- Build passes
- All 10 routes return 200
- API health check passes
- No broken imports or missing components
Validation Commands
# TypeScript check
cd ~/ALAI/products/Drop/src/drop-app && npx tsc --noEmit
# Build
cd ~/ALAI/products/Drop/src/drop-app && npm run build
# Dev server
cd ~/ALAI/products/Drop/src/drop-app && npm run dev
# Check no react-router imports remain
grep -r "from 'react-router" ~/ALAI/products/Drop/src/drop-app/src/ || echo "CLEAN"
grep -r "from \"react-router" ~/ALAI/products/Drop/src/drop-app/src/ || echo "CLEAN"
# Check all pages exist
ls ~/ALAI/products/Drop/src/drop-app/src/app/{login,register,dashboard,send,accounts,transactions,scan,profile,notifications}/page.tsx
Risk Mitigation
- Backup first:
cp -r src/drop-app/src src/drop-app/src-backup-pre-makebefore any changes - Register vs Onboarding: Existing register has complex multi-step validation (age 18+, OTP, PIN). Make's Onboarding is simpler. MUST keep existing validation logic, only replace visual layer.
- Cards route: Make export has no Cards screen (replaced with BankAccounts per pass-through model). Keep /cards as feature-flagged placeholder or remove.
- Merchant route: May need new route directory if doesn't exist. Check first.
- Landing page (/): NOT touched. Existing landing page stays as-is.
Estimated Scope
- Phase 1: 3 files changed (foundation)
- Phase 2: 10 files replaced (screens) — 3 builders in parallel
- Phase 3: Bug fixes from build
- Total: ~13 files modified, 0 new files, backend untouched