Files
PinePods-nix/PinePods-0.8.2/mobile/lib/ui/podcast/person_avatar.dart
2026-03-03 10:57:43 -05:00

83 lines
2.2 KiB
Dart

// Copyright 2020 Ben Hills and the project contributors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// ignore_for_file: must_be_immutable
import 'dart:async';
import 'package:pinepods_mobile/entities/person.dart';
import 'package:extended_image/extended_image.dart';
import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';
/// This Widget handles rendering of a person avatar.
///
/// The data comes from the <person> tag in the Podcasting 2.0 namespace.
///
/// https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#person
class PersonAvatar extends StatelessWidget {
final Person person;
String initials = '';
String role = '';
PersonAvatar({
super.key,
required this.person,
}) {
if (person.name.isNotEmpty) {
var parts = person.name.split(' ');
for (var i in parts) {
if (i.isNotEmpty) {
initials += i.substring(0, 1).toUpperCase();
}
}
}
if (person.role.isNotEmpty) {
role = person.role.substring(0, 1).toUpperCase() + person.role.substring(1);
}
}
@override
Widget build(BuildContext context) {
return GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: person.link != null && person.link!.isNotEmpty
? () {
final uri = Uri.parse(person.link!);
unawaited(
canLaunchUrl(uri).then((value) => launchUrl(uri)),
);
}
: null,
child: SizedBox(
width: 96,
child: Padding(
padding: const EdgeInsets.only(left: 16.0),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
CircleAvatar(
radius: 32,
foregroundImage: ExtendedImage.network(
person.image!,
cache: true,
).image,
child: Text(initials),
),
Text(
person.name,
maxLines: 3,
textAlign: TextAlign.center,
),
Text(role),
],
),
),
),
);
}
}