import 'package:fl_clash/common/common.dart'; import 'package:fl_clash/controller.dart'; import 'package:fl_clash/providers/state.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:tray_manager/tray_manager.dart'; class TrayManager extends ConsumerStatefulWidget { final Widget child; const TrayManager({super.key, required this.child}); @override ConsumerState createState() => _TrayContainerState(); } class _TrayContainerState extends ConsumerState with TrayListener { @override void initState() { super.initState(); trayManager.addListener(this); ref.listenManual(trayStateProvider, (prev, next) { if (prev != next) { appController.updateTray(); } }); if (system.isMacOS) { ref.listenManual(trayTitleStateProvider, (prev, next) { if (prev != next) { tray?.updateTrayTitle( showTrayTitle: next.showTrayTitle, traffic: next.traffic, ); } }); } } @override Widget build(BuildContext context) { return widget.child; } @override void onTrayIconRightMouseDown() { // ignore: deprecated_member_use trayManager.popUpContextMenu(bringAppToFront: true); } @override void onTrayMenuItemClick(MenuItem menuItem) { render?.active(); super.onTrayMenuItemClick(menuItem); } @override onTrayIconMouseDown() { window?.show(); } @override dispose() { trayManager.removeListener(this); super.dispose(); } }