> ## Documentation Index
> Fetch the complete documentation index at: https://docs.evomarketing.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Screens

> iOS app screen structure and navigation

The iOS app uses SwiftUI views organized by feature area.

## Navigation structure

### Tab bar

Five-tab navigation for creators:

| Tab | Icon     | Destination     |
| --- | -------- | --------------- |
| 0   | Home     | Dashboard       |
| 1   | Building | My Brands       |
| 2   | Chat     | Community       |
| 3   | Chart    | Analytics/Deals |
| 4   | Person   | Profile         |

### Admin shell

EVO team members see admin-specific tabs and views.

## Screen catalog

### Authentication

**LoginView**

* Email/password form
* Magic link option
* Google Sign-In
* Apple Sign-In
* Forgot password link

### Dashboard

**DashboardView** / **CreatorHomeContainer**

* Welcome message
* Active brands count
* Recent placements
* Performance summary
* Quick actions

### My Brands

**MyBrandsView**

* Brand card list
* Progress indicators
* Hub entry points

**BrandHubShellView**

* Brand-specific container
* Tab navigation within brand

### Brand Hub tabs

| Tab         | Purpose          |
| ----------- | ---------------- |
| Overview    | Summary metrics  |
| Strategy    | Brand guidelines |
| Placements  | Posted content   |
| Leaderboard | Brand rankings   |
| Chat        | Brand channel    |
| Reports     | Weekly summaries |

### Community

**ChatView**

* Channel list
* Direct messages
* Message composition
* Real-time updates

**ChatChannelView**

* Message list
* Input composer
* Reactions
* Typing indicators

### Brand Deals

**BrandDealsView**

* Available deals list
* Gamified deal cards
* Application status

**BrandDealDetailView**

* Full deal information
* Application form
* Requirements checklist

### Profile

**ProfileView**

* Account settings
* Connected accounts
* Notification preferences
* Support access
* Sign out

**IntegrationsView**

* Social account list
* OAuth connection
* Account status

### Onboarding

**OnboardingView**

* 26-screen wizard
* Progressive disclosure
* Auto-save

Phases:

1. Manifest (profile)
2. Channels (social handles)
3. Path (quiz)
4. Mission (training)

### Admin screens

**Directory:** `Views/Admin/`

| Screen                  | Purpose           |
| ----------------------- | ----------------- |
| AdminBrandsView         | Brand management  |
| AdminContractsView      | Contract overview |
| AdminCreativeReviewView | Content approval  |
| AdminAlertsView         | OpsAlerts         |

## Navigation patterns

### State-based routing

```swift theme={null}
// Root routing in ContentView
switch authSession.state {
case .signedOut:
    LoginView()
case .signedIn:
    if me?.isAdmin == true {
        AdminShellView()
    } else {
        CreatorShellView()
    }
case .blocked(let message):
    BlockedView(message: message)
}
```

### Tab selection

```swift theme={null}
@State private var selectedTab = 0

TabView(selection: $selectedTab) {
    HomeTabView().tag(0)
    BrandsTabView().tag(1)
    CommunityTabView().tag(2)
    AnalyticsTabView().tag(3)
    ProfileTabView().tag(4)
}
```

### Deep linking

Push notifications and universal links route via `PushRoute`:

```swift theme={null}
if let route = PushManager.shared.pendingRoute {
    navigate(to: route)
    PushManager.shared.pendingRoute = nil
}
```

### Sheet presentation

Modals use SwiftUI sheets:

```swift theme={null}
.sheet(isPresented: $showingSettings) {
    SettingsView()
}
```

## Data flow

### Observable objects

Views observe data stores:

```swift theme={null}
@EnvironmentObject var dataStore: CreatorDataStore
@EnvironmentObject var chatStore: ChatStore
```

### Async data loading

```swift theme={null}
.task {
    await dataStore.refreshCampaigns()
}
.refreshable {
    await dataStore.refreshCampaigns()
}
```

## View patterns

### Loading states

```swift theme={null}
if isLoading {
    ProgressView()
} else if let error = error {
    ErrorView(error: error)
} else {
    ContentView(data: data)
}
```

### Pull to refresh

```swift theme={null}
List {
    // content
}
.refreshable {
    await refresh()
}
```

### Empty states

```swift theme={null}
if items.isEmpty {
    EmptyStateView(
        icon: "tray",
        title: "No items",
        message: "Content will appear here"
    )
}
```
