Preserve Flutter mirror-os codebase
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:mirror_ui/mirror_ui.dart';
|
||||
import 'providers/connection_provider.dart';
|
||||
import 'screens/connect_screen.dart';
|
||||
import 'screens/remote_dashboard.dart';
|
||||
import 'screens/remote_workout.dart';
|
||||
import 'screens/remote_media.dart';
|
||||
import 'package:mirror_protocol/mirror_protocol.dart';
|
||||
|
||||
class MirrorRemoteApp extends StatelessWidget {
|
||||
const MirrorRemoteApp({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return MaterialApp(
|
||||
title: 'Mirror Remote',
|
||||
debugShowCheckedModeBanner: false,
|
||||
theme: MirrorTheme.dark,
|
||||
home: const _RemoteShell(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _RemoteShell extends ConsumerWidget {
|
||||
const _RemoteShell();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final connection = ref.watch(connectionProvider);
|
||||
|
||||
if (!connection.connected) {
|
||||
return const ConnectScreen();
|
||||
}
|
||||
|
||||
return const _ConnectedRemote();
|
||||
}
|
||||
}
|
||||
|
||||
class _ConnectedRemote extends ConsumerStatefulWidget {
|
||||
const _ConnectedRemote();
|
||||
|
||||
@override
|
||||
ConsumerState<_ConnectedRemote> createState() => _ConnectedRemoteState();
|
||||
}
|
||||
|
||||
class _ConnectedRemoteState extends ConsumerState<_ConnectedRemote> {
|
||||
int _currentIndex = 0;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final activeScreen = ref.watch(
|
||||
mirrorStateProvider.select((s) => s?.activeScreen),
|
||||
);
|
||||
|
||||
// Sync tab to mirror's active screen
|
||||
final tabIndex = switch (activeScreen) {
|
||||
ScreenType.dashboard => 0,
|
||||
ScreenType.workout => 1,
|
||||
ScreenType.media => 2,
|
||||
_ => _currentIndex,
|
||||
};
|
||||
|
||||
return Scaffold(
|
||||
body: SafeArea(
|
||||
child: IndexedStack(
|
||||
index: tabIndex,
|
||||
children: const [
|
||||
RemoteDashboard(),
|
||||
RemoteWorkout(),
|
||||
RemoteMedia(),
|
||||
],
|
||||
),
|
||||
),
|
||||
bottomNavigationBar: NavigationBar(
|
||||
selectedIndex: tabIndex,
|
||||
onDestinationSelected: (index) {
|
||||
setState(() => _currentIndex = index);
|
||||
final target = switch (index) {
|
||||
0 => ScreenType.dashboard,
|
||||
1 => ScreenType.workout,
|
||||
2 => ScreenType.media,
|
||||
_ => ScreenType.dashboard,
|
||||
};
|
||||
ref.read(connectionProvider.notifier).send(
|
||||
NavigateCommand(target: target),
|
||||
);
|
||||
},
|
||||
destinations: const [
|
||||
NavigationDestination(icon: Icon(Icons.dashboard), label: 'Home'),
|
||||
NavigationDestination(icon: Icon(Icons.fitness_center), label: 'Workout'),
|
||||
NavigationDestination(icon: Icon(Icons.music_note), label: 'Media'),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user