diff --git a/lib/home.dart b/lib/home.dart index cf78f8c..5c7c047 100644 --- a/lib/home.dart +++ b/lib/home.dart @@ -62,7 +62,7 @@ class _HomeState extends State { // go to app store LaunchReview.launch(writeReview: false); } else { - context.read().push(context, latest.htmlUrl!); + context.pushUrl(latest.htmlUrl!); } } } diff --git a/lib/models/theme.dart b/lib/models/theme.dart index ce9bb3a..f923524 100644 --- a/lib/models/theme.dart +++ b/lib/models/theme.dart @@ -7,7 +7,6 @@ import 'package:flutter/services.dart'; import 'package:flutter_gen/gen_l10n/S.dart'; import 'package:git_touch/utils/utils.dart'; import 'package:git_touch/widgets/action_button.dart'; -import 'package:go_router/go_router.dart'; import 'package:primer/primer.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:universal_io/io.dart'; @@ -36,7 +35,6 @@ class PickerItem { } class PickerGroupItem { - PickerGroupItem({ required this.value, required this.items, @@ -75,7 +73,6 @@ class StaticRoute extends PageRouteBuilder { } class Palette { - const Palette({ required this.primary, required this.text, @@ -219,19 +216,6 @@ class ThemeModel with ChangeNotifier { notifyListeners(); } - push(BuildContext context, String url, {bool replace = false}) { - // Fimber.d(url); - if (url.startsWith('/')) { - if (replace) { - context.replace(url); - } else { - context.push(url); - } - } else { - launchStringUrl(url); - } - } - Future showConfirm(BuildContext context, Widget content) { return showCupertinoDialog( context: context, diff --git a/lib/screens/bb_issue_comment.dart b/lib/screens/bb_issue_comment.dart index efa9f7e..afd2dd8 100644 --- a/lib/screens/bb_issue_comment.dart +++ b/lib/screens/bb_issue_comment.dart @@ -1,10 +1,10 @@ import 'package:flutter/cupertino.dart'; +import 'package:flutter_gen/gen_l10n/S.dart'; import 'package:git_touch/models/auth.dart'; import 'package:git_touch/models/theme.dart'; import 'package:git_touch/scaffolds/common.dart'; import 'package:git_touch/utils/utils.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/S.dart'; class BbIssueCommentScreen extends StatefulWidget { const BbIssueCommentScreen(this.owner, this.name, this.number); @@ -51,8 +51,7 @@ class _BbIssueCommentScreenState extends State { }, ); Navigator.pop(context, true); - await theme.push( - context, + await context.pushUrl( '/bitbucket/${widget.owner}/${widget.name}/issues/${widget.number}', replace: true, ); diff --git a/lib/screens/bb_issue_form.dart b/lib/screens/bb_issue_form.dart index 004a118..ecd8956 100644 --- a/lib/screens/bb_issue_form.dart +++ b/lib/screens/bb_issue_form.dart @@ -1,11 +1,11 @@ import 'package:flutter/cupertino.dart'; +import 'package:flutter_gen/gen_l10n/S.dart'; import 'package:git_touch/models/auth.dart'; import 'package:git_touch/models/bitbucket.dart'; import 'package:git_touch/models/theme.dart'; import 'package:git_touch/scaffolds/common.dart'; import 'package:git_touch/utils/utils.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/S.dart'; class BbIssueFormScreen extends StatefulWidget { const BbIssueFormScreen(this.owner, this.name); @@ -64,8 +64,7 @@ class _BbIssueFormScreenState extends State { return BbIssues.fromJson(v); }); Navigator.pop(context, true); - await theme.push( - context, + await context.pushUrl( '/bitbucket/${widget.owner}/${widget.name}/issues', replace: true, ); diff --git a/lib/screens/bb_repo.dart b/lib/screens/bb_repo.dart index 169e263..c78c8f6 100644 --- a/lib/screens/bb_repo.dart +++ b/lib/screens/bb_repo.dart @@ -106,8 +106,8 @@ class BbRepoScreen extends StatelessWidget { .toList(), onClose: (ref) { if (ref != branch) { - theme.push( - context, '/bitbucket/$owner/$name?branch=$ref', + context.pushUrl( + '/bitbucket/$owner/$name?branch=$ref', replace: true); } }, diff --git a/lib/screens/ge_issue.dart b/lib/screens/ge_issue.dart index 4ac6d57..9a68c0c 100644 --- a/lib/screens/ge_issue.dart +++ b/lib/screens/ge_issue.dart @@ -14,7 +14,6 @@ import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; class GeIssueScreen extends StatelessWidget { - const GeIssueScreen(this.owner, this.name, this.number, {this.isPr = false}); final String owner; final String name; @@ -36,7 +35,7 @@ class GeIssueScreen extends StatelessWidget { 'id': comment.id.toString(), }, ).toString(); - theme.push(context, uri); + context.pushUrl(uri); }, ), ActionItem( @@ -45,7 +44,7 @@ class GeIssueScreen extends StatelessWidget { await auth.fetchGitee( '/repos/$owner/$name/issues/comments/${comment.id}', requestType: 'DELETE'); - await theme.push(context, '/gitee/$owner/$name/issues/$number', + await context.pushUrl('/gitee/$owner/$name/issues/$number', replace: true); }, ), diff --git a/lib/screens/ge_issue_comment.dart b/lib/screens/ge_issue_comment.dart index 1e2a9e3..456a1e0 100644 --- a/lib/screens/ge_issue_comment.dart +++ b/lib/screens/ge_issue_comment.dart @@ -1,10 +1,10 @@ import 'package:flutter/cupertino.dart'; +import 'package:flutter_gen/gen_l10n/S.dart'; import 'package:git_touch/models/auth.dart'; import 'package:git_touch/models/theme.dart'; import 'package:git_touch/scaffolds/common.dart'; import 'package:git_touch/utils/utils.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/S.dart'; class GeIssueCommentScreen extends StatefulWidget { const GeIssueCommentScreen(this.owner, this.name, this.number, @@ -67,8 +67,7 @@ class _GeIssueCommentScreenState extends State { ); } Navigator.pop(context, ''); - await theme.push( - context, + await context.pushUrl( '/gitee/${widget.owner}/${widget.name}/${widget.isPr ? 'pulls' : 'issues'}/${widget.number}', replace: true, ); diff --git a/lib/screens/ge_issue_form.dart b/lib/screens/ge_issue_form.dart index b7f7697..e72885e 100644 --- a/lib/screens/ge_issue_form.dart +++ b/lib/screens/ge_issue_form.dart @@ -1,11 +1,11 @@ import 'package:flutter/cupertino.dart'; +import 'package:flutter_gen/gen_l10n/S.dart'; import 'package:git_touch/models/auth.dart'; import 'package:git_touch/models/gitee.dart'; import 'package:git_touch/models/theme.dart'; import 'package:git_touch/scaffolds/common.dart'; import 'package:git_touch/utils/utils.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/S.dart'; class GeIssueFormScreen extends StatefulWidget { const GeIssueFormScreen(this.owner, this.name); @@ -63,8 +63,7 @@ class _GeIssueFormScreenState extends State { ).then((v) { return GiteeIssue.fromJson(v); }); - await theme.push( - context, + await context.pushUrl( '/gitee/${widget.owner}/${widget.name}/issues/${res.number}', replace: true, ); diff --git a/lib/screens/ge_pull.dart b/lib/screens/ge_pull.dart index aa7c7d5..6afaa50 100644 --- a/lib/screens/ge_pull.dart +++ b/lib/screens/ge_pull.dart @@ -14,7 +14,6 @@ import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; class GePullScreen extends StatelessWidget { - const GePullScreen(this.owner, this.name, this.number, {this.isPr = false}); final String owner; final String name; @@ -36,7 +35,7 @@ class GePullScreen extends StatelessWidget { 'id': comment.id.toString(), }, ).toString(); - theme.push(context, uri); + context.pushUrl(uri); }, ), ActionItem( @@ -45,7 +44,7 @@ class GePullScreen extends StatelessWidget { await auth.fetchGitee( '/repos/$owner/$name/pulls/comments/${comment.id}', requestType: 'DELETE'); - await theme.push(context, '/gitee/$owner/$name/pulls/$number', + await context.pushUrl('/gitee/$owner/$name/pulls/$number', replace: true); }, ), diff --git a/lib/screens/ge_repo.dart b/lib/screens/ge_repo.dart index 3d081fb..220474e 100644 --- a/lib/screens/ge_repo.dart +++ b/lib/screens/ge_repo.dart @@ -184,8 +184,7 @@ class GeRepoScreen extends StatelessWidget { .toList(), onClose: (ref) { if (ref != branch) { - theme.push( - context, '/gitee/$owner/$name?branch=$ref', + context.pushUrl('/gitee/$owner/$name?branch=$ref', replace: true); } }, diff --git a/lib/screens/gh_issue_form.dart b/lib/screens/gh_issue_form.dart index 4356b52..536f5b7 100644 --- a/lib/screens/gh_issue_form.dart +++ b/lib/screens/gh_issue_form.dart @@ -1,11 +1,11 @@ import 'package:flutter/cupertino.dart'; +import 'package:flutter_gen/gen_l10n/S.dart'; import 'package:git_touch/models/auth.dart'; import 'package:git_touch/models/theme.dart'; import 'package:git_touch/scaffolds/common.dart'; import 'package:git_touch/utils/utils.dart'; import 'package:github/github.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/S.dart'; class GhIssueFormScreen extends StatefulWidget { const GhIssueFormScreen(this.owner, this.name); @@ -62,8 +62,7 @@ class _GhIssueFormScreenState extends State { .ghClient .issues .create(slug, IssueRequest(title: _title, body: _body)); - await theme.push( - context, + await context.pushUrl( '/github/${widget.owner}/${widget.name}/issues/${res.number}', replace: true, ); diff --git a/lib/screens/gh_repo.dart b/lib/screens/gh_repo.dart index 50e67aa..5b04366 100644 --- a/lib/screens/gh_repo.dart +++ b/lib/screens/gh_repo.dart @@ -300,8 +300,7 @@ class GhRepoScreen extends StatelessWidget { .toList(), onClose: (ref) { if (ref != branch) { - theme.push( - context, '/github/$owner/$name?ref=$ref', + context.pushUrl('/github/$owner/$name?ref=$ref', replace: true); } }, diff --git a/lib/screens/gl_issue_form.dart b/lib/screens/gl_issue_form.dart index b9ca80d..12d7b84 100644 --- a/lib/screens/gl_issue_form.dart +++ b/lib/screens/gl_issue_form.dart @@ -1,11 +1,11 @@ import 'package:flutter/cupertino.dart'; +import 'package:flutter_gen/gen_l10n/S.dart'; import 'package:git_touch/models/auth.dart'; import 'package:git_touch/models/gitlab.dart'; import 'package:git_touch/models/theme.dart'; import 'package:git_touch/scaffolds/common.dart'; import 'package:git_touch/utils/utils.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/S.dart'; class GlIssueFormScreen extends StatefulWidget { const GlIssueFormScreen(this.id); @@ -62,8 +62,7 @@ class _GlIssueFormScreenState extends State { ).then((v) { return GitlabIssue.fromJson(v); }); - await theme.push( - context, + await context.pushUrl( '/gitlab/projects/${widget.id}/issues/${res.iid}', replace: true, ); diff --git a/lib/screens/gl_project.dart b/lib/screens/gl_project.dart index 28d3f3e..7b684c6 100644 --- a/lib/screens/gl_project.dart +++ b/lib/screens/gl_project.dart @@ -227,8 +227,7 @@ class GlProjectScreen extends StatelessWidget { .toList(), onClose: (ref) { if (ref != branch) { - theme.push( - context, '/gitlab/projects/$id?branch=$ref', + context.pushUrl('/gitlab/projects/$id?branch=$ref', replace: true); } }, diff --git a/lib/screens/go_repo.dart b/lib/screens/go_repo.dart index 8e4bd21..a92e555 100644 --- a/lib/screens/go_repo.dart +++ b/lib/screens/go_repo.dart @@ -135,8 +135,7 @@ class GoRepoScreen extends StatelessWidget { .toList(), onClose: (ref) { if (ref != branch) { - theme.push( - context, '/gogs/$owner/$name?branch=$ref', + context.pushUrl('/gogs/$owner/$name?branch=$ref', replace: true); } }, diff --git a/lib/screens/gt_issue.dart b/lib/screens/gt_issue.dart index 25ec7a7..c5d7f13 100644 --- a/lib/screens/gt_issue.dart +++ b/lib/screens/gt_issue.dart @@ -14,7 +14,6 @@ import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; class GtIssueScreen extends StatelessWidget { - const GtIssueScreen(this.owner, this.name, this.number, {this.isPr = false}); final String owner; final String name; @@ -36,7 +35,7 @@ class GtIssueScreen extends StatelessWidget { 'id': comment.id.toString(), }, ).toString(); - theme.push(context, uri); + context.pushUrl(uri); }, ), ActionItem( @@ -45,7 +44,7 @@ class GtIssueScreen extends StatelessWidget { await auth.fetchGitea( '/repos/$owner/$name/issues/comments/${comment.id}', requestType: 'DELETE'); - await theme.push(context, '/gitea/$owner/$name/issues/$number', + await context.pushUrl('/gitea/$owner/$name/issues/$number', replace: true); }, ), diff --git a/lib/screens/gt_issue_comment.dart b/lib/screens/gt_issue_comment.dart index d625e82..bbfb052 100644 --- a/lib/screens/gt_issue_comment.dart +++ b/lib/screens/gt_issue_comment.dart @@ -1,10 +1,10 @@ import 'package:flutter/cupertino.dart'; +import 'package:flutter_gen/gen_l10n/S.dart'; import 'package:git_touch/models/auth.dart'; import 'package:git_touch/models/theme.dart'; import 'package:git_touch/scaffolds/common.dart'; import 'package:git_touch/utils/utils.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/S.dart'; class GtIssueCommentScreen extends StatefulWidget { const GtIssueCommentScreen(this.owner, this.name, this.number, @@ -67,8 +67,7 @@ class _GtIssueCommentScreenState extends State { ); } Navigator.pop(context, ''); - await theme.push( - context, + await context.pushUrl( '/gitea/${widget.owner}/${widget.name}/${widget.isPr ? 'pulls' : 'issues'}/${widget.number}', replace: true, ); diff --git a/lib/screens/gt_issue_form.dart b/lib/screens/gt_issue_form.dart index dc42e46..1d84938 100644 --- a/lib/screens/gt_issue_form.dart +++ b/lib/screens/gt_issue_form.dart @@ -1,11 +1,11 @@ import 'package:flutter/cupertino.dart'; +import 'package:flutter_gen/gen_l10n/S.dart'; import 'package:git_touch/models/auth.dart'; import 'package:git_touch/models/gitea.dart'; import 'package:git_touch/models/theme.dart'; import 'package:git_touch/scaffolds/common.dart'; import 'package:git_touch/utils/utils.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/S.dart'; class GtIssueFormScreen extends StatefulWidget { const GtIssueFormScreen(this.owner, this.name); @@ -64,8 +64,7 @@ class _GtIssueFormScreenState extends State { return GiteaIssue.fromJson(v); }); Navigator.pop(context); - await theme.push( - context, + await context.pushUrl( '/gitea/${widget.owner}/${widget.name}/issues', replace: true, ); diff --git a/lib/screens/login.dart b/lib/screens/login.dart index 0a8931f..31e90cc 100644 --- a/lib/screens/login.dart +++ b/lib/screens/login.dart @@ -261,7 +261,7 @@ class _LoginScreenState extends State { TextStyle(color: theme.palette.primary), recognizer: TapGestureRecognizer() ..onTap = () { - theme.push(context, + context.pushUrl( 'https://support.atlassian.com/bitbucket-cloud/docs/app-passwords/'); }, ), diff --git a/lib/utils/utils.dart b/lib/utils/utils.dart index 0a64c32..2cddac3 100644 --- a/lib/utils/utils.dart +++ b/lib/utils/utils.dart @@ -3,6 +3,7 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/widgets.dart'; import 'package:git_touch/models/theme.dart'; import 'package:git_touch/widgets/border_view.dart'; +import 'package:go_router/go_router.dart'; import 'package:intl/intl.dart'; import 'package:primer/primer.dart'; import 'package:provider/provider.dart'; @@ -68,7 +69,7 @@ TextSpan createLinkSpan( ), recognizer: TapGestureRecognizer() ..onTap = () { - theme.push(context, url); + context.pushUrl(url); }, ); } @@ -158,3 +159,18 @@ class ListPayload { bool hasMore; Iterable items; } + +extension MyHelper on BuildContext { + pushUrl(String url, {bool replace = false}) { + // Fimber.d(url); + if (url.startsWith('/')) { + if (replace) { + this.replace(url); + } else { + push(url); + } + } else { + launchStringUrl(url); + } + } +} diff --git a/lib/widgets/action_entry.dart b/lib/widgets/action_entry.dart index cfda8a4..54157bd 100644 --- a/lib/widgets/action_entry.dart +++ b/lib/widgets/action_entry.dart @@ -1,5 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:git_touch/models/theme.dart'; +import 'package:git_touch/utils/utils.dart'; import 'package:provider/provider.dart'; class ActionEntry extends StatelessWidget { @@ -16,7 +17,7 @@ class ActionEntry extends StatelessWidget { padding: EdgeInsets.zero, onPressed: () { if (onTap != null) onTap!(); - if (url != null) theme.push(context, url!); + if (url != null) context.pushUrl(url!); }, child: Icon(iconData, size: 22), ); diff --git a/lib/widgets/avatar.dart b/lib/widgets/avatar.dart index 238f3e7..d8203aa 100644 --- a/lib/widgets/avatar.dart +++ b/lib/widgets/avatar.dart @@ -14,7 +14,6 @@ class AvatarSize { } class Avatar extends StatelessWidget { - const Avatar({ required this.url, this.size = AvatarSize.medium, @@ -56,7 +55,7 @@ class Avatar extends StatelessWidget { return LinkWidget( child: widget, onTap: () { - context.read().push(context, linkUrl!); + context.pushUrl(linkUrl!); }, ); } diff --git a/lib/widgets/event_item.dart b/lib/widgets/event_item.dart index 889be79..ea780a9 100644 --- a/lib/widgets/event_item.dart +++ b/lib/widgets/event_item.dart @@ -23,7 +23,7 @@ class EventItem extends StatelessWidget { style: TextStyle(color: theme.palette.primary), recognizer: TapGestureRecognizer() ..onTap = () { - theme.push(context, url!); + context.pushUrl(url!); }, ); } diff --git a/lib/widgets/link.dart b/lib/widgets/link.dart index e95ded7..ae833b3 100644 --- a/lib/widgets/link.dart +++ b/lib/widgets/link.dart @@ -5,7 +5,6 @@ import 'package:provider/provider.dart'; // TODO: class CupertinoLink extends StatefulWidget { - const CupertinoLink({this.child, this.onTap}); final Widget? child; final Function? onTap; @@ -48,7 +47,6 @@ class _CupertinoLinkState extends State { } class LinkWidget extends StatelessWidget { - const LinkWidget({ required this.child, this.url, @@ -69,7 +67,7 @@ class LinkWidget extends StatelessWidget { padding: EdgeInsets.zero, onPressed: () async { if (onTap != null) onTap!(); - if (url != null) theme.push(context, url!); + if (url != null) context.pushUrl(url!); }, child: child, ); diff --git a/lib/widgets/markdown_view.dart b/lib/widgets/markdown_view.dart index 0f4adc1..0e5939f 100644 --- a/lib/widgets/markdown_view.dart +++ b/lib/widgets/markdown_view.dart @@ -82,7 +82,6 @@ html { } class MarkdownFlutterView extends StatelessWidget { - const MarkdownFlutterView( this.text, { this.basePaths, @@ -134,7 +133,7 @@ class MarkdownFlutterView extends StatelessWidget { var y = path.join(x, url); if (y.startsWith('/')) y = y.substring(1); - return theme.push(context, + return context.pushUrl( '/${basePaths![0]}/${basePaths![1]}/${basePaths![2]}?path=${y.urlencode}'); } @@ -149,7 +148,7 @@ class MarkdownFlutterView extends StatelessWidget { for (var p in matchedPaths) { final m = matchPattern(url, p); if (m != null) { - return theme.push(context, + return context.pushUrl( url.replaceFirst(RegExp(r'https://github.com'), '/github')); } } diff --git a/lib/widgets/object_tree.dart b/lib/widgets/object_tree.dart index 2aea301..fda81f7 100644 --- a/lib/widgets/object_tree.dart +++ b/lib/widgets/object_tree.dart @@ -30,7 +30,6 @@ AntListItem createObjectTreeItem({ }) { return AntListItem( prefix: _buildIcon(type, name), - child: Text(name), extra: size == null ? null : Text(filesize(size)), onClick: () async { final finalUrl = [ @@ -51,5 +50,6 @@ AntListItem createObjectTreeItem({ await launchStringUrl(finalUrl); }, arrow: size == null ? const Icon(AntIcons.rightOutline) : null, + child: Text(name), ); } diff --git a/lib/widgets/release_item.dart b/lib/widgets/release_item.dart index 741be41..db87ff2 100644 --- a/lib/widgets/release_item.dart +++ b/lib/widgets/release_item.dart @@ -93,7 +93,7 @@ class ReleaseItem extends StatelessWidget { AntListItem( extra: IconButton( onPressed: () { - theme.push(context, asset.downloadUrl); + context.pushUrl(asset.downloadUrl); }, icon: const Icon(Ionicons.download_outline), ), diff --git a/lib/widgets/user_header.dart b/lib/widgets/user_header.dart index 5cbae18..f585daf 100644 --- a/lib/widgets/user_header.dart +++ b/lib/widgets/user_header.dart @@ -6,7 +6,6 @@ import 'package:git_touch/widgets/mutation_button.dart'; import 'package:provider/provider.dart'; class UserHeader extends StatelessWidget { - const UserHeader({ super.key, required this.avatarUrl, @@ -33,7 +32,7 @@ class UserHeader extends StatelessWidget { MutationButton( text: 'Switch accounts', onTap: () { - theme.push(context, '/login'); + context.pushUrl('/login'); }, ) ]