@shaykec/app-agent 1.0.4 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/ui-tester/SKILL.md +59 -0
- package/.cursor/rules/safety-guardrails.mdc +1 -0
- package/.cursor/rules/workflow.mdc +4 -4
- package/.cursor/skills/android-customizer/SKILL.md +50 -16
- package/.cursor/skills/appconfig-customization/SKILL.md +15 -0
- package/.cursor/skills/content-writer/SKILL.md +27 -3
- package/.cursor/skills/customization-planner/SKILL.md +17 -1
- package/.cursor/skills/ios-customizer/SKILL.md +54 -13
- package/.cursor/skills/mock-data-update/SKILL.md +11 -3
- package/.cursor/skills/module-integrator/SKILL.md +53 -0
- package/.cursor/skills/module-selector/SKILL.md +11 -0
- package/.cursor/skills/ui-tester/SKILL.md +63 -2
- package/CLAUDE.md +4 -3
- package/dist/cli.d.ts +20 -4
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +178 -15
- package/dist/cli.js.map +1 -1
- package/dist/commands/configure.d.ts +3 -0
- package/dist/commands/configure.d.ts.map +1 -0
- package/dist/commands/configure.js +301 -0
- package/dist/commands/configure.js.map +1 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/github.d.ts +5 -0
- package/dist/github.d.ts.map +1 -1
- package/dist/github.js +27 -0
- package/dist/github.js.map +1 -1
- package/dist/index.js +225 -25
- package/dist/index.js.map +1 -1
- package/dist/preview-generator.d.ts +35 -0
- package/dist/preview-generator.d.ts.map +1 -0
- package/dist/preview-generator.js +546 -0
- package/dist/preview-generator.js.map +1 -0
- package/dist/prompt-builder.d.ts +2 -2
- package/dist/prompt-builder.d.ts.map +1 -1
- package/dist/prompt-builder.js +24 -8
- package/dist/prompt-builder.js.map +1 -1
- package/package.json +4 -1
- package/prompts/agent-prompt.md +1 -1
- package/prompts/quick-agent-prompt.md +2 -2
- package/prompts/scratch-agent-prompt.md +1 -1
- package/prompts/test-agent-prompt.md +1 -1
- package/prompts/update-agent-prompt.md +4 -2
- package/templates/android/BookTemplate/TESTING_MANIFEST.md +12 -0
- package/templates/android/BookTemplate/app/build.gradle.kts +5 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/BookApplication.kt +5 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/core/components/EmptyStateView.kt +105 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/data/DataRepository.kt +37 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/data/DataSourceResolver.kt +3 -4
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/data/local/AppDao.kt +113 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/data/local/AppDatabase.kt +40 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/data/local/BookingEntity.kt +60 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/data/local/BusinessHoursEntity.kt +35 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/data/local/LocalStorageProvider.kt +205 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/data/local/ProviderEntity.kt +83 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/data/local/ReviewEntity.kt +62 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/data/local/ServiceEntity.kt +40 -0
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/features/booking/BookingScreen.kt +5 -3
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/features/bookings/BookingsScreen.kt +18 -34
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/features/discovery/DiscoveryViewModel.kt +3 -2
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/features/discovery/ProviderDetailScreen.kt +3 -2
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/features/discovery/SearchScreen.kt +9 -22
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/features/profile/ProfileScreen.kt +9 -24
- package/templates/android/BookTemplate/app/src/main/kotlin/com/appship/book/mock/MockDataProvider.kt +2 -2
- package/templates/android/BookTemplate/app/src/test/kotlin/com/appship/book/DataRepositoryTest.kt +40 -0
- package/templates/android/BookTemplate/gradle/libs.versions.toml +4 -0
- package/templates/android/BookTemplate/tests/01_launch_discover.yaml +17 -7
- package/templates/android/BookTemplate/tests/02_tab_navigation.yaml +23 -4
- package/templates/android/BookTemplate/tests/03_provider_detail.yaml +36 -5
- package/templates/android/BookTemplate/tests/04_booking_detail.yaml +48 -0
- package/templates/android/BookTemplate/tests/05_booking_create_flow.yaml +42 -0
- package/templates/android/BookTemplate/tests/06_search_filter.yaml +48 -0
- package/templates/android/BookTemplate/tests/07_profile_settings.yaml +37 -0
- package/templates/android/BookTemplate/tests/08_full_e2e.yaml +57 -3
- package/templates/android/ChatTemplate/TESTING_MANIFEST.md +3 -0
- package/templates/android/ChatTemplate/app/build.gradle.kts +5 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/AppConfig.kt +9 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/ChatApplication.kt +6 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/core/components/EmptyStateView.kt +105 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/data/DataRepository.kt +23 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/data/DataSourceResolver.kt +23 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/data/local/AppDao.kt +75 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/data/local/AppDatabase.kt +40 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/data/local/CallEntity.kt +57 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/data/local/ContactEntity.kt +38 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/data/local/ConversationEntity.kt +73 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/data/local/MessageEntity.kt +89 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/data/local/UserEntity.kt +52 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/features/calls/CallsScreen.kt +28 -11
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/features/contacts/ContactsScreen.kt +30 -14
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/features/conversations/ChatScreen.kt +12 -10
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/features/conversations/ConversationsScreen.kt +47 -31
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/features/navigation/Navigation.kt +4 -2
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/features/settings/SettingsScreen.kt +6 -4
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/mock/MockDataProvider.kt +7 -7
- package/templates/android/ChatTemplate/app/src/test/kotlin/com/appship/chat/DataRepositoryTest.kt +41 -0
- package/templates/android/ChatTemplate/gradle/libs.versions.toml +4 -0
- package/templates/android/ChatTemplate/tests/01_launch_chats.yaml +26 -7
- package/templates/android/ChatTemplate/tests/02_tab_navigation.yaml +61 -12
- package/templates/android/ChatTemplate/tests/08_full_e2e.yaml +96 -19
- package/templates/android/DashTemplate/TESTING_MANIFEST.md +6 -0
- package/templates/android/DashTemplate/app/build.gradle.kts +5 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/AppConfig.kt +9 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/DashApplication.kt +10 -1
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/core/components/EmptyStateView.kt +105 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/data/DataRepository.kt +46 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/data/DataSourceResolver.kt +21 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/data/local/AlertEntity.kt +40 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/data/local/AppDao.kt +112 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/data/local/AppDatabase.kt +41 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/data/local/DataPointEntity.kt +32 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/data/local/DataSourceEntity.kt +37 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/data/local/LocalStorageProvider.kt +231 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/data/local/MetricEntity.kt +52 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/data/local/ReportEntity.kt +48 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/data/local/WidgetEntity.kt +97 -0
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/features/alerts/AlertsScreen.kt +28 -13
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/features/dashboard/DashboardScreen.kt +24 -12
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/features/datasources/DataSourcesScreen.kt +33 -18
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/features/reports/ReportsScreen.kt +33 -18
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/mock/MockDataProvider.kt +23 -22
- package/templates/android/DashTemplate/app/src/test/kotlin/com/appship/dash/DataRepositoryTest.kt +41 -0
- package/templates/android/DashTemplate/gradle/libs.versions.toml +4 -0
- package/templates/android/DashTemplate/tests/02_tab_navigation.yaml +41 -7
- package/templates/android/FamilyTemplate/TESTING_MANIFEST.md +3 -0
- package/templates/android/FamilyTemplate/app/build.gradle.kts +5 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/AppConfig.kt +9 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/FamilyApplication.kt +10 -1
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/core/components/EmptyStateView.kt +105 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/data/DataRepository.kt +65 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/data/DataSourceResolver.kt +21 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/data/local/AppDao.kt +138 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/data/local/AppDatabase.kt +42 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/data/local/CalendarEventEntity.kt +55 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/data/local/ChoreEntity.kt +58 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/data/local/FamilyMemberEntity.kt +52 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/data/local/LocalStorageProvider.kt +301 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/data/local/LocationUpdateEntity.kt +39 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/data/local/MilestoneEntity.kt +45 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/data/local/PhotoEntity.kt +51 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/data/local/RewardEntity.kt +48 -0
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/features/calendar/CalendarScreen.kt +23 -12
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/features/chores/ChoreBoardScreen.kt +38 -24
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/features/familyhub/FamilyHubScreen.kt +4 -4
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/features/gallery/GalleryScreen.kt +3 -3
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/features/members/MembersListScreen.kt +5 -5
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/features/rewards/RewardsScreen.kt +5 -5
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/features/settings/SettingsScreen.kt +3 -3
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/mock/MockDataProvider.kt +36 -39
- package/templates/android/FamilyTemplate/app/src/test/java/com/appship/family/DataRepositoryTest.kt +42 -0
- package/templates/android/FamilyTemplate/app/src/test/java/com/appship/family/mock/MockDataProviderTest.kt +17 -17
- package/templates/android/FamilyTemplate/gradle/libs.versions.toml +4 -0
- package/templates/android/FamilyTemplate/tests/01_launch_hub.yaml +32 -1
- package/templates/android/FamilyTemplate/tests/02_tab_navigation.yaml +56 -3
- package/templates/android/FamilyTemplate/tests/03_chore_complete.yaml +36 -3
- package/templates/android/FamilyTemplate/tests/04_add_chore.yaml +49 -3
- package/templates/android/FinanceTemplate/TESTING_MANIFEST.md +4 -0
- package/templates/android/FinanceTemplate/app/build.gradle.kts +3 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/AppConfig.kt +9 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/FinanceApplication.kt +5 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/core/components/EmptyStateView.kt +105 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/data/DataRepository.kt +70 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/data/DataSourceResolver.kt +21 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/data/Models.kt +8 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/data/local/AccountEntity.kt +58 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/data/local/AppDao.kt +145 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/data/local/AppDatabase.kt +42 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/data/local/BillEntity.kt +63 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/data/local/BudgetEntity.kt +54 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/data/local/CategoryEntity.kt +33 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/data/local/GoalEntity.kt +59 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/data/local/InsightEntity.kt +47 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/data/local/LocalStorageProvider.kt +326 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/data/local/TransactionEntity.kt +66 -0
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/features/budgets/BudgetsScreen.kt +16 -4
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/features/goals/GoalsScreen.kt +22 -9
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/features/home/HomeScreen.kt +20 -10
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/features/settings/SettingsScreen.kt +0 -1
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/features/transactions/TransactionsScreen.kt +35 -17
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/mock/MockDataProvider.kt +115 -59
- package/templates/android/FinanceTemplate/app/src/test/kotlin/com/appship/finance/DataRepositoryTest.kt +41 -0
- package/templates/android/FinanceTemplate/app/src/test/kotlin/com/appship/finance/mock/MockDataProviderTest.kt +5 -5
- package/templates/android/FinanceTemplate/gradle/libs.versions.toml +4 -0
- package/templates/android/FinanceTemplate/tests/01_launch_home.yaml +16 -6
- package/templates/android/FinanceTemplate/tests/08_full_e2e.yaml +89 -5
- package/templates/android/GameTemplate/TESTING_MANIFEST.md +3 -0
- package/templates/android/GameTemplate/app/build.gradle.kts +5 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/AppConfig.kt +9 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/MainActivity.kt +6 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/core/components/EmptyStateView.kt +137 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/data/DataRepository.kt +19 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/data/DataSourceResolver.kt +21 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/data/local/AchievementEntity.kt +42 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/data/local/AppDao.kt +127 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/data/local/AppDatabase.kt +41 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/data/local/DailyChallengeEntity.kt +70 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/data/local/GameSessionEntity.kt +45 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/data/local/LeaderboardEntryEntity.kt +57 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/data/local/LevelEntity.kt +45 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/data/local/LocalStorageProvider.kt +99 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/data/local/ShopItemEntity.kt +41 -0
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/features/achievements/AchievementsScreen.kt +20 -11
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/features/leaderboard/LeaderboardScreen.kt +21 -12
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/features/results/ResultsScreen.kt +3 -2
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/features/shop/ShopScreen.kt +32 -23
- package/templates/android/GameTemplate/app/src/main/kotlin/com/appship/game/mock/MockDataProvider.kt +6 -6
- package/templates/android/GameTemplate/app/src/test/kotlin/com/appship/game/DataRepositoryTest.kt +41 -0
- package/templates/android/GameTemplate/gradle/libs.versions.toml +8 -0
- package/templates/android/GameTemplate/tests/01_launch_home.yaml +16 -3
- package/templates/android/GameTemplate/tests/02_tab_navigation.yaml +40 -10
- package/templates/android/GameTemplate/tests/03_game_play.yaml +39 -2
- package/templates/android/GameTemplate/tests/04_leaderboard.yaml +41 -7
- package/templates/android/GameTemplate/tests/05_shop.yaml +36 -7
- package/templates/android/GameTemplate/tests/06_achievements.yaml +39 -6
- package/templates/android/GameTemplate/tests/07_profile_settings.yaml +40 -7
- package/templates/android/GameTemplate/tests/08_full_e2e.yaml +95 -22
- package/templates/android/HealthTemplate/TESTING_MANIFEST.md +2 -0
- package/templates/android/HealthTemplate/app/build.gradle.kts +7 -1
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/AppConfig.kt +9 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/MainActivity.kt +8 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/core/components/EmptyStateView.kt +137 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/data/DataRepository.kt +46 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/data/DataSourceResolver.kt +22 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/data/local/AppDao.kt +120 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/data/local/AppDatabase.kt +43 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/data/local/BodyMeasurementEntity.kt +38 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/data/local/DailyGoalEntity.kt +36 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/data/local/ExerciseEntity.kt +50 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/data/local/HealthMetricEntity.kt +38 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/data/local/LocalStorageProvider.kt +222 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/data/local/MealEntity.kt +60 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/data/local/WaterEntryEntity.kt +34 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/data/local/WorkoutEntity.kt +58 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/data/local/WorkoutSessionEntity.kt +51 -0
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/features/dashboard/DashboardScreen.kt +7 -3
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/features/profile/ProfileScreen.kt +8 -6
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/features/workouts/WorkoutListScreen.kt +15 -3
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/mock/MockDataProvider.kt +24 -22
- package/templates/android/HealthTemplate/app/src/test/kotlin/com/appship/health/DataRepositoryTest.kt +41 -0
- package/templates/android/HealthTemplate/gradle/libs.versions.toml +4 -0
- package/templates/android/HealthTemplate/tests/01_launch_dashboard.yaml +20 -2
- package/templates/android/HealthTemplate/tests/02_tab_navigation.yaml +35 -8
- package/templates/android/HealthTemplate/tests/03_workout_browse.yaml +43 -3
- package/templates/android/HealthTemplate/tests/04_workout_player.yaml +46 -4
- package/templates/android/HealthTemplate/tests/05_meal_logging.yaml +46 -3
- package/templates/android/HealthTemplate/tests/06_progress_charts.yaml +42 -2
- package/templates/android/HealthTemplate/tests/07_profile_settings.yaml +33 -6
- package/templates/android/HealthTemplate/tests/08_full_e2e.yaml +91 -29
- package/templates/android/LearnTemplate/app/build.gradle.kts +5 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/AppConfig.kt +9 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/MainActivity.kt +7 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/core/components/EmptyStateView.kt +137 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/data/DataRepository.kt +49 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/data/DataSourceResolver.kt +22 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/data/local/AchievementEntity.kt +38 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/data/local/AppDao.kt +74 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/data/local/AppDatabase.kt +40 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/data/local/CategoryEntity.kt +32 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/data/local/CourseEntity.kt +86 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/data/local/FlashcardDeckEntity.kt +50 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/data/local/LeaderboardEntryEntity.kt +41 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/data/local/LocalStorageProvider.kt +288 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/features/courses/CourseListScreen.kt +18 -7
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/features/leaderboard/LeaderboardScreen.kt +5 -2
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/features/profile/ProfileScreen.kt +3 -2
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/features/progress/ProgressDashboardScreen.kt +3 -2
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/mock/MockDataProvider.kt +48 -18
- package/templates/android/LearnTemplate/app/src/test/kotlin/com/appship/learn/DataRepositoryTest.kt +41 -0
- package/templates/android/LearnTemplate/gradle/libs.versions.toml +4 -0
- package/templates/android/LearnTemplate/tests/01_launch_home.yaml +13 -3
- package/templates/android/LearnTemplate/tests/02_tab_navigation.yaml +33 -8
- package/templates/android/LearnTemplate/tests/03_course_detail.yaml +29 -8
- package/templates/android/LearnTemplate/tests/04_lesson_player.yaml +31 -8
- package/templates/android/LearnTemplate/tests/05_search_filter.yaml +28 -4
- package/templates/android/LearnTemplate/tests/06_progress.yaml +28 -8
- package/templates/android/LearnTemplate/tests/07_profile_settings.yaml +32 -9
- package/templates/android/LearnTemplate/tests/08_full_e2e.yaml +69 -25
- package/templates/android/MapTemplate/TESTING_MANIFEST.md +9 -0
- package/templates/android/MapTemplate/app/build.gradle.kts +3 -0
- package/templates/android/MapTemplate/app/src/main/AndroidManifest.xml +1 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/MapApplication.kt +11 -1
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/core/components/EmptyStateView.kt +137 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/data/DataSourceResolver.kt +12 -6
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/data/local/AppDao.kt +70 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/data/local/AppDatabase.kt +34 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/data/local/LocalStorageProvider.kt +237 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/data/local/PlaceEntity.kt +104 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/data/local/ReviewEntity.kt +47 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/di/AppModule.kt +11 -2
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/favorites/FavoritesViewModel.kt +4 -4
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/map/MapViewModel.kt +4 -4
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/place/PlaceDetailScreen.kt +2 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/place/PlaceDetailViewModel.kt +5 -5
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/place/PlaceListViewModel.kt +4 -4
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/profile/ProfileScreen.kt +2 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/profile/ProfileViewModel.kt +5 -5
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/route/RouteScreen.kt +2 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/route/RouteViewModel.kt +3 -3
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/search/SearchScreen.kt +2 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/search/SearchViewModel.kt +3 -3
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/settings/SettingsScreen.kt +2 -0
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/features/settings/SettingsViewModel.kt +3 -3
- package/templates/android/MapTemplate/app/src/main/kotlin/com/appship/map/mock/MockDataProvider.kt +54 -41
- package/templates/android/MapTemplate/app/src/test/kotlin/com/appship/map/DataRepositoryTest.kt +18 -0
- package/templates/android/MapTemplate/gradle/libs.versions.toml +4 -0
- package/templates/android/MapTemplate/tests/01_launch_map.yaml +18 -8
- package/templates/android/MapTemplate/tests/02_tab_navigation.yaml +27 -13
- package/templates/android/MapTemplate/tests/03_map_interaction.yaml +23 -10
- package/templates/android/MapTemplate/tests/04_place_detail.yaml +21 -5
- package/templates/android/MapTemplate/tests/05_search.yaml +24 -2
- package/templates/android/MapTemplate/tests/06_filters.yaml +22 -2
- package/templates/android/MapTemplate/tests/08_full_e2e.yaml +26 -41
- package/templates/android/MediaTemplate/TESTING_MANIFEST.md +5 -0
- package/templates/android/MediaTemplate/app/build.gradle.kts +5 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/AppConfig.kt +9 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/MediaApplication.kt +11 -1
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/core/components/EmptyStateView.kt +137 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/data/DataRepository.kt +49 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/data/DataSourceResolver.kt +27 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/data/local/AppDao.kt +132 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/data/local/AppDatabase.kt +40 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/data/local/EpisodeEntity.kt +76 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/data/local/LocalStorageProvider.kt +335 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/data/local/MediaCategoryEntity.kt +39 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/data/local/MediaItemEntity.kt +74 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/data/local/PlaybackHistoryEntity.kt +46 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/data/local/PlaylistEntity.kt +64 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/features/browse/BrowseScreen.kt +3 -1
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/features/detail/DetailScreen.kt +3 -1
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/features/home/HomeScreen.kt +3 -2
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/features/settings/SettingsScreen.kt +2 -0
- package/templates/android/MediaTemplate/app/src/main/kotlin/com/appship/media/mock/MockDataProvider.kt +267 -107
- package/templates/android/MediaTemplate/app/src/test/kotlin/com/appship/media/DataRepositoryTest.kt +41 -0
- package/templates/android/MediaTemplate/gradle/libs.versions.toml +4 -0
- package/templates/android/MediaTemplate/tests/01_launch_home.yaml +18 -8
- package/templates/android/MediaTemplate/tests/02_tab_navigation.yaml +32 -9
- package/templates/android/MediaTemplate/tests/05_search.yaml +28 -1
- package/templates/android/MediaTemplate/tests/06_playlist_management.yaml +37 -0
- package/templates/android/MediaTemplate/tests/07_downloads_settings.yaml +34 -0
- package/templates/android/MediaTemplate/tests/08_full_e2e.yaml +38 -24
- package/templates/android/ReferenceTemplate/app/build.gradle.kts +5 -0
- package/templates/android/ReferenceTemplate/app/src/main/AndroidManifest.xml +3 -14
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/AppConfig.kt +9 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/ReferenceApplication.kt +16 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/data/DataRepository.kt +26 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/data/DataSourceResolver.kt +25 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/data/Models.kt +61 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/data/local/AppDao.kt +57 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/data/local/AppDatabase.kt +37 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/data/local/LocalStorageProvider.kt +277 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/data/local/NoteEntity.kt +57 -0
- package/templates/android/ReferenceTemplate/app/src/main/kotlin/com/appship/reference/data/local/TaskEntity.kt +58 -0
- package/templates/android/ReferenceTemplate/app/src/main/res/values/themes.xml +1 -1
- package/templates/android/ReferenceTemplate/app/src/test/kotlin/com/appship/reference/DataRepositoryTest.kt +17 -0
- package/templates/android/ReferenceTemplate/gradle/libs.versions.toml +4 -0
- package/templates/android/ReferenceTemplate/tests/01_launch_consent.yaml +56 -14
- package/templates/android/ReferenceTemplate/tests/02_biometric_auth.yaml +58 -11
- package/templates/android/ReferenceTemplate/tests/03_home_navigation.yaml +60 -32
- package/templates/android/ReferenceTemplate/tests/05_push_notifications.yaml +30 -32
- package/templates/android/ReferenceTemplate/tests/06_feedback_support.yaml +24 -50
- package/templates/android/ReferenceTemplate/tests/07_settings.yaml +89 -37
- package/templates/android/ReferenceTemplate/tests/08_full_e2e.yaml +132 -56
- package/templates/android/ShopTemplate/TESTING_MANIFEST.md +2 -0
- package/templates/android/ShopTemplate/app/build.gradle.kts +5 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/ShopApplication.kt +6 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/core/components/EmptyStateView.kt +137 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/data/DataSourceResolver.kt +1 -2
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/data/local/AppDao.kt +119 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/data/local/AppDatabase.kt +40 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/data/local/BannerEntity.kt +45 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/data/local/CategoryEntity.kt +39 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/data/local/LocalStorageProvider.kt +333 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/data/local/OrderEntity.kt +108 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/data/local/ProductEntity.kt +89 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/data/local/ReviewEntity.kt +73 -0
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/features/cart/CartScreen.kt +6 -15
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/features/home/HomeViewModel.kt +7 -5
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/features/products/ProductListScreen.kt +2 -3
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/features/products/ProductViewModels.kt +8 -5
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/features/wishlist/WishlistScreen.kt +5 -13
- package/templates/android/ShopTemplate/app/src/main/kotlin/com/appship/shop/mock/MockDataProvider.kt +5 -4
- package/templates/android/ShopTemplate/app/src/test/kotlin/com/appship/shop/DataRepositoryTest.kt +41 -0
- package/templates/android/ShopTemplate/gradle/libs.versions.toml +4 -0
- package/templates/android/ShopTemplate/tests/01_launch_home.yaml +25 -5
- package/templates/android/ShopTemplate/tests/02_tab_navigation.yaml +35 -9
- package/templates/android/ShopTemplate/tests/03_product_detail.yaml +43 -0
- package/templates/android/ShopTemplate/tests/04_cart_checkout.yaml +49 -0
- package/templates/android/ShopTemplate/tests/05_search_filter.yaml +37 -4
- package/templates/android/ShopTemplate/tests/06_wishlist.yaml +32 -3
- package/templates/android/ShopTemplate/tests/07_profile_settings.yaml +39 -3
- package/templates/android/ShopTemplate/tests/08_full_e2e.yaml +49 -11
- package/templates/android/Skeleton/TESTING_MANIFEST.md +2 -1
- package/templates/android/Skeleton/app/build.gradle.kts +3 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/SkeletonApplication.kt +10 -1
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/core/components/EmptyStateView.kt +137 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/data/DataSourceResolver.kt +2 -4
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/data/local/AppDao.kt +62 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/data/local/AppDatabase.kt +34 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/data/local/CategoryEntity.kt +32 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/data/local/ItemEntity.kt +59 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/data/local/LocalStorageProvider.kt +153 -0
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/features/explore/ExploreScreen.kt +23 -12
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/features/favorites/FavoritesScreen.kt +9 -23
- package/templates/android/Skeleton/app/src/main/kotlin/com/appship/skeleton/features/home/HomeScreen.kt +44 -30
- package/templates/android/Skeleton/app/src/test/kotlin/com/appship/skeleton/DataRepositoryTest.kt +100 -0
- package/templates/android/Skeleton/gradle/libs.versions.toml +4 -0
- package/templates/android/Skeleton/tests/01_app_launch.yaml +1 -2
- package/templates/android/Skeleton/tests/02_tab_navigation.yaml +6 -11
- package/templates/android/Skeleton/tests/03_detail_screen.yaml +20 -0
- package/templates/android/Skeleton/tests/04_favorites.yaml +17 -0
- package/templates/android/Skeleton/tests/05_explore_search.yaml +12 -0
- package/templates/android/Skeleton/tests/06_create_item.yaml +19 -0
- package/templates/android/Skeleton/tests/07_profile.yaml +17 -0
- package/templates/android/Skeleton/tests/08_full_e2e.yaml +36 -0
- package/templates/android/SocialTemplate/TESTING_MANIFEST.md +6 -0
- package/templates/android/SocialTemplate/app/build.gradle.kts +3 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/SocialApplication.kt +2 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/core/components/EmptyStateView.kt +137 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/data/DataRepository.kt +0 -1
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/data/DataSourceResolver.kt +1 -2
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/data/local/AppDao.kt +139 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/data/local/AppDatabase.kt +42 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/data/local/CommentEntity.kt +60 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/data/local/ConversationEntity.kt +60 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/data/local/LocalStorageProvider.kt +295 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/data/local/MessageEntity.kt +63 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/data/local/NotificationEntity.kt +64 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/data/local/PostEntity.kt +89 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/data/local/StoryEntity.kt +50 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/data/local/UserEntity.kt +64 -0
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/features/createpost/CreatePostScreen.kt +4 -3
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/features/feed/CommentsScreen.kt +4 -3
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/features/feed/FeedScreen.kt +4 -3
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/features/messages/MessagesScreen.kt +28 -17
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/features/notifications/NotificationsScreen.kt +20 -9
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/features/profile/ProfileScreen.kt +5 -4
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/features/search/SearchScreen.kt +23 -14
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/mock/MockDataProvider.kt +18 -18
- package/templates/android/SocialTemplate/app/src/test/kotlin/com/appship/social/DataRepositoryTest.kt +41 -0
- package/templates/android/SocialTemplate/gradle/libs.versions.toml +4 -0
- package/templates/android/SocialTemplate/tests/01_launch_feed.yaml +16 -7
- package/templates/android/SocialTemplate/tests/02_tab_navigation.yaml +38 -6
- package/templates/android/SocialTemplate/tests/03_post_interaction.yaml +35 -6
- package/templates/android/SocialTemplate/tests/04_create_post.yaml +31 -2
- package/templates/android/SocialTemplate/tests/05_search_follow.yaml +32 -5
- package/templates/android/SocialTemplate/tests/06_profile_settings.yaml +50 -0
- package/templates/android/SocialTemplate/tests/07_messages.yaml +36 -2
- package/templates/android/SocialTemplate/tests/08_full_e2e.yaml +47 -7
- package/templates/android/TaskTemplate/TESTING_MANIFEST.md +5 -0
- package/templates/android/TaskTemplate/app/build.gradle.kts +9 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/AppConfig.kt +9 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/TaskApplication.kt +2 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/core/components/EmptyStateView.kt +137 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/data/DataRepository.kt +41 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/data/DataSourceResolver.kt +22 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/data/local/AppDao.kt +105 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/data/local/AppDatabase.kt +39 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/data/local/KanbanColumnEntity.kt +41 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/data/local/LocalStorageProvider.kt +204 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/data/local/ProjectEntity.kt +50 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/data/local/TagEntity.kt +29 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/data/local/TaskEntity.kt +79 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/calendar/CalendarScreen.kt +0 -1
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/inbox/InboxScreen.kt +15 -24
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/kanban/KanbanBoardScreen.kt +6 -3
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/projects/ProjectDetailScreen.kt +36 -18
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/projects/ProjectListScreen.kt +17 -26
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/search/SearchScreen.kt +7 -4
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/tasks/TaskDetailScreen.kt +0 -1
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/mock/MockDataProvider.kt +21 -16
- package/templates/android/TaskTemplate/app/src/test/kotlin/com/appship/task/DataRepositoryTest.kt +41 -0
- package/templates/android/TaskTemplate/gradle/libs.versions.toml +6 -0
- package/templates/android/TaskTemplate/tests/07_search_filter.yaml +70 -6
- package/templates/android/TrackTemplate/TESTING_MANIFEST.md +4 -0
- package/templates/android/TrackTemplate/app/build.gradle.kts +6 -1
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/AppConfig.kt +9 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/TrackApplication.kt +2 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/core/components/EmptyStateView.kt +89 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/data/DataRepository.kt +34 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/data/DataSourceResolver.kt +22 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/data/local/AchievementEntity.kt +53 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/data/local/AppDao.kt +93 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/data/local/AppDatabase.kt +39 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/data/local/HabitEntity.kt +75 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/data/local/HabitEntryEntity.kt +50 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/data/local/LocalStorageProvider.kt +182 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/data/local/StreakEntity.kt +43 -0
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/features/achievements/AchievementsViewModel.kt +4 -2
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/features/dashboard/TodayScreen.kt +10 -39
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/features/dashboard/TodayViewModel.kt +4 -2
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/features/habits/HabitDetailViewModel.kt +4 -2
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/features/habits/HabitsListScreen.kt +8 -35
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/features/habits/HabitsListViewModel.kt +4 -2
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/mock/MockDataProvider.kt +14 -12
- package/templates/android/TrackTemplate/app/src/test/kotlin/com/appship/track/DataRepositoryTest.kt +41 -0
- package/templates/android/TrackTemplate/gradle/libs.versions.toml +6 -0
- package/templates/android/TrackTemplate/tests/01_launch_today.yaml +44 -5
- package/templates/android/TrackTemplate/tests/02_tab_navigation.yaml +79 -16
- package/templates/android/TrackTemplate/tests/03_habit_toggle.yaml +65 -4
- package/templates/android/TrackTemplate/tests/04_add_habit.yaml +98 -3
- package/templates/android/TrackTemplate/tests/06_dashboard.yaml +54 -4
- package/templates/android/TrackTemplate/tests/07_settings.yaml +81 -4
- package/templates/android/TrackTemplate/tests/08_full_e2e.yaml +116 -18
- package/templates/ios/BookTemplate/BookTemplate/Core/EmptyStateView.swift +130 -0
- package/templates/ios/BookTemplate/BookTemplate/Core/Strings.swift +27 -0
- package/templates/ios/BookTemplate/BookTemplate/Data/DataSourceResolver.swift +1 -2
- package/templates/ios/BookTemplate/BookTemplate/Data/LocalStorage/BookingEntity.swift +53 -0
- package/templates/ios/BookTemplate/BookTemplate/Data/LocalStorage/BusinessHoursEntity.swift +33 -0
- package/templates/ios/BookTemplate/BookTemplate/Data/LocalStorage/CoreDataStack.swift +345 -0
- package/templates/ios/BookTemplate/BookTemplate/Data/LocalStorage/LocalStorageProvider.swift +222 -0
- package/templates/ios/BookTemplate/BookTemplate/Data/LocalStorage/ProviderEntity.swift +88 -0
- package/templates/ios/BookTemplate/BookTemplate/Data/LocalStorage/ReviewEntity.swift +66 -0
- package/templates/ios/BookTemplate/BookTemplate/Data/LocalStorage/ServiceEntity.swift +37 -0
- package/templates/ios/BookTemplate/BookTemplate/Features/Calendar/BookingsView.swift +16 -21
- package/templates/ios/BookTemplate/BookTemplate/Features/Discovery/SearchView.swift +1 -21
- package/templates/ios/BookTemplate/BookTemplate/Features/Profile/FavoritesView.swift +6 -27
- package/templates/ios/BookTemplate/BookTemplate/MockData/MockDataProvider.swift +8 -0
- package/templates/ios/BookTemplate/BookTemplate.xcodeproj/project.pbxproj +56 -0
- package/templates/ios/BookTemplate/BookTemplateTests/DataRepositoryTests.swift +26 -0
- package/templates/ios/BookTemplate/TESTING_MANIFEST.md +4 -0
- package/templates/ios/BookTemplate/tests/01_launch_discover.yaml +14 -5
- package/templates/ios/BookTemplate/tests/02_tab_navigation.yaml +23 -2
- package/templates/ios/BookTemplate/tests/03_provider_detail.yaml +37 -5
- package/templates/ios/BookTemplate/tests/04_booking_detail.yaml +48 -0
- package/templates/ios/BookTemplate/tests/05_booking_create_flow.yaml +42 -0
- package/templates/ios/BookTemplate/tests/06_search_filter.yaml +48 -0
- package/templates/ios/BookTemplate/tests/07_profile_settings.yaml +37 -0
- package/templates/ios/BookTemplate/tests/08_full_e2e.yaml +59 -12
- package/templates/ios/ChatTemplate/ChatTemplate/App/AppConfig.swift +9 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Core/EmptyStateView.swift +130 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Core/Strings.swift +27 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Data/DataRepository.swift +43 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Data/DataSourceResolver.swift +19 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Data/LocalStorage/CallEntity.swift +64 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Data/LocalStorage/ContactEntity.swift +35 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Data/LocalStorage/ConversationEntity.swift +82 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Data/LocalStorage/CoreDataStack.swift +351 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Data/LocalStorage/LocalStorageProvider.swift +257 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Data/LocalStorage/MessageEntity.swift +77 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Data/LocalStorage/UserEntity.swift +47 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Features/Calls/CallsView.swift +16 -7
- package/templates/ios/ChatTemplate/ChatTemplate/Features/Contacts/ContactsView.swift +16 -7
- package/templates/ios/ChatTemplate/ChatTemplate/Features/Conversations/ConversationsView.swift +31 -22
- package/templates/ios/ChatTemplate/ChatTemplate/MockData/MockDataProvider.swift +1 -1
- package/templates/ios/ChatTemplate/ChatTemplate.xcodeproj/project.pbxproj +71 -0
- package/templates/ios/ChatTemplate/ChatTemplateTests/DataRepositoryTests.swift +26 -0
- package/templates/ios/ChatTemplate/TESTING_MANIFEST.md +3 -0
- package/templates/ios/ChatTemplate/tests/01_launch_chats.yaml +26 -7
- package/templates/ios/ChatTemplate/tests/02_tab_navigation.yaml +61 -12
- package/templates/ios/ChatTemplate/tests/03_conversation_chat.yaml +38 -6
- package/templates/ios/ChatTemplate/tests/04_new_chat.yaml +57 -4
- package/templates/ios/ChatTemplate/tests/05_calls.yaml +39 -4
- package/templates/ios/DashTemplate/DashTemplate/App/AppConfig.swift +9 -0
- package/templates/ios/DashTemplate/DashTemplate/Core/EmptyStateView.swift +130 -0
- package/templates/ios/DashTemplate/DashTemplate/Core/Strings.swift +27 -0
- package/templates/ios/DashTemplate/DashTemplate/Data/DataRepository.swift +53 -0
- package/templates/ios/DashTemplate/DashTemplate/Data/DataSourceResolver.swift +19 -0
- package/templates/ios/DashTemplate/DashTemplate/Data/LocalStorage/AlertEntity.swift +35 -0
- package/templates/ios/DashTemplate/DashTemplate/Data/LocalStorage/CoreDataStack.swift +260 -0
- package/templates/ios/DashTemplate/DashTemplate/Data/LocalStorage/DataPointEntity.swift +28 -0
- package/templates/ios/DashTemplate/DashTemplate/Data/LocalStorage/DataSourceEntity.swift +32 -0
- package/templates/ios/DashTemplate/DashTemplate/Data/LocalStorage/LocalStorageProvider.swift +312 -0
- package/templates/ios/DashTemplate/DashTemplate/Data/LocalStorage/MetricEntity.swift +56 -0
- package/templates/ios/DashTemplate/DashTemplate/Data/LocalStorage/ReportEntity.swift +51 -0
- package/templates/ios/DashTemplate/DashTemplate/Data/LocalStorage/WidgetEntity.swift +98 -0
- package/templates/ios/DashTemplate/DashTemplate/Features/Alerts/AlertsView.swift +31 -15
- package/templates/ios/DashTemplate/DashTemplate/Features/Dashboard/DashboardView.swift +32 -21
- package/templates/ios/DashTemplate/DashTemplate/Features/DataSources/DataSourcesView.swift +24 -13
- package/templates/ios/DashTemplate/DashTemplate/Features/Reports/ReportsView.swift +23 -11
- package/templates/ios/DashTemplate/DashTemplate/MockData/MockDataProvider.swift +1 -1
- package/templates/ios/DashTemplate/DashTemplate.xcodeproj/project.pbxproj +68 -0
- package/templates/ios/DashTemplate/DashTemplateTests/DataRepositoryTests.swift +27 -0
- package/templates/ios/DashTemplate/TESTING_MANIFEST.md +6 -0
- package/templates/ios/DashTemplate/tests/01_launch_dashboard.yaml +16 -3
- package/templates/ios/DashTemplate/tests/02_tab_navigation.yaml +35 -13
- package/templates/ios/FamilyTemplate/FamilyTemplate/App/AppConfig.swift +9 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/App/FamilyTemplateApp.swift +4 -2
- package/templates/ios/FamilyTemplate/FamilyTemplate/Core/EmptyStateView.swift +130 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Core/Strings.swift +27 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Data/DataRepository.swift +63 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Data/DataSourceResolver.swift +14 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Data/LocalStorage/CalendarEventEntity.swift +59 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Data/LocalStorage/ChoreEntity.swift +53 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Data/LocalStorage/CoreDataStack.swift +385 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Data/LocalStorage/FamilyMemberEntity.swift +56 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Data/LocalStorage/LocalStorageProvider.swift +388 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Data/LocalStorage/LocationUpdateEntity.swift +35 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Data/LocalStorage/MilestoneEntity.swift +41 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Data/LocalStorage/PhotoEntity.swift +56 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Data/LocalStorage/RewardEntity.swift +44 -0
- package/templates/ios/FamilyTemplate/FamilyTemplate/Features/Calendar/CalendarView.swift +4 -5
- package/templates/ios/FamilyTemplate/FamilyTemplate/Features/Chores/ChoreBoardView.swift +4 -29
- package/templates/ios/FamilyTemplate/FamilyTemplate/Features/Gallery/GalleryView.swift +16 -7
- package/templates/ios/FamilyTemplate/FamilyTemplate/Features/Members/MembersListView.swift +14 -5
- package/templates/ios/FamilyTemplate/FamilyTemplate/Features/Rewards/RewardsView.swift +4 -5
- package/templates/ios/FamilyTemplate/FamilyTemplate/MockData/MockDataProvider.swift +1 -1
- package/templates/ios/FamilyTemplate/FamilyTemplate.xcodeproj/project.pbxproj +72 -0
- package/templates/ios/FamilyTemplate/FamilyTemplateTests/DataRepositoryTests.swift +26 -0
- package/templates/ios/FamilyTemplate/TESTING_MANIFEST.md +7 -0
- package/templates/ios/FamilyTemplate/tests/01_launch_hub.yaml +34 -14
- package/templates/ios/FamilyTemplate/tests/02_tab_navigation.yaml +62 -19
- package/templates/ios/FamilyTemplate/tests/03_chore_complete.yaml +38 -19
- package/templates/ios/FamilyTemplate/tests/04_add_chore.yaml +50 -14
- package/templates/ios/FamilyTemplate/tests/05_rewards.yaml +49 -17
- package/templates/ios/FamilyTemplate/tests/06_calendar.yaml +56 -14
- package/templates/ios/FamilyTemplate/tests/07_gallery.yaml +55 -20
- package/templates/ios/FamilyTemplate/tests/08_full_e2e.yaml +131 -35
- package/templates/ios/FinanceTemplate/Features/Accounts/AccountsView.swift +4 -4
- package/templates/ios/FinanceTemplate/FinanceTemplate/App/AppConfig.swift +9 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Core/EmptyStateView.swift +130 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Data/DataRepository.swift +56 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Data/DataSourceResolver.swift +19 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Data/LocalStorage/AccountEntity.swift +51 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Data/LocalStorage/BillEntity.swift +57 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Data/LocalStorage/BudgetEntity.swift +48 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Data/LocalStorage/CategoryEntity.swift +30 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Data/LocalStorage/CoreDataStack.swift +468 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Data/LocalStorage/GoalEntity.swift +54 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Data/LocalStorage/InsightEntity.swift +41 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Data/LocalStorage/LocalStorageProvider.swift +420 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Data/LocalStorage/TransactionEntity.swift +60 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Data/SyncManager.swift +3 -3
- package/templates/ios/FinanceTemplate/FinanceTemplate/Features/Budgets/BudgetsView.swift +13 -4
- package/templates/ios/FinanceTemplate/FinanceTemplate/Features/Goals/GoalsView.swift +14 -5
- package/templates/ios/FinanceTemplate/FinanceTemplate/Features/Home/HomeView.swift +13 -6
- package/templates/ios/FinanceTemplate/FinanceTemplate/Features/Settings/SettingsView.swift +6 -2
- package/templates/ios/FinanceTemplate/FinanceTemplate/Features/Transactions/AddTransactionView.swift +4 -2
- package/templates/ios/FinanceTemplate/FinanceTemplate/Features/Transactions/TransactionsView.swift +3 -1
- package/templates/ios/FinanceTemplate/FinanceTemplate/MockData/MockDataProvider.swift +7 -7
- package/templates/ios/FinanceTemplate/FinanceTemplate/Models/Models.swift +41 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate.xcodeproj/project.pbxproj +75 -0
- package/templates/ios/FinanceTemplate/FinanceTemplateTests/DataRepositoryTests.swift +26 -0
- package/templates/ios/FinanceTemplate/FinanceTemplateTests/MockDataProviderTests.swift +6 -6
- package/templates/ios/FinanceTemplate/TESTING_MANIFEST.md +6 -0
- package/templates/ios/FinanceTemplate/tests/01_launch_home.yaml +16 -6
- package/templates/ios/FinanceTemplate/tests/02_tab_navigation.yaml +41 -5
- package/templates/ios/FinanceTemplate/tests/03_transaction_detail.yaml +39 -0
- package/templates/ios/FinanceTemplate/tests/05_add_transaction.yaml +55 -0
- package/templates/ios/GameTemplate/GameTemplate/App/AppConfig.swift +9 -0
- package/templates/ios/GameTemplate/GameTemplate/Core/Components/EmptyStateView.swift +59 -0
- package/templates/ios/GameTemplate/GameTemplate/Core/Strings.swift +16 -0
- package/templates/ios/GameTemplate/GameTemplate/Data/DataRepository.swift +30 -0
- package/templates/ios/GameTemplate/GameTemplate/Data/DataSourceResolver.swift +20 -0
- package/templates/ios/GameTemplate/GameTemplate/Data/LocalStorage/AchievementEntity.swift +36 -0
- package/templates/ios/GameTemplate/GameTemplate/Data/LocalStorage/CoreDataStack.swift +316 -0
- package/templates/ios/GameTemplate/GameTemplate/Data/LocalStorage/DailyChallengeEntity.swift +60 -0
- package/templates/ios/GameTemplate/GameTemplate/Data/LocalStorage/GameSessionEntity.swift +36 -0
- package/templates/ios/GameTemplate/GameTemplate/Data/LocalStorage/LeaderboardEntryEntity.swift +124 -0
- package/templates/ios/GameTemplate/GameTemplate/Data/LocalStorage/LevelEntity.swift +39 -0
- package/templates/ios/GameTemplate/GameTemplate/Data/LocalStorage/ShopItemEntity.swift +39 -0
- package/templates/ios/GameTemplate/GameTemplate/Features/Achievements/AchievementsView.swift +10 -4
- package/templates/ios/GameTemplate/GameTemplate/Features/DailyChallenge/DailyChallengeView.swift +1 -1
- package/templates/ios/GameTemplate/GameTemplate/Features/Home/HomeMenuView.swift +16 -11
- package/templates/ios/GameTemplate/GameTemplate/Features/Leaderboard/LeaderboardView.swift +11 -7
- package/templates/ios/GameTemplate/GameTemplate/Features/Profile/ProfileView.swift +2 -2
- package/templates/ios/GameTemplate/GameTemplate/Features/Results/ResultsView.swift +2 -2
- package/templates/ios/GameTemplate/GameTemplate/Features/Shop/ShopView.swift +11 -7
- package/templates/ios/GameTemplate/GameTemplate/MockData/MockDataProvider.swift +1 -1
- package/templates/ios/GameTemplate/GameTemplate.xcodeproj/project.pbxproj +56 -0
- package/templates/ios/GameTemplate/GameTemplateTests/DataRepositoryTests.swift +26 -0
- package/templates/ios/GameTemplate/TESTING_MANIFEST.md +2 -0
- package/templates/ios/GameTemplate/tests/01_launch_home.yaml +13 -2
- package/templates/ios/GameTemplate/tests/02_tab_navigation.yaml +31 -1
- package/templates/ios/GameTemplate/tests/03_game_play.yaml +48 -8
- package/templates/ios/GameTemplate/tests/04_leaderboard.yaml +36 -4
- package/templates/ios/GameTemplate/tests/05_shop.yaml +33 -4
- package/templates/ios/GameTemplate/tests/06_achievements.yaml +35 -2
- package/templates/ios/GameTemplate/tests/07_profile_settings.yaml +38 -2
- package/templates/ios/GameTemplate/tests/08_full_e2e.yaml +98 -26
- package/templates/ios/HealthTemplate/HealthTemplate/App/AppConfig.swift +9 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Core/Components/EmptyStateView.swift +59 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Core/Strings.swift +16 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Data/DataRepository.swift +60 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Data/DataSourceResolver.swift +19 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Data/LocalStorage/BodyMeasurementEntity.swift +30 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Data/LocalStorage/CoreDataStack.swift +377 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Data/LocalStorage/DailyGoalEntity.swift +30 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Data/LocalStorage/ExerciseEntity.swift +45 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Data/LocalStorage/HealthMetricEntity.swift +30 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Data/LocalStorage/LocalStorageProvider.swift +398 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Data/LocalStorage/MealEntity.swift +59 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Data/LocalStorage/WaterEntryEntity.swift +27 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Data/LocalStorage/WorkoutEntity.swift +59 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Data/LocalStorage/WorkoutSessionEntity.swift +52 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Features/Dashboard/DashboardView.swift +7 -7
- package/templates/ios/HealthTemplate/HealthTemplate/Features/Navigation/MainTabView.swift +1 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Features/Nutrition/MealLogView.swift +2 -1
- package/templates/ios/HealthTemplate/HealthTemplate/Features/Nutrition/NutritionLogView.swift +3 -4
- package/templates/ios/HealthTemplate/HealthTemplate/Features/Onboarding/OnboardingView.swift +1 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Features/Profile/ProfileView.swift +9 -8
- package/templates/ios/HealthTemplate/HealthTemplate/Features/Progress/ProgressChartsView.swift +3 -2
- package/templates/ios/HealthTemplate/HealthTemplate/Features/Settings/SettingsView.swift +1 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Features/Workouts/ExerciseDetailView.swift +1 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Features/Workouts/WorkoutListView.swift +10 -6
- package/templates/ios/HealthTemplate/HealthTemplate/Features/Workouts/WorkoutPlayerView.swift +4 -3
- package/templates/ios/HealthTemplate/HealthTemplate/MockData/MockDataProvider.swift +1 -1
- package/templates/ios/HealthTemplate/HealthTemplate.xcodeproj/project.pbxproj +83 -0
- package/templates/ios/HealthTemplate/HealthTemplateTests/DataRepositoryTests.swift +26 -0
- package/templates/ios/HealthTemplate/tests/01_launch_dashboard.yaml +24 -11
- package/templates/ios/HealthTemplate/tests/02_tab_navigation.yaml +17 -6
- package/templates/ios/HealthTemplate/tests/03_workout_browse.yaml +56 -0
- package/templates/ios/HealthTemplate/tests/04_workout_player.yaml +48 -8
- package/templates/ios/HealthTemplate/tests/05_meal_logging.yaml +44 -11
- package/templates/ios/HealthTemplate/tests/07_profile_settings.yaml +30 -9
- package/templates/ios/HealthTemplate/tests/08_full_e2e.yaml +84 -16
- package/templates/ios/LearnTemplate/LearnTemplate/App/AppConfig.swift +9 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Core/Components/EmptyStateView.swift +59 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Core/Strings.swift +16 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Data/DataRepository.swift +52 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Data/DataSourceResolver.swift +19 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Data/LocalStorage/AchievementEntity.swift +33 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Data/LocalStorage/CategoryEntity.swift +27 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Data/LocalStorage/CoreDataStack.swift +270 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Data/LocalStorage/CourseEntity.swift +108 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Data/LocalStorage/FlashcardDeckEntity.swift +62 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Data/LocalStorage/LeaderboardEntryEntity.swift +36 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Data/LocalStorage/LocalStorageProvider.swift +325 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Courses/CourseDetailView.swift +12 -6
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Courses/CourseListView.swift +12 -6
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Flashcards/FlashcardView.swift +3 -1
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Leaderboard/LeaderboardView.swift +3 -1
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Lessons/LessonPlayerView.swift +5 -2
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Onboarding/OnboardingView.swift +8 -3
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Profile/ProfileView.swift +5 -2
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Progress/ProgressDashboardView.swift +4 -2
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Quiz/QuizView.swift +3 -1
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Settings/SettingsView.swift +1 -0
- package/templates/ios/LearnTemplate/LearnTemplate/MockData/MockDataProvider.swift +2 -2
- package/templates/ios/LearnTemplate/LearnTemplate.xcodeproj/project.pbxproj +56 -0
- package/templates/ios/LearnTemplate/LearnTemplateTests/DataRepositoryTests.swift +26 -0
- package/templates/ios/LearnTemplate/tests/01_launch_home.yaml +16 -2
- package/templates/ios/LearnTemplate/tests/02_tab_navigation.yaml +33 -6
- package/templates/ios/LearnTemplate/tests/03_course_detail.yaml +29 -7
- package/templates/ios/LearnTemplate/tests/04_quiz_flow.yaml +32 -18
- package/templates/ios/LearnTemplate/tests/05_flashcard_flip.yaml +45 -8
- package/templates/ios/LearnTemplate/tests/06_progress_stats.yaml +28 -3
- package/templates/ios/MapTemplate/MapTemplate/App/AppConfig.swift +9 -0
- package/templates/ios/MapTemplate/MapTemplate/Core/Components/EmptyStateView.swift +59 -0
- package/templates/ios/MapTemplate/MapTemplate/Core/Strings.swift +16 -0
- package/templates/ios/MapTemplate/MapTemplate/Data/DataRepository.swift +36 -0
- package/templates/ios/MapTemplate/MapTemplate/Data/DataSourceResolver.swift +1 -2
- package/templates/ios/MapTemplate/MapTemplate/Data/LocalStorage/CoreDataStack.swift +203 -0
- package/templates/ios/MapTemplate/MapTemplate/Data/LocalStorage/LocalStorageProvider.swift +237 -0
- package/templates/ios/MapTemplate/MapTemplate/Data/LocalStorage/PlaceEntity.swift +111 -0
- package/templates/ios/MapTemplate/MapTemplate/Data/LocalStorage/ReviewEntity.swift +40 -0
- package/templates/ios/MapTemplate/MapTemplate/Features/Favorites/FavoritesView.swift +3 -14
- package/templates/ios/MapTemplate/MapTemplate/Features/Filters/FiltersView.swift +1 -0
- package/templates/ios/MapTemplate/MapTemplate/Features/Map/MapView.swift +1 -0
- package/templates/ios/MapTemplate/MapTemplate/Features/Onboarding/OnboardingView.swift +1 -0
- package/templates/ios/MapTemplate/MapTemplate/Features/PlaceDetail/PlaceDetailView.swift +8 -3
- package/templates/ios/MapTemplate/MapTemplate/Features/PlaceList/PlaceListView.swift +3 -9
- package/templates/ios/MapTemplate/MapTemplate/Features/Profile/ProfileView.swift +1 -0
- package/templates/ios/MapTemplate/MapTemplate/Features/Route/RouteView.swift +1 -0
- package/templates/ios/MapTemplate/MapTemplate/Features/Search/SearchView.swift +3 -10
- package/templates/ios/MapTemplate/MapTemplate/Features/Settings/SettingsView.swift +1 -0
- package/templates/ios/MapTemplate/MapTemplate/MockData/MockDataProvider.swift +1 -1
- package/templates/ios/MapTemplate/MapTemplate.xcodeproj/project.pbxproj +44 -0
- package/templates/ios/MapTemplate/MapTemplateTests/DataRepositoryTests.swift +25 -0
- package/templates/ios/MapTemplate/TESTING_MANIFEST.md +9 -0
- package/templates/ios/MapTemplate/tests/01_launch_map.yaml +22 -7
- package/templates/ios/MapTemplate/tests/02_tab_navigation.yaml +24 -15
- package/templates/ios/MapTemplate/tests/03_map_interaction.yaml +32 -10
- package/templates/ios/MapTemplate/tests/04_place_detail.yaml +30 -12
- package/templates/ios/MapTemplate/tests/06_profile_settings.yaml +17 -19
- package/templates/ios/MapTemplate/tests/07_favorites.yaml +31 -11
- package/templates/ios/MapTemplate/tests/08_full_e2e.yaml +45 -20
- package/templates/ios/MediaTemplate/MediaTemplate/App/AppConfig.swift +9 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Core/Components/CommonComponents.swift +2 -1
- package/templates/ios/MediaTemplate/MediaTemplate/Core/Components/EmptyStateView.swift +59 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Core/Strings.swift +16 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Data/DataRepository.swift +52 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Data/DataSourceResolver.swift +19 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Data/LocalStorage/CoreDataStack.swift +333 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Data/LocalStorage/EpisodeEntity.swift +79 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Data/LocalStorage/LocalStorageProvider.swift +393 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Data/LocalStorage/MediaCategoryEntity.swift +36 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Data/LocalStorage/MediaItemEntity.swift +82 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Data/LocalStorage/PlaybackHistoryEntity.swift +51 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Data/LocalStorage/PlaylistEntity.swift +66 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Features/Browse/BrowseView.swift +10 -3
- package/templates/ios/MediaTemplate/MediaTemplate/Features/Detail/DetailView.swift +14 -7
- package/templates/ios/MediaTemplate/MediaTemplate/Features/Home/HomeView.swift +14 -9
- package/templates/ios/MediaTemplate/MediaTemplate/Features/Library/LibraryView.swift +10 -5
- package/templates/ios/MediaTemplate/MediaTemplate/Features/Onboarding/OnboardingView.swift +1 -0
- package/templates/ios/MediaTemplate/MediaTemplate/Features/Player/PlayerFullView.swift +3 -1
- package/templates/ios/MediaTemplate/MediaTemplate/Features/Settings/SettingsView.swift +1 -0
- package/templates/ios/MediaTemplate/MediaTemplate/MockData/MockDataProvider.swift +1 -1
- package/templates/ios/MediaTemplate/MediaTemplate.xcodeproj/project.pbxproj +56 -0
- package/templates/ios/MediaTemplate/MediaTemplateTests/DataRepositoryTests.swift +26 -0
- package/templates/ios/MediaTemplate/TESTING_MANIFEST.md +5 -0
- package/templates/ios/MediaTemplate/tests/01_launch_home.yaml +22 -6
- package/templates/ios/MediaTemplate/tests/02_tab_navigation.yaml +30 -10
- package/templates/ios/MediaTemplate/tests/03_media_detail_playback.yaml +45 -0
- package/templates/ios/MediaTemplate/tests/04_player_controls.yaml +39 -5
- package/templates/ios/MediaTemplate/tests/05_search.yaml +33 -6
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/App/AppConfig.swift +9 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Core/EmptyStateView.swift +130 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Core/Strings.swift +2 -1
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Data/DataRepository.swift +28 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Data/DataSourceResolver.swift +24 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Data/LocalStorage/CoreDataStack.swift +148 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Data/LocalStorage/LocalStorageProvider.swift +206 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Data/LocalStorage/NoteEntity.swift +62 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Data/LocalStorage/TaskEntity.swift +56 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/EmptyStates/EmptyStateService.swift +16 -4
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/EmptyStates/EmptyStatesStrings.swift +1 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/Home/HomeView.swift +1 -1
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/Notes/NotesView.swift +3 -3
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Features/Tasks/TaskListView.swift +3 -3
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/MockData/MockDataProvider.swift +1 -1
- package/templates/ios/ReferenceTemplate/ReferenceTemplate.xcodeproj/project.pbxproj +48 -4
- package/templates/ios/ReferenceTemplate/ReferenceTemplateTests/DataRepositoryTests.swift +26 -0
- package/templates/ios/ReferenceTemplate/TESTING_MANIFEST.md +2 -0
- package/templates/ios/ReferenceTemplate/tests/01_launch_consent.yaml +62 -6
- package/templates/ios/ReferenceTemplate/tests/07_paywall.yaml +58 -6
- package/templates/ios/ReferenceTemplate/tests/08_push_notifications.yaml +37 -6
- package/templates/ios/ReferenceTemplate/tests/15_full_e2e.yaml +175 -12
- package/templates/ios/ShopTemplate/ShopTemplate/Core/Components/CommonComponents.swift +5 -48
- package/templates/ios/{ReferenceTemplate/ReferenceTemplate/Features/EmptyStates → ShopTemplate/ShopTemplate/Core}/EmptyStateView.swift +39 -40
- package/templates/ios/ShopTemplate/ShopTemplate/Core/Strings.swift +21 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Data/DataRepository.swift +48 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Data/DataSourceResolver.swift +1 -2
- package/templates/ios/ShopTemplate/ShopTemplate/Data/LocalStorage/BannerEntity.swift +41 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Data/LocalStorage/CategoryEntity.swift +39 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Data/LocalStorage/CoreDataStack.swift +365 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Data/LocalStorage/LocalStorageProvider.swift +304 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Data/LocalStorage/OrderEntity.swift +124 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Data/LocalStorage/ProductEntity.swift +104 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Data/LocalStorage/ReviewEntity.swift +65 -0
- package/templates/ios/ShopTemplate/ShopTemplate/Features/Cart/CartView.swift +9 -10
- package/templates/ios/ShopTemplate/ShopTemplate/Features/Orders/OrdersView.swift +6 -8
- package/templates/ios/ShopTemplate/ShopTemplate/Features/Products/ProductListView.swift +18 -12
- package/templates/ios/ShopTemplate/ShopTemplate/Features/Wishlist/WishlistView.swift +6 -10
- package/templates/ios/ShopTemplate/ShopTemplate.xcodeproj/project.pbxproj +71 -0
- package/templates/ios/ShopTemplate/ShopTemplateTests/DataRepositoryTests.swift +26 -0
- package/templates/ios/ShopTemplate/TESTING_MANIFEST.md +2 -0
- package/templates/ios/ShopTemplate/tests/01_launch_home.yaml +25 -6
- package/templates/ios/ShopTemplate/tests/02_tab_navigation.yaml +35 -9
- package/templates/ios/ShopTemplate/tests/03_product_detail.yaml +43 -0
- package/templates/ios/ShopTemplate/tests/04_cart_checkout.yaml +49 -0
- package/templates/ios/ShopTemplate/tests/05_search_filter.yaml +37 -4
- package/templates/ios/ShopTemplate/tests/06_wishlist.yaml +32 -3
- package/templates/ios/Skeleton/Skeleton/Core/EmptyStateView.swift +130 -0
- package/templates/ios/Skeleton/Skeleton/Core/Strings.swift +29 -0
- package/templates/ios/Skeleton/Skeleton/Data/DataSourceResolver.swift +1 -2
- package/templates/ios/Skeleton/Skeleton/Data/LocalStorage/CategoryEntity.swift +29 -0
- package/templates/ios/Skeleton/Skeleton/Data/LocalStorage/CoreDataStack.swift +128 -0
- package/templates/ios/Skeleton/Skeleton/Data/LocalStorage/ItemEntity.swift +62 -0
- package/templates/ios/Skeleton/Skeleton/Data/LocalStorage/LocalStorageProvider.swift +144 -0
- package/templates/ios/Skeleton/Skeleton/Features/Create/CreateView.swift +2 -2
- package/templates/ios/Skeleton/Skeleton/Features/Detail/DetailView.swift +2 -2
- package/templates/ios/Skeleton/Skeleton/Features/Explore/ExploreView.swift +2 -6
- package/templates/ios/Skeleton/Skeleton/Features/Favorites/FavoritesView.swift +6 -10
- package/templates/ios/Skeleton/Skeleton/Features/Favorites/FavoritesViewModel.swift +41 -0
- package/templates/ios/Skeleton/Skeleton/Features/Home/HomeView.swift +37 -25
- package/templates/ios/Skeleton/Skeleton.xcodeproj/project.pbxproj +56 -0
- package/templates/ios/Skeleton/SkeletonTests/DataRepositoryTests.swift +95 -0
- package/templates/ios/Skeleton/SkeletonTests/MockDataProviderTests.swift +1 -0
- package/templates/ios/Skeleton/TESTING_MANIFEST.md +4 -2
- package/templates/ios/Skeleton/tests/01_app_launch.yaml +1 -2
- package/templates/ios/Skeleton/tests/02_tab_navigation.yaml +6 -11
- package/templates/ios/Skeleton/tests/03_detail_screen.yaml +20 -0
- package/templates/ios/Skeleton/tests/04_favorites.yaml +17 -0
- package/templates/ios/Skeleton/tests/05_explore_search.yaml +12 -0
- package/templates/ios/Skeleton/tests/06_create_item.yaml +19 -0
- package/templates/ios/Skeleton/tests/07_profile.yaml +17 -0
- package/templates/ios/Skeleton/tests/08_full_e2e.yaml +36 -0
- package/templates/ios/SocialTemplate/SocialTemplate/App/AppConfig.swift +9 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Core/EmptyStateView.swift +145 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Core/Strings.swift +21 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Data/DataSourceResolver.swift +1 -2
- package/templates/ios/SocialTemplate/SocialTemplate/Data/LocalStorage/CommentEntity.swift +74 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Data/LocalStorage/ConversationEntity.swift +76 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Data/LocalStorage/CoreDataStack.swift +434 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Data/LocalStorage/LocalStorageProvider.swift +475 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Data/LocalStorage/MessageEntity.swift +62 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Data/LocalStorage/NotificationEntity.swift +92 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Data/LocalStorage/PostEntity.swift +143 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Data/LocalStorage/StoryEntity.swift +66 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Data/LocalStorage/UserEntity.swift +54 -0
- package/templates/ios/SocialTemplate/SocialTemplate/Features/Feed/FeedView.swift +27 -14
- package/templates/ios/SocialTemplate/SocialTemplate/Features/Messages/MessagesView.swift +19 -6
- package/templates/ios/SocialTemplate/SocialTemplate/Features/Notifications/NotificationsView.swift +15 -7
- package/templates/ios/SocialTemplate/SocialTemplate/Features/Profile/ProfileView.swift +15 -9
- package/templates/ios/SocialTemplate/SocialTemplate/Features/Search/SearchView.swift +11 -5
- package/templates/ios/SocialTemplate/SocialTemplate.xcodeproj/project.pbxproj +79 -0
- package/templates/ios/SocialTemplate/SocialTemplateTests/DataRepositoryTests.swift +26 -0
- package/templates/ios/SocialTemplate/TESTING_MANIFEST.md +6 -0
- package/templates/ios/SocialTemplate/tests/01_launch_feed.yaml +16 -7
- package/templates/ios/SocialTemplate/tests/07_messages.yaml +33 -5
- package/templates/ios/TaskTemplate/TESTING_MANIFEST.md +5 -0
- package/templates/ios/TaskTemplate/TaskTemplate/App/AppConfig.swift +9 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Core/EmptyStateView.swift +145 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Core/Models.swift +1 -1
- package/templates/ios/TaskTemplate/TaskTemplate/Core/Strings.swift +21 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Data/DataRepository.swift +38 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Data/DataSourceResolver.swift +19 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Data/LocalStorage/CoreDataStack.swift +214 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Data/LocalStorage/KanbanColumnEntity.swift +47 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Data/LocalStorage/LocalStorageProvider.swift +245 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Data/LocalStorage/ProjectEntity.swift +56 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Data/LocalStorage/TagEntity.swift +22 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Data/LocalStorage/TaskItemEntity.swift +170 -0
- package/templates/ios/TaskTemplate/TaskTemplate/Features/Calendar/CalendarView.swift +6 -2
- package/templates/ios/TaskTemplate/TaskTemplate/Features/Inbox/InboxView.swift +11 -15
- package/templates/ios/TaskTemplate/TaskTemplate/Features/Kanban/KanbanBoardView.swift +9 -3
- package/templates/ios/TaskTemplate/TaskTemplate/Features/Projects/ProjectDetailView.swift +24 -11
- package/templates/ios/TaskTemplate/TaskTemplate/Features/Projects/ProjectListView.swift +12 -15
- package/templates/ios/TaskTemplate/TaskTemplate/Features/Search/SearchView.swift +13 -22
- package/templates/ios/TaskTemplate/TaskTemplate/MockData/MockDataProvider.swift +1 -1
- package/templates/ios/TaskTemplate/TaskTemplate.xcodeproj/project.pbxproj +60 -0
- package/templates/ios/TaskTemplate/TaskTemplateTests/DataRepositoryTests.swift +26 -0
- package/templates/ios/TaskTemplate/tests/01_launch_inbox.yaml +37 -7
- package/templates/ios/TaskTemplate/tests/02_tab_navigation.yaml +63 -21
- package/templates/ios/TaskTemplate/tests/03_task_detail.yaml +72 -0
- package/templates/ios/TaskTemplate/tests/04_project_detail.yaml +71 -0
- package/templates/ios/TaskTemplate/tests/05_task_create_flow.yaml +72 -0
- package/templates/ios/TaskTemplate/tests/06_search_filter.yaml +82 -0
- package/templates/ios/TaskTemplate/tests/07_settings.yaml +56 -0
- package/templates/ios/TaskTemplate/tests/08_full_e2e.yaml +113 -35
- package/templates/ios/TrackTemplate/TESTING_MANIFEST.md +4 -0
- package/templates/ios/TrackTemplate/TrackTemplate/App/AppConfig.swift +9 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Core/EmptyStateView.swift +145 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Data/DataRepository.swift +29 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Data/DataSourceResolver.swift +19 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Data/LocalStorage/AchievementEntity.swift +44 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Data/LocalStorage/CoreDataStack.swift +269 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Data/LocalStorage/HabitEntity.swift +75 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Data/LocalStorage/HabitEntryEntity.swift +44 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Data/LocalStorage/LocalStorageProvider.swift +180 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Data/LocalStorage/StreakEntity.swift +35 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Features/Dashboard/TodayView.swift +6 -33
- package/templates/ios/TrackTemplate/TrackTemplate/Features/Habits/HabitsListView.swift +5 -43
- package/templates/ios/TrackTemplate/TrackTemplate/MockData/MockDataProvider.swift +1 -1
- package/templates/ios/TrackTemplate/TrackTemplate/Services/HabitManager.swift +1 -1
- package/templates/ios/TrackTemplate/TrackTemplate.xcodeproj/project.pbxproj +63 -0
- package/templates/ios/TrackTemplate/TrackTemplateTests/DataRepositoryTests.swift +26 -0
- package/templates/ios/TrackTemplate/tests/01_launch_today.yaml +44 -5
- package/templates/ios/TrackTemplate/tests/02_tab_navigation.yaml +79 -16
- package/templates/ios/TrackTemplate/tests/04_add_habit.yaml +98 -3
- package/templates/shared/MODULES_CATALOG.md +42 -1
- package/templates/shared/android/CachedRepository/CachedRepository.kt +310 -0
- package/templates/shared/android/CachedRepository/LocalCache.kt +178 -0
- package/templates/shared/android/CachedRepository/OfflineQueue.kt +171 -0
- package/templates/shared/android/CachedRepository/strings.xml +15 -0
- package/templates/shared/android/FirebaseBackend/FirebaseAuthManager.kt +256 -0
- package/templates/shared/android/FirebaseBackend/FirebaseConfigManager.kt +122 -0
- package/templates/shared/android/FirebaseBackend/FirebaseForgotPasswordScreen.kt +187 -0
- package/templates/shared/android/FirebaseBackend/FirebaseLoginScreen.kt +216 -0
- package/templates/shared/android/FirebaseBackend/FirebaseProfileScreen.kt +292 -0
- package/templates/shared/android/FirebaseBackend/FirebaseSignUpScreen.kt +223 -0
- package/templates/shared/android/FirebaseBackend/FirebaseStorageManager.kt +143 -0
- package/templates/shared/android/FirebaseBackend/FirestoreManager.kt +209 -0
- package/templates/shared/android/FirebaseBackend/INTEGRATION.md +378 -0
- package/templates/shared/android/FirebaseBackend/SETUP.md +293 -0
- package/templates/shared/android/FirebaseBackend/strings.xml +62 -0
- package/templates/shared/android/FirebaseProvider/FirebaseAuthManager.kt +177 -0
- package/templates/shared/android/FirebaseProvider/FirebaseConfig.kt +54 -0
- package/templates/shared/android/FirebaseProvider/FirebaseDataProvider.kt +152 -0
- package/templates/shared/android/FirebaseProvider/strings.xml +25 -0
- package/templates/shared/android/SecretsConfig/INTEGRATION.md +111 -0
- package/templates/shared/android/SecretsConfig/SETUP.md +66 -0
- package/templates/shared/android/SecretsConfig/SecretsConfig.kt +113 -0
- package/templates/shared/android/SecretsConfig/build.gradle.snippet.kts +37 -0
- package/templates/shared/android/SecretsConfig/secrets.properties.template +30 -0
- package/templates/shared/android/SupabaseBackend/INTEGRATION.md +514 -0
- package/templates/shared/android/SupabaseBackend/SETUP.md +320 -0
- package/templates/shared/android/SupabaseBackend/SupabaseAuthManager.kt +198 -0
- package/templates/shared/android/SupabaseBackend/SupabaseConfigManager.kt +41 -0
- package/templates/shared/android/SupabaseBackend/SupabaseDatabaseManager.kt +148 -0
- package/templates/shared/android/SupabaseBackend/SupabaseForgotPasswordScreen.kt +154 -0
- package/templates/shared/android/SupabaseBackend/SupabaseLoginScreen.kt +262 -0
- package/templates/shared/android/SupabaseBackend/SupabaseMagicLinkSentScreen.kt +173 -0
- package/templates/shared/android/SupabaseBackend/SupabaseProfileScreen.kt +298 -0
- package/templates/shared/android/SupabaseBackend/SupabaseRealtimeManager.kt +98 -0
- package/templates/shared/android/SupabaseBackend/SupabaseSignUpScreen.kt +177 -0
- package/templates/shared/android/SupabaseBackend/SupabaseStorageManager.kt +62 -0
- package/templates/shared/android/SupabaseBackend/strings.xml +63 -0
- package/templates/shared/android/SupabaseProvider/SupabaseAuthManager.kt +254 -0
- package/templates/shared/android/SupabaseProvider/SupabaseConfig.kt +89 -0
- package/templates/shared/android/SupabaseProvider/SupabaseDataProvider.kt +232 -0
- package/templates/shared/android/SupabaseProvider/strings.xml +30 -0
- package/templates/shared/android/WixMemberBackend/WixApiClient.kt +207 -0
- package/templates/shared/android/WixMemberBackend/WixAuthManager.kt +476 -0
- package/templates/shared/android/WixMemberBackend/WixBlogManager.kt +190 -0
- package/templates/shared/android/WixMemberBackend/WixBlogScreen.kt +400 -0
- package/templates/shared/android/WixMemberBackend/WixBookingsManager.kt +239 -0
- package/templates/shared/android/WixMemberBackend/WixBookingsScreen.kt +440 -0
- package/templates/shared/android/WixMemberBackend/WixCartScreen.kt +304 -0
- package/templates/shared/android/WixMemberBackend/WixEventsManager.kt +277 -0
- package/templates/shared/android/WixMemberBackend/WixEventsScreen.kt +500 -0
- package/templates/shared/android/WixMemberBackend/WixLoginScreen.kt +208 -0
- package/templates/shared/android/WixMemberBackend/WixModels.kt +224 -0
- package/templates/shared/android/WixMemberBackend/WixProfileScreen.kt +542 -0
- package/templates/shared/android/WixMemberBackend/WixStoreScreen.kt +410 -0
- package/templates/shared/android/WixMemberBackend/WixStoresManager.kt +243 -0
- package/templates/shared/android/WixMemberBackend/strings.xml +111 -0
- package/templates/shared/android/WixOwnerBackend/INTEGRATION.md +246 -0
- package/templates/shared/android/WixOwnerBackend/SETUP.md +141 -0
- package/templates/shared/android/WixOwnerBackend/WixAdminAuthManager.kt +71 -0
- package/templates/shared/android/WixOwnerBackend/WixApiClient.kt +202 -0
- package/templates/shared/android/WixOwnerBackend/WixBlogAdminManager.kt +330 -0
- package/templates/shared/android/WixOwnerBackend/WixBlogEditorScreen.kt +535 -0
- package/templates/shared/android/WixOwnerBackend/WixBookingAdminManager.kt +337 -0
- package/templates/shared/android/WixOwnerBackend/WixBookingManagementScreen.kt +252 -0
- package/templates/shared/android/WixOwnerBackend/WixConnectSiteScreen.kt +177 -0
- package/templates/shared/android/WixOwnerBackend/WixDashboardScreen.kt +183 -0
- package/templates/shared/android/WixOwnerBackend/WixEventAdminManager.kt +274 -0
- package/templates/shared/android/WixOwnerBackend/WixEventManagementScreen.kt +466 -0
- package/templates/shared/android/WixOwnerBackend/WixModels.kt +269 -0
- package/templates/shared/android/WixOwnerBackend/WixOrdersScreen.kt +282 -0
- package/templates/shared/android/WixOwnerBackend/WixProductManagementScreen.kt +277 -0
- package/templates/shared/android/WixOwnerBackend/WixSiteAdminManager.kt +152 -0
- package/templates/shared/android/WixOwnerBackend/WixStoreAdminManager.kt +321 -0
- package/templates/shared/android/WixOwnerBackend/strings.xml +88 -0
- package/templates/shared/android/WixSiteSelector/INTEGRATION.md +117 -0
- package/templates/shared/android/WixSiteSelector/SETUP.md +38 -0
- package/templates/shared/android/WixSiteSelector/WixSiteManager.kt +211 -0
- package/templates/shared/android/WixSiteSelector/WixSiteModels.kt +28 -0
- package/templates/shared/android/WixSiteSelector/WixSiteSelectorScreen.kt +343 -0
- package/templates/shared/android/WixSiteSelector/strings.xml +36 -0
- package/templates/shared/ios/CachedRepository/CachedRepository.swift +212 -0
- package/templates/shared/ios/CachedRepository/INTEGRATION.md +168 -0
- package/templates/shared/ios/CachedRepository/LocalCache.swift +191 -0
- package/templates/shared/ios/CachedRepository/OfflineQueue.swift +109 -0
- package/templates/shared/ios/CachedRepository/Strings.swift +31 -0
- package/templates/shared/ios/FirebaseBackend/FirebaseAuthService.swift +329 -0
- package/templates/shared/ios/FirebaseBackend/FirebaseConfigService.swift +105 -0
- package/templates/shared/ios/FirebaseBackend/FirebaseStorageService.swift +198 -0
- package/templates/shared/ios/FirebaseBackend/FirestoreService.swift +206 -0
- package/templates/shared/ios/FirebaseBackend/INTEGRATION.md +287 -0
- package/templates/shared/ios/FirebaseBackend/SETUP.md +224 -0
- package/templates/shared/ios/FirebaseBackend/Screens/FirebaseForgotPasswordScreen.swift +108 -0
- package/templates/shared/ios/FirebaseBackend/Screens/FirebaseLoginScreen.swift +197 -0
- package/templates/shared/ios/FirebaseBackend/Screens/FirebaseProfileScreen.swift +195 -0
- package/templates/shared/ios/FirebaseBackend/Screens/FirebaseSignUpScreen.swift +151 -0
- package/templates/shared/ios/FirebaseBackend/Strings.swift +69 -0
- package/templates/shared/ios/FirebaseProvider/FirebaseAuthService.swift +83 -0
- package/templates/shared/ios/FirebaseProvider/FirebaseConfig.swift +36 -0
- package/templates/shared/ios/FirebaseProvider/FirebaseDataProvider.swift +111 -0
- package/templates/shared/ios/FirebaseProvider/INTEGRATION.md +203 -0
- package/templates/shared/ios/FirebaseProvider/Strings.swift +40 -0
- package/templates/shared/ios/SecretsConfig/INTEGRATION.md +96 -0
- package/templates/shared/ios/SecretsConfig/SETUP.md +67 -0
- package/templates/shared/ios/SecretsConfig/Secrets.xcconfig.template +30 -0
- package/templates/shared/ios/SecretsConfig/SecretsConfig.swift +87 -0
- package/templates/shared/ios/SupabaseBackend/INTEGRATION.md +335 -0
- package/templates/shared/ios/SupabaseBackend/SETUP.md +232 -0
- package/templates/shared/ios/SupabaseBackend/Screens/SupabaseForgotPasswordScreen.swift +123 -0
- package/templates/shared/ios/SupabaseBackend/Screens/SupabaseLoginScreen.swift +207 -0
- package/templates/shared/ios/SupabaseBackend/Screens/SupabaseMagicLinkSentScreen.swift +136 -0
- package/templates/shared/ios/SupabaseBackend/Screens/SupabaseProfileScreen.swift +102 -0
- package/templates/shared/ios/SupabaseBackend/Screens/SupabaseSignUpScreen.swift +159 -0
- package/templates/shared/ios/SupabaseBackend/Strings.swift +73 -0
- package/templates/shared/ios/SupabaseBackend/SupabaseAuthService.swift +191 -0
- package/templates/shared/ios/SupabaseBackend/SupabaseConfigService.swift +31 -0
- package/templates/shared/ios/SupabaseBackend/SupabaseDatabaseService.swift +133 -0
- package/templates/shared/ios/SupabaseBackend/SupabaseRealtimeService.swift +117 -0
- package/templates/shared/ios/SupabaseBackend/SupabaseStorageService.swift +48 -0
- package/templates/shared/ios/SupabaseProvider/INTEGRATION.md +251 -0
- package/templates/shared/ios/SupabaseProvider/Strings.swift +44 -0
- package/templates/shared/ios/SupabaseProvider/SupabaseAuthService.swift +142 -0
- package/templates/shared/ios/SupabaseProvider/SupabaseConfig.swift +48 -0
- package/templates/shared/ios/SupabaseProvider/SupabaseDataProvider.swift +180 -0
- package/templates/shared/ios/WixMemberBackend/INTEGRATION.md +188 -0
- package/templates/shared/ios/WixMemberBackend/SETUP.md +79 -0
- package/templates/shared/ios/WixMemberBackend/Screens/WixBlogScreen.swift +388 -0
- package/templates/shared/ios/WixMemberBackend/Screens/WixBookingsScreen.swift +415 -0
- package/templates/shared/ios/WixMemberBackend/Screens/WixCartScreen.swift +231 -0
- package/templates/shared/ios/WixMemberBackend/Screens/WixEventsScreen.swift +513 -0
- package/templates/shared/ios/WixMemberBackend/Screens/WixLoginScreen.swift +151 -0
- package/templates/shared/ios/WixMemberBackend/Screens/WixProfileScreen.swift +256 -0
- package/templates/shared/ios/WixMemberBackend/Screens/WixStoreScreen.swift +354 -0
- package/templates/shared/ios/WixMemberBackend/Strings.swift +135 -0
- package/templates/shared/ios/WixMemberBackend/WixAPIClient.swift +192 -0
- package/templates/shared/ios/WixMemberBackend/WixAuthService.swift +483 -0
- package/templates/shared/ios/WixMemberBackend/WixBlogService.swift +96 -0
- package/templates/shared/ios/WixMemberBackend/WixBookingsService.swift +98 -0
- package/templates/shared/ios/WixMemberBackend/WixEventsService.swift +109 -0
- package/templates/shared/ios/WixMemberBackend/WixModels.swift +188 -0
- package/templates/shared/ios/WixMemberBackend/WixStoresService.swift +157 -0
- package/templates/shared/ios/WixOwnerBackend/INTEGRATION.md +222 -0
- package/templates/shared/ios/WixOwnerBackend/SETUP.md +146 -0
- package/templates/shared/ios/WixOwnerBackend/Screens/WixBlogEditorScreen.swift +384 -0
- package/templates/shared/ios/WixOwnerBackend/Screens/WixBookingManagementScreen.swift +235 -0
- package/templates/shared/ios/WixOwnerBackend/Screens/WixConnectSiteScreen.swift +186 -0
- package/templates/shared/ios/WixOwnerBackend/Screens/WixDashboardScreen.swift +220 -0
- package/templates/shared/ios/WixOwnerBackend/Screens/WixEventManagementScreen.swift +438 -0
- package/templates/shared/ios/WixOwnerBackend/Screens/WixOrdersScreen.swift +285 -0
- package/templates/shared/ios/WixOwnerBackend/Screens/WixProductManagementScreen.swift +285 -0
- package/templates/shared/ios/WixOwnerBackend/Strings.swift +113 -0
- package/templates/shared/ios/WixOwnerBackend/WixAdminAuthService.swift +63 -0
- package/templates/shared/ios/WixOwnerBackend/WixBlogManagerService.swift +122 -0
- package/templates/shared/ios/WixOwnerBackend/WixBookingManagerService.swift +142 -0
- package/templates/shared/ios/WixOwnerBackend/WixEventManagerService.swift +142 -0
- package/templates/shared/ios/WixOwnerBackend/WixModels.swift +224 -0
- package/templates/shared/ios/WixOwnerBackend/WixSiteManagerService.swift +130 -0
- package/templates/shared/ios/WixOwnerBackend/WixStoreManagerService.swift +161 -0
- package/templates/shared/ios/WixSiteSelector/INTEGRATION.md +116 -0
- package/templates/shared/ios/WixSiteSelector/SETUP.md +38 -0
- package/templates/shared/ios/WixSiteSelector/Strings.swift +40 -0
- package/templates/shared/ios/WixSiteSelector/WixSiteManager.swift +183 -0
- package/templates/shared/ios/WixSiteSelector/WixSiteModels.swift +45 -0
- package/templates/shared/ios/WixSiteSelector/WixSiteSelectorScreen.swift +275 -0
- package/templates/shared/keys.json.schema.json +61 -0
- package/templates/shared/tests/android/FirebaseBackend/FirebaseTest.kt +75 -0
- package/templates/shared/tests/android/SupabaseBackend/SupabaseTest.kt +146 -0
- package/templates/shared/tests/android/WixMemberBackend/WixMemberTest.kt +159 -0
- package/templates/shared/tests/android/WixOwnerBackend/WixOwnerTest.kt +99 -0
- package/templates/shared/tests/ios/FirebaseBackend/FirebaseTests.swift +145 -0
- package/templates/shared/tests/ios/SupabaseBackend/SupabaseTests.swift +126 -0
- package/templates/shared/tests/ios/WixMemberBackend/WixMemberTests.swift +143 -0
- package/templates/shared/tests/ios/WixOwnerBackend/WixOwnerTests.swift +98 -0
- package/templates/shared/tests/maestro/FirebaseBackend/firebase_auth_flow.yaml +153 -0
- package/templates/shared/tests/maestro/SupabaseBackend/supabase_auth_flow.yaml +163 -0
- package/templates/shared/tests/maestro/WixMemberBackend/wix_member_navigation_flow.yaml +55 -0
- package/templates/shared/tests/maestro/WixMemberBackend/wix_member_store_flow.yaml +42 -0
- package/templates/shared/tests/maestro/WixOwnerBackend/wix_owner_dashboard_flow.yaml +48 -0
- package/templates/android/BookTemplate/tests/04_booking_flow.yaml +0 -14
- package/templates/android/BookTemplate/tests/05_search_filter.yaml +0 -14
- package/templates/android/BookTemplate/tests/06_favorites.yaml +0 -14
- package/templates/android/BookTemplate/tests/07_profile.yaml +0 -14
- package/templates/ios/BookTemplate/tests/04_booking_flow.yaml +0 -9
- package/templates/ios/BookTemplate/tests/05_search_filter.yaml +0 -9
- package/templates/ios/BookTemplate/tests/06_favorites.yaml +0 -9
- package/templates/ios/BookTemplate/tests/07_profile.yaml +0 -9
package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/data/local/TaskEntity.kt
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
package com.appship.task.data.local
|
|
2
|
+
|
|
3
|
+
import androidx.room.Entity
|
|
4
|
+
import androidx.room.PrimaryKey
|
|
5
|
+
import com.appship.task.data.*
|
|
6
|
+
import com.google.gson.Gson
|
|
7
|
+
import com.google.gson.reflect.TypeToken
|
|
8
|
+
import java.time.LocalDate
|
|
9
|
+
import java.time.LocalDateTime
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Room entity for Task persistence.
|
|
13
|
+
* Stores Subtasks and RecurrenceRule as JSON strings.
|
|
14
|
+
*/
|
|
15
|
+
@Entity(tableName = "tasks")
|
|
16
|
+
data class TaskEntity(
|
|
17
|
+
@PrimaryKey val id: String,
|
|
18
|
+
val title: String = "",
|
|
19
|
+
val description: String? = null,
|
|
20
|
+
val priority: String = "P3",
|
|
21
|
+
val dueDate: Long? = null, // LocalDate as epoch day
|
|
22
|
+
val tagsJson: String = "[]",
|
|
23
|
+
val projectId: String? = null,
|
|
24
|
+
val isCompleted: Boolean = false,
|
|
25
|
+
val completedDate: Long? = null, // LocalDateTime as epoch millis
|
|
26
|
+
val subtasksJson: String = "[]",
|
|
27
|
+
val createdDate: Long = System.currentTimeMillis(), // LocalDateTime as epoch millis
|
|
28
|
+
val reminderDate: Long? = null, // LocalDateTime as epoch millis
|
|
29
|
+
val recurrenceJson: String? = null
|
|
30
|
+
) {
|
|
31
|
+
fun toTask(): Task {
|
|
32
|
+
val gson = Gson()
|
|
33
|
+
val tags: List<String> = gson.fromJson(tagsJson, object : TypeToken<List<String>>() {}.type) ?: emptyList()
|
|
34
|
+
|
|
35
|
+
val subtasks: List<Subtask> = gson.fromJson(subtasksJson, object : TypeToken<List<Subtask>>() {}.type) ?: emptyList()
|
|
36
|
+
|
|
37
|
+
val recurrence: RecurrenceRule? = recurrenceJson?.let {
|
|
38
|
+
val recurrenceType = object : TypeToken<RecurrenceRule>() {}.type
|
|
39
|
+
gson.fromJson(it, recurrenceType)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return Task(
|
|
43
|
+
id = id,
|
|
44
|
+
title = title,
|
|
45
|
+
description = description,
|
|
46
|
+
priority = TaskPriority.valueOf(priority),
|
|
47
|
+
dueDate = dueDate?.let { LocalDate.ofEpochDay(it) },
|
|
48
|
+
tags = tags,
|
|
49
|
+
projectId = projectId,
|
|
50
|
+
isCompleted = isCompleted,
|
|
51
|
+
completedDate = completedDate?.let { LocalDateTime.ofEpochSecond(it / 1000, 0, java.time.ZoneOffset.UTC) },
|
|
52
|
+
subtasks = subtasks,
|
|
53
|
+
createdDate = LocalDateTime.ofEpochSecond(createdDate / 1000, 0, java.time.ZoneOffset.UTC),
|
|
54
|
+
reminderDate = reminderDate?.let { LocalDateTime.ofEpochSecond(it / 1000, 0, java.time.ZoneOffset.UTC) },
|
|
55
|
+
recurrence = recurrence
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
companion object {
|
|
60
|
+
fun fromTask(task: Task): TaskEntity {
|
|
61
|
+
val gson = Gson()
|
|
62
|
+
return TaskEntity(
|
|
63
|
+
id = task.id,
|
|
64
|
+
title = task.title,
|
|
65
|
+
description = task.description,
|
|
66
|
+
priority = task.priority.name,
|
|
67
|
+
dueDate = task.dueDate?.toEpochDay(),
|
|
68
|
+
tagsJson = gson.toJson(task.tags),
|
|
69
|
+
projectId = task.projectId,
|
|
70
|
+
isCompleted = task.isCompleted,
|
|
71
|
+
completedDate = task.completedDate?.toEpochSecond(java.time.ZoneOffset.UTC)?.times(1000),
|
|
72
|
+
subtasksJson = gson.toJson(task.subtasks),
|
|
73
|
+
createdDate = task.createdDate.toEpochSecond(java.time.ZoneOffset.UTC) * 1000,
|
|
74
|
+
reminderDate = task.reminderDate?.toEpochSecond(java.time.ZoneOffset.UTC)?.times(1000),
|
|
75
|
+
recurrenceJson = task.recurrence?.let { gson.toJson(it) }
|
|
76
|
+
)
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -12,9 +12,11 @@ import androidx.compose.ui.Modifier
|
|
|
12
12
|
import androidx.compose.ui.platform.testTag
|
|
13
13
|
import androidx.compose.ui.unit.dp
|
|
14
14
|
import com.appship.task.data.Task
|
|
15
|
-
import com.appship.task.
|
|
15
|
+
import com.appship.task.data.DataSourceResolver
|
|
16
16
|
import com.appship.task.core.components.PriorityBadge
|
|
17
17
|
import com.appship.task.core.components.TagChip
|
|
18
|
+
import com.appship.task.core.components.EmptyStateView
|
|
19
|
+
import com.appship.task.core.components.EmptyStatePresets
|
|
18
20
|
|
|
19
21
|
@OptIn(ExperimentalMaterial3Api::class)
|
|
20
22
|
@Composable
|
|
@@ -22,7 +24,8 @@ fun InboxScreen(
|
|
|
22
24
|
onTaskClick: (String) -> Unit = {},
|
|
23
25
|
onAddTask: () -> Unit = {}
|
|
24
26
|
) {
|
|
25
|
-
val
|
|
27
|
+
val repository = remember { DataSourceResolver.repository }
|
|
28
|
+
val tasks by repository.tasks.collectAsState()
|
|
26
29
|
val inboxTasks = tasks.filter { it.projectId == null }
|
|
27
30
|
var searchText by remember { mutableStateOf("") }
|
|
28
31
|
|
|
@@ -51,7 +54,11 @@ fun InboxScreen(
|
|
|
51
54
|
}
|
|
52
55
|
) { padding ->
|
|
53
56
|
if (filteredTasks.isEmpty()) {
|
|
54
|
-
|
|
57
|
+
EmptyStateView(
|
|
58
|
+
config = EmptyStatePresets.noItems(
|
|
59
|
+
message = if (searchText.isBlank()) "Add tasks here to organize them later" else null,
|
|
60
|
+
onAdd = if (searchText.isBlank()) onAddTask else null
|
|
61
|
+
),
|
|
55
62
|
modifier = Modifier
|
|
56
63
|
.fillMaxSize()
|
|
57
64
|
.padding(padding)
|
|
@@ -114,8 +121,10 @@ fun TaskCard(
|
|
|
114
121
|
Row(
|
|
115
122
|
horizontalArrangement = Arrangement.spacedBy(4.dp)
|
|
116
123
|
) {
|
|
117
|
-
val
|
|
118
|
-
tags
|
|
124
|
+
val repository = remember { DataSourceResolver.repository }
|
|
125
|
+
val tags by repository.tags.collectAsState()
|
|
126
|
+
val taskTags = tags.filter { task.tags.contains(it.id) }
|
|
127
|
+
taskTags.forEach { tag ->
|
|
119
128
|
TagChip(tag = tag)
|
|
120
129
|
}
|
|
121
130
|
}
|
|
@@ -124,22 +133,4 @@ fun TaskCard(
|
|
|
124
133
|
}
|
|
125
134
|
}
|
|
126
135
|
|
|
127
|
-
|
|
128
|
-
fun EmptyInboxState(modifier: Modifier = Modifier) {
|
|
129
|
-
Column(
|
|
130
|
-
modifier = modifier,
|
|
131
|
-
horizontalAlignment = Alignment.CenterHorizontally,
|
|
132
|
-
verticalArrangement = Arrangement.Center
|
|
133
|
-
) {
|
|
134
|
-
Text(
|
|
135
|
-
text = "No tasks in inbox",
|
|
136
|
-
style = MaterialTheme.typography.titleLarge
|
|
137
|
-
)
|
|
138
|
-
Spacer(modifier = Modifier.height(8.dp))
|
|
139
|
-
Text(
|
|
140
|
-
text = "Add tasks here to organize them later",
|
|
141
|
-
style = MaterialTheme.typography.bodyMedium,
|
|
142
|
-
color = MaterialTheme.colorScheme.onSurfaceVariant
|
|
143
|
-
)
|
|
144
|
-
}
|
|
145
|
-
}
|
|
136
|
+
// EmptyInboxState has been replaced with EmptyStateView
|
|
@@ -8,6 +8,7 @@ import androidx.compose.runtime.*
|
|
|
8
8
|
import androidx.compose.ui.Modifier
|
|
9
9
|
import androidx.compose.ui.platform.testTag
|
|
10
10
|
import androidx.compose.ui.unit.dp
|
|
11
|
+
import com.appship.task.data.DataSourceResolver
|
|
11
12
|
import com.appship.task.mock.MockDataProvider
|
|
12
13
|
|
|
13
14
|
@OptIn(ExperimentalMaterial3Api::class)
|
|
@@ -43,7 +44,9 @@ fun KanbanColumn(
|
|
|
43
44
|
column: com.appship.task.data.KanbanColumn,
|
|
44
45
|
modifier: Modifier = Modifier
|
|
45
46
|
) {
|
|
46
|
-
val
|
|
47
|
+
val repository = remember { DataSourceResolver.repository }
|
|
48
|
+
val tasks by repository.tasks.collectAsState()
|
|
49
|
+
val columnTasks = tasks.filter { column.taskIds.contains(it.id) }
|
|
47
50
|
|
|
48
51
|
Column(modifier = modifier) {
|
|
49
52
|
Card(modifier = Modifier.fillMaxWidth()) {
|
|
@@ -56,7 +59,7 @@ fun KanbanColumn(
|
|
|
56
59
|
style = MaterialTheme.typography.titleMedium
|
|
57
60
|
)
|
|
58
61
|
Text(
|
|
59
|
-
text = "${
|
|
62
|
+
text = "${columnTasks.size} tasks",
|
|
60
63
|
style = MaterialTheme.typography.bodySmall
|
|
61
64
|
)
|
|
62
65
|
}
|
|
@@ -67,7 +70,7 @@ fun KanbanColumn(
|
|
|
67
70
|
LazyColumn(
|
|
68
71
|
verticalArrangement = Arrangement.spacedBy(8.dp)
|
|
69
72
|
) {
|
|
70
|
-
itemsIndexed(
|
|
73
|
+
itemsIndexed(columnTasks) { index, task ->
|
|
71
74
|
KanbanTaskCard(
|
|
72
75
|
task = task,
|
|
73
76
|
modifier = Modifier.testTag("kanban_task_${index}_card")
|
|
@@ -12,7 +12,9 @@ import androidx.compose.ui.Modifier
|
|
|
12
12
|
import androidx.compose.ui.platform.testTag
|
|
13
13
|
import androidx.compose.ui.unit.dp
|
|
14
14
|
import com.appship.task.data.Task
|
|
15
|
-
import com.appship.task.
|
|
15
|
+
import com.appship.task.data.DataSourceResolver
|
|
16
|
+
import com.appship.task.core.components.EmptyStateView
|
|
17
|
+
import com.appship.task.core.components.EmptyStatePresets
|
|
16
18
|
|
|
17
19
|
@OptIn(ExperimentalMaterial3Api::class)
|
|
18
20
|
@Composable
|
|
@@ -21,10 +23,14 @@ fun ProjectDetailScreen(
|
|
|
21
23
|
onBack: () -> Unit = {},
|
|
22
24
|
onTaskClick: (String) -> Unit = {}
|
|
23
25
|
) {
|
|
24
|
-
val
|
|
25
|
-
val
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
val repository = remember { DataSourceResolver.repository }
|
|
27
|
+
val projects by repository.projects.collectAsState()
|
|
28
|
+
val tasks by repository.tasks.collectAsState()
|
|
29
|
+
val project = remember(projects) { projects.firstOrNull { it.id == projectId } }
|
|
30
|
+
val projectTasks = remember(project, tasks) {
|
|
31
|
+
tasks.filter { project?.tasks?.contains(it.id) == true }
|
|
32
|
+
.sortedByDescending { !it.isCompleted }
|
|
33
|
+
}
|
|
28
34
|
|
|
29
35
|
Scaffold(
|
|
30
36
|
topBar = {
|
|
@@ -38,19 +44,31 @@ fun ProjectDetailScreen(
|
|
|
38
44
|
)
|
|
39
45
|
}
|
|
40
46
|
) { padding ->
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
.
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
47
|
+
if (projectTasks.isEmpty()) {
|
|
48
|
+
EmptyStateView(
|
|
49
|
+
config = EmptyStatePresets.noItems(
|
|
50
|
+
message = "No tasks in this project yet",
|
|
51
|
+
onAdd = { /* Navigate to add task */ }
|
|
52
|
+
),
|
|
53
|
+
modifier = Modifier
|
|
54
|
+
.fillMaxSize()
|
|
55
|
+
.padding(padding)
|
|
56
|
+
)
|
|
57
|
+
} else {
|
|
58
|
+
LazyColumn(
|
|
59
|
+
modifier = Modifier
|
|
60
|
+
.fillMaxSize()
|
|
61
|
+
.padding(padding),
|
|
62
|
+
contentPadding = PaddingValues(16.dp),
|
|
63
|
+
verticalArrangement = Arrangement.spacedBy(8.dp)
|
|
64
|
+
) {
|
|
65
|
+
itemsIndexed(projectTasks) { index, task ->
|
|
66
|
+
TaskCard(
|
|
67
|
+
task = task,
|
|
68
|
+
onClick = { onTaskClick(task.id) },
|
|
69
|
+
modifier = Modifier.testTag("project_detail_task_${index}_card")
|
|
70
|
+
)
|
|
71
|
+
}
|
|
54
72
|
}
|
|
55
73
|
}
|
|
56
74
|
}
|
|
@@ -12,14 +12,17 @@ import androidx.compose.ui.Modifier
|
|
|
12
12
|
import androidx.compose.ui.platform.testTag
|
|
13
13
|
import androidx.compose.ui.unit.dp
|
|
14
14
|
import com.appship.task.data.Project
|
|
15
|
-
import com.appship.task.
|
|
15
|
+
import com.appship.task.data.DataSourceResolver
|
|
16
|
+
import com.appship.task.core.components.EmptyStateView
|
|
17
|
+
import com.appship.task.core.components.EmptyStatePresets
|
|
16
18
|
|
|
17
19
|
@OptIn(ExperimentalMaterial3Api::class)
|
|
18
20
|
@Composable
|
|
19
21
|
fun ProjectListScreen(
|
|
20
22
|
onProjectClick: (String) -> Unit = {}
|
|
21
23
|
) {
|
|
22
|
-
val
|
|
24
|
+
val repository = remember { DataSourceResolver.repository }
|
|
25
|
+
val projects by repository.projects.collectAsState()
|
|
23
26
|
|
|
24
27
|
Scaffold(
|
|
25
28
|
topBar = {
|
|
@@ -27,7 +30,11 @@ fun ProjectListScreen(
|
|
|
27
30
|
}
|
|
28
31
|
) { padding ->
|
|
29
32
|
if (projects.isEmpty()) {
|
|
30
|
-
|
|
33
|
+
EmptyStateView(
|
|
34
|
+
config = EmptyStatePresets.noItems(
|
|
35
|
+
message = "Create a project to organize your tasks",
|
|
36
|
+
onAdd = { /* Navigate to add project */ }
|
|
37
|
+
),
|
|
31
38
|
modifier = Modifier
|
|
32
39
|
.fillMaxSize()
|
|
33
40
|
.padding(padding)
|
|
@@ -58,9 +65,11 @@ fun ProjectCard(
|
|
|
58
65
|
onClick: () -> Unit,
|
|
59
66
|
modifier: Modifier = Modifier
|
|
60
67
|
) {
|
|
61
|
-
val
|
|
62
|
-
val
|
|
63
|
-
val
|
|
68
|
+
val repository = remember { DataSourceResolver.repository }
|
|
69
|
+
val tasks by repository.tasks.collectAsState()
|
|
70
|
+
val projectTasks = tasks.filter { project.tasks.contains(it.id) }
|
|
71
|
+
val completedCount = projectTasks.count { it.isCompleted }
|
|
72
|
+
val progress = if (projectTasks.isEmpty()) 0.0 else completedCount.toDouble() / projectTasks.size
|
|
64
73
|
|
|
65
74
|
Card(
|
|
66
75
|
onClick = onClick,
|
|
@@ -90,7 +99,7 @@ fun ProjectCard(
|
|
|
90
99
|
)
|
|
91
100
|
}
|
|
92
101
|
Text(
|
|
93
|
-
text = "$completedCount of ${
|
|
102
|
+
text = "$completedCount of ${projectTasks.size} tasks",
|
|
94
103
|
style = MaterialTheme.typography.bodySmall,
|
|
95
104
|
color = MaterialTheme.colorScheme.onSurfaceVariant
|
|
96
105
|
)
|
|
@@ -99,22 +108,4 @@ fun ProjectCard(
|
|
|
99
108
|
}
|
|
100
109
|
}
|
|
101
110
|
|
|
102
|
-
|
|
103
|
-
fun EmptyProjectsState(modifier: Modifier = Modifier) {
|
|
104
|
-
Column(
|
|
105
|
-
modifier = modifier,
|
|
106
|
-
horizontalAlignment = androidx.compose.ui.Alignment.CenterHorizontally,
|
|
107
|
-
verticalArrangement = Arrangement.Center
|
|
108
|
-
) {
|
|
109
|
-
Text(
|
|
110
|
-
text = "No projects",
|
|
111
|
-
style = MaterialTheme.typography.titleLarge
|
|
112
|
-
)
|
|
113
|
-
Spacer(modifier = Modifier.height(8.dp))
|
|
114
|
-
Text(
|
|
115
|
-
text = "Create a project to organize your tasks",
|
|
116
|
-
style = MaterialTheme.typography.bodyMedium,
|
|
117
|
-
color = MaterialTheme.colorScheme.onSurfaceVariant
|
|
118
|
-
)
|
|
119
|
-
}
|
|
120
|
-
}
|
|
111
|
+
// EmptyProjectsState has been replaced with EmptyStateView
|
|
@@ -8,7 +8,7 @@ import androidx.compose.runtime.*
|
|
|
8
8
|
import androidx.compose.ui.Alignment
|
|
9
9
|
import androidx.compose.ui.Modifier
|
|
10
10
|
import androidx.compose.ui.unit.dp
|
|
11
|
-
import com.appship.task.
|
|
11
|
+
import com.appship.task.data.DataSourceResolver
|
|
12
12
|
|
|
13
13
|
@OptIn(ExperimentalMaterial3Api::class)
|
|
14
14
|
@Composable
|
|
@@ -59,7 +59,10 @@ fun EmptySearchState() {
|
|
|
59
59
|
|
|
60
60
|
@Composable
|
|
61
61
|
fun SearchResults(query: String) {
|
|
62
|
-
val
|
|
62
|
+
val repository = DataSourceResolver.repository
|
|
63
|
+
val tasks by repository.tasks.collectAsState()
|
|
64
|
+
|
|
65
|
+
val filteredTasks = tasks.filter {
|
|
63
66
|
it.title.contains(query, ignoreCase = true) ||
|
|
64
67
|
it.description?.contains(query, ignoreCase = true) == true
|
|
65
68
|
}
|
|
@@ -69,8 +72,8 @@ fun SearchResults(query: String) {
|
|
|
69
72
|
contentPadding = PaddingValues(16.dp),
|
|
70
73
|
verticalArrangement = Arrangement.spacedBy(8.dp)
|
|
71
74
|
) {
|
|
72
|
-
items(
|
|
73
|
-
val task =
|
|
75
|
+
items(filteredTasks.size) { index ->
|
|
76
|
+
val task = filteredTasks[index]
|
|
74
77
|
Card(modifier = Modifier.fillMaxWidth()) {
|
|
75
78
|
Column(
|
|
76
79
|
modifier = Modifier.padding(16.dp)
|
|
@@ -9,7 +9,6 @@ import androidx.compose.ui.Modifier
|
|
|
9
9
|
import androidx.compose.ui.platform.testTag
|
|
10
10
|
import androidx.compose.ui.unit.dp
|
|
11
11
|
import com.appship.task.data.TaskPriority
|
|
12
|
-
import com.appship.task.mock.MockDataProvider
|
|
13
12
|
|
|
14
13
|
@OptIn(ExperimentalMaterial3Api::class)
|
|
15
14
|
@Composable
|
package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/mock/MockDataProvider.kt
CHANGED
|
@@ -1,30 +1,35 @@
|
|
|
1
1
|
package com.appship.task.mock
|
|
2
2
|
|
|
3
3
|
import com.appship.task.data.*
|
|
4
|
+
import com.appship.task.data.DataRepository
|
|
4
5
|
import kotlinx.coroutines.flow.MutableStateFlow
|
|
5
6
|
import kotlinx.coroutines.flow.StateFlow
|
|
6
7
|
import kotlinx.coroutines.flow.asStateFlow
|
|
7
8
|
import java.time.LocalDate
|
|
8
9
|
import java.time.LocalDateTime
|
|
9
10
|
|
|
10
|
-
object MockDataProvider {
|
|
11
|
+
object MockDataProvider : DataRepository {
|
|
11
12
|
|
|
12
13
|
private val _tasks = MutableStateFlow<List<Task>>(emptyList())
|
|
13
|
-
val tasks: StateFlow<List<Task>> = _tasks.asStateFlow()
|
|
14
|
+
override val tasks: StateFlow<List<Task>> = _tasks.asStateFlow()
|
|
14
15
|
|
|
15
16
|
private val _projects = MutableStateFlow<List<Project>>(emptyList())
|
|
16
|
-
val projects: StateFlow<List<Project>> = _projects.asStateFlow()
|
|
17
|
+
override val projects: StateFlow<List<Project>> = _projects.asStateFlow()
|
|
17
18
|
|
|
18
19
|
private val _tags = MutableStateFlow<List<Tag>>(emptyList())
|
|
19
|
-
val tags: StateFlow<List<Tag>> = _tags.asStateFlow()
|
|
20
|
+
override val tags: StateFlow<List<Tag>> = _tags.asStateFlow()
|
|
20
21
|
|
|
21
22
|
private val _kanbanColumns = MutableStateFlow<List<KanbanColumn>>(emptyList())
|
|
22
|
-
val kanbanColumns: StateFlow<List<KanbanColumn>> = _kanbanColumns.asStateFlow()
|
|
23
|
+
override val kanbanColumns: StateFlow<List<KanbanColumn>> = _kanbanColumns.asStateFlow()
|
|
23
24
|
|
|
24
25
|
init {
|
|
25
26
|
setupMockData()
|
|
26
27
|
}
|
|
27
28
|
|
|
29
|
+
override fun loadData() {
|
|
30
|
+
// Mock data is already loaded in init
|
|
31
|
+
}
|
|
32
|
+
|
|
28
33
|
private fun setupMockData() {
|
|
29
34
|
// Setup Tags
|
|
30
35
|
_tags.value = listOf(
|
|
@@ -294,22 +299,22 @@ object MockDataProvider {
|
|
|
294
299
|
|
|
295
300
|
// MARK: - CRUD Operations
|
|
296
301
|
|
|
297
|
-
fun getTasks(): List<Task> = _tasks.value
|
|
302
|
+
override fun getTasks(): List<Task> = _tasks.value
|
|
298
303
|
|
|
299
|
-
fun getTask(id: String): Task? = _tasks.value.firstOrNull { it.id == id }
|
|
304
|
+
override fun getTask(id: String): Task? = _tasks.value.firstOrNull { it.id == id }
|
|
300
305
|
|
|
301
|
-
fun createTask(task: Task) {
|
|
306
|
+
override fun createTask(task: Task) {
|
|
302
307
|
_tasks.value = _tasks.value + task
|
|
303
308
|
if (task.projectId != null) {
|
|
304
309
|
updateProjectTasks(projectId = task.projectId, taskId = task.id, add = true)
|
|
305
310
|
}
|
|
306
311
|
}
|
|
307
312
|
|
|
308
|
-
fun updateTask(task: Task) {
|
|
313
|
+
override fun updateTask(task: Task) {
|
|
309
314
|
_tasks.value = _tasks.value.map { if (it.id == task.id) task else it }
|
|
310
315
|
}
|
|
311
316
|
|
|
312
|
-
fun deleteTask(id: String) {
|
|
317
|
+
override fun deleteTask(id: String) {
|
|
313
318
|
val task = _tasks.value.firstOrNull { it.id == id }
|
|
314
319
|
if (task != null && task.projectId != null) {
|
|
315
320
|
updateProjectTasks(projectId = task.projectId, taskId = id, add = false)
|
|
@@ -321,21 +326,21 @@ object MockDataProvider {
|
|
|
321
326
|
}
|
|
322
327
|
}
|
|
323
328
|
|
|
324
|
-
fun getProjects(): List<Project> = _projects.value
|
|
329
|
+
override fun getProjects(): List<Project> = _projects.value
|
|
325
330
|
|
|
326
|
-
fun getProject(id: String): Project? = _projects.value.firstOrNull { it.id == id }
|
|
331
|
+
override fun getProject(id: String): Project? = _projects.value.firstOrNull { it.id == id }
|
|
327
332
|
|
|
328
|
-
fun getTasksByTag(tagId: String): List<Task> {
|
|
333
|
+
override fun getTasksByTag(tagId: String): List<Task> {
|
|
329
334
|
return _tasks.value.filter { it.tags.contains(tagId) }
|
|
330
335
|
}
|
|
331
336
|
|
|
332
|
-
fun getTasksByDueDate(date: LocalDate): List<Task> {
|
|
337
|
+
override fun getTasksByDueDate(date: LocalDate): List<Task> {
|
|
333
338
|
return _tasks.value.filter { it.dueDate == date }
|
|
334
339
|
}
|
|
335
340
|
|
|
336
|
-
fun getKanbanColumns(): List<KanbanColumn> = _kanbanColumns.value
|
|
341
|
+
override fun getKanbanColumns(): List<KanbanColumn> = _kanbanColumns.value
|
|
337
342
|
|
|
338
|
-
fun moveTaskToColumn(taskId: String, columnId: String) {
|
|
343
|
+
override fun moveTaskToColumn(taskId: String, columnId: String) {
|
|
339
344
|
// Remove from all columns
|
|
340
345
|
_kanbanColumns.value = _kanbanColumns.value.map { column ->
|
|
341
346
|
column.copy(taskIds = column.taskIds.filter { it != taskId })
|
package/templates/android/TaskTemplate/app/src/test/kotlin/com/appship/task/DataRepositoryTest.kt
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
package com.appship.task
|
|
2
|
+
|
|
3
|
+
import com.appship.task.data.DataRepository
|
|
4
|
+
import com.appship.task.data.DataSourceResolver
|
|
5
|
+
import com.appship.task.mock.MockDataProvider
|
|
6
|
+
import org.junit.Assert.*
|
|
7
|
+
import org.junit.Before
|
|
8
|
+
import org.junit.Test
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Tests that MockDataProvider implements DataRepository and that
|
|
12
|
+
* DataSourceResolver returns the correct implementation.
|
|
13
|
+
*/
|
|
14
|
+
class DataRepositoryTest {
|
|
15
|
+
|
|
16
|
+
private lateinit var repo: DataRepository
|
|
17
|
+
|
|
18
|
+
@Before
|
|
19
|
+
fun setUp() {
|
|
20
|
+
repo = MockDataProvider
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// MARK: DataRepository Interface Conformance
|
|
24
|
+
|
|
25
|
+
@Test
|
|
26
|
+
fun testMockDataProviderImplementsDataRepository() {
|
|
27
|
+
assertTrue("MockDataProvider should implement DataRepository", MockDataProvider is DataRepository)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
@Test
|
|
31
|
+
fun testRepositoryLoadData() {
|
|
32
|
+
assertTrue("tasks should not be empty", repo.tasks.value.isNotEmpty())
|
|
33
|
+
assertTrue("projects should not be empty", repo.projects.value.isNotEmpty())
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@Test
|
|
37
|
+
fun testDataSourceResolverReturnsMock() {
|
|
38
|
+
val resolved = DataSourceResolver.repository
|
|
39
|
+
assertNotNull("DataSourceResolver should return a non-null repository", resolved)
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -12,6 +12,8 @@ composeCompiler = "1.5.10"
|
|
|
12
12
|
navigationCompose = "2.7.7"
|
|
13
13
|
datastore = "1.0.0"
|
|
14
14
|
coroutinesTest = "1.7.3"
|
|
15
|
+
room = "2.6.1"
|
|
16
|
+
gson = "2.10.1"
|
|
15
17
|
|
|
16
18
|
[libraries]
|
|
17
19
|
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
|
|
@@ -33,6 +35,10 @@ androidx-navigation-compose = { group = "androidx.navigation", name = "navigatio
|
|
|
33
35
|
androidx-datastore-preferences = { group = "androidx.datastore", name = "datastore-preferences", version.ref = "datastore" }
|
|
34
36
|
kotlinx-coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version = "1.7.3" }
|
|
35
37
|
kotlinx-coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "coroutinesTest" }
|
|
38
|
+
room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "room" }
|
|
39
|
+
room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "room" }
|
|
40
|
+
room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" }
|
|
41
|
+
gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" }
|
|
36
42
|
|
|
37
43
|
[plugins]
|
|
38
44
|
android-application = { id = "com.android.application", version.ref = "agp" }
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
appId: ${APP_PACKAGE_NAME}
|
|
2
2
|
---
|
|
3
|
+
- clearState
|
|
3
4
|
- launchApp
|
|
5
|
+
- extendedWaitUntil:
|
|
6
|
+
visible:
|
|
7
|
+
- "Inbox"
|
|
8
|
+
timeout: 10000
|
|
9
|
+
# Skip onboarding
|
|
4
10
|
- tapOn:
|
|
5
11
|
text: "Skip"
|
|
6
12
|
optional: true
|
|
@@ -8,11 +14,69 @@ appId: ${APP_PACKAGE_NAME}
|
|
|
8
14
|
text: "Get Started"
|
|
9
15
|
optional: true
|
|
10
16
|
- tapOn:
|
|
11
|
-
|
|
12
|
-
|
|
17
|
+
text: "Continue"
|
|
18
|
+
optional: true
|
|
19
|
+
# Ensure we're on Inbox tab
|
|
20
|
+
- assertVisible:
|
|
21
|
+
text: "Inbox"
|
|
22
|
+
# Create a test task if needed
|
|
23
|
+
- tapOn:
|
|
24
|
+
id: "inbox_add_task_button"
|
|
25
|
+
optional: true
|
|
26
|
+
- assertVisible:
|
|
27
|
+
id: "task_detail_title_field"
|
|
28
|
+
optional: true
|
|
13
29
|
- inputText:
|
|
14
|
-
|
|
15
|
-
|
|
30
|
+
id: "task_detail_title_field"
|
|
31
|
+
text: "Searchable Task"
|
|
32
|
+
optional: true
|
|
33
|
+
- tapOn:
|
|
34
|
+
id: "task_detail_save_button"
|
|
35
|
+
optional: true
|
|
36
|
+
- back
|
|
37
|
+
optional: true
|
|
38
|
+
# Look for search field (may be in navigation bar or as a button)
|
|
39
|
+
- assertVisible:
|
|
40
|
+
text: "Search"
|
|
41
|
+
optional: true
|
|
42
|
+
# If search is accessible via button, tap it
|
|
43
|
+
- tapOn:
|
|
44
|
+
text: "Search"
|
|
45
|
+
optional: true
|
|
46
|
+
# If search field appears, input search query
|
|
16
47
|
- inputText:
|
|
17
|
-
text: "
|
|
18
|
-
|
|
48
|
+
text: "Searchable"
|
|
49
|
+
optional: true
|
|
50
|
+
# Verify search results or empty state
|
|
51
|
+
- assertVisible:
|
|
52
|
+
id: "inbox_task_0_card"
|
|
53
|
+
optional: true
|
|
54
|
+
- assertVisible:
|
|
55
|
+
id: "inbox_empty_state"
|
|
56
|
+
optional: true
|
|
57
|
+
# Clear search if needed
|
|
58
|
+
- back
|
|
59
|
+
optional: true
|
|
60
|
+
# Test filter functionality if available
|
|
61
|
+
- assertVisible:
|
|
62
|
+
text: "Filter"
|
|
63
|
+
optional: true
|
|
64
|
+
- tapOn:
|
|
65
|
+
text: "Filter"
|
|
66
|
+
optional: true
|
|
67
|
+
# Navigate to Projects tab to test project filtering
|
|
68
|
+
- tapOn:
|
|
69
|
+
text: "Projects"
|
|
70
|
+
- assertVisible:
|
|
71
|
+
text: "Projects"
|
|
72
|
+
- assertVisible:
|
|
73
|
+
id: "project_list_project_0_card"
|
|
74
|
+
optional: true
|
|
75
|
+
- assertVisible:
|
|
76
|
+
id: "project_list_empty_state"
|
|
77
|
+
optional: true
|
|
78
|
+
# Return to Inbox
|
|
79
|
+
- tapOn:
|
|
80
|
+
text: "Inbox"
|
|
81
|
+
- assertVisible:
|
|
82
|
+
text: "Inbox"
|
|
@@ -31,6 +31,7 @@ Test tags follow the pattern: `{screen}_{element}_{identifier}`
|
|
|
31
31
|
| `today_habit_{index}_card` | Card | Habit card (indexed by position) |
|
|
32
32
|
| `today_habit_{index}_checkbox` | Box (clickable) | Habit completion checkbox |
|
|
33
33
|
| `today_empty_state_button` | Button | "Add Your First Habit" button |
|
|
34
|
+
| `today_empty_state` | Column | Empty state view when no habits exist |
|
|
34
35
|
|
|
35
36
|
## Dashboard Screen (`DashboardScreen.kt`)
|
|
36
37
|
|
|
@@ -41,6 +42,7 @@ Test tags follow the pattern: `{screen}_{element}_{identifier}`
|
|
|
41
42
|
| `dashboard_calendar_card` | Card | Calendar heat map card |
|
|
42
43
|
| `dashboard_habit_{index}_card` | Row | Habit performance row (indexed) |
|
|
43
44
|
| `dashboard_insight_{index}_card` | Row | Insight row (indexed) |
|
|
45
|
+
| `dashboard_empty_state` | Column | Empty state view when no habits exist |
|
|
44
46
|
|
|
45
47
|
## Habits List Screen (`HabitsListScreen.kt`)
|
|
46
48
|
|
|
@@ -50,6 +52,7 @@ Test tags follow the pattern: `{screen}_{element}_{identifier}`
|
|
|
50
52
|
| `habits_fab` | FloatingActionButton | Floating action button |
|
|
51
53
|
| `habits_filter_{name}_chip` | FilterChip | Category filter chip (name: category ID or "all") |
|
|
52
54
|
| `habits_habit_{index}_card` | Card | Habit card (indexed by position) |
|
|
55
|
+
| `habits_empty_state` | Column | Empty state view when no habits exist |
|
|
53
56
|
|
|
54
57
|
## Habit Detail Screen (`HabitDetailScreen.kt`)
|
|
55
58
|
|
|
@@ -85,6 +88,7 @@ Test tags follow the pattern: `{screen}_{element}_{identifier}`
|
|
|
85
88
|
|----------|---------|-------------|
|
|
86
89
|
| `achievements_summary_card` | Card | Summary card with unlocked count |
|
|
87
90
|
| `achievements_achievement_{index}_card` | Card | Achievement card (indexed, unlocked or locked) |
|
|
91
|
+
| `achievements_empty_state` | Column | Empty state view when no achievements exist |
|
|
88
92
|
|
|
89
93
|
## Settings Screen (`SettingsScreen.kt`)
|
|
90
94
|
|