# App Client Base Swift

> Ứng dụng iOS native cho nền tảng GoodGo, xây dựng bằng Swift và SwiftUI theo kiến trúc MVVM.

## 📱 Tính Năng

| Tính năng | Mô tả |
|-----------|-------|
| 🔐 Xác thực | Đăng nhập, Đăng ký, Quên mật khẩu với form validation |
| 🏠 Trang chủ | Lời chào động, Items nổi bật, Feed hoạt động |
| 🔍 Khám phá | Tìm kiếm địa điểm và dịch vụ |
| 👤 Hồ sơ | Quản lý thông tin cá nhân và cài đặt |
| 🌓 Chế độ tối | Hỗ trợ dark mode tự động |
| 🌐 Đa ngôn ngữ | Hỗ trợ Tiếng Việt & Tiếng Anh |

## 🛠️ Công Nghệ

| Công nghệ | Phiên bản | Mục đích |
|-----------|-----------|----------|
| Swift | 5.9+ | Ngôn ngữ chính |
| SwiftUI | iOS 15+ | UI Framework declarative |
| Xcode | 15.0+ | IDE phát triển |
| URLSession | Native | HTTP networking |
| Keychain | Native | Lưu trữ token bảo mật |
| Combine | Native | Reactive programming |

## 📋 Yêu Cầu

- **macOS**: 14.0+ (Sonoma)
- **Xcode**: 15.0+
- **iOS Target**: 15.0+
- **Tài khoản Apple Developer**: Cần thiết để deploy lên thiết bị

## 🚀 Bắt Đầu Nhanh

### 1. Clone và mở project
```bash
cd apps/app-client-base-swift
open AppClientBaseSwift/AppClientBaseSwift.xcodeproj
```

### 2. Chọn Simulator
- Menu Xcode: **Product > Destination > iPhone 15 Pro** (hoặc simulator khác)

### 3. Build và Run
```bash
# Sử dụng shortcut
⌘R (Command + R)

# Hoặc từ terminal
xcodebuild -project AppClientBaseSwift/AppClientBaseSwift.xcodeproj \
  -scheme AppClientBaseSwift \
  -destination 'platform=iOS Simulator,name=iPhone 15 Pro' \
  build
```

### 4. Mock Login (để test)
```
Email: admin@goodgo.com
Password: 123456
```

## 📂 Cấu Trúc Project

```
AppClientBaseSwift/
├── App/
│   └── AppClientBaseSwiftApp.swift     # Entry point @main
│
├── Core/
│   ├── Constants/
│   │   └── Constants.swift              # API, App, Storage, DesignSystem
│   └── Extensions/
│       ├── View+Extensions.swift        # SwiftUI modifiers
│       └── String+Extensions.swift      # Validation, formatting
│
├── Models/
│   └── User.swift                       # Entity User + extensions
│
├── ViewModels/                          # MVVM ViewModels
│   ├── AuthViewModel.swift              # Login/Đăng ký/Quên mật khẩu
│   ├── HomeViewModel.swift              # Logic màn hình Home
│   └── ProfileViewModel.swift           # Quản lý hồ sơ
│
├── Views/
│   ├── Auth/                            # Màn hình xác thực
│   ├── Home/                            # Components trang chủ
│   └── Screens/                         # Màn hình chính
│
├── Services/
│   ├── APIService.swift                 # HTTP client với URLSession
│   └── AuthManager.swift                # Auth state + Keychain
│
└── Resources/
    ├── Assets.xcassets/                 # Hình ảnh & Màu sắc
    ├── en.lproj/                        # Bản địa hóa Tiếng Anh
    └── vi.lproj/                        # Bản địa hóa Tiếng Việt
```

## 🎨 Kiến Trúc

### Pattern MVVM

```
┌─────────────────────────────────────────────────────────────┐
│                      VIEW (SwiftUI)                          │
│  HomeView, ProfileView, AuthContainerView, LoginView...     │
├─────────────────────────────────────────────────────────────┤
│                @StateObject / @EnvironmentObject             │
├─────────────────────────────────────────────────────────────┤
│                    VIEWMODEL (ObservableObject)              │
│  HomeViewModel, AuthViewModel, ProfileViewModel              │
│  • Thuộc tính @Published cho reactive UI                     │
│  • Phương thức async/await để tải dữ liệu                    │
├─────────────────────────────────────────────────────────────┤
│              Dependency Injection dựa trên Protocol          │
├─────────────────────────────────────────────────────────────┤
│                        SERVICES                              │
│  APIService (HTTP) • AuthManager (Auth State + Keychain)     │
└─────────────────────────────────────────────────────────────┘
```

## 📋 Quy Ước Code

### Cấu trúc File
```swift
// MARK: - Imports
import SwiftUI

// MARK: - Định nghĩa Type
/// Mô tả bằng tiếng Việt
struct/class/enum TypeName {
    // MARK: - Properties
    // MARK: - Init
    // MARK: - Public Methods
    // MARK: - Private Methods
}
```

### Pattern ViewModel
```swift
@MainActor
final class FeatureViewModel: ObservableObject {
    @Published var isLoading = false
    @Published var errorMessage: String?
    
    private let apiService: APIServiceProtocol
    
    init(apiService: APIServiceProtocol = APIService.shared) {
        self.apiService = apiService
    }
    
    func loadData() async {
        isLoading = true
        defer { isLoading = false }
        // ...
    }
}
```

## ⚙️ Cấu Hình

### Cấu hình API
```swift
enum APIConfig {
    static let baseURL = "https://api.goodgo.vn"
    static let apiVersion = "/api/v1"
    static let timeout: TimeInterval = 30.0
}
```

## 🧪 Kiểm Thử

```bash
xcodebuild test \
  -project AppClientBaseSwift/AppClientBaseSwift.xcodeproj \
  -scheme AppClientBaseSwift \
  -destination 'platform=iOS Simulator,name=iPhone 15 Pro'
```

## 🔐 Bảo Mật

| Tính năng | Triển khai |
|-----------|------------|
| Lưu trữ Token | Keychain Services (không dùng UserDefaults) |
| Request bảo mật | Chỉ HTTPS, xác thực Bearer token |
| Quản lý Session | Tự động refresh token, logout an toàn |
| Bảo vệ dữ liệu | Mã hóa dữ liệu nhạy cảm khi lưu trữ |

## 📱 Thiết Bị Hỗ Trợ

- **iPhone**: 8 trở lên (iOS 15+)
- **iPad**: Tất cả iPad với iOS 15+
- **Hướng màn hình**: Portrait (chính), Landscape (hỗ trợ)

## 🔗 Dự Án Liên Quan

- [app-client-base-net](../app-client-base-net) - Client đa nền tảng .NET MAUI
- [iam-service-net](../../services/iam-service-net) - Backend xác thực

## 📚 Tài Liệu Bổ Sung

- [Hướng dẫn Kiến trúc](./architecture.md) - Chi tiết kiến trúc và quyết định thiết kế

## 📄 Giấy Phép

Bản quyền © 2026 GoodGo. Bảo lưu mọi quyền.
