kasy-cli 1.12.1 → 1.13.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.
- package/bin/kasy.js +21 -0
- package/lib/commands/splash.js +220 -0
- package/lib/scaffold/CHANGELOG.json +9 -0
- package/lib/scaffold/backends/api/patch/lib/main.dart +29 -10
- package/lib/scaffold/backends/supabase/patch/lib/main.dart +29 -10
- package/lib/scaffold/features/README.md +15 -139
- package/lib/scaffold/shared/generator-utils.js +16 -15
- package/lib/utils/i18n.js +78 -0
- package/package.json +2 -2
- package/templates/firebase/android/app/src/main/res/drawable-hdpi/android12splash.png +0 -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/android12splash.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-night/background.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night/launch_background.xml +9 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-hdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-hdpi/splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-mdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-mdpi/splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-v21/background.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-v21/launch_background.xml +9 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-xhdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-xhdpi/splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-xxhdpi/splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-xxxhdpi/splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-xhdpi/android12splash.png +0 -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/android12splash.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/android12splash.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/values-night-v31/styles.xml +2 -1
- package/templates/firebase/android/app/src/main/res/values-v31/styles.xml +1 -0
- package/templates/firebase/assets/images/splash_logo_dark.png +0 -0
- package/templates/firebase/assets/images/splash_logo_light.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json +9 -8
- package/templates/firebase/ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +33 -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/LaunchImageDark.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@3x.png +0 -0
- package/templates/firebase/ios/Runner/Base.lproj/LaunchScreen.storyboard +1 -1
- package/templates/firebase/lib/core/theme/providers/theme_provider.dart +48 -24
- package/templates/firebase/lib/features/onboarding/ui/components/onboarding_features.dart +4 -0
- package/templates/firebase/lib/features/onboarding/ui/onboarding_page.dart +1 -0
- package/templates/firebase/lib/features/onboarding/ui/widgets/onboarding_feature.dart +13 -0
- package/templates/firebase/lib/features/settings/settings_page.dart +158 -18
- package/templates/firebase/lib/i18n/en.i18n.json +6 -2
- package/templates/firebase/lib/i18n/es.i18n.json +6 -2
- package/templates/firebase/lib/i18n/pt.i18n.json +6 -2
- package/templates/firebase/lib/main.dart +29 -10
- package/templates/firebase/pubspec.yaml +4 -5
- package/templates/firebase/test/core/data/repositories/user_repository_test.dart +1 -1
- package/templates/firebase/web/index.html +47 -39
- 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
- package/lib/scaffold/features/analytics/lib/core/data/api/analytics_api.dart +0 -124
- package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/BUG.es.md +0 -35
- package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/BUG.md +0 -35
- package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/BUG.pt.md +0 -35
- package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/feature_request.es.md +0 -12
- package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/feature_request.md +0 -12
- package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/feature_request.pt.md +0 -12
- package/lib/scaffold/features/ci/.github/PULL_REQUEST_TEMPLATE.es.md +0 -17
- package/lib/scaffold/features/ci/.github/PULL_REQUEST_TEMPLATE.md +0 -17
- package/lib/scaffold/features/ci/.github/PULL_REQUEST_TEMPLATE.pt.md +0 -17
- package/lib/scaffold/features/ci/.github/dependabot.yml +0 -16
- package/lib/scaffold/features/ci/.github/workflows/app.yml +0 -20
- package/lib/scaffold/features/ci/.gitlab/templates/deploy.yaml +0 -14
- package/lib/scaffold/features/ci/.gitlab/templates/dropbox.yaml +0 -19
- package/lib/scaffold/features/ci/.gitlab/templates/flutter.yaml +0 -163
- package/lib/scaffold/features/ci/.gitlab/templates/mailgun.yaml +0 -28
- package/lib/scaffold/features/ci/.gitlab-ci.yml +0 -37
- package/lib/scaffold/features/ci/codemagic.yaml +0 -157
- package/lib/scaffold/features/facebook/lib/core/data/api/tracking_api.dart +0 -111
- package/lib/scaffold/features/feedback/lib/features/feedbacks/api/entities/feature_request_entity.dart +0 -27
- package/lib/scaffold/features/feedback/lib/features/feedbacks/api/entities/feature_vote_entity.dart +0 -27
- package/lib/scaffold/features/feedback/lib/features/feedbacks/api/feature_request_api.dart +0 -50
- package/lib/scaffold/features/feedback/lib/features/feedbacks/api/feature_vote_api.dart +0 -79
- package/lib/scaffold/features/feedback/lib/features/feedbacks/models/feature_requests.dart +0 -48
- package/lib/scaffold/features/feedback/lib/features/feedbacks/models/feedback_state.dart +0 -42
- package/lib/scaffold/features/feedback/lib/features/feedbacks/providers/feedback_page_notifier.dart +0 -147
- package/lib/scaffold/features/feedback/lib/features/feedbacks/repositories/feature_request_repository.dart +0 -95
- package/lib/scaffold/features/feedback/lib/features/feedbacks/ui/component/add_feature_form.dart +0 -199
- package/lib/scaffold/features/feedback/lib/features/feedbacks/ui/feedback_page.dart +0 -175
- package/lib/scaffold/features/feedback/lib/features/feedbacks/ui/widgets/add_feature_button.dart +0 -76
- package/lib/scaffold/features/feedback/lib/features/feedbacks/ui/widgets/feature_card.dart +0 -279
- package/lib/scaffold/features/ios-release/.kasy/apple.env.example +0 -8
- package/lib/scaffold/features/ios-release/.kasy/codemagic.env.example +0 -7
- package/lib/scaffold/features/ios-release/docs/codemagic-release.en.md +0 -50
- package/lib/scaffold/features/ios-release/docs/codemagic-release.es.md +0 -50
- package/lib/scaffold/features/ios-release/docs/codemagic-release.pt.md +0 -50
- package/lib/scaffold/features/ios-release/docs/ios-release.en.md +0 -41
- package/lib/scaffold/features/ios-release/docs/ios-release.es.md +0 -41
- package/lib/scaffold/features/ios-release/docs/ios-release.pt.md +0 -41
- package/lib/scaffold/features/ios-release/scripts/bump-ios-version.js +0 -38
- package/lib/scaffold/features/ios-release/scripts/release-ios.sh +0 -137
- package/lib/scaffold/features/llm_chat/lib/features/llm_chat/llm_chat_page.dart +0 -301
- package/lib/scaffold/features/local_notifications/lib/features/local_reminder/providers/reminder_notifier.dart +0 -81
- package/lib/scaffold/features/local_notifications/lib/features/local_reminder/repositories/reminder_preferences.dart +0 -76
- package/lib/scaffold/features/local_notifications/lib/features/local_reminder/ui/reminder_page.dart +0 -282
- package/lib/scaffold/features/onboarding/lib/features/onboarding/api/entities/user_info_entity.dart +0 -24
- package/lib/scaffold/features/onboarding/lib/features/onboarding/api/user_infos_api.dart +0 -71
- package/lib/scaffold/features/onboarding/lib/features/onboarding/models/user_info.dart +0 -92
- package/lib/scaffold/features/onboarding/lib/features/onboarding/providers/onboarding_model.dart +0 -15
- package/lib/scaffold/features/onboarding/lib/features/onboarding/providers/onboarding_provider.dart +0 -78
- package/lib/scaffold/features/onboarding/lib/features/onboarding/repositories/user_infos_repository.dart +0 -29
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/animations/page_transitions.dart +0 -30
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_att_setup.dart +0 -66
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_features.dart +0 -72
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_loader.dart +0 -92
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_notifications_setup.dart +0 -73
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_questions.dart +0 -89
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/onboarding_page.dart +0 -94
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_background.dart +0 -80
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_feature.dart +0 -139
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_illustration_scaffold.dart +0 -110
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_progress.dart +0 -84
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_radio_question.dart +0 -173
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_reassurance.dart +0 -45
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_sticky_footer.dart +0 -77
- package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/selectable_row_tile.dart +0 -392
- package/lib/scaffold/features/revenuecat/lib/core/data/api/tracking_api.dart +0 -116
- package/lib/scaffold/features/revenuecat/lib/core/data/models/subscription.dart +0 -322
- package/lib/scaffold/features/revenuecat/lib/core/home_widgets/home_widget_background_task.dart +0 -41
- package/lib/scaffold/features/revenuecat/lib/core/states/user_state_notifier.dart +0 -305
- package/templates/firebase/assets/images/splashscreen.png +0 -0
|
@@ -1,279 +0,0 @@
|
|
|
1
|
-
import 'dart:math';
|
|
2
|
-
|
|
3
|
-
import 'package:flutter/material.dart';
|
|
4
|
-
import 'package:flutter/services.dart';
|
|
5
|
-
import 'package:kasy_kit/core/theme/theme.dart';
|
|
6
|
-
import 'package:kasy_kit/core/widgets/debouncer.dart';
|
|
7
|
-
|
|
8
|
-
class FeatureCard extends StatefulWidget {
|
|
9
|
-
final String title;
|
|
10
|
-
final String description;
|
|
11
|
-
final int votes;
|
|
12
|
-
final VoidCallback onVote;
|
|
13
|
-
final bool disabled;
|
|
14
|
-
final bool voted;
|
|
15
|
-
|
|
16
|
-
const FeatureCard({
|
|
17
|
-
super.key,
|
|
18
|
-
required this.title,
|
|
19
|
-
required this.description,
|
|
20
|
-
required this.votes,
|
|
21
|
-
required this.onVote,
|
|
22
|
-
this.disabled = false,
|
|
23
|
-
required this.voted,
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
@override
|
|
27
|
-
State<FeatureCard> createState() => _FeatureCardState();
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
class _FeatureCardState extends State<FeatureCard> {
|
|
31
|
-
@override
|
|
32
|
-
Widget build(BuildContext context) {
|
|
33
|
-
return Container(
|
|
34
|
-
padding: const EdgeInsets.all(KasySpacing.lg),
|
|
35
|
-
decoration: BoxDecoration(
|
|
36
|
-
color: context.colors.surface,
|
|
37
|
-
borderRadius: KasyRadius.smBorderRadius,
|
|
38
|
-
border: Border.all(
|
|
39
|
-
color: context.colors.outline,
|
|
40
|
-
),
|
|
41
|
-
boxShadow: [
|
|
42
|
-
BoxShadow(
|
|
43
|
-
color: context.colors.primary.withValues(alpha: 0.05),
|
|
44
|
-
blurRadius: 8,
|
|
45
|
-
offset: const Offset(0, 4),
|
|
46
|
-
),
|
|
47
|
-
BoxShadow(
|
|
48
|
-
color: context.colors.onBackground.withValues(alpha: 0.03),
|
|
49
|
-
blurRadius: 8,
|
|
50
|
-
offset: const Offset(0, 4),
|
|
51
|
-
spreadRadius: 2,
|
|
52
|
-
),
|
|
53
|
-
],
|
|
54
|
-
),
|
|
55
|
-
child: Row(
|
|
56
|
-
children: [
|
|
57
|
-
Expanded(
|
|
58
|
-
child: Column(
|
|
59
|
-
crossAxisAlignment: CrossAxisAlignment.start,
|
|
60
|
-
children: [
|
|
61
|
-
Text(
|
|
62
|
-
widget.title,
|
|
63
|
-
style: context.textTheme.bodyLarge?.copyWith(
|
|
64
|
-
fontWeight: FontWeight.bold,
|
|
65
|
-
),
|
|
66
|
-
),
|
|
67
|
-
const SizedBox(height: KasySpacing.xs),
|
|
68
|
-
Text(
|
|
69
|
-
widget.description,
|
|
70
|
-
style: context.textTheme.bodyMedium?.copyWith(
|
|
71
|
-
fontWeight: FontWeight.w400,
|
|
72
|
-
color: context.colors.muted,
|
|
73
|
-
),
|
|
74
|
-
),
|
|
75
|
-
],
|
|
76
|
-
),
|
|
77
|
-
),
|
|
78
|
-
const SizedBox(width: KasySpacing.md),
|
|
79
|
-
switch (widget.voted) {
|
|
80
|
-
false => VoteCard.blank(
|
|
81
|
-
context: context,
|
|
82
|
-
id: widget.title,
|
|
83
|
-
votes: widget.votes,
|
|
84
|
-
onVote: widget.onVote,
|
|
85
|
-
disabled: widget.disabled,
|
|
86
|
-
),
|
|
87
|
-
true => VoteCard.voted(
|
|
88
|
-
context: context,
|
|
89
|
-
id: widget.title,
|
|
90
|
-
votes: widget.votes,
|
|
91
|
-
onVote: widget.onVote,
|
|
92
|
-
disabled: widget.disabled,
|
|
93
|
-
),
|
|
94
|
-
}
|
|
95
|
-
],
|
|
96
|
-
),
|
|
97
|
-
);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
class VoteCard extends StatefulWidget {
|
|
102
|
-
final int votes;
|
|
103
|
-
final VoidCallback onVote;
|
|
104
|
-
final Color borderColor;
|
|
105
|
-
final Color bgColor;
|
|
106
|
-
final Color textColor;
|
|
107
|
-
final bool isBold;
|
|
108
|
-
final bool disabled;
|
|
109
|
-
final String id;
|
|
110
|
-
|
|
111
|
-
const VoteCard({
|
|
112
|
-
super.key,
|
|
113
|
-
required this.votes,
|
|
114
|
-
required this.onVote,
|
|
115
|
-
required this.bgColor,
|
|
116
|
-
required this.textColor,
|
|
117
|
-
required this.isBold,
|
|
118
|
-
required this.borderColor,
|
|
119
|
-
required this.disabled,
|
|
120
|
-
required this.id,
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
factory VoteCard.blank({
|
|
124
|
-
required BuildContext context,
|
|
125
|
-
required VoidCallback onVote,
|
|
126
|
-
required int votes,
|
|
127
|
-
required bool disabled,
|
|
128
|
-
required String id,
|
|
129
|
-
}) =>
|
|
130
|
-
VoteCard(
|
|
131
|
-
id: id,
|
|
132
|
-
onVote: onVote,
|
|
133
|
-
votes: votes,
|
|
134
|
-
bgColor: context.colors.primary,
|
|
135
|
-
textColor: context.colors.onPrimary,
|
|
136
|
-
borderColor: context.colors.primary,
|
|
137
|
-
isBold: false,
|
|
138
|
-
disabled: disabled,
|
|
139
|
-
);
|
|
140
|
-
|
|
141
|
-
factory VoteCard.voted({
|
|
142
|
-
required BuildContext context,
|
|
143
|
-
required VoidCallback onVote,
|
|
144
|
-
required int votes,
|
|
145
|
-
required bool disabled,
|
|
146
|
-
required String id,
|
|
147
|
-
}) =>
|
|
148
|
-
VoteCard(
|
|
149
|
-
id: id,
|
|
150
|
-
onVote: onVote,
|
|
151
|
-
votes: votes,
|
|
152
|
-
bgColor: context.colors.primary.withValues(alpha: .1),
|
|
153
|
-
textColor: context.colors.onBackground,
|
|
154
|
-
borderColor: context.colors.outline,
|
|
155
|
-
isBold: true,
|
|
156
|
-
disabled: disabled,
|
|
157
|
-
);
|
|
158
|
-
|
|
159
|
-
@override
|
|
160
|
-
State<VoteCard> createState() => _VoteCardState();
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
class _VoteCardState extends State<VoteCard>
|
|
164
|
-
with SingleTickerProviderStateMixin {
|
|
165
|
-
// ignore: use_late_for_private_fields_and_variables
|
|
166
|
-
AnimationController? _controller;
|
|
167
|
-
// ignore: use_late_for_private_fields_and_variables
|
|
168
|
-
Animation<double>? _animation;
|
|
169
|
-
|
|
170
|
-
final debouncer = Debouncer(delay: const Duration(milliseconds: 250));
|
|
171
|
-
bool _goingUp = true;
|
|
172
|
-
|
|
173
|
-
@override
|
|
174
|
-
void initState() {
|
|
175
|
-
super.initState();
|
|
176
|
-
_controller = AnimationController(
|
|
177
|
-
duration: const Duration(milliseconds: 250),
|
|
178
|
-
vsync: this,
|
|
179
|
-
);
|
|
180
|
-
_animation = Tween<double>(begin: 1, end: 1.2).animate(
|
|
181
|
-
CurvedAnimation(parent: _controller!, curve: Curves.easeInOut),
|
|
182
|
-
);
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
@override
|
|
186
|
-
void didUpdateWidget(VoteCard oldWidget) {
|
|
187
|
-
super.didUpdateWidget(oldWidget);
|
|
188
|
-
if (widget.votes != oldWidget.votes) {
|
|
189
|
-
_goingUp = widget.votes > oldWidget.votes;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
@override
|
|
194
|
-
void dispose() {
|
|
195
|
-
_controller?.dispose();
|
|
196
|
-
super.dispose();
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
@override
|
|
200
|
-
Widget build(BuildContext context) {
|
|
201
|
-
return AnimatedBuilder(
|
|
202
|
-
animation: _animation!,
|
|
203
|
-
builder: (context, child) {
|
|
204
|
-
return Transform.scale(scale: _animation!.value, child: child);
|
|
205
|
-
},
|
|
206
|
-
child: Material(
|
|
207
|
-
color: Colors.transparent,
|
|
208
|
-
child: InkWell(
|
|
209
|
-
onTap: () {
|
|
210
|
-
if (widget.disabled) return;
|
|
211
|
-
HapticFeedback.selectionClick();
|
|
212
|
-
SystemSound.play(SystemSoundType.click);
|
|
213
|
-
widget.onVote();
|
|
214
|
-
_controller!.forward().then((_) => _controller!.reverse());
|
|
215
|
-
},
|
|
216
|
-
child: Ink(
|
|
217
|
-
width: 48,
|
|
218
|
-
height: 64,
|
|
219
|
-
decoration: BoxDecoration(
|
|
220
|
-
color: widget.bgColor,
|
|
221
|
-
borderRadius: KasyRadius.smBorderRadius,
|
|
222
|
-
border: Border.all(color: widget.borderColor),
|
|
223
|
-
),
|
|
224
|
-
padding: const EdgeInsets.all(KasySpacing.sm),
|
|
225
|
-
child: Column(
|
|
226
|
-
mainAxisAlignment: MainAxisAlignment.center,
|
|
227
|
-
children: [
|
|
228
|
-
Transform.rotate(
|
|
229
|
-
angle: pi / 2,
|
|
230
|
-
child: Icon(
|
|
231
|
-
Icons.arrow_back_ios,
|
|
232
|
-
size: 16,
|
|
233
|
-
color: widget.textColor,
|
|
234
|
-
),
|
|
235
|
-
),
|
|
236
|
-
ClipRect(
|
|
237
|
-
child: AnimatedSwitcher(
|
|
238
|
-
duration: const Duration(milliseconds: 250),
|
|
239
|
-
transitionBuilder: (child, animation) {
|
|
240
|
-
final isIncoming = (child.key as ValueKey?)?.value ==
|
|
241
|
-
'votes-${widget.id}-${widget.votes}';
|
|
242
|
-
final beginOffset = isIncoming
|
|
243
|
-
? (_goingUp
|
|
244
|
-
? const Offset(0, 1)
|
|
245
|
-
: const Offset(0, -1))
|
|
246
|
-
: (_goingUp
|
|
247
|
-
? const Offset(0, -1)
|
|
248
|
-
: const Offset(0, 1));
|
|
249
|
-
return SlideTransition(
|
|
250
|
-
position: Tween<Offset>(
|
|
251
|
-
begin: beginOffset,
|
|
252
|
-
end: Offset.zero,
|
|
253
|
-
).animate(CurvedAnimation(
|
|
254
|
-
parent: animation,
|
|
255
|
-
curve: Curves.easeOut,
|
|
256
|
-
)),
|
|
257
|
-
child:
|
|
258
|
-
FadeTransition(opacity: animation, child: child),
|
|
259
|
-
);
|
|
260
|
-
},
|
|
261
|
-
child: Text(
|
|
262
|
-
key: ValueKey('votes-${widget.id}-${widget.votes}'),
|
|
263
|
-
widget.votes.toString(),
|
|
264
|
-
style: context.textTheme.bodyLarge?.copyWith(
|
|
265
|
-
fontWeight:
|
|
266
|
-
widget.isBold ? FontWeight.bold : FontWeight.w400,
|
|
267
|
-
color: widget.textColor,
|
|
268
|
-
),
|
|
269
|
-
),
|
|
270
|
-
),
|
|
271
|
-
),
|
|
272
|
-
],
|
|
273
|
-
),
|
|
274
|
-
),
|
|
275
|
-
),
|
|
276
|
-
),
|
|
277
|
-
);
|
|
278
|
-
}
|
|
279
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
# Publish iOS with Codemagic (no Mac)
|
|
2
|
-
|
|
3
|
-
## Prerequisites
|
|
4
|
-
|
|
5
|
-
- [Codemagic](https://codemagic.io) account
|
|
6
|
-
- Git repository connected to Codemagic
|
|
7
|
-
- Apple Developer account + app in App Store Connect
|
|
8
|
-
|
|
9
|
-
## 1. Add CI to the project (if missing)
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
kasy add ci
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
Creates `codemagic.yaml` at the project root.
|
|
16
|
-
|
|
17
|
-
## 2. Configure in the Codemagic dashboard
|
|
18
|
-
|
|
19
|
-
1. Open [codemagic.io/apps](https://codemagic.io/apps) and add your repository.
|
|
20
|
-
2. **Code signing (iOS):** set up App Store distribution certificate and profile.
|
|
21
|
-
3. **Integrations → App Store Connect:** link your Apple account.
|
|
22
|
-
4. **Environment variables:** add to your variable group (e.g. `appstore_credentials`):
|
|
23
|
-
- `BACKEND_URL`, `SENTRY_DSN`, `RC_IOS_API_KEY`, `RC_ANDROID_API_KEY`, `MIXPANEL_TOKEN`
|
|
24
|
-
5. In `codemagic.yaml`, set `APP_ID` (numeric App Store Connect app ID from the app URL).
|
|
25
|
-
|
|
26
|
-
## 3. Configure from the terminal
|
|
27
|
-
|
|
28
|
-
```bash
|
|
29
|
-
kasy codemagic configure
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
Enter **API token** (Settings → Codemagic API), **App ID**, and **Workflow ID** (default `ios-workflow`).
|
|
33
|
-
|
|
34
|
-
## 4. Trigger a build
|
|
35
|
-
|
|
36
|
-
```bash
|
|
37
|
-
kasy codemagic release
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
The cloud build runs and may upload to TestFlight per `codemagic.yaml`.
|
|
41
|
-
|
|
42
|
-
## Build status
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
kasy codemagic status <buildId>
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
## Local Mac
|
|
49
|
-
|
|
50
|
-
If you have a Mac: [ios-release.md](./ios-release.md) and `kasy ios release`.
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
# Publicar iOS con Codemagic (sin Mac)
|
|
2
|
-
|
|
3
|
-
## Requisitos
|
|
4
|
-
|
|
5
|
-
- Cuenta [Codemagic](https://codemagic.io)
|
|
6
|
-
- Repositorio Git conectado a Codemagic
|
|
7
|
-
- Cuenta Apple Developer + app en App Store Connect
|
|
8
|
-
|
|
9
|
-
## 1. Agregar CI al proyecto (si falta)
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
kasy add ci
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
Crea `codemagic.yaml` en la raíz del proyecto.
|
|
16
|
-
|
|
17
|
-
## 2. Configurar en el panel Codemagic
|
|
18
|
-
|
|
19
|
-
1. Abre [codemagic.io/apps](https://codemagic.io/apps) y agrega el repositorio.
|
|
20
|
-
2. **Code signing (iOS):** certificado y perfil de distribución App Store.
|
|
21
|
-
3. **Integrations → App Store Connect:** vincula la cuenta Apple.
|
|
22
|
-
4. **Environment variables:** en el grupo del app (ej. `appstore_credentials`):
|
|
23
|
-
- `BACKEND_URL`, `SENTRY_DSN`, `RC_IOS_API_KEY`, `RC_ANDROID_API_KEY`, `MIXPANEL_TOKEN`
|
|
24
|
-
5. En `codemagic.yaml`, completa `APP_ID` (ID numérico del app en App Store Connect).
|
|
25
|
-
|
|
26
|
-
## 3. Configurar en la terminal
|
|
27
|
-
|
|
28
|
-
```bash
|
|
29
|
-
kasy codemagic configure
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
Indica **API token** (Settings → Codemagic API), **App ID** y **Workflow ID** (`ios-workflow` por defecto).
|
|
33
|
-
|
|
34
|
-
## 4. Disparar build
|
|
35
|
-
|
|
36
|
-
```bash
|
|
37
|
-
kasy codemagic release
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
El build en la nube puede subir a TestFlight según `codemagic.yaml`.
|
|
41
|
-
|
|
42
|
-
## Estado del build
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
kasy codemagic status <buildId>
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
## Mac local
|
|
49
|
-
|
|
50
|
-
Si tienes Mac: [ios-release.md](./ios-release.md) y `kasy ios release`.
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
# Publicar iOS com Codemagic (sem Mac)
|
|
2
|
-
|
|
3
|
-
## Pré-requisitos
|
|
4
|
-
|
|
5
|
-
- Conta [Codemagic](https://codemagic.io)
|
|
6
|
-
- Repositório Git conectado ao Codemagic
|
|
7
|
-
- Conta Apple Developer + app no App Store Connect
|
|
8
|
-
|
|
9
|
-
## 1. Adicionar CI ao projeto (se ainda não tiver)
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
kasy add ci
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
Isso cria `codemagic.yaml` na raiz do projeto.
|
|
16
|
-
|
|
17
|
-
## 2. Configurar no painel Codemagic
|
|
18
|
-
|
|
19
|
-
1. Abra [codemagic.io/apps](https://codemagic.io/apps) e adicione o repositório.
|
|
20
|
-
2. **Code signing (iOS):** configure certificado e perfil de distribuição App Store.
|
|
21
|
-
3. **Integrations → App Store Connect:** conecte a conta Apple (recomendado).
|
|
22
|
-
4. **Environment variables:** adicione no grupo do app (ex.: `appstore_credentials`):
|
|
23
|
-
- `BACKEND_URL`, `SENTRY_DSN`, `RC_IOS_API_KEY`, `RC_ANDROID_API_KEY`, `MIXPANEL_TOKEN`
|
|
24
|
-
5. No `codemagic.yaml`, preencha `APP_ID` (ID numérico do app no App Store Connect — aparece na URL do app).
|
|
25
|
-
|
|
26
|
-
## 3. Configurar no terminal
|
|
27
|
-
|
|
28
|
-
```bash
|
|
29
|
-
kasy codemagic configure
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
Informe o **API token** (Settings → Codemagic API), **App ID** e **Workflow ID** (`ios-workflow` por padrão).
|
|
33
|
-
|
|
34
|
-
## 4. Disparar build
|
|
35
|
-
|
|
36
|
-
```bash
|
|
37
|
-
kasy codemagic release
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
O build roda na nuvem e, conforme o `codemagic.yaml`, pode enviar para TestFlight automaticamente.
|
|
41
|
-
|
|
42
|
-
## Status do build
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
kasy codemagic status <buildId>
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
## Mac local
|
|
49
|
-
|
|
50
|
-
Se tiver Mac: [ios-release.md](./ios-release.md) e `kasy ios release`.
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
# Publish to iOS (App Store)
|
|
2
|
-
|
|
3
|
-
## Prerequisites
|
|
4
|
-
|
|
5
|
-
- Paid [Apple Developer](https://developer.apple.com) account
|
|
6
|
-
- App created in [App Store Connect](https://appstoreconnect.apple.com) with the same **Bundle ID** as your project
|
|
7
|
-
- Mac with Xcode and Flutter installed
|
|
8
|
-
|
|
9
|
-
## One-time setup
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
kasy ios configure
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
Opens Apple links, collects the API key (`.p8`), and writes `.kasy/apple.env` (gitignored).
|
|
16
|
-
|
|
17
|
-
## Ship a new build
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
kasy ios release
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
Bumps the build number in `pubspec.yaml`, builds the IPA, and uploads to App Store Connect (no Transporter).
|
|
24
|
-
|
|
25
|
-
Shortcut: `make release-ios`
|
|
26
|
-
|
|
27
|
-
### Options
|
|
28
|
-
|
|
29
|
-
- `kasy ios build` — IPA only, no upload
|
|
30
|
-
- `kasy ios release --no-bump` — skip build number bump
|
|
31
|
-
- `kasy ios release --version-name 1.0.1` — change marketing version
|
|
32
|
-
|
|
33
|
-
## No Mac?
|
|
34
|
-
|
|
35
|
-
Use cloud builds: [codemagic-release.md](./codemagic-release.md) and `kasy codemagic configure` / `kasy codemagic release`.
|
|
36
|
-
|
|
37
|
-
## Check environment
|
|
38
|
-
|
|
39
|
-
```bash
|
|
40
|
-
kasy doctor
|
|
41
|
-
```
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
# Publicar en iOS (App Store)
|
|
2
|
-
|
|
3
|
-
## Requisitos
|
|
4
|
-
|
|
5
|
-
- Cuenta de pago [Apple Developer](https://developer.apple.com)
|
|
6
|
-
- App creada en [App Store Connect](https://appstoreconnect.apple.com) con el mismo **Bundle ID** del proyecto
|
|
7
|
-
- Mac con Xcode y Flutter instalados
|
|
8
|
-
|
|
9
|
-
## Configuración única
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
kasy ios configure
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
Abre los enlaces de Apple, pide la clave API (`.p8`) y guarda `.kasy/apple.env` (no se sube a Git).
|
|
16
|
-
|
|
17
|
-
## Enviar nueva versión
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
kasy ios release
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
Incrementa el build en `pubspec.yaml`, genera el IPA y lo sube a App Store Connect (sin Transporter).
|
|
24
|
-
|
|
25
|
-
Atajo: `make release-ios`
|
|
26
|
-
|
|
27
|
-
### Opciones
|
|
28
|
-
|
|
29
|
-
- `kasy ios build` — solo IPA, sin subir
|
|
30
|
-
- `kasy ios release --no-bump` — no incrementar build
|
|
31
|
-
- `kasy ios release --version-name 1.0.1` — cambiar versión visible
|
|
32
|
-
|
|
33
|
-
## ¿Sin Mac?
|
|
34
|
-
|
|
35
|
-
Build en la nube: [codemagic-release.md](./codemagic-release.md) y `kasy codemagic configure` / `kasy codemagic release`.
|
|
36
|
-
|
|
37
|
-
## Verificar entorno
|
|
38
|
-
|
|
39
|
-
```bash
|
|
40
|
-
kasy doctor
|
|
41
|
-
```
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
# Publicar no iOS (App Store)
|
|
2
|
-
|
|
3
|
-
## Pré-requisitos
|
|
4
|
-
|
|
5
|
-
- Conta [Apple Developer](https://developer.apple.com) (paga)
|
|
6
|
-
- App criado no [App Store Connect](https://appstoreconnect.apple.com) com o mesmo **Bundle ID** do projeto
|
|
7
|
-
- Mac com Xcode e Flutter instalados
|
|
8
|
-
|
|
9
|
-
## Configuração única
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
kasy ios configure
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
O comando abre os links da Apple, pede a chave API (`.p8`) e grava `.kasy/apple.env` (não vai para o Git).
|
|
16
|
-
|
|
17
|
-
## Enviar nova versão
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
kasy ios release
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
Isso incrementa o build no `pubspec.yaml`, gera o IPA e envia para a App Store Connect (sem Transporter).
|
|
24
|
-
|
|
25
|
-
Atalho: `make release-ios`
|
|
26
|
-
|
|
27
|
-
### Opções
|
|
28
|
-
|
|
29
|
-
- `kasy ios build` — só gera o IPA, sem enviar
|
|
30
|
-
- `kasy ios release --no-bump` — não incrementa o build
|
|
31
|
-
- `kasy ios release --version-name 1.0.1` — altera a versão visível
|
|
32
|
-
|
|
33
|
-
## Sem Mac?
|
|
34
|
-
|
|
35
|
-
Use build na nuvem: [codemagic-release.md](./codemagic-release.md) e `kasy codemagic configure` / `kasy codemagic release`.
|
|
36
|
-
|
|
37
|
-
## Verificar ambiente
|
|
38
|
-
|
|
39
|
-
```bash
|
|
40
|
-
kasy doctor
|
|
41
|
-
```
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
'use strict';
|
|
3
|
-
|
|
4
|
-
const fs = require('node:fs');
|
|
5
|
-
const path = require('node:path');
|
|
6
|
-
|
|
7
|
-
const root = path.resolve(__dirname, '..');
|
|
8
|
-
const pubspecPath = path.join(root, 'pubspec.yaml');
|
|
9
|
-
|
|
10
|
-
function parseArgs() {
|
|
11
|
-
const args = process.argv.slice(2);
|
|
12
|
-
let versionName = null;
|
|
13
|
-
for (let i = 0; i < args.length; i += 1) {
|
|
14
|
-
if (args[i] === '--version-name' && args[i + 1]) {
|
|
15
|
-
versionName = args[i + 1];
|
|
16
|
-
i += 1;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
return { versionName };
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function bumpPubspecVersion(content, versionNameOverride) {
|
|
23
|
-
const match = content.match(/^version:\s*(\d+\.\d+\.\d+)\+(\d+)\s*$/m);
|
|
24
|
-
if (!match) {
|
|
25
|
-
throw new Error('Invalid version line in pubspec.yaml (expected format: 1.0.0+1)');
|
|
26
|
-
}
|
|
27
|
-
const name = versionNameOverride || match[1];
|
|
28
|
-
const build = parseInt(match[2], 10) + 1;
|
|
29
|
-
const next = `version: ${name}+${build}`;
|
|
30
|
-
const updated = content.replace(/^version:\s*.*/m, next);
|
|
31
|
-
return { updated, label: `${name}+${build}` };
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const { versionName } = parseArgs();
|
|
35
|
-
const content = fs.readFileSync(pubspecPath, 'utf8');
|
|
36
|
-
const { updated, label } = bumpPubspecVersion(content, versionName);
|
|
37
|
-
fs.writeFileSync(pubspecPath, updated);
|
|
38
|
-
console.log(label);
|