import 'package:awesome_extensions/awesome_extensions.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_translate/flutter_translate.dart'; import '../../proto/proto.dart' as proto; import '../../theme/theme.dart'; class AvailabilityWidget extends StatelessWidget { const AvailabilityWidget( {required this.availability, required this.color, this.vertical = true, this.size = 32, super.key}); static Widget availabilityIcon(proto.Availability availability, Color color, {double size = 24}) { late final Widget icon; switch (availability) { case proto.Availability.AVAILABILITY_AWAY: icon = SvgPicture.asset('assets/images/toilet.svg', width: size, height: size, colorFilter: ColorFilter.mode(color, BlendMode.srcATop)); case proto.Availability.AVAILABILITY_BUSY: icon = Icon(Icons.event_busy, size: size); case proto.Availability.AVAILABILITY_FREE: icon = Icon(Icons.event_available, size: size); case proto.Availability.AVAILABILITY_OFFLINE: icon = Icon(Icons.cloud_off, size: size); case proto.Availability.AVAILABILITY_UNSPECIFIED: icon = Icon(Icons.question_mark, size: size); } return icon; } static String availabilityName(proto.Availability availability) { late final String name; switch (availability) { case proto.Availability.AVAILABILITY_AWAY: name = translate('availability.away'); case proto.Availability.AVAILABILITY_BUSY: name = translate('availability.busy'); case proto.Availability.AVAILABILITY_FREE: name = translate('availability.free'); case proto.Availability.AVAILABILITY_OFFLINE: name = translate('availability.offline'); case proto.Availability.AVAILABILITY_UNSPECIFIED: name = translate('availability.unspecified'); } return name; } @override Widget build(BuildContext context) { final theme = Theme.of(context); final textTheme = theme.textTheme; final name = availabilityName(availability); final icon = availabilityIcon(availability, color, size: size * 2 / 3); return vertical ? ConstrainedBox( constraints: BoxConstraints.tightFor(width: size), child: Column(mainAxisSize: MainAxisSize.min, children: [ icon, Text(name, style: textTheme.labelSmall!.copyWith(color: color)) .fit(fit: BoxFit.scaleDown) ])) : ConstrainedBox( constraints: BoxConstraints.tightFor(height: size), child: Row(mainAxisSize: MainAxisSize.min, children: [ icon, Text(name, style: textTheme.labelLarge!.copyWith(color: color)) .paddingLTRB(size / 4, 0, 0, 0) ])); } //////////////////////////////////////////////////////////////////////////// final proto.Availability availability; final Color color; final bool vertical; final double size; @override void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); properties ..add( DiagnosticsProperty('availability', availability)) ..add(DiagnosticsProperty('vertical', vertical)) ..add(DoubleProperty('size', size)) ..add(ColorProperty('color', color)); } }