@shaykec/app-agent 1.0.5 → 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/.cursor/rules/safety-guardrails.mdc +1 -0
- package/.cursor/rules/workflow.mdc +4 -4
- package/.cursor/skills/content-writer/SKILL.md +27 -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 +4 -2
- package/CLAUDE.md +4 -3
- package/dist/cli.d.ts +4 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +45 -2
- 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/index.js +7 -1
- package/dist/index.js.map +1 -1
- 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 +1 -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/bookings/BookingsScreen.kt +11 -29
- 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 +5 -22
- 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/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/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 +25 -9
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/features/contacts/ContactsScreen.kt +27 -12
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/features/conversations/ChatScreen.kt +1 -0
- package/templates/android/ChatTemplate/app/src/main/kotlin/com/appship/chat/features/conversations/ConversationsScreen.kt +42 -26
- 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/DataSourceResolver.kt +2 -4
- 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 +25 -11
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/features/dashboard/DashboardScreen.kt +21 -10
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/features/datasources/DataSourcesScreen.kt +30 -16
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/features/reports/ReportsScreen.kt +30 -16
- package/templates/android/DashTemplate/app/src/main/kotlin/com/appship/dash/mock/MockDataProvider.kt +7 -7
- 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/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 +19 -8
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/features/chores/ChoreBoardScreen.kt +35 -21
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/features/familyhub/FamilyHubScreen.kt +1 -1
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/features/gallery/GalleryScreen.kt +1 -1
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/features/rewards/RewardsScreen.kt +1 -1
- package/templates/android/FamilyTemplate/app/src/main/java/com/appship/family/mock/MockDataProvider.kt +7 -7
- 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/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/DataSourceResolver.kt +2 -4
- 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 +13 -2
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/features/goals/GoalsScreen.kt +17 -6
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/features/home/HomeScreen.kt +12 -3
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/features/transactions/TransactionsScreen.kt +26 -13
- package/templates/android/FinanceTemplate/app/src/main/kotlin/com/appship/finance/mock/MockDataProvider.kt +25 -61
- 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/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 +19 -11
- 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/DataSourceResolver.kt +1 -2
- 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 +4 -1
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/features/profile/ProfileScreen.kt +5 -4
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/features/workouts/WorkoutListScreen.kt +12 -1
- package/templates/android/HealthTemplate/app/src/main/kotlin/com/appship/health/mock/MockDataProvider.kt +12 -10
- 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/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 +1 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/data/DataSourceResolver.kt +1 -2
- 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 +14 -4
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/features/leaderboard/LeaderboardScreen.kt +2 -0
- package/templates/android/LearnTemplate/app/src/main/kotlin/com/appship/learn/mock/MockDataProvider.kt +7 -7
- 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 +3 -2
- 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/features/place/PlaceDetailScreen.kt +2 -0
- 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/route/RouteScreen.kt +2 -0
- 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/settings/SettingsScreen.kt +2 -0
- 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/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 +1 -0
- 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 +291 -62
- 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/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 +5 -4
- 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 +2 -4
- 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 +2 -1
- 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/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 +1 -1
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/features/feed/FeedScreen.kt +1 -1
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/features/messages/MessagesScreen.kt +25 -15
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/features/notifications/NotificationsScreen.kt +17 -7
- package/templates/android/SocialTemplate/app/src/main/kotlin/com/appship/social/features/search/SearchScreen.kt +20 -12
- 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/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 +3 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/data/DataSourceResolver.kt +1 -2
- 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/inbox/InboxScreen.kt +11 -22
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/kanban/KanbanBoardScreen.kt +1 -0
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/projects/ProjectDetailScreen.kt +28 -14
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/projects/ProjectListScreen.kt +11 -22
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/features/search/SearchScreen.kt +6 -3
- package/templates/android/TaskTemplate/app/src/main/kotlin/com/appship/task/mock/MockDataProvider.kt +8 -4
- 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/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 +1 -1
- package/templates/android/TrackTemplate/app/src/main/kotlin/com/appship/track/data/DataSourceResolver.kt +1 -2
- 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/dashboard/TodayScreen.kt +10 -39
- 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/mock/MockDataProvider.kt +3 -3
- 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/Core/EmptyStateView.swift +130 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Core/Strings.swift +27 -0
- package/templates/ios/ChatTemplate/ChatTemplate/Data/DataSourceResolver.swift +1 -2
- 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/Core/EmptyStateView.swift +130 -0
- package/templates/ios/DashTemplate/DashTemplate/Core/Strings.swift +27 -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.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/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.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/Core/EmptyStateView.swift +130 -0
- package/templates/ios/FinanceTemplate/FinanceTemplate/Data/DataRepository.swift +11 -30
- package/templates/ios/FinanceTemplate/FinanceTemplate/Data/DataSourceResolver.swift +1 -2
- 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 +10 -3
- package/templates/ios/FinanceTemplate/FinanceTemplate/Features/Goals/GoalsView.swift +11 -4
- package/templates/ios/FinanceTemplate/FinanceTemplate/MockData/MockDataProvider.swift +6 -6
- 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/Core/Components/EmptyStateView.swift +59 -0
- package/templates/ios/GameTemplate/GameTemplate/Core/Strings.swift +16 -0
- package/templates/ios/GameTemplate/GameTemplate/Data/DataSourceResolver.swift +1 -1
- 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.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/Core/Components/EmptyStateView.swift +59 -0
- package/templates/ios/HealthTemplate/HealthTemplate/Core/Strings.swift +16 -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.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/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 +9 -4
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Courses/CourseListView.swift +9 -4
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Flashcards/FlashcardView.swift +1 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Leaderboard/LeaderboardView.swift +1 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Lessons/LessonPlayerView.swift +1 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Onboarding/OnboardingView.swift +8 -3
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Profile/ProfileView.swift +1 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Progress/ProgressDashboardView.swift +1 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Quiz/QuizView.swift +1 -0
- package/templates/ios/LearnTemplate/LearnTemplate/Features/Settings/SettingsView.swift +1 -0
- package/templates/ios/LearnTemplate/LearnTemplate/MockData/MockDataProvider.swift +1 -1
- 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/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/DataSourceResolver.swift +1 -2
- 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.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/Core/EmptyStateView.swift +130 -0
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Core/Strings.swift +2 -1
- package/templates/ios/ReferenceTemplate/ReferenceTemplate/Data/DataSourceResolver.swift +6 -2
- 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.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/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/DataSourceResolver.swift +1 -2
- 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/Inbox/InboxView.swift +9 -14
- package/templates/ios/TaskTemplate/TaskTemplate/Features/Projects/ProjectDetailView.swift +21 -10
- package/templates/ios/TaskTemplate/TaskTemplate/Features/Projects/ProjectListView.swift +9 -14
- package/templates/ios/TaskTemplate/TaskTemplate/Features/Search/SearchView.swift +10 -21
- 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/Core/EmptyStateView.swift +145 -0
- package/templates/ios/TrackTemplate/TrackTemplate/Data/DataSourceResolver.swift +1 -2
- 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.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
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import CoreData
|
|
2
|
+
import Foundation
|
|
3
|
+
|
|
4
|
+
@objc(OrderEntity)
|
|
5
|
+
final class OrderEntity: NSManagedObject {
|
|
6
|
+
@NSManaged var id: String
|
|
7
|
+
@NSManaged var orderNumber: String
|
|
8
|
+
@NSManaged var itemsJSON: String
|
|
9
|
+
@NSManaged var status: String
|
|
10
|
+
@NSManaged var shippingAddressJSON: String
|
|
11
|
+
@NSManaged var billingAddressJSON: String?
|
|
12
|
+
@NSManaged var paymentMethodJSON: String
|
|
13
|
+
@NSManaged var subtotal: Double
|
|
14
|
+
@NSManaged var discount: Double
|
|
15
|
+
@NSManaged var shipping: Double
|
|
16
|
+
@NSManaged var tax: Double
|
|
17
|
+
@NSManaged var total: Double
|
|
18
|
+
@NSManaged var discountCode: String?
|
|
19
|
+
@NSManaged var trackingNumber: String?
|
|
20
|
+
@NSManaged var trackingURL: String?
|
|
21
|
+
@NSManaged var estimatedDelivery: Date?
|
|
22
|
+
@NSManaged var createdAt: Date
|
|
23
|
+
@NSManaged var updatedAt: Date
|
|
24
|
+
@NSManaged var timelineJSON: String?
|
|
25
|
+
|
|
26
|
+
func toOrder() -> Order? {
|
|
27
|
+
guard let items = parseItems(),
|
|
28
|
+
let shippingAddress = parseShippingAddress(),
|
|
29
|
+
let paymentMethod = parsePaymentMethod() else {
|
|
30
|
+
return nil
|
|
31
|
+
}
|
|
32
|
+
return Order(
|
|
33
|
+
id: id,
|
|
34
|
+
orderNumber: orderNumber,
|
|
35
|
+
items: items,
|
|
36
|
+
status: OrderStatus(rawValue: status) ?? .pending,
|
|
37
|
+
shippingAddress: shippingAddress,
|
|
38
|
+
billingAddress: parseBillingAddress(),
|
|
39
|
+
paymentMethod: paymentMethod,
|
|
40
|
+
subtotal: subtotal,
|
|
41
|
+
discount: discount,
|
|
42
|
+
shipping: shipping,
|
|
43
|
+
tax: tax,
|
|
44
|
+
total: total,
|
|
45
|
+
discountCode: discountCode,
|
|
46
|
+
trackingNumber: trackingNumber,
|
|
47
|
+
trackingURL: trackingURL,
|
|
48
|
+
estimatedDelivery: estimatedDelivery,
|
|
49
|
+
createdAt: createdAt,
|
|
50
|
+
updatedAt: updatedAt,
|
|
51
|
+
timeline: parseTimeline()
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
func update(from order: Order) {
|
|
56
|
+
id = order.id
|
|
57
|
+
orderNumber = order.orderNumber
|
|
58
|
+
itemsJSON = (try? String(data: JSONEncoder().encode(order.items), encoding: .utf8)) ?? "[]"
|
|
59
|
+
status = order.status.rawValue
|
|
60
|
+
shippingAddressJSON = (try? String(data: JSONEncoder().encode(order.shippingAddress), encoding: .utf8)) ?? "{}"
|
|
61
|
+
billingAddressJSON = order.billingAddress.flatMap { try? String(data: JSONEncoder().encode($0), encoding: .utf8) }
|
|
62
|
+
paymentMethodJSON = (try? String(data: JSONEncoder().encode(order.paymentMethod), encoding: .utf8)) ?? "{}"
|
|
63
|
+
subtotal = order.subtotal
|
|
64
|
+
discount = order.discount
|
|
65
|
+
shipping = order.shipping
|
|
66
|
+
tax = order.tax
|
|
67
|
+
total = order.total
|
|
68
|
+
discountCode = order.discountCode
|
|
69
|
+
trackingNumber = order.trackingNumber
|
|
70
|
+
trackingURL = order.trackingURL
|
|
71
|
+
estimatedDelivery = order.estimatedDelivery
|
|
72
|
+
createdAt = order.createdAt
|
|
73
|
+
updatedAt = order.updatedAt
|
|
74
|
+
timelineJSON = order.timeline?.isEmpty == false ? (try? String(data: JSONEncoder().encode(order.timeline), encoding: .utf8)) : nil
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
private func parseItems() -> [OrderItem]? {
|
|
78
|
+
guard let data = itemsJSON.data(using: .utf8),
|
|
79
|
+
let items = try? JSONDecoder().decode([OrderItem].self, from: data) else {
|
|
80
|
+
return nil
|
|
81
|
+
}
|
|
82
|
+
return items
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
private func parseShippingAddress() -> Address? {
|
|
86
|
+
guard let data = shippingAddressJSON.data(using: .utf8),
|
|
87
|
+
let address = try? JSONDecoder().decode(Address.self, from: data) else {
|
|
88
|
+
return nil
|
|
89
|
+
}
|
|
90
|
+
return address
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
private func parseBillingAddress() -> Address? {
|
|
94
|
+
guard let json = billingAddressJSON,
|
|
95
|
+
let data = json.data(using: .utf8),
|
|
96
|
+
let address = try? JSONDecoder().decode(Address.self, from: data) else {
|
|
97
|
+
return nil
|
|
98
|
+
}
|
|
99
|
+
return address
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
private func parsePaymentMethod() -> PaymentMethod? {
|
|
103
|
+
guard let data = paymentMethodJSON.data(using: .utf8),
|
|
104
|
+
let method = try? JSONDecoder().decode(PaymentMethod.self, from: data) else {
|
|
105
|
+
return nil
|
|
106
|
+
}
|
|
107
|
+
return method
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
private func parseTimeline() -> [OrderTimelineEvent]? {
|
|
111
|
+
guard let json = timelineJSON,
|
|
112
|
+
let data = json.data(using: .utf8),
|
|
113
|
+
let timeline = try? JSONDecoder().decode([OrderTimelineEvent].self, from: data) else {
|
|
114
|
+
return nil
|
|
115
|
+
}
|
|
116
|
+
return timeline.isEmpty ? nil : timeline
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
extension OrderEntity {
|
|
121
|
+
@nonobjc class func fetchRequest() -> NSFetchRequest<OrderEntity> {
|
|
122
|
+
NSFetchRequest<OrderEntity>(entityName: "OrderEntity")
|
|
123
|
+
}
|
|
124
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import CoreData
|
|
2
|
+
import Foundation
|
|
3
|
+
|
|
4
|
+
@objc(ProductEntity)
|
|
5
|
+
final class ProductEntity: NSManagedObject {
|
|
6
|
+
@NSManaged var id: String
|
|
7
|
+
@NSManaged var name: String
|
|
8
|
+
@NSManaged var productDescription: String
|
|
9
|
+
@NSManaged var price: Double
|
|
10
|
+
@NSManaged var originalPrice: NSNumber?
|
|
11
|
+
@NSManaged var imagesJSON: String?
|
|
12
|
+
@NSManaged var categoryId: String
|
|
13
|
+
@NSManaged var brand: String?
|
|
14
|
+
@NSManaged var rating: Double
|
|
15
|
+
@NSManaged var reviewCount: Int32
|
|
16
|
+
@NSManaged var inStock: Bool
|
|
17
|
+
@NSManaged var stockCount: NSNumber?
|
|
18
|
+
@NSManaged var variantsJSON: String?
|
|
19
|
+
@NSManaged var specificationsJSON: String?
|
|
20
|
+
@NSManaged var tagsJSON: String?
|
|
21
|
+
@NSManaged var createdAt: Date?
|
|
22
|
+
|
|
23
|
+
func toProduct(category: Category) -> Product {
|
|
24
|
+
Product(
|
|
25
|
+
id: id,
|
|
26
|
+
name: name,
|
|
27
|
+
description: productDescription,
|
|
28
|
+
price: price,
|
|
29
|
+
originalPrice: originalPrice.map { Double(truncating: $0) },
|
|
30
|
+
images: parseImages(),
|
|
31
|
+
category: category,
|
|
32
|
+
brand: brand,
|
|
33
|
+
rating: rating,
|
|
34
|
+
reviewCount: Int(reviewCount),
|
|
35
|
+
inStock: inStock,
|
|
36
|
+
stockCount: stockCount.map { Int(truncating: $0) },
|
|
37
|
+
variants: parseVariants(),
|
|
38
|
+
specifications: parseSpecifications(),
|
|
39
|
+
tags: parseTags(),
|
|
40
|
+
createdAt: createdAt
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
func update(from product: Product) {
|
|
45
|
+
id = product.id
|
|
46
|
+
name = product.name
|
|
47
|
+
productDescription = product.description
|
|
48
|
+
price = product.price
|
|
49
|
+
originalPrice = product.originalPrice.map { NSNumber(value: $0) }
|
|
50
|
+
imagesJSON = product.images.isEmpty ? nil : (try? String(data: JSONEncoder().encode(product.images), encoding: .utf8))
|
|
51
|
+
categoryId = product.category.id
|
|
52
|
+
brand = product.brand
|
|
53
|
+
rating = product.rating
|
|
54
|
+
reviewCount = Int32(product.reviewCount)
|
|
55
|
+
inStock = product.inStock
|
|
56
|
+
stockCount = product.stockCount.map { NSNumber(value: $0) }
|
|
57
|
+
variantsJSON = product.variants?.isEmpty == false ? (try? String(data: JSONEncoder().encode(product.variants), encoding: .utf8)) : nil
|
|
58
|
+
specificationsJSON = product.specifications?.isEmpty == false ? (try? String(data: JSONEncoder().encode(product.specifications), encoding: .utf8)) : nil
|
|
59
|
+
tagsJSON = product.tags?.isEmpty == false ? (try? String(data: JSONEncoder().encode(product.tags), encoding: .utf8)) : nil
|
|
60
|
+
createdAt = product.createdAt
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
private func parseImages() -> [String] {
|
|
64
|
+
guard let json = imagesJSON,
|
|
65
|
+
let data = json.data(using: .utf8),
|
|
66
|
+
let images = try? JSONDecoder().decode([String].self, from: data) else {
|
|
67
|
+
return []
|
|
68
|
+
}
|
|
69
|
+
return images
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
private func parseVariants() -> [ProductVariant]? {
|
|
73
|
+
guard let json = variantsJSON,
|
|
74
|
+
let data = json.data(using: .utf8),
|
|
75
|
+
let variants = try? JSONDecoder().decode([ProductVariant].self, from: data) else {
|
|
76
|
+
return nil
|
|
77
|
+
}
|
|
78
|
+
return variants.isEmpty ? nil : variants
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
private func parseSpecifications() -> [ProductSpecification]? {
|
|
82
|
+
guard let json = specificationsJSON,
|
|
83
|
+
let data = json.data(using: .utf8),
|
|
84
|
+
let specs = try? JSONDecoder().decode([ProductSpecification].self, from: data) else {
|
|
85
|
+
return nil
|
|
86
|
+
}
|
|
87
|
+
return specs.isEmpty ? nil : specs
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
private func parseTags() -> [String]? {
|
|
91
|
+
guard let json = tagsJSON,
|
|
92
|
+
let data = json.data(using: .utf8),
|
|
93
|
+
let tags = try? JSONDecoder().decode([String].self, from: data) else {
|
|
94
|
+
return nil
|
|
95
|
+
}
|
|
96
|
+
return tags.isEmpty ? nil : tags
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
extension ProductEntity {
|
|
101
|
+
@nonobjc class func fetchRequest() -> NSFetchRequest<ProductEntity> {
|
|
102
|
+
NSFetchRequest<ProductEntity>(entityName: "ProductEntity")
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import CoreData
|
|
2
|
+
import Foundation
|
|
3
|
+
|
|
4
|
+
@objc(ReviewEntity)
|
|
5
|
+
final class ReviewEntity: NSManagedObject {
|
|
6
|
+
@NSManaged var id: String
|
|
7
|
+
@NSManaged var productId: String
|
|
8
|
+
@NSManaged var userId: String
|
|
9
|
+
@NSManaged var userName: String
|
|
10
|
+
@NSManaged var userAvatar: String?
|
|
11
|
+
@NSManaged var rating: Int32
|
|
12
|
+
@NSManaged var title: String?
|
|
13
|
+
@NSManaged var comment: String
|
|
14
|
+
@NSManaged var imagesJSON: String?
|
|
15
|
+
@NSManaged var isVerifiedPurchase: Bool
|
|
16
|
+
@NSManaged var helpfulCount: Int32
|
|
17
|
+
@NSManaged var createdAt: Date
|
|
18
|
+
|
|
19
|
+
func toReview() -> Review {
|
|
20
|
+
Review(
|
|
21
|
+
id: id,
|
|
22
|
+
productId: productId,
|
|
23
|
+
userId: userId,
|
|
24
|
+
userName: userName,
|
|
25
|
+
userAvatar: userAvatar,
|
|
26
|
+
rating: Int(rating),
|
|
27
|
+
title: title,
|
|
28
|
+
comment: comment,
|
|
29
|
+
images: parseImages(),
|
|
30
|
+
isVerifiedPurchase: isVerifiedPurchase,
|
|
31
|
+
helpfulCount: Int(helpfulCount),
|
|
32
|
+
createdAt: createdAt
|
|
33
|
+
)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
func update(from review: Review) {
|
|
37
|
+
id = review.id
|
|
38
|
+
productId = review.productId
|
|
39
|
+
userId = review.userId
|
|
40
|
+
userName = review.userName
|
|
41
|
+
userAvatar = review.userAvatar
|
|
42
|
+
rating = Int32(review.rating)
|
|
43
|
+
title = review.title
|
|
44
|
+
comment = review.comment
|
|
45
|
+
imagesJSON = review.images?.isEmpty == false ? (try? String(data: JSONEncoder().encode(review.images), encoding: .utf8)) : nil
|
|
46
|
+
isVerifiedPurchase = review.isVerifiedPurchase
|
|
47
|
+
helpfulCount = Int32(review.helpfulCount)
|
|
48
|
+
createdAt = review.createdAt
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
private func parseImages() -> [String]? {
|
|
52
|
+
guard let json = imagesJSON,
|
|
53
|
+
let data = json.data(using: .utf8),
|
|
54
|
+
let images = try? JSONDecoder().decode([String].self, from: data) else {
|
|
55
|
+
return nil
|
|
56
|
+
}
|
|
57
|
+
return images.isEmpty ? nil : images
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
extension ReviewEntity {
|
|
62
|
+
@nonobjc class func fetchRequest() -> NSFetchRequest<ReviewEntity> {
|
|
63
|
+
NSFetchRequest<ReviewEntity>(entityName: "ReviewEntity")
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -10,14 +10,12 @@ struct CartView: View {
|
|
|
10
10
|
Group {
|
|
11
11
|
if cartManager.items.isEmpty {
|
|
12
12
|
EmptyStateView(
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
},
|
|
20
|
-
actionIdentifier: "cart_empty_state_button"
|
|
13
|
+
config: .noItems(
|
|
14
|
+
message: "Add some items to get started shopping",
|
|
15
|
+
onAdd: {
|
|
16
|
+
// Navigate to shop - handled by parent TabView
|
|
17
|
+
}
|
|
18
|
+
)
|
|
21
19
|
)
|
|
22
20
|
} else {
|
|
23
21
|
ScrollView {
|
|
@@ -357,8 +355,9 @@ struct CheckoutButton: View {
|
|
|
357
355
|
// MARK: - Preview
|
|
358
356
|
#Preview {
|
|
359
357
|
let cartManager = CartManager()
|
|
360
|
-
|
|
361
|
-
cartManager.addItem(
|
|
358
|
+
let repository = DataSourceResolver.repository
|
|
359
|
+
cartManager.addItem(repository.products[0], quantity: 2)
|
|
360
|
+
cartManager.addItem(repository.products[1])
|
|
362
361
|
|
|
363
362
|
return CartView()
|
|
364
363
|
.environmentObject(cartManager)
|
|
@@ -10,14 +10,12 @@ struct OrdersView: View {
|
|
|
10
10
|
LoadingView()
|
|
11
11
|
} else if viewModel.orders.isEmpty {
|
|
12
12
|
EmptyStateView(
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
},
|
|
20
|
-
actionIdentifier: "orders_empty_state_button"
|
|
13
|
+
config: .noItems(
|
|
14
|
+
message: "When you place an order, it will appear here",
|
|
15
|
+
onAdd: {
|
|
16
|
+
// Navigate to shop
|
|
17
|
+
}
|
|
18
|
+
)
|
|
21
19
|
)
|
|
22
20
|
} else {
|
|
23
21
|
ScrollView {
|
|
@@ -95,14 +95,10 @@ struct ProductListView: View {
|
|
|
95
95
|
LoadingView()
|
|
96
96
|
} else if viewModel.filteredProducts.isEmpty {
|
|
97
97
|
EmptyStateView(
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
action: {
|
|
103
|
-
viewModel.clearFilters()
|
|
104
|
-
},
|
|
105
|
-
actionIdentifier: "product_list_clear_filters_button"
|
|
98
|
+
config: .noResults(searchQuery: viewModel.searchQuery.isEmpty ? nil : viewModel.searchQuery)
|
|
99
|
+
.withButton(title: "Clear Filters", action: {
|
|
100
|
+
viewModel.clearFilters()
|
|
101
|
+
})
|
|
106
102
|
)
|
|
107
103
|
} else {
|
|
108
104
|
ScrollView {
|
|
@@ -240,7 +236,7 @@ class ProductListViewModel: ObservableObject {
|
|
|
240
236
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in
|
|
241
237
|
guard let self = self else { return }
|
|
242
238
|
if let category = self.category {
|
|
243
|
-
self.products = self.repository.products
|
|
239
|
+
self.products = self.repository.products.filter { $0.category.id == category.id }
|
|
244
240
|
} else {
|
|
245
241
|
self.products = self.repository.products
|
|
246
242
|
}
|
|
@@ -621,7 +617,12 @@ struct SearchView: View {
|
|
|
621
617
|
}
|
|
622
618
|
.onChange(of: searchQuery) { _, newValue in
|
|
623
619
|
if !newValue.isEmpty {
|
|
624
|
-
|
|
620
|
+
let repository = DataSourceResolver.repository
|
|
621
|
+
searchResults = repository.products.filter {
|
|
622
|
+
$0.name.localizedCaseInsensitiveContains(newValue) ||
|
|
623
|
+
$0.description.localizedCaseInsensitiveContains(newValue) ||
|
|
624
|
+
($0.brand?.localizedCaseInsensitiveContains(newValue) ?? false)
|
|
625
|
+
}
|
|
625
626
|
} else {
|
|
626
627
|
searchResults = []
|
|
627
628
|
}
|
|
@@ -630,7 +631,12 @@ struct SearchView: View {
|
|
|
630
631
|
|
|
631
632
|
private func performSearch() {
|
|
632
633
|
guard !searchQuery.isEmpty else { return }
|
|
633
|
-
|
|
634
|
+
let repository = DataSourceResolver.repository
|
|
635
|
+
searchResults = repository.products.filter {
|
|
636
|
+
$0.name.localizedCaseInsensitiveContains(searchQuery) ||
|
|
637
|
+
$0.description.localizedCaseInsensitiveContains(searchQuery) ||
|
|
638
|
+
($0.brand?.localizedCaseInsensitiveContains(searchQuery) ?? false)
|
|
639
|
+
}
|
|
634
640
|
saveRecentSearch(searchQuery)
|
|
635
641
|
}
|
|
636
642
|
|
|
@@ -651,6 +657,6 @@ struct SearchView: View {
|
|
|
651
657
|
// MARK: - Preview
|
|
652
658
|
#Preview {
|
|
653
659
|
NavigationStack {
|
|
654
|
-
ProductListView(category:
|
|
660
|
+
ProductListView(category: DataSourceResolver.repository.categories[0])
|
|
655
661
|
}
|
|
656
662
|
}
|
|
@@ -15,14 +15,9 @@ struct WishlistView: View {
|
|
|
15
15
|
Group {
|
|
16
16
|
if wishlistManager.items.isEmpty {
|
|
17
17
|
EmptyStateView(
|
|
18
|
-
|
|
19
|
-
title: "Your wishlist is empty",
|
|
20
|
-
message: "Save items you love by tapping the heart icon",
|
|
21
|
-
actionTitle: "Start Shopping",
|
|
22
|
-
action: {
|
|
18
|
+
config: .noFavorites(onBrowse: {
|
|
23
19
|
// Navigate to shop
|
|
24
|
-
}
|
|
25
|
-
actionIdentifier: "wishlist_empty_state_button"
|
|
20
|
+
})
|
|
26
21
|
)
|
|
27
22
|
} else {
|
|
28
23
|
ScrollView {
|
|
@@ -177,9 +172,10 @@ struct WishlistItemCard: View {
|
|
|
177
172
|
// MARK: - Preview
|
|
178
173
|
#Preview {
|
|
179
174
|
let wishlistManager = WishlistManager()
|
|
180
|
-
|
|
181
|
-
wishlistManager.add(
|
|
182
|
-
wishlistManager.add(
|
|
175
|
+
let repository = DataSourceResolver.repository
|
|
176
|
+
wishlistManager.add(repository.products[0])
|
|
177
|
+
wishlistManager.add(repository.products[1])
|
|
178
|
+
wishlistManager.add(repository.products[2])
|
|
183
179
|
|
|
184
180
|
return WishlistView()
|
|
185
181
|
.environmentObject(CartManager())
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
/* Begin PBXBuildFile section */
|
|
10
10
|
05AB6789B92B473FDDB2A6B7 /* ShopTemplateApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C30A03C68C2D7F820EAC006 /* ShopTemplateApp.swift */; };
|
|
11
|
+
0BDF26809F70BAFBF777A737 /* ProductEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = C44A79B53178AD70D41B16F2 /* ProductEntity.swift */; };
|
|
11
12
|
1746CCDBDE9118FE96179159 /* MockDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = A480143A736AC90866C7E70E /* MockDataProvider.swift */; };
|
|
12
13
|
1BFEF2A51B91AC78F9AA8903 /* CheckoutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A1657159DF7C193465E29AF /* CheckoutView.swift */; };
|
|
13
14
|
1D9B402EA1B843B7F2BA3BA1 /* ProductListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22FFF3DC6EE793BB94C8BC2F /* ProductListView.swift */; };
|
|
@@ -15,21 +16,33 @@
|
|
|
15
16
|
33B151EF7AD7F540F4C3BD5D /* StoreLocatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6650DC0D4ECEFBEE02534C7 /* StoreLocatorView.swift */; };
|
|
16
17
|
35E723AF87CFABDA4A8F0022 /* WishlistView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 230135BE44964CD0682A87CC /* WishlistView.swift */; };
|
|
17
18
|
39E2B297686648D426AE6250 /* ModelsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF99F33CB7B8681C21B3CE6A /* ModelsTests.swift */; };
|
|
19
|
+
44D2A3E84856C022541D00FF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1804070E7C7DF9C1F7A4CCBF /* Assets.xcassets */; };
|
|
18
20
|
46B21704B7426DF2BD12169C /* MockDataProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9146680560B4379A0C5770F /* MockDataProviderTests.swift */; };
|
|
19
21
|
50E8E980417443CEB4C4BC5F /* LocalPersistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB1AC5D8399C05EDF70D5F48 /* LocalPersistence.swift */; };
|
|
22
|
+
598798EAB3BD8BB108890937 /* EmptyStateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E60A4B69294C20F9F6B678E /* EmptyStateView.swift */; };
|
|
20
23
|
601C8EEEA656A114329A22ED /* NetworkMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = D683103EAB7E7E161BBBE974 /* NetworkMonitor.swift */; };
|
|
21
24
|
686113F607170981FBF700E8 /* AuthFlowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D8D63388B80B5EE63FD7D6E /* AuthFlowView.swift */; };
|
|
22
25
|
6891947544BA2647868FF9F3 /* ProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9133C1FE4C6115D39FB66C0 /* ProfileView.swift */; };
|
|
26
|
+
72A3DBBC7690040F68A214C5 /* DataSourceResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8D304DACA04F8A385976116 /* DataSourceResolver.swift */; };
|
|
23
27
|
78BCB1C0B6B43FF7A8CA911A /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2671B5905726C346D3134F18 /* AppState.swift */; };
|
|
24
28
|
7BEB6FBB7F8B4C7EA1DF24ED /* CommonComponents.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBFA5D5654F38E42BF4AA792 /* CommonComponents.swift */; };
|
|
25
29
|
8BFE2DA4CF228AD007A46FC0 /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79BB56EB7BBD9F084420C7B8 /* Colors.swift */; };
|
|
30
|
+
98C13691C4E5C4F3CED11234 /* BannerEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3082AB27FB7B6A00ABA07FA6 /* BannerEntity.swift */; };
|
|
31
|
+
9F7B2C539107B6D212FBDF43 /* OrderEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = B739538BA3A0FB160550A747 /* OrderEntity.swift */; };
|
|
32
|
+
A4452340EB430FF8DB272C58 /* CategoryEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81547DCFD93985CBCC8D2B2B /* CategoryEntity.swift */; };
|
|
26
33
|
A5D5BD005897B15C5D8451D7 /* ProductDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38DC480EBFA894D4F50F1370 /* ProductDetailView.swift */; };
|
|
27
34
|
ABB03FC1F1B555902BB46C8F /* OrdersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23BC4EF504F38E46ADA31E0D /* OrdersView.swift */; };
|
|
28
35
|
C131CF5DBE368B657C294B28 /* SyncManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE41BCF6E18BB2815A0D3B9F /* SyncManager.swift */; };
|
|
36
|
+
CCCEDAA4425D97F39D0FF753 /* CoreDataStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 790B6C468DBDF47E5B11B53E /* CoreDataStack.swift */; };
|
|
29
37
|
CF773882DEAC2A7078030050 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2F940FE5B80C6B18AF8DA7F /* Models.swift */; };
|
|
30
38
|
CFC3C09BF5E2D6E33D22C853 /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BA0FC3F57950F429CC41687 /* HomeView.swift */; };
|
|
39
|
+
D0856705F8024C5BCE779CC9 /* DataRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11F326F7CCC17A08F73C4C3B /* DataRepository.swift */; };
|
|
31
40
|
D8469E85CF423C5C738EE1D3 /* AppConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF95AF4E4EBCE88565E5F620 /* AppConfig.swift */; };
|
|
41
|
+
DE55CA6972860A20F4E307B8 /* Strings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32F7F26FC7EC5A251381CBFC /* Strings.swift */; };
|
|
42
|
+
E2B3A09BBC458F533697FDC3 /* DataRepositoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95F640640E57D0872033B6D0 /* DataRepositoryTests.swift */; };
|
|
32
43
|
F8BB126EDCA99AC48A81DDC2 /* OfflineBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9E40FBF2180840FCF5A40D2 /* OfflineBanner.swift */; };
|
|
44
|
+
F8E7808D94C5A220903A640A /* ReviewEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = C51565D1FE9BDC3E552AC7D5 /* ReviewEntity.swift */; };
|
|
45
|
+
FCC289955D251ADFF9D81AAD /* LocalStorageProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 652C5954EF22B270DB04F11C /* LocalStorageProvider.swift */; };
|
|
33
46
|
FE597009F1F266E53AE5129E /* OnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC2AD0482B13782B0D93241 /* OnboardingView.swift */; };
|
|
34
47
|
/* End PBXBuildFile section */
|
|
35
48
|
|
|
@@ -46,25 +59,38 @@
|
|
|
46
59
|
/* Begin PBXFileReference section */
|
|
47
60
|
0BA0FC3F57950F429CC41687 /* HomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeView.swift; sourceTree = "<group>"; };
|
|
48
61
|
0D8D63388B80B5EE63FD7D6E /* AuthFlowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthFlowView.swift; sourceTree = "<group>"; };
|
|
62
|
+
11F326F7CCC17A08F73C4C3B /* DataRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataRepository.swift; sourceTree = "<group>"; };
|
|
63
|
+
1804070E7C7DF9C1F7A4CCBF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
|
49
64
|
22FFF3DC6EE793BB94C8BC2F /* ProductListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductListView.swift; sourceTree = "<group>"; };
|
|
50
65
|
230135BE44964CD0682A87CC /* WishlistView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WishlistView.swift; sourceTree = "<group>"; };
|
|
51
66
|
23BC4EF504F38E46ADA31E0D /* OrdersView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrdersView.swift; sourceTree = "<group>"; };
|
|
52
67
|
2671B5905726C346D3134F18 /* AppState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppState.swift; sourceTree = "<group>"; };
|
|
53
68
|
2A1657159DF7C193465E29AF /* CheckoutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckoutView.swift; sourceTree = "<group>"; };
|
|
69
|
+
3082AB27FB7B6A00ABA07FA6 /* BannerEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BannerEntity.swift; sourceTree = "<group>"; };
|
|
70
|
+
32F7F26FC7EC5A251381CBFC /* Strings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Strings.swift; sourceTree = "<group>"; };
|
|
54
71
|
38DC480EBFA894D4F50F1370 /* ProductDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDetailView.swift; sourceTree = "<group>"; };
|
|
72
|
+
652C5954EF22B270DB04F11C /* LocalStorageProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalStorageProvider.swift; sourceTree = "<group>"; };
|
|
73
|
+
6E60A4B69294C20F9F6B678E /* EmptyStateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyStateView.swift; sourceTree = "<group>"; };
|
|
74
|
+
790B6C468DBDF47E5B11B53E /* CoreDataStack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataStack.swift; sourceTree = "<group>"; };
|
|
55
75
|
79BB56EB7BBD9F084420C7B8 /* Colors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Colors.swift; sourceTree = "<group>"; };
|
|
56
76
|
7C30A03C68C2D7F820EAC006 /* ShopTemplateApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShopTemplateApp.swift; sourceTree = "<group>"; };
|
|
77
|
+
81547DCFD93985CBCC8D2B2B /* CategoryEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CategoryEntity.swift; sourceTree = "<group>"; };
|
|
57
78
|
8751F53AE9F17F38633AC4E9 /* CartView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartView.swift; sourceTree = "<group>"; };
|
|
58
79
|
8EC3A6540E15DCDCACE7DF5C /* ShopTemplateTests.xctest */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = ShopTemplateTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
80
|
+
95F640640E57D0872033B6D0 /* DataRepositoryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataRepositoryTests.swift; sourceTree = "<group>"; };
|
|
59
81
|
985B5984354D55611CCED223 /* ShopTemplate.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = ShopTemplate.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
60
82
|
A480143A736AC90866C7E70E /* MockDataProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockDataProvider.swift; sourceTree = "<group>"; };
|
|
61
83
|
A6650DC0D4ECEFBEE02534C7 /* StoreLocatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreLocatorView.swift; sourceTree = "<group>"; };
|
|
62
84
|
AB1AC5D8399C05EDF70D5F48 /* LocalPersistence.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalPersistence.swift; sourceTree = "<group>"; };
|
|
85
|
+
B739538BA3A0FB160550A747 /* OrderEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderEntity.swift; sourceTree = "<group>"; };
|
|
63
86
|
B9146680560B4379A0C5770F /* MockDataProviderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockDataProviderTests.swift; sourceTree = "<group>"; };
|
|
64
87
|
B9E40FBF2180840FCF5A40D2 /* OfflineBanner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OfflineBanner.swift; sourceTree = "<group>"; };
|
|
65
88
|
BBFA5D5654F38E42BF4AA792 /* CommonComponents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommonComponents.swift; sourceTree = "<group>"; };
|
|
66
89
|
BE41BCF6E18BB2815A0D3B9F /* SyncManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncManager.swift; sourceTree = "<group>"; };
|
|
90
|
+
C44A79B53178AD70D41B16F2 /* ProductEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductEntity.swift; sourceTree = "<group>"; };
|
|
91
|
+
C51565D1FE9BDC3E552AC7D5 /* ReviewEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReviewEntity.swift; sourceTree = "<group>"; };
|
|
67
92
|
C6E392D8B84C8400137A00E7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
|
|
93
|
+
C8D304DACA04F8A385976116 /* DataSourceResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataSourceResolver.swift; sourceTree = "<group>"; };
|
|
68
94
|
CDC2AD0482B13782B0D93241 /* OnboardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingView.swift; sourceTree = "<group>"; };
|
|
69
95
|
D683103EAB7E7E161BBBE974 /* NetworkMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkMonitor.swift; sourceTree = "<group>"; };
|
|
70
96
|
D9133C1FE4C6115D39FB66C0 /* ProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileView.swift; sourceTree = "<group>"; };
|
|
@@ -151,6 +177,8 @@
|
|
|
151
177
|
84B111662C2032FABDEA3501 /* Core */ = {
|
|
152
178
|
isa = PBXGroup;
|
|
153
179
|
children = (
|
|
180
|
+
6E60A4B69294C20F9F6B678E /* EmptyStateView.swift */,
|
|
181
|
+
32F7F26FC7EC5A251381CBFC /* Strings.swift */,
|
|
154
182
|
D8A88E20C731FBE78FDE6706 /* Components */,
|
|
155
183
|
B13E7F49D3E521106C8C4726 /* Theme */,
|
|
156
184
|
);
|
|
@@ -185,6 +213,7 @@
|
|
|
185
213
|
A57513AB67D4CCF7B0D44BB3 /* Resources */ = {
|
|
186
214
|
isa = PBXGroup;
|
|
187
215
|
children = (
|
|
216
|
+
1804070E7C7DF9C1F7A4CCBF /* Assets.xcassets */,
|
|
188
217
|
C6E392D8B84C8400137A00E7 /* Info.plist */,
|
|
189
218
|
);
|
|
190
219
|
path = Resources;
|
|
@@ -219,9 +248,12 @@
|
|
|
219
248
|
CE5C2816C11AAC402910331E /* Data */ = {
|
|
220
249
|
isa = PBXGroup;
|
|
221
250
|
children = (
|
|
251
|
+
11F326F7CCC17A08F73C4C3B /* DataRepository.swift */,
|
|
252
|
+
C8D304DACA04F8A385976116 /* DataSourceResolver.swift */,
|
|
222
253
|
AB1AC5D8399C05EDF70D5F48 /* LocalPersistence.swift */,
|
|
223
254
|
D683103EAB7E7E161BBBE974 /* NetworkMonitor.swift */,
|
|
224
255
|
BE41BCF6E18BB2815A0D3B9F /* SyncManager.swift */,
|
|
256
|
+
CF8D20393EA31B3FDDBF1D57 /* LocalStorage */,
|
|
225
257
|
);
|
|
226
258
|
path = Data;
|
|
227
259
|
sourceTree = "<group>";
|
|
@@ -234,6 +266,20 @@
|
|
|
234
266
|
path = MockData;
|
|
235
267
|
sourceTree = "<group>";
|
|
236
268
|
};
|
|
269
|
+
CF8D20393EA31B3FDDBF1D57 /* LocalStorage */ = {
|
|
270
|
+
isa = PBXGroup;
|
|
271
|
+
children = (
|
|
272
|
+
3082AB27FB7B6A00ABA07FA6 /* BannerEntity.swift */,
|
|
273
|
+
81547DCFD93985CBCC8D2B2B /* CategoryEntity.swift */,
|
|
274
|
+
790B6C468DBDF47E5B11B53E /* CoreDataStack.swift */,
|
|
275
|
+
652C5954EF22B270DB04F11C /* LocalStorageProvider.swift */,
|
|
276
|
+
B739538BA3A0FB160550A747 /* OrderEntity.swift */,
|
|
277
|
+
C44A79B53178AD70D41B16F2 /* ProductEntity.swift */,
|
|
278
|
+
C51565D1FE9BDC3E552AC7D5 /* ReviewEntity.swift */,
|
|
279
|
+
);
|
|
280
|
+
path = LocalStorage;
|
|
281
|
+
sourceTree = "<group>";
|
|
282
|
+
};
|
|
237
283
|
D8A88E20C731FBE78FDE6706 /* Components */ = {
|
|
238
284
|
isa = PBXGroup;
|
|
239
285
|
children = (
|
|
@@ -246,6 +292,7 @@
|
|
|
246
292
|
DC40AFCF9AFEF730CA511E09 /* ShopTemplateTests */ = {
|
|
247
293
|
isa = PBXGroup;
|
|
248
294
|
children = (
|
|
295
|
+
95F640640E57D0872033B6D0 /* DataRepositoryTests.swift */,
|
|
249
296
|
B9146680560B4379A0C5770F /* MockDataProviderTests.swift */,
|
|
250
297
|
DF99F33CB7B8681C21B3CE6A /* ModelsTests.swift */,
|
|
251
298
|
);
|
|
@@ -317,6 +364,7 @@
|
|
|
317
364
|
buildConfigurationList = 777B0CFF2B140E7682FE6107 /* Build configuration list for PBXNativeTarget "ShopTemplate" */;
|
|
318
365
|
buildPhases = (
|
|
319
366
|
CC8C2CF4129891DE86C042D3 /* Sources */,
|
|
367
|
+
A3A21F9A1EC89A2B12812AAC /* Resources */,
|
|
320
368
|
);
|
|
321
369
|
buildRules = (
|
|
322
370
|
);
|
|
@@ -358,11 +406,23 @@
|
|
|
358
406
|
};
|
|
359
407
|
/* End PBXProject section */
|
|
360
408
|
|
|
409
|
+
/* Begin PBXResourcesBuildPhase section */
|
|
410
|
+
A3A21F9A1EC89A2B12812AAC /* Resources */ = {
|
|
411
|
+
isa = PBXResourcesBuildPhase;
|
|
412
|
+
buildActionMask = 2147483647;
|
|
413
|
+
files = (
|
|
414
|
+
44D2A3E84856C022541D00FF /* Assets.xcassets in Resources */,
|
|
415
|
+
);
|
|
416
|
+
runOnlyForDeploymentPostprocessing = 0;
|
|
417
|
+
};
|
|
418
|
+
/* End PBXResourcesBuildPhase section */
|
|
419
|
+
|
|
361
420
|
/* Begin PBXSourcesBuildPhase section */
|
|
362
421
|
6B6223E46F249C3C5C9CBDE7 /* Sources */ = {
|
|
363
422
|
isa = PBXSourcesBuildPhase;
|
|
364
423
|
buildActionMask = 2147483647;
|
|
365
424
|
files = (
|
|
425
|
+
E2B3A09BBC458F533697FDC3 /* DataRepositoryTests.swift in Sources */,
|
|
366
426
|
46B21704B7426DF2BD12169C /* MockDataProviderTests.swift in Sources */,
|
|
367
427
|
39E2B297686648D426AE6250 /* ModelsTests.swift in Sources */,
|
|
368
428
|
);
|
|
@@ -375,23 +435,34 @@
|
|
|
375
435
|
D8469E85CF423C5C738EE1D3 /* AppConfig.swift in Sources */,
|
|
376
436
|
78BCB1C0B6B43FF7A8CA911A /* AppState.swift in Sources */,
|
|
377
437
|
686113F607170981FBF700E8 /* AuthFlowView.swift in Sources */,
|
|
438
|
+
98C13691C4E5C4F3CED11234 /* BannerEntity.swift in Sources */,
|
|
378
439
|
298EF913407AC1D752033C91 /* CartView.swift in Sources */,
|
|
440
|
+
A4452340EB430FF8DB272C58 /* CategoryEntity.swift in Sources */,
|
|
379
441
|
1BFEF2A51B91AC78F9AA8903 /* CheckoutView.swift in Sources */,
|
|
380
442
|
8BFE2DA4CF228AD007A46FC0 /* Colors.swift in Sources */,
|
|
381
443
|
7BEB6FBB7F8B4C7EA1DF24ED /* CommonComponents.swift in Sources */,
|
|
444
|
+
CCCEDAA4425D97F39D0FF753 /* CoreDataStack.swift in Sources */,
|
|
445
|
+
D0856705F8024C5BCE779CC9 /* DataRepository.swift in Sources */,
|
|
446
|
+
72A3DBBC7690040F68A214C5 /* DataSourceResolver.swift in Sources */,
|
|
447
|
+
598798EAB3BD8BB108890937 /* EmptyStateView.swift in Sources */,
|
|
382
448
|
CFC3C09BF5E2D6E33D22C853 /* HomeView.swift in Sources */,
|
|
383
449
|
50E8E980417443CEB4C4BC5F /* LocalPersistence.swift in Sources */,
|
|
450
|
+
FCC289955D251ADFF9D81AAD /* LocalStorageProvider.swift in Sources */,
|
|
384
451
|
1746CCDBDE9118FE96179159 /* MockDataProvider.swift in Sources */,
|
|
385
452
|
CF773882DEAC2A7078030050 /* Models.swift in Sources */,
|
|
386
453
|
601C8EEEA656A114329A22ED /* NetworkMonitor.swift in Sources */,
|
|
387
454
|
F8BB126EDCA99AC48A81DDC2 /* OfflineBanner.swift in Sources */,
|
|
388
455
|
FE597009F1F266E53AE5129E /* OnboardingView.swift in Sources */,
|
|
456
|
+
9F7B2C539107B6D212FBDF43 /* OrderEntity.swift in Sources */,
|
|
389
457
|
ABB03FC1F1B555902BB46C8F /* OrdersView.swift in Sources */,
|
|
390
458
|
A5D5BD005897B15C5D8451D7 /* ProductDetailView.swift in Sources */,
|
|
459
|
+
0BDF26809F70BAFBF777A737 /* ProductEntity.swift in Sources */,
|
|
391
460
|
1D9B402EA1B843B7F2BA3BA1 /* ProductListView.swift in Sources */,
|
|
392
461
|
6891947544BA2647868FF9F3 /* ProfileView.swift in Sources */,
|
|
462
|
+
F8E7808D94C5A220903A640A /* ReviewEntity.swift in Sources */,
|
|
393
463
|
05AB6789B92B473FDDB2A6B7 /* ShopTemplateApp.swift in Sources */,
|
|
394
464
|
33B151EF7AD7F540F4C3BD5D /* StoreLocatorView.swift in Sources */,
|
|
465
|
+
DE55CA6972860A20F4E307B8 /* Strings.swift in Sources */,
|
|
395
466
|
C131CF5DBE368B657C294B28 /* SyncManager.swift in Sources */,
|
|
396
467
|
35E723AF87CFABDA4A8F0022 /* WishlistView.swift in Sources */,
|
|
397
468
|
);
|