100 lines
3.4 KiB
Dart
100 lines
3.4 KiB
Dart
import 'package:digiplug/bat_theme/bat_theme.dart';
|
|
import 'package:digiplug/core/navigation/navigator.dart';
|
|
import 'package:digiplug/data/models/device.dart';
|
|
import 'package:digiplug/providers/home_data_provider.dart';
|
|
import 'package:digiplug/utils/enums.dart'; // PERBAIKAN: Import yang hilang ditambahkan di sini
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
import 'package:flutter_svg/flutter_svg.dart';
|
|
import 'package:provider/provider.dart';
|
|
|
|
class DeviceCard extends StatelessWidget {
|
|
final Device device;
|
|
|
|
const DeviceCard({
|
|
super.key,
|
|
required this.device,
|
|
});
|
|
|
|
// Helper untuk menampilkan ikon berdasarkan jenisnya (PNG atau SVG)
|
|
Widget _buildDeviceIcon(dynamic iconData, bool isActive, BatThemeData theme) {
|
|
final iconColor = isActive
|
|
? theme.colors.primary
|
|
: theme.colors.tertiary.withOpacity(0.6);
|
|
|
|
if (iconData is String) {
|
|
if (iconData.endsWith('.svg')) {
|
|
return SvgPicture.asset(iconData,
|
|
width: 32.w,
|
|
height: 32.h,
|
|
colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn),
|
|
placeholderBuilder: (_) =>
|
|
Icon(Icons.device_unknown, color: iconColor, size: 32.w));
|
|
} else {
|
|
return Image.asset(iconData,
|
|
width: 32.w,
|
|
height: 32.h,
|
|
color: iconColor,
|
|
errorBuilder: (_, __, ___) =>
|
|
Icon(Icons.device_unknown, color: iconColor, size: 32.w));
|
|
}
|
|
}
|
|
return Icon(Icons.device_unknown, color: iconColor, size: 32.w);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
var theme = BatThemeData.of(context);
|
|
|
|
final homeDataProvider = context.read<HomeDataProvider>();
|
|
|
|
return GestureDetector(
|
|
onTap: () =>
|
|
AppNavigator.pushNamed(device.type.routeName, arguments: device),
|
|
child: Container(
|
|
padding: EdgeInsets.all(16.r),
|
|
decoration: BoxDecoration(
|
|
color: theme.colors.tertiary.withOpacity(0.1),
|
|
borderRadius: BorderRadius.circular(20.r),
|
|
),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
_buildDeviceIcon(device.type.icon, device.active, theme),
|
|
Transform.scale(
|
|
scale: 0.8,
|
|
alignment: Alignment.topRight,
|
|
child: Switch.adaptive(
|
|
activeColor: theme.colors.primary,
|
|
value: device.active,
|
|
onChanged: (bool v) {
|
|
homeDataProvider.toggleDeviceStatus(device.id);
|
|
},
|
|
),
|
|
),
|
|
],
|
|
),
|
|
Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text(device.name,
|
|
style: theme.typography.bodyCopyMedium,
|
|
overflow: TextOverflow.ellipsis),
|
|
SizedBox(height: 4.h),
|
|
Text(device.room,
|
|
style: theme.typography.subtitle.copyWith(
|
|
color: theme.colors.tertiary.withOpacity(0.7))),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|