kasy-cli 1.12.1 → 1.14.0

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.
Files changed (249) hide show
  1. package/bin/kasy.js +143 -7
  2. package/lib/commands/add.js +2 -2
  3. package/lib/commands/codemagic.js +11 -4
  4. package/lib/commands/deploy.js +3 -3
  5. package/lib/commands/favicon.js +115 -0
  6. package/lib/commands/icon.js +143 -0
  7. package/lib/commands/ios.js +20 -5
  8. package/lib/commands/new.js +8 -20
  9. package/lib/commands/remove.js +1 -1
  10. package/lib/commands/reset.js +287 -0
  11. package/lib/commands/run.js +24 -17
  12. package/lib/commands/splash.js +219 -0
  13. package/lib/commands/update.js +1 -1
  14. package/lib/scaffold/CHANGELOG.json +9 -0
  15. package/lib/scaffold/backends/api/patch/README.md +1 -1
  16. package/lib/scaffold/backends/api/patch/android/app/src/main/AndroidManifest.xml +1 -1
  17. package/lib/scaffold/backends/api/patch/lib/features/notifications/api/device_api.dart +53 -0
  18. package/lib/scaffold/backends/api/patch/lib/main.dart +29 -10
  19. package/lib/scaffold/backends/api/pubspec.yaml.tpl +11 -1
  20. package/lib/scaffold/backends/firebase/tokens.js +2 -2
  21. package/lib/scaffold/backends/supabase/edge-functions/send-push-notification/index.ts +8 -2
  22. package/lib/scaffold/backends/supabase/migrations/20240101000011_dedupe_device_tokens.sql +34 -0
  23. package/lib/scaffold/backends/supabase/patch/README.md +1 -1
  24. package/lib/scaffold/backends/supabase/patch/android/app/src/main/AndroidManifest.xml +1 -1
  25. package/lib/scaffold/backends/supabase/patch/lib/features/notifications/api/device_api.dart +43 -0
  26. package/lib/scaffold/backends/supabase/patch/lib/main.dart +29 -10
  27. package/lib/scaffold/backends/supabase/pubspec.yaml.tpl +11 -1
  28. package/lib/scaffold/features/README.md +15 -139
  29. package/lib/scaffold/shared/generator-utils.js +16 -15
  30. package/lib/utils/apple-release.js +85 -16
  31. package/lib/utils/checks.js +4 -105
  32. package/lib/utils/flutter-run.js +173 -0
  33. package/lib/utils/i18n.js +413 -0
  34. package/lib/utils/mobile-identity.js +35 -0
  35. package/lib/utils/ui.js +114 -0
  36. package/package.json +2 -3
  37. package/templates/firebase/README.en.md +1 -1
  38. package/templates/firebase/README.es.md +1 -1
  39. package/templates/firebase/README.md +1 -1
  40. package/templates/firebase/android/app/build.gradle.kts +10 -1
  41. package/templates/firebase/android/app/src/main/AndroidManifest.xml +1 -1
  42. package/templates/firebase/android/app/src/main/kotlin/com/aicrus/firebase/kit/MainActivity.kt +25 -1
  43. package/templates/firebase/android/app/src/main/kotlin/com/aicrus/firebase/kit/MyWidget.kt +160 -11
  44. package/templates/firebase/android/app/src/main/res/drawable/widget_add_button.xml +15 -0
  45. package/templates/firebase/android/app/src/main/res/drawable/widget_gradient_bg.xml +9 -0
  46. package/templates/firebase/android/app/src/main/res/drawable/widget_gradient_inner.xml +12 -0
  47. package/templates/firebase/android/app/src/main/res/drawable/widget_plan_pill_bg.xml +5 -0
  48. package/templates/firebase/android/app/src/main/res/drawable/widget_preview_image.xml +17 -0
  49. package/templates/firebase/android/app/src/main/res/drawable/widget_pro_pill_bg.xml +5 -0
  50. package/templates/firebase/android/app/src/main/res/drawable-hdpi/android12splash.png +0 -0
  51. package/templates/firebase/android/app/src/main/res/drawable-hdpi/splash.png +0 -0
  52. package/templates/firebase/android/app/src/main/res/drawable-mdpi/android12splash.png +0 -0
  53. package/templates/firebase/android/app/src/main/res/drawable-mdpi/splash.png +0 -0
  54. package/templates/firebase/android/app/src/main/res/drawable-night/background.png +0 -0
  55. package/templates/firebase/android/app/src/main/res/drawable-night/launch_background.xml +9 -0
  56. package/templates/firebase/android/app/src/main/res/drawable-night-hdpi/android12splash.png +0 -0
  57. package/templates/firebase/android/app/src/main/res/drawable-night-hdpi/splash.png +0 -0
  58. package/templates/firebase/android/app/src/main/res/drawable-night-mdpi/android12splash.png +0 -0
  59. package/templates/firebase/android/app/src/main/res/drawable-night-mdpi/splash.png +0 -0
  60. package/templates/firebase/android/app/src/main/res/drawable-night-v21/background.png +0 -0
  61. package/templates/firebase/android/app/src/main/res/drawable-night-v21/launch_background.xml +9 -0
  62. package/templates/firebase/android/app/src/main/res/drawable-night-xhdpi/android12splash.png +0 -0
  63. package/templates/firebase/android/app/src/main/res/drawable-night-xhdpi/splash.png +0 -0
  64. package/templates/firebase/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png +0 -0
  65. package/templates/firebase/android/app/src/main/res/drawable-night-xxhdpi/splash.png +0 -0
  66. package/templates/firebase/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png +0 -0
  67. package/templates/firebase/android/app/src/main/res/drawable-night-xxxhdpi/splash.png +0 -0
  68. package/templates/firebase/android/app/src/main/res/drawable-xhdpi/android12splash.png +0 -0
  69. package/templates/firebase/android/app/src/main/res/drawable-xhdpi/splash.png +0 -0
  70. package/templates/firebase/android/app/src/main/res/drawable-xxhdpi/android12splash.png +0 -0
  71. package/templates/firebase/android/app/src/main/res/drawable-xxhdpi/splash.png +0 -0
  72. package/templates/firebase/android/app/src/main/res/drawable-xxxhdpi/android12splash.png +0 -0
  73. package/templates/firebase/android/app/src/main/res/drawable-xxxhdpi/splash.png +0 -0
  74. package/templates/firebase/android/app/src/main/res/layout/widget_loading.xml +8 -0
  75. package/templates/firebase/android/app/src/main/res/layout/widget_preview.xml +46 -0
  76. package/templates/firebase/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  77. package/templates/firebase/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  78. package/templates/firebase/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  79. package/templates/firebase/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  80. package/templates/firebase/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  81. package/templates/firebase/android/app/src/main/res/values-night-v31/styles.xml +2 -1
  82. package/templates/firebase/android/app/src/main/res/values-v31/styles.xml +1 -0
  83. package/templates/firebase/android/app/src/main/res/xml/mywidget_info.xml +9 -3
  84. package/templates/firebase/assets/images/favicon.png +0 -0
  85. package/templates/firebase/assets/images/icon.png +0 -0
  86. package/templates/firebase/assets/images/splash_logo_dark.png +0 -0
  87. package/templates/firebase/assets/images/splash_logo_light.png +0 -0
  88. package/templates/firebase/firestore.indexes.json +10 -0
  89. package/templates/firebase/functions/src/core/data/entities/user_device_entity.ts +3 -0
  90. package/templates/firebase/functions/src/core/data/repositories/user_device_repository.ts +17 -1
  91. package/templates/firebase/functions/src/index.ts +1 -0
  92. package/templates/firebase/functions/src/notifications/device_triggers.ts +58 -0
  93. package/templates/firebase/ios/HomeWidgetExtension/MyWidget.swift +116 -33
  94. package/templates/firebase/ios/Runner/AppDelegate.swift +17 -1
  95. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png +0 -0
  96. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png +0 -0
  97. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png +0 -0
  98. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png +0 -0
  99. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png +0 -0
  100. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png +0 -0
  101. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png +0 -0
  102. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png +0 -0
  103. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png +0 -0
  104. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png +0 -0
  105. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png +0 -0
  106. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png +0 -0
  107. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png +0 -0
  108. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png +0 -0
  109. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png +0 -0
  110. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png +0 -0
  111. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png +0 -0
  112. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png +0 -0
  113. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png +0 -0
  114. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png +0 -0
  115. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png +0 -0
  116. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json +9 -8
  117. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png +0 -0
  118. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +33 -0
  119. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png +0 -0
  120. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png +0 -0
  121. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png +0 -0
  122. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark.png +0 -0
  123. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@2x.png +0 -0
  124. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@3x.png +0 -0
  125. package/templates/firebase/ios/Runner/Base.lproj/LaunchScreen.storyboard +1 -1
  126. package/templates/firebase/ios/Runner/Info.plist +2 -2
  127. package/templates/firebase/ios/Runner/es.lproj/InfoPlist.strings +1 -1
  128. package/templates/firebase/ios/Runner/pt-BR.lproj/InfoPlist.strings +1 -1
  129. package/templates/firebase/ios/Runner/pt.lproj/InfoPlist.strings +1 -1
  130. package/templates/firebase/lib/components/kasy_button.dart +8 -0
  131. package/templates/firebase/lib/core/bottom_menu/kasy_bottom_bar_factory.dart +18 -0
  132. package/templates/firebase/lib/core/home_widgets/home_widget_mywidget_service.dart +67 -19
  133. package/templates/firebase/lib/core/home_widgets/home_widget_service.dart +22 -8
  134. package/templates/firebase/lib/core/shared_preferences/shared_preferences.dart +16 -4
  135. package/templates/firebase/lib/core/states/components/maybeshow_component.dart +4 -8
  136. package/templates/firebase/lib/core/states/user_state_notifier.dart +13 -1
  137. package/templates/firebase/lib/core/theme/providers/theme_provider.dart +48 -24
  138. package/templates/firebase/lib/features/home/home_page.dart +0 -6
  139. package/templates/firebase/lib/features/notifications/api/device_api.dart +57 -0
  140. package/templates/firebase/lib/features/notifications/providers/models/notification.dart +11 -1
  141. package/templates/firebase/lib/features/notifications/repositories/device_repository.dart +9 -0
  142. package/templates/firebase/lib/features/notifications/repositories/notifications_repository.dart +1 -4
  143. package/templates/firebase/lib/features/notifications/shared/att_permission.dart +28 -8
  144. package/templates/firebase/lib/features/notifications/ui/notifications_page.dart +16 -1
  145. package/templates/firebase/lib/features/notifications/ui/widgets/empty_notifications.dart +44 -11
  146. package/templates/firebase/lib/features/onboarding/ui/components/onboarding_features.dart +4 -0
  147. package/templates/firebase/lib/features/onboarding/ui/onboarding_page.dart +1 -0
  148. package/templates/firebase/lib/features/onboarding/ui/widgets/onboarding_feature.dart +13 -0
  149. package/templates/firebase/lib/features/settings/settings_page.dart +158 -18
  150. package/templates/firebase/lib/features/settings/ui/components/admin/admin_bottom_sheet.dart +31 -29
  151. package/templates/firebase/lib/features/settings/ui/components/language_switcher.dart +21 -5
  152. package/templates/firebase/lib/i18n/en.i18n.json +10 -3
  153. package/templates/firebase/lib/i18n/es.i18n.json +10 -3
  154. package/templates/firebase/lib/i18n/pt.i18n.json +10 -3
  155. package/templates/firebase/lib/main.dart +29 -10
  156. package/templates/firebase/pubspec.yaml +10 -6
  157. package/templates/firebase/test/core/data/repositories/user_repository_test.dart +1 -1
  158. package/templates/firebase/test/features/notifications/data/device_api_fake.dart +9 -0
  159. package/templates/firebase/web/favicon.png +0 -0
  160. package/templates/firebase/web/icons/Icon-192.png +0 -0
  161. package/templates/firebase/web/icons/Icon-512.png +0 -0
  162. package/templates/firebase/web/icons/Icon-maskable-192.png +0 -0
  163. package/templates/firebase/web/icons/Icon-maskable-512.png +0 -0
  164. package/templates/firebase/web/index.html +50 -39
  165. package/templates/firebase/web/manifest.json +3 -3
  166. package/templates/firebase/web/splash/img/dark-1x.png +0 -0
  167. package/templates/firebase/web/splash/img/dark-2x.png +0 -0
  168. package/templates/firebase/web/splash/img/dark-3x.png +0 -0
  169. package/templates/firebase/web/splash/img/dark-4x.png +0 -0
  170. package/templates/firebase/web/splash/img/light-1x.png +0 -0
  171. package/templates/firebase/web/splash/img/light-2x.png +0 -0
  172. package/templates/firebase/web/splash/img/light-3x.png +0 -0
  173. package/templates/firebase/web/splash/img/light-4x.png +0 -0
  174. package/lib/scaffold/features/analytics/lib/core/data/api/analytics_api.dart +0 -124
  175. package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/BUG.es.md +0 -35
  176. package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/BUG.md +0 -35
  177. package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/BUG.pt.md +0 -35
  178. package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/feature_request.es.md +0 -12
  179. package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/feature_request.md +0 -12
  180. package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/feature_request.pt.md +0 -12
  181. package/lib/scaffold/features/ci/.github/PULL_REQUEST_TEMPLATE.es.md +0 -17
  182. package/lib/scaffold/features/ci/.github/PULL_REQUEST_TEMPLATE.md +0 -17
  183. package/lib/scaffold/features/ci/.github/PULL_REQUEST_TEMPLATE.pt.md +0 -17
  184. package/lib/scaffold/features/ci/.github/dependabot.yml +0 -16
  185. package/lib/scaffold/features/ci/.github/workflows/app.yml +0 -20
  186. package/lib/scaffold/features/ci/.gitlab/templates/deploy.yaml +0 -14
  187. package/lib/scaffold/features/ci/.gitlab/templates/dropbox.yaml +0 -19
  188. package/lib/scaffold/features/ci/.gitlab/templates/flutter.yaml +0 -163
  189. package/lib/scaffold/features/ci/.gitlab/templates/mailgun.yaml +0 -28
  190. package/lib/scaffold/features/ci/.gitlab-ci.yml +0 -37
  191. package/lib/scaffold/features/ci/codemagic.yaml +0 -157
  192. package/lib/scaffold/features/facebook/lib/core/data/api/tracking_api.dart +0 -111
  193. package/lib/scaffold/features/feedback/lib/features/feedbacks/api/entities/feature_request_entity.dart +0 -27
  194. package/lib/scaffold/features/feedback/lib/features/feedbacks/api/entities/feature_vote_entity.dart +0 -27
  195. package/lib/scaffold/features/feedback/lib/features/feedbacks/api/feature_request_api.dart +0 -50
  196. package/lib/scaffold/features/feedback/lib/features/feedbacks/api/feature_vote_api.dart +0 -79
  197. package/lib/scaffold/features/feedback/lib/features/feedbacks/models/feature_requests.dart +0 -48
  198. package/lib/scaffold/features/feedback/lib/features/feedbacks/models/feedback_state.dart +0 -42
  199. package/lib/scaffold/features/feedback/lib/features/feedbacks/providers/feedback_page_notifier.dart +0 -147
  200. package/lib/scaffold/features/feedback/lib/features/feedbacks/repositories/feature_request_repository.dart +0 -95
  201. package/lib/scaffold/features/feedback/lib/features/feedbacks/ui/component/add_feature_form.dart +0 -199
  202. package/lib/scaffold/features/feedback/lib/features/feedbacks/ui/feedback_page.dart +0 -175
  203. package/lib/scaffold/features/feedback/lib/features/feedbacks/ui/widgets/add_feature_button.dart +0 -76
  204. package/lib/scaffold/features/feedback/lib/features/feedbacks/ui/widgets/feature_card.dart +0 -279
  205. package/lib/scaffold/features/ios-release/.kasy/apple.env.example +0 -8
  206. package/lib/scaffold/features/ios-release/.kasy/codemagic.env.example +0 -7
  207. package/lib/scaffold/features/ios-release/docs/codemagic-release.en.md +0 -50
  208. package/lib/scaffold/features/ios-release/docs/codemagic-release.es.md +0 -50
  209. package/lib/scaffold/features/ios-release/docs/codemagic-release.pt.md +0 -50
  210. package/lib/scaffold/features/ios-release/docs/ios-release.en.md +0 -41
  211. package/lib/scaffold/features/ios-release/docs/ios-release.es.md +0 -41
  212. package/lib/scaffold/features/ios-release/docs/ios-release.pt.md +0 -41
  213. package/lib/scaffold/features/ios-release/scripts/bump-ios-version.js +0 -38
  214. package/lib/scaffold/features/ios-release/scripts/release-ios.sh +0 -137
  215. package/lib/scaffold/features/llm_chat/lib/features/llm_chat/llm_chat_page.dart +0 -301
  216. package/lib/scaffold/features/local_notifications/lib/features/local_reminder/providers/reminder_notifier.dart +0 -81
  217. package/lib/scaffold/features/local_notifications/lib/features/local_reminder/repositories/reminder_preferences.dart +0 -76
  218. package/lib/scaffold/features/local_notifications/lib/features/local_reminder/ui/reminder_page.dart +0 -282
  219. package/lib/scaffold/features/onboarding/lib/features/onboarding/api/entities/user_info_entity.dart +0 -24
  220. package/lib/scaffold/features/onboarding/lib/features/onboarding/api/user_infos_api.dart +0 -71
  221. package/lib/scaffold/features/onboarding/lib/features/onboarding/models/user_info.dart +0 -92
  222. package/lib/scaffold/features/onboarding/lib/features/onboarding/providers/onboarding_model.dart +0 -15
  223. package/lib/scaffold/features/onboarding/lib/features/onboarding/providers/onboarding_provider.dart +0 -78
  224. package/lib/scaffold/features/onboarding/lib/features/onboarding/repositories/user_infos_repository.dart +0 -29
  225. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/animations/page_transitions.dart +0 -30
  226. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_att_setup.dart +0 -66
  227. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_features.dart +0 -72
  228. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_loader.dart +0 -92
  229. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_notifications_setup.dart +0 -73
  230. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_questions.dart +0 -89
  231. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/onboarding_page.dart +0 -94
  232. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_background.dart +0 -80
  233. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_feature.dart +0 -139
  234. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_illustration_scaffold.dart +0 -110
  235. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_progress.dart +0 -84
  236. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_radio_question.dart +0 -173
  237. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_reassurance.dart +0 -45
  238. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_sticky_footer.dart +0 -77
  239. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/selectable_row_tile.dart +0 -392
  240. package/lib/scaffold/features/revenuecat/lib/core/data/api/tracking_api.dart +0 -116
  241. package/lib/scaffold/features/revenuecat/lib/core/data/models/subscription.dart +0 -322
  242. package/lib/scaffold/features/revenuecat/lib/core/home_widgets/home_widget_background_task.dart +0 -41
  243. package/lib/scaffold/features/revenuecat/lib/core/states/user_state_notifier.dart +0 -305
  244. package/templates/firebase/assets/images/app_icon.png +0 -0
  245. package/templates/firebase/assets/images/onboarding/img1.jpg +0 -0
  246. package/templates/firebase/assets/images/onboarding/onboarding.png +0 -0
  247. package/templates/firebase/assets/images/splashscreen.png +0 -0
  248. package/templates/firebase/lib/core/states/components/maybe_ask_biometric_setup.dart +0 -88
  249. package/templates/firebase/lib/features/notifications/shared/notification_permission_bottom_sheet.dart +0 -144
