mirror of
https://github.com/Sea-Haven-Industries/proposal-system.git
synced 2026-09-30 08:53:15 +00:00
93 lines
2.9 KiB
Markdown
93 lines
2.9 KiB
Markdown
|
|
# Proposal System — Mobile (iOS)
|
||
|
|
|
||
|
|
React Native 0.85 iOS app for Sea Haven Industries field dispatchers. Submit proposals, capture vendor documents, and manage drafts with offline support.
|
||
|
|
|
||
|
|
## Prerequisites
|
||
|
|
|
||
|
|
- Node.js 24+
|
||
|
|
- Ruby 3.x (for Fastlane)
|
||
|
|
- Xcode 26+ with iOS 26 SDK
|
||
|
|
- CocoaPods (installed via Bundler)
|
||
|
|
|
||
|
|
## Local Development
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Install JS dependencies
|
||
|
|
npm install
|
||
|
|
|
||
|
|
# Install Ruby dependencies (Fastlane, CocoaPods)
|
||
|
|
bundle install
|
||
|
|
|
||
|
|
# Install native pods
|
||
|
|
cd ios && bundle exec pod install && cd ..
|
||
|
|
|
||
|
|
# Start Metro bundler
|
||
|
|
npm start
|
||
|
|
|
||
|
|
# Run on iOS simulator
|
||
|
|
npm run ios
|
||
|
|
```
|
||
|
|
|
||
|
|
### Environment
|
||
|
|
|
||
|
|
The app reads configuration from `src/config.ts`. In development mode (`__DEV__`), the API URL points to `http://localhost:5000/api`. Run the .NET API locally or use the development proxy.
|
||
|
|
|
||
|
|
### Authentication
|
||
|
|
|
||
|
|
Two login methods are supported:
|
||
|
|
|
||
|
|
- **Email/Password** — direct Cognito SRP auth via `amazon-cognito-identity-js`
|
||
|
|
- **Google OAuth** — Cognito Hosted UI PKCE flow via `react-native-app-auth`
|
||
|
|
|
||
|
|
The iOS URL scheme `com.seahavenind.proposals` is registered in `Info.plist` for OAuth callbacks.
|
||
|
|
|
||
|
|
## Code Signing
|
||
|
|
|
||
|
|
Certificates and provisioning profiles are managed by **Fastlane Match** using S3 storage:
|
||
|
|
|
||
|
|
- **Bucket**: `seahaven-ios-certificates` (us-east-1)
|
||
|
|
- **Bundle ID**: `com.seahavenind.proposals`
|
||
|
|
- **Team ID**: `9KAQYC653W`
|
||
|
|
|
||
|
|
Match is configured in `fastlane/Matchfile`. The `MATCH_PASSWORD` secret decrypts signing assets.
|
||
|
|
|
||
|
|
## CI/CD
|
||
|
|
|
||
|
|
The `deploy-mobile.yaml` workflow triggers on push to `main` (with `mobile/**` path filter) or manual `workflow_dispatch`. It calls the `cd-mobile-ios.yaml` reusable workflow which:
|
||
|
|
|
||
|
|
1. Sets up `macos-26` runner with Xcode 26
|
||
|
|
2. Installs dependencies and pods
|
||
|
|
3. Retrieves signing assets via Match (S3)
|
||
|
|
4. Builds the IPA with Fastlane
|
||
|
|
5. Uploads to TestFlight
|
||
|
|
|
||
|
|
### Required GitHub Secrets
|
||
|
|
|
||
|
|
| Secret | Purpose |
|
||
|
|
|---|---|
|
||
|
|
| `AWS_DEPLOY_ROLE_ARN` | OIDC role for Match S3 access |
|
||
|
|
| `MATCH_PASSWORD` | Signing asset decryption passphrase |
|
||
|
|
| `ASC_KEY_ID` | App Store Connect API key ID |
|
||
|
|
| `ASC_ISSUER_ID` | App Store Connect API issuer |
|
||
|
|
| `ASC_KEY_CONTENT` | App Store Connect `.p8` key (base64) |
|
||
|
|
|
||
|
|
## Project Structure
|
||
|
|
|
||
|
|
```
|
||
|
|
mobile/
|
||
|
|
├── src/
|
||
|
|
│ ├── screens/ Auth, dispatcher, and admin screens
|
||
|
|
│ ├── lib/api/ API clients (auth, proposals, line items, admin)
|
||
|
|
│ ├── store/ Redux Toolkit (auth slice)
|
||
|
|
│ ├── navigation/ React Navigation (RootNavigator)
|
||
|
|
│ ├── components/ Reusable UI components
|
||
|
|
│ ├── hooks/ useAuth, useOfflineDraft, usePaginatedList
|
||
|
|
│ ├── theme/ Material Design 3 theming
|
||
|
|
│ ├── constants/ App-wide constants
|
||
|
|
│ └── config.ts Cognito + API configuration
|
||
|
|
├── ios/ Xcode project, assets, Info.plist
|
||
|
|
├── fastlane/ Fastfile, Matchfile, Appfile
|
||
|
|
├── Gemfile Ruby dependencies
|
||
|
|
└── package.json React Native 0.85.3
|
||
|
|
```
|