Skip to content

Commit

Permalink
add share and url launch services
Browse files Browse the repository at this point in the history
  • Loading branch information
wuuzw committed Feb 5, 2021
1 parent 648b25e commit b86dd00
Show file tree
Hide file tree
Showing 14 changed files with 133 additions and 43 deletions.
4 changes: 4 additions & 0 deletions lib/app/app_module.dart
Expand Up @@ -7,11 +7,15 @@ import 'app_widget.dart';
import 'modules/bookmarks/bookmark_module.dart';
import 'modules/home/home_module.dart';
import 'modules/item/item_module.dart';
import 'service/share_service.dart';
import 'service/url_launch_service.dart';
import 'shared/repositories/bookmark_repository.dart';

class AppModule extends MainModule {
@override
List<Bind> get binds => [
$UrlLaunchService,
$ShareService,
$AppController,
$BookmarkRepository,
Bind((i) => Dio(BaseOptions(baseUrl: 'http://api.hackerwebapp.com'))),
Expand Down
5 changes: 3 additions & 2 deletions lib/app/modules/bookmarks/widgets/bookmark_tile.dart
Expand Up @@ -3,9 +3,9 @@ import 'package:flutter_modular/flutter_modular.dart';
import 'package:flutter_slidable/flutter_slidable.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';

import '../../../service/share_service.dart';
import '../../../shared/constants.dart';
import '../../../shared/models/feed_item.dart';
import '../../../shared/util/url.dart';
import '../../../shared/widgets/tile.dart';
import '../bookmark_controller.dart';

Expand All @@ -14,6 +14,7 @@ class BookmarkTile extends StatelessWidget {
final FeedItem bookmark;
final GestureTapCallback onTap;
final BookmarkController controller = Modular.get();
final ShareService shareService = Modular.get();

BookmarkTile({Key key, this.index, this.bookmark, this.onTap}) : super(key: key);

Expand Down Expand Up @@ -56,7 +57,7 @@ class BookmarkTile extends StatelessWidget {
color: Colors.indigo,
icon: MdiIcons.shareVariant,
onTap: () {
UrlUtil().share(title: bookmark.title, url: bookmark.url);
shareService.share(title: bookmark.title, url: bookmark.url);
},
),
],
Expand Down
5 changes: 3 additions & 2 deletions lib/app/modules/home/widgets/feed_tile.dart
Expand Up @@ -4,16 +4,17 @@ import 'package:flutter_slidable/flutter_slidable.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';

import '../../../service/share_service.dart';
import '../../../shared/constants.dart';
import '../../../shared/models/feed_item.dart';
import '../../../shared/util/url.dart';
import '../../../shared/widgets/tile.dart';
import '../home_controller.dart';

class FeedTile extends StatelessWidget {
final FeedItem feedItem;
final GestureTapCallback onTap;
final HomeController controller = Modular.get();
final ShareService shareService = Modular.get();

FeedTile({Key key, this.feedItem, this.onTap}) : super(key: key);

Expand Down Expand Up @@ -51,7 +52,7 @@ class FeedTile extends StatelessWidget {
color: Colors.indigo,
icon: MdiIcons.shareVariant,
onTap: () {
UrlUtil().share(title: feedItem.title, url: feedItem.url);
shareService.share(title: feedItem.title, url: feedItem.url);
},
),
],
Expand Down
9 changes: 6 additions & 3 deletions lib/app/modules/item/widgets/comment_view/comment_tile.dart
Expand Up @@ -2,14 +2,17 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_html/flutter_html.dart';
import 'package:flutter_html/style.dart';
import 'package:flutter_modular/flutter_modular.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:html/parser.dart';

import '../../../../service/url_launch_service.dart';
import '../../../../shared/models/item.dart';
import '../../../../shared/util/url.dart';
import '../../../../shared/widgets/tile.dart';

class CommentTile extends StatelessWidget {
final UrlLaunchService urlLaunchService = Modular.get();

final List<Item> comments;
final int depth;
final String content;
Expand Down Expand Up @@ -37,8 +40,8 @@ class CommentTile extends StatelessWidget {
style: {
'body': Style(margin: EdgeInsets.zero),
},
onLinkTap: (url) async {
await UrlUtil().launchUrl(url);
onLinkTap: (url) {
urlLaunchService.launchUrl(url);
},
),
user: user,
Expand Down
11 changes: 7 additions & 4 deletions lib/app/modules/item/widgets/comment_view/item_content.dart
@@ -1,20 +1,23 @@
import 'package:flutter/material.dart';
import 'package:flutter_html/flutter_html.dart';
import 'package:flutter_modular/flutter_modular.dart';

import '../../../../shared/util/url.dart';
import '../../../../service/url_launch_service.dart';

class ItemContent extends StatelessWidget {
final UrlLaunchService urlLaunchService = Modular.get();

final String content;

const ItemContent({Key key, this.content}) : super(key: key);
ItemContent({Key key, this.content}) : super(key: key);

@override
Widget build(BuildContext context) {
return Container(
child: Html(
data: content,
onLinkTap: (url) async {
await UrlUtil().launchUrl(url);
onLinkTap: (url) {
urlLaunchService.launchUrl(url);
},
),
);
Expand Down
11 changes: 7 additions & 4 deletions lib/app/modules/item/widgets/item_bottom_bar.dart
Expand Up @@ -3,12 +3,15 @@ import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:flutter_modular/flutter_modular.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';

import '../../../service/share_service.dart';
import '../../../service/url_launch_service.dart';
import '../../../shared/constants.dart';
import '../../../shared/util/url.dart';
import '../item_controller.dart';

class ItemBottomBar extends StatelessWidget {
final ItemController controller = Modular.get();
final ShareService shareService = Modular.get();
final UrlLaunchService urlLaunchService = Modular.get();

@override
Widget build(BuildContext context) {
Expand Down Expand Up @@ -43,14 +46,14 @@ class ItemBottomBar extends StatelessWidget {
IconButton(
icon: Icon(MdiIcons.web),
tooltip: 'Open in browser',
onPressed: () async {
await UrlUtil().launchUrl(url);
onPressed: () {
urlLaunchService.launchUrl(url);
},
),
IconButton(
icon: Icon(MdiIcons.shareVariant),
onPressed: () {
UrlUtil().share(title: title, url: url);
shareService.share(title: title, url: url);
},
),
],
Expand Down
18 changes: 18 additions & 0 deletions lib/app/service/share_service.dart
@@ -0,0 +1,18 @@
import 'package:flutter_modular/flutter_modular.dart';
import 'package:share/share.dart';

import '../shared/util/url_util.dart';

part 'share_service.g.dart';

@Injectable()
class ShareService extends Disposable {
void share({String title, String url}) {
var parsedUrl = UrlUtil.parseUrl(url);
Share.share('$title\n$parsedUrl');
}

//dispose will be called automatically
@override
void dispose() {}
}
13 changes: 13 additions & 0 deletions lib/app/service/share_service.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 18 additions & 0 deletions lib/app/service/url_launch_service.dart
@@ -0,0 +1,18 @@
import 'package:flutter_modular/flutter_modular.dart';
import 'package:url_launcher/url_launcher.dart';

import '../shared/util/url_util.dart';

part 'url_launch_service.g.dart';

@Injectable()
class UrlLaunchService extends Disposable {
Future<void> launchUrl(String url) async {
var parseUrl = UrlUtil.parseUrl(url);
await launch(parseUrl);
}

//dispose will be called automatically
@override
void dispose() {}
}
13 changes: 13 additions & 0 deletions lib/app/service/url_launch_service.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

28 changes: 0 additions & 28 deletions lib/app/shared/util/url.dart

This file was deleted.

5 changes: 5 additions & 0 deletions lib/app/shared/util/url_util.dart
@@ -0,0 +1,5 @@
class UrlUtil {
static String parseUrl(String url) {
return Uri.parse(url).isAbsolute ? url : 'https://news.ycombinator.com/$url';
}
}
18 changes: 18 additions & 0 deletions test/app/service/share_service_test.dart
@@ -0,0 +1,18 @@
import 'package:flutter_test/flutter_test.dart';

import 'package:zone/app/service/share_service.dart';

void main() {
ShareService service;

setUp(() {
// service = ShareService();
});
//
group('ShareService Test', () {
// test("First Test", () {
// expect(service, isInstanceOf<ShareService>());
// });
//
});
}
18 changes: 18 additions & 0 deletions test/app/service/url_launch_service_test.dart
@@ -0,0 +1,18 @@
import 'package:flutter_test/flutter_test.dart';

import 'package:zone/app/service/url_launch_service.dart';

void main() {
UrlLaunchService service;

setUp(() {
// service = UrlLaunchService();
});
//
group('UrlLaunchService Test', () {
// test("First Test", () {
// expect(service, isInstanceOf<UrlLaunchService>());
// });
//
});
}

0 comments on commit b86dd00

Please sign in to comment.