fluffychat/lib/pages/chat_list/navi_rail_item.dart

100 lines
3.4 KiB
Dart
Raw Normal View History

2023-01-03 17:00:56 +00:00
import 'package:flutter/material.dart';
2024-07-15 19:14:49 +00:00
import 'package:badges/badges.dart';
import 'package:matrix/matrix.dart';
2023-01-03 17:00:56 +00:00
import 'package:fluffychat/config/app_config.dart';
2024-07-15 19:14:49 +00:00
import 'package:fluffychat/widgets/hover_builder.dart';
import 'package:fluffychat/widgets/unread_rooms_badge.dart';
import '../../config/themes.dart';
2023-01-03 17:00:56 +00:00
2024-07-15 19:14:49 +00:00
class NaviRailItem extends StatelessWidget {
2023-01-03 17:00:56 +00:00
final String toolTip;
final bool isSelected;
final void Function() onTap;
final Widget icon;
final Widget? selectedIcon;
2024-07-15 19:14:49 +00:00
final bool Function(Room)? unreadBadgeFilter;
2023-01-03 17:00:56 +00:00
const NaviRailItem({
required this.toolTip,
required this.isSelected,
required this.onTap,
required this.icon,
this.selectedIcon,
2024-07-15 19:14:49 +00:00
this.unreadBadgeFilter,
super.key,
});
2023-01-03 17:00:56 +00:00
@override
Widget build(BuildContext context) {
final borderRadius = BorderRadius.circular(AppConfig.borderRadius);
2024-07-15 19:14:49 +00:00
final icon = isSelected ? selectedIcon ?? this.icon : this.icon;
final unreadBadgeFilter = this.unreadBadgeFilter;
return HoverBuilder(
builder: (context, hovered) {
return SizedBox(
2024-07-26 19:02:58 +00:00
height: FluffyThemes.navRailWidth,
width: FluffyThemes.navRailWidth,
2024-07-15 19:14:49 +00:00
child: Stack(
children: [
Positioned(
top: 16,
bottom: 16,
left: 0,
child: AnimatedContainer(
width: isSelected ? 4 : 0,
duration: FluffyThemes.animationDuration,
curve: FluffyThemes.animationCurve,
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.primary,
borderRadius: const BorderRadius.only(
topRight: Radius.circular(90),
bottomRight: Radius.circular(90),
),
),
2023-01-03 17:00:56 +00:00
),
),
2024-07-15 19:14:49 +00:00
Center(
child: AnimatedScale(
scale: hovered ? 1.2 : 1.0,
duration: FluffyThemes.animationDuration,
curve: FluffyThemes.animationCurve,
child: Material(
borderRadius: borderRadius,
2024-07-15 19:14:49 +00:00
color: isSelected
? Theme.of(context).colorScheme.primaryContainer
: Theme.of(context).colorScheme.surface,
child: Tooltip(
message: toolTip,
child: InkWell(
borderRadius: borderRadius,
onTap: onTap,
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 8.0,
vertical: 8.0,
),
child: unreadBadgeFilter == null
? icon
: UnreadRoomsBadge(
filter: unreadBadgeFilter,
badgePosition: BadgePosition.topEnd(
top: -12,
end: -8,
),
child: icon,
),
),
),
),
),
),
),
2024-07-15 19:14:49 +00:00
],
2023-01-03 17:00:56 +00:00
),
2024-07-15 19:14:49 +00:00
);
},
2023-01-03 17:00:56 +00:00
);
}
}