HTTP-клиент к /api/v1 с Sanctum-токеном (хранится в secure storage), модели зеркалят Laravel API Resources. Экраны: логин, список устройств с живым статусом, детальная страница устройства (история телеметрии, turn-on/turn-off/set-level с проверкой capability), списки зон и правил автоматизации (пока только чтение — формы создания/редактирования впереди).
54 lines
1.4 KiB
Dart
54 lines
1.4 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:provider/provider.dart';
|
|
|
|
import 'core/api_client.dart';
|
|
import 'core/api_service.dart';
|
|
import 'core/auth_service.dart';
|
|
import 'screens/home_screen.dart';
|
|
import 'screens/login_screen.dart';
|
|
|
|
void main() {
|
|
runApp(const App());
|
|
}
|
|
|
|
class App extends StatelessWidget {
|
|
const App({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final apiClient = ApiClient();
|
|
|
|
return MultiProvider(
|
|
providers: [
|
|
Provider<ApiClient>.value(value: apiClient),
|
|
Provider<ApiService>(create: (_) => ApiService(apiClient)),
|
|
ChangeNotifierProvider<AuthService>(
|
|
create: (_) => AuthService(apiClient)..restoreSession(),
|
|
),
|
|
],
|
|
child: MaterialApp(
|
|
title: 'Домашняя автоматизация',
|
|
theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.teal)),
|
|
home: const AuthGate(),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
/// Swaps between login and the app shell based on session state, so nothing
|
|
/// else in the tree needs to know how auth is restored or persisted.
|
|
class AuthGate extends StatelessWidget {
|
|
const AuthGate({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final auth = context.watch<AuthService>();
|
|
|
|
if (auth.isLoading) {
|
|
return const Scaffold(body: Center(child: CircularProgressIndicator()));
|
|
}
|
|
|
|
return auth.isAuthenticated ? const HomeScreen() : const LoginScreen();
|
|
}
|
|
}
|