Files
Kordant/tasks/kordant-unified-restructure/32-ios-service-screens.md
2026-05-25 22:49:37 -04:00

6.4 KiB

32. iOS App — Dashboard and Service Screens (DarkWatch, VoicePrint, SpamShield, etc.)

meta: id: kordant-unified-restructure-32 feature: kordant-unified-restructure priority: P1 depends_on: [kordant-unified-restructure-28, kordant-unified-restructure-29, kordant-unified-restructure-30, kordant-unified-restructure-31] tags: [ios, swiftui, dashboard, services, mobile]

objective:

  • Build the main dashboard and all service-specific screens for the iOS app. These should mirror the web app's functionality while using native iOS UI patterns (lists, forms, sheets, charts).

deliverables:

  • iOS/Kordant/Views/Dashboard/DashboardView.swift — Main dashboard:
    • Scrollable vertical stack of widgets
    • Threat score gauge (circular progress ring)
    • Recent alerts list (top 5)
    • Service summary cards (DarkWatch, VoicePrint, SpamShield, HomeTitle, RemoveBrokers)
    • Quick action buttons
    • Pull-to-refresh
  • iOS/Kordant/Views/Dashboard/AlertDetailView.swift — Alert detail:
    • Full alert information
    • Correlated alerts section
    • "Mark as resolved" and "False positive" actions
  • iOS/Kordant/Views/Services/DarkWatchView.swift — DarkWatch screen:
    • Watchlist items list with add/remove
    • Exposures list with severity badges
    • Exposure detail with source info and recommendations
    • "Run scan" button
  • iOS/Kordant/Views/Services/VoicePrintView.swift — VoicePrint screen:
    • Voice enrollments list with play/delete
    • "Enroll voice" button → opens recording sheet
    • Analysis history list
    • Analysis detail with confidence and verdict
  • iOS/Kordant/Views/Services/SpamShieldView.swift — SpamShield screen:
    • Blocked calls/SMS statistics
    • Custom rules list with add/edit/delete
    • Number check input with result
    • "Report spam" button
  • iOS/Kordant/Views/Services/HomeTitleView.swift — HomeTitle screen:
    • Watched properties list with add/remove
    • Property detail with snapshots and changes
    • Map view showing property location (MapKit)
    • "Run scan" button
  • iOS/Kordant/Views/Services/RemoveBrokersView.swift — RemoveBrokers screen:
    • Broker registry list with search/filter
    • Removal requests list with status
    • Request detail with progress timeline
    • "Start removal" button
  • iOS/Kordant/Views/Settings/SettingsView.swift — Settings:
    • Account info, subscription details
    • Notification preferences toggle
    • Theme selection (light/dark/system)
    • Biometric auth toggle
    • Family group management
    • Logout button

steps:

  1. Create view directories: Dashboard/, Services/, Settings/.
  2. DashboardView:
    • ScrollView with VStack
    • Threat score: Canvas or custom View with circular progress ring
    • Alerts: ForEach over alerts array, each as ShieldCard row
    • Service cards: horizontal scroll or grid of compact cards
    • Quick actions: HStack of icon buttons
    • .refreshable modifier for pull-to-refresh
  3. AlertDetailView:
    • ScrollView with sections
    • Severity badge at top
    • Description and metadata
    • Correlated alerts in a nested list
    • Action buttons at bottom
  4. DarkWatchView:
    • List with sections: Watchlist, Exposures
    • Watchlist items: swipe-to-delete, tap to edit
    • Add button → sheet with form
    • Exposures: tap to open detail
  5. VoicePrintView:
    • Enrollments section with audio playback (AVFoundation)
    • "Enroll" button → RecordingView sheet with waveform visualization
    • Analysis list with verdict color coding
  6. SpamShieldView:
    • Stats cards at top
    • Rules list with toggle for active/inactive
    • Number check: ShieldTextField + check button → result card
  7. HomeTitleView:
    • Properties list with address and status
    • Add property: address search with geocoding
    • Property detail: Map view, snapshot history, changes list
  8. RemoveBrokersView:
    • Broker list with category filters
    • Request list with status badges and progress bars
    • Start removal: sheet with broker selection and personal info form
  9. SettingsView:
    • Form with sections: Account, Preferences, Family, Danger Zone
    • Use native Toggle, Picker, NavigationLink
    • Subscription info with upgrade button
  10. Wire all views to API client (task 31):
    • Use @StateObject view models that call TRPCBridge
    • Show ShieldSkeleton while loading
    • Show ShieldEmptyState when lists are empty
    • Handle errors with ShieldToast or inline messages

steps:

  • Unit: Each view model fetches data correctly from mocked API
  • Unit: DashboardView displays correct widget count
  • Visual: All screens use theme tokens and adapt to dark mode
  • E2E: Navigate through all service screens and verify data loads
  • E2E: Perform CRUD operations (add watchlist item, delete enrollment, create rule)

acceptance_criteria:

  • Dashboard displays threat score, alerts, service summaries, and quick actions
  • All 5 service screens (DarkWatch, VoicePrint, SpamShield, HomeTitle, RemoveBrokers) load and display data
  • Each service screen supports core CRUD operations
  • Alert detail shows full information and correlation group
  • Settings screen allows managing account, preferences, and family
  • Pull-to-refresh updates dashboard data
  • All screens show loading skeletons and empty states appropriately
  • Navigation between screens works smoothly with native iOS transitions

validation:

  • Launch app, login, and verify dashboard renders with real data
  • Tap each service tab and verify screen loads
  • Add a watchlist item in DarkWatch and verify it appears in list
  • Delete a voice enrollment and verify it disappears
  • Create a spam rule and verify it applies
  • Toggle settings and verify preferences persist
  • Run unit tests via Xcode Cmd+U

notes:

  • Use native iOS patterns: List for scrollable data, Form for settings, Sheet for modals, .contextMenu for actions.
  • For the threat score gauge, consider using a SwiftUI charting library like SwiftUI Charts (iOS 16+) or a custom Canvas drawing.
  • The map in HomeTitle should use Map (iOS 17+) or MKMapView wrapped in UIViewRepresentable for older versions.
  • Voice recording requires microphone permission. Add NSMicrophoneUsageDescription to Info.plist.
  • Keep view models separate from views for testability. View models should own the @Published state and API calls.
  • Consider using Task and .task modifier for async data loading instead of onAppear to handle cancellation correctly.