From 36c1afe80d6467a81f3e39b643865aade1add8ae Mon Sep 17 00:00:00 2001 From: jonathandaniels-vgv <102978796+jonathandaniels-vgv@users.noreply.github.com> Date: Mon, 25 Apr 2022 14:23:56 -0700 Subject: [PATCH] feat(share_repository): added ability to fetch share url for facebook and twitter (#225) * feat(share_repository): added ability to fetch share url for facebook and twitter * doc(share_repository): mention to open share links with url_launcher * chore: addressed review feedback * chore: update repository to take in app url * test: changed test url to a fake one * chore: rename method signature * chore: renamed variables for new method name Co-authored-by: RuiAlonso --- .../lib/share_repository.dart | 1 + .../lib/src/models/models.dart | 1 + .../lib/src/models/share_platform.dart | 8 +++++ .../lib/src/share_repository.dart | 25 ++++++++++++++- .../test/src/share_repository_test.dart | 32 ++++++++++++++++++- 5 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 packages/share_repository/lib/src/models/models.dart create mode 100644 packages/share_repository/lib/src/models/share_platform.dart diff --git a/packages/share_repository/lib/share_repository.dart b/packages/share_repository/lib/share_repository.dart index 0b6d064c..0a68aff4 100644 --- a/packages/share_repository/lib/share_repository.dart +++ b/packages/share_repository/lib/share_repository.dart @@ -1,3 +1,4 @@ library share_repository; +export 'src/models/models.dart'; export 'src/share_repository.dart'; diff --git a/packages/share_repository/lib/src/models/models.dart b/packages/share_repository/lib/src/models/models.dart new file mode 100644 index 00000000..26819946 --- /dev/null +++ b/packages/share_repository/lib/src/models/models.dart @@ -0,0 +1 @@ +export 'share_platform.dart'; diff --git a/packages/share_repository/lib/src/models/share_platform.dart b/packages/share_repository/lib/src/models/share_platform.dart new file mode 100644 index 00000000..054a4f15 --- /dev/null +++ b/packages/share_repository/lib/src/models/share_platform.dart @@ -0,0 +1,8 @@ +/// The platform that is being used to share a score. +enum SharePlatform { + /// Twitter platform. + twitter, + + /// Facebook platform. + facebook, +} diff --git a/packages/share_repository/lib/src/share_repository.dart b/packages/share_repository/lib/src/share_repository.dart index 6c1f36d0..6e6679c2 100644 --- a/packages/share_repository/lib/src/share_repository.dart +++ b/packages/share_repository/lib/src/share_repository.dart @@ -1,7 +1,30 @@ +import 'package:share_repository/share_repository.dart'; + /// {@template share_repository} /// Repository to facilitate sharing scores. /// {@endtemplate} class ShareRepository { /// {@macro share_repository} - const ShareRepository(); + const ShareRepository({ + required String appUrl, + }) : _appUrl = appUrl; + + final String _appUrl; + + /// Returns a url to share the [value] on the given [platform]. + /// + /// The returned url can be opened using the [url_launcher](https://pub.dev/packages/url_launcher) package. + String shareText({ + required String value, + required SharePlatform platform, + }) { + final encodedUrl = Uri.encodeComponent(_appUrl); + final encodedShareText = Uri.encodeComponent(value); + switch (platform) { + case SharePlatform.twitter: + return 'https://twitter.com/intent/tweet?url=$encodedUrl&text=$encodedShareText'; + case SharePlatform.facebook: + return 'https://www.facebook.com/sharer.php?u=$encodedUrl"e=$encodedShareText'; + } + } } diff --git a/packages/share_repository/test/src/share_repository_test.dart b/packages/share_repository/test/src/share_repository_test.dart index e6cc536b..bdb2c517 100644 --- a/packages/share_repository/test/src/share_repository_test.dart +++ b/packages/share_repository/test/src/share_repository_test.dart @@ -4,8 +4,38 @@ import 'package:test/test.dart'; void main() { group('ShareRepository', () { + const appUrl = 'https://fakeurl.com/'; + late ShareRepository shareRepository; + + setUp(() { + shareRepository = ShareRepository(appUrl: appUrl); + }); + test('can be instantiated', () { - expect(ShareRepository(), isNotNull); + expect(ShareRepository(appUrl: appUrl), isNotNull); + }); + + group('shareText', () { + const value = 'hello world!'; + test('returns the correct share url for twitter', () async { + const shareTextUrl = + 'https://twitter.com/intent/tweet?url=https%3A%2F%2Ffakeurl.com%2F&text=hello%20world!'; + final shareTextResult = shareRepository.shareText( + value: value, + platform: SharePlatform.twitter, + ); + expect(shareTextResult, equals(shareTextUrl)); + }); + + test('returns the correct share url for facebook', () async { + const shareTextUrl = + 'https://www.facebook.com/sharer.php?u=https%3A%2F%2Ffakeurl.com%2F"e=hello%20world!'; + final shareTextResult = shareRepository.shareText( + value: value, + platform: SharePlatform.facebook, + ); + expect(shareTextResult, equals(shareTextUrl)); + }); }); }); }