[imp]: improve onboarding permission

This commit is contained in:
nahnah
2026-03-12 21:59:20 +00:00
parent 9e68131660
commit 3b1b084b82
2 changed files with 104 additions and 37 deletions
+101 -34
View File
@@ -1,6 +1,7 @@
import 'dart:convert';
import 'package:florid/l10n/app_localizations.dart';
import 'package:florid/widgets/list_icon.dart';
import 'package:florid/widgets/onboarding_button.dart';
import 'package:flutter/material.dart';
import 'package:flutter_animate/flutter_animate.dart';
@@ -81,6 +82,20 @@ class _OnboardingScreenState extends State<OnboardingScreen> {
}
void _startSetup() {
if (!_installPermissionGranted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('App installation permission is required to continue.'),
),
);
_pageController.animateToPage(
1,
duration: const Duration(milliseconds: 250),
curve: Curves.easeOut,
);
return;
}
// Navigate to progress screen
_pageController.nextPage(
duration: const Duration(milliseconds: 500),
@@ -311,9 +326,11 @@ class _OnboardingScreenState extends State<OnboardingScreen> {
child: OnboardingPrimaryButton(
currentPage: _currentPage,
isFinishing: _isFinishing,
canProceedFromRepos: _selectedRepos.values.any(
(selected) => selected,
),
canProceed: _currentPage == 1
? _installPermissionGranted
: _currentPage == 2
? _selectedRepos.values.any((selected) => selected)
: true,
onNext: () {
_pageController.nextPage(
duration: const Duration(milliseconds: 250),
@@ -533,43 +550,93 @@ class _PermissionsStep extends StatelessWidget {
return SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(24),
padding: const EdgeInsets.symmetric(vertical: 24),
child: Column(
spacing: 24.0,
spacing: 16.0,
children: [
Row(
spacing: 8,
children: [
CircleAvatar(child: Icon(Symbols.notifications_active)),
Text(
localizations.request_permissions,
style: Theme.of(context).textTheme.headlineSmall,
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Column(
spacing: 16.0,
children: [
Row(
spacing: 8,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
CircleAvatar(child: Icon(Symbols.notifications_active)),
Text(
localizations.request_permissions,
style: Theme.of(context).textTheme.headlineSmall,
),
],
).animate().fadeIn(duration: 500.ms),
Text(
localizations.permissions_step_description,
style: Theme.of(context).textTheme.bodyLarge?.copyWith(
color: colorScheme.onSurfaceVariant,
),
).animate().fadeIn(duration: 500.ms, delay: 200.ms),
],
),
),
// Column(
// spacing: 12,
// children: [
// _PermissionCard(
// icon: Symbols.notifications,
// title: localizations.notifications,
// description: localizations.get_notified_updates,
// isGranted: notificationsGranted,
// onRequest: onRequestNotifications,
// ).animate().fadeIn(duration: 500.ms, delay: 400.ms),
// _PermissionCard(
// icon: Symbols.install_mobile,
// title: localizations.app_installation,
// description: localizations.allow_florid_install_apps,
// isGranted: installPermissionGranted,
// onRequest: onRequestInstallPermission,
// ).animate().fadeIn(duration: 500.ms, delay: 600.ms),
// ],
// ),
MListView(
items: [
MListItemData(
title: localizations.app_installation,
subtitle: localizations.allow_florid_install_apps,
leading: ListIcon(
iconData: Symbols.install_mobile,
// color: colorScheme.primary,
),
onTap: () {},
selected: installPermissionGranted,
suffix: FilledButton.tonal(
onPressed: onRequestInstallPermission,
child: Text(AppLocalizations.of(context)!.allow),
),
),
],
).animate().fadeIn(duration: 500.ms),
Text(
localizations.permissions_step_description,
style: Theme.of(context).textTheme.bodyLarge?.copyWith(
color: colorScheme.onSurfaceVariant,
),
).animate().fadeIn(duration: 500.ms, delay: 200.ms),
),
Column(
spacing: 12,
children: [
_PermissionCard(
icon: Symbols.notifications,
title: localizations.notifications,
description: localizations.get_notified_updates,
isGranted: notificationsGranted,
onRequest: onRequestNotifications,
).animate().fadeIn(duration: 500.ms, delay: 400.ms),
_PermissionCard(
icon: Symbols.install_mobile,
title: localizations.app_installation,
description: localizations.allow_florid_install_apps,
isGranted: installPermissionGranted,
onRequest: onRequestInstallPermission,
).animate().fadeIn(duration: 500.ms, delay: 600.ms),
MListHeader(title: 'Optional'),
MListView(
items: [
MListItemData(
title: localizations.notifications,
subtitle: localizations.get_notified_updates,
leading: ListIcon(
iconData: Symbols.notifications,
// color: colorScheme.primary,
),
onTap: () {},
selected: notificationsGranted,
suffix: FilledButton.tonal(
onPressed: onRequestNotifications,
child: Text(AppLocalizations.of(context)!.allow),
),
),
],
),
],
),
Text(
+3 -3
View File
@@ -6,14 +6,14 @@ class OnboardingPrimaryButton extends StatelessWidget {
super.key,
required this.currentPage,
required this.isFinishing,
required this.canProceedFromRepos,
required this.canProceed,
required this.onNext,
required this.onStartSetup,
});
final int currentPage;
final bool isFinishing;
final bool canProceedFromRepos;
final bool canProceed;
final VoidCallback onNext;
final VoidCallback onStartSetup;
@@ -21,7 +21,7 @@ class OnboardingPrimaryButton extends StatelessWidget {
Widget build(BuildContext context) {
final localizations = AppLocalizations.of(context)!;
final isRepoStep = currentPage == 2;
final isEnabled = !isFinishing && (!isRepoStep || canProceedFromRepos);
final isEnabled = !isFinishing && canProceed;
final onPressed = !isEnabled
? null