open_setting_handler.dart 4.75 KB
import 'dart:io';

import 'package:appframe/config/constant.dart';
import 'package:appframe/config/locator.dart';
import 'package:appframe/config/routes.dart';
import 'package:appframe/services/dispatcher.dart';
import 'package:fluwx/fluwx.dart';
import 'package:path_provider/path_provider.dart';
import 'package:shared_preferences/shared_preferences.dart';

class OpenSettingHandler extends MessageHandler {
  /// 外链类配置:item -> (url, title)
  static const Map<String, ({String url, String title})> _linkItems = {
    'version': (url: 'https://bxr.banxiaoer.net/apps/versions.html', title: '版本记录'),
    'license': (url: 'https://bxr.banxiaoer.net/apps/useragreement.html', title: '用户协议'),
    'privacy': (url: 'https://bxr.banxiaoer.net/apps/privacysettings.html', title: '隐私设置'),
    'about': (url: 'https://bxr.banxiaoer.net/apps/produce.html', title: '关于'),
  };

  @override
  Future<dynamic> handleMessage(params) async {
    if (params is! Map<String, dynamic>) {
      throw Exception('参数错误');
    }

    var item = params['item'] as String;
    if (item.isEmpty) {
      throw Exception('参数错误');
    }

    // 1. 外链类
    final link = _linkItems[item];
    if (link != null) {
      router.push('/link', extra: {'url': link.url, 'title': link.title});
      return true;
    }

    // 2. 动作类
    final handlers = <String, Future<bool> Function()>{
      'account': _openAccount,
      'kefu': _openKefu,
      'clear': _handleClear,
      'logout': _handleLogout,
      'vconsole': _handleToggleDebug,
    };

    final handler = handlers[item];
    if (handler != null) {
      return await handler();
    }

    return false;
  }

  /// 账号与安全
  Future<bool> _openAccount() async {
    router.push('/account');
    return true;
  }

  /// 在线客服(微信小程序)
  Future<bool> _openKefu() async {
    final fluwx = getIt.get<Fluwx>();
    if (!await fluwx.isWeChatInstalled) {
      return false;
    }
    fluwx.open(
      target: MiniProgram(
        username: 'gh_0ed02e873abc',
        path: '/pages/agentChat/index?showAuthDirectly=1&agentId=eiXH0MAJmjgl',
        miniProgramType: WXMiniProgramType.release,
      ),
    );
    return true;
  }

  /// 清理缓存入口
  Future<bool> _handleClear() async {
    await _clearStorage();
    await _logout();
    return true;
  }

  /// 退出登录入口
  Future<bool> _handleLogout() async {
    await _logout();
    return true;
  }

  /// 切换调试模式入口
  Future<bool> _handleToggleDebug() async {
    final SharedPreferences prefs = getIt.get<SharedPreferences>();
    var debug = prefs.getInt('debug') ?? 0;
    debug = (debug == 0 ? 1 : 0);
    await prefs.setInt('debug', debug);

    // 通知 WebCubit 更新 H5 状态
    WebCubitHolder.instance?.notifyDebugStatus(debug);

    return true;
  }

  /// 清理缓存
  Future<void> _clearStorage() async {
    // 1 清理 WebView 相关缓存
    WebCubitHolder.instance?.clearWebCache();

    // 2 清理非 h5_version 的缓存
    final SharedPreferences prefs = getIt.get<SharedPreferences>();
    for (final key in prefs.getKeys()) {
      if (!key.startsWith('h5')) {
        await prefs.remove(key);
      }
    }

    // 3 清理 http_dist_assets 下的非当前版本号的文件和目录
    final dir = await getApplicationSupportDirectory();
    final httpDir = Directory('${dir.path}/${Constant.h5DistDir}');
    if (httpDir.existsSync()) {
      final version = prefs.getString(Constant.h5VersionKey) ?? Constant.h5Version;
      await _cleanH5Dir(httpDir, version);
    }

    // 4 清理临时目录下的所有文件和目录
    final tempDir = await getTemporaryDirectory();
    if (tempDir.existsSync()) {
      await _cleanAll(tempDir);
    }
  }

  /// 清理 h5 目录下非当前版本的文件和目录
  Future<void> _cleanH5Dir(Directory httpDir, String version) async {
    await for (final entity in httpDir.list()) {
      if (entity is Directory && !entity.path.endsWith(version)) {
        await entity.delete(recursive: true);
      } else if (entity is File && !entity.path.endsWith('$version.zip')) {
        await entity.delete();
      }
    }
  }

  /// 清理目录下所有内容
  Future<void> _cleanAll(Directory dir) async {
    await for (final entity in dir.list()) {
      if (entity is Directory) {
        await entity.delete(recursive: true);
      } else {
        await entity.delete();
      }
    }
  }

  /// 退出登录
  Future<void> _logout() async {
    // 删除所有auth_开头的key
    final SharedPreferences prefs = getIt.get<SharedPreferences>();
    for (final key in prefs.getKeys()) {
      if (key.startsWith('auth_')) {
        await prefs.remove(key);
      }
    }

    // IM 登出
    // await getIt.get<ImService>().logout();

    router.go('/loginMain');
  }
}