diff --git a/.gitignore b/.gitignore
index e565663..a0f8c36 100644
--- a/.gitignore
+++ b/.gitignore
@@ -30,6 +30,7 @@
.pub-cache/
.pub/
/build/
+ios/build/
# Web related
lib/generated_plugin_registrant.dart
diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist
index 9367d48..8d4492f 100644
--- a/ios/Flutter/AppFrameworkInfo.plist
+++ b/ios/Flutter/AppFrameworkInfo.plist
@@ -21,6 +21,6 @@
CFBundleVersion
1.0
MinimumOSVersion
- 8.0
+ 9.0
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index 68178c4..ca8ea86 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -19,10 +19,10 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/url_launcher/ios"
SPEC CHECKSUMS:
- Flutter: 434fef37c0980e73bb6479ef766c45957d4b510c
+ Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a
path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c
url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef
PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c
-COCOAPODS: 1.10.1
+COCOAPODS: 1.10.2
diff --git a/lib/application/accounts/bloc/accounts_bloc.dart b/lib/application/accounts/bloc/accounts_bloc.dart
index 24822c8..15d0ca6 100644
--- a/lib/application/accounts/bloc/accounts_bloc.dart
+++ b/lib/application/accounts/bloc/accounts_bloc.dart
@@ -1,17 +1,12 @@
import 'dart:async';
-import 'package:bloc/bloc.dart';
import 'package:devour/application/navigator/app_navigator.dart';
import 'package:devour/application/navigator/routes.dart';
-import 'package:devour/domain/auth/oauth_account_model.dart';
import 'package:devour/domain/auth/reddit_account.dart';
import 'package:devour/domain/repositories/account_repository.dart';
-import 'package:devour/infrastructure/api/reddit_api.dart';
-import 'package:devour/infrastructure/api/reddit_auth_api.dart';
+import 'package:devour/infrastructure/api/reddit/reddit_auth_api.dart';
import 'package:devour/infrastructure/core/misc.dart';
-import 'package:devour/infrastructure/register_module.dart';
-import 'package:devour/injection.dart';
-import 'package:dio/dio.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:fpdart/fpdart.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:injectable/injectable.dart';
@@ -39,7 +34,6 @@ class AccountsBloc extends Bloc {
yield* event.map(
Fetching: (_Fetching value) async* {
final account = _accountsRepository.getAccount();
- _updateDioOptions(account);
yield state.copyWith(
redditAccount: account,
@@ -50,7 +44,6 @@ class AccountsBloc extends Bloc {
final response = await _redditAuthAPI.getAccessToken(e.args.code);
final account = RedditAccount.fromResponse(response);
_accountsRepository.setAccount(account);
- _updateDioOptions(Option.of(account));
yield state.copyWith(
redditAccount: Option.of(account),
@@ -70,20 +63,4 @@ class AccountsBloc extends Bloc {
},
);
}
-
- /// Updates interceptors of reddit dio, to add Authorization header, and catch expired
- /// token exception, to refresh it and retry.
- void _updateDioOptions(Option accountOption) {
- if (accountOption.isNone()) {
- return;
- }
- final account = accountOption.toNullable()!;
-
- final dio = serviceLocator(instanceName: kRedditDioName);
- dio.interceptors.clear();
- if (account is RedditAccount) {
- dio.interceptors.add(RedditAPI.getAuthenticationTokenInterceptor());
- dio.interceptors.add(RedditAuthAPI.getRefreshTokenInterceptor(dio));
- }
- }
}
diff --git a/lib/application/accounts/bloc/accounts_bloc.freezed.dart b/lib/application/accounts/bloc/accounts_bloc.freezed.dart
index 9e3b48d..4a6c832 100644
--- a/lib/application/accounts/bloc/accounts_bloc.freezed.dart
+++ b/lib/application/accounts/bloc/accounts_bloc.freezed.dart
@@ -1,5 +1,6 @@
+// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
-// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides
+// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
part of 'accounts_bloc.dart';
@@ -54,6 +55,15 @@ mixin _$AccountsEvent {
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
+ TResult? whenOrNull({
+ TResult Function()? Fetching,
+ TResult Function()? RequestAuthorizationReddit,
+ TResult Function()? RequestAuthorizationVK,
+ TResult Function(RedditRedirectArguments args)? AuthorizeReddit,
+ TResult Function()? AuthorizeVK,
+ }) =>
+ throw _privateConstructorUsedError;
+ @optionalTypeArgs
TResult maybeWhen({
TResult Function()? Fetching,
TResult Function()? RequestAuthorizationReddit,
@@ -75,6 +85,16 @@ mixin _$AccountsEvent {
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
+ TResult? mapOrNull({
+ TResult Function(_Fetching value)? Fetching,
+ TResult Function(_RequestAuthorizationReddit value)?
+ RequestAuthorizationReddit,
+ TResult Function(_RequestAuthorizationVK value)? RequestAuthorizationVK,
+ TResult Function(_AuthorizeReddit value)? AuthorizeReddit,
+ TResult Function(_AuthorizeVK value)? AuthorizeVK,
+ }) =>
+ throw _privateConstructorUsedError;
+ @optionalTypeArgs
TResult maybeMap({
TResult Function(_Fetching value)? Fetching,
TResult Function(_RequestAuthorizationReddit value)?
@@ -150,6 +170,18 @@ class _$_Fetching implements _Fetching {
return Fetching();
}
+ @override
+ @optionalTypeArgs
+ TResult? whenOrNull({
+ TResult Function()? Fetching,
+ TResult Function()? RequestAuthorizationReddit,
+ TResult Function()? RequestAuthorizationVK,
+ TResult Function(RedditRedirectArguments args)? AuthorizeReddit,
+ TResult Function()? AuthorizeVK,
+ }) {
+ return Fetching?.call();
+ }
+
@override
@optionalTypeArgs
TResult maybeWhen({
@@ -180,6 +212,19 @@ class _$_Fetching implements _Fetching {
return Fetching(this);
}
+ @override
+ @optionalTypeArgs
+ TResult? mapOrNull({
+ TResult Function(_Fetching value)? Fetching,
+ TResult Function(_RequestAuthorizationReddit value)?
+ RequestAuthorizationReddit,
+ TResult Function(_RequestAuthorizationVK value)? RequestAuthorizationVK,
+ TResult Function(_AuthorizeReddit value)? AuthorizeReddit,
+ TResult Function(_AuthorizeVK value)? AuthorizeVK,
+ }) {
+ return Fetching?.call(this);
+ }
+
@override
@optionalTypeArgs
TResult maybeMap({
@@ -253,6 +298,18 @@ class _$_RequestAuthorizationReddit implements _RequestAuthorizationReddit {
return RequestAuthorizationReddit();
}
+ @override
+ @optionalTypeArgs
+ TResult? whenOrNull({
+ TResult Function()? Fetching,
+ TResult Function()? RequestAuthorizationReddit,
+ TResult Function()? RequestAuthorizationVK,
+ TResult Function(RedditRedirectArguments args)? AuthorizeReddit,
+ TResult Function()? AuthorizeVK,
+ }) {
+ return RequestAuthorizationReddit?.call();
+ }
+
@override
@optionalTypeArgs
TResult maybeWhen({
@@ -283,6 +340,19 @@ class _$_RequestAuthorizationReddit implements _RequestAuthorizationReddit {
return RequestAuthorizationReddit(this);
}
+ @override
+ @optionalTypeArgs
+ TResult? mapOrNull({
+ TResult Function(_Fetching value)? Fetching,
+ TResult Function(_RequestAuthorizationReddit value)?
+ RequestAuthorizationReddit,
+ TResult Function(_RequestAuthorizationVK value)? RequestAuthorizationVK,
+ TResult Function(_AuthorizeReddit value)? AuthorizeReddit,
+ TResult Function(_AuthorizeVK value)? AuthorizeVK,
+ }) {
+ return RequestAuthorizationReddit?.call(this);
+ }
+
@override
@optionalTypeArgs
TResult maybeMap({
@@ -354,6 +424,18 @@ class _$_RequestAuthorizationVK implements _RequestAuthorizationVK {
return RequestAuthorizationVK();
}
+ @override
+ @optionalTypeArgs
+ TResult? whenOrNull({
+ TResult Function()? Fetching,
+ TResult Function()? RequestAuthorizationReddit,
+ TResult Function()? RequestAuthorizationVK,
+ TResult Function(RedditRedirectArguments args)? AuthorizeReddit,
+ TResult Function()? AuthorizeVK,
+ }) {
+ return RequestAuthorizationVK?.call();
+ }
+
@override
@optionalTypeArgs
TResult maybeWhen({
@@ -384,6 +466,19 @@ class _$_RequestAuthorizationVK implements _RequestAuthorizationVK {
return RequestAuthorizationVK(this);
}
+ @override
+ @optionalTypeArgs
+ TResult? mapOrNull({
+ TResult Function(_Fetching value)? Fetching,
+ TResult Function(_RequestAuthorizationReddit value)?
+ RequestAuthorizationReddit,
+ TResult Function(_RequestAuthorizationVK value)? RequestAuthorizationVK,
+ TResult Function(_AuthorizeReddit value)? AuthorizeReddit,
+ TResult Function(_AuthorizeVK value)? AuthorizeVK,
+ }) {
+ return RequestAuthorizationVK?.call(this);
+ }
+
@override
@optionalTypeArgs
TResult maybeMap({
@@ -489,6 +584,18 @@ class _$_AuthorizeReddit implements _AuthorizeReddit {
return AuthorizeReddit(args);
}
+ @override
+ @optionalTypeArgs
+ TResult? whenOrNull({
+ TResult Function()? Fetching,
+ TResult Function()? RequestAuthorizationReddit,
+ TResult Function()? RequestAuthorizationVK,
+ TResult Function(RedditRedirectArguments args)? AuthorizeReddit,
+ TResult Function()? AuthorizeVK,
+ }) {
+ return AuthorizeReddit?.call(args);
+ }
+
@override
@optionalTypeArgs
TResult maybeWhen({
@@ -519,6 +626,19 @@ class _$_AuthorizeReddit implements _AuthorizeReddit {
return AuthorizeReddit(this);
}
+ @override
+ @optionalTypeArgs
+ TResult? mapOrNull({
+ TResult Function(_Fetching value)? Fetching,
+ TResult Function(_RequestAuthorizationReddit value)?
+ RequestAuthorizationReddit,
+ TResult Function(_RequestAuthorizationVK value)? RequestAuthorizationVK,
+ TResult Function(_AuthorizeReddit value)? AuthorizeReddit,
+ TResult Function(_AuthorizeVK value)? AuthorizeVK,
+ }) {
+ return AuthorizeReddit?.call(this);
+ }
+
@override
@optionalTypeArgs
TResult maybeMap({
@@ -595,6 +715,18 @@ class _$_AuthorizeVK implements _AuthorizeVK {
return AuthorizeVK();
}
+ @override
+ @optionalTypeArgs
+ TResult? whenOrNull({
+ TResult Function()? Fetching,
+ TResult Function()? RequestAuthorizationReddit,
+ TResult Function()? RequestAuthorizationVK,
+ TResult Function(RedditRedirectArguments args)? AuthorizeReddit,
+ TResult Function()? AuthorizeVK,
+ }) {
+ return AuthorizeVK?.call();
+ }
+
@override
@optionalTypeArgs
TResult maybeWhen({
@@ -625,6 +757,19 @@ class _$_AuthorizeVK implements _AuthorizeVK {
return AuthorizeVK(this);
}
+ @override
+ @optionalTypeArgs
+ TResult? mapOrNull({
+ TResult Function(_Fetching value)? Fetching,
+ TResult Function(_RequestAuthorizationReddit value)?
+ RequestAuthorizationReddit,
+ TResult Function(_RequestAuthorizationVK value)? RequestAuthorizationVK,
+ TResult Function(_AuthorizeReddit value)? AuthorizeReddit,
+ TResult Function(_AuthorizeVK value)? AuthorizeVK,
+ }) {
+ return AuthorizeVK?.call(this);
+ }
+
@override
@optionalTypeArgs
TResult maybeMap({
diff --git a/lib/application/auth/login/login_bloc.freezed.dart b/lib/application/auth/login/login_bloc.freezed.dart
index ec34fc1..e981b86 100644
--- a/lib/application/auth/login/login_bloc.freezed.dart
+++ b/lib/application/auth/login/login_bloc.freezed.dart
@@ -1,5 +1,6 @@
+// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
-// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides
+// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
part of 'login_bloc.dart';
@@ -51,6 +52,14 @@ mixin _$LoginEvent {
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
+ TResult? whenOrNull({
+ TResult Function(String number)? numberChanged,
+ TResult Function(String confirmationCode)? confirmationCodeChanged,
+ TResult Function()? loginPressed,
+ TResult Function()? confirmPressed,
+ }) =>
+ throw _privateConstructorUsedError;
+ @optionalTypeArgs
TResult maybeWhen({
TResult Function(String number)? numberChanged,
TResult Function(String confirmationCode)? confirmationCodeChanged,
@@ -69,6 +78,14 @@ mixin _$LoginEvent {
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
+ TResult? mapOrNull({
+ TResult Function(NumberChanged value)? numberChanged,
+ TResult Function(ConfirmationCodeChanged value)? confirmationCodeChanged,
+ TResult Function(LoginPressed value)? loginPressed,
+ TResult Function(ConfirmPressed value)? confirmPressed,
+ }) =>
+ throw _privateConstructorUsedError;
+ @optionalTypeArgs
TResult maybeMap({
TResult Function(NumberChanged value)? numberChanged,
TResult Function(ConfirmationCodeChanged value)? confirmationCodeChanged,
@@ -167,6 +184,17 @@ class _$NumberChanged implements NumberChanged {
return numberChanged(number);
}
+ @override
+ @optionalTypeArgs
+ TResult? whenOrNull({
+ TResult Function(String number)? numberChanged,
+ TResult Function(String confirmationCode)? confirmationCodeChanged,
+ TResult Function()? loginPressed,
+ TResult Function()? confirmPressed,
+ }) {
+ return numberChanged?.call(number);
+ }
+
@override
@optionalTypeArgs
TResult maybeWhen({
@@ -194,6 +222,17 @@ class _$NumberChanged implements NumberChanged {
return numberChanged(this);
}
+ @override
+ @optionalTypeArgs
+ TResult? mapOrNull({
+ TResult Function(NumberChanged value)? numberChanged,
+ TResult Function(ConfirmationCodeChanged value)? confirmationCodeChanged,
+ TResult Function(LoginPressed value)? loginPressed,
+ TResult Function(ConfirmPressed value)? confirmPressed,
+ }) {
+ return numberChanged?.call(this);
+ }
+
@override
@optionalTypeArgs
TResult maybeMap({
@@ -295,6 +334,17 @@ class _$ConfirmationCodeChanged implements ConfirmationCodeChanged {
return confirmationCodeChanged(confirmationCode);
}
+ @override
+ @optionalTypeArgs
+ TResult? whenOrNull({
+ TResult Function(String number)? numberChanged,
+ TResult Function(String confirmationCode)? confirmationCodeChanged,
+ TResult Function()? loginPressed,
+ TResult Function()? confirmPressed,
+ }) {
+ return confirmationCodeChanged?.call(confirmationCode);
+ }
+
@override
@optionalTypeArgs
TResult maybeWhen({
@@ -322,6 +372,17 @@ class _$ConfirmationCodeChanged implements ConfirmationCodeChanged {
return confirmationCodeChanged(this);
}
+ @override
+ @optionalTypeArgs
+ TResult? mapOrNull({
+ TResult Function(NumberChanged value)? numberChanged,
+ TResult Function(ConfirmationCodeChanged value)? confirmationCodeChanged,
+ TResult Function(LoginPressed value)? loginPressed,
+ TResult Function(ConfirmPressed value)? confirmPressed,
+ }) {
+ return confirmationCodeChanged?.call(this);
+ }
+
@override
@optionalTypeArgs
TResult maybeMap({
@@ -395,6 +456,17 @@ class _$LoginPressed implements LoginPressed {
return loginPressed();
}
+ @override
+ @optionalTypeArgs
+ TResult? whenOrNull({
+ TResult Function(String number)? numberChanged,
+ TResult Function(String confirmationCode)? confirmationCodeChanged,
+ TResult Function()? loginPressed,
+ TResult Function()? confirmPressed,
+ }) {
+ return loginPressed?.call();
+ }
+
@override
@optionalTypeArgs
TResult maybeWhen({
@@ -422,6 +494,17 @@ class _$LoginPressed implements LoginPressed {
return loginPressed(this);
}
+ @override
+ @optionalTypeArgs
+ TResult? mapOrNull({
+ TResult Function(NumberChanged value)? numberChanged,
+ TResult Function(ConfirmationCodeChanged value)? confirmationCodeChanged,
+ TResult Function(LoginPressed value)? loginPressed,
+ TResult Function(ConfirmPressed value)? confirmPressed,
+ }) {
+ return loginPressed?.call(this);
+ }
+
@override
@optionalTypeArgs
TResult maybeMap({
@@ -489,6 +572,17 @@ class _$ConfirmPressed implements ConfirmPressed {
return confirmPressed();
}
+ @override
+ @optionalTypeArgs
+ TResult? whenOrNull({
+ TResult Function(String number)? numberChanged,
+ TResult Function(String confirmationCode)? confirmationCodeChanged,
+ TResult Function()? loginPressed,
+ TResult Function()? confirmPressed,
+ }) {
+ return confirmPressed?.call();
+ }
+
@override
@optionalTypeArgs
TResult maybeWhen({
@@ -516,6 +610,17 @@ class _$ConfirmPressed implements ConfirmPressed {
return confirmPressed(this);
}
+ @override
+ @optionalTypeArgs
+ TResult? mapOrNull({
+ TResult Function(NumberChanged value)? numberChanged,
+ TResult Function(ConfirmationCodeChanged value)? confirmationCodeChanged,
+ TResult Function(LoginPressed value)? loginPressed,
+ TResult Function(ConfirmPressed value)? confirmPressed,
+ }) {
+ return confirmPressed?.call(this);
+ }
+
@override
@optionalTypeArgs
TResult maybeMap({
diff --git a/lib/application/feed/bloc/feed_bloc.dart b/lib/application/feed/bloc/feed_bloc.dart
index 7f63daa..e6ab123 100644
--- a/lib/application/feed/bloc/feed_bloc.dart
+++ b/lib/application/feed/bloc/feed_bloc.dart
@@ -1,9 +1,8 @@
import 'dart:async';
-import 'package:bloc/bloc.dart';
import 'package:devour/domain/meme/abstract_meme_model.dart';
-import 'package:devour/domain/meme_scrapper/i_meme_scrapper_facade.dart';
-import 'package:fpdart/fpdart.dart';
+import 'package:devour/infrastructure/meme_scrapper/reddit_scrapper.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:injectable/injectable.dart';
@@ -15,14 +14,10 @@ const int kMemeChunkSize = 20;
@injectable
class FeedBloc extends Bloc {
- IMemeScrapperFacade _memeScrapper;
+ RedditScrapperFacade redditScrapper;
- /// BLoC for feed widget. although [memeScrapper] marked as nullable, in must be not null.
- /// It marked nullable because of Injectable.
- FeedBloc(@factoryParam IMemeScrapperFacade? memeScrapper)
- : assert(memeScrapper != null),
- _memeScrapper = memeScrapper!,
- super(FeedState.loading());
+ /// BLoC for feed widget.
+ FeedBloc(this.redditScrapper) : super(FeedState.loading());
@override
Stream mapEventToState(
@@ -31,7 +26,7 @@ class FeedBloc extends Bloc {
yield* event.map(
init: (e) async* {
yield FeedState.loading();
- final scrappedMemes = await _memeScrapper.getMemes(kMemeChunkSize);
+ final scrappedMemes = await redditScrapper.getMemes(kMemeChunkSize);
yield state.copyWith(
isLoading: false,
memes: scrappedMemes,
diff --git a/lib/application/feed/bloc/feed_bloc.freezed.dart b/lib/application/feed/bloc/feed_bloc.freezed.dart
index d7b7237..5a03bfc 100644
--- a/lib/application/feed/bloc/feed_bloc.freezed.dart
+++ b/lib/application/feed/bloc/feed_bloc.freezed.dart
@@ -1,5 +1,6 @@
+// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
-// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides
+// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
part of 'feed_bloc.dart';
@@ -47,6 +48,14 @@ mixin _$FeedEvent {
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
+ TResult? whenOrNull({
+ TResult Function()? like,
+ TResult Function()? refresh,
+ TResult Function()? next,
+ TResult Function()? init,
+ }) =>
+ throw _privateConstructorUsedError;
+ @optionalTypeArgs
TResult maybeWhen({
TResult Function()? like,
TResult Function()? refresh,
@@ -64,6 +73,14 @@ mixin _$FeedEvent {
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
+ TResult? mapOrNull({
+ TResult Function(_Like value)? like,
+ TResult Function(_Refresh value)? refresh,
+ TResult Function(_Next value)? next,
+ TResult Function(_Init value)? init,
+ }) =>
+ throw _privateConstructorUsedError;
+ @optionalTypeArgs
TResult maybeMap({
TResult Function(_Like value)? like,
TResult Function(_Refresh value)? refresh,
@@ -134,6 +151,17 @@ class _$_Like implements _Like {
return like();
}
+ @override
+ @optionalTypeArgs
+ TResult? whenOrNull({
+ TResult Function()? like,
+ TResult Function()? refresh,
+ TResult Function()? next,
+ TResult Function()? init,
+ }) {
+ return like?.call();
+ }
+
@override
@optionalTypeArgs
TResult maybeWhen({
@@ -160,6 +188,17 @@ class _$_Like implements _Like {
return like(this);
}
+ @override
+ @optionalTypeArgs
+ TResult? mapOrNull({
+ TResult Function(_Like value)? like,
+ TResult Function(_Refresh value)? refresh,
+ TResult Function(_Next value)? next,
+ TResult Function(_Init value)? init,
+ }) {
+ return like?.call(this);
+ }
+
@override
@optionalTypeArgs
TResult maybeMap({
@@ -225,6 +264,17 @@ class _$_Refresh implements _Refresh {
return refresh();
}
+ @override
+ @optionalTypeArgs
+ TResult? whenOrNull({
+ TResult Function()? like,
+ TResult Function()? refresh,
+ TResult Function()? next,
+ TResult Function()? init,
+ }) {
+ return refresh?.call();
+ }
+
@override
@optionalTypeArgs
TResult maybeWhen({
@@ -251,6 +301,17 @@ class _$_Refresh implements _Refresh {
return refresh(this);
}
+ @override
+ @optionalTypeArgs
+ TResult? mapOrNull({
+ TResult Function(_Like value)? like,
+ TResult Function(_Refresh value)? refresh,
+ TResult Function(_Next value)? next,
+ TResult Function(_Init value)? init,
+ }) {
+ return refresh?.call(this);
+ }
+
@override
@optionalTypeArgs
TResult maybeMap({
@@ -316,6 +377,17 @@ class _$_Next implements _Next {
return next();
}
+ @override
+ @optionalTypeArgs
+ TResult? whenOrNull({
+ TResult Function()? like,
+ TResult Function()? refresh,
+ TResult Function()? next,
+ TResult Function()? init,
+ }) {
+ return next?.call();
+ }
+
@override
@optionalTypeArgs
TResult maybeWhen({
@@ -342,6 +414,17 @@ class _$_Next implements _Next {
return next(this);
}
+ @override
+ @optionalTypeArgs
+ TResult? mapOrNull({
+ TResult Function(_Like value)? like,
+ TResult Function(_Refresh value)? refresh,
+ TResult Function(_Next value)? next,
+ TResult Function(_Init value)? init,
+ }) {
+ return next?.call(this);
+ }
+
@override
@optionalTypeArgs
TResult maybeMap({
@@ -407,6 +490,17 @@ class _$_Init implements _Init {
return init();
}
+ @override
+ @optionalTypeArgs
+ TResult? whenOrNull({
+ TResult Function()? like,
+ TResult Function()? refresh,
+ TResult Function()? next,
+ TResult Function()? init,
+ }) {
+ return init?.call();
+ }
+
@override
@optionalTypeArgs
TResult maybeWhen({
@@ -433,6 +527,17 @@ class _$_Init implements _Init {
return init(this);
}
+ @override
+ @optionalTypeArgs
+ TResult? mapOrNull({
+ TResult Function(_Like value)? like,
+ TResult Function(_Refresh value)? refresh,
+ TResult Function(_Next value)? next,
+ TResult Function(_Init value)? init,
+ }) {
+ return init?.call(this);
+ }
+
@override
@optionalTypeArgs
TResult maybeMap({
diff --git a/lib/application/navigator/app_navigator.dart b/lib/application/navigator/app_navigator.dart
index cb87135..f52b18a 100644
--- a/lib/application/navigator/app_navigator.dart
+++ b/lib/application/navigator/app_navigator.dart
@@ -2,6 +2,7 @@ import 'dart:io';
import 'package:devour/application/navigator/routes.dart';
import 'package:devour/presentation/screens/accounts/accounts_screen.dart';
+import 'package:devour/presentation/screens/feed/feed_screen.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
@@ -55,7 +56,7 @@ class AppNavigator {
return (BuildContext ctx) => AccountScreen(
redirectArguments: settings.arguments! as RedditRedirectArguments);
default:
- return (BuildContext ctx) => AccountScreen();
+ return (BuildContext ctx) => const FeedScreen();
}
}
diff --git a/lib/application/navigator/routes.freezed.dart b/lib/application/navigator/routes.freezed.dart
index 4149a2c..dc5143a 100644
--- a/lib/application/navigator/routes.freezed.dart
+++ b/lib/application/navigator/routes.freezed.dart
@@ -1,5 +1,6 @@
+// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
-// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides
+// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
part of 'routes.dart';
diff --git a/lib/domain/auth/auth_failure.freezed.dart b/lib/domain/auth/auth_failure.freezed.dart
index 206aec2..3873acc 100644
--- a/lib/domain/auth/auth_failure.freezed.dart
+++ b/lib/domain/auth/auth_failure.freezed.dart
@@ -1,5 +1,6 @@
+// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
-// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides
+// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
part of 'auth_failure.dart';
@@ -37,6 +38,12 @@ mixin _$AuthFailure {
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
+ TResult? whenOrNull({
+ TResult Function()? invalidNumber,
+ TResult Function()? userNotFound,
+ }) =>
+ throw _privateConstructorUsedError;
+ @optionalTypeArgs
TResult maybeWhen({
TResult Function()? invalidNumber,
TResult Function()? userNotFound,
@@ -50,6 +57,12 @@ mixin _$AuthFailure {
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
+ TResult? mapOrNull({
+ TResult Function(InvalidNumber value)? invalidNumber,
+ TResult Function(UserNotFound value)? userNotFound,
+ }) =>
+ throw _privateConstructorUsedError;
+ @optionalTypeArgs
TResult maybeMap({
TResult Function(InvalidNumber value)? invalidNumber,
TResult Function(UserNotFound value)? userNotFound,
@@ -125,6 +138,15 @@ class _$InvalidNumber with DiagnosticableTreeMixin implements InvalidNumber {
return invalidNumber();
}
+ @override
+ @optionalTypeArgs
+ TResult? whenOrNull({
+ TResult Function()? invalidNumber,
+ TResult Function()? userNotFound,
+ }) {
+ return invalidNumber?.call();
+ }
+
@override
@optionalTypeArgs
TResult maybeWhen({
@@ -147,6 +169,15 @@ class _$InvalidNumber with DiagnosticableTreeMixin implements InvalidNumber {
return invalidNumber(this);
}
+ @override
+ @optionalTypeArgs
+ TResult? mapOrNull({
+ TResult Function(InvalidNumber value)? invalidNumber,
+ TResult Function(UserNotFound value)? userNotFound,
+ }) {
+ return invalidNumber?.call(this);
+ }
+
@override
@optionalTypeArgs
TResult maybeMap({
@@ -216,6 +247,15 @@ class _$UserNotFound with DiagnosticableTreeMixin implements UserNotFound {
return userNotFound();
}
+ @override
+ @optionalTypeArgs
+ TResult? whenOrNull({
+ TResult Function()? invalidNumber,
+ TResult Function()? userNotFound,
+ }) {
+ return userNotFound?.call();
+ }
+
@override
@optionalTypeArgs
TResult maybeWhen({
@@ -238,6 +278,15 @@ class _$UserNotFound with DiagnosticableTreeMixin implements UserNotFound {
return userNotFound(this);
}
+ @override
+ @optionalTypeArgs
+ TResult? mapOrNull({
+ TResult Function(InvalidNumber value)? invalidNumber,
+ TResult Function(UserNotFound value)? userNotFound,
+ }) {
+ return userNotFound?.call(this);
+ }
+
@override
@optionalTypeArgs
TResult maybeMap({
diff --git a/lib/domain/auth/reddit_account.dart b/lib/domain/auth/reddit_account.dart
index d531462..02d5aec 100644
--- a/lib/domain/auth/reddit_account.dart
+++ b/lib/domain/auth/reddit_account.dart
@@ -1,5 +1,5 @@
import 'package:devour/domain/auth/oauth_account_model.dart';
-import 'package:devour/infrastructure/api/reddit_auth_api.dart';
+import 'package:devour/infrastructure/api/reddit/response/reddit_auth_response.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:hive_flutter/hive_flutter.dart';
diff --git a/lib/domain/auth/reddit_account.freezed.dart b/lib/domain/auth/reddit_account.freezed.dart
index 5fb4cd5..84fa37f 100644
--- a/lib/domain/auth/reddit_account.freezed.dart
+++ b/lib/domain/auth/reddit_account.freezed.dart
@@ -1,5 +1,6 @@
+// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
-// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides
+// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
part of 'reddit_account.dart';
diff --git a/lib/domain/managers/accounts_manager.dart b/lib/domain/managers/accounts_manager.dart
new file mode 100644
index 0000000..17a52fb
--- /dev/null
+++ b/lib/domain/managers/accounts_manager.dart
@@ -0,0 +1,51 @@
+import 'package:collection/collection.dart';
+import 'package:devour/domain/auth/oauth_account_model.dart';
+import 'package:devour/domain/auth/reddit_account.dart';
+import 'package:devour/domain/repositories/account_repository.dart';
+import 'package:devour/infrastructure/api/reddit/reddit_api.dart';
+import 'package:devour/infrastructure/api/reddit/reddit_auth_api.dart';
+import 'package:devour/infrastructure/register_module.dart';
+import 'package:devour/injection.dart';
+import 'package:dio/dio.dart';
+import 'package:fpdart/fpdart.dart';
+import 'package:injectable/injectable.dart';
+
+@singleton
+class AccountsManager {
+ AccountsRepository accountsRepository;
+ AccountsManager(this.accountsRepository);
+
+ /// Creates account manager, and listen to accounts repo, to update interceptors
+ @factoryMethod
+ static Future init(
+ AccountsRepository accountsRepository) async {
+ final manager = AccountsManager(accountsRepository);
+ manager.initAccountsListener();
+
+ return manager;
+ }
+
+ /// Listen to accounts in repo, and updates `Dio` interceptors accordingly
+ void initAccountsListener() {
+ accountsRepository.accounts.listen((accounts) {
+ final redditAccount = accounts.whereType().firstOrNull;
+ _updateDioOptions(Option.fromNullable(redditAccount));
+ });
+ }
+
+ /// Updates interceptors of reddit dio, to add Authorization header, and catch expired
+ /// token exception, to refresh it and retry.
+ void _updateDioOptions(Option accountOption) {
+ if (accountOption.isNone()) {
+ return;
+ }
+ final account = accountOption.toNullable()!;
+
+ final dio = serviceLocator(instanceName: kRedditDioName);
+ dio.interceptors.clear();
+ if (account is RedditAccount) {
+ dio.interceptors.add(RedditAPI.getAuthenticationTokenInterceptor());
+ dio.interceptors.add(RedditAuthAPI.getRefreshTokenInterceptor(dio));
+ }
+ }
+}
diff --git a/lib/domain/meme/abstract_meme_model.dart b/lib/domain/meme/abstract_meme_model.dart
index 3fcff0c..ba0db04 100644
--- a/lib/domain/meme/abstract_meme_model.dart
+++ b/lib/domain/meme/abstract_meme_model.dart
@@ -1,7 +1,6 @@
import 'package:freezed_annotation/freezed_annotation.dart';
part 'abstract_meme_model.freezed.dart';
-part 'abstract_meme_model.g.dart';
// part 'abstract_meme_model.g.dart';
@freezed
@@ -19,18 +18,10 @@ abstract class AbstractMemeModel with _$AbstractMemeModel {
factory AbstractMemeModel.reddit({
required String title,
required String author,
- @JsonKey(name: 'image_reviews') required List imagePreviews,
- @JsonKey(name: 'url') required String imageLink,
- @JsonKey(name: 'post_link') required String sourceLink,
+ required String imageLink,
+ required String sourceLink,
required String subreddit,
required int ups,
- @JsonKey(name: 'spoilers_enabled') required bool spoilersEnabled,
required bool nsfw,
}) = RedditMemeModel;
-
- const AbstractMemeModel._();
-
- factory AbstractMemeModel.fromJson(Map json) =>
- _$AbstractMemeModelFromJson(json);
- // ignore: public_member_api_docs
}
diff --git a/lib/domain/meme/abstract_meme_model.freezed.dart b/lib/domain/meme/abstract_meme_model.freezed.dart
index c33fd79..ddcb0e4 100644
--- a/lib/domain/meme/abstract_meme_model.freezed.dart
+++ b/lib/domain/meme/abstract_meme_model.freezed.dart
@@ -1,5 +1,6 @@
+// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
-// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides
+// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
part of 'abstract_meme_model.dart';
@@ -12,18 +13,6 @@ T _$identity(T value) => value;
final _privateConstructorUsedError = UnsupportedError(
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods');
-AbstractMemeModel _$AbstractMemeModelFromJson(Map json) {
- switch (json['runtimeType'] as String) {
- case 'default':
- return _AbstractMemeModel.fromJson(json);
- case 'reddit':
- return RedditMemeModel.fromJson(json);
-
- default:
- throw FallThroughError();
- }
-}
-
/// @nodoc
class _$AbstractMemeModelTearOff {
const _$AbstractMemeModelTearOff();
@@ -46,29 +35,21 @@ class _$AbstractMemeModelTearOff {
RedditMemeModel reddit(
{required String title,
required String author,
- @JsonKey(name: 'image_reviews') required List imagePreviews,
- @JsonKey(name: 'url') required String imageLink,
- @JsonKey(name: 'post_link') required String sourceLink,
+ required String imageLink,
+ required String sourceLink,
required String subreddit,
required int ups,
- @JsonKey(name: 'spoilers_enabled') required bool spoilersEnabled,
required bool nsfw}) {
return RedditMemeModel(
title: title,
author: author,
- imagePreviews: imagePreviews,
imageLink: imageLink,
sourceLink: sourceLink,
subreddit: subreddit,
ups: ups,
- spoilersEnabled: spoilersEnabled,
nsfw: nsfw,
);
}
-
- AbstractMemeModel fromJson(Map json) {
- return AbstractMemeModel.fromJson(json);
- }
}
/// @nodoc
@@ -80,23 +61,24 @@ mixin _$AbstractMemeModel {
String get imageLink => throw _privateConstructorUsedError;
String get title => throw _privateConstructorUsedError;
String get author => throw _privateConstructorUsedError;
- List get imagePreviews => throw _privateConstructorUsedError;
@optionalTypeArgs
TResult when(
TResult Function(String sourceLink, String imageLink, String title,
String author, List imagePreviews)
$default, {
- required TResult Function(
- String title,
- String author,
- @JsonKey(name: 'image_reviews') List imagePreviews,
- @JsonKey(name: 'url') String imageLink,
- @JsonKey(name: 'post_link') String sourceLink,
- String subreddit,
- int ups,
- @JsonKey(name: 'spoilers_enabled') bool spoilersEnabled,
- bool nsfw)
+ required TResult Function(String title, String author, String imageLink,
+ String sourceLink, String subreddit, int ups, bool nsfw)
+ reddit,
+ }) =>
+ throw _privateConstructorUsedError;
+ @optionalTypeArgs
+ TResult? whenOrNull(
+ TResult Function(String sourceLink, String imageLink, String title,
+ String author, List imagePreviews)?
+ $default, {
+ TResult Function(String title, String author, String imageLink,
+ String sourceLink, String subreddit, int ups, bool nsfw)?
reddit,
}) =>
throw _privateConstructorUsedError;
@@ -105,16 +87,8 @@ mixin _$AbstractMemeModel {
TResult Function(String sourceLink, String imageLink, String title,
String author, List imagePreviews)?
$default, {
- TResult Function(
- String title,
- String author,
- @JsonKey(name: 'image_reviews') List imagePreviews,
- @JsonKey(name: 'url') String imageLink,
- @JsonKey(name: 'post_link') String sourceLink,
- String subreddit,
- int ups,
- @JsonKey(name: 'spoilers_enabled') bool spoilersEnabled,
- bool nsfw)?
+ TResult Function(String title, String author, String imageLink,
+ String sourceLink, String subreddit, int ups, bool nsfw)?
reddit,
required TResult orElse(),
}) =>
@@ -126,13 +100,19 @@ mixin _$AbstractMemeModel {
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
+ TResult? mapOrNull(
+ TResult Function(_AbstractMemeModel value)? $default, {
+ TResult Function(RedditMemeModel value)? reddit,
+ }) =>
+ throw _privateConstructorUsedError;
+ @optionalTypeArgs
TResult maybeMap(
TResult Function(_AbstractMemeModel value)? $default, {
TResult Function(RedditMemeModel value)? reddit,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
- Map toJson() => throw _privateConstructorUsedError;
+
@JsonKey(ignore: true)
$AbstractMemeModelCopyWith get copyWith =>
throw _privateConstructorUsedError;
@@ -143,12 +123,7 @@ abstract class $AbstractMemeModelCopyWith<$Res> {
factory $AbstractMemeModelCopyWith(
AbstractMemeModel value, $Res Function(AbstractMemeModel) then) =
_$AbstractMemeModelCopyWithImpl<$Res>;
- $Res call(
- {String sourceLink,
- String imageLink,
- String title,
- String author,
- List imagePreviews});
+ $Res call({String sourceLink, String imageLink, String title, String author});
}
/// @nodoc
@@ -166,7 +141,6 @@ class _$AbstractMemeModelCopyWithImpl<$Res>
Object? imageLink = freezed,
Object? title = freezed,
Object? author = freezed,
- Object? imagePreviews = freezed,
}) {
return _then(_value.copyWith(
sourceLink: sourceLink == freezed
@@ -185,10 +159,6 @@ class _$AbstractMemeModelCopyWithImpl<$Res>
? _value.author
: author // ignore: cast_nullable_to_non_nullable
as String,
- imagePreviews: imagePreviews == freezed
- ? _value.imagePreviews
- : imagePreviews // ignore: cast_nullable_to_non_nullable
- as List,
));
}
}
@@ -253,18 +223,14 @@ class __$AbstractMemeModelCopyWithImpl<$Res>
}
/// @nodoc
-@JsonSerializable()
-class _$_AbstractMemeModel extends _AbstractMemeModel {
+
+class _$_AbstractMemeModel implements _AbstractMemeModel {
_$_AbstractMemeModel(
{required this.sourceLink,
required this.imageLink,
required this.title,
required this.author,
- required this.imagePreviews})
- : super._();
-
- factory _$_AbstractMemeModel.fromJson(Map json) =>
- _$_$_AbstractMemeModelFromJson(json);
+ required this.imagePreviews});
@override
final String sourceLink;
@@ -321,37 +287,34 @@ class _$_AbstractMemeModel extends _AbstractMemeModel {
TResult Function(String sourceLink, String imageLink, String title,
String author, List imagePreviews)
$default, {
- required TResult Function(
- String title,
- String author,
- @JsonKey(name: 'image_reviews') List imagePreviews,
- @JsonKey(name: 'url') String imageLink,
- @JsonKey(name: 'post_link') String sourceLink,
- String subreddit,
- int ups,
- @JsonKey(name: 'spoilers_enabled') bool spoilersEnabled,
- bool nsfw)
+ required TResult Function(String title, String author, String imageLink,
+ String sourceLink, String subreddit, int ups, bool nsfw)
reddit,
}) {
return $default(sourceLink, imageLink, title, author, imagePreviews);
}
+ @override
+ @optionalTypeArgs
+ TResult? whenOrNull(
+ TResult Function(String sourceLink, String imageLink, String title,
+ String author, List imagePreviews)?
+ $default, {
+ TResult Function(String title, String author, String imageLink,
+ String sourceLink, String subreddit, int ups, bool nsfw)?
+ reddit,
+ }) {
+ return $default?.call(sourceLink, imageLink, title, author, imagePreviews);
+ }
+
@override
@optionalTypeArgs
TResult maybeWhen(
TResult Function(String sourceLink, String imageLink, String title,
String author, List imagePreviews)?
$default, {
- TResult Function(
- String title,
- String author,
- @JsonKey(name: 'image_reviews') List imagePreviews,
- @JsonKey(name: 'url') String imageLink,
- @JsonKey(name: 'post_link') String sourceLink,
- String subreddit,
- int ups,
- @JsonKey(name: 'spoilers_enabled') bool spoilersEnabled,
- bool nsfw)?
+ TResult Function(String title, String author, String imageLink,
+ String sourceLink, String subreddit, int ups, bool nsfw)?
reddit,
required TResult orElse(),
}) {
@@ -370,6 +333,15 @@ class _$_AbstractMemeModel extends _AbstractMemeModel {
return $default(this);
}
+ @override
+ @optionalTypeArgs
+ TResult? mapOrNull(
+ TResult Function(_AbstractMemeModel value)? $default, {
+ TResult Function(RedditMemeModel value)? reddit,
+ }) {
+ return $default?.call(this);
+ }
+
@override
@optionalTypeArgs
TResult maybeMap(
@@ -382,24 +354,15 @@ class _$_AbstractMemeModel extends _AbstractMemeModel {
}
return orElse();
}
-
- @override
- Map toJson() {
- return _$_$_AbstractMemeModelToJson(this)..['runtimeType'] = 'default';
- }
}
-abstract class _AbstractMemeModel extends AbstractMemeModel {
+abstract class _AbstractMemeModel implements AbstractMemeModel {
factory _AbstractMemeModel(
{required String sourceLink,
required String imageLink,
required String title,
required String author,
required List imagePreviews}) = _$_AbstractMemeModel;
- _AbstractMemeModel._() : super._();
-
- factory _AbstractMemeModel.fromJson(Map json) =
- _$_AbstractMemeModel.fromJson;
@override
String get sourceLink => throw _privateConstructorUsedError;
@@ -409,7 +372,6 @@ abstract class _AbstractMemeModel extends AbstractMemeModel {
String get title => throw _privateConstructorUsedError;
@override
String get author => throw _privateConstructorUsedError;
- @override
List get imagePreviews => throw _privateConstructorUsedError;
@override
@JsonKey(ignore: true)
@@ -427,12 +389,10 @@ abstract class $RedditMemeModelCopyWith<$Res>
$Res call(
{String title,
String author,
- @JsonKey(name: 'image_reviews') List imagePreviews,
- @JsonKey(name: 'url') String imageLink,
- @JsonKey(name: 'post_link') String sourceLink,
+ String imageLink,
+ String sourceLink,
String subreddit,
int ups,
- @JsonKey(name: 'spoilers_enabled') bool spoilersEnabled,
bool nsfw});
}
@@ -451,12 +411,10 @@ class _$RedditMemeModelCopyWithImpl<$Res>
$Res call({
Object? title = freezed,
Object? author = freezed,
- Object? imagePreviews = freezed,
Object? imageLink = freezed,
Object? sourceLink = freezed,
Object? subreddit = freezed,
Object? ups = freezed,
- Object? spoilersEnabled = freezed,
Object? nsfw = freezed,
}) {
return _then(RedditMemeModel(
@@ -468,10 +426,6 @@ class _$RedditMemeModelCopyWithImpl<$Res>
? _value.author
: author // ignore: cast_nullable_to_non_nullable
as String,
- imagePreviews: imagePreviews == freezed
- ? _value.imagePreviews
- : imagePreviews // ignore: cast_nullable_to_non_nullable
- as List,
imageLink: imageLink == freezed
? _value.imageLink
: imageLink // ignore: cast_nullable_to_non_nullable
@@ -488,10 +442,6 @@ class _$RedditMemeModelCopyWithImpl<$Res>
? _value.ups
: ups // ignore: cast_nullable_to_non_nullable
as int,
- spoilersEnabled: spoilersEnabled == freezed
- ? _value.spoilersEnabled
- : spoilersEnabled // ignore: cast_nullable_to_non_nullable
- as bool,
nsfw: nsfw == freezed
? _value.nsfw
: nsfw // ignore: cast_nullable_to_non_nullable
@@ -501,49 +451,35 @@ class _$RedditMemeModelCopyWithImpl<$Res>
}
/// @nodoc
-@JsonSerializable()
-class _$RedditMemeModel extends RedditMemeModel {
+
+class _$RedditMemeModel implements RedditMemeModel {
_$RedditMemeModel(
{required this.title,
required this.author,
- @JsonKey(name: 'image_reviews') required this.imagePreviews,
- @JsonKey(name: 'url') required this.imageLink,
- @JsonKey(name: 'post_link') required this.sourceLink,
+ required this.imageLink,
+ required this.sourceLink,
required this.subreddit,
required this.ups,
- @JsonKey(name: 'spoilers_enabled') required this.spoilersEnabled,
- required this.nsfw})
- : super._();
-
- factory _$RedditMemeModel.fromJson(Map json) =>
- _$_$RedditMemeModelFromJson(json);
+ required this.nsfw});
@override
final String title;
@override
final String author;
@override
- @JsonKey(name: 'image_reviews')
- final List imagePreviews;
- @override
- @JsonKey(name: 'url')
final String imageLink;
@override
- @JsonKey(name: 'post_link')
final String sourceLink;
@override
final String subreddit;
@override
final int ups;
@override
- @JsonKey(name: 'spoilers_enabled')
- final bool spoilersEnabled;
- @override
final bool nsfw;
@override
String toString() {
- return 'AbstractMemeModel.reddit(title: $title, author: $author, imagePreviews: $imagePreviews, imageLink: $imageLink, sourceLink: $sourceLink, subreddit: $subreddit, ups: $ups, spoilersEnabled: $spoilersEnabled, nsfw: $nsfw)';
+ return 'AbstractMemeModel.reddit(title: $title, author: $author, imageLink: $imageLink, sourceLink: $sourceLink, subreddit: $subreddit, ups: $ups, nsfw: $nsfw)';
}
@override
@@ -554,9 +490,6 @@ class _$RedditMemeModel extends RedditMemeModel {
const DeepCollectionEquality().equals(other.title, title)) &&
(identical(other.author, author) ||
const DeepCollectionEquality().equals(other.author, author)) &&
- (identical(other.imagePreviews, imagePreviews) ||
- const DeepCollectionEquality()
- .equals(other.imagePreviews, imagePreviews)) &&
(identical(other.imageLink, imageLink) ||
const DeepCollectionEquality()
.equals(other.imageLink, imageLink)) &&
@@ -568,9 +501,6 @@ class _$RedditMemeModel extends RedditMemeModel {
.equals(other.subreddit, subreddit)) &&
(identical(other.ups, ups) ||
const DeepCollectionEquality().equals(other.ups, ups)) &&
- (identical(other.spoilersEnabled, spoilersEnabled) ||
- const DeepCollectionEquality()
- .equals(other.spoilersEnabled, spoilersEnabled)) &&
(identical(other.nsfw, nsfw) ||
const DeepCollectionEquality().equals(other.nsfw, nsfw)));
}
@@ -580,12 +510,10 @@ class _$RedditMemeModel extends RedditMemeModel {
runtimeType.hashCode ^
const DeepCollectionEquality().hash(title) ^
const DeepCollectionEquality().hash(author) ^
- const DeepCollectionEquality().hash(imagePreviews) ^
const DeepCollectionEquality().hash(imageLink) ^
const DeepCollectionEquality().hash(sourceLink) ^
const DeepCollectionEquality().hash(subreddit) ^
const DeepCollectionEquality().hash(ups) ^
- const DeepCollectionEquality().hash(spoilersEnabled) ^
const DeepCollectionEquality().hash(nsfw);
@JsonKey(ignore: true)
@@ -599,20 +527,25 @@ class _$RedditMemeModel extends RedditMemeModel {
TResult Function(String sourceLink, String imageLink, String title,
String author, List imagePreviews)
$default, {
- required TResult Function(
- String title,
- String author,
- @JsonKey(name: 'image_reviews') List imagePreviews,
- @JsonKey(name: 'url') String imageLink,
- @JsonKey(name: 'post_link') String sourceLink,
- String subreddit,
- int ups,
- @JsonKey(name: 'spoilers_enabled') bool spoilersEnabled,
- bool nsfw)
+ required TResult Function(String title, String author, String imageLink,
+ String sourceLink, String subreddit, int ups, bool nsfw)
reddit,
}) {
- return reddit(title, author, imagePreviews, imageLink, sourceLink,
- subreddit, ups, spoilersEnabled, nsfw);
+ return reddit(title, author, imageLink, sourceLink, subreddit, ups, nsfw);
+ }
+
+ @override
+ @optionalTypeArgs
+ TResult? whenOrNull(
+ TResult Function(String sourceLink, String imageLink, String title,
+ String author, List imagePreviews)?
+ $default, {
+ TResult Function(String title, String author, String imageLink,
+ String sourceLink, String subreddit, int ups, bool nsfw)?
+ reddit,
+ }) {
+ return reddit?.call(
+ title, author, imageLink, sourceLink, subreddit, ups, nsfw);
}
@override
@@ -621,22 +554,13 @@ class _$RedditMemeModel extends RedditMemeModel {
TResult Function(String sourceLink, String imageLink, String title,
String author, List imagePreviews)?
$default, {
- TResult Function(
- String title,
- String author,
- @JsonKey(name: 'image_reviews') List imagePreviews,
- @JsonKey(name: 'url') String imageLink,
- @JsonKey(name: 'post_link') String sourceLink,
- String subreddit,
- int ups,
- @JsonKey(name: 'spoilers_enabled') bool spoilersEnabled,
- bool nsfw)?
+ TResult Function(String title, String author, String imageLink,
+ String sourceLink, String subreddit, int ups, bool nsfw)?
reddit,
required TResult orElse(),
}) {
if (reddit != null) {
- return reddit(title, author, imagePreviews, imageLink, sourceLink,
- subreddit, ups, spoilersEnabled, nsfw);
+ return reddit(title, author, imageLink, sourceLink, subreddit, ups, nsfw);
}
return orElse();
}
@@ -650,6 +574,15 @@ class _$RedditMemeModel extends RedditMemeModel {
return reddit(this);
}
+ @override
+ @optionalTypeArgs
+ TResult? mapOrNull(
+ TResult Function(_AbstractMemeModel value)? $default, {
+ TResult Function(RedditMemeModel value)? reddit,
+ }) {
+ return reddit?.call(this);
+ }
+
@override
@optionalTypeArgs
TResult maybeMap(
@@ -662,46 +595,28 @@ class _$RedditMemeModel extends RedditMemeModel {
}
return orElse();
}
-
- @override
- Map toJson() {
- return _$_$RedditMemeModelToJson(this)..['runtimeType'] = 'reddit';
- }
}
-abstract class RedditMemeModel extends AbstractMemeModel {
+abstract class RedditMemeModel implements AbstractMemeModel {
factory RedditMemeModel(
{required String title,
required String author,
- @JsonKey(name: 'image_reviews') required List imagePreviews,
- @JsonKey(name: 'url') required String imageLink,
- @JsonKey(name: 'post_link') required String sourceLink,
+ required String imageLink,
+ required String sourceLink,
required String subreddit,
required int ups,
- @JsonKey(name: 'spoilers_enabled') required bool spoilersEnabled,
required bool nsfw}) = _$RedditMemeModel;
- RedditMemeModel._() : super._();
-
- factory RedditMemeModel.fromJson(Map json) =
- _$RedditMemeModel.fromJson;
@override
String get title => throw _privateConstructorUsedError;
@override
String get author => throw _privateConstructorUsedError;
@override
- @JsonKey(name: 'image_reviews')
- List get imagePreviews => throw _privateConstructorUsedError;
- @override
- @JsonKey(name: 'url')
String get imageLink => throw _privateConstructorUsedError;
@override
- @JsonKey(name: 'post_link')
String get sourceLink => throw _privateConstructorUsedError;
String get subreddit => throw _privateConstructorUsedError;
int get ups => throw _privateConstructorUsedError;
- @JsonKey(name: 'spoilers_enabled')
- bool get spoilersEnabled => throw _privateConstructorUsedError;
bool get nsfw => throw _privateConstructorUsedError;
@override
@JsonKey(ignore: true)
diff --git a/lib/domain/meme/abstract_meme_model.g.dart b/lib/domain/meme/abstract_meme_model.g.dart
deleted file mode 100644
index 9a68473..0000000
--- a/lib/domain/meme/abstract_meme_model.g.dart
+++ /dev/null
@@ -1,58 +0,0 @@
-// GENERATED CODE - DO NOT MODIFY BY HAND
-
-part of 'abstract_meme_model.dart';
-
-// **************************************************************************
-// JsonSerializableGenerator
-// **************************************************************************
-
-_$_AbstractMemeModel _$_$_AbstractMemeModelFromJson(Map json) {
- return _$_AbstractMemeModel(
- sourceLink: json['sourceLink'] as String,
- imageLink: json['imageLink'] as String,
- title: json['title'] as String,
- author: json['author'] as String,
- imagePreviews: (json['imagePreviews'] as List)
- .map((e) => e as String)
- .toList(),
- );
-}
-
-Map _$_$_AbstractMemeModelToJson(
- _$_AbstractMemeModel instance) =>
- {
- 'sourceLink': instance.sourceLink,
- 'imageLink': instance.imageLink,
- 'title': instance.title,
- 'author': instance.author,
- 'imagePreviews': instance.imagePreviews,
- };
-
-_$RedditMemeModel _$_$RedditMemeModelFromJson(Map json) {
- return _$RedditMemeModel(
- title: json['title'] as String,
- author: json['author'] as String,
- imagePreviews: (json['image_reviews'] as List)
- .map((e) => e as String)
- .toList(),
- imageLink: json['url'] as String,
- sourceLink: json['post_link'] as String,
- subreddit: json['subreddit'] as String,
- ups: json['ups'] as int,
- spoilersEnabled: json['spoilers_enabled'] as bool,
- nsfw: json['nsfw'] as bool,
- );
-}
-
-Map _$_$RedditMemeModelToJson(_$RedditMemeModel instance) =>
- {
- 'title': instance.title,
- 'author': instance.author,
- 'image_reviews': instance.imagePreviews,
- 'url': instance.imageLink,
- 'post_link': instance.sourceLink,
- 'subreddit': instance.subreddit,
- 'ups': instance.ups,
- 'spoilers_enabled': instance.spoilersEnabled,
- 'nsfw': instance.nsfw,
- };
diff --git a/lib/infrastructure/api/reddit/reddit_api.dart b/lib/infrastructure/api/reddit/reddit_api.dart
new file mode 100644
index 0000000..bbb4e8d
--- /dev/null
+++ b/lib/infrastructure/api/reddit/reddit_api.dart
@@ -0,0 +1,70 @@
+import 'package:devour/domain/auth/reddit_account.dart';
+import 'package:devour/domain/repositories/account_repository.dart';
+import 'package:devour/infrastructure/api/reddit/reddit_auth_api.dart';
+import 'package:devour/infrastructure/api/reddit/response/reddit_responses.dart';
+import 'package:devour/infrastructure/register_module.dart';
+import 'package:devour/injection.dart';
+import 'package:dio/dio.dart';
+import 'package:injectable/injectable.dart';
+import 'package:retrofit/retrofit.dart';
+
+part 'reddit_api.g.dart';
+
+@singleton
+@RestApi(baseUrl: 'https://oauth.reddit.com')
+abstract class RedditAPI {
+ @factoryMethod
+ factory RedditAPI(@Named(kRedditDioName) Dio dio) = _RedditAPI;
+
+ // /r/subbreddit/random
+ // /r/subbreddit/sort (top, controversial)
+
+ /// Grabs posts from /r/[subreddit] (memes) by default. [after] and [before] are
+ /// used for navigation, [limit] for number of posts.
+ @GET('/r/{subreddit}')
+ Future _getMemes({
+ @Query('after') String? after,
+ @Query('before') String? before,
+ @Query('count') int? count,
+ @Query('limit') int? limit,
+ @Path('subreddit') String subreddit = 'memes',
+ });
+
+ static Interceptor getAuthenticationTokenInterceptor() =>
+ AuthenticationTokenInterceptor();
+}
+
+extension RedditAPIWrapper on RedditAPI {
+ Future getMemes({
+ String? after,
+ String? before,
+ int? count,
+ int? limit,
+ String subreddit = 'memes',
+ }) =>
+ _getMemes(
+ after: after,
+ before: before,
+ count: count,
+ limit: limit,
+ subreddit: subreddit,
+ ).then((it) => it.data as RedditListingResponse);
+}
+
+class AuthenticationTokenInterceptor extends Interceptor {
+ AuthenticationTokenInterceptor();
+
+ @override
+ void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
+ if (options.path != kAccessTokenPath) {
+ final account =
+ serviceLocator().getAccount();
+ if (account.isSome()) {
+ options.headers['Authorization'] =
+ 'bearer ${account.toNullable()!.accessToken}';
+ }
+ }
+
+ handler.next(options);
+ }
+}
diff --git a/lib/infrastructure/api/reddit/reddit_api.g.dart b/lib/infrastructure/api/reddit/reddit_api.g.dart
new file mode 100644
index 0000000..485b829
--- /dev/null
+++ b/lib/infrastructure/api/reddit/reddit_api.g.dart
@@ -0,0 +1,52 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'reddit_api.dart';
+
+// **************************************************************************
+// RetrofitGenerator
+// **************************************************************************
+
+class _RedditAPI implements RedditAPI {
+ _RedditAPI(this._dio, {this.baseUrl}) {
+ baseUrl ??= 'https://oauth.reddit.com';
+ }
+
+ final Dio _dio;
+
+ String? baseUrl;
+
+ @override
+ Future> _getMemes(
+ {after, before, count, limit, subreddit = 'memes'}) async {
+ const _extra = {};
+ final queryParameters = {
+ r'after': after,
+ r'before': before,
+ r'count': count,
+ r'limit': limit
+ };
+ queryParameters.removeWhere((k, v) => v == null);
+ final _data = {};
+ final _result = await _dio.fetch