import 'dart:async'; import 'package:fluent_ui/fluent_ui.dart'; import 'package:get/get.dart'; import 'package:reboot_common/common.dart'; import 'package:reboot_launcher/src/controller/backend_controller.dart'; import 'package:reboot_launcher/src/controller/game_controller.dart'; import 'package:reboot_launcher/src/controller/hosting_controller.dart'; import 'package:reboot_launcher/src/widget/snackbar/snackbar.dart'; import 'package:reboot_launcher/src/widget/section/backend/message.dart'; import 'package:reboot_launcher/src/util/translations.dart'; class BackendButton extends StatefulWidget { const BackendButton({Key? key}) : super(key: key); @override State createState() => _BackendButtonState(); } class _BackendButtonState extends State { final GameController _gameController = Get.find(); final HostingController _hostingController = Get.find(); final BackendController _backendController = Get.find(); final StreamController _textController = StreamController.broadcast(); late final void Function() _listener = () => _textController.add(null); @override void initState() { _backendController.port.addListener(_listener); super.initState(); } @override void dispose() { _backendController.port.removeListener(_listener); _textController.close(); super.dispose(); } @override Widget build(BuildContext context) => Align( alignment: AlignmentDirectional.bottomCenter, child: SizedBox( height: 48, width: double.infinity, child: Button( child: Align( alignment: Alignment.center, child: StreamBuilder( stream: _textController.stream, builder: (context, snapshot) => Obx(() => Text(_text)) ), ), onPressed: () => _backendController.toggle( eventHandler: _onEvent, errorHandler: _onError ) ) ) ); SnackBar? _onEvent(AuthBackendType type, AuthBackendEvent event) { _backendController.started.value = event.type.isStart && !event.type.isError; if(event.type == AuthBackendEventType.startedImplementation) { _backendController.implementation = event.implementation; } return onBackendResult(type, event); } void _onError(String error) { if(_backendController.started.value) { _backendController.stop(); _gameController.instance.value?.kill(); _hostingController.instance.value?.kill(); onBackendError(error); } } String get _text { if(_backendController.type.value == AuthBackendType.local && _backendController.port.text.trim() == kDefaultBackendPort.toString()){ return translations.checkServer; }else if(_backendController.started.value){ return translations.stopServer; }else { return translations.startServer; } } }