refactor: use list

This commit is contained in:
Rongjian Zhang 2022-09-21 02:00:03 +08:00
parent f0b52e82ab
commit e5929aa1b8
24 changed files with 361 additions and 318 deletions

View File

@ -47,12 +47,12 @@
// style: TextStyle(fontSize: 20, color: theme.palette.text), // style: TextStyle(fontSize: 20, color: theme.palette.text),
// ), // ),
// SizedBox(height: 48), // SizedBox(height: 48),
// TableView(items: [ // AntList(items: [
// TableViewItem(text: Text('Version'), rightWidget: Text(_version)), // AntListItem(text: Text('Version'), rightWidget: Text(_version)),
// TableViewItem(text: Text('Source Code'), url: '/pd4d10/git-touch'), // AntListItem(text: Text('Source Code'), url: '/pd4d10/git-touch'),
// TableViewItem( // AntListItem(
// text: Text('Feedback'), url: '/pd4d10/git-touch/issues/new'), // text: Text('Feedback'), url: '/pd4d10/git-touch/issues/new'),
// TableViewItem( // AntListItem(
// text: Text('Rate This App'), // text: Text('Rate This App'),
// onTap: () { // onTap: () {
// LaunchReview.launch( // LaunchReview.launch(

View File

@ -1,5 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:antd_mobile/antd_mobile.dart';
import 'package:filesize/filesize.dart'; import 'package:filesize/filesize.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/S.dart'; import 'package:flutter_gen/gen_l10n/S.dart';
@ -11,7 +12,7 @@ import 'package:git_touch/utils/utils.dart';
import 'package:git_touch/widgets/app_bar_title.dart'; import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:git_touch/widgets/markdown_view.dart'; import 'package:git_touch/widgets/markdown_view.dart';
import 'package:git_touch/widgets/repo_header.dart'; import 'package:git_touch/widgets/repo_header.dart';
import 'package:git_touch/widgets/table_view.dart'; import 'package:go_router/go_router.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
@ -56,33 +57,41 @@ class BbRepoScreen extends StatelessWidget {
homepageUrl: p.website, homepageUrl: p.website,
), ),
CommonStyle.border, CommonStyle.border,
TableView( AntList(
items: [ items: [
TableViewItem( AntListItem(
prefixIconData: Octicons.code, prefix: const Icon(Octicons.code),
child: const Text('Code'), child: const Text('Code'),
extra: Text(filesize(p.size)), extra: Text(filesize(p.size)),
url: onClick: () {
'/bitbucket/$owner/$name/src/${branch ?? p.mainbranch!.name}', context.push(
'/bitbucket/$owner/$name/src/${branch ?? p.mainbranch!.name}');
},
), ),
TableViewItem( AntListItem(
prefixIconData: Octicons.issue_opened, prefix: const Icon(Octicons.issue_opened),
child: const Text('Issues'), child: const Text('Issues'),
url: '/bitbucket/$owner/$name/issues', onClick: () {
context.push('/bitbucket/$owner/$name/issues');
},
), ),
TableViewItem( AntListItem(
prefixIconData: Octicons.git_pull_request, prefix: const Icon(Octicons.git_pull_request),
child: const Text('Pull requests'), child: const Text('Pull requests'),
url: '/bitbucket/$owner/$name/pulls', onClick: () {
context.push('/bitbucket/$owner/$name/pulls');
},
), ),
TableViewItem( AntListItem(
prefixIconData: Octicons.history, prefix: const Icon(Octicons.history),
child: const Text('Commits'), child: const Text('Commits'),
url: onClick: () {
'/bitbucket/$owner/$name/commits/${branch ?? p.mainbranch!.name}', context.push(
'/bitbucket/$owner/$name/commits/${branch ?? p.mainbranch!.name}');
},
), ),
TableViewItem( AntListItem(
prefixIconData: Octicons.git_branch, prefix: const Icon(Octicons.git_branch),
child: Text(AppLocalizations.of(context)!.branches), child: Text(AppLocalizations.of(context)!.branches),
extra: Text( extra: Text(
'${(branch ?? p.mainbranch!.name)!}${branches.length}'), '${(branch ?? p.mainbranch!.name)!}${branches.length}'),

View File

@ -1,3 +1,4 @@
import 'package:antd_mobile/antd_mobile.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/S.dart'; import 'package:flutter_gen/gen_l10n/S.dart';
@ -8,7 +9,6 @@ import 'package:git_touch/models/theme.dart';
import 'package:git_touch/scaffolds/single.dart'; import 'package:git_touch/scaffolds/single.dart';
import 'package:git_touch/utils/utils.dart'; import 'package:git_touch/utils/utils.dart';
import 'package:git_touch/widgets/app_bar_title.dart'; import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:git_touch/widgets/table_view.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class CodeThemeScreen extends StatelessWidget { class CodeThemeScreen extends StatelessWidget {
@ -44,10 +44,10 @@ class MyApp extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[ children: <Widget>[
CommonStyle.verticalGap, CommonStyle.verticalGap,
TableView( AntList(
header: Text(AppLocalizations.of(context)!.fontStyle), header: Text(AppLocalizations.of(context)!.fontStyle),
items: [ items: [
TableViewItem( AntListItem(
child: Text(AppLocalizations.of(context)!.fontSize), child: Text(AppLocalizations.of(context)!.fontSize),
extra: Text(codeProvider.fontSize.toString()), extra: Text(codeProvider.fontSize.toString()),
onClick: () { onClick: () {
@ -66,7 +66,7 @@ class MyApp extends StatelessWidget {
); );
}, },
), ),
TableViewItem( AntListItem(
child: Text(AppLocalizations.of(context)!.fontFamily), child: Text(AppLocalizations.of(context)!.fontFamily),
extra: Text(codeProvider.fontFamily), extra: Text(codeProvider.fontFamily),
onClick: () { onClick: () {
@ -87,10 +87,10 @@ class MyApp extends StatelessWidget {
], ],
), ),
CommonStyle.verticalGap, CommonStyle.verticalGap,
TableView( AntList(
header: Text(AppLocalizations.of(context)!.syntaxHighlighting), header: Text(AppLocalizations.of(context)!.syntaxHighlighting),
items: [ items: [
TableViewItem( AntListItem(
child: Text(AppLocalizations.of(context)!.light), child: Text(AppLocalizations.of(context)!.light),
extra: Text(codeProvider.theme), extra: Text(codeProvider.theme),
onClick: () { onClick: () {
@ -108,7 +108,7 @@ class MyApp extends StatelessWidget {
); );
}, },
), ),
TableViewItem( AntListItem(
child: Text(AppLocalizations.of(context)!.dark), child: Text(AppLocalizations.of(context)!.dark),
extra: Text(codeProvider.themeDark), extra: Text(codeProvider.themeDark),
onClick: () { onClick: () {

View File

@ -1,6 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:antd_mobile/antd_mobile.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/S.dart'; import 'package:flutter_gen/gen_l10n/S.dart';
import 'package:git_touch/models/auth.dart'; import 'package:git_touch/models/auth.dart';
@ -13,7 +14,7 @@ import 'package:git_touch/widgets/entry_item.dart';
import 'package:git_touch/widgets/markdown_view.dart'; import 'package:git_touch/widgets/markdown_view.dart';
import 'package:git_touch/widgets/mutation_button.dart'; import 'package:git_touch/widgets/mutation_button.dart';
import 'package:git_touch/widgets/repo_header.dart'; import 'package:git_touch/widgets/repo_header.dart';
import 'package:git_touch/widgets/table_view.dart'; import 'package:go_router/go_router.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
@ -132,34 +133,43 @@ class GeRepoScreen extends StatelessWidget {
], ],
), ),
CommonStyle.border, CommonStyle.border,
TableView( AntList(
items: [ items: [
TableViewItem( AntListItem(
prefixIconData: Octicons.code, prefix: const Icon(Octicons.code),
child: const Text('Code'), child: const Text('Code'),
extra: Text(p.license ?? ''), extra: Text(p.license ?? ''),
url: '/gitee/$owner/$name/tree/${branch ?? p.defaultBranch}', onClick: () {
context.push(
'/gitee/$owner/$name/tree/${branch ?? p.defaultBranch}');
},
), ),
TableViewItem( AntListItem(
prefixIconData: Octicons.issue_opened, prefix: const Icon(Octicons.issue_opened),
child: const Text('Issues'), child: const Text('Issues'),
extra: Text(numberFormat.format(p.openIssuesCount)), extra: Text(numberFormat.format(p.openIssuesCount)),
url: '/gitee/$owner/$name/issues', onClick: () {
context.push('/gitee/$owner/$name/issues');
},
), ),
if (p.pullRequestsEnabled!) if (p.pullRequestsEnabled!)
TableViewItem( AntListItem(
prefixIconData: Octicons.git_pull_request, prefix: const Icon(Octicons.git_pull_request),
child: const Text('Pull requests'), child: const Text('Pull requests'),
url: '/gitee/$owner/$name/pulls', onClick: () {
context.push('/gitee/$owner/$name/pulls');
},
), ),
TableViewItem( AntListItem(
prefixIconData: Octicons.history, prefix: const Icon(Octicons.history),
child: const Text('Commits'), child: const Text('Commits'),
url: onClick: () {
'/gitee/$owner/$name/commits?branch=${branch ?? p.defaultBranch}', context.push(
'/gitee/$owner/$name/commits?branch=${branch ?? p.defaultBranch}');
},
), ),
TableViewItem( AntListItem(
prefixIconData: Octicons.git_branch, prefix: const Icon(Octicons.git_branch),
child: Text(AppLocalizations.of(context)!.branches), child: Text(AppLocalizations.of(context)!.branches),
extra: Text( extra: Text(
'${(branch ?? p.defaultBranch)!}${branches.length}'), '${(branch ?? p.defaultBranch)!}${branches.length}'),
@ -184,10 +194,13 @@ class GeRepoScreen extends StatelessWidget {
); );
}, },
), ),
TableViewItem( AntListItem(
prefixIconData: Octicons.organization, prefix: const Icon(Octicons.organization),
child: const Text('Contributors'), child: const Text('Contributors'),
url: '/gitee/$owner/$name/contributors'), onClick: () {
context.push('/gitee/$owner/$name/contributors');
},
),
], ],
), ),
CommonStyle.verticalGap, CommonStyle.verticalGap,

View File

@ -1,3 +1,4 @@
import 'package:antd_mobile/antd_mobile.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/S.dart'; import 'package:flutter_gen/gen_l10n/S.dart';
@ -7,7 +8,6 @@ import 'package:git_touch/scaffolds/refresh_stateful.dart';
import 'package:git_touch/utils/utils.dart'; import 'package:git_touch/utils/utils.dart';
import 'package:git_touch/widgets/app_bar_title.dart'; import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:git_touch/widgets/object_tree.dart'; import 'package:git_touch/widgets/object_tree.dart';
import 'package:git_touch/widgets/table_view.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class GeTreeScreen extends StatelessWidget { class GeTreeScreen extends StatelessWidget {
@ -31,7 +31,7 @@ class GeTreeScreen extends StatelessWidget {
return items; return items;
}, },
bodyBuilder: (data, _) { bodyBuilder: (data, _) {
return TableView( return AntList(
items: [ items: [
for (var item in data) for (var item in data)
createObjectTreeItem( createObjectTreeItem(

View File

@ -85,10 +85,10 @@ class GeUserScreen extends StatelessWidget {
url: '/gitee/$login?tab=following', url: '/gitee/$login?tab=following',
), ),
]), ]),
// TableView( // AntList(
// hasIcon: true, // hasIcon: true,
// items: [ // items: [
// TableViewItem( // AntListItem(
// leftIconData: Octicons.home, // leftIconData: Octicons.home,
// text: Text('Organizations'), // text: Text('Organizations'),
// url: '/gitee/$login?tab=organizations', // url: '/gitee/$login?tab=organizations',

View File

@ -1,3 +1,4 @@
import 'package:antd_mobile/antd_mobile.dart';
import 'package:ferry/ferry.dart'; import 'package:ferry/ferry.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
@ -9,7 +10,6 @@ import 'package:git_touch/models/auth.dart';
import 'package:git_touch/scaffolds/refresh_stateful.dart'; import 'package:git_touch/scaffolds/refresh_stateful.dart';
import 'package:git_touch/widgets/app_bar_title.dart'; import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:git_touch/widgets/object_tree.dart'; import 'package:git_touch/widgets/object_tree.dart';
import 'package:git_touch/widgets/table_view.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class GhGistsFilesScreen extends StatelessWidget { class GhGistsFilesScreen extends StatelessWidget {
@ -31,7 +31,7 @@ class GhGistsFilesScreen extends StatelessWidget {
return gist; return gist;
}, },
bodyBuilder: (payload, _) { bodyBuilder: (payload, _) {
return TableView( return AntList(
items: payload!.files!.map((v) { items: payload!.files!.map((v) {
final uri = Uri( final uri = Uri(
path: '/github/$login/gists/$id/${v.name}', path: '/github/$login/gists/$id/${v.name}',
@ -46,7 +46,7 @@ class GhGistsFilesScreen extends StatelessWidget {
downloadUrl: null, downloadUrl: null,
size: v.size, size: v.size,
); );
}), }).toList(),
); );
}, },
); );

View File

@ -1,9 +1,9 @@
import 'package:antd_mobile/antd_mobile.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:git_touch/graphql/__generated__/github.data.gql.dart'; import 'package:git_touch/graphql/__generated__/github.data.gql.dart';
import 'package:git_touch/graphql/__generated__/github.req.gql.dart'; import 'package:git_touch/graphql/__generated__/github.req.gql.dart';
import 'package:git_touch/models/auth.dart'; import 'package:git_touch/models/auth.dart';
import 'package:git_touch/scaffolds/refresh_stateful.dart'; import 'package:git_touch/scaffolds/refresh_stateful.dart';
import 'package:git_touch/widgets/table_view.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class GhMetaScreen extends StatelessWidget { class GhMetaScreen extends StatelessWidget {
@ -20,9 +20,9 @@ class GhMetaScreen extends StatelessWidget {
return res.data!.meta; return res.data!.meta;
}, },
bodyBuilder: (meta, _) { bodyBuilder: (meta, _) {
return TableView( return AntList(
items: [ items: [
TableViewItem( AntListItem(
child: const Text('Service SHA'), child: const Text('Service SHA'),
extra: Text(meta.gitHubServicesSha), extra: Text(meta.gitHubServicesSha),
), ),

View File

@ -1,3 +1,4 @@
import 'package:antd_mobile/antd_mobile.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:git_touch/models/auth.dart'; import 'package:git_touch/models/auth.dart';
@ -7,7 +8,6 @@ import 'package:git_touch/widgets/action_entry.dart';
import 'package:git_touch/widgets/app_bar_title.dart'; import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:git_touch/widgets/blob_view.dart'; import 'package:git_touch/widgets/blob_view.dart';
import 'package:git_touch/widgets/object_tree.dart'; import 'package:git_touch/widgets/object_tree.dart';
import 'package:git_touch/widgets/table_view.dart';
import 'package:github/github.dart'; import 'package:github/github.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -59,7 +59,7 @@ class GhObjectScreen extends StatelessWidget {
}, },
bodyBuilder: (data, _) { bodyBuilder: (data, _) {
if (data.isDirectory) { if (data.isDirectory) {
return TableView( return AntList(
items: data.tree!.map((v) { items: data.tree!.map((v) {
// if (item.type == 'commit') return null; // if (item.type == 'commit') return null;
final uri = Uri( final uri = Uri(
@ -76,7 +76,7 @@ class GhObjectScreen extends StatelessWidget {
downloadUrl: v.downloadUrl, downloadUrl: v.downloadUrl,
size: v.type == 'file' ? v.size : null, size: v.type == 'file' ? v.size : null,
); );
}), }).toList(),
); );
} else { } else {
// TODO: Markdown base path // TODO: Markdown base path

View File

@ -19,8 +19,8 @@ import 'package:git_touch/widgets/language_bar.dart';
import 'package:git_touch/widgets/markdown_view.dart'; import 'package:git_touch/widgets/markdown_view.dart';
import 'package:git_touch/widgets/mutation_button.dart'; import 'package:git_touch/widgets/mutation_button.dart';
import 'package:git_touch/widgets/repo_header.dart'; import 'package:git_touch/widgets/repo_header.dart';
import 'package:git_touch/widgets/table_view.dart';
import 'package:github/github.dart'; import 'package:github/github.dart';
import 'package:go_router/go_router.dart';
import 'package:primer/primer.dart'; import 'package:primer/primer.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
@ -240,43 +240,51 @@ class GhRepoScreen extends StatelessWidget {
) )
]), ]),
], ],
TableView( AntList(
items: [ items: [
if (ref != null) if (ref != null)
TableViewItem( AntListItem(
prefixIconData: Octicons.code, prefix: const Icon(Octicons.code),
child: Text(repo.primaryLanguage?.name ?? 'Code'), child: Text(repo.primaryLanguage?.name ?? 'Code'),
extra: Text( extra: Text(
(license == null ? '' : '$license') + (license == null ? '' : '$license') +
filesize(repo.diskUsage! * 1000), filesize(repo.diskUsage! * 1000),
), ),
url: '/github/$owner/$name/blob/${ref.name}', onClick: () {
context.push('/github/$owner/$name/blob/${ref.name}');
},
), ),
if (repo.hasIssuesEnabled) if (repo.hasIssuesEnabled)
TableViewItem( AntListItem(
prefixIconData: Octicons.issue_opened, prefix: const Icon(Octicons.issue_opened),
child: Text(AppLocalizations.of(context)!.issues), child: Text(AppLocalizations.of(context)!.issues),
extra: Text(numberFormat.format(repo.issues.totalCount)), extra: Text(numberFormat.format(repo.issues.totalCount)),
url: '/github/$owner/$name/issues', onClick: () {
context.push('/github/$owner/$name/issues');
},
), ),
TableViewItem( AntListItem(
prefixIconData: Octicons.git_pull_request, prefix: const Icon(Octicons.git_pull_request),
child: Text(AppLocalizations.of(context)!.pullRequests), child: Text(AppLocalizations.of(context)!.pullRequests),
extra: extra:
Text(numberFormat.format(repo.pullRequests.totalCount)), Text(numberFormat.format(repo.pullRequests.totalCount)),
url: '/github/$owner/$name/pulls', onClick: () {
context.push('/github/$owner/$name/pulls');
},
), ),
if (ref != null) ...[ if (ref != null) ...[
TableViewItem( AntListItem(
prefixIconData: Octicons.history, prefix: const Icon(Octicons.history),
child: Text(AppLocalizations.of(context)!.commits), child: Text(AppLocalizations.of(context)!.commits),
extra: Text(((ref.target as GRepoCommit).history.totalCount) extra: Text(((ref.target as GRepoCommit).history.totalCount)
.toString()), .toString()),
url: '/github/$owner/$name/commits/${ref.name}', onClick: () {
context.push('/github/$owner/$name/commits/${ref.name}');
},
), ),
if (repo.refs != null) if (repo.refs != null)
TableViewItem( AntListItem(
prefixIconData: Octicons.git_branch, prefix: const Icon(Octicons.git_branch),
child: Text(AppLocalizations.of(context)!.branches), child: Text(AppLocalizations.of(context)!.branches),
extra: Text( extra: Text(
'${ref.name}${numberFormat.format(repo.refs!.totalCount)}'), '${ref.name}${numberFormat.format(repo.refs!.totalCount)}'),
@ -302,8 +310,8 @@ class GhRepoScreen extends StatelessWidget {
); );
}, },
), ),
TableViewItem( AntListItem(
prefixIconData: Octicons.organization, prefix: const Icon(Octicons.organization),
child: Text(AppLocalizations.of(context)!.contributors), child: Text(AppLocalizations.of(context)!.contributors),
extra: FutureBuilder<int>( extra: FutureBuilder<int>(
future: contributionFuture, future: contributionFuture,
@ -311,12 +319,16 @@ class GhRepoScreen extends StatelessWidget {
return Text(snapshot.data?.toString() ?? ''); return Text(snapshot.data?.toString() ?? '');
}, },
), ),
url: '/github/$owner/$name/contributors', onClick: () {
context.push('/github/$owner/$name/contributors');
},
), ),
TableViewItem( AntListItem(
prefixIconData: Octicons.book, prefix: const Icon(Octicons.book),
child: Text(AppLocalizations.of(context)!.releases), child: Text(AppLocalizations.of(context)!.releases),
url: '/github/$owner/$name/releases', onClick: () {
context.push('/github/$owner/$name/releases');
},
extra: Text(repo.releases.totalCount.toString()), extra: Text(repo.releases.totalCount.toString()),
), ),
], ],

View File

@ -1,3 +1,4 @@
import 'package:antd_mobile/antd_mobile.dart';
import 'package:ferry/ferry.dart'; import 'package:ferry/ferry.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
@ -19,6 +20,7 @@ import 'package:git_touch/widgets/repository_item.dart';
import 'package:git_touch/widgets/table_view.dart'; import 'package:git_touch/widgets/table_view.dart';
import 'package:git_touch/widgets/text_with_at.dart'; import 'package:git_touch/widgets/text_with_at.dart';
import 'package:git_touch/widgets/user_header.dart'; import 'package:git_touch/widgets/user_header.dart';
import 'package:go_router/go_router.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class _Repos extends StatelessWidget { class _Repos extends StatelessWidget {
@ -117,26 +119,32 @@ class _User extends StatelessWidget {
], ],
), ),
CommonStyle.border, CommonStyle.border,
TableView( AntList(
items: [ items: [
TableViewItem( AntListItem(
prefixIconData: Octicons.rss, prefix: const Icon(Octicons.rss),
child: Text(AppLocalizations.of(context)!.events), child: Text(AppLocalizations.of(context)!.events),
url: '/github/$login?tab=events', onClick: () {
context.push('/github/$login?tab=events');
},
), ),
TableViewItem( AntListItem(
prefixIconData: Octicons.book, prefix: const Icon(Octicons.book),
child: Text(AppLocalizations.of(context)!.gists), child: Text(AppLocalizations.of(context)!.gists),
url: '/github/$login?tab=gists', onClick: () {
context.push('/github/$login?tab=gists');
},
), ),
TableViewItem( AntListItem(
prefixIconData: Octicons.home, prefix: const Icon(Octicons.home),
child: Text(AppLocalizations.of(context)!.organizations), child: Text(AppLocalizations.of(context)!.organizations),
url: '/github/$login?tab=organizations', onClick: () {
context.push('/github/$login?tab=organizations');
},
), ),
if (isNotNullOrEmpty(p!.company)) if (isNotNullOrEmpty(p!.company))
TableViewItem( AntListItem(
prefixIconData: Octicons.organization, prefix: const Icon(Octicons.organization),
child: TextWithAt( child: TextWithAt(
text: p!.company!, text: p!.company!,
linkFactory: (text) => '/github/${text.substring(1)}', linkFactory: (text) => '/github/${text.substring(1)}',
@ -145,8 +153,8 @@ class _User extends StatelessWidget {
), ),
), ),
if (isNotNullOrEmpty(p!.location)) if (isNotNullOrEmpty(p!.location))
TableViewItem( AntListItem(
prefixIconData: Octicons.location, prefix: const Icon(Octicons.location),
child: Text(p!.location!), child: Text(p!.location!),
onClick: () { onClick: () {
launchStringUrl( launchStringUrl(
@ -154,16 +162,16 @@ class _User extends StatelessWidget {
}, },
), ),
if (isNotNullOrEmpty(p!.email)) if (isNotNullOrEmpty(p!.email))
TableViewItem( AntListItem(
prefixIconData: Octicons.mail, prefix: const Icon(Octicons.mail),
child: Text(p!.email), child: Text(p!.email),
onClick: () { onClick: () {
launchStringUrl('mailto:${p!.email}'); launchStringUrl('mailto:${p!.email}');
}, },
), ),
if (isNotNullOrEmpty(p!.websiteUrl)) if (isNotNullOrEmpty(p!.websiteUrl))
TableViewItem( AntListItem(
prefixIconData: Octicons.link, prefix: const Icon(Octicons.link),
child: Text(p!.websiteUrl!), child: Text(p!.websiteUrl!),
onClick: () { onClick: () {
var url = p!.websiteUrl!; var url = p!.websiteUrl!;
@ -215,16 +223,18 @@ class _Org extends StatelessWidget {
url: '/github/${p!.login}?tab=people', url: '/github/${p!.login}?tab=people',
), ),
]), ]),
TableView( AntList(
items: [ items: [
TableViewItem( AntListItem(
prefixIconData: Octicons.rss, prefix: const Icon(Octicons.rss),
child: Text(AppLocalizations.of(context)!.events), child: Text(AppLocalizations.of(context)!.events),
url: '/github/${p!.login}?tab=events', onClick: () {
context.push('/github/${p!.login}?tab=events');
},
), ),
if (isNotNullOrEmpty(p!.location)) if (isNotNullOrEmpty(p!.location))
TableViewItem( AntListItem(
prefixIconData: Octicons.location, prefix: const Icon(Octicons.location),
child: Text(p!.location!), child: Text(p!.location!),
onClick: () { onClick: () {
launchStringUrl( launchStringUrl(
@ -232,16 +242,16 @@ class _Org extends StatelessWidget {
}, },
), ),
if (isNotNullOrEmpty(p!.email)) if (isNotNullOrEmpty(p!.email))
TableViewItem( AntListItem(
prefixIconData: Octicons.mail, prefix: const Icon(Octicons.mail),
child: Text(p!.email!), child: Text(p!.email!),
onClick: () { onClick: () {
launchStringUrl('mailto:${p!.email!}'); launchStringUrl('mailto:${p!.email!}');
}, },
), ),
if (isNotNullOrEmpty(p!.websiteUrl)) if (isNotNullOrEmpty(p!.websiteUrl))
TableViewItem( AntListItem(
prefixIconData: Octicons.link, prefix: const Icon(Octicons.link),
child: Text(p!.websiteUrl!), child: Text(p!.websiteUrl!),
onClick: () { onClick: () {
var url = p!.websiteUrl!; var url = p!.websiteUrl!;

View File

@ -1,3 +1,4 @@
import 'package:antd_mobile/antd_mobile.dart';
import 'package:filesize/filesize.dart'; import 'package:filesize/filesize.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
@ -13,7 +14,7 @@ import 'package:git_touch/widgets/entry_item.dart';
import 'package:git_touch/widgets/language_bar.dart'; import 'package:git_touch/widgets/language_bar.dart';
import 'package:git_touch/widgets/markdown_view.dart'; import 'package:git_touch/widgets/markdown_view.dart';
import 'package:git_touch/widgets/repo_header.dart'; import 'package:git_touch/widgets/repo_header.dart';
import 'package:git_touch/widgets/table_view.dart'; import 'package:go_router/go_router.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
@ -155,10 +156,10 @@ class GlProjectScreen extends StatelessWidget {
}, },
), ),
CommonStyle.border, CommonStyle.border,
TableView( AntList(
items: [ items: [
TableViewItem( AntListItem(
prefixIconData: Octicons.code, prefix: const Icon(Octicons.code),
child: FutureBuilder<Map<String, double>>( child: FutureBuilder<Map<String, double>>(
future: langFuture, future: langFuture,
builder: (context, snapshot) { builder: (context, snapshot) {
@ -175,32 +176,43 @@ class GlProjectScreen extends StatelessWidget {
extra: p.statistics == null extra: p.statistics == null
? null ? null
: Text(filesize(p.statistics!.repositorySize)), : Text(filesize(p.statistics!.repositorySize)),
url: '/gitlab/projects/$id/tree/${branch ?? p.defaultBranch}', onClick: () {
context.push(
'/gitlab/projects/$id/tree/${branch ?? p.defaultBranch}');
},
), ),
if (p.issuesEnabled!) if (p.issuesEnabled!)
TableViewItem( AntListItem(
prefixIconData: Octicons.issue_opened, prefix: const Icon(Octicons.issue_opened),
child: Text(AppLocalizations.of(context)!.issues), child: Text(AppLocalizations.of(context)!.issues),
extra: Text(numberFormat.format(p.openIssuesCount)), extra: Text(numberFormat.format(p.openIssuesCount)),
url: '/gitlab/projects/$id/issues?prefix=$prefix', onClick: () {
context
.push('/gitlab/projects/$id/issues?prefix=$prefix');
},
), ),
if (p.mergeRequestsEnabled!) if (p.mergeRequestsEnabled!)
TableViewItem( AntListItem(
prefixIconData: Octicons.git_pull_request, prefix: const Icon(Octicons.git_pull_request),
child: Text(AppLocalizations.of(context)!.mergeRequests), child: Text(AppLocalizations.of(context)!.mergeRequests),
url: '/gitlab/projects/$id/merge_requests?prefix=$prefix', onClick: () {
context.push(
'/gitlab/projects/$id/merge_requests?prefix=$prefix');
},
), ),
TableViewItem( AntListItem(
prefixIconData: Octicons.history, prefix: const Icon(Octicons.history),
child: Text(AppLocalizations.of(context)!.commits), child: Text(AppLocalizations.of(context)!.commits),
extra: p.statistics == null extra: p.statistics == null
? null ? null
: Text(p.statistics!.commitCount.toString()), : Text(p.statistics!.commitCount.toString()),
url: onClick: () {
'/gitlab/projects/$id/commits?prefix=$prefix&branch=${branch ?? p.defaultBranch}', // EDIT context.push(
'/gitlab/projects/$id/commits?prefix=$prefix&branch=${branch ?? p.defaultBranch}');
}, // EDIT
), ),
TableViewItem( AntListItem(
prefixIconData: Octicons.git_branch, prefix: const Icon(Octicons.git_branch),
child: Text(AppLocalizations.of(context)!.branches), child: Text(AppLocalizations.of(context)!.branches),
extra: Text( extra: Text(
'${(branch ?? p.defaultBranch) ?? ''}${branches.length}'), '${(branch ?? p.defaultBranch) ?? ''}${branches.length}'),

View File

@ -1,3 +1,4 @@
import 'package:antd_mobile/antd_mobile.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/S.dart'; import 'package:flutter_gen/gen_l10n/S.dart';
import 'package:git_touch/models/auth.dart'; import 'package:git_touch/models/auth.dart';
@ -8,7 +9,6 @@ import 'package:git_touch/widgets/action_entry.dart';
import 'package:git_touch/widgets/app_bar_title.dart'; import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:git_touch/widgets/blob_view.dart'; import 'package:git_touch/widgets/blob_view.dart';
import 'package:git_touch/widgets/object_tree.dart'; import 'package:git_touch/widgets/object_tree.dart';
import 'package:git_touch/widgets/table_view.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class GoObjectScreen extends StatelessWidget { class GoObjectScreen extends StatelessWidget {
@ -45,7 +45,7 @@ class GoObjectScreen extends StatelessWidget {
items.sort((a, b) { items.sort((a, b) {
return sortByKey('dir', a.type, b.type); return sortByKey('dir', a.type, b.type);
}); });
return TableView(items: [ return AntList(items: [
for (var v in items) for (var v in items)
createObjectTreeItem( createObjectTreeItem(
name: v.name, name: v.name,

View File

@ -1,5 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:antd_mobile/antd_mobile.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/S.dart'; import 'package:flutter_gen/gen_l10n/S.dart';
import 'package:git_touch/models/auth.dart'; import 'package:git_touch/models/auth.dart';
@ -11,7 +12,7 @@ import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:git_touch/widgets/entry_item.dart'; import 'package:git_touch/widgets/entry_item.dart';
import 'package:git_touch/widgets/markdown_view.dart'; import 'package:git_touch/widgets/markdown_view.dart';
import 'package:git_touch/widgets/repo_header.dart'; import 'package:git_touch/widgets/repo_header.dart';
import 'package:git_touch/widgets/table_view.dart'; import 'package:go_router/go_router.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
@ -90,30 +91,38 @@ class GoRepoScreen extends StatelessWidget {
], ],
), ),
CommonStyle.border, CommonStyle.border,
TableView( AntList(
items: [ items: [
TableViewItem( AntListItem(
prefixIconData: Octicons.code, prefix: const Icon(Octicons.code),
child: const Text('Code'), child: const Text('Code'),
url: '/gogs/$owner/$name/blob?ref=${branch ?? 'master'}', onClick: () {
context.push(
'/gogs/$owner/$name/blob?ref=${branch ?? 'master'}');
},
), ),
TableViewItem( AntListItem(
prefixIconData: Octicons.issue_opened, prefix: const Icon(Octicons.issue_opened),
child: const Text('Issues'), child: const Text('Issues'),
url: '/gogs/$owner/$name/issues', onClick: () {
context.push('/gogs/$owner/$name/issues');
},
), ),
const TableViewItem( AntListItem(
prefixIconData: Octicons.git_pull_request, prefix: const Icon(Octicons.git_pull_request),
child: Text( child: const Text(
'Pull requests'), // TODO: when API endpoint is available 'Pull requests'), // TODO: when API endpoint is available
), ),
TableViewItem( AntListItem(
prefixIconData: Octicons.history, prefix: const Icon(Octicons.history),
child: const Text('Commits'), child: const Text('Commits'),
url: '/gogs/$owner/$name/commits?ref=${branch ?? 'master'}', onClick: () {
context.push(
'/gogs/$owner/$name/commits?ref=${branch ?? 'master'}');
},
), ),
TableViewItem( AntListItem(
prefixIconData: Octicons.git_branch, prefix: const Icon(Octicons.git_branch),
child: Text(AppLocalizations.of(context)!.branches), child: Text(AppLocalizations.of(context)!.branches),
extra: Text( extra: Text(
'${branch ?? 'master'}${branches.length.toString()}'), '${branch ?? 'master'}${branches.length.toString()}'),

View File

@ -1,3 +1,4 @@
import 'package:antd_mobile/antd_mobile.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:git_touch/models/auth.dart'; import 'package:git_touch/models/auth.dart';
import 'package:git_touch/models/gogs.dart'; import 'package:git_touch/models/gogs.dart';
@ -6,8 +7,8 @@ import 'package:git_touch/utils/utils.dart';
import 'package:git_touch/widgets/action_entry.dart'; import 'package:git_touch/widgets/action_entry.dart';
import 'package:git_touch/widgets/entry_item.dart'; import 'package:git_touch/widgets/entry_item.dart';
import 'package:git_touch/widgets/repository_item.dart'; import 'package:git_touch/widgets/repository_item.dart';
import 'package:git_touch/widgets/table_view.dart';
import 'package:git_touch/widgets/user_header.dart'; import 'package:git_touch/widgets/user_header.dart';
import 'package:go_router/go_router.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
@ -70,13 +71,15 @@ class GoUserScreen extends StatelessWidget {
), ),
]), ]),
CommonStyle.border, CommonStyle.border,
TableView( AntList(
items: [ items: [
TableViewItem( AntListItem(
prefixIconData: Octicons.home, prefix: const Icon(Octicons.home),
child: const Text('Organizations'), child: const Text('Organizations'),
url: onClick: () {
'/gogs/${user.username}?tab=organizations&isViewer=$isViewer', context.push(
'/gogs/${user.username}?tab=organizations&isViewer=$isViewer');
},
), ),
], ],
), ),

View File

@ -1,3 +1,4 @@
import 'package:antd_mobile/antd_mobile.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/S.dart'; import 'package:flutter_gen/gen_l10n/S.dart';
import 'package:git_touch/models/auth.dart'; import 'package:git_touch/models/auth.dart';
@ -8,7 +9,6 @@ import 'package:git_touch/widgets/action_entry.dart';
import 'package:git_touch/widgets/app_bar_title.dart'; import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:git_touch/widgets/blob_view.dart'; import 'package:git_touch/widgets/blob_view.dart';
import 'package:git_touch/widgets/object_tree.dart'; import 'package:git_touch/widgets/object_tree.dart';
import 'package:git_touch/widgets/table_view.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class GtObjectScreen extends StatelessWidget { class GtObjectScreen extends StatelessWidget {
@ -44,7 +44,7 @@ class GtObjectScreen extends StatelessWidget {
items.sort((a, b) { items.sort((a, b) {
return sortByKey('dir', a.type, b.type); return sortByKey('dir', a.type, b.type);
}); });
return TableView(items: [ return AntList(items: [
for (var v in items) for (var v in items)
createObjectTreeItem( createObjectTreeItem(
name: v.name, name: v.name,

View File

@ -1,5 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:antd_mobile/antd_mobile.dart';
import 'package:filesize/filesize.dart'; import 'package:filesize/filesize.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/S.dart'; import 'package:flutter_gen/gen_l10n/S.dart';
@ -11,7 +12,7 @@ import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:git_touch/widgets/entry_item.dart'; import 'package:git_touch/widgets/entry_item.dart';
import 'package:git_touch/widgets/markdown_view.dart'; import 'package:git_touch/widgets/markdown_view.dart';
import 'package:git_touch/widgets/repo_header.dart'; import 'package:git_touch/widgets/repo_header.dart';
import 'package:git_touch/widgets/table_view.dart'; import 'package:go_router/go_router.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
@ -80,30 +81,38 @@ class GtRepoScreen extends StatelessWidget {
], ],
), ),
CommonStyle.border, CommonStyle.border,
TableView( AntList(
items: [ items: [
TableViewItem( AntListItem(
prefixIconData: Octicons.code, prefix: const Icon(Octicons.code),
child: const Text('Code'), child: const Text('Code'),
extra: Text(filesize(p.size! * 1000)), extra: Text(filesize(p.size! * 1000)),
url: '/gitea/$owner/$name/blob', onClick: () {
context.push('/gitea/$owner/$name/blob');
},
), ),
TableViewItem( AntListItem(
prefixIconData: Octicons.issue_opened, prefix: const Icon(Octicons.issue_opened),
child: const Text('Issues'), child: const Text('Issues'),
extra: Text(numberFormat.format(p.openIssuesCount)), extra: Text(numberFormat.format(p.openIssuesCount)),
url: '/gitea/$owner/$name/issues', onClick: () {
context.push('/gitea/$owner/$name/issues');
},
), ),
TableViewItem( AntListItem(
prefixIconData: Octicons.git_pull_request, prefix: const Icon(Octicons.git_pull_request),
child: const Text('Pull requests'), child: const Text('Pull requests'),
extra: Text(numberFormat.format(p.openPrCounter)), extra: Text(numberFormat.format(p.openPrCounter)),
url: '/gitea/$owner/$name/pulls', onClick: () {
context.push('/gitea/$owner/$name/pulls');
},
), ),
TableViewItem( AntListItem(
prefixIconData: Octicons.history, prefix: const Icon(Octicons.history),
child: const Text('Commits'), child: const Text('Commits'),
url: '/gitea/$owner/$name/commits', onClick: () {
context.push('/gitea/$owner/$name/commits');
},
), ),
], ],
), ),

View File

@ -1,3 +1,4 @@
import 'package:antd_mobile/antd_mobile.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:git_touch/models/auth.dart'; import 'package:git_touch/models/auth.dart';
import 'package:git_touch/models/gitea.dart'; import 'package:git_touch/models/gitea.dart';
@ -7,8 +8,8 @@ import 'package:git_touch/widgets/action_entry.dart';
import 'package:git_touch/widgets/contribution.dart'; import 'package:git_touch/widgets/contribution.dart';
import 'package:git_touch/widgets/entry_item.dart'; import 'package:git_touch/widgets/entry_item.dart';
import 'package:git_touch/widgets/repository_item.dart'; import 'package:git_touch/widgets/repository_item.dart';
import 'package:git_touch/widgets/table_view.dart';
import 'package:git_touch/widgets/user_header.dart'; import 'package:git_touch/widgets/user_header.dart';
import 'package:go_router/go_router.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:timeago/timeago.dart' as timeago; import 'package:timeago/timeago.dart' as timeago;
@ -129,12 +130,14 @@ class GtUserScreen extends StatelessWidget {
]), ]),
ContributionWidget(weeks: p.userHeatmap), ContributionWidget(weeks: p.userHeatmap),
CommonStyle.border, CommonStyle.border,
TableView( AntList(
items: [ items: [
TableViewItem( AntListItem(
prefixIconData: Octicons.home, prefix: const Icon(Octicons.home),
child: const Text('Organizations'), child: const Text('Organizations'),
url: '/gitea/$login?tab=organizations', onClick: () {
context.push('/gitea/$login?tab=organizations');
},
), ),
], ],
), ),

View File

@ -8,12 +8,11 @@ import 'package:git_touch/scaffolds/single.dart';
import 'package:git_touch/utils/utils.dart'; import 'package:git_touch/utils/utils.dart';
import 'package:git_touch/widgets/action_button.dart'; import 'package:git_touch/widgets/action_button.dart';
import 'package:git_touch/widgets/app_bar_title.dart'; import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:git_touch/widgets/text_field.dart';
import 'package:provider/provider.dart';
import 'package:git_touch/widgets/avatar.dart'; import 'package:git_touch/widgets/avatar.dart';
import 'package:git_touch/widgets/link.dart'; import 'package:git_touch/widgets/link.dart';
import 'package:git_touch/widgets/loading.dart'; import 'package:git_touch/widgets/loading.dart';
import 'package:git_touch/widgets/text_field.dart';
import 'package:provider/provider.dart';
class LoginScreen extends StatefulWidget { class LoginScreen extends StatefulWidget {
@override @override

View File

@ -1,3 +1,4 @@
import 'package:antd_mobile/antd_mobile.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/S.dart'; import 'package:flutter_gen/gen_l10n/S.dart';
@ -9,7 +10,7 @@ import 'package:git_touch/utils/locale.dart';
import 'package:git_touch/utils/utils.dart'; import 'package:git_touch/utils/utils.dart';
import 'package:git_touch/widgets/action_button.dart'; import 'package:git_touch/widgets/action_button.dart';
import 'package:git_touch/widgets/app_bar_title.dart'; import 'package:git_touch/widgets/app_bar_title.dart';
import 'package:git_touch/widgets/table_view.dart'; import 'package:go_router/go_router.dart';
import 'package:launch_review/launch_review.dart'; import 'package:launch_review/launch_review.dart';
import 'package:package_info_plus/package_info_plus.dart'; import 'package:package_info_plus/package_info_plus.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -26,27 +27,35 @@ class SettingsScreen extends StatelessWidget {
body: Column( body: Column(
children: <Widget>[ children: <Widget>[
CommonStyle.verticalGap, CommonStyle.verticalGap,
TableView(header: Text(AppLocalizations.of(context)!.system), items: [ AntList(header: Text(AppLocalizations.of(context)!.system), items: [
if (auth.activeAccount!.platform == PlatformType.github) ...[ if (auth.activeAccount!.platform == PlatformType.github) ...[
TableViewItem( AntListItem(
child: Text(AppLocalizations.of(context)!.githubStatus), child: Text(AppLocalizations.of(context)!.githubStatus),
url: 'https://www.githubstatus.com/', onClick: () {
launchStringUrl('https://www.githubstatus.com/');
},
), ),
const TableViewItem( AntListItem(
child: Text('Meta'), child: const Text('Meta'),
url: '/settings/github-meta', onClick: () {
context.push('/settings/github-meta');
},
), ),
TableViewItem( AntListItem(
child: Text(AppLocalizations.of(context)!.reviewPermissions), child: Text(AppLocalizations.of(context)!.reviewPermissions),
url: onClick: () {
'https://github.com/settings/connections/applications/$clientId', launchStringUrl(
'https://github.com/settings/connections/applications/$clientId');
},
extra: Text(auth.activeAccount!.login), extra: Text(auth.activeAccount!.login),
), ),
], ],
if (auth.activeAccount!.platform == PlatformType.gitlab) if (auth.activeAccount!.platform == PlatformType.gitlab)
TableViewItem( AntListItem(
child: Text(AppLocalizations.of(context)!.gitlabStatus), child: Text(AppLocalizations.of(context)!.gitlabStatus),
url: '${auth.activeAccount!.domain}/help', onClick: () {
launchStringUrl('${auth.activeAccount!.domain}/help');
},
extra: FutureBuilder<String>( extra: FutureBuilder<String>(
future: future:
auth.fetchGitlab('/version').then((v) => v['version']), auth.fetchGitlab('/version').then((v) => v['version']),
@ -56,10 +65,12 @@ class SettingsScreen extends StatelessWidget {
), ),
), ),
if (auth.activeAccount!.platform == PlatformType.gitea) if (auth.activeAccount!.platform == PlatformType.gitea)
TableViewItem( AntListItem(
prefixIconData: Octicons.info, prefix: const Icon(Octicons.info),
child: Text(AppLocalizations.of(context)!.giteaStatus), child: Text(AppLocalizations.of(context)!.giteaStatus),
url: '/gitea/status', onClick: () {
context.push('/gitea/status');
},
extra: FutureBuilder<String>( extra: FutureBuilder<String>(
future: auth.fetchGitea('/version').then((v) => v['version']), future: auth.fetchGitea('/version').then((v) => v['version']),
builder: (context, snapshot) { builder: (context, snapshot) {
@ -67,12 +78,14 @@ class SettingsScreen extends StatelessWidget {
}, },
), ),
), ),
TableViewItem( AntListItem(
child: Text(AppLocalizations.of(context)!.switchAccounts), child: Text(AppLocalizations.of(context)!.switchAccounts),
url: '/login', onClick: () {
context.push('/login');
},
extra: Text(auth.activeAccount!.login), extra: Text(auth.activeAccount!.login),
), ),
TableViewItem( AntListItem(
child: Text(AppLocalizations.of(context)!.appLanguage), child: Text(AppLocalizations.of(context)!.appLanguage),
extra: Text(theme.locale == null extra: Text(theme.locale == null
? AppLocalizations.of(context)!.followSystem ? AppLocalizations.of(context)!.followSystem
@ -107,10 +120,10 @@ class SettingsScreen extends StatelessWidget {
) )
]), ]),
CommonStyle.verticalGap, CommonStyle.verticalGap,
TableView( AntList(
header: Text(AppLocalizations.of(context)!.theme), header: Text(AppLocalizations.of(context)!.theme),
items: [ items: [
TableViewItem( AntListItem(
child: Text(AppLocalizations.of(context)!.brightness), child: Text(AppLocalizations.of(context)!.brightness),
extra: Text(theme.brighnessValue == AppBrightnessType.light extra: Text(theme.brighnessValue == AppBrightnessType.light
? AppLocalizations.of(context)!.light ? AppLocalizations.of(context)!.light
@ -138,12 +151,14 @@ class SettingsScreen extends StatelessWidget {
]); ]);
}, },
), ),
TableViewItem( AntListItem(
child: Text(AppLocalizations.of(context)!.codeTheme), child: Text(AppLocalizations.of(context)!.codeTheme),
url: '/choose-code-theme', onClick: () {
context.push('/choose-code-theme');
},
extra: Text('${code.fontFamily}, ${code.fontSize}pt'), extra: Text('${code.fontFamily}, ${code.fontSize}pt'),
), ),
TableViewItem( AntListItem(
child: Text(AppLocalizations.of(context)!.markdownRenderEngine), child: Text(AppLocalizations.of(context)!.markdownRenderEngine),
extra: Text(theme.markdown == AppMarkdownType.flutter extra: Text(theme.markdown == AppMarkdownType.flutter
? AppLocalizations.of(context)!.flutter ? AppLocalizations.of(context)!.flutter
@ -170,16 +185,22 @@ class SettingsScreen extends StatelessWidget {
], ],
), ),
CommonStyle.verticalGap, CommonStyle.verticalGap,
TableView( AntList(
header: Text(AppLocalizations.of(context)!.feedback), header: Text(AppLocalizations.of(context)!.feedback),
items: [ items: [
TableViewItem( AntListItem(
child: Text(AppLocalizations.of(context)!.submitAnIssue), child: Text(AppLocalizations.of(context)!.submitAnIssue),
extra: const Text('git-touch/git-touch'), extra: const Text('git-touch/git-touch'),
url: onClick: () {
'${auth.activeAccount!.platform == PlatformType.github ? '/github' : 'https://github.com'}/git-touch/git-touch/issues/new', const suffix = 'git-touch/git-touch/issues/new';
if (auth.activeAccount!.platform == PlatformType.github) {
context.push('/github/$suffix');
} else {
launchStringUrl('https://github.com/$suffix');
}
},
), ),
TableViewItem( AntListItem(
child: Text(AppLocalizations.of(context)!.rateThisApp), child: Text(AppLocalizations.of(context)!.rateThisApp),
onClick: () { onClick: () {
LaunchReview.launch( LaunchReview.launch(
@ -188,32 +209,41 @@ class SettingsScreen extends StatelessWidget {
); );
}, },
), ),
TableViewItem( AntListItem(
child: Text(AppLocalizations.of(context)!.email), child: Text(AppLocalizations.of(context)!.email),
extra: const Text('pd4d10@gmail.com'), extra: const Text('pd4d10@gmail.com'),
hideRightChevron: true, arrow: null,
url: 'mailto:pd4d10@gmail.com', onClick: () {
launchStringUrl('mailto:pd4d10@gmail.com');
},
), ),
], ],
), ),
CommonStyle.verticalGap, CommonStyle.verticalGap,
TableView( AntList(
header: Text(AppLocalizations.of(context)!.about), header: Text(AppLocalizations.of(context)!.about),
items: [ items: [
TableViewItem( AntListItem(
child: Text(AppLocalizations.of(context)!.version), child: Text(AppLocalizations.of(context)!.version),
extra: FutureBuilder<String>( extra: FutureBuilder<String>(
future: future:
PackageInfo.fromPlatform().then((info) => info.version), PackageInfo.fromPlatform().then((info) => info.version),
builder: (context, snapshot) { builder: (context, snapshot) {
return Text(snapshot.data ?? ''); return Text(snapshot.data ?? '');
}, },
)), ),
TableViewItem( ),
AntListItem(
child: Text(AppLocalizations.of(context)!.sourceCode), child: Text(AppLocalizations.of(context)!.sourceCode),
extra: const Text('git-touch/git-touch'), extra: const Text('git-touch/git-touch'),
url: onClick: () {
'${auth.activeAccount!.platform == PlatformType.github ? '/github' : 'https://github.com'}/git-touch/git-touch', const suffix = 'git-touch/git-touch';
if (auth.activeAccount!.platform == PlatformType.github) {
context.push('/github/$suffix');
} else {
launchStringUrl('https://github.com/$suffix');
}
},
), ),
], ],
), ),

View File

@ -158,7 +158,7 @@ class PrimerBranchName extends StatelessWidget {
} }
} }
launchStringUrl(String? url) async { Future<void> launchStringUrl(String? url) async {
if (url == null) return; if (url == null) return;
final uri = Uri.parse(url); final uri = Uri.parse(url);

View File

@ -3,7 +3,6 @@ import 'package:file_icon/file_icon.dart';
import 'package:filesize/filesize.dart'; import 'package:filesize/filesize.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:git_touch/utils/utils.dart'; import 'package:git_touch/utils/utils.dart';
import 'package:git_touch/widgets/table_view.dart';
Widget _buildIcon(String type, String name) { Widget _buildIcon(String type, String name) {
switch (type) { switch (type) {
@ -22,32 +21,35 @@ Widget _buildIcon(String type, String name) {
} }
} }
TableViewItem createObjectTreeItem({ AntListItem createObjectTreeItem({
required String name, required String name,
required String type, required String type,
required String url, required String url,
String? downloadUrl, String? downloadUrl,
int? size, int? size,
}) { }) {
return TableViewItem( return AntListItem(
prefix: _buildIcon(type, name), prefix: _buildIcon(type, name),
child: Text(name), child: Text(name),
extra: size == null ? null : Text(filesize(size)), extra: size == null ? null : Text(filesize(size)),
url: [ onClick: () async {
// Let system browser handle these files final finalUrl = [
// // Let system browser handle these files
// TODO: //
// Unhandled Exception: PlatformException(Error, Error while launching // TODO:
// https://github.com/flutter/flutter/issues/49162 // Unhandled Exception: PlatformException(Error, Error while launching
// https://github.com/flutter/flutter/issues/49162
// Docs // Docs
'pdf', 'docx', 'doc', 'pptx', 'ppt', 'xlsx', 'xls', 'pdf', 'docx', 'doc', 'pptx', 'ppt', 'xlsx', 'xls',
// Fonts // Fonts
'ttf', 'otf', 'eot', 'woff', 'woff2', 'ttf', 'otf', 'eot', 'woff', 'woff2',
'svg', 'svg',
].contains(name.ext) ].contains(name.ext)
? downloadUrl ? downloadUrl
: url, : url;
hideRightChevron: size != null, await launchStringUrl(finalUrl);
},
arrow: size == null ? const Icon(AntIcons.rightOutline) : null,
); );
} }

View File

@ -1,3 +1,4 @@
import 'package:antd_mobile/antd_mobile.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/S.dart'; import 'package:flutter_gen/gen_l10n/S.dart';
import 'package:git_touch/graphql/__generated__/github.data.gql.dart'; import 'package:git_touch/graphql/__generated__/github.data.gql.dart';
@ -5,7 +6,6 @@ import 'package:git_touch/models/theme.dart';
import 'package:git_touch/utils/utils.dart'; import 'package:git_touch/utils/utils.dart';
import 'package:git_touch/widgets/avatar.dart'; import 'package:git_touch/widgets/avatar.dart';
import 'package:git_touch/widgets/markdown_view.dart'; import 'package:git_touch/widgets/markdown_view.dart';
import 'package:git_touch/widgets/table_view.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:timeago/timeago.dart' as timeago; import 'package:timeago/timeago.dart' as timeago;
@ -87,11 +87,11 @@ class ReleaseItem extends StatelessWidget {
), ),
), ),
children: <Widget>[ children: <Widget>[
TableView( AntList(
items: [ items: [
if (releaseAssets != null) if (releaseAssets != null)
for (var asset in releaseAssets!.nodes!) for (var asset in releaseAssets!.nodes!)
TableViewItem( AntListItem(
child: Text( child: Text(
asset.name, asset.name,
style: TextStyle( style: TextStyle(
@ -105,7 +105,7 @@ class ReleaseItem extends StatelessWidget {
theme.push(context, asset.downloadUrl); theme.push(context, asset.downloadUrl);
}, },
icon: const Icon(Ionicons.download_outline)), icon: const Icon(Ionicons.download_outline)),
hideRightChevron: true, arrow: null,
), ),
], ],
) )

View File

@ -24,30 +24,10 @@ class TableViewHeader extends StatelessWidget {
} }
} }
class TableViewItem {
final Widget child;
final IconData? prefixIconData;
final Widget? prefix;
final Widget? extra;
final void Function()? onClick;
final String? url;
final bool hideRightChevron;
const TableViewItem({
required this.child,
this.prefixIconData,
this.prefix,
this.extra,
this.onClick,
this.url,
this.hideRightChevron = false,
}) : assert(prefixIconData == null || prefix == null);
}
class TableViewItemWidget extends StatelessWidget { class TableViewItemWidget extends StatelessWidget {
const TableViewItemWidget(this.item, {super.key}); const TableViewItemWidget(this.item, {super.key});
final TableViewItem item; final AntListItem item;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -55,7 +35,6 @@ class TableViewItemWidget extends StatelessWidget {
return LinkWidget( return LinkWidget(
onTap: item.onClick, onTap: item.onClick,
url: item.url,
child: DefaultTextStyle( child: DefaultTextStyle(
style: TextStyle(fontSize: 17, color: theme.palette.text), style: TextStyle(fontSize: 17, color: theme.palette.text),
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
@ -64,16 +43,8 @@ class TableViewItemWidget extends StatelessWidget {
child: Row( child: Row(
children: [ children: [
SizedBox( SizedBox(
width: (item.prefix == null && item.prefixIconData == null) width: (item.prefix == null) ? 12 : 44,
? 12 child: Center(child: item.prefix),
: 44,
child: Center(
child: item.prefix ??
Icon(
item.prefixIconData,
color: theme.palette.primary,
size: 20,
)),
), ),
Expanded(child: item.child), Expanded(child: item.child),
if (item.extra != null) ...[ if (item.extra != null) ...[
@ -86,8 +57,7 @@ class TableViewItemWidget extends StatelessWidget {
), ),
const SizedBox(width: 6) const SizedBox(width: 6)
], ],
if ((item.onClick != null || item.url != null) && if (item.onClick != null)
!item.hideRightChevron)
Icon(Ionicons.chevron_forward, Icon(Ionicons.chevron_forward,
size: 20, color: theme.palette.tertiaryText) size: 20, color: theme.palette.tertiaryText)
else else
@ -100,41 +70,3 @@ class TableViewItemWidget extends StatelessWidget {
); );
} }
} }
class TableView extends StatelessWidget {
final Widget? header;
final Iterable<TableViewItem> items;
const TableView({
super.key,
this.header,
required this.items,
});
@override
Widget build(BuildContext context) {
final theme = Provider.of<ThemeModel>(context);
return AntList(
header: header,
items: [
for (final item in items)
AntListItem(
child: item.child,
prefix: item.prefix ??
(item.prefixIconData == null
? null
: Icon(item.prefixIconData)),
extra: item.extra,
onClick: item.onClick != null
? item.onClick!
: item.url != null
? () {
theme.push(context, item.url!);
}
: null,
),
],
);
}
}