content: import 'package:fl_clash/clash/clash.dart';
  import 'package:fl_clash/common/common.dart';
  import 'package:fl_clash/enum/enum.dart';
  import 'package:fl_clash/models/models.dart';
  import 'package:fl_clash/providers/app.dart';
  import 'package:fl_clash/providers/config.dart';
  import 'package:fl_clash/providers/state.dart';
  import 'package:fl_clash/state.dart';
  import 'package:flutter/material.dart';
  import 'package:flutter_riverpod/flutter_riverpod.dart';
  
  class ClashManager extends ConsumerStatefulWidget {
    final Widget child;
  
    const ClashManager({
      super.key,
      required this.child,
    });
  
    @override
    ConsumerState<ClashManager> createState() => _ClashContainerState();
  }
  
  class _ClashContainerState extends ConsumerState<ClashManager>
      with AppMessageListener {
    @override
    Widget build(BuildContext context) {
      return widget.child;
    }
  
    @override
    void initState() {
      super.initState();
      clashMessage.addListener(this);
      ref.listenManual(currentProfileIdProvider, (prev, next) {
        if (prev != next) {
          globalState.appController.handleChangeProfile();
        }
      });
      ref.listenManual(coreStateProvider, (prev, next) async {
        if (prev != next) {
          await clashCore.setState(next);
        }
      });
      ref.listenManual(clashConfigStateProvider, (prev, next) {
        if (prev != next) {
          globalState.appController.updateClashConfigDebounce();
        }
      });
    }
  
    @override
    Future<void> dispose() async {
      clashMessage.removeListener(this);
      super.dispose();
    }
  
    @override
    Future<void> onDelay(Delay delay) async {
      super.onDelay(delay);
      final appController = globalState.appController;
      appController.setDelay(delay);
      debouncer.call(
        DebounceTag.updateDelay,
        () async {
          await appController.updateGroupsDebounce();
        },
        duration: const Duration(milliseconds: 5000),
      );
    }
  
    @override
    void onLog(Log log) {
      ref.read(logsProvider.notifier).addLog(log);
      if (log.logLevel == LogLevel.error) {
        globalState.showNotifier(log.payload);
      }
      super.onLog(log);
    }
  
    @override
    void onRequest(Connection connection) async {
      ref.read(requestsProvider.notifier).addRequest(connection);
      super.onRequest(connection);
    }
  
    @override
    Future<void> onLoaded(String providerName) async {
      ref.read(providersProvider.notifier).setProvider(
            await clashCore.getExternalProvider(
              providerName,
            ),
          );
      await globalState.appController.updateGroupsDebounce();
      super.onLoaded(providerName);
    }
  }
  