import 'dart:io'; import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:umbrix/features/connection/notifier/connection_notifier.dart'; import 'package:umbrix/utils/utils.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:tray_manager/tray_manager.dart'; import 'package:window_manager/window_manager.dart'; part 'window_notifier.g.dart'; const minimumWindowSize = Size(360, 640); const defaultWindowSize = Size(400, 800); @Riverpod(keepAlive: true) class WindowNotifier extends _$WindowNotifier with AppLogger { @override Future build() async { if (!PlatformUtils.isDesktop) return; await windowManager.ensureInitialized(); await windowManager.setMinimumSize(minimumWindowSize); await windowManager.setSize(defaultWindowSize); } Future open({bool focus = true}) async { await windowManager.show(); if (focus) await windowManager.focus(); if (Platform.isMacOS) { await windowManager.setSkipTaskbar(false); } } // TODO add option to quit or minimize to tray Future close() async { await windowManager.hide(); if (Platform.isMacOS) { await windowManager.setSkipTaskbar(true); } } Future quit() async { await ref.read(connectionNotifierProvider.notifier).abortConnection().timeout(const Duration(seconds: 2)).catchError( (e) { loggy.warning("error aborting connection on quit", e); }, ); await trayManager.destroy(); await windowManager.destroy(); } }