kasy-cli 1.2.1
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/README.md +56 -0
- package/bin/kasy.js +529 -0
- package/docs/cli-reference.md +251 -0
- package/lib/commands/add.js +777 -0
- package/lib/commands/check.js +240 -0
- package/lib/commands/codemagic.js +161 -0
- package/lib/commands/deploy.js +257 -0
- package/lib/commands/docs.js +47 -0
- package/lib/commands/doctor.js +227 -0
- package/lib/commands/features.js +36 -0
- package/lib/commands/ios.js +206 -0
- package/lib/commands/new.js +1870 -0
- package/lib/commands/notifications.js +207 -0
- package/lib/commands/remove.js +466 -0
- package/lib/commands/run.js +75 -0
- package/lib/commands/update.js +382 -0
- package/lib/commands/validate.js +131 -0
- package/lib/scaffold/CHANGELOG.json +6 -0
- package/lib/scaffold/backends/api/.flutter-plugins-dependencies +1 -0
- package/lib/scaffold/backends/api/analysis_options.yaml +5 -0
- package/lib/scaffold/backends/api/generator.js +76 -0
- package/lib/scaffold/backends/api/patch/README.md +85 -0
- package/lib/scaffold/backends/api/patch/android/app/src/main/AndroidManifest.xml +87 -0
- package/lib/scaffold/backends/api/patch/ios/Runner/AppDelegate.swift +61 -0
- package/lib/scaffold/backends/api/patch/lib/core/data/api/meta_ads_api.dart +80 -0
- package/lib/scaffold/backends/api/patch/lib/core/data/api/storage_api.dart +117 -0
- package/lib/scaffold/backends/api/patch/lib/core/data/api/user_api.dart +148 -0
- package/lib/scaffold/backends/api/patch/lib/core/data/entities/json_converters.dart +35 -0
- package/lib/scaffold/backends/api/patch/lib/core/data/entities/user_entity.dart +48 -0
- package/lib/scaffold/backends/api/patch/lib/core/rating/widgets/review_popup.dart +211 -0
- package/lib/scaffold/backends/api/patch/lib/environnements.dart +151 -0
- package/lib/scaffold/backends/api/patch/lib/features/authentication/api/authentication_api.dart +303 -0
- package/lib/scaffold/backends/api/patch/lib/features/authentication/api/authentication_api_interface.dart +80 -0
- package/lib/scaffold/backends/api/patch/lib/features/authentication/repositories/authentication_repository.dart +406 -0
- package/lib/scaffold/backends/api/patch/lib/features/camera/xfile_extension.dart +6 -0
- package/lib/scaffold/backends/api/patch/lib/features/feedbacks/api/entities/feature_request_entity.dart +24 -0
- package/lib/scaffold/backends/api/patch/lib/features/feedbacks/api/entities/feature_vote_entity.dart +21 -0
- package/lib/scaffold/backends/api/patch/lib/features/feedbacks/api/feature_request_api.dart +52 -0
- package/lib/scaffold/backends/api/patch/lib/features/feedbacks/api/feature_vote_api.dart +60 -0
- package/lib/scaffold/backends/api/patch/lib/features/llm_chat/api/llm_chat_api.dart +58 -0
- package/lib/scaffold/backends/api/patch/lib/features/llm_chat/api/llm_chat_message_entity.dart +29 -0
- package/lib/scaffold/backends/api/patch/lib/features/notifications/api/device_api.dart +398 -0
- package/lib/scaffold/backends/api/patch/lib/features/notifications/api/entities/device_entity.dart +39 -0
- package/lib/scaffold/backends/api/patch/lib/features/notifications/api/entities/notifications_entity.dart +23 -0
- package/lib/scaffold/backends/api/patch/lib/features/notifications/api/notifications_api.dart +333 -0
- package/lib/scaffold/backends/api/patch/lib/features/notifications/providers/models/notification.dart +185 -0
- package/lib/scaffold/backends/api/patch/lib/features/onboarding/api/entities/user_info_entity.dart +26 -0
- package/lib/scaffold/backends/api/patch/lib/features/onboarding/api/user_infos_api.dart +107 -0
- package/lib/scaffold/backends/api/patch/lib/features/onboarding/models/user_info.dart +94 -0
- package/lib/scaffold/backends/api/patch/lib/features/onboarding/repositories/user_infos_repository.dart +29 -0
- package/lib/scaffold/backends/api/patch/lib/features/onboarding/ui/animations/movefade_anim.dart +34 -0
- package/lib/scaffold/backends/api/patch/lib/features/onboarding/ui/components/onboarding_att_setup.dart +66 -0
- package/lib/scaffold/backends/api/patch/lib/features/onboarding/ui/components/onboarding_notifications_setup.dart +73 -0
- package/lib/scaffold/backends/api/patch/lib/features/onboarding/ui/widgets/onboarding_radio_question.dart +173 -0
- package/lib/scaffold/backends/api/patch/lib/features/settings/ui/widgets/avatar_utils.dart +33 -0
- package/lib/scaffold/backends/api/patch/lib/features/subscription/api/entities/subscription_entity.dart +34 -0
- package/lib/scaffold/backends/api/patch/lib/features/subscription/api/subscription_api.dart +49 -0
- package/lib/scaffold/backends/api/patch/lib/features/subscription/shared/maybeshow_premium.dart +88 -0
- package/lib/scaffold/backends/api/patch/lib/main.dart +256 -0
- package/lib/scaffold/backends/api/patch/lib/router.dart +133 -0
- package/lib/scaffold/backends/api/pubspec.yaml.tpl +108 -0
- package/lib/scaffold/backends/firebase/deploy.js +1006 -0
- package/lib/scaffold/backends/firebase/generator.js +24 -0
- package/lib/scaffold/backends/firebase/setup-from-scratch.js +1008 -0
- package/lib/scaffold/backends/firebase/tokens.js +113 -0
- package/lib/scaffold/backends/supabase/.flutter-plugins-dependencies +1 -0
- package/lib/scaffold/backends/supabase/analysis_options.yaml +5 -0
- package/lib/scaffold/backends/supabase/config.toml +34 -0
- package/lib/scaffold/backends/supabase/deploy.js +485 -0
- package/lib/scaffold/backends/supabase/edge-functions/delete-user-account/README.md +15 -0
- package/lib/scaffold/backends/supabase/edge-functions/delete-user-account/index.ts +97 -0
- package/lib/scaffold/backends/supabase/edge-functions/llm-chat/index.ts +156 -0
- package/lib/scaffold/backends/supabase/edge-functions/meta-track-event/index.ts +292 -0
- package/lib/scaffold/backends/supabase/edge-functions/revenuecat-webhook/README.md +30 -0
- package/lib/scaffold/backends/supabase/edge-functions/revenuecat-webhook/index.ts +488 -0
- package/lib/scaffold/backends/supabase/edge-functions/send-push-notification/README.md +35 -0
- package/lib/scaffold/backends/supabase/edge-functions/send-push-notification/index.ts +314 -0
- package/lib/scaffold/backends/supabase/generator.js +108 -0
- package/lib/scaffold/backends/supabase/migrations/20240101000001_initial_schema.sql +149 -0
- package/lib/scaffold/backends/supabase/migrations/20240101000002_storage_bucket.sql +40 -0
- package/lib/scaffold/backends/supabase/migrations/20240101000005_vote_triggers.sql +34 -0
- package/lib/scaffold/backends/supabase/migrations/20240101000006_notification_webhook.sql +36 -0
- package/lib/scaffold/backends/supabase/migrations/20240101000007_welcome_notification.sql +64 -0
- package/lib/scaffold/backends/supabase/migrations/20240101000008_user_feature_requests.sql +2 -0
- package/lib/scaffold/backends/supabase/migrations/20240101000009_llm_messages.sql +22 -0
- package/lib/scaffold/backends/supabase/migrations/20240101000010_notification_image.sql +2 -0
- package/lib/scaffold/backends/supabase/patch/README.md +121 -0
- package/lib/scaffold/backends/supabase/patch/android/app/src/main/AndroidManifest.xml +87 -0
- package/lib/scaffold/backends/supabase/patch/ios/Runner/AppDelegate.swift +61 -0
- package/lib/scaffold/backends/supabase/patch/lib/core/data/api/meta_ads_api.dart +75 -0
- package/lib/scaffold/backends/supabase/patch/lib/core/data/api/storage_api.dart +83 -0
- package/lib/scaffold/backends/supabase/patch/lib/core/data/api/user_api.dart +143 -0
- package/lib/scaffold/backends/supabase/patch/lib/core/data/entities/json_converters.dart +35 -0
- package/lib/scaffold/backends/supabase/patch/lib/core/data/entities/user_entity.dart +48 -0
- package/lib/scaffold/backends/supabase/patch/lib/core/rating/widgets/review_popup.dart +211 -0
- package/lib/scaffold/backends/supabase/patch/lib/environnements.dart +149 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/authentication/api/authentication_api.dart +546 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/authentication/repositories/authentication_repository.dart +410 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/camera/xfile_extension.dart +6 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/feedbacks/api/entities/feature_request_entity.dart +25 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/feedbacks/api/entities/feature_vote_entity.dart +21 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/feedbacks/api/feature_request_api.dart +59 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/feedbacks/api/feature_vote_api.dart +85 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/feedbacks/ui/component/add_feature_form.dart +199 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/llm_chat/api/llm_chat_api.dart +47 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/llm_chat/api/llm_chat_message_entity.dart +30 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/llm_chat/providers/llm_chat_notifier.dart +266 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/notifications/api/device_api.dart +410 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/notifications/api/entities/device_entity.dart +51 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/notifications/api/entities/notifications_entity.dart +26 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/notifications/api/notifications_api.dart +317 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/notifications/providers/models/notification.dart +174 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/onboarding/api/entities/user_info_entity.dart +26 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/onboarding/api/user_infos_api.dart +90 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/onboarding/models/user_info.dart +94 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/onboarding/repositories/user_infos_repository.dart +29 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/onboarding/ui/animations/movefade_anim.dart +34 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/onboarding/ui/components/onboarding_att_setup.dart +66 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/onboarding/ui/components/onboarding_notifications_setup.dart +73 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/onboarding/ui/widgets/onboarding_radio_question.dart +173 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/settings/ui/widgets/avatar_utils.dart +35 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/subscription/api/entities/subscription_entity.dart +35 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/subscription/api/subscription_api.dart +44 -0
- package/lib/scaffold/backends/supabase/patch/lib/features/subscription/shared/maybeshow_premium.dart +85 -0
- package/lib/scaffold/backends/supabase/patch/lib/google_auth_options.dart +23 -0
- package/lib/scaffold/backends/supabase/patch/lib/main.dart +288 -0
- package/lib/scaffold/backends/supabase/patch/lib/router.dart +133 -0
- package/lib/scaffold/backends/supabase/pubspec.yaml.tpl +110 -0
- package/lib/scaffold/backends/supabase/tokens.js +9 -0
- package/lib/scaffold/catalog.js +177 -0
- package/lib/scaffold/engine.js +230 -0
- package/lib/scaffold/features/README.md +152 -0
- package/lib/scaffold/features/analytics/lib/core/data/api/analytics_api.dart +124 -0
- package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/BUG.es.md +35 -0
- package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/BUG.md +35 -0
- package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/BUG.pt.md +35 -0
- package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/feature_request.es.md +12 -0
- package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/feature_request.md +12 -0
- package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/feature_request.pt.md +12 -0
- package/lib/scaffold/features/ci/.github/PULL_REQUEST_TEMPLATE.es.md +17 -0
- package/lib/scaffold/features/ci/.github/PULL_REQUEST_TEMPLATE.md +17 -0
- package/lib/scaffold/features/ci/.github/PULL_REQUEST_TEMPLATE.pt.md +17 -0
- package/lib/scaffold/features/ci/.github/dependabot.yml +16 -0
- package/lib/scaffold/features/ci/.github/workflows/app.yml +20 -0
- package/lib/scaffold/features/ci/.gitlab/templates/deploy.yaml +14 -0
- package/lib/scaffold/features/ci/.gitlab/templates/dropbox.yaml +19 -0
- package/lib/scaffold/features/ci/.gitlab/templates/flutter.yaml +163 -0
- package/lib/scaffold/features/ci/.gitlab/templates/mailgun.yaml +28 -0
- package/lib/scaffold/features/ci/.gitlab-ci.yml +37 -0
- package/lib/scaffold/features/ci/codemagic.yaml +157 -0
- package/lib/scaffold/features/facebook/lib/core/data/api/tracking_api.dart +111 -0
- package/lib/scaffold/features/feedback/lib/features/feedbacks/api/entities/feature_request_entity.dart +27 -0
- package/lib/scaffold/features/feedback/lib/features/feedbacks/api/entities/feature_vote_entity.dart +27 -0
- package/lib/scaffold/features/feedback/lib/features/feedbacks/api/feature_request_api.dart +50 -0
- package/lib/scaffold/features/feedback/lib/features/feedbacks/api/feature_vote_api.dart +79 -0
- package/lib/scaffold/features/feedback/lib/features/feedbacks/models/feature_requests.dart +48 -0
- package/lib/scaffold/features/feedback/lib/features/feedbacks/models/feedback_state.dart +42 -0
- package/lib/scaffold/features/feedback/lib/features/feedbacks/providers/feedback_page_notifier.dart +147 -0
- package/lib/scaffold/features/feedback/lib/features/feedbacks/repositories/feature_request_repository.dart +95 -0
- package/lib/scaffold/features/feedback/lib/features/feedbacks/ui/component/add_feature_form.dart +199 -0
- package/lib/scaffold/features/feedback/lib/features/feedbacks/ui/feedback_page.dart +175 -0
- package/lib/scaffold/features/feedback/lib/features/feedbacks/ui/widgets/add_feature_button.dart +76 -0
- package/lib/scaffold/features/feedback/lib/features/feedbacks/ui/widgets/feature_card.dart +279 -0
- package/lib/scaffold/features/ios-release/.kasy/apple.env.example +8 -0
- package/lib/scaffold/features/ios-release/.kasy/codemagic.env.example +7 -0
- package/lib/scaffold/features/ios-release/docs/codemagic-release.en.md +50 -0
- package/lib/scaffold/features/ios-release/docs/codemagic-release.es.md +50 -0
- package/lib/scaffold/features/ios-release/docs/codemagic-release.pt.md +50 -0
- package/lib/scaffold/features/ios-release/docs/ios-release.en.md +41 -0
- package/lib/scaffold/features/ios-release/docs/ios-release.es.md +41 -0
- package/lib/scaffold/features/ios-release/docs/ios-release.pt.md +41 -0
- package/lib/scaffold/features/ios-release/scripts/bump-ios-version.js +38 -0
- package/lib/scaffold/features/ios-release/scripts/release-ios.sh +137 -0
- package/lib/scaffold/features/llm_chat/lib/features/llm_chat/llm_chat_page.dart +301 -0
- package/lib/scaffold/features/local_notifications/lib/features/local_reminder/providers/reminder_notifier.dart +81 -0
- package/lib/scaffold/features/local_notifications/lib/features/local_reminder/repositories/reminder_preferences.dart +76 -0
- package/lib/scaffold/features/local_notifications/lib/features/local_reminder/ui/reminder_page.dart +282 -0
- package/lib/scaffold/features/onboarding/lib/features/onboarding/api/entities/user_info_entity.dart +24 -0
- package/lib/scaffold/features/onboarding/lib/features/onboarding/api/user_infos_api.dart +71 -0
- package/lib/scaffold/features/onboarding/lib/features/onboarding/models/user_info.dart +92 -0
- package/lib/scaffold/features/onboarding/lib/features/onboarding/providers/onboarding_model.dart +15 -0
- package/lib/scaffold/features/onboarding/lib/features/onboarding/providers/onboarding_provider.dart +78 -0
- package/lib/scaffold/features/onboarding/lib/features/onboarding/repositories/user_infos_repository.dart +29 -0
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/animations/page_transitions.dart +30 -0
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_att_setup.dart +66 -0
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_features.dart +72 -0
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_loader.dart +92 -0
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_notifications_setup.dart +73 -0
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_questions.dart +89 -0
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/onboarding_page.dart +94 -0
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_background.dart +80 -0
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_feature.dart +139 -0
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_illustration_scaffold.dart +110 -0
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_progress.dart +84 -0
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_radio_question.dart +173 -0
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_reassurance.dart +45 -0
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_sticky_footer.dart +77 -0
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/selectable_row_tile.dart +392 -0
- package/lib/scaffold/features/revenuecat/lib/core/data/api/tracking_api.dart +116 -0
- package/lib/scaffold/features/revenuecat/lib/core/data/models/subscription.dart +322 -0
- package/lib/scaffold/features/revenuecat/lib/core/home_widgets/home_widget_background_task.dart +41 -0
- package/lib/scaffold/features/revenuecat/lib/core/states/user_state_notifier.dart +305 -0
- package/lib/scaffold/features/widget/lib/core/home_widgets/home_widget_background_task.dart +41 -0
- package/lib/scaffold/features/widget/lib/core/home_widgets/home_widget_mywidget_service.dart +57 -0
- package/lib/scaffold/features/widget/lib/core/home_widgets/home_widget_service.dart +54 -0
- package/lib/scaffold/features/widget/lib/features/settings/ui/components/admin/admin_home_widgets.dart +32 -0
- package/lib/scaffold/generate.js +370 -0
- package/lib/scaffold/patch.js +395 -0
- package/lib/scaffold/shared/backend-config.js +74 -0
- package/lib/scaffold/shared/fcm-service-account.js +126 -0
- package/lib/scaffold/shared/generator-utils.js +1664 -0
- package/lib/scaffold/shared/post-build.js +809 -0
- package/lib/scaffold/shared/template-strings.js +112 -0
- package/lib/utils/apple-release.js +273 -0
- package/lib/utils/checks.js +319 -0
- package/lib/utils/codemagic-release.js +127 -0
- package/lib/utils/fs.js +122 -0
- package/lib/utils/i18n.js +2123 -0
- package/lib/utils/license-gate.js +72 -0
- package/lib/utils/license.js +64 -0
- package/lib/utils/prompts.js +213 -0
- package/lib/utils/updates.js +97 -0
- package/package.json +55 -0
- package/templates/firebase/.env.example +24 -0
- package/templates/firebase/.firebaserc +5 -0
- package/templates/firebase/.kasy/apple.env.example +8 -0
- package/templates/firebase/.kasy/codemagic.env.example +7 -0
- package/templates/firebase/.metadata +30 -0
- package/templates/firebase/.windsurfrules +95 -0
- package/templates/firebase/Makefile +30 -0
- package/templates/firebase/README.en.md +180 -0
- package/templates/firebase/README.es.md +180 -0
- package/templates/firebase/README.md +180 -0
- package/templates/firebase/analysis_options.yaml +37 -0
- package/templates/firebase/android/app/build.gradle.kts +80 -0
- package/templates/firebase/android/app/src/debug/AndroidManifest.xml +7 -0
- package/templates/firebase/android/app/src/main/AndroidManifest.xml +93 -0
- package/templates/firebase/android/app/src/main/kotlin/com/aicrus/firebase/kit/MainActivity.kt +36 -0
- package/templates/firebase/android/app/src/main/kotlin/com/aicrus/firebase/kit/MyWidget.kt +50 -0
- package/templates/firebase/android/app/src/main/kotlin/com/aicrus/firebase/kit/MyWidgetReceiver.kt +7 -0
- package/templates/firebase/android/app/src/main/res/drawable/background.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable/launch_background.xml +9 -0
- package/templates/firebase/android/app/src/main/res/drawable-hdpi/splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-mdpi/splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-v21/background.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-v21/launch_background.xml +9 -0
- package/templates/firebase/android/app/src/main/res/drawable-xhdpi/splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-xxhdpi/splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-xxxhdpi/splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/templates/firebase/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/templates/firebase/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/templates/firebase/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/templates/firebase/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/templates/firebase/android/app/src/main/res/values/strings.xml +6 -0
- package/templates/firebase/android/app/src/main/res/values/styles.xml +22 -0
- package/templates/firebase/android/app/src/main/res/values-night/styles.xml +22 -0
- package/templates/firebase/android/app/src/main/res/values-night-v31/styles.xml +20 -0
- package/templates/firebase/android/app/src/main/res/values-v31/styles.xml +20 -0
- package/templates/firebase/android/app/src/main/res/xml/locales_config.xml +7 -0
- package/templates/firebase/android/app/src/main/res/xml/mywidget_info.xml +11 -0
- package/templates/firebase/android/app/src/profile/AndroidManifest.xml +7 -0
- package/templates/firebase/android/build.gradle.kts +28 -0
- package/templates/firebase/android/gradle/wrapper/gradle-wrapper.properties +5 -0
- package/templates/firebase/android/gradle.properties +2 -0
- package/templates/firebase/android/settings.gradle.kts +29 -0
- package/templates/firebase/assets/icons/apple.png +0 -0
- package/templates/firebase/assets/icons/facebook.png +0 -0
- package/templates/firebase/assets/icons/google.png +0 -0
- package/templates/firebase/assets/icons/google_play_games.png +0 -0
- package/templates/firebase/assets/images/app_icon.png +0 -0
- package/templates/firebase/assets/images/empty_notifications.jpg +0 -0
- package/templates/firebase/assets/images/icon.png +0 -0
- package/templates/firebase/assets/images/onboarding/authentication-login-template.jpg +0 -0
- package/templates/firebase/assets/images/onboarding/img1.jpg +0 -0
- package/templates/firebase/assets/images/onboarding/img2.jpg +0 -0
- package/templates/firebase/assets/images/onboarding/img3.jpg +0 -0
- package/templates/firebase/assets/images/onboarding/notifications.png +0 -0
- package/templates/firebase/assets/images/onboarding/onboarding.png +0 -0
- package/templates/firebase/assets/images/onboarding/purchase.png +0 -0
- package/templates/firebase/assets/images/premium-bg.jpg +0 -0
- package/templates/firebase/assets/images/premium-switch-header.png +0 -0
- package/templates/firebase/assets/images/review.png +0 -0
- package/templates/firebase/assets/images/splashscreen.png +0 -0
- package/templates/firebase/assets/images/update.png +0 -0
- package/templates/firebase/build.yaml +13 -0
- package/templates/firebase/devtools_options.yaml +3 -0
- package/templates/firebase/docs/auth-setup.en.md +145 -0
- package/templates/firebase/docs/auth-setup.es.md +145 -0
- package/templates/firebase/docs/auth-setup.pt.md +145 -0
- package/templates/firebase/docs/codemagic-release.en.md +50 -0
- package/templates/firebase/docs/codemagic-release.es.md +50 -0
- package/templates/firebase/docs/codemagic-release.pt.md +50 -0
- package/templates/firebase/docs/ios-release.en.md +41 -0
- package/templates/firebase/docs/ios-release.es.md +41 -0
- package/templates/firebase/docs/ios-release.pt.md +54 -0
- package/templates/firebase/docs/navigation-transitions.md +80 -0
- package/templates/firebase/docs/revenuecat-setup.es.md +341 -0
- package/templates/firebase/docs/revenuecat-setup.pt.md +341 -0
- package/templates/firebase/firebase.json +1 -0
- package/templates/firebase/firestore.indexes.json +25 -0
- package/templates/firebase/firestore.rules +51 -0
- package/templates/firebase/functions/.eslintrc.js +45 -0
- package/templates/firebase/functions/jest.config.js +16 -0
- package/templates/firebase/functions/package-lock.json +6876 -0
- package/templates/firebase/functions/package.json +33 -0
- package/templates/firebase/functions/src/authentication/functions.ts +30 -0
- package/templates/firebase/functions/src/authentication/triggers.ts +103 -0
- package/templates/firebase/functions/src/core/api/meta_ads_api.ts +390 -0
- package/templates/firebase/functions/src/core/data/entities/entity_utils.ts +87 -0
- package/templates/firebase/functions/src/core/data/entities/notification_entity.ts +74 -0
- package/templates/firebase/functions/src/core/data/entities/page.ts +4 -0
- package/templates/firebase/functions/src/core/data/entities/subscription_entity.ts +76 -0
- package/templates/firebase/functions/src/core/data/entities/user_device_entity.ts +64 -0
- package/templates/firebase/functions/src/core/data/entities/user_entity.ts +43 -0
- package/templates/firebase/functions/src/core/data/repositories/repositories.ts +16 -0
- package/templates/firebase/functions/src/core/data/repositories/subscription_repository.ts +42 -0
- package/templates/firebase/functions/src/core/data/repositories/user_device_repository.ts +31 -0
- package/templates/firebase/functions/src/core/data/repositories/user_notifications_repository.ts +58 -0
- package/templates/firebase/functions/src/core/data/repositories/user_repository.ts +84 -0
- package/templates/firebase/functions/src/core/logger/logger.ts +13 -0
- package/templates/firebase/functions/src/core/storage/storage_manager.ts +52 -0
- package/templates/firebase/functions/src/core/utils/async_utils.ts +5 -0
- package/templates/firebase/functions/src/feature_requests/triggers.ts +3 -0
- package/templates/firebase/functions/src/index.ts +24 -0
- package/templates/firebase/functions/src/llm_chat/index.ts +181 -0
- package/templates/firebase/functions/src/notifications/admin_functions.ts +91 -0
- package/templates/firebase/functions/src/notifications/models/notification.ts +61 -0
- package/templates/firebase/functions/src/notifications/notifications_api.ts +147 -0
- package/templates/firebase/functions/src/notifications/triggers.ts +102 -0
- package/templates/firebase/functions/src/subscriptions/models/revenuecat_events.ts +162 -0
- package/templates/firebase/functions/src/subscriptions/models/subscription_status.ts +18 -0
- package/templates/firebase/functions/src/subscriptions/models/subscriptions.ts +173 -0
- package/templates/firebase/functions/src/subscriptions/subscriptions_functions.ts +135 -0
- package/templates/firebase/functions/src/subscriptions/triggers.ts +35 -0
- package/templates/firebase/functions/src/test/core/data/entities/entity_utils.spec.ts +44 -0
- package/templates/firebase/functions/tsconfig.dev.json +5 -0
- package/templates/firebase/functions/tsconfig.json +18 -0
- package/templates/firebase/home_widget_config.json +30 -0
- package/templates/firebase/ios/Flutter/AppFrameworkInfo.plist +24 -0
- package/templates/firebase/ios/Flutter/Debug.xcconfig +2 -0
- package/templates/firebase/ios/Flutter/Profile.xcconfig +2 -0
- package/templates/firebase/ios/Flutter/Release.xcconfig +2 -0
- package/templates/firebase/ios/HomeWidgetExtension/HomeWidgetBundle.swift +13 -0
- package/templates/firebase/ios/HomeWidgetExtension/Info.plist +29 -0
- package/templates/firebase/ios/HomeWidgetExtension/MyWidget.swift +86 -0
- package/templates/firebase/ios/HomeWidgetExtension.entitlements +10 -0
- package/templates/firebase/ios/NotificationService/Info.plist +31 -0
- package/templates/firebase/ios/NotificationService/NotificationService.swift +76 -0
- package/templates/firebase/ios/Podfile +111 -0
- package/templates/firebase/ios/Runner/AppDelegate.swift +75 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +1 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json +21 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +23 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +5 -0
- package/templates/firebase/ios/Runner/Base.lproj/LaunchScreen.storyboard +44 -0
- package/templates/firebase/ios/Runner/Base.lproj/Main.storyboard +26 -0
- package/templates/firebase/ios/Runner/Info.plist +132 -0
- package/templates/firebase/ios/Runner/Runner-Bridging-Header.h +1 -0
- package/templates/firebase/ios/Runner/Runner.entitlements +14 -0
- package/templates/firebase/ios/Runner/es.lproj/InfoPlist.strings +10 -0
- package/templates/firebase/ios/Runner/pt-BR.lproj/InfoPlist.strings +10 -0
- package/templates/firebase/ios/Runner/pt.lproj/InfoPlist.strings +10 -0
- package/templates/firebase/ios/Runner.xcodeproj/project.pbxproj +1108 -0
- package/templates/firebase/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- package/templates/firebase/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/templates/firebase/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +8 -0
- package/templates/firebase/ios/Runner.xcodeproj/xcshareddata/xcschemes/NotificationService.xcscheme +58 -0
- package/templates/firebase/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +101 -0
- package/templates/firebase/ios/Runner.xcworkspace/contents.xcworkspacedata +10 -0
- package/templates/firebase/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/templates/firebase/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +8 -0
- package/templates/firebase/ios/RunnerTests/RunnerTests.swift +12 -0
- package/templates/firebase/lib/components/components.dart +27 -0
- package/templates/firebase/lib/components/kasy_accordion.dart +384 -0
- package/templates/firebase/lib/components/kasy_alert.dart +266 -0
- package/templates/firebase/lib/components/kasy_app_bar.dart +536 -0
- package/templates/firebase/lib/components/kasy_avatar.dart +549 -0
- package/templates/firebase/lib/components/kasy_avatar_presets.dart +104 -0
- package/templates/firebase/lib/components/kasy_badge.dart +278 -0
- package/templates/firebase/lib/components/kasy_bottom_sheet.dart +338 -0
- package/templates/firebase/lib/components/kasy_button.dart +926 -0
- package/templates/firebase/lib/components/kasy_card.dart +128 -0
- package/templates/firebase/lib/components/kasy_checkbox.dart +429 -0
- package/templates/firebase/lib/components/kasy_chip.dart +83 -0
- package/templates/firebase/lib/components/kasy_dialog.dart +789 -0
- package/templates/firebase/lib/components/kasy_otp_verification_bottom_sheet.dart +233 -0
- package/templates/firebase/lib/components/kasy_skeleton.dart +225 -0
- package/templates/firebase/lib/components/kasy_text_area.dart +392 -0
- package/templates/firebase/lib/components/kasy_text_field.dart +591 -0
- package/templates/firebase/lib/components/kasy_text_field_otp.dart +532 -0
- package/templates/firebase/lib/components/kasy_toast.dart +803 -0
- package/templates/firebase/lib/core/ads/ads_provider.dart +136 -0
- package/templates/firebase/lib/core/ads/ads_state.dart +15 -0
- package/templates/firebase/lib/core/animations/bottomfade_anim.dart +37 -0
- package/templates/firebase/lib/core/animations/movefade_anim.dart +34 -0
- package/templates/firebase/lib/core/animations/slideright_anim.dart +38 -0
- package/templates/firebase/lib/core/bottom_menu/bart_inner_paths.dart +5 -0
- package/templates/firebase/lib/core/bottom_menu/bottom_menu.dart +127 -0
- package/templates/firebase/lib/core/bottom_menu/bottom_router.dart +281 -0
- package/templates/firebase/lib/core/bottom_menu/kasy_bart_navigation.dart +22 -0
- package/templates/firebase/lib/core/bottom_menu/kasy_bottom_bar_factory.dart +127 -0
- package/templates/firebase/lib/core/bottom_menu/notification_bottom_item.dart +48 -0
- package/templates/firebase/lib/core/config/app_env.dart +100 -0
- package/templates/firebase/lib/core/config/features.dart +15 -0
- package/templates/firebase/lib/core/data/api/analytics_api.dart +124 -0
- package/templates/firebase/lib/core/data/api/base_api_exceptions.dart +28 -0
- package/templates/firebase/lib/core/data/api/firestore_retry.dart +29 -0
- package/templates/firebase/lib/core/data/api/http_client.dart +38 -0
- package/templates/firebase/lib/core/data/api/image.dart +52 -0
- package/templates/firebase/lib/core/data/api/remote_config_api.dart +170 -0
- package/templates/firebase/lib/core/data/api/storage_api.dart +115 -0
- package/templates/firebase/lib/core/data/api/tracking_api.dart +119 -0
- package/templates/firebase/lib/core/data/api/user_api.dart +115 -0
- package/templates/firebase/lib/core/data/entities/json_converters.dart +39 -0
- package/templates/firebase/lib/core/data/entities/upload_result.dart +48 -0
- package/templates/firebase/lib/core/data/entities/user_entity.dart +54 -0
- package/templates/firebase/lib/core/data/models/pageable.dart +12 -0
- package/templates/firebase/lib/core/data/models/subscription.dart +322 -0
- package/templates/firebase/lib/core/data/models/user.dart +107 -0
- package/templates/firebase/lib/core/data/repositories/user_repository.dart +130 -0
- package/templates/firebase/lib/core/dev_inspector/dev_inspector.dart +464 -0
- package/templates/firebase/lib/core/dev_inspector/dev_inspector_highlight.dart +88 -0
- package/templates/firebase/lib/core/dev_inspector/dev_inspector_info.dart +70 -0
- package/templates/firebase/lib/core/dev_inspector/dev_inspector_panel.dart +204 -0
- package/templates/firebase/lib/core/dev_inspector/dev_inspector_service.dart +321 -0
- package/templates/firebase/lib/core/extensions/date.ext.dart +32 -0
- package/templates/firebase/lib/core/guards/authenticated_guard.dart +37 -0
- package/templates/firebase/lib/core/guards/guard.dart +68 -0
- package/templates/firebase/lib/core/guards/user_info_guard.dart +55 -0
- package/templates/firebase/lib/core/haptics/haptic_feedback_notifier.dart +19 -0
- package/templates/firebase/lib/core/haptics/kasy_haptics.dart +27 -0
- package/templates/firebase/lib/core/home_widgets/home_widget_background_task.dart +41 -0
- package/templates/firebase/lib/core/home_widgets/home_widget_mywidget_service.dart +57 -0
- package/templates/firebase/lib/core/home_widgets/home_widget_service.dart +54 -0
- package/templates/firebase/lib/core/icons/kasy_icons.dart +86 -0
- package/templates/firebase/lib/core/initializer/models/run_state.dart +14 -0
- package/templates/firebase/lib/core/initializer/onstart_service.dart +38 -0
- package/templates/firebase/lib/core/initializer/onstart_widget.dart +83 -0
- package/templates/firebase/lib/core/initializer/pending_notification_handler.dart +48 -0
- package/templates/firebase/lib/core/keyboard_fix/keyboard_flicker_fix.dart +164 -0
- package/templates/firebase/lib/core/navigation/kasy_fade_page_transitions_builder.dart +34 -0
- package/templates/firebase/lib/core/navigation/kasy_material_page_route.dart +41 -0
- package/templates/firebase/lib/core/navigation/kasy_navigation_config.dart +29 -0
- package/templates/firebase/lib/core/navigation/kasy_page_transition.dart +40 -0
- package/templates/firebase/lib/core/navigation/kasy_route_transition.dart +68 -0
- package/templates/firebase/lib/core/navigation/kasy_transition_kind.dart +17 -0
- package/templates/firebase/lib/core/navigation/navigation.dart +6 -0
- package/templates/firebase/lib/core/rating/api/rating_api.dart +99 -0
- package/templates/firebase/lib/core/rating/models/rating.dart +52 -0
- package/templates/firebase/lib/core/rating/models/review.dart +70 -0
- package/templates/firebase/lib/core/rating/providers/rating_repository.dart +75 -0
- package/templates/firebase/lib/core/rating/widgets/rate_banner.dart +190 -0
- package/templates/firebase/lib/core/rating/widgets/rate_popup.dart +54 -0
- package/templates/firebase/lib/core/rating/widgets/review_popup.dart +175 -0
- package/templates/firebase/lib/core/security/biometric_copy_slot.dart +20 -0
- package/templates/firebase/lib/core/security/biometric_guard.dart +114 -0
- package/templates/firebase/lib/core/security/biometric_preference_notifier.dart +17 -0
- package/templates/firebase/lib/core/security/biometric_service.dart +79 -0
- package/templates/firebase/lib/core/security/biometric_ui_bundle.dart +136 -0
- package/templates/firebase/lib/core/security/secured_storage.dart +46 -0
- package/templates/firebase/lib/core/shared_preferences/shared_preferences.dart +70 -0
- package/templates/firebase/lib/core/sidebar/kasy_sidebar.dart +2021 -0
- package/templates/firebase/lib/core/states/components/maybe_ask_biometric_setup.dart +88 -0
- package/templates/firebase/lib/core/states/components/maybe_ask_rating.dart +49 -0
- package/templates/firebase/lib/core/states/components/maybe_show_update_bottom_sheet.dart +86 -0
- package/templates/firebase/lib/core/states/components/maybeshow_component.dart +110 -0
- package/templates/firebase/lib/core/states/events_dispatcher.dart +103 -0
- package/templates/firebase/lib/core/states/models/event_model.dart +118 -0
- package/templates/firebase/lib/core/states/models/user_state.dart +22 -0
- package/templates/firebase/lib/core/states/notifications_dispatcher.dart +81 -0
- package/templates/firebase/lib/core/states/translations.dart +11 -0
- package/templates/firebase/lib/core/states/user_state_notifier.dart +321 -0
- package/templates/firebase/lib/core/theme/colors.dart +262 -0
- package/templates/firebase/lib/core/theme/extensions/theme_extension.dart +48 -0
- package/templates/firebase/lib/core/theme/providers/kasy_theme.dart +76 -0
- package/templates/firebase/lib/core/theme/providers/theme_provider.dart +212 -0
- package/templates/firebase/lib/core/theme/radius.dart +33 -0
- package/templates/firebase/lib/core/theme/shadows.dart +64 -0
- package/templates/firebase/lib/core/theme/spacing.dart +44 -0
- package/templates/firebase/lib/core/theme/texts.dart +176 -0
- package/templates/firebase/lib/core/theme/theme.dart +24 -0
- package/templates/firebase/lib/core/theme/theme_data/theme_data.dart +32 -0
- package/templates/firebase/lib/core/theme/theme_data/theme_data_factory.dart +15 -0
- package/templates/firebase/lib/core/theme/universal_theme.dart +210 -0
- package/templates/firebase/lib/core/toast/toast_service.dart +55 -0
- package/templates/firebase/lib/core/ui/app_dialog.dart +26 -0
- package/templates/firebase/lib/core/web_device_preview/web_device_preview.dart +1126 -0
- package/templates/firebase/lib/core/widgets/debouncer.dart +31 -0
- package/templates/firebase/lib/core/widgets/kasy_hover.dart +166 -0
- package/templates/firebase/lib/core/widgets/kasy_pressable.dart +2 -0
- package/templates/firebase/lib/core/widgets/kasy_pressable_depth.dart +161 -0
- package/templates/firebase/lib/core/widgets/kasy_scroll_behavior.dart +17 -0
- package/templates/firebase/lib/core/widgets/keyboard_visibility.dart +75 -0
- package/templates/firebase/lib/core/widgets/page_background.dart +71 -0
- package/templates/firebase/lib/core/widgets/page_not_found.dart +15 -0
- package/templates/firebase/lib/core/widgets/responsive_layout.dart +215 -0
- package/templates/firebase/lib/core/widgets/update_bottom_sheet.dart +192 -0
- package/templates/firebase/lib/environnements.dart +160 -0
- package/templates/firebase/lib/features/authentication/api/authentication_api.dart +528 -0
- package/templates/firebase/lib/features/authentication/api/authentication_api_interface.dart +84 -0
- package/templates/firebase/lib/features/authentication/providers/models/email.dart +36 -0
- package/templates/firebase/lib/features/authentication/providers/models/password.dart +37 -0
- package/templates/firebase/lib/features/authentication/providers/models/phone_signin_state.dart +21 -0
- package/templates/firebase/lib/features/authentication/providers/models/recover_state.dart +21 -0
- package/templates/firebase/lib/features/authentication/providers/models/signin_state.dart +20 -0
- package/templates/firebase/lib/features/authentication/providers/models/signup_state.dart +20 -0
- package/templates/firebase/lib/features/authentication/providers/phone_auth_notifier.dart +132 -0
- package/templates/firebase/lib/features/authentication/providers/recover_provider.dart +51 -0
- package/templates/firebase/lib/features/authentication/providers/signin_state_provider.dart +166 -0
- package/templates/firebase/lib/features/authentication/providers/signup_state_provider.dart +67 -0
- package/templates/firebase/lib/features/authentication/repositories/authentication_repository.dart +399 -0
- package/templates/firebase/lib/features/authentication/repositories/exceptions/authentication_exceptions.dart +85 -0
- package/templates/firebase/lib/features/authentication/ui/components/apple_signin.dart +19 -0
- package/templates/firebase/lib/features/authentication/ui/components/facebook_signin.dart +19 -0
- package/templates/firebase/lib/features/authentication/ui/components/google_signin.dart +32 -0
- package/templates/firebase/lib/features/authentication/ui/components/otp_verification.dart +100 -0
- package/templates/firebase/lib/features/authentication/ui/components/phone_input.dart +109 -0
- package/templates/firebase/lib/features/authentication/ui/phone_auth_page.dart +60 -0
- package/templates/firebase/lib/features/authentication/ui/recover_password_page.dart +101 -0
- package/templates/firebase/lib/features/authentication/ui/signin_page.dart +321 -0
- package/templates/firebase/lib/features/authentication/ui/signup_page.dart +310 -0
- package/templates/firebase/lib/features/authentication/ui/widgets/auth_brand.dart +35 -0
- package/templates/firebase/lib/features/authentication/ui/widgets/auth_page_back_button.dart +149 -0
- package/templates/firebase/lib/features/authentication/ui/widgets/otp_input.dart +194 -0
- package/templates/firebase/lib/features/authentication/ui/widgets/recover_password_result.dart +62 -0
- package/templates/firebase/lib/features/authentication/ui/widgets/round_signin.dart +73 -0
- package/templates/firebase/lib/features/authentication/ui/widgets/social_separator.dart +26 -0
- package/templates/firebase/lib/features/dev/keyboard_test_page.dart +93 -0
- package/templates/firebase/lib/features/feedbacks/api/entities/feature_request_entity.dart +27 -0
- package/templates/firebase/lib/features/feedbacks/api/entities/feature_vote_entity.dart +27 -0
- package/templates/firebase/lib/features/feedbacks/api/feature_request_api.dart +51 -0
- package/templates/firebase/lib/features/feedbacks/api/feature_vote_api.dart +79 -0
- package/templates/firebase/lib/features/feedbacks/models/feature_requests.dart +48 -0
- package/templates/firebase/lib/features/feedbacks/models/feedback_state.dart +43 -0
- package/templates/firebase/lib/features/feedbacks/providers/feedback_page_notifier.dart +147 -0
- package/templates/firebase/lib/features/feedbacks/repositories/feature_request_repository.dart +92 -0
- package/templates/firebase/lib/features/feedbacks/ui/component/add_feature_form.dart +112 -0
- package/templates/firebase/lib/features/feedbacks/ui/feedback_page.dart +184 -0
- package/templates/firebase/lib/features/feedbacks/ui/widgets/add_feature_button.dart +66 -0
- package/templates/firebase/lib/features/feedbacks/ui/widgets/feature_card.dart +266 -0
- package/templates/firebase/lib/features/home/design_system_page.dart +552 -0
- package/templates/firebase/lib/features/home/home_components_page.dart +314 -0
- package/templates/firebase/lib/features/home/home_components_preview_page.dart +791 -0
- package/templates/firebase/lib/features/home/home_components_preview_registry.dart +7712 -0
- package/templates/firebase/lib/features/home/home_features_page.dart +207 -0
- package/templates/firebase/lib/features/home/home_page.dart +348 -0
- package/templates/firebase/lib/features/llm_chat/api/llm_chat_api.dart +50 -0
- package/templates/firebase/lib/features/llm_chat/api/llm_chat_message_entity.dart +35 -0
- package/templates/firebase/lib/features/llm_chat/llm_chat_page.dart +352 -0
- package/templates/firebase/lib/features/llm_chat/providers/llm_chat_notifier.dart +315 -0
- package/templates/firebase/lib/features/llm_chat/ui/widgets/llm_chat_avatars.dart +148 -0
- package/templates/firebase/lib/features/llm_chat/ui/widgets/llm_chat_composer.dart +124 -0
- package/templates/firebase/lib/features/local_reminder/providers/reminder_notifier.dart +81 -0
- package/templates/firebase/lib/features/local_reminder/repositories/reminder_preferences.dart +76 -0
- package/templates/firebase/lib/features/local_reminder/ui/reminder_page.dart +288 -0
- package/templates/firebase/lib/features/notifications/api/device_api.dart +433 -0
- package/templates/firebase/lib/features/notifications/api/entities/device_entity.dart +62 -0
- package/templates/firebase/lib/features/notifications/api/entities/notifications_entity.dart +35 -0
- package/templates/firebase/lib/features/notifications/api/local_notifier.dart +409 -0
- package/templates/firebase/lib/features/notifications/api/notifications_api.dart +319 -0
- package/templates/firebase/lib/features/notifications/providers/models/device.dart +27 -0
- package/templates/firebase/lib/features/notifications/providers/models/notification.dart +196 -0
- package/templates/firebase/lib/features/notifications/providers/models/notification_list.dart +38 -0
- package/templates/firebase/lib/features/notifications/providers/notifications_provider.dart +120 -0
- package/templates/firebase/lib/features/notifications/repositories/background_notification_handler.dart +13 -0
- package/templates/firebase/lib/features/notifications/repositories/device_repository.dart +137 -0
- package/templates/firebase/lib/features/notifications/repositories/notifications_repository.dart +214 -0
- package/templates/firebase/lib/features/notifications/shared/att_permission.dart +75 -0
- package/templates/firebase/lib/features/notifications/shared/notification_permission_bottom_sheet.dart +144 -0
- package/templates/firebase/lib/features/notifications/ui/components/notification_settings_sheet.dart +169 -0
- package/templates/firebase/lib/features/notifications/ui/components/notification_tile.dart +46 -0
- package/templates/firebase/lib/features/notifications/ui/components/notifications_header.dart +32 -0
- package/templates/firebase/lib/features/notifications/ui/components/push_notification_switcher.dart +106 -0
- package/templates/firebase/lib/features/notifications/ui/notifications_page.dart +202 -0
- package/templates/firebase/lib/features/notifications/ui/request_notification_permission.dart +84 -0
- package/templates/firebase/lib/features/notifications/ui/widgets/empty_notifications.dart +73 -0
- package/templates/firebase/lib/features/notifications/ui/widgets/notification_tile.dart +362 -0
- package/templates/firebase/lib/features/onboarding/api/entities/user_info_entity.dart +24 -0
- package/templates/firebase/lib/features/onboarding/api/user_infos_api.dart +71 -0
- package/templates/firebase/lib/features/onboarding/models/user_info.dart +92 -0
- package/templates/firebase/lib/features/onboarding/providers/onboarding_model.dart +15 -0
- package/templates/firebase/lib/features/onboarding/providers/onboarding_provider.dart +78 -0
- package/templates/firebase/lib/features/onboarding/repositories/user_infos_repository.dart +29 -0
- package/templates/firebase/lib/features/onboarding/ui/animations/page_transitions.dart +33 -0
- package/templates/firebase/lib/features/onboarding/ui/components/onboarding_att_setup.dart +66 -0
- package/templates/firebase/lib/features/onboarding/ui/components/onboarding_features.dart +76 -0
- package/templates/firebase/lib/features/onboarding/ui/components/onboarding_loader.dart +92 -0
- package/templates/firebase/lib/features/onboarding/ui/components/onboarding_notifications_setup.dart +76 -0
- package/templates/firebase/lib/features/onboarding/ui/components/onboarding_questions.dart +89 -0
- package/templates/firebase/lib/features/onboarding/ui/onboarding_page.dart +108 -0
- package/templates/firebase/lib/features/onboarding/ui/widgets/onboarding_background.dart +80 -0
- package/templates/firebase/lib/features/onboarding/ui/widgets/onboarding_feature.dart +145 -0
- package/templates/firebase/lib/features/onboarding/ui/widgets/onboarding_illustration_scaffold.dart +125 -0
- package/templates/firebase/lib/features/onboarding/ui/widgets/onboarding_progress.dart +84 -0
- package/templates/firebase/lib/features/onboarding/ui/widgets/onboarding_radio_question.dart +173 -0
- package/templates/firebase/lib/features/onboarding/ui/widgets/onboarding_reassurance.dart +44 -0
- package/templates/firebase/lib/features/onboarding/ui/widgets/onboarding_sticky_footer.dart +77 -0
- package/templates/firebase/lib/features/onboarding/ui/widgets/selectable_row_tile.dart +392 -0
- package/templates/firebase/lib/features/settings/settings_page.dart +460 -0
- package/templates/firebase/lib/features/settings/ui/components/admin/admin_bottom_sheet.dart +301 -0
- package/templates/firebase/lib/features/settings/ui/components/admin/admin_home_widgets.dart +38 -0
- package/templates/firebase/lib/features/settings/ui/components/admin/admin_paywalls.dart +53 -0
- package/templates/firebase/lib/features/settings/ui/components/admin/admin_routes.dart +22 -0
- package/templates/firebase/lib/features/settings/ui/components/admin/send_push_notification_page.dart +366 -0
- package/templates/firebase/lib/features/settings/ui/components/admin/send_push_notifier.dart +40 -0
- package/templates/firebase/lib/features/settings/ui/components/avatar_component.dart +430 -0
- package/templates/firebase/lib/features/settings/ui/components/delete_user_component.dart +28 -0
- package/templates/firebase/lib/features/settings/ui/components/language_switcher.dart +163 -0
- package/templates/firebase/lib/features/settings/ui/widgets/admin_card.dart +59 -0
- package/templates/firebase/lib/features/settings/ui/widgets/avatar_utils.dart +51 -0
- package/templates/firebase/lib/features/settings/ui/widgets/round_progress.dart +151 -0
- package/templates/firebase/lib/features/settings/ui/widgets/settings_bottom_sheet_option_tile.dart +52 -0
- package/templates/firebase/lib/features/settings/ui/widgets/settings_tile.dart +163 -0
- package/templates/firebase/lib/features/subscription/api/entities/subscription_entity.dart +40 -0
- package/templates/firebase/lib/features/subscription/api/inapp_subscription_api.dart +389 -0
- package/templates/firebase/lib/features/subscription/api/subscription_api.dart +39 -0
- package/templates/firebase/lib/features/subscription/providers/models/premium_state.dart +35 -0
- package/templates/firebase/lib/features/subscription/providers/premium_page_provider.dart +259 -0
- package/templates/firebase/lib/features/subscription/repositories/subscription_repository.dart +177 -0
- package/templates/firebase/lib/features/subscription/shared/maybeshow_premium.dart +85 -0
- package/templates/firebase/lib/features/subscription/ui/component/active_premium_content.dart +171 -0
- package/templates/firebase/lib/features/subscription/ui/component/paywall_minimal.dart +146 -0
- package/templates/firebase/lib/features/subscription/ui/component/paywall_row.dart +332 -0
- package/templates/firebase/lib/features/subscription/ui/component/paywall_with_switch.dart +207 -0
- package/templates/firebase/lib/features/subscription/ui/component/premium_content.dart +157 -0
- package/templates/firebase/lib/features/subscription/ui/component/premium_page_factory.dart +161 -0
- package/templates/firebase/lib/features/subscription/ui/premium_page.dart +139 -0
- package/templates/firebase/lib/features/subscription/ui/widgets/comparison_table.dart +346 -0
- package/templates/firebase/lib/features/subscription/ui/widgets/feature_line.dart +131 -0
- package/templates/firebase/lib/features/subscription/ui/widgets/paywall_empty_state.dart +68 -0
- package/templates/firebase/lib/features/subscription/ui/widgets/premium_background.dart +63 -0
- package/templates/firebase/lib/features/subscription/ui/widgets/premium_background_gradient.dart +53 -0
- package/templates/firebase/lib/features/subscription/ui/widgets/premium_banner.dart +80 -0
- package/templates/firebase/lib/features/subscription/ui/widgets/premium_bottom_menu.dart +102 -0
- package/templates/firebase/lib/features/subscription/ui/widgets/premium_card.dart +26 -0
- package/templates/firebase/lib/features/subscription/ui/widgets/premium_close_button.dart +61 -0
- package/templates/firebase/lib/features/subscription/ui/widgets/premium_feature.dart +39 -0
- package/templates/firebase/lib/features/subscription/ui/widgets/selectable_col.dart +377 -0
- package/templates/firebase/lib/features/subscription/ui/widgets/selectable_row.dart +436 -0
- package/templates/firebase/lib/features/subscription/ui/widgets/trial_switcher.dart +85 -0
- package/templates/firebase/lib/features/subscription/ui/widgets/unsubscribe_feedback_popup.dart +123 -0
- package/templates/firebase/lib/firebase_options.dart +75 -0
- package/templates/firebase/lib/google_auth_options.dart +10 -0
- package/templates/firebase/lib/i18n/app_locale_display.dart +17 -0
- package/templates/firebase/lib/i18n/en.i18n.json +514 -0
- package/templates/firebase/lib/i18n/es.i18n.json +514 -0
- package/templates/firebase/lib/i18n/pt.i18n.json +514 -0
- package/templates/firebase/lib/i18n/widgets/locale_code_badge.dart +47 -0
- package/templates/firebase/lib/main.dart +263 -0
- package/templates/firebase/lib/router.dart +226 -0
- package/templates/firebase/login-redesign-preview.png +0 -0
- package/templates/firebase/pubspec.yaml +177 -0
- package/templates/firebase/scripts/bump-ios-version.js +38 -0
- package/templates/firebase/scripts/release-ios.sh +137 -0
- package/templates/firebase/slang.yaml +7 -0
- package/templates/firebase/storage.rules +12 -0
- package/templates/firebase/test/core/data/api/analytics_api_fake.dart +25 -0
- package/templates/firebase/test/core/data/api/fake_remote_config_api.dart +45 -0
- package/templates/firebase/test/core/data/api/storage_api_fake.dart +28 -0
- package/templates/firebase/test/core/data/models/subscription_test.dart +42 -0
- package/templates/firebase/test/core/data/repositories/user_repository_test.dart +56 -0
- package/templates/firebase/test/core/guards/guard_test.dart +78 -0
- package/templates/firebase/test/core/navigation/kasy_page_transition_test.dart +30 -0
- package/templates/firebase/test/core/onstart_service_test.dart +18 -0
- package/templates/firebase/test/core/rating/rating_api_fake.dart +58 -0
- package/templates/firebase/test/core/rating/rating_banner_test.dart +117 -0
- package/templates/firebase/test/core/rating/rating_test.dart +60 -0
- package/templates/firebase/test/core/security/secured_storage_fake.dart +33 -0
- package/templates/firebase/test/core/states/event_dispatcher_test.dart +269 -0
- package/templates/firebase/test/core/states/user_state_notifier_test.dart +244 -0
- package/templates/firebase/test/core/widgets/responsive_layout_test.dart +50 -0
- package/templates/firebase/test/device_test_utils.dart +98 -0
- package/templates/firebase/test/features/authentication/data/api/auth_api_fake.dart +169 -0
- package/templates/firebase/test/features/authentication/data/api/user_api_fake.dart +86 -0
- package/templates/firebase/test/features/authentication/lost_password_page_test.dart +59 -0
- package/templates/firebase/test/features/authentication/repositories/authentication_repository_test.dart +88 -0
- package/templates/firebase/test/features/authentication/signin_page_test.dart +133 -0
- package/templates/firebase/test/features/authentication/signup_page_test.dart +136 -0
- package/templates/firebase/test/features/notifications/data/device_api_fake.dart +66 -0
- package/templates/firebase/test/features/notifications/data/fake_facebook_api.dart +40 -0
- package/templates/firebase/test/features/notifications/data/local_notifier_fake.dart +59 -0
- package/templates/firebase/test/features/notifications/data/notifications_api_fake.dart +120 -0
- package/templates/firebase/test/features/notifications/data/notifications_settings_fake.dart +34 -0
- package/templates/firebase/test/features/notifications/providers/device_repository_test.dart +68 -0
- package/templates/firebase/test/features/notifications/providers/notifications_repository_test.dart +74 -0
- package/templates/firebase/test/features/notifications/ui/notifications_page_test.dart +69 -0
- package/templates/firebase/test/features/subscription/api/fake_inapp_subscription_api.dart +85 -0
- package/templates/firebase/test/features/subscription/api/fake_revenuecat_product.dart +186 -0
- package/templates/firebase/test/features/subscription/api/fake_subscription_api.dart +11 -0
- package/templates/firebase/test/features/subscription/subscription_page_test.dart +119 -0
- package/templates/firebase/test/firebase_test_utils.dart +25 -0
- package/templates/firebase/test/test_utils.dart +272 -0
- package/templates/firebase/web/favicon.png +0 -0
- package/templates/firebase/web/firebase-messaging-sw.js +27 -0
- package/templates/firebase/web/icons/Icon-192.png +0 -0
- package/templates/firebase/web/icons/Icon-512.png +0 -0
- package/templates/firebase/web/icons/Icon-maskable-192.png +0 -0
- package/templates/firebase/web/icons/Icon-maskable-512.png +0 -0
- package/templates/firebase/web/index.html +110 -0
- package/templates/firebase/web/local_notifications.js +31 -0
- package/templates/firebase/web/manifest.json +35 -0
- package/templates/firebase/web/splash/img/dark-1x.png +0 -0
- package/templates/firebase/web/splash/img/dark-2x.png +0 -0
- package/templates/firebase/web/splash/img/dark-3x.png +0 -0
- package/templates/firebase/web/splash/img/dark-4x.png +0 -0
- package/templates/firebase/web/splash/img/light-1x.png +0 -0
- package/templates/firebase/web/splash/img/light-2x.png +0 -0
- package/templates/firebase/web/splash/img/light-3x.png +0 -0
- package/templates/firebase/web/splash/img/light-4x.png +0 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Publicar no iOS (App Store)
|
|
2
|
+
|
|
3
|
+
## Pré-requisitos
|
|
4
|
+
|
|
5
|
+
- Conta [Apple Developer](https://developer.apple.com) (paga)
|
|
6
|
+
- App criado no [App Store Connect](https://appstoreconnect.apple.com) com o mesmo **Bundle ID** do projeto
|
|
7
|
+
- Mac com Xcode e Flutter instalados
|
|
8
|
+
|
|
9
|
+
## Configuração única
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
kasy ios configure
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
O comando abre os links da Apple, pede a chave API (`.p8`) e grava `.kasy/apple.env` (não vai para o Git).
|
|
16
|
+
|
|
17
|
+
## Assinatura no Xcode (obrigatório uma vez)
|
|
18
|
+
|
|
19
|
+
O Kasy remove o `DEVELOPMENT_TEAM` do template para você usar sua conta Apple.
|
|
20
|
+
|
|
21
|
+
1. Abra `ios/Runner.xcworkspace` no Xcode.
|
|
22
|
+
2. Target **Runner** → **Signing & Capabilities** → marque **Automatically manage signing** e escolha seu **Team**.
|
|
23
|
+
|
|
24
|
+
Confira com `kasy doctor` (seção Release iOS).
|
|
25
|
+
|
|
26
|
+
## Envio do IPA
|
|
27
|
+
|
|
28
|
+
O comando usa **`xcrun altool`** com chave API (mesmo fluxo do CI do kit). Alternativa manual: app **Transporter** com o `.ipa` em `build/ios/ipa/`.
|
|
29
|
+
|
|
30
|
+
## Enviar nova versão
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
kasy ios release
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Isso incrementa o build no `pubspec.yaml`, gera o IPA e envia para a App Store Connect (sem Transporter).
|
|
37
|
+
|
|
38
|
+
Atalho: `make release-ios`
|
|
39
|
+
|
|
40
|
+
### Opções
|
|
41
|
+
|
|
42
|
+
- `kasy ios build` — só gera o IPA, sem enviar
|
|
43
|
+
- `kasy ios release --no-bump` — não incrementa o build
|
|
44
|
+
- `kasy ios release --version-name 1.0.1` — altera a versão visível
|
|
45
|
+
|
|
46
|
+
## Sem Mac?
|
|
47
|
+
|
|
48
|
+
Use build na nuvem: [codemagic-release.md](./codemagic-release.md) e `kasy codemagic configure` / `kasy codemagic release`.
|
|
49
|
+
|
|
50
|
+
## Verificar ambiente
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
kasy doctor
|
|
54
|
+
```
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Navigation transitions (Kasy Kit)
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Screen transitions are centralized under `lib/core/navigation/`.
|
|
6
|
+
**Android, iOS, and Web use the same animation** — not `Zoom` on Android and `Cupertino` on iOS.
|
|
7
|
+
|
|
8
|
+
## Change the default for the whole app
|
|
9
|
+
|
|
10
|
+
Edit [`lib/core/navigation/kasy_navigation_config.dart`](../lib/core/navigation/kasy_navigation_config.dart):
|
|
11
|
+
|
|
12
|
+
```dart
|
|
13
|
+
class KasyNavigationConfig {
|
|
14
|
+
static KasyTransitionKind push = KasyTransitionKind.fade; // change here
|
|
15
|
+
static const Duration duration = Duration(milliseconds: 250);
|
|
16
|
+
// ...
|
|
17
|
+
}
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
| Config field | Used for |
|
|
21
|
+
|--------------|----------|
|
|
22
|
+
| `push` | Most GoRouter routes (`kasyTransitionPage` without override) |
|
|
23
|
+
| `replace` | Reserved for replace-style navigation |
|
|
24
|
+
| `authPeer` | Login ↔ signup |
|
|
25
|
+
| `bottomTab` | Bottom menu tabs (Bart) |
|
|
26
|
+
| `onboardingStep` | Onboarding inner navigator |
|
|
27
|
+
|
|
28
|
+
## Add a new GoRouter route
|
|
29
|
+
|
|
30
|
+
Use `pageBuilder`, not `builder`:
|
|
31
|
+
|
|
32
|
+
```dart
|
|
33
|
+
GoRoute(
|
|
34
|
+
path: '/my_feature',
|
|
35
|
+
pageBuilder: (context, state) => kasyTransitionPage(
|
|
36
|
+
key: state.pageKey,
|
|
37
|
+
child: const MyFeaturePage(),
|
|
38
|
+
),
|
|
39
|
+
),
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Override for one route
|
|
43
|
+
|
|
44
|
+
```dart
|
|
45
|
+
pageBuilder: (context, state) => kasyTransitionPage(
|
|
46
|
+
key: state.pageKey,
|
|
47
|
+
transition: KasyTransitionKind.none,
|
|
48
|
+
child: const MyFeaturePage(),
|
|
49
|
+
),
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Legacy `Navigator.push`
|
|
53
|
+
|
|
54
|
+
Use `KasyMaterialPageRoute` instead of `MaterialPageRoute`:
|
|
55
|
+
|
|
56
|
+
```dart
|
|
57
|
+
Navigator.of(context).push(
|
|
58
|
+
KasyMaterialPageRoute(builder: (_) => const MyPage()),
|
|
59
|
+
);
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Transition kinds
|
|
63
|
+
|
|
64
|
+
| Kind | Description |
|
|
65
|
+
|------|-------------|
|
|
66
|
+
| `fade` | Crossfade (default push) |
|
|
67
|
+
| `fadeThrough` | Material fade-through |
|
|
68
|
+
| `sharedAxisScaled` | Depth / scale |
|
|
69
|
+
| `sharedAxisHorizontal` | Horizontal shared axis |
|
|
70
|
+
| `none` | No animation |
|
|
71
|
+
|
|
72
|
+
## What is NOT covered
|
|
73
|
+
|
|
74
|
+
- Dialogs (`showAppDialog`, `showGeneralDialog`)
|
|
75
|
+
- Bottom sheets (`showModalBottomSheet`)
|
|
76
|
+
- In-widget animations (`AnimatedSwitcher`, etc.)
|
|
77
|
+
|
|
78
|
+
## Fallback theme
|
|
79
|
+
|
|
80
|
+
[`universal_theme.dart`](../lib/core/theme/universal_theme.dart) uses `kasyPageTransitionsTheme` so any remaining `MaterialPageRoute` still fades consistently. Prefer `kasyTransitionPage` / `KasyMaterialPageRoute` for new code.
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
# Configurar RevenueCat
|
|
2
|
+
|
|
3
|
+
Guía para activar suscripciones y compras en la app después de que la CLI generó el proyecto.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Lo que la CLI ya hizo por ti
|
|
8
|
+
|
|
9
|
+
| Ya listo | Lo que falta |
|
|
10
|
+
|----------|--------------|
|
|
11
|
+
| Instaló `purchases_flutter` | Crear cuenta en RevenueCat |
|
|
12
|
+
| Configuró las claves en `Makefile` y `.vscode/launch.json` | Crear Productos, Entitlements y Offerings en el panel RC |
|
|
13
|
+
| Generó el código del paywall y del repositorio de suscripciones | Registrar la URL del webhook en el panel RC |
|
|
14
|
+
| Firebase: desplegó la Cloud Function del webhook | — |
|
|
15
|
+
| Supabase: desplegó la Edge Function del webhook | — |
|
|
16
|
+
|
|
17
|
+
> Las claves quedan en `.vscode/launch.json` y `Makefile`. Ambos archivos están en `.gitignore` — las claves nunca van al repositorio.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Paso 1 — Crear cuenta y proyecto en RevenueCat
|
|
22
|
+
|
|
23
|
+
1. Accede a [app.revenuecat.com](https://app.revenuecat.com) → crea una cuenta gratuita
|
|
24
|
+
2. Crea un proyecto → ponle un nombre (ej: nombre de tu app)
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Paso 2 — Crear la app en RevenueCat
|
|
29
|
+
|
|
30
|
+
Dentro del proyecto:
|
|
31
|
+
|
|
32
|
+
**Para empezar (Test Store — sin Apple/Google)**
|
|
33
|
+
|
|
34
|
+
Project → Apps → **+ Add app** → selecciona **Test Store** → copia la clave `test_xxx`.
|
|
35
|
+
|
|
36
|
+
Pega esa misma clave cuando la CLI la solicite tanto para iOS como para Android (o actualiza manualmente los archivos si el proyecto ya existía).
|
|
37
|
+
|
|
38
|
+
**Para producción**
|
|
39
|
+
|
|
40
|
+
Crea una app separada por plataforma:
|
|
41
|
+
- **App Store** → clave empieza con `appl_`
|
|
42
|
+
- **Google Play** → clave empieza con `goog_`
|
|
43
|
+
|
|
44
|
+
> ⚠️ **Regla crítica:** el tipo de app y el prefijo de clave deben coincidir. `Test Store` → `test_`, `App Store` → `appl_`, `Google Play` → `goog_`. Usar la clave incorrecta causa `INVALID_CREDENTIALS`.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Paso 3 — Crear Productos, Entitlements y Offerings
|
|
49
|
+
|
|
50
|
+
Puedes hacerlo desde el panel o pedirle a Claude con el MCP de RevenueCat ("Crea un producto `premium_monthly`, entitlement `premium_access` y offering `default`").
|
|
51
|
+
|
|
52
|
+
**Desde el panel RC** (misma URL para todos los proyectos):
|
|
53
|
+
|
|
54
|
+
1. [app.revenuecat.com](https://app.revenuecat.com) → tu proyecto → **Products** → `+ New`
|
|
55
|
+
- Crea los planes (ej: `premium_monthly`, `premium_annual`)
|
|
56
|
+
- Los IDs deben ser **idénticos** a los que crearás en App Store / Google Play
|
|
57
|
+
|
|
58
|
+
2. **Entitlements** → `+ New`
|
|
59
|
+
- Crea `premium_access` → haz clic en el entitlement → **Attach** → selecciona los productos
|
|
60
|
+
|
|
61
|
+
3. **Offerings** → `+ New`
|
|
62
|
+
- Crea `default` → entra al offering → `+ Add package` → selecciona los productos
|
|
63
|
+
|
|
64
|
+
> **Sobre los IDs de productos:** deben ser idénticos carácter por carácter. `premium_monthly` en App Store y `premium_monthly` en RC — cualquier diferencia y el producto no aparece en el paywall.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Paso 4 — Configurar el webhook
|
|
69
|
+
|
|
70
|
+
El webhook mantiene la tabla `subscriptions` de tu base de datos actualizada en cada compra, renovación o cancelación.
|
|
71
|
+
|
|
72
|
+
**La URL de la función ya fue desplegada por la CLI. Solo necesitas registrarla en RevenueCat.**
|
|
73
|
+
|
|
74
|
+
Encuentra la URL de la función:
|
|
75
|
+
|
|
76
|
+
| Backend | Dónde encontrar la URL |
|
|
77
|
+
|---------|------------------------|
|
|
78
|
+
| **Supabase** | `https://TU_PROJECT_REF.supabase.co/functions/v1/revenuecat-webhook` |
|
|
79
|
+
| **Firebase** | [Firebase Console → Functions](https://console.firebase.google.com/project/_/functions) → `subscriptionsOnRcPremiumUpdate` → copia la URL |
|
|
80
|
+
|
|
81
|
+
Regístrala en RevenueCat:
|
|
82
|
+
|
|
83
|
+
1. [app.revenuecat.com](https://app.revenuecat.com) → tu proyecto → **Integrations** → **Webhooks** → `+ Add webhook`
|
|
84
|
+
2. Rellena:
|
|
85
|
+
|
|
86
|
+
| Campo | Qué poner |
|
|
87
|
+
|-------|-----------|
|
|
88
|
+
| **Webhook name** | Cualquier nombre (ej: `firebase` o `supabase`) |
|
|
89
|
+
| **Webhook URL** | La URL de la función de arriba |
|
|
90
|
+
| **Authorization header value** | `Bearer ` + el valor de `REVENUECAT_WEBHOOK_KEY` (ej: `Bearer rc_wh_abc123`) |
|
|
91
|
+
| **Environment** | `Both Production and Sandbox` |
|
|
92
|
+
| **Events filter** | `All apps` / `All events` |
|
|
93
|
+
|
|
94
|
+
3. Haz clic en **Send test event** — si devuelve `200 OK`, está funcionando.
|
|
95
|
+
|
|
96
|
+
> ⚠️ **Header de autorización:** el campo debe contener `Bearer ` seguido de tu token — incluyendo el espacio. La función rechaza cualquier header que no siga ese formato.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Paso 5 — iOS: configurar en App Store Connect
|
|
101
|
+
|
|
102
|
+
Necesario cuando salgas del Test Store y quieras probar con compras reales en iPhone.
|
|
103
|
+
|
|
104
|
+
**Costo:** USD $99/año (Apple Developer Program)
|
|
105
|
+
|
|
106
|
+
Sigue exactamente este orden — omitir cualquier paso hace que los productos no aparezcan.
|
|
107
|
+
|
|
108
|
+
**1. Crear la cuenta Apple Developer**
|
|
109
|
+
|
|
110
|
+
[developer.apple.com](https://developer.apple.com) → crea la cuenta y paga los USD $99/año.
|
|
111
|
+
|
|
112
|
+
**2. Configurar negocios — obligatorio para que el Sandbox funcione**
|
|
113
|
+
|
|
114
|
+
> ⚠️ **Este es el paso más ignorado y el más bloqueante.** Sin él, el Sandbox devuelve lista vacía de productos aunque hayas hecho todo bien: cuenta RC, producto creado, Sandbox Tester configurado en el iPhone. Nada funciona.
|
|
115
|
+
|
|
116
|
+
[appstoreconnect.apple.com](https://appstoreconnect.apple.com) → menú superior → **Agreements, Tax, and Banking**:
|
|
117
|
+
|
|
118
|
+
- Acepta el **Paid Applications Agreement** (contrato de asociación con Apple)
|
|
119
|
+
- Registra la **cuenta bancaria** donde recibirás los pagos
|
|
120
|
+
- Completa los **formularios fiscales** (país, tipo de persona física o jurídica)
|
|
121
|
+
- Acepta las **conformidades** requeridas
|
|
122
|
+
- Si vas a vender en Europa: completa la información pública adicional exigida
|
|
123
|
+
|
|
124
|
+
Después de completar todo, **espera de 4 a 6 horas** para que las configuraciones se propaguen. Solo después de ese tiempo el Sandbox funcionará correctamente. Intentar antes devuelve lista vacía o errores genéricos.
|
|
125
|
+
|
|
126
|
+
**3. Crear la app en App Store Connect**
|
|
127
|
+
|
|
128
|
+
[appstoreconnect.apple.com](https://appstoreconnect.apple.com) → **My Apps** → `+` → **New App** → usa el mismo Bundle ID del proyecto Flutter.
|
|
129
|
+
|
|
130
|
+
**4. Crear las suscripciones**
|
|
131
|
+
|
|
132
|
+
App Store Connect → tu app → **Monetización** → **Suscripciones**:
|
|
133
|
+
|
|
134
|
+
a) **Crear el grupo de suscripciones** (ej: "Premium") — todas las suscripciones quedan dentro de un grupo.
|
|
135
|
+
|
|
136
|
+
b) **Configurar el período de gracia** (opcional pero recomendado): haz clic en **Período de gracia** → **Editar** → elige la duración. Recomendado: **3 días** para la mayoría de los apps. Sirve para mantener el acceso del suscriptor durante fallas temporales de pago antes de cancelar.
|
|
137
|
+
|
|
138
|
+
c) **Crear los productos** dentro del grupo:
|
|
139
|
+
- Agrega los productos con los mismos IDs de RevenueCat (ej: `subscription_monthly_01`)
|
|
140
|
+
- Completa: precio, duración, idioma de la suscripción y captura de pantalla
|
|
141
|
+
|
|
142
|
+
d) **Configurar el idioma del grupo** — paso que mucha gente olvida:
|
|
143
|
+
|
|
144
|
+
Dentro del grupo → sección **Idioma** → `+` → selecciona el idioma (ej: Inglés EE.UU.) → completa **Nombre de visualización del grupo** (ej: `premium`) → guarda.
|
|
145
|
+
|
|
146
|
+
> ⚠️ **Sin este paso los productos quedan atascados en "Missing Metadata"** y nunca avanzan a "Preparar para envío" ni "Listo para enviar", incluso con precio, idioma y captura de pantalla de la suscripción completados. El idioma del **grupo** es distinto al idioma de cada suscripción individual.
|
|
147
|
+
|
|
148
|
+
e) **Captura de pantalla de la suscripción** (obligatoria para envío a revisión):
|
|
149
|
+
|
|
150
|
+
Toma un screenshot del paywall de tu app corriendo en el simulador iOS o en el iPhone físico (`make run-ios` → abre la pantalla premium). Usa esa imagen en el campo **Captura de pantalla** de cada suscripción. El campo **Notas para el equipo de revisión** es opcional — puedes describir brevemente el producto.
|
|
151
|
+
|
|
152
|
+
Después de completar todo y configurar el idioma del grupo, el estado sale de **Missing Metadata** → **Preparar para envío** → **Listo para enviar**. Cualquiera de los dos últimos ya está correcto.
|
|
153
|
+
|
|
154
|
+
**5. Crear la app en RevenueCat como App Store**
|
|
155
|
+
|
|
156
|
+
[app.revenuecat.com](https://app.revenuecat.com) → tu proyecto → **Apps** → `+ Add app` → **App Store** → copia la clave `appl_xxx`.
|
|
157
|
+
|
|
158
|
+
Actualiza en los archivos del proyecto:
|
|
159
|
+
- `.vscode/launch.json` → reemplaza `RC_IOS_API_KEY`
|
|
160
|
+
- `Makefile` → reemplaza la misma variable en el bloque `DEFINES`
|
|
161
|
+
|
|
162
|
+
**6. Crear Sandbox Tester — obligatorio para probar en iPhone físico**
|
|
163
|
+
|
|
164
|
+
[appstoreconnect.apple.com](https://appstoreconnect.apple.com) → **Users and Access** → pestaña **Sandbox** → **Testers** → `+`
|
|
165
|
+
|
|
166
|
+
Crea un correo que **no tenga ninguna cuenta Apple asociada** (un Gmail nuevo funciona bien). El correo debe ser accesible — Apple envía un código de verificación para confirmar la cuenta.
|
|
167
|
+
|
|
168
|
+
> El Sandbox Tester **no es** una cuenta Apple ID real. Es una cuenta exclusiva para pruebas que solo funciona en el entorno Sandbox. Sin ella, el iPhone pide el Apple ID normal y la compra va a producción.
|
|
169
|
+
|
|
170
|
+
**7. Activar Developer Mode en el iPhone (iOS 16+)**
|
|
171
|
+
|
|
172
|
+
Obligatorio para ejecutar apps directamente desde Xcode/terminal en el dispositivo físico.
|
|
173
|
+
|
|
174
|
+
iPhone → **Ajustes** → **Privacidad y Seguridad** → desplázate hasta el final → **Modo Desarrollador** → actívalo → el iPhone reinicia para confirmar.
|
|
175
|
+
|
|
176
|
+
> Si la opción no aparece, conecta el iPhone al Mac con Xcode abierto al menos una vez — eso desbloqueará el Modo Desarrollador.
|
|
177
|
+
|
|
178
|
+
**8. Conectar la cuenta Sandbox en el iPhone**
|
|
179
|
+
|
|
180
|
+
En iPhones modernos (iOS 16+), la cuenta Sandbox está dentro de la sección Desarrollador:
|
|
181
|
+
|
|
182
|
+
iPhone → **Ajustes** → desplázate hasta el final → **Desarrollador** → desplázate hasta el final de la página → **Cuenta Sandbox** → **Iniciar sesión** → usa el correo y contraseña del Sandbox Tester creado.
|
|
183
|
+
|
|
184
|
+
> En versiones anteriores de iOS, el camino era Ajustes → App Store → Cuenta Sandbox. En iPhones actuales el camino correcto es a través del menú Desarrollador como se indica arriba.
|
|
185
|
+
|
|
186
|
+
**9. Configurar la clave P8 (recomendado para sandbox, obligatorio para producción)**
|
|
187
|
+
|
|
188
|
+
[appstoreconnect.apple.com](https://appstoreconnect.apple.com) → **Users and Access** → **Integrations** → **In-App Purchase** → `+` → descarga el `.p8` → pégalo en RevenueCat en **App Settings** → **In-App Purchase Key**.
|
|
189
|
+
|
|
190
|
+
> Solo puedes descargar la P8 una vez. Guárdala en un lugar seguro.
|
|
191
|
+
|
|
192
|
+
**9. Ejecutar en iPhone físico**
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
make run-ios
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Haz una compra — aparece el modal real de Apple. Con la cuenta Sandbox activa, la compra no genera ningún cargo.
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Paso 6 — Android: configurar en Google Play Console
|
|
203
|
+
|
|
204
|
+
Necesario cuando salgas del Test Store y quieras probar con compras reales en Android.
|
|
205
|
+
|
|
206
|
+
**Costo:** USD $25 (pago único)
|
|
207
|
+
|
|
208
|
+
**1. Crear la cuenta Google Play Developer**
|
|
209
|
+
|
|
210
|
+
[play.google.com/console](https://play.google.com/console) → crea la cuenta y paga los USD $25.
|
|
211
|
+
|
|
212
|
+
**2. Configurar el perfil de pago**
|
|
213
|
+
|
|
214
|
+
Google Play Console → **Configuración** (menú lateral principal) → **Cuenta de desarrollador** → **Perfil de pagos** → completa nombre legal, dirección y datos fiscales.
|
|
215
|
+
|
|
216
|
+
**3. Crear la app**
|
|
217
|
+
|
|
218
|
+
Google Play Console → **Crear app** → completa nombre, idioma y categoría.
|
|
219
|
+
|
|
220
|
+
**4. Publicar en el track de Pruebas Internas — obligatorio para crear suscripciones**
|
|
221
|
+
|
|
222
|
+
**Pruebas** → **Pruebas internas** → crea el release → sube un APK/AAB firmado → publica.
|
|
223
|
+
|
|
224
|
+
> La app no necesita estar completa — una versión de desarrollo firmada es suficiente.
|
|
225
|
+
|
|
226
|
+
**5. Crear las suscripciones**
|
|
227
|
+
|
|
228
|
+
Google Play Console → tu app → **Monetizar** → **Suscripciones** → `+ Crear suscripción`:
|
|
229
|
+
- Crea los productos con los mismos IDs de RevenueCat
|
|
230
|
+
- Déjalos en estado `Activo`
|
|
231
|
+
|
|
232
|
+
**6. Crear la Service Account (credencial de RevenueCat para Google)**
|
|
233
|
+
|
|
234
|
+
a) [console.cloud.google.com](https://console.cloud.google.com) → selecciona el proyecto del app → **APIs y servicios** → **Biblioteca** → activa:
|
|
235
|
+
- **Google Play Android Developer API**
|
|
236
|
+
- **Google Play Developer Reporting API**
|
|
237
|
+
|
|
238
|
+
b) **IAM y administración** → **Cuentas de servicio** → **+ Crear cuenta de servicio**:
|
|
239
|
+
- Nombre: `revenuecat-service` (o cualquier nombre)
|
|
240
|
+
- Roles: **Editor de Pub/Sub** + **Lector de supervisión**
|
|
241
|
+
- Haz clic en **Listo**
|
|
242
|
+
|
|
243
|
+
c) Haz clic en la cuenta creada → pestaña **Claves** → **Agregar clave** → **Crear nueva clave** → **JSON** → descarga el archivo.
|
|
244
|
+
|
|
245
|
+
d) Google Play Console → **Configuración** → **Usuarios y permisos** → **Invitar nuevos usuarios**:
|
|
246
|
+
- Correo: el correo de la Service Account (visible en Cloud Console)
|
|
247
|
+
- Permisos: **Gestionar pedidos y suscripciones** + **Gestionar informes financieros**
|
|
248
|
+
- Guarda
|
|
249
|
+
|
|
250
|
+
> Después de configurar, espera hasta 36 horas para que las credenciales se propaguen. Errores 503/521 en RC durante ese período son normales.
|
|
251
|
+
|
|
252
|
+
**7. Configurar en RevenueCat con credenciales de Google**
|
|
253
|
+
|
|
254
|
+
[app.revenuecat.com](https://app.revenuecat.com) → tu proyecto → **Apps** → `+ Add app` → **Google Play** → sube el archivo JSON → copia la clave `goog_xxx`.
|
|
255
|
+
|
|
256
|
+
Actualiza en los archivos del proyecto:
|
|
257
|
+
- `.vscode/launch.json` → reemplaza `RC_ANDROID_API_KEY`
|
|
258
|
+
- `Makefile` → reemplaza la misma variable en el bloque `DEFINES`
|
|
259
|
+
|
|
260
|
+
**8. Agregar License Tester — obligatorio para probar en el dispositivo**
|
|
261
|
+
|
|
262
|
+
Google Play Console → **Configuración** → **License testing** → agrega el correo de la cuenta Google que está en el dispositivo Android de prueba.
|
|
263
|
+
|
|
264
|
+
> Usa solo **una cuenta Google** en el dispositivo — varias cuentas causan fallas en las compras.
|
|
265
|
+
|
|
266
|
+
**9. Ejecutar en dispositivo Android**
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
make run-android
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Haz una compra — aparece el modal real de Google Play. En Sandbox, las suscripciones mensuales se renuevan cada 5 minutos.
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## Checklist rápido
|
|
277
|
+
|
|
278
|
+
### Test Store (sin Apple/Google)
|
|
279
|
+
|
|
280
|
+
- [ ] Cuenta y proyecto creados en RevenueCat
|
|
281
|
+
- [ ] App creada como **Test Store** — clave `test_xxx` pegada
|
|
282
|
+
- [ ] Productos, Entitlements y Offerings configurados en RC
|
|
283
|
+
- [ ] Webhook registrado en RC y probado (`200 OK`)
|
|
284
|
+
- [ ] La compra de prueba activa el entitlement correctamente
|
|
285
|
+
|
|
286
|
+
### iOS (App Store Connect)
|
|
287
|
+
|
|
288
|
+
- [ ] Apple Developer Program activo (USD $99/año)
|
|
289
|
+
- [ ] Paid Applications Agreement firmado
|
|
290
|
+
- [ ] Cuenta bancaria validada en App Store Connect
|
|
291
|
+
- [ ] App creada en App Store Connect con Bundle ID correcto
|
|
292
|
+
- [ ] Grupo de suscripciones creado con idioma configurado (sin esto los productos quedan en "Missing Metadata")
|
|
293
|
+
- [ ] Suscripciones creadas con IDs idénticos a RevenueCat, con precio, idioma y captura de pantalla completos
|
|
294
|
+
- [ ] Estado de las suscripciones en **Listo para enviar**
|
|
295
|
+
- [ ] App creada en RC como **App Store** — clave `appl_xxx` actualizada en los archivos
|
|
296
|
+
- [ ] Sandbox Tester creado en App Store Connect → Users and Access → Sandbox (correo sin cuenta Apple)
|
|
297
|
+
- [ ] Developer Mode activo en el iPhone (Ajustes → Privacidad y Seguridad → Modo Desarrollador)
|
|
298
|
+
- [ ] Cuenta Sandbox conectada en iPhone (Ajustes → Desarrollador → Cuenta Sandbox)
|
|
299
|
+
- [ ] Clave P8 configurada en RC
|
|
300
|
+
- [ ] Compra probada en iPhone físico
|
|
301
|
+
|
|
302
|
+
### Android (Google Play)
|
|
303
|
+
|
|
304
|
+
- [ ] Google Play Developer activo (USD $25)
|
|
305
|
+
- [ ] Perfil de pago configurado
|
|
306
|
+
- [ ] App creada y publicada en el track de Pruebas Internas
|
|
307
|
+
- [ ] Suscripciones creadas con IDs idénticos a RevenueCat
|
|
308
|
+
- [ ] APIs activadas en Google Cloud Console
|
|
309
|
+
- [ ] Service Account creada, JSON descargado e invitada en Google Play
|
|
310
|
+
- [ ] JSON de la Service Account subido a RC — clave `goog_xxx` actualizada en los archivos
|
|
311
|
+
- [ ] License Tester agregado en Google Play Console
|
|
312
|
+
- [ ] Solo una cuenta Google en el dispositivo de prueba
|
|
313
|
+
- [ ] Compra probada en dispositivo Android físico
|
|
314
|
+
|
|
315
|
+
---
|
|
316
|
+
|
|
317
|
+
## Errores comunes
|
|
318
|
+
|
|
319
|
+
**`INVALID_CREDENTIALS`** — el tipo de app en RC y el prefijo de la clave no coinciden. `Test Store` requiere clave `test_`, `App Store` requiere `appl_`, `Google Play` requiere `goog_`.
|
|
320
|
+
|
|
321
|
+
**Productos no aparecen en el paywall** — los IDs no son idénticos entre la tienda y RC, o el Paid Applications Agreement no está firmado (iOS), o la app no está publicada en el track interno (Android).
|
|
322
|
+
|
|
323
|
+
**Sandbox devuelve lista vacía (iOS)** — configuración de negocios incompleta en App Store Connect → Agreements, Tax, and Banking. Verifica: Paid Applications Agreement aceptado, cuenta bancaria registrada, formularios fiscales completados, conformidades aceptadas. Después de completar todo, espera de 4 a 6 horas antes de probar.
|
|
324
|
+
|
|
325
|
+
Verifica con:
|
|
326
|
+
|
|
327
|
+
```bash
|
|
328
|
+
kasy doctor
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
El `kasy doctor` muestra una sección **RevenueCat** automáticamente cuando el proyecto usa la feature. Ejemplo de salida:
|
|
332
|
+
|
|
333
|
+
```
|
|
334
|
+
RevenueCat
|
|
335
|
+
✓ Claves de API configuradas (iOS + Android)
|
|
336
|
+
⚠ Usando claves Test Store (test_) — reemplaza por appl_ y goog_ para producción
|
|
337
|
+
✓ URL del webhook (pega en RevenueCat → Integrations → Webhooks):
|
|
338
|
+
https://TU_PROJECT_REF.supabase.co/functions/v1/revenuecat-webhook
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
> Para proyectos Firebase, el `kasy doctor` indica dónde encontrar la URL en Firebase Console en lugar de mostrarla directamente.
|