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,30 @@
|
|
|
1
|
+
# Rode o app — Flutter escolhe o primeiro dispositivo disponível
|
|
2
|
+
# Uso: make run | make run-ios | make run-android | make run-web
|
|
3
|
+
# Hot reload: pressione 'r' no terminal enquanto o app roda
|
|
4
|
+
# run-ios/run-android: mostra lista de dispositivos — selecione iPhone, simulador ou Android
|
|
5
|
+
#
|
|
6
|
+
# Credenciais: crie um arquivo .dart_defines (gitignored) com uma flag por linha:
|
|
7
|
+
# --dart-define=RC_IOS_API_KEY=xxx
|
|
8
|
+
# --dart-define=RC_ANDROID_API_KEY=xxx
|
|
9
|
+
# --dart-define=MIXPANEL_TOKEN=xxx
|
|
10
|
+
# etc.
|
|
11
|
+
|
|
12
|
+
DEFINES := $(shell [ -f .dart_defines ] && cat .dart_defines | tr '\n' ' ')
|
|
13
|
+
|
|
14
|
+
.PHONY: run run-ios run-android run-web release-ios
|
|
15
|
+
|
|
16
|
+
# iOS App Store release (requires: kasy ios configure)
|
|
17
|
+
release-ios:
|
|
18
|
+
bash scripts/release-ios.sh
|
|
19
|
+
|
|
20
|
+
run:
|
|
21
|
+
flutter run $(DEFINES)
|
|
22
|
+
|
|
23
|
+
run-ios:
|
|
24
|
+
flutter run $(DEFINES)
|
|
25
|
+
|
|
26
|
+
run-android:
|
|
27
|
+
flutter run $(DEFINES)
|
|
28
|
+
|
|
29
|
+
run-web:
|
|
30
|
+
flutter run -d chrome $(DEFINES)
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# AppFirebase
|
|
2
|
+
|
|
3
|
+
Flutter app with Firebase backend — generated by kasy.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Documentation
|
|
8
|
+
|
|
9
|
+
Full Kasy documentation (CLI, iOS release, features, push, etc.) will be published at **[docs.kasy.dev](https://docs.kasy.dev)** (site coming soon).
|
|
10
|
+
|
|
11
|
+
In this project, use the local guides (links stay inside this repo only):
|
|
12
|
+
|
|
13
|
+
| Guide | Content |
|
|
14
|
+
|-------|---------|
|
|
15
|
+
| [docs/auth-setup.md](docs/auth-setup.md) | Enable Google, Apple and Facebook login |
|
|
16
|
+
| [docs/ios-release.md](docs/ios-release.md) | Publish to iOS on Mac (`kasy ios`) |
|
|
17
|
+
| [docs/codemagic-release.md](docs/codemagic-release.md) | Publish without a Mac (`kasy codemagic`) |
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Getting started
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
flutter run # auto-detects device
|
|
25
|
+
make run-ios # iOS
|
|
26
|
+
make run-android # Android
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**Physical device via cable**
|
|
30
|
+
- iOS: connect iPhone → trust this computer → Xcode → Window → Devices → pair
|
|
31
|
+
- Android: Settings → Developer options → enable USB debugging
|
|
32
|
+
|
|
33
|
+
**Backend deploy** (when ready):
|
|
34
|
+
|
|
35
|
+
```sh
|
|
36
|
+
kasy deploy
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Keys and credentials
|
|
42
|
+
|
|
43
|
+
This project uses two types of credentials. Understanding the difference avoids confusion when configuring.
|
|
44
|
+
|
|
45
|
+
### App keys (stay in the project)
|
|
46
|
+
|
|
47
|
+
They live in `.vscode/launch.json` as build environment variables (`--dart-define`). Flutter reads them via `String.fromEnvironment()`. **Never go to the server.**
|
|
48
|
+
|
|
49
|
+
| Variable | Module | How to get |
|
|
50
|
+
|----------|--------|------------|
|
|
51
|
+
| `RC_ANDROID_API_KEY` | RevenueCat | RevenueCat dashboard → Apps → Android → **Google Play** public key (`goog_…`) |
|
|
52
|
+
| `RC_IOS_API_KEY` | RevenueCat | RevenueCat dashboard → Apps → iOS → **Apple App Store** public key (`appl_…`) |
|
|
53
|
+
| `RC_WEB_API_KEY` | RevenueCat Web | RevenueCat dashboard → Apps → Web Billing → **production** key (`rcb_…`, not `rcb_sb_`) for release builds |
|
|
54
|
+
|
|
55
|
+
### RevenueCat: `test_` vs store keys (TestFlight / release)
|
|
56
|
+
|
|
57
|
+
- Keys starting with **`test_`** are RevenueCat **Test Store**: fine for **`flutter run` debug** on your Mac (fake purchases in RC’s test environment). **Do not** bake them into TestFlight/App Store IPAs — the SDK rejects them or the kit skips RC init.
|
|
58
|
+
- **TestFlight / Apple sandbox** (no real charges): use **store** public keys — **`appl_…`** (iOS) and **`goog_…`** (Android). TestFlight purchases still use **Apple/Google sandbox**, not real billing.
|
|
59
|
+
- The VS Code **Firebase — prod** config **no longer** sets RC keys; put `appl_` / `goog_` in **`Firebase/.env`** or **`.dart_defines`** (see `Makefile`) when building release / TestFlight.
|
|
60
|
+
- **Firebase — dev** still ships sample `test_` keys for local development only.
|
|
61
|
+
| `SENTRY_DSN` | Sentry | Dashboard Sentry → Project → DSN |
|
|
62
|
+
| `MIXPANEL_TOKEN` | Mixpanel | Dashboard Mixpanel → Settings → Token |
|
|
63
|
+
|
|
64
|
+
To update, edit `.vscode/launch.json` or pass via command line:
|
|
65
|
+
|
|
66
|
+
```sh
|
|
67
|
+
flutter run --dart-define=RC_ANDROID_API_KEY=your_key
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
### Server secrets (stay in GCP Secret Manager)
|
|
73
|
+
|
|
74
|
+
Used by **Cloud Functions** at runtime. **Never in the app code.**
|
|
75
|
+
|
|
76
|
+
| Secret | Used by | How to get |
|
|
77
|
+
|--------|---------|------------|
|
|
78
|
+
| `REVENUECAT_WEBHOOK_KEY` | Subscription webhook | Dashboard RevenueCat → Webhooks → Authorization header |
|
|
79
|
+
| `META_ACCESS_TOKEN` | Meta Conversions API | Meta Business Manager → System Users → Token |
|
|
80
|
+
| `META_DATASET_ID` | Meta Conversions API | Meta Business Manager → Events Manager → Dataset ID |
|
|
81
|
+
|
|
82
|
+
To configure or update each secret:
|
|
83
|
+
|
|
84
|
+
```sh
|
|
85
|
+
firebase functions:secrets:set REVENUECAT_WEBHOOK_KEY --project=YOUR_PROJECT_ID
|
|
86
|
+
firebase functions:secrets:set META_ACCESS_TOKEN --project=YOUR_PROJECT_ID
|
|
87
|
+
firebase functions:secrets:set META_DATASET_ID --project=YOUR_PROJECT_ID
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
> Each command asks for the value interactively. The value **does not appear** in the terminal.
|
|
91
|
+
|
|
92
|
+
To see existing secrets:
|
|
93
|
+
|
|
94
|
+
```sh
|
|
95
|
+
gcloud secrets list --project=YOUR_PROJECT_ID
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Internationalization (i18n)
|
|
101
|
+
|
|
102
|
+
The app supports **3 languages**: English (`en`), Portuguese (`pt`), and Spanish (`es`).
|
|
103
|
+
|
|
104
|
+
### How the language is chosen
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
App opens
|
|
108
|
+
├─ Has language saved by user? → use saved
|
|
109
|
+
└─ No → read device/browser language
|
|
110
|
+
├─ Is en, pt or es? → use that language
|
|
111
|
+
└─ None of these → use default language (base_locale)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Change default language (fallback)
|
|
115
|
+
|
|
116
|
+
When the user's device is in an unsupported language (e.g. Japanese, French), the app uses the **default language**. Default is English. To change to Portuguese:
|
|
117
|
+
|
|
118
|
+
**`slang.yaml`**
|
|
119
|
+
```yaml
|
|
120
|
+
base_locale: pt # change here: en | pt | es
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Then run:
|
|
124
|
+
```sh
|
|
125
|
+
dart run slang
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Add or edit translations
|
|
129
|
+
|
|
130
|
+
Files are in `lib/i18n/`:
|
|
131
|
+
- `en.i18n.json` — English
|
|
132
|
+
- `pt.i18n.json` — Portuguese
|
|
133
|
+
- `es.i18n.json` — Spanish
|
|
134
|
+
|
|
135
|
+
After editing any `.i18n.json`, always run `dart run slang` to regenerate `translations.g.dart`.
|
|
136
|
+
|
|
137
|
+
### Language selector
|
|
138
|
+
|
|
139
|
+
The user can change the language in **Settings → Language**. The choice is saved on the device and restored on next app open.
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## RevenueCat webhook
|
|
144
|
+
|
|
145
|
+
The webhook receives purchase events (new subscription, renewal, cancellation) from RevenueCat.
|
|
146
|
+
|
|
147
|
+
**In RevenueCat dashboard:** Webhooks → add function URL → Authorization header = value of `REVENUECAT_WEBHOOK_KEY`.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Deploy
|
|
152
|
+
|
|
153
|
+
```sh
|
|
154
|
+
# Full deploy (Functions + Firestore rules + Storage rules)
|
|
155
|
+
firebase deploy --only functions,firestore:rules,storage --project=YOUR_PROJECT_ID
|
|
156
|
+
|
|
157
|
+
# Functions only
|
|
158
|
+
firebase deploy --only functions --project=YOUR_PROJECT_ID
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## Publish to iOS (App Store)
|
|
164
|
+
|
|
165
|
+
Full guide: [docs/ios-release.md](docs/ios-release.md)
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
kasy ios configure # once — Apple credentials
|
|
169
|
+
kasy ios release # build IPA and upload to App Store Connect
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
No Mac: [docs/codemagic-release.md](docs/codemagic-release.md)
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Security
|
|
177
|
+
|
|
178
|
+
`.gitignore` already excludes: `firebase_key.json`, `.env`, `.env.*`, `*.pem`, `*.keystore`, `.kasy/apple.env`, `.kasy/codemagic.env`.
|
|
179
|
+
|
|
180
|
+
Never commit credentials to the repository.
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# AppFirebase
|
|
2
|
+
|
|
3
|
+
App Flutter con backend Firebase — generado por kasy.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Documentación
|
|
8
|
+
|
|
9
|
+
La documentación completa de Kasy (CLI, release iOS, features, push, etc.) se publicará en **[docs.kasy.dev](https://docs.kasy.dev)** (sitio en preparación).
|
|
10
|
+
|
|
11
|
+
En este proyecto, usa las guías locales (solo enlaces dentro del repositorio):
|
|
12
|
+
|
|
13
|
+
| Guía | Contenido |
|
|
14
|
+
|------|-----------|
|
|
15
|
+
| [docs/auth-setup.md](docs/auth-setup.md) | Activar login con Google, Apple y Facebook |
|
|
16
|
+
| [docs/ios-release.md](docs/ios-release.md) | Publicar en iOS con Mac (`kasy ios`) |
|
|
17
|
+
| [docs/codemagic-release.md](docs/codemagic-release.md) | Publicar sin Mac (`kasy codemagic`) |
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Cómo empezar
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
flutter run # detecta el dispositivo automáticamente
|
|
25
|
+
make run-ios # iOS
|
|
26
|
+
make run-android # Android
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**Dispositivo físico por cable**
|
|
30
|
+
- iOS: conecta el iPhone → confía en este ordenador → Xcode → Window → Devices → emparejar
|
|
31
|
+
- Android: Configuración → Opciones de desarrollador → activar depuración USB
|
|
32
|
+
|
|
33
|
+
**Deploy del backend** (cuando estés listo):
|
|
34
|
+
|
|
35
|
+
```sh
|
|
36
|
+
kasy deploy
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Claves y credenciales
|
|
42
|
+
|
|
43
|
+
Este proyecto usa dos tipos de credenciales. Entender la diferencia evita confusión al configurar.
|
|
44
|
+
|
|
45
|
+
### Claves del app (quedan en el proyecto)
|
|
46
|
+
|
|
47
|
+
Están en `.vscode/launch.json` como variables de entorno de build (`--dart-define`). Flutter las lee vía `String.fromEnvironment()`. **Nunca van al servidor.**
|
|
48
|
+
|
|
49
|
+
| Variable | Módulo | Cómo obtener |
|
|
50
|
+
|----------|--------|--------------|
|
|
51
|
+
| `RC_ANDROID_API_KEY` | RevenueCat | Panel RevenueCat → Apps → Android → clave pública **Google Play** (`goog_…`) |
|
|
52
|
+
| `RC_IOS_API_KEY` | RevenueCat | Panel RevenueCat → Apps → iOS → clave pública **Apple App Store** (`appl_…`) |
|
|
53
|
+
| `RC_WEB_API_KEY` | RevenueCat Web | Panel RevenueCat → Apps → Web Billing → clave **producción** (`rcb_…`, no `rcb_sb_`) en builds release |
|
|
54
|
+
|
|
55
|
+
### RevenueCat: `test_` vs tienda (TestFlight / release)
|
|
56
|
+
|
|
57
|
+
- Clave **`test_`** = **Test Store** de RevenueCat: sirve para **`flutter run` en debug** en tu Mac. **No** la empaques en IPA de TestFlight/App Store.
|
|
58
|
+
- **TestFlight / sandbox de Apple** (sin cobro real): usa claves de **tienda** — **`appl_…`** (iOS) y **`goog_…`** (Android).
|
|
59
|
+
- La config **Firebase — prod** en VS Code **ya no** define RC; pon `appl_` / `goog_` en **`.env`** o **`.dart_defines`** al generar release / TestFlight.
|
|
60
|
+
- **Firebase — dev** sigue con `test_` de ejemplo solo para desarrollo local.
|
|
61
|
+
| `SENTRY_DSN` | Sentry | Dashboard Sentry → Proyecto → DSN |
|
|
62
|
+
| `MIXPANEL_TOKEN` | Mixpanel | Dashboard Mixpanel → Configuración → Token |
|
|
63
|
+
|
|
64
|
+
Para actualizar, edita `.vscode/launch.json` o pasa por línea de comandos:
|
|
65
|
+
|
|
66
|
+
```sh
|
|
67
|
+
flutter run --dart-define=RC_ANDROID_API_KEY=tu_clave
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
### Secrets del servidor (quedan en Secret Manager de GCP)
|
|
73
|
+
|
|
74
|
+
Usados por las **Cloud Functions** en tiempo de ejecución. **Nunca en el código del app.**
|
|
75
|
+
|
|
76
|
+
| Secret | Usado por | Cómo obtener |
|
|
77
|
+
|--------|-----------|--------------|
|
|
78
|
+
| `REVENUECAT_WEBHOOK_KEY` | Webhook de suscripciones | Dashboard RevenueCat → Webhooks → Authorization header |
|
|
79
|
+
| `META_ACCESS_TOKEN` | Meta Conversions API | Meta Business Manager → System Users → Token |
|
|
80
|
+
| `META_DATASET_ID` | Meta Conversions API | Meta Business Manager → Events Manager → Dataset ID |
|
|
81
|
+
|
|
82
|
+
Para configurar o actualizar cada secret:
|
|
83
|
+
|
|
84
|
+
```sh
|
|
85
|
+
firebase functions:secrets:set REVENUECAT_WEBHOOK_KEY --project=YOUR_PROJECT_ID
|
|
86
|
+
firebase functions:secrets:set META_ACCESS_TOKEN --project=YOUR_PROJECT_ID
|
|
87
|
+
firebase functions:secrets:set META_DATASET_ID --project=YOUR_PROJECT_ID
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
> Cada comando pide el valor de forma interactiva. El valor **no aparece** en la terminal.
|
|
91
|
+
|
|
92
|
+
Para ver los secrets existentes:
|
|
93
|
+
|
|
94
|
+
```sh
|
|
95
|
+
gcloud secrets list --project=YOUR_PROJECT_ID
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Internacionalización (i18n)
|
|
101
|
+
|
|
102
|
+
El app soporta **3 idiomas**: inglés (`en`), portugués (`pt`) y español (`es`).
|
|
103
|
+
|
|
104
|
+
### Cómo se elige el idioma
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
App abre
|
|
108
|
+
├─ ¿Tiene idioma guardado por el usuario? → usa el guardado
|
|
109
|
+
└─ No → lee el idioma del dispositivo/navegador
|
|
110
|
+
├─ ¿Es en, pt o es? → usa ese idioma
|
|
111
|
+
└─ No es ninguno → usa el idioma por defecto (base_locale)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Cambiar idioma por defecto (fallback)
|
|
115
|
+
|
|
116
|
+
Cuando el dispositivo del usuario está en un idioma no soportado (ej: japonés, francés), el app usa el **idioma por defecto**. Por defecto es inglés. Para cambiar a portugués:
|
|
117
|
+
|
|
118
|
+
**`slang.yaml`**
|
|
119
|
+
```yaml
|
|
120
|
+
base_locale: pt # cambiar aquí: en | pt | es
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Luego ejecuta:
|
|
124
|
+
```sh
|
|
125
|
+
dart run slang
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Añadir o editar traducciones
|
|
129
|
+
|
|
130
|
+
Los archivos están en `lib/i18n/`:
|
|
131
|
+
- `en.i18n.json` — inglés
|
|
132
|
+
- `pt.i18n.json` — portugués
|
|
133
|
+
- `es.i18n.json` — español
|
|
134
|
+
|
|
135
|
+
Tras editar cualquier `.i18n.json`, siempre ejecuta `dart run slang` para regenerar `translations.g.dart`.
|
|
136
|
+
|
|
137
|
+
### Selector de idioma
|
|
138
|
+
|
|
139
|
+
El usuario puede cambiar el idioma en **Configuración → Idioma**. La elección se guarda en el dispositivo y se restaura en la próxima apertura del app.
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Webhook RevenueCat
|
|
144
|
+
|
|
145
|
+
El webhook recibe eventos de compra (nueva suscripción, renovación, cancelación) de RevenueCat.
|
|
146
|
+
|
|
147
|
+
**En el dashboard de RevenueCat:** Webhooks → añadir URL de la función → Authorization header = valor de `REVENUECAT_WEBHOOK_KEY`.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Deploy
|
|
152
|
+
|
|
153
|
+
```sh
|
|
154
|
+
# Deploy completo (Functions + reglas Firestore + reglas Storage)
|
|
155
|
+
firebase deploy --only functions,firestore:rules,storage --project=YOUR_PROJECT_ID
|
|
156
|
+
|
|
157
|
+
# Solo Functions
|
|
158
|
+
firebase deploy --only functions --project=YOUR_PROJECT_ID
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## Publicar en iOS (App Store)
|
|
164
|
+
|
|
165
|
+
Guía completa: [docs/ios-release.md](docs/ios-release.md)
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
kasy ios configure # una vez — credenciales Apple
|
|
169
|
+
kasy ios release # genera IPA y sube a App Store Connect
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Sin Mac: [docs/codemagic-release.md](docs/codemagic-release.md)
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Seguridad
|
|
177
|
+
|
|
178
|
+
El `.gitignore` ya excluye: `firebase_key.json`, `.env`, `.env.*`, `*.pem`, `*.keystore`, `.kasy/apple.env`, `.kasy/codemagic.env`.
|
|
179
|
+
|
|
180
|
+
Nunca subas credenciales al repositorio.
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# AppFirebase
|
|
2
|
+
|
|
3
|
+
Flutter app com backend Firebase — gerado pelo kasy.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Documentação
|
|
8
|
+
|
|
9
|
+
A documentação completa do Kasy (CLI, release iOS, features, push, etc.) será publicada em **[docs.kasy.dev](https://docs.kasy.dev)** (site em construção).
|
|
10
|
+
|
|
11
|
+
Neste projeto, use os guias locais (não linkam para fora do repositório):
|
|
12
|
+
|
|
13
|
+
| Guia | Conteúdo |
|
|
14
|
+
|------|----------|
|
|
15
|
+
| [docs/auth-setup.md](docs/auth-setup.md) | Ativar login com Google, Apple e Facebook |
|
|
16
|
+
| [docs/ios-release.md](docs/ios-release.md) | Publicar no iOS com Mac (`kasy ios`) |
|
|
17
|
+
| [docs/codemagic-release.md](docs/codemagic-release.md) | Publicar sem Mac (`kasy codemagic`) |
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Como começar
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
flutter run # detecta o dispositivo automaticamente
|
|
25
|
+
make run-ios # iOS
|
|
26
|
+
make run-android # Android
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**Dispositivo físico via cabo**
|
|
30
|
+
- iOS: conecte o iPhone → confie neste computador → Xcode → Window → Devices → parear
|
|
31
|
+
- Android: Configurações → Opções do desenvolvedor → ativar depuração USB
|
|
32
|
+
|
|
33
|
+
**Deploy do backend** (quando estiver pronto):
|
|
34
|
+
|
|
35
|
+
```sh
|
|
36
|
+
kasy deploy
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Chaves e credenciais
|
|
42
|
+
|
|
43
|
+
Este projeto usa dois tipos de credenciais. Entender a diferença evita confusão na hora de configurar.
|
|
44
|
+
|
|
45
|
+
### Chaves do app (ficam no projeto)
|
|
46
|
+
|
|
47
|
+
Ficam no `.vscode/launch.json` como variáveis de ambiente de build (`--dart-define`). O Flutter lê via `String.fromEnvironment()`. **Nunca vão para o servidor.**
|
|
48
|
+
|
|
49
|
+
| Variável | Módulo | Como obter |
|
|
50
|
+
|----------|--------|------------|
|
|
51
|
+
| `RC_ANDROID_API_KEY` | RevenueCat | Dashboard RevenueCat → Apps → Android → chave pública **Google Play** (`goog_…`) |
|
|
52
|
+
| `RC_IOS_API_KEY` | RevenueCat | Dashboard RevenueCat → Apps → iOS → chave pública **Apple App Store** (`appl_…`) |
|
|
53
|
+
| `RC_WEB_API_KEY` | RevenueCat Web | Dashboard RevenueCat → Apps → Web Billing → chave **produção** (`rcb_…`, não `rcb_sb_`) em builds release |
|
|
54
|
+
|
|
55
|
+
### RevenueCat: `test_` vs loja (TestFlight / release)
|
|
56
|
+
|
|
57
|
+
- Chave que começa com **`test_`** = **Test Store** da RevenueCat: serve para **`flutter run` em debug** no Mac (compras fictícias no ambiente de teste da RC). **Não** use em IPA de TestFlight/App Store — o SDK bloqueia ou o app ignora o RC (comportamento atual do kit).
|
|
58
|
+
- **TestFlight / sandbox da Apple** (compras sem cobrar de verdade): use no IPA as chaves públicas de **loja** — **`appl_…`** (iOS) e **`goog_…`** (Android). No TestFlight as compras ainda são **sandbox** da Apple/Google, não cobrança real.
|
|
59
|
+
- A configuração **Firebase — prod** no VS Code **não** define mais RC; coloque `appl_` / `goog_` no seu **`.env`** na raiz do `Firebase/` ou em **`.dart_defines`** (ver `Makefile`) ao gerar release / TestFlight.
|
|
60
|
+
- **Firebase — dev** no VS Code continua com `test_` de exemplo só para desenvolvimento local.
|
|
61
|
+
| `SENTRY_DSN` | Sentry | Dashboard Sentry → Projeto → DSN |
|
|
62
|
+
| `MIXPANEL_TOKEN` | Mixpanel | Dashboard Mixpanel → Configurações → Token |
|
|
63
|
+
|
|
64
|
+
Para atualizar, edite o `.vscode/launch.json` ou passe via linha de comando:
|
|
65
|
+
|
|
66
|
+
```sh
|
|
67
|
+
flutter run --dart-define=RC_ANDROID_API_KEY=sua_chave
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
### Secrets do servidor (ficam no Secret Manager do GCP)
|
|
73
|
+
|
|
74
|
+
Usadas pelas **Cloud Functions** em tempo de execução. **Nunca ficam no código do app.**
|
|
75
|
+
|
|
76
|
+
| Secret | Usado por | Como obter |
|
|
77
|
+
|--------|-----------|------------|
|
|
78
|
+
| `REVENUECAT_WEBHOOK_KEY` | Webhook de assinaturas | Dashboard RevenueCat → Webhooks → Authorization header |
|
|
79
|
+
| `META_ACCESS_TOKEN` | Meta Conversions API | Meta Business Manager → System Users → Token |
|
|
80
|
+
| `META_DATASET_ID` | Meta Conversions API | Meta Business Manager → Events Manager → Dataset ID |
|
|
81
|
+
|
|
82
|
+
Para configurar ou atualizar cada secret:
|
|
83
|
+
|
|
84
|
+
```sh
|
|
85
|
+
firebase functions:secrets:set REVENUECAT_WEBHOOK_KEY --project=YOUR_PROJECT_ID
|
|
86
|
+
firebase functions:secrets:set META_ACCESS_TOKEN --project=YOUR_PROJECT_ID
|
|
87
|
+
firebase functions:secrets:set META_DATASET_ID --project=YOUR_PROJECT_ID
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
> Cada comando pede o valor interativamente. O valor **não aparece** no terminal.
|
|
91
|
+
|
|
92
|
+
Para ver os secrets existentes:
|
|
93
|
+
|
|
94
|
+
```sh
|
|
95
|
+
gcloud secrets list --project=YOUR_PROJECT_ID
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Internacionalização (i18n)
|
|
101
|
+
|
|
102
|
+
O app suporta **3 idiomas**: inglês (`en`), português (`pt`) e espanhol (`es`).
|
|
103
|
+
|
|
104
|
+
### Como o idioma é escolhido
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
App abre
|
|
108
|
+
├─ Tem idioma salvo pelo usuário? → usa o salvo
|
|
109
|
+
└─ Não tem → lê o idioma do celular/browser
|
|
110
|
+
├─ É en, pt ou es? → usa esse idioma
|
|
111
|
+
└─ Não é nenhum desses → usa o idioma padrão (base_locale)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Mudar o idioma padrão (fallback)
|
|
115
|
+
|
|
116
|
+
Quando o dispositivo do usuário está em um idioma não suportado (ex: japonês, francês), o app usa o **idioma padrão**. Por padrão é inglês. Para mudar para português:
|
|
117
|
+
|
|
118
|
+
**`slang.yaml`**
|
|
119
|
+
```yaml
|
|
120
|
+
base_locale: pt # trocar aqui: en | pt | es
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Depois rodar:
|
|
124
|
+
```sh
|
|
125
|
+
dart run slang
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Adicionar ou editar traduções
|
|
129
|
+
|
|
130
|
+
Os arquivos ficam em `lib/i18n/`:
|
|
131
|
+
- `en.i18n.json` — inglês
|
|
132
|
+
- `pt.i18n.json` — português
|
|
133
|
+
- `es.i18n.json` — espanhol
|
|
134
|
+
|
|
135
|
+
Após editar qualquer `.i18n.json`, sempre rodar `dart run slang` para regenerar o `translations.g.dart`.
|
|
136
|
+
|
|
137
|
+
### Seletor de idioma
|
|
138
|
+
|
|
139
|
+
O usuário pode mudar o idioma nas **Configurações → Idioma**. A escolha fica salva no dispositivo e é restaurada na próxima abertura do app.
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## RevenueCat webhook
|
|
144
|
+
|
|
145
|
+
O webhook recebe eventos de compra (nova assinatura, renovação, cancelamento) do RevenueCat.
|
|
146
|
+
|
|
147
|
+
**No dashboard do RevenueCat:** Webhooks → adicionar URL da função → Authorization header = valor da `REVENUECAT_WEBHOOK_KEY`.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Deploy
|
|
152
|
+
|
|
153
|
+
```sh
|
|
154
|
+
# Deploy completo (Functions + regras Firestore + regras Storage)
|
|
155
|
+
firebase deploy --only functions,firestore:rules,storage --project=YOUR_PROJECT_ID
|
|
156
|
+
|
|
157
|
+
# Deploy somente Functions
|
|
158
|
+
firebase deploy --only functions --project=YOUR_PROJECT_ID
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## Publicar no iOS (App Store)
|
|
164
|
+
|
|
165
|
+
Guia completo: [docs/ios-release.md](docs/ios-release.md)
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
kasy ios configure # uma vez — credenciais Apple
|
|
169
|
+
kasy ios release # gera IPA e envia para a App Store Connect
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Sem Mac: [docs/codemagic-release.md](docs/codemagic-release.md)
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Segurança
|
|
177
|
+
|
|
178
|
+
O `.gitignore` já exclui: `firebase_key.json`, `.env`, `.env.*`, `*.pem`, `*.keystore`, `.kasy/apple.env`, `.kasy/codemagic.env`.
|
|
179
|
+
|
|
180
|
+
Nunca comite credenciais no repositório.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# This file configures the analyzer, which statically analyzes Dart code to
|
|
2
|
+
# check for errors, warnings, and lints.
|
|
3
|
+
#
|
|
4
|
+
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
|
|
5
|
+
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
|
|
6
|
+
# invoked from the command line by running `flutter analyze`.
|
|
7
|
+
|
|
8
|
+
# The following line activates a set of recommended lints for Flutter apps,
|
|
9
|
+
# packages, and plugins designed to encourage good coding practices.
|
|
10
|
+
include: package:lint/strict.yaml
|
|
11
|
+
|
|
12
|
+
analyzer:
|
|
13
|
+
exclude:
|
|
14
|
+
- "android/**"
|
|
15
|
+
- "**.g.dart"
|
|
16
|
+
- "**.mocks.dart"
|
|
17
|
+
- "**.freezed.dart"
|
|
18
|
+
|
|
19
|
+
linter:
|
|
20
|
+
# The lint rules applied to this project can be customized in the
|
|
21
|
+
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
|
|
22
|
+
# included above or to enable additional rules. A list of all available lints
|
|
23
|
+
# and their documentation is published at https://dart.dev/lints.
|
|
24
|
+
#
|
|
25
|
+
# Instead of disabling a lint rule for the entire project in the
|
|
26
|
+
# section below, it can also be suppressed for a single line of code
|
|
27
|
+
# or a specific dart file by using the `// ignore: name_of_lint` and
|
|
28
|
+
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
|
|
29
|
+
# producing the lint.
|
|
30
|
+
rules:
|
|
31
|
+
require_trailing_commas: false
|
|
32
|
+
eol_at_end_of_file: false
|
|
33
|
+
# avoid_print: false # Uncomment to disable the `avoid_print` rule
|
|
34
|
+
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
|
|
35
|
+
|
|
36
|
+
# Additional information about this file can be found at
|
|
37
|
+
# https://dart.dev/guides/language/analysis-options
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import java.util.Properties
|
|
2
|
+
import java.io.FileInputStream
|
|
3
|
+
|
|
4
|
+
plugins {
|
|
5
|
+
id("com.android.application")
|
|
6
|
+
// START: FlutterFire Configuration
|
|
7
|
+
id("com.google.gms.google-services")
|
|
8
|
+
// END: FlutterFire Configuration
|
|
9
|
+
id("kotlin-android")
|
|
10
|
+
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
|
|
11
|
+
id("dev.flutter.flutter-gradle-plugin")
|
|
12
|
+
// Compose for home widget
|
|
13
|
+
id("org.jetbrains.kotlin.plugin.compose")
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
val keystoreProperties = Properties()
|
|
17
|
+
val keystorePropertiesFile = rootProject.file("key.properties")
|
|
18
|
+
if (keystorePropertiesFile.exists()) {
|
|
19
|
+
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
android {
|
|
23
|
+
buildFeatures {
|
|
24
|
+
compose = true
|
|
25
|
+
}
|
|
26
|
+
namespace = "com.aicrus.firebase.kit"
|
|
27
|
+
compileSdk = flutter.compileSdkVersion
|
|
28
|
+
ndkVersion = flutter.ndkVersion
|
|
29
|
+
|
|
30
|
+
compileOptions {
|
|
31
|
+
isCoreLibraryDesugaringEnabled = true
|
|
32
|
+
sourceCompatibility = JavaVersion.VERSION_11
|
|
33
|
+
targetCompatibility = JavaVersion.VERSION_11
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
kotlin {
|
|
37
|
+
compilerOptions {
|
|
38
|
+
jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
defaultConfig {
|
|
43
|
+
applicationId = "com.aicrus.firebase.kit"
|
|
44
|
+
// You can update the following values to match your application needs.
|
|
45
|
+
// For more information, see: https://flutter.dev/to/review-gradle-config.
|
|
46
|
+
minSdk = 24
|
|
47
|
+
targetSdk = flutter.targetSdkVersion
|
|
48
|
+
versionCode = flutter.versionCode
|
|
49
|
+
versionName = flutter.versionName
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/// TODO Uncomment the following block when you have created your keystore.properties file
|
|
53
|
+
// signingConfigs {
|
|
54
|
+
// create("release") {
|
|
55
|
+
// keyAlias = keystoreProperties["keyAlias"] as String
|
|
56
|
+
// keyPassword = keystoreProperties["keyPassword"] as String
|
|
57
|
+
// storeFile = keystoreProperties["storeFile"]?.let { file(it) }
|
|
58
|
+
// storePassword = keystoreProperties["storePassword"] as String
|
|
59
|
+
// }
|
|
60
|
+
// }
|
|
61
|
+
|
|
62
|
+
buildTypes {
|
|
63
|
+
release {
|
|
64
|
+
// Signing with the debug keys for now, so `flutter run --release` works.
|
|
65
|
+
signingConfig = signingConfigs.getByName("debug")
|
|
66
|
+
// TODO create your keystore.properties file and uncomment the following line
|
|
67
|
+
// signingConfig = signingConfigs.getByName("release")
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
flutter {
|
|
73
|
+
source = "../.."
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
dependencies {
|
|
77
|
+
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5")
|
|
78
|
+
implementation("com.google.android.gms:play-services-ads-identifier:18.1.0")
|
|
79
|
+
implementation("androidx.glance:glance-appwidget:1.1.1")
|
|
80
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
|
2
|
+
<!-- The INTERNET permission is required for development. Specifically,
|
|
3
|
+
the Flutter tool needs it to communicate with the running application
|
|
4
|
+
to allow setting breakpoints, to provide hot reload, etc.
|
|
5
|
+
-->
|
|
6
|
+
<uses-permission android:name="android.permission.INTERNET"/>
|
|
7
|
+
</manifest>
|