Files
flutterApp/lib/features/main_container/domain/tab_config.dart
2026-09-14 12:35:20 +08:00

186 lines
4.9 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:equatable/equatable.dart';
class TabConfigItem extends Equatable {
final String id;
final String name;
final String nameEn;
final String icon;
final bool isEnabled;
final int order;
const TabConfigItem({
required this.id,
required this.name,
required this.nameEn,
required this.icon,
required this.isEnabled,
required this.order,
});
TabConfigItem copyWith({
String? id,
String? name,
String? nameEn,
String? icon,
bool? isEnabled,
int? order,
}) {
return TabConfigItem(
id: id ?? this.id,
name: name ?? this.name,
nameEn: nameEn ?? this.nameEn,
icon: icon ?? this.icon,
isEnabled: isEnabled ?? this.isEnabled,
order: order ?? this.order,
);
}
@override
List<Object?> get props => [id, name, nameEn, icon, isEnabled, order];
}
class TabConfig extends Equatable {
final List<TabConfigItem> items;
const TabConfig({required this.items});
List<TabConfigItem> get enabledItems {
final enabled = items.where((item) => item.isEnabled).toList();
enabled.sort((a, b) => a.order.compareTo(b.order));
return enabled;
}
/// roleKey == 'personal'(个人角色):底部导航与「系统设置 → Tab 设置」强制只保留
/// 「设备(device) + 我的(me)」,且常显、开关锁定不可关闭;其他角色不受影响。
static const String personalRoleKey = 'personal';
static const Set<String> personalVisibleTabIds = {'device', 'me'};
/// 底部导航实际渲染的 Tab:
/// - personal:强制返回 设备 + 我的(忽略 isEnabled,恒为启用),按 order 排序
/// - 其他角色:返回用户启用的 Tab(enabledItems)
List<TabConfigItem> navItemsForRole(String? roleKey) {
if (roleKey == personalRoleKey) {
final forced = items
.where((item) => personalVisibleTabIds.contains(item.id))
.map((item) => item.copyWith(isEnabled: true))
.toList();
forced.sort((a, b) => a.order.compareTo(b.order));
return forced;
}
return enabledItems;
}
/// 「Tab 设置」列表应展示的 Tab:
/// - personal:只列出 设备 + 我的,按 order 排序
/// - 其他角色:列出全部
List<TabConfigItem> settingItemsForRole(String? roleKey) {
if (roleKey == personalRoleKey) {
final visible = items
.where((item) => personalVisibleTabIds.contains(item.id))
.toList();
visible.sort((a, b) => a.order.compareTo(b.order));
return visible;
}
return items;
}
TabConfig copyWith({List<TabConfigItem>? items}) {
return TabConfig(items: items ?? this.items);
}
TabConfig toggleItem(String itemId) {
final currentItem = items.firstWhere((item) => item.id == itemId);
// 如果当前项是启用的,检查是否是最后一个启用的
if (currentItem.isEnabled) {
final enabledCount = items.where((item) => item.isEnabled).length;
if (enabledCount <= 1) {
// 至少保留一个 Tab,不允许关闭
return this;
}
}
final updatedItems = items.map((item) {
if (item.id == itemId) {
return item.copyWith(isEnabled: !item.isEnabled);
}
return item;
}).toList();
return copyWith(items: updatedItems);
}
static TabConfig defaultConfig() {
return const TabConfig(
items: [
TabConfigItem(
id: 'home_v2',
name: '首页',
nameEn: 'Home',
icon: 'home_rounded',
isEnabled: true,
order: 1,
),
TabConfigItem(
id: 'device',
name: '设备',
nameEn: 'Device',
icon: 'devices_rounded',
isEnabled: true,
order: 2,
),
TabConfigItem(
id: 'ai',
name: 'AI',
nameEn: 'AI',
icon: 'auto_awesome_rounded',
isEnabled: false,
order: 3,
),
TabConfigItem(
id: 'warning',
name: '告警',
nameEn: 'Alerts',
icon: 'warning_amber_rounded',
isEnabled: true,
order: 4,
),
TabConfigItem(
id: 'workorder',
name: '工单',
nameEn: 'WorkOrder',
icon: 'assignment_rounded',
isEnabled: true,
order: 5,
),
TabConfigItem(
id: 'report',
name: '上报',
nameEn: 'Report',
icon: 'post_add_rounded',
isEnabled: true,
order: 6,
),
TabConfigItem(
id: 'my',
name: '旧我的',
nameEn: 'Old Profile',
icon: 'person_rounded',
isEnabled: false,
order: 7,
),
TabConfigItem(
id: 'me',
name: '我的',
nameEn: 'Profile',
icon: 'person_rounded',
isEnabled: true,
order: 8,
),
],
);
}
@override
List<Object?> get props => [items];
}