feat: change onboarding flow and remove theme switch button

This commit is contained in:
Udhay-Adithya
2025-03-17 18:11:13 +05:30
parent b64d453886
commit 9de706d6b9
5 changed files with 81 additions and 96 deletions

View File

@@ -1,5 +1,8 @@
// ignore_for_file: use_build_context_synchronously // ignore_for_file: use_build_context_synchronously
import 'dart:developer' show log;
import 'package:apidash/screens/mobile/onboarding_screen.dart';
import 'package:apidash_design_system/apidash_design_system.dart'; import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_portal/flutter_portal.dart'; import 'package:flutter_portal/flutter_portal.dart';
@@ -104,6 +107,10 @@ class _AppState extends ConsumerState<App> with WindowListener {
class DashApp extends ConsumerWidget { class DashApp extends ConsumerWidget {
const DashApp({super.key}); const DashApp({super.key});
Future<bool> _checkOnboardingStatus() async {
return await getOnboardingStatusFromSharedPrefs();
}
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final isDarkMode = final isDarkMode =
@@ -111,6 +118,7 @@ class DashApp extends ConsumerWidget {
final workspaceFolderPath = ref final workspaceFolderPath = ref
.watch(settingsProvider.select((value) => value.workspaceFolderPath)); .watch(settingsProvider.select((value) => value.workspaceFolderPath));
final showWorkspaceSelector = kIsDesktop && (workspaceFolderPath == null); final showWorkspaceSelector = kIsDesktop && (workspaceFolderPath == null);
return Portal( return Portal(
child: MaterialApp( child: MaterialApp(
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
@@ -133,24 +141,41 @@ class DashApp extends ConsumerWidget {
} }
}, },
) )
: Stack( : kIsMobile
children: [ ? FutureBuilder<bool>(
!kIsLinux && !kIsMobile future: _checkOnboardingStatus(),
? const App() builder: (context, snapshot) {
: context.isMediumWindow if (snapshot.connectionState == ConnectionState.waiting) {
? const MobileDashboard() return const Center(child: CircularProgressIndicator());
: const Dashboard(), }
if (kIsWindows) if (snapshot.connectionState == ConnectionState.done) {
SizedBox( log(snapshot.data.toString());
height: 29, final showOnboarding = snapshot.data ?? false;
child: WindowCaption( return showOnboarding
backgroundColor: Colors.transparent, ? const MobileDashboard()
brightness: : const OnboardingScreen();
isDarkMode ? Brightness.dark : Brightness.light, }
), return const MobileDashboard();
), },
], )
), : Stack(
children: [
!kIsLinux && !kIsMobile
? const App()
: context.isMediumWindow
? const MobileDashboard()
: const Dashboard(),
if (kIsWindows)
SizedBox(
height: 29,
child: WindowCaption(
backgroundColor: Colors.transparent,
brightness:
isDarkMode ? Brightness.dark : Brightness.light,
),
),
],
),
), ),
); );
} }

View File

@@ -1,29 +0,0 @@
import 'package:apidash/providers/settings_providers.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
class ThemeSwitchButton extends StatelessWidget {
const ThemeSwitchButton({super.key});
@override
Widget build(BuildContext context) {
return Consumer(builder: (context, ref, child) {
final settings = ref.watch(settingsProvider);
return IconButton(
icon: settings.isDark
? const Icon(
Icons.dark_mode_rounded,
color: Colors.indigo,
)
: const Icon(
Icons.light_mode_rounded,
color: Colors.yellow,
),
onPressed: () {
ref.read(settingsProvider.notifier).update(isDark: !settings.isDark);
},
);
});
}
}

View File

