refactor: use list
This commit is contained in:
parent
f0b52e82ab
commit
e5929aa1b8
|
@ -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(
|
||||||
|
|
|
@ -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}'),
|
||||||
|
|
|
@ -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: () {
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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',
|
||||||
|
|
|
@ -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(),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
|
@ -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),
|
||||||
),
|
),
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
@ -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!;
|
||||||
|
|
|
@ -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}'),
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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()}'),
|
||||||
|
|
|
@ -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');
|
||||||
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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');
|
||||||
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
|
@ -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');
|
||||||
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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');
|
||||||
|
}
|
||||||
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
|
@ -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,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue