import 'package:antd_mobile/antd_mobile.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:git_touch/utils/utils.dart'; import 'package:git_touch/widgets/avatar.dart'; import 'package:gql_github/users.data.gql.dart'; const userGqlChunk = ''' login name avatarUrl bio '''; class GhBioWidget extends StatelessWidget { const GhBioWidget({this.location, required this.createdAt}); final String? location; final DateTime createdAt; @override Widget build(BuildContext context) { if (location != null) { return Row( children: [ Icon( Octicons.location, size: 15, color: AntTheme.of(context).colorTextSecondary, ), const SizedBox(width: 4), Expanded(child: Text(location!, overflow: TextOverflow.ellipsis)), ], ); } return Row( children: [ Icon( Octicons.clock, size: 15, color: AntTheme.of(context).colorTextSecondary, ), const SizedBox(width: 4), Expanded( child: Text('Joined on ${dateFormat.format(createdAt)}', overflow: TextOverflow.ellipsis)), ], ); } } class UserItem extends StatelessWidget { const UserItem.github({ required this.login, required this.name, required this.avatarUrl, required this.bio, }) : url = '/github/$login'; UserItem.fromGqlUser(GUserParts p) : login = p.login, name = p.name, avatarUrl = p.avatarUrl, url = '/github/${p.login}', bio = GhBioWidget(location: p.location, createdAt: p.createdAt); UserItem.fromGqlOrg(GOrgParts p) : login = p.login, name = p.name, avatarUrl = p.avatarUrl, url = '/github/${p.login}', bio = GhBioWidget(location: p.location, createdAt: p.createdAt); const UserItem.gitlab({ required this.login, required this.name, required this.avatarUrl, required this.bio, required int? id, }) : url = '/gitlab/user/$id'; const UserItem.gitlabGroup({ required this.login, required this.name, required this.avatarUrl, required this.bio, required int? id, }) : url = '/gitlab/group/$id'; const UserItem.gitea({ required this.login, required this.name, required this.avatarUrl, required this.bio, }) : url = '/gitea/$login'; const UserItem.gitee({ required this.login, required this.name, required this.avatarUrl, required this.bio, }) : url = '/gitee/$login'; const UserItem.bitbucket({ required this.login, required this.name, required this.avatarUrl, required this.bio, }) : url = '/bitbucket/$login?team=1'; const UserItem.gogs({ required this.login, required this.name, required this.avatarUrl, required this.bio, }) : url = '/gogs/$login'; final String? login; final String? name; final String? avatarUrl; final Widget? bio; final String url; @override Widget build(BuildContext context) { return AntListItem( onClick: () { context.pushUrl(url); }, child: Row( children: [ Avatar(url: avatarUrl, size: AvatarSize.large), const SizedBox(width: 10), Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( textBaseline: TextBaseline.alphabetic, crossAxisAlignment: CrossAxisAlignment.baseline, children: [ if (name != null && name!.isNotEmpty) ...[ Text( name!, style: TextStyle( color: AntTheme.of(context).colorText, fontSize: 18, fontWeight: FontWeight.w500, ), ), const SizedBox(width: 8), ], Expanded( child: Text( login!, style: TextStyle( color: AntTheme.of(context).colorText, fontSize: 16, ), overflow: TextOverflow.ellipsis, ), ), ], ), const SizedBox(height: 6), if (bio != null) DefaultTextStyle( style: TextStyle( color: AntTheme.of(context).colorTextSecondary, fontSize: 16, ), child: bio!, ), ], ), ) ], ), ); } }