@@ -175,7 +175,8 @@
175
175
  "title": "Módulo de suscripciones",
176
176
  "description": "Gestiona suscripciones con paywalls listos para usar",
177
177
  "action": "Continuar",
178
- "skip": "Omitir"
178
+ "skip": "Omitir",
179
+ "login": "¿Ya tienes cuenta? Iniciar sesión"
179
180
  },
180
181
  "feature_2": {
181
182
  "title": "Módulo de autenticación",
@@ -321,7 +322,10 @@
321
322
  "cancel": "Cancelar"
322
323
  },
323
324
  "language_title": "Idiomas",
324
- "theme_title": "Modo claro/oscuro",
325
+ "theme_title": "Tema",
326
+ "theme_option_system": "Sistema",
327
+ "theme_option_light": "Claro",
328
+ "theme_option_dark": "Oscuro",
325
329
  "haptic_feedback_title": "Feedback háptico",
326
330
  "section_preferences_label": "PREFERENCIAS",
327
331
  "section_security_label": "SEGURIDAD",
@@ -439,6 +443,7 @@
439
443
  "group_yesterday": "Ayer",
440
444
  "group_older": "Más antiguas",
441
445
  "empty_cta": "Activar notificaciones",
446
+ "empty_cta_open_settings": "Abrir ajustes",
442
447
  "delete_all": "Eliminar todo",
