BusinessCard/ai_implmentation.md

6.7 KiB
Raw Blame History

AI Implementation Context

This file summarizes project-specific context, architecture, and conventions to speed up future AI work.

Project Summary

BusinessCard is a SwiftUI app for building and sharing digital business cards with QR codes. It includes iOS screens for cards, sharing, customization, contact tracking, and widget previews, plus a watchOS companion to show a default card QR code.

Key Constraints

  • iOS 26+, watchOS 12+, Swift 6.2.
  • SwiftUI with @Observable classes and @MainActor.
  • Protocoloriented architecture is prioritized.
  • Clean Architecture with separation of concerns.
  • One public type per file, keep files under 300 lines.
  • No UIKit unless explicitly requested.
  • String Catalogs only (.xcstrings).
  • No magic numbers in views; use Bedrock's Design constants.
  • Uses Bedrock package for shared design system and utilities.

Core Data Flow

  • AppState owns:
    • CardStore (cards and selection)
    • ContactsStore (contact list + search)
    • ShareLinkService (share URLs)
  • SwiftData with CloudKit for persistence and sync.
  • App Groups for iOS-Watch data sharing.
  • Views read state via environment and render UI only.

Dependencies

Bedrock Package

Located at /Frameworks/Bedrock (local package). Provides:

  • Design.Spacing, Design.CornerRadius, Design.Opacity, etc.
  • QRCodeGenerator and QRCodeImageView for QR codes
  • Reusable settings components

App-specific extensions are in Design/DesignConstants.swift:

  • Design.CardSize - card dimensions, avatar, QR sizes
  • Design.Shadow.offsetNone - zero offset extension
  • Color.AppBackground, Color.CardPalette, Color.AppAccent, Color.AppText

Important Files

Models

  • Models/BusinessCard.swift — SwiftData model with:

    • Basic fields: name, role, company, email, phone, website, location
    • Rich fields: pronouns, bio, social links (LinkedIn, Twitter, Instagram, etc.)
    • Custom links: 2 slots for custom URLs
    • Photo: photoData stored with @Attribute(.externalStorage)
    • Computed: theme, layoutStyle, vCardPayload, hasSocialLinks
  • Models/Contact.swift — SwiftData model with:

    • Basic fields: name, role, company
    • Annotations: notes, tags (comma-separated), followUpDate, whereYouMet
    • Received cards: isReceivedCard, email, phone
    • Photo: photoData
    • Computed: tagList, hasFollowUp, isFollowUpOverdue
    • Static: fromVCard(_:) parser
  • Models/CardTheme.swift — card theme palette

  • Models/CardLayoutStyle.swift — stacked/split/photo

  • Models/AppTab.swift — tab bar enum

Protocols (POP)

  • Protocols/BusinessCardProviding.swift — card selection interface
  • Protocols/ContactTracking.swift — contact management interface
  • Protocols/ShareLinkProviding.swift — share URL generation interface

State

  • State/AppState.swift — central state container
  • State/CardStore.swift — card CRUD, selection, watch sync
  • State/ContactsStore.swift — contacts, search, received cards

Services

  • Services/ShareLinkService.swift — share URL helpers
  • Services/WatchSyncService.swift — App Group sync to watch

Views

Main screens:

  • Views/RootTabView.swift — tabbed shell
  • Views/CardsHomeView.swift — hero + card carousel
  • Views/ShareCardView.swift — QR + share actions + track share
  • Views/CustomizeCardView.swift — theme/layout controls
  • Views/ContactsView.swift — contact list with sections
  • Views/WidgetsView.swift — widget preview mockups

Feature views:

  • Views/BusinessCardView.swift — card display with layouts
  • Views/CardEditorView.swift — create/edit cards with PhotosPicker
  • Views/ContactDetailView.swift — full contact view with annotations
  • Views/QRScannerView.swift — camera-based QR scanner
  • Views/QRCodeView.swift — QR code image generator

Reusable components (in Views/Components/):

  • AvatarBadgeView.swift — circular avatar with photo or icon
  • IconRowView.swift — icon + text row for details
  • LabelBadgeView.swift — small badge labels
  • ActionRowView.swift — generic action row with chevron

Sheets (in Views/Sheets/):

  • RecordContactSheet.swift — track share recipient

Small utilities:

  • Views/EmptyStateView.swift — empty state placeholder
  • Views/PrimaryActionButton.swift — styled action button
  • Views/HeroBannerView.swift — home page banner
  • Views/CardCarouselView.swift — card scroll carousel
  • Views/WidgetsCalloutView.swift — widget promotion callout

Design + Localization

  • Design/DesignConstants.swift — extends Bedrock
  • Resources/Localizable.xcstrings — string catalog
  • Localization/String+Localization.swift — string helpers

watchOS

  • BusinessCardWatch/BusinessCardWatchApp.swift
  • BusinessCardWatch/Views/WatchContentView.swift
  • BusinessCardWatch/State/WatchCardStore.swift
  • BusinessCardWatch/Models/WatchCard.swift
  • BusinessCardWatch/Resources/Localizable.xcstrings

File Guidelines

Size Limits

  • Main views: aim for under 300 lines
  • Extract reusable sub-views to Components/
  • Extract sheets/modals to Sheets/
  • Private structs in same file OK if under 50 lines

Current File Sizes

File Lines Status
CardEditorView ~420 Complex form, acceptable
QRScannerView ~310 Camera + parsing, acceptable
BusinessCardView ~245 Multiple layouts, acceptable
ShareCardView ~235 Good
ContactDetailView ~235 Good
ContactsView ~220 Good
CustomizeCardView ~170 Good
All others <110 Good

Localization

  • All user-facing strings are in .xcstrings.
  • Supported locales: en, esMX, frCA.
  • Use String.localized("Key") for non-Text strings.

Testing

  • BusinessCardTests/BusinessCardTests.swift covers:
    • vCard payload formatting
    • Card CRUD operations
    • Contact search and filtering
    • Social links detection
    • Contact notes/tags
    • Follow-up status
    • vCard parsing for received cards

Known Stubs / TODOs

  • Apple Wallet and NFC flows are alert-only placeholders.
  • Share URLs are sample placeholders.
  • Widget previews are not WidgetKit extensions.
  • See ROADMAP.md for full feature status.

If You Extend The App

  1. Add new strings to the String Catalogs.
  2. Use Design.* from Bedrock for spacing, opacity, etc.
  3. Add app-specific constants to DesignConstants.swift.
  4. Keep view logic UI-only; push business logic to state classes.
  5. Prefer protocols for new capabilities.
  6. Add unit tests for new model logic.
  7. Update ROADMAP.md when adding features.
  8. Keep files under 300 lines — extract components when needed.
  9. No duplicate code — check for existing components first.
  10. One public type per file — private helpers OK if small.