mirror of
https://gitlab.com/veilid/veilidchat.git
synced 2025-08-18 18:57:51 -04:00
77 lines
2.7 KiB
Dart
77 lines
2.7 KiB
Dart
import 'package:awesome_extensions/awesome_extensions.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/widgets.dart';
|
|
|
|
import '../../theme.dart';
|
|
|
|
class StyledAvatar extends StatelessWidget {
|
|
const StyledAvatar({
|
|
required String name,
|
|
required double size,
|
|
bool enabled = true,
|
|
super.key,
|
|
ImageProvider<Object>? imageProvider,
|
|
}) : _name = name,
|
|
_size = size,
|
|
_imageProvider = imageProvider,
|
|
_enabled = enabled;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final theme = Theme.of(context);
|
|
final scaleTheme = Theme.of(context).extension<ScaleTheme>()!;
|
|
|
|
final borderColor = scaleTheme.config.useVisualIndicators
|
|
? scaleTheme.scheme.primaryScale.primaryText
|
|
: scaleTheme.scheme.primaryScale.subtleBorder;
|
|
final foregroundColor = !_enabled
|
|
? scaleTheme.scheme.grayScale.primaryText
|
|
: scaleTheme.scheme.primaryScale.calloutText;
|
|
final backgroundColor = !_enabled
|
|
? scaleTheme.scheme.grayScale.primary
|
|
: scaleTheme.scheme.primaryScale.calloutBackground;
|
|
final scaleConfig = scaleTheme.config;
|
|
final textStyle = theme.textTheme.titleLarge!.copyWith(fontSize: _size / 2);
|
|
|
|
final abbrev = _name.split(' ').map((s) => s.isEmpty ? '' : s[0]).join();
|
|
late final String shortname;
|
|
if (abbrev.length >= 3) {
|
|
shortname = abbrev[0] + abbrev[1] + abbrev[abbrev.length - 1];
|
|
} else {
|
|
shortname = abbrev;
|
|
}
|
|
|
|
return Container(
|
|
height: _size,
|
|
width: _size,
|
|
decoration: BoxDecoration(
|
|
shape: BoxShape.circle,
|
|
border: !scaleConfig.useVisualIndicators
|
|
? null
|
|
: Border.all(
|
|
color: borderColor,
|
|
width: 1 * (_size ~/ 16 + 1),
|
|
strokeAlign: BorderSide.strokeAlignOutside)),
|
|
child: AvatarImage(
|
|
backgroundImage: _imageProvider,
|
|
backgroundColor: scaleConfig.useVisualIndicators
|
|
? foregroundColor
|
|
: backgroundColor,
|
|
child: Text(
|
|
shortname.isNotEmpty ? shortname : '?',
|
|
softWrap: false,
|
|
textScaler: MediaQuery.of(context).textScaler,
|
|
style: textStyle.copyWith(
|
|
color: scaleConfig.useVisualIndicators
|
|
? backgroundColor
|
|
: foregroundColor,
|
|
),
|
|
).paddingAll(4.scaled(context)).fit(fit: BoxFit.scaleDown)));
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
final String _name;
|
|
final double _size;
|
|
final ImageProvider<Object>? _imageProvider;
|
|
final bool _enabled;
|
|
}
|