443
448
  "delete_all_confirm_title": "¿Eliminar todas las notificaciones?",
444
449
  "delete_all_confirm_message": "Esto eliminará todas las notificaciones de tu cuenta. Esta acción no se puede deshacer.",
@@ -523,8 +528,10 @@
523
528
  "greeting_evening": "Buenas noches",
524
529
  "title_with_name": "¡Hola, $name!",
525
530
  "title_default": "¡Hola!",
531
+ "title_logged_out": "Te esperamos de vuelta",
526
532
  "plan_free": "Plan gratuito",
527
- "plan_pro": "PRO"
533
+ "plan_pro": "PRO",
534
+ "quote": "Siempre parece imposible hasta que se hace."
528
535
  }
529
536
  }
530
537
 
@@ -175,7 +175,8 @@
175
175
  "title": "Módulo de assinaturas",
176
176
  "description": "Gerencie assinaturas com paywalls prontos para usar",
177
177
  "action": "Continuar",
178
- "skip": "Pular"
178
+ "skip": "Pular",
179
+ "login": "Já tem conta? Entrar"
179
180
  },
180
181
  "feature_2": {
181
182
  "title": "Módulo de autenticação",
@@ -321,7 +322,10 @@
321
322
  "cancel": "Cancelar"
322
323
  },
