81 lines
2.7 KiB
Dart
81 lines
2.7 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:supabase_flutter/supabase_flutter.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:app_links/app_links.dart';
|
|
import 'services/mqtt_service.dart';
|
|
import 'screens/login_screen.dart';
|
|
import 'screens/register_screen.dart';
|
|
import 'screens/home_screen.dart';
|
|
import 'screens/analytics_screen.dart';
|
|
import 'screens/image_result_screen.dart';
|
|
import 'screens/change_password_screen.dart';
|
|
import 'screens/forgot_password_screen.dart';
|
|
|
|
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
|
|
|
|
void main() async {
|
|
WidgetsFlutterBinding.ensureInitialized();
|
|
|
|
await Supabase.initialize(
|
|
url: 'https://ddmhzzegejbsshihzext.supabase.co',
|
|
anonKey: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImRkbWh6emVnZWpic3NoaWh6ZXh0Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzcyMjIyNzAsImV4cCI6MjA5Mjc5ODI3MH0._r-viIQLMXuNNdg4tcn7sJTBO9QqSpSlF7hk43hu2Ks',
|
|
);
|
|
|
|
// Listener auth state — handle password recovery
|
|
Supabase.instance.client.auth.onAuthStateChange.listen((data) {
|
|
if (data.event == AuthChangeEvent.passwordRecovery) {
|
|
navigatorKey.currentState?.pushReplacementNamed(
|
|
'/change_password',
|
|
arguments: {'dari_reset': true},
|
|
);
|
|
}
|
|
});
|
|
|
|
// Handle deep link saat app sudah jalan
|
|
final appLinks = AppLinks();
|
|
appLinks.uriLinkStream.listen((uri) {
|
|
final uriStr = uri.toString();
|
|
if (uriStr.contains('reset-callback') ||
|
|
uriStr.contains('type=recovery')) {
|
|
// Supabase akan handle token otomatis via onAuthStateChange
|
|
debugPrint('Deep link diterima: $uriStr');
|
|
}
|
|
});
|
|
|
|
runApp(
|
|
MultiProvider(
|
|
providers: [
|
|
ChangeNotifierProvider(create: (_) => MqttService()..connect()),
|
|
],
|
|
child: const MyApp(),
|
|
),
|
|
);
|
|
}
|
|
|
|
class MyApp extends StatelessWidget {
|
|
const MyApp({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return MaterialApp(
|
|
navigatorKey: navigatorKey,
|
|
title: 'Coffee IoT',
|
|
debugShowCheckedModeBanner: false,
|
|
theme: ThemeData(
|
|
brightness: Brightness.dark,
|
|
primarySwatch: Colors.green,
|
|
scaffoldBackgroundColor: Colors.black,
|
|
),
|
|
initialRoute: '/login',
|
|
routes: {
|
|
'/login': (context) => const LoginScreen(),
|
|
'/register': (context) => const RegisterScreen(),
|
|
'/home': (context) => const HomeScreen(),
|
|
'/analytics': (context) => const AnalyticsScreen(),
|
|
'/image_result': (context) => const ImageResultScreen(),
|
|
'/change_password': (context) => const ChangePasswordScreen(),
|
|
'/forgot_password': (context) => const ForgotPasswordScreen(),
|
|
},
|
|
);
|
|
}
|
|
} |