@@ -1,5 +1,3 @@
import 'package:apidash/screens/mobile/onboarding_screen.dart';
import 'package:apidash/services/shared_preferences_services.dart';
import 'package:apidash_design_system/apidash_design_system.dart'; import 'package:apidash_design_system/apidash_design_system.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
@@ -21,50 +19,41 @@ class MobileDashboard extends ConsumerStatefulWidget {
} }
class _MobileDashboardState extends ConsumerState<MobileDashboard> { class _MobileDashboardState extends ConsumerState<MobileDashboard> {
Future<bool> _checkOnboardingStatus() async {
return await getOnboardingStatusFromSharedPrefs();
}
@override @override
Widget build(BuildContext context) { Widget build(
return FutureBuilder<bool>( BuildContext context,
future: _checkOnboardingStatus(), ) {
builder: (context, snapshot) { final railIdx = ref.watch(navRailIndexStateProvider);
final railIdx = ref.watch(navRailIndexStateProvider); final isLeftDrawerOpen = ref.watch(leftDrawerStateProvider);
final isLeftDrawerOpen = ref.watch(leftDrawerStateProvider);
if (snapshot.connectionState == ConnectionState.waiting) { return AnnotatedRegion<SystemUiOverlayStyle>(
return const Center(child: CircularProgressIndicator()); value: FlexColorScheme.themedSystemNavigationBar(
} else if (snapshot.data == false) { context,
return const OnboardingScreen(); opacity: 0,
} noAppBar: true,
return AnnotatedRegion<SystemUiOverlayStyle>( ),
value: FlexColorScheme.themedSystemNavigationBar( child: Stack(
context, alignment: AlignmentDirectional.bottomCenter,
opacity: 0, children: [
noAppBar: true, PageBranch(
pageIndex: railIdx,
), ),
child: Stack( if (context.isMediumWindow)
alignment: AlignmentDirectional.bottomCenter, AnimatedPositioned(
children: [ bottom: railIdx > 2
PageBranch(pageIndex: railIdx), ? 0
if (context.isMediumWindow) : isLeftDrawerOpen
AnimatedPositioned(
bottom: railIdx > 2
? 0 ? 0
: isLeftDrawerOpen : -(72 + MediaQuery.paddingOf(context).bottom),
? 0 left: 0,
: -(72 + MediaQuery.paddingOf(context).bottom), right: 0,
left: 0, height: 70 + MediaQuery.paddingOf(context).bottom,
right: 0, duration: const Duration(milliseconds: 200),
height: 70 + MediaQuery.paddingOf(context).bottom, curve: Curves.easeOut,
duration: const Duration(milliseconds: 200), child: const BottomNavBar(),
curve: Curves.easeOut, ),
child: const BottomNavBar(), ],
), ),
],
),
);
},
); );
} }
} }

View File

@@ -1,5 +1,4 @@
import 'package:apidash/consts.dart'; import 'package:apidash/consts.dart';
import 'package:apidash/screens/common_widgets/theme_switch_button.dart';
import 'package:apidash/screens/mobile/widgets/onboarding_slide.dart'; import 'package:apidash/screens/mobile/widgets/onboarding_slide.dart';
import 'package:apidash/screens/screens.dart'; import 'package:apidash/screens/screens.dart';
import 'package:apidash/services/services.dart'; import 'package:apidash/services/services.dart';
@@ -42,7 +41,6 @@ class _OnboardingScreenState extends State<OnboardingScreen> {
appBar: AppBar( appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.surface, backgroundColor: Theme.of(context).colorScheme.surface,
actions: [ actions: [
const ThemeSwitchButton(),
TextButton( TextButton(
onPressed: () async { onPressed: () async {
Navigator.pushAndRemoveUntil( Navigator.pushAndRemoveUntil(
@@ -143,9 +141,11 @@ class _OnboardingScreenState extends State<OnboardingScreen> {
child: IconButton( child: IconButton(
onPressed: () async { onPressed: () async {
_onNextPressed(); _onNextPressed();
await setOnboardingStatusToSharedPrefs( if (currentPageIndex == 2) {
isOnboardingComplete: true, await setOnboardingStatusToSharedPrefs(
); isOnboardingComplete: true,
);
}
}, },
icon: const Icon( icon: const Icon(
Icons.arrow_forward_rounded, Icons.arrow_forward_rounded,

View File

@@ -37,5 +37,5 @@ Future<bool> getOnboardingStatusFromSharedPrefs() async {
Future<void> clearSharedPrefs() async { Future<void> clearSharedPrefs() async {
final prefs = await SharedPreferences.getInstance(); final prefs = await SharedPreferences.getInstance();
await prefs.remove(kSharedPrefSettingsKey); await prefs.clear();
} }