Files
feeddeck/app/lib/widgets/settings/premium/settings_premium.dart
Rico Berger f8262dbe7f [core] Enable In-App Purchases for Android (#38)
This commit enables in-app purchases for Android, so that a user can
also subscribe to FeedDeck Premium on Android.
2023-10-18 21:04:32 +02:00

199 lines
6.7 KiB
Dart

import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:feeddeck/models/profile.dart';
import 'package:feeddeck/repositories/profile_repository.dart';
import 'package:feeddeck/repositories/settings_repository.dart';
import 'package:feeddeck/utils/constants.dart';
import 'package:feeddeck/utils/fd_icons.dart';
import 'package:feeddeck/widgets/general/logo.dart';
import 'package:feeddeck/widgets/settings/premium/settings_premium_inapp.dart';
import 'package:feeddeck/widgets/settings/premium/settings_premium_inapp_restore.dart';
import 'package:feeddeck/widgets/settings/premium/settings_premium_stripe.dart';
class SettingsPremium extends StatelessWidget {
const SettingsPremium({super.key});
/// [_showPaymentModal] show a modal to subscribe to FeedDeck Premium via
/// Stripe on the web, Linux and Windows. On macOS, Android and iOS the modal
/// to subscribe via in-app purchases is shown.
void _showPaymentModal(BuildContext context) {
if (kIsWeb || Platform.isLinux || Platform.isWindows) {
showModalBottomSheet(
context: context,
isScrollControlled: true,
isDismissible: true,
useSafeArea: true,
backgroundColor: Colors.transparent,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(
top: Radius.circular(Constants.spacingMiddle),
),
),
clipBehavior: Clip.antiAliasWithSaveLayer,
constraints: const BoxConstraints(
maxWidth: Constants.centeredFormMaxWidth,
),
builder: (BuildContext context) {
return const SettingsPremiumStripe();
},
);
} else if (Platform.isMacOS || Platform.isAndroid || Platform.isIOS) {
showModalBottomSheet(
context: context,
isScrollControlled: true,
isDismissible: true,
useSafeArea: true,
backgroundColor: Colors.transparent,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(
top: Radius.circular(Constants.spacingMiddle),
),
),
clipBehavior: Clip.antiAliasWithSaveLayer,
constraints: const BoxConstraints(
maxWidth: Constants.centeredFormMaxWidth,
),
builder: (BuildContext context) {
return const SettingsPremiumInApp();
},
);
}
}
@override
Widget build(BuildContext context) {
ProfileRepository profile = Provider.of<ProfileRepository>(
context,
listen: true,
);
/// If subscriptions are disabled, because the user uses a custom Supabase
/// instance or if the profile is not initialized yet or if the user is
/// already on the premium tier we do not show the option to subscribe to
/// FeedDeck Premium.
if (!SettingsRepository().subscriptionEnabled) {
return Container();
}
if (profile.status == FDProfileStatus.uninitialized) {
return Container();
}
if (profile.tier != FDProfileTier.free) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Card(
color: Constants.primary,
margin: const EdgeInsets.only(
bottom: Constants.spacingSmall,
),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Padding(
padding: const EdgeInsets.all(
Constants.spacingMiddle,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
Characters('You are using FeedDeck Premium')
.replaceAll(
Characters(''),
Characters('\u{200B}'),
)
.toString(),
maxLines: 1,
style: const TextStyle(
color: Constants.onPrimary,
overflow: TextOverflow.ellipsis,
),
),
],
),
),
const Icon(
FDIcons.feeddeck,
color: Constants.onPrimary,
),
],
),
),
],
),
),
const SizedBox(
height: Constants.spacingMiddle,
),
],
);
}
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
MouseRegion(
cursor: SystemMouseCursors.click,
child: GestureDetector(
onTap: () => _showPaymentModal(context),
child: Card(
color: Constants.primary,
margin: const EdgeInsets.only(
bottom: Constants.spacingSmall,
),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
child: const Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Padding(
padding: EdgeInsets.all(
Constants.spacingMiddle,
),
child: Column(
children: [
Logo(size: 64),
SizedBox(
height: Constants.spacingSmall,
),
Text(
'Subscribe to FeedDeck Premium',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
color: Constants.onPrimary,
),
),
],
),
),
],
),
),
),
),
const SettingsPremiumInAppRestore(),
const SizedBox(
height: Constants.spacingMiddle,
),
],
);
}
}