TKK_E32230206/lib/features/iot/widgets/chart_range_selector.dart

83 lines
2.9 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../../core/app_theme.dart';
import '../providers/monitoring_provider.dart';
class ChartRangeSelector extends ConsumerWidget {
const ChartRangeSelector({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final selected = ref.watch(chartRangeProvider);
return LayoutBuilder(
builder: (context, constraints) {
final double width = constraints.maxWidth;
final double tabWidth = (width - 8) / ChartRange.values.length;
final selectedIndex = ChartRange.values.indexOf(selected);
return Container(
height: 44,
padding: const EdgeInsets.all(4),
decoration: BoxDecoration(
color: Colors.grey.shade200,
borderRadius: BorderRadius.circular(14),
),
child: Stack(
children: [
AnimatedPositioned(
duration: const Duration(milliseconds: 250),
curve: Curves.easeOutCubic,
left: selectedIndex * tabWidth,
top: 0,
bottom: 0,
width: tabWidth,
child: Container(
decoration: BoxDecoration(
color: AppTheme.bgCard,
borderRadius: BorderRadius.circular(10),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.08),
blurRadius: 8,
offset: const Offset(0, 2),
),
],
),
),
),
Row(
children: ChartRange.values.map((range) {
final isSelected = selected == range;
return Expanded(
child: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () => ref.read(chartRangeProvider.notifier).state = range,
child: Center(
child: AnimatedDefaultTextStyle(
duration: const Duration(milliseconds: 250),
style: TextStyle(
fontFamily: 'Inter',
fontWeight: isSelected ? FontWeight.w600 : FontWeight.w500,
fontSize: 13,
color: isSelected
? AppTheme.textPrimary
: AppTheme.textSecondary,
),
child: Text(
range == ChartRange.daily ? 'Harian' : 'Bulanan',
),
),
),
),
);
}).toList(),
),
],
),
);
},
);
}
}