use new buttons
Some checks failed
Flutter analyze & test / flutter_analyze_and_test (push) Has been cancelled

This commit is contained in:
otsmr 2026-07-30 11:59:13 +02:00
parent 753500ebfa
commit 60c553e53c
8 changed files with 119 additions and 69 deletions

View file

@ -3434,6 +3434,12 @@ abstract class AppLocalizations {
/// **'Zero ads. Total privacy.'**
String get subscriptionPledgeSubtitle;
/// No description provided for @subscriptionManage.
///
/// In en, this message translates to:
/// **'Manage subscription'**
String get subscriptionManage;
/// No description provided for @dragToZoom.
///
/// In en, this message translates to:

View file

@ -1980,6 +1980,9 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get subscriptionPledgeSubtitle => 'Keine Werbung. Volle Privatsphäre.';
@override
String get subscriptionManage => 'Abonnement verwalten';
@override
String get dragToZoom => 'Zum Zoomen ziehen';

View file

@ -1965,6 +1965,9 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get subscriptionPledgeSubtitle => 'Zero ads. Total privacy.';
@override
String get subscriptionManage => 'Manage subscription';
@override
String get dragToZoom => 'Drag to Zoom';

@ -1 +1 @@
Subproject commit 659bfb084ea26d5471dea6c6d8e1c950c95ecea2
Subproject commit 2f37f6cd8ebd07dbc113bab0d5816bd37fb4fca6

View file

@ -13,6 +13,7 @@ import 'package:twonly/src/services/subscription.service.dart';
import 'package:twonly/src/utils/misc.dart';
import 'package:twonly/src/visual/components/alert.dialog.dart';
import 'package:twonly/src/visual/components/snackbar.dart';
import 'package:twonly/src/visual/elements/my_button.element.dart';
import 'package:twonly/src/visual/views/settings/subscription/select_additional_users.view.dart';
class AdditionalUsersView extends StatefulWidget {
@ -57,7 +58,8 @@ class _AdditionalUsersViewState extends State<AdditionalUsersView> {
}
Future<void> addAdditionalUser() async {
final selectedUserIds = await context.navPush(
final selectedUserIds =
await context.navPush(
SelectAdditionalUsers(
limit: _planLimit,
alreadySelected:
@ -66,7 +68,8 @@ class _AdditionalUsersViewState extends State<AdditionalUsersView> {
.toList() ??
[],
),
) as List<int>?;
)
as List<int>?;
if (selectedUserIds == null) return;
for (final selectedUserId in selectedUserIds) {
final res = await apiService.addAdditionalUser(Int64(selectedUserId));
@ -110,7 +113,8 @@ class _AdditionalUsersViewState extends State<AdditionalUsersView> {
Center(
child: Padding(
padding: const EdgeInsets.all(12),
child: FilledButton(
child: MyButton(
variant: MyButtonVariant.primaryMiddle,
onPressed: addAdditionalUser,
child: Text(
context.lang.additionalUserAddButton(

View file

@ -14,6 +14,7 @@ import 'package:twonly/src/visual/components/flame_counter.comp.dart';
import 'package:twonly/src/visual/context_menu/user.context_menu.dart';
import 'package:twonly/src/visual/decorations/input_text.decoration.dart';
import 'package:twonly/src/visual/elements/contact_chip.element.dart';
import 'package:twonly/src/visual/elements/my_button.element.dart';
class SelectAdditionalUsers extends StatefulWidget {
const SelectAdditionalUsers({
@ -101,17 +102,24 @@ class _SelectAdditionalUsers extends State<SelectAdditionalUsers> {
title: Text(context.lang.additionalUserSelectTitle),
),
floatingActionButtonAnimator: FloatingActionButtonAnimator.noAnimation,
floatingActionButton: FilledButton.icon(
floatingActionButton: MyButton(
variant: MyButtonVariant.primaryMiddle,
onPressed: selectedUsers.isEmpty
? null
: () => Navigator.pop(context, selectedUsers.toList()),
label: Text(
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
const FaIcon(FontAwesomeIcons.userPlus, size: 16),
const SizedBox(width: 8),
Text(
context.lang.additionalUserSelectButton(
widget.limit,
selectedUsers.length + widget.alreadySelected.length,
),
),
icon: const FaIcon(FontAwesomeIcons.userPlus),
],
),
),
body: SafeArea(
child: Padding(

View file

@ -11,6 +11,7 @@ import 'package:twonly/src/providers/purchases.provider.dart';
import 'package:twonly/src/services/subscription.service.dart';
import 'package:twonly/src/utils/misc.dart';
import 'package:twonly/src/visual/elements/better_list_title.element.dart';
import 'package:twonly/src/visual/elements/my_button.element.dart';
import 'package:twonly/src/visual/views/settings/subscription/additional_users.view.dart';
import 'package:url_launcher/url_launcher.dart';
@ -141,6 +142,23 @@ class _SubscriptionViewState extends State<SubscriptionView> {
),
],
const SizedBox(height: 30),
if (isPayingUser(currentPlan) ||
currentPlan == SubscriptionPlan.Tester) ...[
BetterListTile(
icon: FontAwesomeIcons.userPlus,
text: context.lang.manageAdditionalUsers,
subtitle: loaded ? Text('${context.lang.open}: 3') : null,
onTap: () async {
await context.navPush(
AdditionalUsersView(
ballance: ballance,
),
);
await initAsync();
},
),
const Divider(),
],
BetterListTile(
icon: FontAwesomeIcons.fileContract,
text: context.lang.termsOfService,
@ -172,24 +190,6 @@ class _SubscriptionViewState extends State<SubscriptionView> {
);
},
),
if (isPayingUser(currentPlan) ||
currentPlan == SubscriptionPlan.Tester)
const Divider(),
if (isPayingUser(currentPlan) ||
currentPlan == SubscriptionPlan.Tester)
BetterListTile(
icon: FontAwesomeIcons.userPlus,
text: context.lang.manageAdditionalUsers,
subtitle: loaded ? Text('${context.lang.open}: 3') : null,
onTap: () async {
await context.navPush(
AdditionalUsersView(
ballance: ballance,
),
);
await initAsync();
},
),
],
),
);
@ -310,8 +310,10 @@ class _PlanCardState extends State<PlanCard> {
),
),
const SizedBox(height: 10),
if (currentPlan == widget.plan)
FilledButton.icon(
if (currentPlan == widget.plan &&
widget.plan != SubscriptionPlan.Tester)
MyButton(
variant: MyButtonVariant.primaryMiddle,
onPressed: () async {
var url = 'https://apps.apple.com/account/subscriptions';
if (Platform.isAndroid) {
@ -323,56 +325,80 @@ class _PlanCardState extends State<PlanCard> {
mode: LaunchMode.externalApplication,
);
},
label: const Text('Manage subscription'),
child: Text(context.lang.subscriptionManage),
),
if (widget.onPurchase != null &&
monthlyProduct != null &&
!isPayingUser(currentPlan))
OutlinedButton.icon(
!isPayingUser(currentPlan)) ...[
const SizedBox(height: 8),
MyButton(
variant: MyButtonVariant.primaryMiddle,
onPressed: _isLoading != null
? null
: () => onButtonPressed(monthlyProduct),
icon: _isLoading == monthlyProduct
? const SizedBox(
width: 10,
height: 10,
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
if (_isLoading == monthlyProduct) ...[
const SizedBox(
width: 14,
height: 14,
child: CircularProgressIndicator.adaptive(
strokeWidth: 1,
strokeWidth: 2,
),
)
: null,
label: Text(
),
const SizedBox(width: 8),
],
Flexible(
child: Text(
context.lang.upgradeToPaidPlanButton(
widget.plan.name,
' (${getFormattedPrice(monthlyProduct)}/${context.lang.month})',
),
textAlign: TextAlign.center,
),
),
],
),
),
],
if (widget.onPurchase != null &&
(yearlyProduct != null && !isPayingUser(currentPlan)))
FilledButton.icon(
(yearlyProduct != null && !isPayingUser(currentPlan))) ...[
const SizedBox(height: 8),
MyButton(
variant: MyButtonVariant.primaryMiddle,
onPressed: _isLoading != null
? null
: () => onButtonPressed(yearlyProduct),
icon: _isLoading == yearlyProduct
? const SizedBox(
width: 10,
height: 10,
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
if (_isLoading == yearlyProduct) ...[
const SizedBox(
width: 14,
height: 14,
child: CircularProgressIndicator.adaptive(
strokeWidth: 1,
strokeWidth: 2,
),
)
: null,
label: Text(
),
const SizedBox(width: 8),
],
Flexible(
child: Text(
context.lang.upgradeToPaidPlanButton(
widget.plan.name,
' (${getFormattedPrice(yearlyProduct)}/${context.lang.year})',
),
textAlign: TextAlign.center,
),
),
],
),
),
],
],
),
),
),
);
}

View file

@ -3,7 +3,7 @@ description: "twonly, a privacy-friendly way to connect with friends through sec
publish_to: 'none'
version: 0.4.3+163
version: 0.4.3+164
environment:
sdk: ^3.11.0