100 lines
3.2 KiB
Dart
100 lines
3.2 KiB
Dart
import 'package:flutter/material.dart';
|
|
import '../../../core/app_theme.dart';
|
|
|
|
class DeviceStatusCard extends StatelessWidget {
|
|
final bool isOnline;
|
|
final String deviceCode;
|
|
final DateTime? lastSeen;
|
|
|
|
const DeviceStatusCard({
|
|
super.key,
|
|
required this.isOnline,
|
|
required this.deviceCode,
|
|
this.lastSeen,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Container(
|
|
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 16),
|
|
decoration: AppTheme.cardDecoration(),
|
|
child: Row(
|
|
children: [
|
|
Container(
|
|
padding: const EdgeInsets.all(10),
|
|
decoration: BoxDecoration(
|
|
color: isOnline
|
|
? AppTheme.statusNormal.withValues(alpha: 0.12)
|
|
: Colors.red.withValues(alpha: 0.1),
|
|
borderRadius: BorderRadius.circular(12),
|
|
),
|
|
child: Icon(
|
|
isOnline ? Icons.wifi : Icons.wifi_off,
|
|
color: isOnline ? AppTheme.statusNormal : AppTheme.statusDanger,
|
|
size: 26,
|
|
),
|
|
),
|
|
const SizedBox(width: 16),
|
|
Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text(
|
|
isOnline ? 'Perangkat Online' : 'Perangkat Offline',
|
|
style: const TextStyle(
|
|
fontSize: 15,
|
|
fontWeight: FontWeight.w600,
|
|
color: AppTheme.textPrimary,
|
|
),
|
|
),
|
|
Text(
|
|
'Kode: $deviceCode',
|
|
style: const TextStyle(
|
|
fontSize: 13,
|
|
color: AppTheme.textSecondary,
|
|
),
|
|
),
|
|
if (!isOnline && lastSeen != null) ...[
|
|
const SizedBox(height: 2),
|
|
Text(
|
|
'Terakhir aktif: ${_formatDate(lastSeen!)}',
|
|
style: TextStyle(
|
|
fontSize: 11,
|
|
color: Colors.red.shade400,
|
|
fontWeight: FontWeight.w500,
|
|
),
|
|
),
|
|
],
|
|
],
|
|
),
|
|
const Spacer(),
|
|
Container(
|
|
width: 10,
|
|
height: 10,
|
|
decoration: BoxDecoration(
|
|
color: isOnline ? AppTheme.statusNormal : AppTheme.statusDanger,
|
|
shape: BoxShape.circle,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
String _formatDate(DateTime date) {
|
|
final now = DateTime.now();
|
|
final diff = now.difference(date);
|
|
|
|
if (diff.inDays == 0 && now.day == date.day) {
|
|
// Hari ini
|
|
return '${date.hour.toString().padLeft(2, '0')}:${date.minute.toString().padLeft(2, '0')}';
|
|
} else if (diff.inDays < 2 && (now.day - date.day == 1 || now.day - date.day == -30)) {
|
|
// Kemarin
|
|
return 'Kemarin, ${date.hour.toString().padLeft(2, '0')}:${date.minute.toString().padLeft(2, '0')}';
|
|
} else {
|
|
// Tanggal penuh
|
|
final months = ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Ags', 'Sep', 'Okt', 'Nov', 'Des'];
|
|
return '${date.day} ${months[date.month - 1]} ${date.year}, ${date.hour.toString().padLeft(2, '0')}:${date.minute.toString().padLeft(2, '0')}';
|
|
}
|
|
}
|
|
}
|