You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			85 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Dart
		
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Dart
		
	
import 'package:flutter/material.dart';
 | 
						|
 | 
						|
import 'package:matrix/matrix.dart';
 | 
						|
 | 
						|
import 'package:fluffychat/utils/string_color.dart';
 | 
						|
import 'package:fluffychat/widgets/mxc_image.dart';
 | 
						|
 | 
						|
class Avatar extends StatelessWidget {
 | 
						|
  final Uri? mxContent;
 | 
						|
  final String? name;
 | 
						|
  final double size;
 | 
						|
  final void Function()? onTap;
 | 
						|
  static const double defaultSize = 44;
 | 
						|
  final Client? client;
 | 
						|
  final double fontSize;
 | 
						|
 | 
						|
  const Avatar({
 | 
						|
    this.mxContent,
 | 
						|
    this.name,
 | 
						|
    this.size = defaultSize,
 | 
						|
    this.onTap,
 | 
						|
    this.client,
 | 
						|
    this.fontSize = 18,
 | 
						|
    Key? key,
 | 
						|
  }) : super(key: key);
 | 
						|
 | 
						|
  @override
 | 
						|
  Widget build(BuildContext context) {
 | 
						|
    var fallbackLetters = '@';
 | 
						|
    final name = this.name;
 | 
						|
    if (name != null) {
 | 
						|
      if (name.runes.length >= 2) {
 | 
						|
        fallbackLetters = String.fromCharCodes(name.runes, 0, 2);
 | 
						|
      } else if (name.runes.length == 1) {
 | 
						|
        fallbackLetters = name;
 | 
						|
      }
 | 
						|
    }
 | 
						|
    final noPic = mxContent == null ||
 | 
						|
        mxContent.toString().isEmpty ||
 | 
						|
        mxContent.toString() == 'null';
 | 
						|
    final textWidget = Center(
 | 
						|
      child: Text(
 | 
						|
        fallbackLetters,
 | 
						|
        style: TextStyle(
 | 
						|
          color: noPic ? Colors.white : null,
 | 
						|
          fontSize: fontSize,
 | 
						|
        ),
 | 
						|
      ),
 | 
						|
    );
 | 
						|
    final borderRadius = BorderRadius.circular(size / 2);
 | 
						|
    final container = Container(
 | 
						|
      decoration: BoxDecoration(
 | 
						|
        border: Border.all(color: Theme.of(context).dividerColor),
 | 
						|
        borderRadius: borderRadius,
 | 
						|
      ),
 | 
						|
      child: ClipRRect(
 | 
						|
        borderRadius: borderRadius,
 | 
						|
        child: Container(
 | 
						|
          width: size,
 | 
						|
          height: size,
 | 
						|
          color:
 | 
						|
              noPic ? name?.lightColor : Theme.of(context).secondaryHeaderColor,
 | 
						|
          child: noPic
 | 
						|
              ? textWidget
 | 
						|
              : MxcImage(
 | 
						|
                  key: Key(mxContent.toString()),
 | 
						|
                  uri: mxContent,
 | 
						|
                  fit: BoxFit.cover,
 | 
						|
                  width: size,
 | 
						|
                  height: size,
 | 
						|
                  placeholder: (_) => textWidget,
 | 
						|
                  cacheKey: mxContent.toString(),
 | 
						|
                ),
 | 
						|
        ),
 | 
						|
      ),
 | 
						|
    );
 | 
						|
    if (onTap == null) return container;
 | 
						|
    return InkWell(
 | 
						|
      onTap: onTap,
 | 
						|
      borderRadius: borderRadius,
 | 
						|
      child: container,
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |