Files
feature-tenant/lib/features/main_container/domain/tab_config.dart
2026-09-18 16:59:32 +08:00

187 lines
4.8 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});
/// 个人角色标识(登录接口返回的 roleKey)
static const String personalRoleKey = 'personal';
/// 个人角色可见的 Tab ID 集合(单一数据源)
static const Set<String> personalVisibleTabIds = {'device', 'me'};
List<TabConfigItem> get enabledItems {
final enabled = items.where((item) => item.isEnabled).toList();
enabled.sort((a, b) => a.order.compareTo(b.order));
return enabled;
}
/// 底部导航栏渲染用:
/// - personal:强制只返回 device + me(忽略 isEnabled,恒启用),按 order 排序
/// - 其他角色:返回用户自己启用的 Tab
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 设置」列表用:
/// - personal:只列出 device + me
/// - 其他角色:列出全部
List<TabConfigItem> settingItemsForRole(String? roleKey) {
if (roleKey == personalRoleKey) {
final list = items
.where((item) => personalVisibleTabIds.contains(item.id))
.toList();
list.sort((a, b) => a.order.compareTo(b.order));
return list;
}
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];
}