import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../router.dart'; const _kOnboardingDone = 'onboarding_done'; const _kPink = Color(0xFFBE7C8A); class _OnboardingPage { final String title; final String text; final String image; const _OnboardingPage({ required this.title, required this.text, required this.image, }); } const _pages = [ _OnboardingPage( title: 'Langsung Curhat', text: 'Tidak perlu form panjang atau janji. Masuk dan langsung ngobrol.', image: 'assets/images/splash/splash_1.png', ), _OnboardingPage( title: '100% Anonim', text: 'Identitas kamu tidak akan ditampilkan. Cerita dengan tenang, tanpa khawatir.', image: 'assets/images/splash/splash_2.png', ), _OnboardingPage( title: 'Bestie yang Relevan', text: 'Kamu akan dipasangkan dengan bestie berdasarkan topik & kondisi kamu saat ini.', image: 'assets/images/splash/splash_3.png', ), ]; class OnboardingScreen extends ConsumerStatefulWidget { const OnboardingScreen({super.key}); @override ConsumerState createState() => _OnboardingScreenState(); } class _OnboardingScreenState extends ConsumerState { final _controller = PageController(); int _currentPage = 0; @override void initState() { super.initState(); // Auto-advance: page 0 → 1 after 500ms _scheduleAutoAdvance(0); } @override void dispose() { _controller.dispose(); super.dispose(); } void _scheduleAutoAdvance(int fromPage) { // Only auto-advance for pages 0 and 1 if (fromPage >= 2) return; Future.delayed(const Duration(seconds: 1), () { if (mounted && _currentPage == fromPage) { _controller.nextPage( duration: const Duration(milliseconds: 300), curve: Curves.easeInOut, ); } }); } void _onPageChanged(int index) { setState(() => _currentPage = index); _scheduleAutoAdvance(index); } Future _finish() async { final prefs = await SharedPreferences.getInstance(); await prefs.setBool(_kOnboardingDone, true); ref.invalidate(onboardingDoneProvider); if (mounted) { context.go('/home'); } } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, body: SafeArea( child: Column( children: [ Expanded( child: PageView.builder( controller: _controller, itemCount: _pages.length, onPageChanged: _onPageChanged, physics: const NeverScrollableScrollPhysics(), itemBuilder: (context, index) { final page = _pages[index]; return _buildPage(page); }, ), ), Padding( padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 32), child: Row( children: [ // Page indicators Row( children: List.generate(_pages.length, (index) { final isActive = index == _currentPage; return Container( margin: const EdgeInsets.only(right: 8), width: isActive ? 32 : 12, height: 6, decoration: BoxDecoration( color: isActive ? _kPink : _kPink.withValues(alpha: 0.3), borderRadius: BorderRadius.circular(3), ), ); }), ), const Spacer(), // CTA button — only show "Mulai" on last page if (_currentPage == _pages.length - 1) GestureDetector( onTap: _finish, child: Container( height: 56, padding: const EdgeInsets.symmetric(horizontal: 32), decoration: BoxDecoration( color: _kPink, borderRadius: BorderRadius.circular(16), ), child: const Center( child: Text( 'Mulai', style: TextStyle( color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold, ), ), ), ), ), ], ), ), ], ), ), ); } Widget _buildPage(_OnboardingPage page) { return Padding( padding: const EdgeInsets.symmetric(horizontal: 24), child: Column( children: [ const Spacer(flex: 1), // Image Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Image.asset( page.image, height: 280, fit: BoxFit.contain, ), ), const Spacer(flex: 1), // Title Text( page.title, style: const TextStyle( fontSize: 24, fontWeight: FontWeight.bold, color: _kPink, ), textAlign: TextAlign.center, ), const SizedBox(height: 16), // Description Text( page.text, style: TextStyle( fontSize: 16, color: Colors.pink.shade300, height: 1.5, ), textAlign: TextAlign.center, ), const Spacer(flex: 1), ], ), ); } } /// Check if onboarding has been completed Future isOnboardingDone() async { final prefs = await SharedPreferences.getInstance(); return prefs.getBool(_kOnboardingDone) ?? false; }