Preserve Flutter mirror-os codebase

This commit is contained in:
Chris
2026-07-11 21:51:34 -05:00
commit 27631ed108
142 changed files with 11896 additions and 0 deletions
+97
View File
@@ -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'),
],
),
);
}
}