fluffychat/lib/widgets/avatar.dart

82 lines
2.2 KiB
Dart
Raw Normal View History

2020-01-01 18:10:13 +00:00
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
2021-10-26 16:50:34 +00:00
2020-09-07 15:08:01 +00:00
import 'package:cached_network_image/cached_network_image.dart';
2021-10-26 16:50:34 +00:00
import 'package:matrix/matrix.dart';
2020-01-01 18:10:13 +00:00
2021-10-26 16:50:34 +00:00
import 'package:fluffychat/utils/string_color.dart';
2020-01-01 18:10:13 +00:00
import 'matrix.dart';
class Avatar extends StatelessWidget {
2020-04-28 12:11:56 +00:00
final Uri mxContent;
2020-01-18 12:22:22 +00:00
final String name;
2020-01-01 18:10:13 +00:00
final double size;
final Function onTap;
2020-03-13 20:42:05 +00:00
static const double defaultSize = 44;
2021-01-20 19:27:09 +00:00
final Client client;
2020-01-01 18:10:13 +00:00
2020-03-13 20:42:05 +00:00
const Avatar(
this.mxContent,
this.name, {
this.size = defaultSize,
this.onTap,
2021-01-20 19:27:09 +00:00
this.client,
2020-03-13 20:42:05 +00:00
Key key,
}) : super(key: key);
2020-01-01 18:10:13 +00:00
@override
Widget build(BuildContext context) {
2021-05-01 06:14:58 +00:00
final src = mxContent?.getThumbnail(
2021-01-20 19:27:09 +00:00
client ?? Matrix.of(context).client,
2020-01-01 18:10:13 +00:00
width: size * MediaQuery.of(context).devicePixelRatio,
height: size * MediaQuery.of(context).devicePixelRatio,
);
2020-05-13 13:58:59 +00:00
var fallbackLetters = '@';
2020-10-19 14:56:40 +00:00
if ((name?.runes?.length ?? 0) >= 2) {
fallbackLetters = String.fromCharCodes(name.runes, 0, 2);
2020-10-19 14:56:40 +00:00
} else if ((name?.runes?.length ?? 0) == 1) {
2020-01-18 12:22:22 +00:00
fallbackLetters = name;
}
final noPic = mxContent == null ||
mxContent.toString().isEmpty ||
mxContent.toString() == 'null';
final textWidget = Center(
child: Text(
fallbackLetters,
style: TextStyle(
2021-08-01 05:47:00 +00:00
color: noPic ? name?.darkColor : null,
fontSize: 18,
),
),
);
2020-10-28 06:35:38 +00:00
final borderRadius = BorderRadius.circular(size / 2);
return InkWell(
onTap: onTap,
2020-10-28 06:35:38 +00:00
borderRadius: borderRadius,
child: ClipRRect(
2020-10-28 06:35:38 +00:00
borderRadius: borderRadius,
child: Container(
width: size,
height: size,
2021-08-01 05:47:00 +00:00
color:
noPic ? name?.lightColor : Theme.of(context).secondaryHeaderColor,
child: noPic
? textWidget
: CachedNetworkImage(
2021-04-21 12:19:54 +00:00
imageUrl: src.toString(),
fit: BoxFit.cover,
width: size,
height: size,
placeholder: (c, s) => textWidget,
errorWidget: (c, s, d) => Stack(
children: [
textWidget,
],
),
),
),
),
2020-01-01 18:10:13 +00:00
);
}
}