82 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
import 'package:flutter/material.dart';
 | 
						|
import 'package:hooks_riverpod/hooks_riverpod.dart';
 | 
						|
import 'package:island/pods/websocket.dart';
 | 
						|
import 'package:material_symbols_icons/symbols.dart';
 | 
						|
import 'package:island/widgets/content/sheet.dart';
 | 
						|
 | 
						|
class NetworkStatusSheet extends HookConsumerWidget {
 | 
						|
  final VoidCallback onReconnect;
 | 
						|
 | 
						|
  const NetworkStatusSheet({super.key, required this.onReconnect});
 | 
						|
 | 
						|
  @override
 | 
						|
  Widget build(BuildContext context, WidgetRef ref) {
 | 
						|
    final ws = ref.watch(websocketProvider);
 | 
						|
    final wsState = ref.watch(websocketStateProvider);
 | 
						|
 | 
						|
    return SheetScaffold(
 | 
						|
      titleText:
 | 
						|
          wsState == WebSocketState.connected()
 | 
						|
              ? 'Connection Status'
 | 
						|
              : 'Connection Issue',
 | 
						|
      child: Padding(
 | 
						|
        padding: const EdgeInsets.all(20),
 | 
						|
        child: Column(
 | 
						|
          crossAxisAlignment: CrossAxisAlignment.start,
 | 
						|
          children: [
 | 
						|
            wsState.when(
 | 
						|
              connected:
 | 
						|
                  () => Text(
 | 
						|
                    'Connected to server',
 | 
						|
                    style: Theme.of(context).textTheme.bodyLarge,
 | 
						|
                  ),
 | 
						|
              connecting:
 | 
						|
                  () => Text(
 | 
						|
                    'Connecting to server...',
 | 
						|
                    style: Theme.of(context).textTheme.bodyLarge,
 | 
						|
                  ),
 | 
						|
              disconnected:
 | 
						|
                  () => Text(
 | 
						|
                    'Disconnected from server',
 | 
						|
                    style: Theme.of(context).textTheme.bodyLarge,
 | 
						|
                  ),
 | 
						|
              serverDown:
 | 
						|
                  () => Text(
 | 
						|
                    'The server is not available right now... Please try again later...',
 | 
						|
                    style: Theme.of(context).textTheme.bodyLarge,
 | 
						|
                  ),
 | 
						|
              duplicateDevice:
 | 
						|
                  () => Text(
 | 
						|
                    'Another device has connected with the same account.',
 | 
						|
                    style: Theme.of(context).textTheme.bodyLarge,
 | 
						|
                  ),
 | 
						|
              error:
 | 
						|
                  (message) => Text(
 | 
						|
                    'Connection error: $message',
 | 
						|
                    style: Theme.of(context).textTheme.bodyLarge,
 | 
						|
                  ),
 | 
						|
            ),
 | 
						|
            const SizedBox(height: 16),
 | 
						|
            if (ws.heartbeatDelay != null)
 | 
						|
              Text(
 | 
						|
                'Last heartbeat: ${ws.heartbeatDelay!.inMilliseconds}ms',
 | 
						|
                style: Theme.of(context).textTheme.bodyMedium,
 | 
						|
              ),
 | 
						|
            const SizedBox(height: 24),
 | 
						|
            Center(
 | 
						|
              child: FilledButton.icon(
 | 
						|
                icon: const Icon(Symbols.wifi),
 | 
						|
                label: const Text('Reconnect'),
 | 
						|
                onPressed: () {
 | 
						|
                  onReconnect();
 | 
						|
                  Navigator.pop(context);
 | 
						|
                },
 | 
						|
              ),
 | 
						|
            ),
 | 
						|
          ],
 | 
						|
        ),
 | 
						|
      ),
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |