Update app icons
@@ -1,129 +0,0 @@
|
|||||||
# Flutter Migration Guide
|
|
||||||
|
|
||||||
## Migration from Electron to Flutter
|
|
||||||
|
|
||||||
The rmtPocketWatcher application has been successfully migrated from Electron + React to Flutter for true cross-platform support.
|
|
||||||
|
|
||||||
### What Changed
|
|
||||||
|
|
||||||
**Before (Electron):**
|
|
||||||
- Electron + React + TypeScript
|
|
||||||
- Windows desktop only
|
|
||||||
- ~100MB bundle size
|
|
||||||
- WebView-based rendering
|
|
||||||
|
|
||||||
**After (Flutter):**
|
|
||||||
- Flutter + Dart
|
|
||||||
- Windows, macOS, Linux, Android, iOS support
|
|
||||||
- ~15-20MB bundle size
|
|
||||||
- Native rendering
|
|
||||||
|
|
||||||
### Project Structure
|
|
||||||
|
|
||||||
```
|
|
||||||
flutter_app/
|
|
||||||
├── lib/
|
|
||||||
│ ├── main.dart # App entry point
|
|
||||||
│ ├── models/
|
|
||||||
│ │ └── price_data.dart # Data models (PriceData, LatestPrice, PriceAlert)
|
|
||||||
│ ├── providers/
|
|
||||||
│ │ └── price_provider.dart # State management with Provider
|
|
||||||
│ ├── screens/
|
|
||||||
│ │ └── home_screen.dart # Main dashboard screen
|
|
||||||
│ ├── services/
|
|
||||||
│ │ ├── api_service.dart # REST API communication
|
|
||||||
│ │ ├── websocket_service.dart # WebSocket connection
|
|
||||||
│ │ └── storage_service.dart # Local storage (SharedPreferences)
|
|
||||||
│ └── widgets/
|
|
||||||
│ ├── alerts_panel.dart # Price alerts UI
|
|
||||||
│ ├── price_chart.dart # Historical price chart
|
|
||||||
│ ├── price_stats_card.dart # Stats display cards
|
|
||||||
│ └── vendor_table.dart # Vendor comparison table
|
|
||||||
├── assets/ # Images, fonts, etc.
|
|
||||||
├── .env # Environment configuration
|
|
||||||
└── pubspec.yaml # Dependencies
|
|
||||||
```
|
|
||||||
|
|
||||||
### Key Features Preserved
|
|
||||||
|
|
||||||
✅ **Real-time price tracking** - WebSocket connection to backend
|
|
||||||
✅ **Bloomberg-style dashboard** - Stats cards, charts, vendor table
|
|
||||||
✅ **Price alerts** - Client-side evaluation with notifications
|
|
||||||
✅ **Historical charts** - Interactive price history with fl_chart
|
|
||||||
✅ **Vendor comparison** - Sortable table of all sellers
|
|
||||||
✅ **Auto-reconnect** - WebSocket reconnection logic
|
|
||||||
✅ **Local storage** - Alerts and settings persistence
|
|
||||||
|
|
||||||
### New Capabilities
|
|
||||||
|
|
||||||
🆕 **Mobile support** - Same app runs on Android/iOS
|
|
||||||
🆕 **Better performance** - Native rendering, smaller memory footprint
|
|
||||||
🆕 **Cross-platform** - Windows, macOS, Linux from same codebase
|
|
||||||
🆕 **Material Design 3** - Modern, consistent UI across platforms
|
|
||||||
🆕 **Responsive layout** - Adapts to different screen sizes
|
|
||||||
|
|
||||||
### Backend Compatibility
|
|
||||||
|
|
||||||
The Flutter app is **100% compatible** with the existing TypeScript backend:
|
|
||||||
- Same REST API endpoints (`/prices/latest`, `/index/history`)
|
|
||||||
- Same WebSocket protocol (`/ws/index`)
|
|
||||||
- Same data formats (JSON)
|
|
||||||
- No backend changes required
|
|
||||||
|
|
||||||
### Development Commands
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Install dependencies
|
|
||||||
flutter pub get
|
|
||||||
|
|
||||||
# Run on different platforms
|
|
||||||
flutter run -d windows # Windows desktop
|
|
||||||
flutter run -d android # Android device/emulator
|
|
||||||
flutter run -d ios # iOS device/simulator
|
|
||||||
|
|
||||||
# Build releases
|
|
||||||
flutter build windows # Windows executable
|
|
||||||
flutter build apk # Android APK
|
|
||||||
flutter build ipa # iOS app bundle
|
|
||||||
|
|
||||||
# Development tools
|
|
||||||
flutter doctor # Check setup
|
|
||||||
flutter devices # List available devices
|
|
||||||
flutter logs # View app logs
|
|
||||||
```
|
|
||||||
|
|
||||||
### Environment Configuration
|
|
||||||
|
|
||||||
The app uses `.env` file for configuration:
|
|
||||||
|
|
||||||
```env
|
|
||||||
API_URL=http://localhost:3000
|
|
||||||
WS_URL=ws://localhost:3000/ws/index
|
|
||||||
```
|
|
||||||
|
|
||||||
### Mobile Adaptations
|
|
||||||
|
|
||||||
The UI automatically adapts for mobile:
|
|
||||||
- **Desktop**: Multi-column layout with side-by-side panels
|
|
||||||
- **Mobile**: Single-column layout with scrollable sections
|
|
||||||
- **Responsive**: Charts and tables adjust to screen size
|
|
||||||
- **Touch-friendly**: Larger tap targets on mobile
|
|
||||||
|
|
||||||
### Migration Benefits
|
|
||||||
|
|
||||||
1. **Cross-platform**: One codebase for all platforms
|
|
||||||
2. **Performance**: 50-80% smaller memory usage
|
|
||||||
3. **Native feel**: Platform-specific UI elements
|
|
||||||
4. **Future-proof**: Mobile support for user growth
|
|
||||||
5. **Maintenance**: Single codebase to maintain
|
|
||||||
6. **Distribution**: App stores + direct downloads
|
|
||||||
|
|
||||||
### Next Steps
|
|
||||||
|
|
||||||
1. **Test the Flutter app**: `flutter run -d windows`
|
|
||||||
2. **Verify backend connection**: Ensure backend is running
|
|
||||||
3. **Test on mobile**: Run on Android/iOS devices
|
|
||||||
4. **Build releases**: Create platform-specific builds
|
|
||||||
5. **Update deployment**: Replace Electron builds with Flutter
|
|
||||||
|
|
||||||
The migration preserves all functionality while adding mobile support and improving performance. The backend remains unchanged, ensuring a smooth transition.
|
|
||||||
@@ -1,178 +0,0 @@
|
|||||||
# Flutter Migration Complete ✅
|
|
||||||
|
|
||||||
## Migration Summary
|
|
||||||
|
|
||||||
Successfully migrated rmtPocketWatcher from Electron + React to Flutter for true cross-platform support.
|
|
||||||
|
|
||||||
### ✅ What's Been Completed
|
|
||||||
|
|
||||||
**Core Application Structure:**
|
|
||||||
- ✅ Flutter project created with proper dependencies
|
|
||||||
- ✅ Material Design 3 theme with Bloomberg-style dark colors
|
|
||||||
- ✅ Provider state management setup
|
|
||||||
- ✅ Cross-platform compatibility (Windows, macOS, Linux, Android, iOS)
|
|
||||||
|
|
||||||
**Data Layer:**
|
|
||||||
- ✅ `PriceData`, `LatestPrice`, `HistoryData`, `PriceAlert` models
|
|
||||||
- ✅ WebSocket service with auto-reconnect logic
|
|
||||||
- ✅ REST API service for initial data fetching
|
|
||||||
- ✅ Local storage service using SharedPreferences
|
|
||||||
|
|
||||||
**UI Components:**
|
|
||||||
- ✅ `HomeScreen` - Main dashboard layout
|
|
||||||
- ✅ `PriceStatsCard` - Connection status, lowest price, seller info
|
|
||||||
- ✅ `AlertsPanel` - Add/manage price alerts with enable/disable
|
|
||||||
- ✅ `PriceChart` - Interactive historical price chart with fl_chart
|
|
||||||
- ✅ `VendorTable` - Sortable vendor comparison table
|
|
||||||
|
|
||||||
**Features Preserved:**
|
|
||||||
- ✅ Real-time WebSocket price updates
|
|
||||||
- ✅ Historical price charts with time range selection
|
|
||||||
- ✅ Client-side price alerts with local storage
|
|
||||||
- ✅ Vendor comparison table with sorting
|
|
||||||
- ✅ Bloomberg-style terminal interface
|
|
||||||
- ✅ Auto-reconnect WebSocket logic
|
|
||||||
|
|
||||||
**Platform Support:**
|
|
||||||
- ✅ Windows desktop (requires Visual Studio C++ components)
|
|
||||||
- ✅ Web browser (for testing without C++ setup)
|
|
||||||
- ✅ Ready for macOS, Linux, Android, iOS
|
|
||||||
|
|
||||||
### 🔧 Setup Requirements
|
|
||||||
|
|
||||||
**For Windows Desktop Development:**
|
|
||||||
1. Install Visual Studio 2022 Community
|
|
||||||
2. Add "Desktop development with C++" workload
|
|
||||||
3. Include these components:
|
|
||||||
- MSVC v143 - VS 2022 C++ x64/x86 build tools (Latest)
|
|
||||||
- Windows 11 SDK (10.0.22621.0)
|
|
||||||
- CMake tools for Visual Studio
|
|
||||||
|
|
||||||
**Quick Commands:**
|
|
||||||
```bash
|
|
||||||
cd flutter_app
|
|
||||||
|
|
||||||
# Install dependencies
|
|
||||||
flutter pub get
|
|
||||||
|
|
||||||
# Check setup
|
|
||||||
flutter doctor
|
|
||||||
|
|
||||||
# Run on Windows (after VS setup)
|
|
||||||
flutter run -d windows
|
|
||||||
|
|
||||||
# Run on web (works without C++ components)
|
|
||||||
flutter run -d chrome
|
|
||||||
|
|
||||||
# Build for Windows
|
|
||||||
flutter build windows
|
|
||||||
```
|
|
||||||
|
|
||||||
### 🎯 Next Steps
|
|
||||||
|
|
||||||
**Immediate (Ready to Use):**
|
|
||||||
1. **Fix Visual Studio Components** - Install C++ workload for Windows builds
|
|
||||||
2. **Test Backend Connection** - Ensure TypeScript backend is running on port 3000
|
|
||||||
3. **Run Flutter App** - `flutter run -d windows` or `flutter run -d chrome`
|
|
||||||
4. **Verify Features** - Test WebSocket, alerts, charts, vendor table
|
|
||||||
|
|
||||||
**Short Term:**
|
|
||||||
1. **Mobile Testing** - Test responsive layout on Android/iOS
|
|
||||||
2. **Performance Optimization** - Test with 50k+ chart datapoints
|
|
||||||
3. **Notifications** - Implement native notifications for alerts
|
|
||||||
4. **Window Controls** - Add minimize/close functionality for desktop
|
|
||||||
|
|
||||||
**Long Term:**
|
|
||||||
1. **App Store Distribution** - Prepare for Google Play, App Store
|
|
||||||
2. **Auto-Updates** - Implement update mechanism
|
|
||||||
3. **Advanced Charts** - Add more chart types and interactions
|
|
||||||
4. **Settings Panel** - Theme, notification preferences
|
|
||||||
|
|
||||||
### 📱 Mobile Support
|
|
||||||
|
|
||||||
The Flutter app automatically supports mobile with responsive design:
|
|
||||||
|
|
||||||
**Desktop Layout:**
|
|
||||||
- Multi-column stats cards
|
|
||||||
- Side-by-side panels
|
|
||||||
- Full-width charts and tables
|
|
||||||
|
|
||||||
**Mobile Layout:**
|
|
||||||
- Single-column scrollable layout
|
|
||||||
- Stacked stats cards
|
|
||||||
- Touch-friendly controls
|
|
||||||
- Responsive charts
|
|
||||||
|
|
||||||
### 🔄 Backend Compatibility
|
|
||||||
|
|
||||||
**100% Compatible** with existing TypeScript backend:
|
|
||||||
- Same REST endpoints: `/prices/latest`, `/index/history`
|
|
||||||
- Same WebSocket protocol: `/ws/index`
|
|
||||||
- Same JSON data formats
|
|
||||||
- No backend changes required
|
|
||||||
|
|
||||||
### 📊 Performance Benefits
|
|
||||||
|
|
||||||
**Flutter vs Electron:**
|
|
||||||
- **Bundle Size**: ~15MB vs ~100MB (85% smaller)
|
|
||||||
- **Memory Usage**: ~50MB vs ~150MB (67% less)
|
|
||||||
- **Startup Time**: ~2s vs ~5s (60% faster)
|
|
||||||
- **Native Performance**: 60fps rendering vs WebView overhead
|
|
||||||
|
|
||||||
### 🚀 Deployment Options
|
|
||||||
|
|
||||||
**Desktop:**
|
|
||||||
- Windows: `.exe` installer
|
|
||||||
- macOS: `.dmg` or `.pkg`
|
|
||||||
- Linux: `.deb`, `.rpm`, or AppImage
|
|
||||||
|
|
||||||
**Mobile:**
|
|
||||||
- Android: `.apk` or Google Play Store
|
|
||||||
- iOS: App Store (requires Apple Developer account)
|
|
||||||
|
|
||||||
**Web:**
|
|
||||||
- Progressive Web App (PWA)
|
|
||||||
- Direct hosting on any web server
|
|
||||||
|
|
||||||
### 🛠️ Development Workflow
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Development
|
|
||||||
flutter run -d windows # Hot reload development
|
|
||||||
flutter run -d android # Test mobile layout
|
|
||||||
flutter run -d chrome # Web testing
|
|
||||||
|
|
||||||
# Building
|
|
||||||
flutter build windows --release # Production Windows build
|
|
||||||
flutter build apk --release # Production Android build
|
|
||||||
flutter build web --release # Production web build
|
|
||||||
|
|
||||||
# Testing
|
|
||||||
flutter test # Unit tests
|
|
||||||
flutter drive --target=test_driver/app.dart # Integration tests
|
|
||||||
```
|
|
||||||
|
|
||||||
### 📋 Migration Checklist
|
|
||||||
|
|
||||||
- [x] Flutter project structure created
|
|
||||||
- [x] All Electron features migrated
|
|
||||||
- [x] Cross-platform compatibility added
|
|
||||||
- [x] Backend integration preserved
|
|
||||||
- [x] UI/UX maintained (Bloomberg style)
|
|
||||||
- [x] State management implemented
|
|
||||||
- [x] Local storage working
|
|
||||||
- [x] WebSocket auto-reconnect
|
|
||||||
- [x] Responsive design for mobile
|
|
||||||
- [x] Documentation completed
|
|
||||||
|
|
||||||
### 🎉 Success Metrics
|
|
||||||
|
|
||||||
The Flutter migration delivers:
|
|
||||||
- **5 platforms** from 1 codebase (vs 1 platform)
|
|
||||||
- **85% smaller** bundle size
|
|
||||||
- **67% less** memory usage
|
|
||||||
- **Mobile support** for future growth
|
|
||||||
- **Native performance** across all platforms
|
|
||||||
- **Maintained feature parity** with Electron version
|
|
||||||
|
|
||||||
The rmtPocketWatcher Flutter app is ready for production use and provides a solid foundation for cross-platform expansion!
|
|
||||||
171
SETUP.md
@@ -1,171 +0,0 @@
|
|||||||
# rmtPocketWatcher Setup Guide
|
|
||||||
|
|
||||||
## What's Been Created
|
|
||||||
|
|
||||||
✅ **Backend Scraper Service**
|
|
||||||
- Playwright-based scrapers for Eldorado and PlayerAuctions
|
|
||||||
- Automatic retry logic and error handling
|
|
||||||
- Scheduled scraping every 5 minutes
|
|
||||||
- Tracks all seller listings with platform, price, and delivery time
|
|
||||||
|
|
||||||
✅ **Database Layer**
|
|
||||||
- PostgreSQL with Prisma ORM
|
|
||||||
- Three tables: VendorPrice, PriceIndex, ScrapeLog
|
|
||||||
- Stores all historical listings for trend analysis
|
|
||||||
- Indexed for fast queries
|
|
||||||
|
|
||||||
✅ **API Layer**
|
|
||||||
- Fastify REST API with 6 endpoints
|
|
||||||
- WebSocket for real-time updates
|
|
||||||
- Filter by seller, platform, date range
|
|
||||||
- Historical price data
|
|
||||||
|
|
||||||
✅ **Docker Setup**
|
|
||||||
- Docker Compose orchestration
|
|
||||||
- PostgreSQL container with health checks
|
|
||||||
- Backend container with auto-migration
|
|
||||||
- Volume persistence for database
|
|
||||||
|
|
||||||
## Current Status
|
|
||||||
|
|
||||||
The Docker Compose stack is building. This will:
|
|
||||||
1. Pull PostgreSQL 16 Alpine image
|
|
||||||
2. Build the backend Node.js container
|
|
||||||
3. Install Playwright and dependencies
|
|
||||||
4. Generate Prisma client
|
|
||||||
5. Start both services
|
|
||||||
|
|
||||||
## Once Build Completes
|
|
||||||
|
|
||||||
### Check Status
|
|
||||||
```bash
|
|
||||||
# View logs
|
|
||||||
docker-compose logs -f backend
|
|
||||||
|
|
||||||
# Check if services are running
|
|
||||||
docker ps
|
|
||||||
```
|
|
||||||
|
|
||||||
### Test the API
|
|
||||||
```bash
|
|
||||||
# Health check
|
|
||||||
curl http://localhost:3000/health
|
|
||||||
|
|
||||||
# Get latest prices (after first scrape)
|
|
||||||
curl http://localhost:3000/api/prices/latest
|
|
||||||
|
|
||||||
# Get lowest price
|
|
||||||
curl http://localhost:3000/api/prices/lowest
|
|
||||||
|
|
||||||
# Get price history
|
|
||||||
curl "http://localhost:3000/api/index/history?range=7d"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Monitor Scraping
|
|
||||||
The backend will automatically:
|
|
||||||
- Scrape Eldorado and PlayerAuctions every 5 minutes
|
|
||||||
- Save all listings to the database
|
|
||||||
- Calculate and store the lowest price
|
|
||||||
- Log all scrape attempts
|
|
||||||
|
|
||||||
Check logs to see scraping activity:
|
|
||||||
```bash
|
|
||||||
docker-compose logs -f backend | grep "scraping"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Database Access
|
|
||||||
|
|
||||||
### Using Prisma Studio
|
|
||||||
```bash
|
|
||||||
cd backend
|
|
||||||
npm run db:studio
|
|
||||||
```
|
|
||||||
|
|
||||||
### Using psql
|
|
||||||
```bash
|
|
||||||
docker exec -it rmtpw-postgres psql -U rmtpw -d rmtpocketwatcher
|
|
||||||
```
|
|
||||||
|
|
||||||
## Stopping and Restarting
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Stop services
|
|
||||||
docker-compose down
|
|
||||||
|
|
||||||
# Start services
|
|
||||||
docker-compose up -d
|
|
||||||
|
|
||||||
# Rebuild after code changes
|
|
||||||
docker-compose up --build -d
|
|
||||||
|
|
||||||
# View logs
|
|
||||||
docker-compose logs -f
|
|
||||||
|
|
||||||
# Remove everything including data
|
|
||||||
docker-compose down -v
|
|
||||||
```
|
|
||||||
|
|
||||||
## Environment Variables
|
|
||||||
|
|
||||||
Edit `.env` or `docker-compose.yml` to configure:
|
|
||||||
|
|
||||||
- `SCRAPE_INTERVAL_MINUTES` - How often to scrape (default: 5)
|
|
||||||
- `SCRAPER_HEADLESS` - Run browser in headless mode (default: true)
|
|
||||||
- `PORT` - API server port (default: 3000)
|
|
||||||
- `DATABASE_URL` - PostgreSQL connection string
|
|
||||||
|
|
||||||
## Next Steps
|
|
||||||
|
|
||||||
1. **Wait for build to complete** (~2-5 minutes)
|
|
||||||
2. **Verify services are running**: `docker ps`
|
|
||||||
3. **Check first scrape**: `docker-compose logs -f backend`
|
|
||||||
4. **Test API endpoints**: See examples above
|
|
||||||
5. **Build Electron frontend** (coming next)
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
### Backend won't start
|
|
||||||
```bash
|
|
||||||
# Check logs
|
|
||||||
docker-compose logs backend
|
|
||||||
|
|
||||||
# Restart backend
|
|
||||||
docker-compose restart backend
|
|
||||||
```
|
|
||||||
|
|
||||||
### Database connection issues
|
|
||||||
```bash
|
|
||||||
# Check postgres is healthy
|
|
||||||
docker-compose ps
|
|
||||||
|
|
||||||
# Restart postgres
|
|
||||||
docker-compose restart postgres
|
|
||||||
```
|
|
||||||
|
|
||||||
### Scraper errors
|
|
||||||
```bash
|
|
||||||
# View detailed logs
|
|
||||||
docker-compose logs -f backend | grep -A 5 "error"
|
|
||||||
|
|
||||||
# Check scrape log in database
|
|
||||||
docker exec -it rmtpw-postgres psql -U rmtpw -d rmtpocketwatcher -c "SELECT * FROM scrape_log ORDER BY timestamp DESC LIMIT 10;"
|
|
||||||
```
|
|
||||||
|
|
||||||
## File Structure
|
|
||||||
|
|
||||||
```
|
|
||||||
rmtPocketWatcher/
|
|
||||||
├── docker-compose.yml # Docker orchestration
|
|
||||||
├── .env # Environment variables
|
|
||||||
├── backend/
|
|
||||||
│ ├── Dockerfile # Backend container definition
|
|
||||||
│ ├── prisma/
|
|
||||||
│ │ └── schema.prisma # Database schema
|
|
||||||
│ ├── src/
|
|
||||||
│ │ ├── scrapers/ # Scraping logic
|
|
||||||
│ │ ├── api/ # REST + WebSocket API
|
|
||||||
│ │ ├── database/ # Prisma client & repository
|
|
||||||
│ │ └── index.ts # Main server
|
|
||||||
│ └── package.json
|
|
||||||
└── README.md
|
|
||||||
```
|
|
||||||
|
After Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 6.7 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 27 KiB |
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@color/ic_launcher_background"/>
|
||||||
|
<foreground>
|
||||||
|
<inset
|
||||||
|
android:drawable="@drawable/ic_launcher_foreground"
|
||||||
|
android:inset="16%" />
|
||||||
|
</foreground>
|
||||||
|
</adaptive-icon>
|
||||||
|
Before Width: | Height: | Size: 544 B After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 442 B After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 721 B After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 6.3 KiB |
4
flutter_app/android/app/src/main/res/values/colors.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<color name="ic_launcher_background">#1a1a2e</color>
|
||||||
|
</resources>
|
||||||
@@ -427,7 +427,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
@@ -484,7 +484,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
|
|||||||
@@ -1,122 +1 @@
|
|||||||
{
|
{"images":[{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@3x.png","scale":"3x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@3x.png","scale":"3x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@3x.png","scale":"3x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@1x.png","scale":"1x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@3x.png","scale":"3x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@1x.png","scale":"1x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@1x.png","scale":"1x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@1x.png","scale":"1x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@2x.png","scale":"2x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@1x.png","scale":"1x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@2x.png","scale":"2x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@1x.png","scale":"1x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@2x.png","scale":"2x"},{"size":"83.5x83.5","idiom":"ipad","filename":"Icon-App-83.5x83.5@2x.png","scale":"2x"},{"size":"1024x1024","idiom":"ios-marketing","filename":"Icon-App-1024x1024@1x.png","scale":"1x"}],"info":{"version":1,"author":"xcode"}}
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"size" : "20x20",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-20x20@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "20x20",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-20x20@3x.png",
|
|
||||||
"scale" : "3x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "29x29",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-29x29@1x.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "29x29",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-29x29@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "29x29",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-29x29@3x.png",
|
|
||||||
"scale" : "3x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "40x40",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-40x40@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "40x40",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-40x40@3x.png",
|
|
||||||
"scale" : "3x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "60x60",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-60x60@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "60x60",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-60x60@3x.png",
|
|
||||||
"scale" : "3x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "20x20",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-20x20@1x.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "20x20",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-20x20@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "29x29",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-29x29@1x.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "29x29",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-29x29@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "40x40",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-40x40@1x.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "40x40",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-40x40@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "76x76",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-76x76@1x.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "76x76",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-76x76@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "83.5x83.5",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-83.5x83.5@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "1024x1024",
|
|
||||||
"idiom" : "ios-marketing",
|
|
||||||
"filename" : "Icon-App-1024x1024@1x.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"version" : 1,
|
|
||||||
"author" : "xcode"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 99 KiB |
|
Before Width: | Height: | Size: 295 B After Width: | Height: | Size: 849 B |
|
Before Width: | Height: | Size: 406 B After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 450 B After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 282 B After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 462 B After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 704 B After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 406 B After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 586 B After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 862 B After Width: | Height: | Size: 4.4 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 862 B After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 6.2 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 762 B After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 5.8 KiB |
@@ -41,6 +41,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.4.0"
|
version: "1.4.0"
|
||||||
|
checked_yaml:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: checked_yaml
|
||||||
|
sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.4"
|
||||||
cli_util:
|
cli_util:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -150,6 +158,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.2.1"
|
version: "5.2.1"
|
||||||
|
flutter_launcher_icons:
|
||||||
|
dependency: "direct dev"
|
||||||
|
description:
|
||||||
|
name: flutter_launcher_icons
|
||||||
|
sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.14.4"
|
||||||
flutter_lints:
|
flutter_lints:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
@@ -232,6 +248,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.19.0"
|
version: "0.19.0"
|
||||||
|
json_annotation:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: json_annotation
|
||||||
|
sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "4.9.0"
|
||||||
leak_tracker:
|
leak_tracker:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: rmtpocketwatcher
|
name: rmtpocketwatcher
|
||||||
description: "A new Flutter project."
|
description: "Track USD vs aUEC"
|
||||||
# The following line prevents the package from being accidentally published to
|
# The following line prevents the package from being accidentally published to
|
||||||
# pub.dev using `flutter pub publish`. This is preferred for private packages.
|
# pub.dev using `flutter pub publish`. This is preferred for private packages.
|
||||||
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
||||||
@@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
|||||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||||
# In Windows, build-name is used as the major, minor, and patch parts
|
# In Windows, build-name is used as the major, minor, and patch parts
|
||||||
# of the product and file versions while build-number is used as the build suffix.
|
# of the product and file versions while build-number is used as the build suffix.
|
||||||
version: 1.0.1+2
|
version: 1.0.0
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=3.5.0 <4.0.0'
|
sdk: '>=3.5.0 <4.0.0'
|
||||||
@@ -90,6 +90,17 @@ dev_dependencies:
|
|||||||
# Windows installer creation
|
# Windows installer creation
|
||||||
msix: ^3.16.8
|
msix: ^3.16.8
|
||||||
|
|
||||||
|
# App icon generation
|
||||||
|
flutter_launcher_icons: ^0.14.3
|
||||||
|
|
||||||
|
# Flutter Launcher Icons configuration
|
||||||
|
flutter_launcher_icons:
|
||||||
|
android: true
|
||||||
|
ios: true
|
||||||
|
image_path: "assets/logo.png"
|
||||||
|
adaptive_icon_background: "#1a1a2e"
|
||||||
|
adaptive_icon_foreground: "assets/logo.png"
|
||||||
|
|
||||||
# For information on the generic Dart part of this file, see the
|
# For information on the generic Dart part of this file, see the
|
||||||
# following page: https://dart.dev/tools/pub/pubspec
|
# following page: https://dart.dev/tools/pub/pubspec
|
||||||
|
|
||||||
|
|||||||