veilidchat/lib/contacts/views/availability_widget.dart
Christien Rioux 23867a1784 ui cleanup
2025-03-20 17:31:02 -04:00

98 lines
3.4 KiB
Dart

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<proto.Availability>('availability', availability))
..add(DiagnosticsProperty<bool>('vertical', vertical))
..add(DoubleProperty('size', size))
..add(ColorProperty('color', color));
}
}