From 562c67dac004de2c7765fbf9198328e0f0f842b2 Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Fri, 27 Sep 2019 18:23:47 +0800 Subject: [PATCH] feat: text contains organization --- lib/screens/repository.dart | 15 +++++---- lib/screens/user.dart | 7 ++++- lib/widgets/text_contains_organization.dart | 35 +++++++++++++++++++++ lib/widgets/user_item.dart | 3 +- 4 files changed, 50 insertions(+), 10 deletions(-) create mode 100644 lib/widgets/text_contains_organization.dart diff --git a/lib/screens/repository.dart b/lib/screens/repository.dart index 57587f5..9624157 100644 --- a/lib/screens/repository.dart +++ b/lib/screens/repository.dart @@ -359,14 +359,13 @@ class RepositoryScreen extends StatelessWidget { }, ), ], - if ((payload['releases']['totalCount'] as int) > 0) - TableViewItem( - leftIconData: Octicons.tag, - text: Text('Releases'), - rightWidget: Text( - (payload['releases']['totalCount'] as int).toString()), - url: payload['url'] + '/releases', - ), + TableViewItem( + leftIconData: Octicons.tag, + text: Text('Releases'), + rightWidget: Text( + (payload['releases']['totalCount'] as int).toString()), + url: payload['url'] + '/releases', + ), TableViewItem( leftIconData: Octicons.law, text: Text('License'), diff --git a/lib/screens/user.dart b/lib/screens/user.dart index ec626d4..506902d 100644 --- a/lib/screens/user.dart +++ b/lib/screens/user.dart @@ -4,7 +4,9 @@ import 'package:git_touch/scaffolds/refresh_stateful.dart'; import 'package:git_touch/screens/repositories.dart'; import 'package:git_touch/widgets/app_bar_title.dart'; import 'package:git_touch/widgets/table_view.dart'; +import 'package:git_touch/widgets/text_contains_organization.dart'; import 'package:git_touch/widgets/user_item.dart'; +import 'package:primer/primer.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:share/share.dart'; import 'package:github_contributions/github_contributions.dart'; @@ -237,7 +239,10 @@ class UserScreen extends StatelessWidget { if (isNotNullOrEmpty(payload['company'])) TableViewItem( leftIconData: Octicons.organization, - text: Text(payload['company']), + text: TextContainsOrganization(payload['company'], + style: TextStyle( + fontSize: 16, color: PrimerColors.gray900), + overflow: TextOverflow.ellipsis), ), if (isNotNullOrEmpty(payload['location'])) TableViewItem( diff --git a/lib/widgets/text_contains_organization.dart b/lib/widgets/text_contains_organization.dart new file mode 100644 index 0000000..29a957e --- /dev/null +++ b/lib/widgets/text_contains_organization.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import 'package:git_touch/screens/organization.dart'; +import 'package:git_touch/utils/utils.dart'; + +class TextContainsOrganization extends StatelessWidget { + final String text; + final TextStyle style; + final TextOverflow overflow; + + TextContainsOrganization(this.text, + {this.style, this.overflow = TextOverflow.clip}); + + static final _reg = RegExp(r'@\S+'); + + @override + Widget build(BuildContext context) { + final orgs = _reg.allMatches(text).map((m) => m.group(0)).toList(); + final chunks = text.split(_reg); + + List spans = []; + for (var index in List.generate(orgs.length, (i) => (i))) { + if (chunks[index].isNotEmpty) { + spans.add(TextSpan(text: chunks[index])); + } + spans.add(createLinkSpan(context, orgs[index], + (_) => OrganizationScreen(orgs[index].substring(1)))); + } + if (chunks.last.isNotEmpty) { + spans.add(TextSpan(text: chunks.last)); + } + + return RichText( + text: TextSpan(children: spans, style: style), overflow: overflow); + } +} diff --git a/lib/widgets/user_item.dart b/lib/widgets/user_item.dart index 0da2ab6..50cdb1d 100644 --- a/lib/widgets/user_item.dart +++ b/lib/widgets/user_item.dart @@ -3,6 +3,7 @@ import 'package:git_touch/screens/organization.dart'; import 'package:git_touch/screens/user.dart'; import 'package:git_touch/widgets/avatar.dart'; import 'package:git_touch/widgets/link.dart'; +import 'package:git_touch/widgets/text_contains_organization.dart'; import 'package:primer/primer.dart'; const userGqlChunk = ''' @@ -68,7 +69,7 @@ class UserItem extends StatelessWidget { ), SizedBox(height: 6), if (bio != null && bio.isNotEmpty) - Text( + TextContainsOrganization( bio, style: TextStyle(color: PrimerColors.gray700, fontSize: 15), ),