323
324
  "language_title": "Idiomas",
324
- "theme_title": "Modo claro/escuro",
325
+ "theme_title": "Tema",
326
+ "theme_option_system": "Sistema",
327
+ "theme_option_light": "Claro",
328
+ "theme_option_dark": "Escuro",
325
329
  "haptic_feedback_title": "Feedback háptico",
326
330
  "section_preferences_label": "PREFERÊNCIAS",
327
331
  "section_security_label": "SEGURANÇA",
@@ -439,6 +443,7 @@
439
443
  "group_yesterday": "Ontem",
440
444
  "group_older": "Mais antigas",
441
445
  "empty_cta": "Ativar notificações",
446
+ "empty_cta_open_settings": "Abrir configurações",
442
447
  "delete_all": "Excluir tudo",
443
448
  "delete_all_confirm_title": "Excluir todas as notificações?",
444
449
  "delete_all_confirm_message": "Isso vai remover todas as notificações da sua conta. Essa ação não pode ser desfeita.",
@@ -523,8 +528,10 @@
523
528
  "greeting_evening": "Boa noite",
524
529
  "title_with_name": "Olá, $name!",
525
530
  "title_default": "Olá!",
531
+ "title_logged_out": "Aguardamos seu retorno",
526
532
  "plan_free": "Plano grátis",
