mirror of
https://github.com/Sea-Haven-Industries/proposal-system.git
synced 2026-09-30 11:13:14 +00:00
Apple review requires a test account login path that doesn't depend on Google OAuth. Add amazon-cognito-identity-js for direct SRP auth with a native email/password form on the login screen. Fill in the empty Cognito client ID and pool ID, fix the Cognito domain prefix, and align CDK callback URLs with the app's actual URL scheme. Enable push-triggered mobile deploys, add CDK outputs for client IDs, fix stale README references, and add mobile/README.md.
92 lines
2.9 KiB
Markdown
92 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
|
|
```
|