527
- "plan_pro": "PRO"
533
+ "plan_pro": "PRO",
534
+ "quote": "Sempre parece impossível, até que seja feito."
528
535
  }
529
536
  }
530
537
 
@@ -115,28 +115,47 @@ void run(SharedPreferences prefs) => runApp(
115
115
  // mode: ThemeMode.dark,
116
116
  // ),
117
117
  // See ./docs/theme.md for more details
118
- class MyApp extends ConsumerWidget {
118
+ class MyApp extends ConsumerStatefulWidget {
119
119
  final SharedPreferences sharedPreferences;
120
120
 
121
121
  const MyApp({super.key, required this.sharedPreferences});
122
122
 
123
+ @override
124
+ ConsumerState<MyApp> createState() => _MyAppState();
125
+ }
126
+
127
+ class _MyAppState extends ConsumerState<MyApp> {
128
+ late final AppTheme _appTheme;
129
+
130
+ @override
131
+ void initState() {
132
+ super.initState();
133
+ _appTheme = AppTheme.uniform(
134
+ sharedPreferences: widget.sharedPreferences,
135
+ themeFactory: const UniversalThemeFactory(),
136
+ lightColors: KasyColors.light(),
137
+ darkColors: KasyColors.dark(),
138
+ textTheme: KasyTextTheme.build(),
139
+ defaultMode: ThemeMode.system,
140
+ );
141
+ }
142
+
143
+ @override
144
+ void dispose() {
145
+ _appTheme.dispose();
146
+ super.dispose();
147
+ }
148
+
123
149
  // This widget is the root of your application.
124
150
  @override
125
- Widget build(BuildContext context, WidgetRef ref) {
151
+ Widget build(BuildContext context) {
126
152
  ErrorWidget.builder = (FlutterErrorDetails details) {
127
153
  return AppErrorWidget(error: details);
128
154
  };
129
155
  final goRouter = ref.watch(goRouterProvider);
130
156
 
131
157
  return ThemeProvider(
132
- notifier: AppTheme.uniform(
133
- sharedPreferences: sharedPreferences,
134
- themeFactory: const UniversalThemeFactory(),
135
- lightColors: KasyColors.light(),
136
- darkColors: KasyColors.dark(),
137
- textTheme: KasyTextTheme.build(),
138
- defaultMode: ThemeMode.light,
139
- ),
158
+ notifier: _appTheme,
140
159
  child: Builder(
141
160
  builder: (context) {
142
161
  return WebDevicePreview.wrap(
@@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
16
16
  # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
17
17
  # In Windows, build-name is used as the major, minor, and patch parts
18
18
  # of the product and file versions while build-number is used as the build suffix.
19
- version: 1.0.0+23
19
+ version: 1.0.0+31
20
20
 
21
21
  environment:
22
22
  sdk: ^3.11.0
@@ -130,20 +130,24 @@ flutter_launcher_icons:
130
130
  android: ic_launcher
131
131
  ios: true
132
132
  remove_alpha_ios: true
133
+ web:
134
+ generate: true
135
+ image_path: assets/images/favicon.png
136
+ background_color: "#01171f"
137
+ theme_color: "#01171f"
133
138
  flutter_native_splash:
134
139
  color: "#FFFFFF"
135
140
  color_dark: "#000000"
136
141
  fullscreen: true
137
- preserve: true
138
142
  ios: true
139
143
  android: true
140
- image: assets/images/splashscreen.png
141
- image_dark: assets/images/splashscreen.png
144
+ image: assets/images/splash_logo_light.png
145
+ image_dark: assets/images/splash_logo_dark.png
142
146
  android_12:
143
147
  color: "#FFFFFF"
144
148
  color_dark: "#000000"
145
- image: assets/images/splashscreen.png
146
- image_dark: assets/images/splashscreen.png
149
+ image: assets/images/splash_logo_light.png
150
+ image_dark: assets/images/splash_logo_dark.png
147
151
 
148
152
  # To add assets to your application, add an assets section, like this:
149
153
  # assets:
@@ -30,7 +30,7 @@ void main() {
30
30
  await tester.runAsync(() async {
31
31
  final userRepository = await init();
32
32
 
33
- final file = await rootBundle.load('assets/images/splashscreen.png');
33
+ final file = await rootBundle.load('assets/images/splash_logo_light.png');
34
34
  final bytes = file.buffer.asUint8List();
35
35
  // if you want to create an XFile from bytes
36
36
  // final xfile = XFile.fromData(bytes);
@@ -15,6 +15,15 @@ class FakeDeviceApi implements DeviceApi {
15
15
  await Future.delayed(const Duration(milliseconds: 100));
16
16
  }
17
17
 
18
+ @override
19
+ Future<void> touch(String userId, String installationId) async {}
20
+
21
+ @override
22
+ Future<void> cleanupStaleDevices(
23
+ String userId,
24
+ String currentInstallationId,
25
+ ) async {}
26
+
18
27
  @override
19
28
  Future<DeviceEntity> get() {
20
29
  return Future.value(
Binary file
@@ -29,73 +29,82 @@
29
29
 
30
30
  <title>kasy</title>
31
31
  <link rel="manifest" href="manifest.json">
32
+
33
+
34
+ <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport">
35
+
36
+
32
37
  <style id="splash-screen-style">
33
38
  html {
34
- height: 100%;
39
+ height: 100%
35
40
  }
36
41
 
37
42
  body {
38
43
  margin: 0;
39
44
  min-height: 100%;
40
45
  background-color: #FFFFFF;
46
+ background-size: 100% 100%;
41
47
  }
42
48
 
43
- @media (prefers-color-scheme: dark) {
44
- body { background-color: #000000; }
49
+ .center {
50
+ margin: 0;
51
+ position: absolute;
52
+ top: 50%;
53
+ left: 50%;
54
+ -ms-transform: translate(-50%, -50%);
55
+ transform: translate(-50%, -50%);
45
56
  }
46
57
 
47
- #splash {
48
- position: fixed;
49
- inset: 0;
50
- display: flex;
51
- align-items: center;
52
- justify-content: center;
53
- background-color: #FFFFFF;
54
- transition: opacity 0.35s ease;
55
- z-index: 9999;
58
+ .contain {
59
+ display:block;
60
+ width:100%; height:100%;
61
+ object-fit: contain;
56
62
  }
57
63
 
58
- @media (prefers-color-scheme: dark) {
59
- #splash { background-color: #000000; }
64
+ .stretch {
65
+ display:block;
66
+ width:100%; height:100%;
60
67
  }
61
68
 
62
- #splash img {
63
- width: 160px;
64
- height: 160px;
65
- object-fit: contain;
69
+ .cover {
70
+ display:block;
71
+ width:100%; height:100%;
72
+ object-fit: cover;
66
73
  }
67
74
 
68
- .center {
69
- margin: 0;
75
+ .bottom {
70
76
  position: absolute;
71
- top: 50%;
77
+ bottom: 0;
72
78
  left: 50%;
73
- -ms-transform: translate(-50%, -50%);
74
- transform: translate(-50%, -50%);
79
+ -ms-transform: translate(-50%, 0);
80
+ transform: translate(-50%, 0);
75
81
  }
76
82
 
77
- .contain { display:block; width:100%; height:100%; object-fit: contain; }
78
- .stretch { display:block; width:100%; height:100%; }
79
- .cover { display:block; width:100%; height:100%; object-fit: cover; }
83
+ .bottomLeft {
84
+ position: absolute;
85
+ bottom: 0;
86
+ left: 0;
87
+ }
80
88
 
81
- .bottom { position: absolute; bottom: 0; left: 50%; transform: translate(-50%, 0); }
82
- .bottomLeft { position: absolute; bottom: 0; left: 0; }
83
- .bottomRight { position: absolute; bottom: 0; right: 0; }
89
+ .bottomRight {
90
+ position: absolute;
91
+ bottom: 0;
92
+ right: 0;
93
+ }
94
+
95
+ @media (prefers-color-scheme: dark) {
96
+ body {
97
+ background-color: #000000;
98
+ }
99
+ }
84
100
  </style>
85
101
  <script id="splash-screen-script">
86
102
  function removeSplashFromWeb() {
87
- var splash = document.getElementById("splash");
88
- if (splash) {
89
- splash.style.opacity = "0";
90
- setTimeout(function() {
91
- splash.remove();
92
- document.getElementById("splash-branding")?.remove();
93
- document.body.style.background = "transparent";
94
- }, 380);
95
- }
103
+ document.getElementById("splash")?.remove();
104
+ document.getElementById("splash-branding")?.remove();
105
+ document.body.style.background = "transparent";
96
106
  }
97
107
  </script>
98
- <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport">
99
108
  </head>
100
109
  <body>
101
110
  <picture id="splash">
@@ -103,6 +112,8 @@
103
112
  <source srcset="splash/img/dark-1x.png 1x, splash/img/dark-2x.png 2x, splash/img/dark-3x.png 3x, splash/img/dark-4x.png 4x" media="(prefers-color-scheme: dark)">
104
113
  <img class="center" aria-hidden="true" src="splash/img/light-1x.png" alt="">
105
114
  </picture>
115
+
116
+
106
117
  <script src="flutter_bootstrap.js" async=""></script>
107
118
  <script src="./local_notifications.js"></script>
108
119
 
@@ -3,8 +3,8 @@
3
3
  "short_name": "kasy",
4
4
  "start_url": ".",
5
5
  "display": "standalone",
6
- "background_color": "#0175C2",
7
- "theme_color": "#0175C2",
6
+ "background_color": "#01171f",
7
+ "theme_color": "#01171f",
8
8
  "description": "A new Flutter project.",
9
9
  "orientation": "portrait-primary",
10
10
  "prefer_related_applications": false,
@@ -32,4 +32,4 @@
32
32
  "purpose": "maskable"
33
33
  }
34
34
  ]
35
- }
35
+ }
@@ -1,124 +0,0 @@
1
- import 'package:flutter/material.dart';
2
- import 'package:flutter_riverpod/flutter_riverpod.dart';
3
- import 'package:mixpanel_flutter/mixpanel_flutter.dart';
4
- import 'package:kasy_kit/core/data/models/user.dart';
5
- import 'package:kasy_kit/core/initializer/onstart_service.dart';
6
- import 'package:kasy_kit/environnements.dart';
7
-
8
- final analyticsApiProvider = Provider<AnalyticsApi>(
9
- (ref) => MixpanelAnalyticsApi.instance(),
10
-
11
- );
12
-
13
- abstract class AnalyticsApi implements OnStartService {
14
- /// Log an event to your analytics platform
15
- Future<void> logEvent(String name, Map<String, dynamic> params);
16
-
17
- /// Log a signout event to your analytics platform
18
- Future<void> logSignout();
19
-
20
- /// Identify a user to your analytics platform
21
- Future<void> identify(User user);
22
- }
23
-
24
-
25
- class MixpanelAnalyticsApi implements AnalyticsApi {
26
- final Environment environment;
27
- Mixpanel? mixpanel;
28
- MixpanelAnalyticsApi._({
29
- required this.environment,
30
- });
31
-
32
- static MixpanelAnalyticsApi? _instance;
33
-
34
- factory MixpanelAnalyticsApi.instance() {
35
- return _instance ??= MixpanelAnalyticsApi._(
36
- environment: Environment.fromEnv(),
37
- );
38
- }
39
-
40
- @override
41
- Future<void> init() async {
42
- if (environment.mixpanelToken == null ||
43
- environment.mixpanelToken!.isEmpty) {
44
- return;
45
- }
46
- try {
47
- mixpanel = await Mixpanel.init(
48
- environment.mixpanelToken!,
49
- trackAutomaticEvents: true,
50
- );
51
- } catch (e, s) {
52
- debugPrint('Error initializing Mixpanel: $e\n$s');
53
- }
54
- }
55
-
56
- @override
57
- Future<void> logEvent(String name, Map<String, dynamic> params) async {
58
- mixpanel?.track(name, properties: params);
59
- }
60
-
61
- @override
62
- Future<void> logSignout() async {
63
- mixpanel?.reset();
64
- mixpanel?.track('logout');
65
- }
66
-
67
- @override
68
- Future<void> identify(User user) async {
69
- mixpanel?.track('login');
70
- final userId = user.idOrNull;
71
- if (userId != null) {
72
- mixpanel?.identify(userId);
73
- }
74
- }
75
- }
76
-
77
-
78
-
79
-
80
- class AnalyticsObserver extends RouteObserver<ModalRoute<dynamic>> {
81
- final AnalyticsApi analyticsApi;
82
- final String? prefix;
83
-
84
- AnalyticsObserver({
85
- required this.analyticsApi,
86
- this.prefix,
87
- });
88
-
89
- @override
90
- void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
91
- // debugPrint('didPush $prefix${route.settings.name} ');
92
- if (route.settings.name != null && prefix != null) {
93
- analyticsApi.logEvent('$prefix${route.settings.name}', {});
94
- } else if (route.settings.name != null && prefix == null) {
95
- analyticsApi.logEvent('${route.settings.name}', {});
96
- }
97
- }
98
-
99
- @override
100
- void didReplace({Route<dynamic>? newRoute, Route<dynamic>? oldRoute}) {
101
- // debugPrint('didReplace ${newRoute?.settings.name}');
102
- if (newRoute?.settings.name != null && prefix != null) {
103
- analyticsApi.logEvent('$prefix${newRoute!.settings.name!}', {});
104
- } else if (newRoute?.settings.name != null && prefix == null) {
105
- analyticsApi.logEvent(newRoute!.settings.name!, {});
106
- }
107
- }
108
-
109
- @override
110
- void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {}
111
-
112
- @override
113
- void didRemove(Route<dynamic> route, Route<dynamic>? previousRoute) {}
114
-
115
- @override
116
- void didStartUserGesture(
117
- Route<dynamic> route,
118
- Route<dynamic>? previousRoute,
119
- ) {}
120
-
121
- @override
122
- void didStopUserGesture() {}
123
- }
124
-
@@ -1,35 +0,0 @@
1
- ---
2
- name: Encontré un problema.
3
- about: El proyecto no compila o hace crash...
4
- title: ''
5
- labels: ''
6
- assignees: ''
7
-
8
- ---
9
-
10
- ## Pasos para reproducir
11
-
12
- *Describe cómo reproducir el error, proporciona un dartpad o código simple para reproducir*
13
-
14
- ## Resultados esperados
15
-
16
- *Qué debería pasar*
17
-
18
- ## Resultados reales
19
-
20
- *Qué ves*
21
-
22
- ## Sobre tu dispositivo
23
-
24
- | Marca | Modelo | SO |
25
- | ------- | ----------- | --------- |
26
- | *Apple* | *iPhone X* | *13.6.1* |
27
-
28
- ## Tu versión de Flutter
29
-
30
- Ejecuta en la terminal:
31
- ```flutter --version```
32
-
33
- *Pega el resultado aquí*
34
-
35
- </details>
@@ -1,35 +0,0 @@
1
- ---
2
- name: I found a problem.
3
- about: The project doesn't build or crash...
4
- title: ''
5
- labels: ''
6
- assignees: ''
7
-
8
- ---
9
-
10
- ## Steps to Reproduce
11
-
12
- *Describe how to reproduce the error, provide a dartpad or simple code to reproduce*
13
-
14
- ## Expected results
15
-
16
- *What it should be*
17
-
18
- ## Actual results
19
-
20
- *What you see*
21
-
22
- ## About your device
23
-
24
- | Brand | Model | OS |
25
- | ------- | ----------- | --------- |
26
- | *Apple* | *iPhone X* | *13.6.1* |
27
-
28
- ## Your flutter version
29
-
30
- Run this in your command line
31
- ```flutter --version```
32
-
33
- *Paste the result here*
34
-
35
- </details>
@@ -1,35 +0,0 @@
1
- ---
2
- name: Encontrei um problema.
3
- about: O projeto não compila ou dá crash...
4
- title: ''
5
- labels: ''
6
- assignees: ''
7
-
8
- ---
9
-
10
- ## Passos para reproduzir
11
-
12
- *Descreva como reproduzir o erro, forneça um dartpad ou código simples para reproduzir*
13
-
14
- ## Resultados esperados
15
-
16
- *O que deveria acontecer*
17
-
18
- ## Resultados reais
19
-
20
- *O que você vê*
21
-
22
- ## Sobre seu dispositivo
23
-
24
- | Marca | Modelo | SO |
25
- | ------- | ----------- | --------- |
26
- | *Apple* | *iPhone X* | *13.6.1* |
27
-
28
- ## Sua versão do Flutter
29
-
30
- Execute no terminal:
31
- ```flutter --version```
32
-
33
- *Cole o resultado aqui*
34
-
35
- </details>
@@ -1,12 +0,0 @@
1
- ---
2
- name: Solicitud de feature
3
- about: Sugiere una nueva idea.
4
- title: ''
5
- labels: ''
6
- assignees: ''
7
-
8
- ---
9
-
10
- ## Propuesta
11
-
12
- *Describe tu nueva feature*
@@ -1,12 +0,0 @@
1
- ---
2
- name: Feature request
3
- about: Suggest a new idea.
4
- title: ''
5
- labels: ''
6
- assignees: ''
7
-
8
- ---
9
-
10
- ## Proposal
11
-
12
- *Describe your new feature*
@@ -1,12 +0,0 @@
1
- ---
2
- name: Pedido de feature
3
- about: Sugira uma nova ideia.
4
- title: ''
5
- labels: ''
6
- assignees: ''
7
-
8
- ---
9
-
10
- ## Proposta
11
-
12
- *Descreva sua nova feature*