fixed Trakt refresh token

- now refreshes expired tokens at startup
- prevents accidental logouts for users who has the tracking screen as default navigation
This commit is contained in:
Schnitzel5 2025-08-27 18:21:22 +02:00
parent 40a0e080f9
commit 4d89cfe32b
27 changed files with 1126 additions and 2851 deletions

View file

@ -18,7 +18,10 @@ import 'package:mangayomi/models/custom_button.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/settings.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/models/track.dart' as track;
import 'package:mangayomi/models/track_preference.dart';
import 'package:mangayomi/models/track_search.dart';
import 'package:mangayomi/modules/manga/detail/providers/track_state_providers.dart';
import 'package:mangayomi/modules/more/data_and_storage/providers/storage_usage.dart';
import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart';
import 'package:mangayomi/modules/more/settings/general/providers/general_state_provider.dart';
@ -101,12 +104,13 @@ class _MyAppState extends ConsumerState<MyApp> {
void initState() {
super.initState();
initializeDateFormatting();
customDns = ref.read(customDnsStateProvider);
_checkTrackerRefresh();
_initDeepLinks();
_setupMpvConfig();
unawaited(ref.read(scanLocalLibraryProvider.future));
WidgetsBinding.instance.addPostFrameCallback((_) {
customDns = ref.read(customDnsStateProvider);
if (ref.read(clearChapterCacheOnAppLaunchStateProvider)) {
ref
.read(totalChapterCacheSizeStateProvider.notifier)
@ -341,6 +345,22 @@ class _MyAppState extends ConsumerState<MyApp> {
}
}
}
Future<void> _checkTrackerRefresh() async {
final prefs = await isar.trackPreferences
.filter()
.syncIdIsNotNull()
.findAll();
for (final pref in prefs) {
final temp = track.Track(
syncId: pref.syncId,
status: track.TrackStatus.completed,
);
ref
.read(trackStateProvider(track: temp, itemType: null).notifier)
.checkRefresh();
}
}
}
class AllowScrollBehavior extends MaterialScrollBehavior {

View file

@ -12,7 +12,15 @@ class TrackPreference {
String? prefs;
TrackPreference({this.syncId, this.username, this.oAuth, this.prefs});
bool? refreshing;
TrackPreference({
this.syncId,
this.username,
this.oAuth,
this.prefs,
this.refreshing,
});
TrackPreference.fromJson(Map<String, dynamic> json) {
syncId = json['syncId'];

View file

@ -19,8 +19,13 @@ const TrackPreferenceSchema = CollectionSchema(
properties: {
r'oAuth': PropertySchema(id: 0, name: r'oAuth', type: IsarType.string),
r'prefs': PropertySchema(id: 1, name: r'prefs', type: IsarType.string),
r'username': PropertySchema(
r'refreshing': PropertySchema(
id: 2,
name: r'refreshing',
type: IsarType.bool,
),
r'username': PropertySchema(
id: 3,
name: r'username',
type: IsarType.string,
),
@ -76,7 +81,8 @@ void _trackPreferenceSerialize(
) {
writer.writeString(offsets[0], object.oAuth);
writer.writeString(offsets[1], object.prefs);
writer.writeString(offsets[2], object.username);
writer.writeBool(offsets[2], object.refreshing);
writer.writeString(offsets[3], object.username);
}
TrackPreference _trackPreferenceDeserialize(
@ -88,8 +94,9 @@ TrackPreference _trackPreferenceDeserialize(
final object = TrackPreference(
oAuth: reader.readStringOrNull(offsets[0]),
prefs: reader.readStringOrNull(offsets[1]),
refreshing: reader.readBoolOrNull(offsets[2]),
syncId: id,
username: reader.readStringOrNull(offsets[2]),
username: reader.readStringOrNull(offsets[3]),
);
return object;
}
@ -106,6 +113,8 @@ P _trackPreferenceDeserializeProp<P>(
case 1:
return (reader.readStringOrNull(offset)) as P;
case 2:
return (reader.readBoolOrNull(offset)) as P;
case 3:
return (reader.readStringOrNull(offset)) as P;
default:
throw IsarError('Unknown property with id $propertyId');
@ -529,6 +538,33 @@ extension TrackPreferenceQueryFilter
});
}
QueryBuilder<TrackPreference, TrackPreference, QAfterFilterCondition>
refreshingIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const FilterCondition.isNull(property: r'refreshing'),
);
});
}
QueryBuilder<TrackPreference, TrackPreference, QAfterFilterCondition>
refreshingIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
const FilterCondition.isNotNull(property: r'refreshing'),
);
});
}
QueryBuilder<TrackPreference, TrackPreference, QAfterFilterCondition>
refreshingEqualTo(bool? value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(
FilterCondition.equalTo(property: r'refreshing', value: value),
);
});
}
QueryBuilder<TrackPreference, TrackPreference, QAfterFilterCondition>
syncIdIsNull() {
return QueryBuilder.apply(this, (query) {
@ -796,6 +832,20 @@ extension TrackPreferenceQuerySortBy
});
}
QueryBuilder<TrackPreference, TrackPreference, QAfterSortBy>
sortByRefreshing() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'refreshing', Sort.asc);
});
}
QueryBuilder<TrackPreference, TrackPreference, QAfterSortBy>
sortByRefreshingDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'refreshing', Sort.desc);
});
}
QueryBuilder<TrackPreference, TrackPreference, QAfterSortBy>
sortByUsername() {
return QueryBuilder.apply(this, (query) {
@ -839,6 +889,20 @@ extension TrackPreferenceQuerySortThenBy
});
}
QueryBuilder<TrackPreference, TrackPreference, QAfterSortBy>
thenByRefreshing() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'refreshing', Sort.asc);
});
}
QueryBuilder<TrackPreference, TrackPreference, QAfterSortBy>
thenByRefreshingDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'refreshing', Sort.desc);
});
}
QueryBuilder<TrackPreference, TrackPreference, QAfterSortBy> thenBySyncId() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'syncId', Sort.asc);
@ -885,6 +949,13 @@ extension TrackPreferenceQueryWhereDistinct
});
}
QueryBuilder<TrackPreference, TrackPreference, QDistinct>
distinctByRefreshing() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'refreshing');
});
}
QueryBuilder<TrackPreference, TrackPreference, QDistinct> distinctByUsername({
bool caseSensitive = true,
}) {
@ -914,6 +985,12 @@ extension TrackPreferenceQueryProperty
});
}
QueryBuilder<TrackPreference, bool?, QQueryOperations> refreshingProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'refreshing');
});
}
QueryBuilder<TrackPreference, String?, QQueryOperations> usernameProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'username');

View file

@ -6,7 +6,7 @@ part of 'calendar_provider.dart';
// RiverpodGenerator
// **************************************************************************
String _$getCalendarStreamHash() => r'dcdad165b2da2420bafa8b70c4b3a0fb336e5021';
String _$getCalendarStreamHash() => r'850d81742f8ac5ce88175732c0edf57a7a9295d4';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -169,6 +169,12 @@ class TrackState extends _$TrackState {
final tracker = getNotifier(syncId);
return await tracker.fetchUserData(isManga: _isManga);
}
Future<bool> checkRefresh() async {
final syncId = track!.syncId!;
final tracker = getNotifier(syncId);
return await tracker.checkRefresh();
}
}
@riverpod

View file

@ -6,7 +6,7 @@ part of 'track_state_providers.dart';
// RiverpodGenerator
// **************************************************************************
String _$trackStateHash() => r'0b2fa471cb843d5880f921f1c721a05b54bc1515';
String _$trackStateHash() => r'19fcc38b559996509aa71645de9531bc4b2d4205';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -6,7 +6,7 @@ part of 'backup.dart';
// RiverpodGenerator
// **************************************************************************
String _$doBackUpHash() => r'a570fe00421ee352ea170440ce27b258cf9ddc15';
String _$doBackUpHash() => r'd16d5b6e5ed2c20988fa2d49842524d70ac0ed0d';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -16,6 +16,15 @@ class Tracks extends _$Tracks {
return isar.trackPreferences.getSync(syncId!);
}
void setRefreshing(bool refreshing) {
if (state != null) {
state!.refreshing = refreshing;
isar.writeTxnSync(() {
isar.trackPreferences.putSync(state!);
});
}
}
void login(TrackPreference trackPreference) {
isar.writeTxnSync(() {
isar.trackPreferences.putSync(trackPreference);

View file

@ -6,7 +6,7 @@ part of 'track_providers.dart';
// RiverpodGenerator
// **************************************************************************
String _$tracksHash() => r'71db9b803345d0b31c8efba0538a68fea356a71f';
String _$tracksHash() => r'05f1531a3200b0ad9f1e4bf74cd9eb44301f9f21';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -163,9 +163,11 @@ class _TrackerLibraryScreenState extends ConsumerState<TrackerLibraryScreen> {
body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 5),
child: StreamBuilder(
stream: isar.trackPreferences.filter().syncIdIsNotNull().watch(
fireImmediately: true,
),
stream: isar.trackPreferences
.filter()
.syncIdIsNotNull()
.anyOf([false, null], (q, e) => q.refreshingEqualTo(e))
.watch(fireImmediately: true),
builder: (context, snapshot) {
_preferences = snapshot.hasData ? snapshot.data ?? [] : [];
return _preferences.any((p) => p.syncId == trackerProvider.syncId)
@ -207,6 +209,13 @@ class _TrackerLibraryScreenState extends ConsumerState<TrackerLibraryScreen> {
TrackerProviders trackerProvider,
ItemType itemType,
) async {
final temp = Track(
syncId: trackerProvider.syncId,
status: TrackStatus.completed,
);
await ref
.read(trackStateProvider(track: temp, itemType: null).notifier)
.checkRefresh();
final box = await Hive.openBox("tracker_library");
final keys = box.keys.where(
(e) => (e as String).startsWith(

View file

@ -201,6 +201,16 @@ class StorageProvider {
});
}
final prefs = await isar.trackPreferences
.filter()
.syncIdIsNotNull()
.findAll();
await isar.writeTxn(() async {
for (final pref in prefs) {
await isar.trackPreferences.put(pref..refreshing = true);
}
});
final customButton = await isar.customButtons
.filter()
.idIsNotNull()

View file

@ -6,7 +6,7 @@ part of 'aniskip.dart';
// RiverpodGenerator
// **************************************************************************
String _$aniSkipHash() => r'887869b54e2e151633efd46da83bde845e14f421';
String _$aniSkipHash() => r'2e5d19b025a2207ff64da7bf7908450ea9e5ff8c';
/// See also [AniSkip].
@ProviderFor(AniSkip)

View file

@ -127,24 +127,30 @@ class RhttpUnknownException extends RhttpException {
}
RhttpException parseError(HttpRequest request, rust.RhttpError error) {
return error.when(
rhttpCancelError: () => RhttpCancelException(request),
rhttpTimeoutError: () => RhttpTimeoutException(request),
rhttpRedirectError: () => RhttpRedirectException(request),
rhttpStatusCodeError: (code, headers, body) => RhttpStatusCodeException(
request: request,
statusCode: code,
headers: headers,
body: switch (body) {
rust_http.HttpResponseBody_Text() => body.field0,
rust_http.HttpResponseBody_Bytes() => body.field0,
rust_http.HttpResponseBody_Stream() => null,
},
),
rhttpInvalidCertificateError: (message) =>
RhttpInvalidCertificateException(request: request, message: message),
rhttpConnectionError: (message) =>
RhttpConnectionException(request, message),
rhttpUnknownError: (message) => RhttpUnknownException(request, message),
);
return switch (error) {
rust.RhttpError_RhttpCancelError() => RhttpCancelException(request),
rust.RhttpError_RhttpTimeoutError() => RhttpTimeoutException(request),
rust.RhttpError_RhttpRedirectError() => RhttpRedirectException(request),
rust.RhttpError_RhttpStatusCodeError(
field0: final code,
field1: final headers,
field2: final body,
) =>
RhttpStatusCodeException(
request: request,
statusCode: code,
headers: headers,
body: switch (body) {
rust_http.HttpResponseBody_Text() => body.field0,
rust_http.HttpResponseBody_Bytes() => body.field0,
rust_http.HttpResponseBody_Stream() => null,
},
),
rust.RhttpError_RhttpInvalidCertificateError(field0: final message) =>
RhttpInvalidCertificateException(request: request, message: message),
rust.RhttpError_RhttpConnectionError(field0: final message) =>
RhttpConnectionException(request, message),
rust.RhttpError_RhttpUnknownError(field0: final message) =>
RhttpUnknownException(request, message),
};
}

View file

@ -535,4 +535,10 @@ class Anilist extends _$Anilist implements BaseTracker {
_ => (100, 1),
};
}
@override
Future<bool> checkRefresh() async {
ref.read(tracksProvider(syncId: syncId).notifier).setRefreshing(false);
return true;
}
}

View file

@ -6,7 +6,7 @@ part of 'anilist.dart';
// RiverpodGenerator
// **************************************************************************
String _$anilistHash() => r'c786a526fdacc875e4a7e00886b2bda546eafeae';
String _$anilistHash() => r'f6d46f4e330f1461ef18242a5e86589cb7a165c5';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -2,6 +2,7 @@ import 'package:mangayomi/models/track.dart';
import 'package:mangayomi/models/track_search.dart';
abstract class BaseTracker {
Future<bool> checkRefresh();
Future<Track?> findLibItem(Track track, bool isManga);
Future<Track> update(Track track, bool isManga);
List<TrackStatus> statusList(bool isManga);

View file

@ -428,4 +428,10 @@ class Kitsu extends _$Kitsu implements BaseTracker {
(int, int) getScoreValue() {
throw UnimplementedError();
}
@override
Future<bool> checkRefresh() async {
ref.read(tracksProvider(syncId: syncId).notifier).setRefreshing(false);
return true;
}
}

View file

@ -6,7 +6,7 @@ part of 'kitsu.dart';
// RiverpodGenerator
// **************************************************************************
String _$kitsuHash() => r'3f6af42dd0bb3fe543197db692598384ca5cc95f';
String _$kitsuHash() => r'0c560ca99e2858b38af183491303d9cdcc9c0d92';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -12,6 +12,7 @@ import 'package:mangayomi/models/track_search.dart';
import 'package:mangayomi/modules/more/settings/track/myanimelist/model.dart';
import 'package:mangayomi/modules/more/settings/track/providers/track_providers.dart';
import 'package:mangayomi/services/http/m_client.dart';
import 'package:mangayomi/utils/log/logger.dart';
import 'base_tracker.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'myanimelist.g.dart';
@ -59,13 +60,18 @@ class MyAnimeList extends _$MyAnimeList implements BaseTracker {
}
}
Future<String> _getAccessToken() async {
Future<String> _getAccessToken({bool bypass = false}) async {
final track = ref.read(tracksProvider(syncId: syncId));
final mALOAuth = OAuth.fromJson(
jsonDecode(track!.oAuth!) as Map<String, dynamic>,
);
final expiresIn = DateTime.fromMillisecondsSinceEpoch(mALOAuth.expiresIn!);
if (DateTime.now().isBefore(expiresIn)) return mALOAuth.accessToken!;
if (!bypass &&
(ref.read(tracksProvider(syncId: syncId))?.refreshing ?? false)) {
return mALOAuth.accessToken!;
}
ref.read(tracksProvider(syncId: syncId).notifier).setRefreshing(true);
final refreshed = await _tryRefreshToken(mALOAuth);
if (refreshed == null) {
ref.read(tracksProvider(syncId: syncId).notifier).logout();
@ -74,6 +80,8 @@ class MyAnimeList extends _$MyAnimeList implements BaseTracker {
}
final username = await _getUserName(refreshed.accessToken!);
_saveOAuth(username, refreshed);
await Future.delayed(Duration(seconds: 3));
ref.read(tracksProvider(syncId: syncId).notifier).setRefreshing(false);
return refreshed.accessToken!;
}
@ -438,14 +446,29 @@ class MyAnimeList extends _$MyAnimeList implements BaseTracker {
headers: {'Authorization': 'Bearer $accessToken'},
);
}
@override
String displayScore(int score) {
throw UnimplementedError();
}
@override
(int, int) getScoreValue() {
throw UnimplementedError();
}
@override
Future<bool> checkRefresh() async {
try {
await _getAccessToken(bypass: true);
AppLogger.log("Refreshed MAL token!");
return true;
} catch (e) {
AppLogger.log("Failed to refresh MAL token:", logLevel: LogLevel.error);
AppLogger.log(e.toString(), logLevel: LogLevel.error);
return false;
} finally {
ref.read(tracksProvider(syncId: syncId).notifier).setRefreshing(false);
}
}
}

View file

@ -6,7 +6,7 @@ part of 'myanimelist.dart';
// RiverpodGenerator
// **************************************************************************
String _$myAnimeListHash() => r'9846f76ce69f952d20cc1e8edbc5ca565cd4e7c9';
String _$myAnimeListHash() => r'c6812dbc8c56494e4776f80a2b0f402bf5e00996';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -418,4 +418,10 @@ class Simkl extends _$Simkl implements BaseTracker {
(int, int) getScoreValue() {
throw UnimplementedError();
}
@override
Future<bool> checkRefresh() async {
ref.read(tracksProvider(syncId: syncId).notifier).setRefreshing(false);
return true;
}
}

View file

@ -6,7 +6,7 @@ part of 'simkl.dart';
// RiverpodGenerator
// **************************************************************************
String _$simklHash() => r'3b8ff48675ba743d39aef595dc6cd70f4bd404cf';
String _$simklHash() => r'b55f4a85c66fbb4456e0499f15376d314cd0bf90';
/// Copied from Dart SDK
class _SystemHash {
@ -33,10 +33,7 @@ abstract class _$Simkl extends BuildlessAutoDisposeNotifier<void> {
late final int syncId;
late final ItemType? itemType;
void build({
required int syncId,
required ItemType? itemType,
});
void build({required int syncId, required ItemType? itemType});
}
/// See also [Simkl].
@ -49,24 +46,13 @@ class SimklFamily extends Family<void> {
const SimklFamily();
/// See also [Simkl].
SimklProvider call({
required int syncId,
required ItemType? itemType,
}) {
return SimklProvider(
syncId: syncId,
itemType: itemType,
);
SimklProvider call({required int syncId, required ItemType? itemType}) {
return SimklProvider(syncId: syncId, itemType: itemType);
}
@override
SimklProvider getProviderOverride(
covariant SimklProvider provider,
) {
return call(
syncId: provider.syncId,
itemType: provider.itemType,
);
SimklProvider getProviderOverride(covariant SimklProvider provider) {
return call(syncId: provider.syncId, itemType: provider.itemType);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@ -87,24 +73,21 @@ class SimklFamily extends Family<void> {
/// See also [Simkl].
class SimklProvider extends AutoDisposeNotifierProviderImpl<Simkl, void> {
/// See also [Simkl].
SimklProvider({
required int syncId,
required ItemType? itemType,
}) : this._internal(
() => Simkl()
..syncId = syncId
..itemType = itemType,
from: simklProvider,
name: r'simklProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$simklHash,
dependencies: SimklFamily._dependencies,
allTransitiveDependencies: SimklFamily._allTransitiveDependencies,
syncId: syncId,
itemType: itemType,
);
SimklProvider({required int syncId, required ItemType? itemType})
: this._internal(
() => Simkl()
..syncId = syncId
..itemType = itemType,
from: simklProvider,
name: r'simklProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$simklHash,
dependencies: SimklFamily._dependencies,
allTransitiveDependencies: SimklFamily._allTransitiveDependencies,
syncId: syncId,
itemType: itemType,
);
SimklProvider._internal(
super._createNotifier, {
@ -121,13 +104,8 @@ class SimklProvider extends AutoDisposeNotifierProviderImpl<Simkl, void> {
final ItemType? itemType;
@override
void runNotifierBuild(
covariant Simkl notifier,
) {
return notifier.build(
syncId: syncId,
itemType: itemType,
);
void runNotifierBuild(covariant Simkl notifier) {
return notifier.build(syncId: syncId, itemType: itemType);
}
@override
@ -182,7 +160,8 @@ mixin SimklRef on AutoDisposeNotifierProviderRef<void> {
}
class _SimklProviderElement
extends AutoDisposeNotifierProviderElement<Simkl, void> with SimklRef {
extends AutoDisposeNotifierProviderElement<Simkl, void>
with SimklRef {
_SimklProviderElement(super.provider);
@override
@ -190,5 +169,6 @@ class _SimklProviderElement
@override
ItemType? get itemType => (origin as SimklProvider).itemType;
}
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package

View file

@ -10,6 +10,7 @@ import 'package:mangayomi/models/track_search.dart';
import 'package:mangayomi/modules/more/settings/track/myanimelist/model.dart';
import 'package:mangayomi/modules/more/settings/track/providers/track_providers.dart';
import 'package:mangayomi/services/http/m_client.dart';
import 'package:mangayomi/utils/log/logger.dart';
import 'base_tracker.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'trakt_tv.g.dart';
@ -293,13 +294,18 @@ class TraktTv extends _$TraktTv implements BaseTracker {
return track;
}
Future<String> _getAccessToken() async {
Future<String> _getAccessToken({bool bypass = false}) async {
final track = ref.read(tracksProvider(syncId: syncId));
final mALOAuth = OAuth.fromJson(
jsonDecode(track!.oAuth!) as Map<String, dynamic>,
);
final expiresIn = DateTime.fromMillisecondsSinceEpoch(mALOAuth.expiresIn!);
if (DateTime.now().isBefore(expiresIn)) return mALOAuth.accessToken!;
if (!bypass &&
(ref.read(tracksProvider(syncId: syncId))?.refreshing ?? false)) {
return mALOAuth.accessToken!;
}
ref.read(tracksProvider(syncId: syncId).notifier).setRefreshing(true);
final refreshed = await _tryRefreshToken(mALOAuth);
if (refreshed == null) {
ref.read(tracksProvider(syncId: syncId).notifier).logout();
@ -308,6 +314,8 @@ class TraktTv extends _$TraktTv implements BaseTracker {
}
final username = await _getUserName(refreshed.accessToken!);
_saveOAuth(username, refreshed);
await Future.delayed(Duration(seconds: 3));
ref.read(tracksProvider(syncId: syncId).notifier).setRefreshing(false);
return refreshed.accessToken!;
}
@ -315,16 +323,17 @@ class TraktTv extends _$TraktTv implements BaseTracker {
String primaryClientId = oldOAuth.clientId ?? _clientId;
Future<OAuth?> tryRefresh(String cid) async {
final params = {
'refresh_token': oldOAuth.refreshToken,
'client_id': cid,
'client_secret': _clientSecret,
'redirect_uri': _redirectUri,
'grant_type': 'refresh_token',
};
final response = await http.post(
Uri.parse('$_baseOAuthUrl/token'),
body: {
'refresh_token': oldOAuth.refreshToken,
'client_id': cid,
'client_secret': _clientSecret,
'redirect_uri': _redirectUri,
'grant_type': 'refresh_token',
},
headers: {'Content-Type': 'application/json'},
body: jsonEncode(params),
);
if (response.statusCode != 200) return null;
final body = jsonDecode(response.body) as Map<String, dynamic>;
@ -377,7 +386,7 @@ class TraktTv extends _$TraktTv implements BaseTracker {
'grant_type': 'authorization_code',
};
final response = await http.post(
Uri.parse('$_baseApiUrl/oauth/token'),
Uri.parse('$_baseOAuthUrl/token'),
headers: {'Content-Type': 'application/json'},
body: jsonEncode(params),
);
@ -422,4 +431,22 @@ class TraktTv extends _$TraktTv implements BaseTracker {
(int, int) getScoreValue() {
throw UnimplementedError();
}
@override
Future<bool> checkRefresh() async {
try {
await _getAccessToken(bypass: true);
AppLogger.log("Refreshed Trakt.tv token!");
return true;
} catch (e) {
AppLogger.log(
"Failed to refresh Trakt.tv token:",
logLevel: LogLevel.error,
);
AppLogger.log(e.toString(), logLevel: LogLevel.error);
return false;
} finally {
ref.read(tracksProvider(syncId: syncId).notifier).setRefreshing(false);
}
}
}

View file

@ -6,7 +6,7 @@ part of 'trakt_tv.dart';
// RiverpodGenerator
// **************************************************************************
String _$traktTvHash() => r'de97ae0edbc905d07af2ce8758441fba6cdd7be2';
String _$traktTvHash() => r'1ae8a5c79cb6b5fc6c5d9db61ed9307deeb450ed';
/// Copied from Dart SDK
class _SystemHash {
@ -33,10 +33,7 @@ abstract class _$TraktTv extends BuildlessAutoDisposeNotifier<void> {
late final int syncId;
late final ItemType? itemType;
void build({
required int syncId,
required ItemType? itemType,
});
void build({required int syncId, required ItemType? itemType});
}
/// See also [TraktTv].
@ -49,24 +46,13 @@ class TraktTvFamily extends Family<void> {
const TraktTvFamily();
/// See also [TraktTv].
TraktTvProvider call({
required int syncId,
required ItemType? itemType,
}) {
return TraktTvProvider(
syncId: syncId,
itemType: itemType,
);
TraktTvProvider call({required int syncId, required ItemType? itemType}) {
return TraktTvProvider(syncId: syncId, itemType: itemType);
}
@override
TraktTvProvider getProviderOverride(
covariant TraktTvProvider provider,
) {
return call(
syncId: provider.syncId,
itemType: provider.itemType,
);
TraktTvProvider getProviderOverride(covariant TraktTvProvider provider) {
return call(syncId: provider.syncId, itemType: provider.itemType);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@ -87,24 +73,21 @@ class TraktTvFamily extends Family<void> {
/// See also [TraktTv].
class TraktTvProvider extends AutoDisposeNotifierProviderImpl<TraktTv, void> {
/// See also [TraktTv].
TraktTvProvider({
required int syncId,
required ItemType? itemType,
}) : this._internal(
() => TraktTv()
..syncId = syncId
..itemType = itemType,
from: traktTvProvider,
name: r'traktTvProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$traktTvHash,
dependencies: TraktTvFamily._dependencies,
allTransitiveDependencies: TraktTvFamily._allTransitiveDependencies,
syncId: syncId,
itemType: itemType,
);
TraktTvProvider({required int syncId, required ItemType? itemType})
: this._internal(
() => TraktTv()
..syncId = syncId
..itemType = itemType,
from: traktTvProvider,
name: r'traktTvProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$traktTvHash,
dependencies: TraktTvFamily._dependencies,
allTransitiveDependencies: TraktTvFamily._allTransitiveDependencies,
syncId: syncId,
itemType: itemType,
);
TraktTvProvider._internal(
super._createNotifier, {
@ -121,13 +104,8 @@ class TraktTvProvider extends AutoDisposeNotifierProviderImpl<TraktTv, void> {
final ItemType? itemType;
@override
void runNotifierBuild(
covariant TraktTv notifier,
) {
return notifier.build(
syncId: syncId,
itemType: itemType,
);
void runNotifierBuild(covariant TraktTv notifier) {
return notifier.build(syncId: syncId, itemType: itemType);
}
@override
@ -182,7 +160,8 @@ mixin TraktTvRef on AutoDisposeNotifierProviderRef<void> {
}
class _TraktTvProviderElement
extends AutoDisposeNotifierProviderElement<TraktTv, void> with TraktTvRef {
extends AutoDisposeNotifierProviderElement<TraktTv, void>
with TraktTvRef {
_TraktTvProviderElement(super.provider);
@override
@ -190,5 +169,6 @@ class _TraktTvProviderElement
@override
ItemType? get itemType => (origin as TraktTvProvider).itemType;
}
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package

View file

@ -1,3 +1,4 @@
// dart format width=80
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
@ -9,667 +10,268 @@ part of 'client.dart';
// FreezedGenerator
// **************************************************************************
// dart format off
T _$identity<T>(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 information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models');
/// @nodoc
mixin _$ProxySettings {
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() noProxy,
required TResult Function(List<CustomProxy> field0) customProxyList,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? noProxy,
TResult? Function(List<CustomProxy> field0)? customProxyList,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? noProxy,
TResult Function(List<CustomProxy> field0)? customProxyList,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(ProxySettings_NoProxy value) noProxy,
required TResult Function(ProxySettings_CustomProxyList value)
customProxyList,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(ProxySettings_NoProxy value)? noProxy,
TResult? Function(ProxySettings_CustomProxyList value)? customProxyList,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(ProxySettings_NoProxy value)? noProxy,
TResult Function(ProxySettings_CustomProxyList value)? customProxyList,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is ProxySettings);
}
@override
int get hashCode => runtimeType.hashCode;
@override
String toString() {
return 'ProxySettings()';
}
}
/// @nodoc
abstract class $ProxySettingsCopyWith<$Res> {
factory $ProxySettingsCopyWith(
ProxySettings value, $Res Function(ProxySettings) then) =
_$ProxySettingsCopyWithImpl<$Res, ProxySettings>;
class $ProxySettingsCopyWith<$Res> {
$ProxySettingsCopyWith(ProxySettings _, $Res Function(ProxySettings) __);
}
/// @nodoc
class _$ProxySettingsCopyWithImpl<$Res, $Val extends ProxySettings>
implements $ProxySettingsCopyWith<$Res> {
_$ProxySettingsCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of ProxySettings
/// with the given fields replaced by the non-null parameter values.
}
/// @nodoc
abstract class _$$ProxySettings_NoProxyImplCopyWith<$Res> {
factory _$$ProxySettings_NoProxyImplCopyWith(
_$ProxySettings_NoProxyImpl value,
$Res Function(_$ProxySettings_NoProxyImpl) then) =
__$$ProxySettings_NoProxyImplCopyWithImpl<$Res>;
}
/// @nodoc
class __$$ProxySettings_NoProxyImplCopyWithImpl<$Res>
extends _$ProxySettingsCopyWithImpl<$Res, _$ProxySettings_NoProxyImpl>
implements _$$ProxySettings_NoProxyImplCopyWith<$Res> {
__$$ProxySettings_NoProxyImplCopyWithImpl(_$ProxySettings_NoProxyImpl _value,
$Res Function(_$ProxySettings_NoProxyImpl) _then)
: super(_value, _then);
/// Create a copy of ProxySettings
/// with the given fields replaced by the non-null parameter values.
}
/// @nodoc
class _$ProxySettings_NoProxyImpl extends ProxySettings_NoProxy {
const _$ProxySettings_NoProxyImpl() : super._();
@override
String toString() {
return 'ProxySettings.noProxy()';
}
class ProxySettings_NoProxy extends ProxySettings {
const ProxySettings_NoProxy(): super._();
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$ProxySettings_NoProxyImpl);
}
@override
int get hashCode => runtimeType.hashCode;
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() noProxy,
required TResult Function(List<CustomProxy> field0) customProxyList,
}) {
return noProxy();
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? noProxy,
TResult? Function(List<CustomProxy> field0)? customProxyList,
}) {
return noProxy?.call();
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? noProxy,
TResult Function(List<CustomProxy> field0)? customProxyList,
required TResult orElse(),
}) {
if (noProxy != null) {
return noProxy();
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(ProxySettings_NoProxy value) noProxy,
required TResult Function(ProxySettings_CustomProxyList value)
customProxyList,
}) {
return noProxy(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(ProxySettings_NoProxy value)? noProxy,
TResult? Function(ProxySettings_CustomProxyList value)? customProxyList,
}) {
return noProxy?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(ProxySettings_NoProxy value)? noProxy,
TResult Function(ProxySettings_CustomProxyList value)? customProxyList,
required TResult orElse(),
}) {
if (noProxy != null) {
return noProxy(this);
}
return orElse();
}
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is ProxySettings_NoProxy);
}
abstract class ProxySettings_NoProxy extends ProxySettings {
const factory ProxySettings_NoProxy() = _$ProxySettings_NoProxyImpl;
const ProxySettings_NoProxy._() : super._();
@override
int get hashCode => runtimeType.hashCode;
@override
String toString() {
return 'ProxySettings.noProxy()';
}
/// @nodoc
abstract class _$$ProxySettings_CustomProxyListImplCopyWith<$Res> {
factory _$$ProxySettings_CustomProxyListImplCopyWith(
_$ProxySettings_CustomProxyListImpl value,
$Res Function(_$ProxySettings_CustomProxyListImpl) then) =
__$$ProxySettings_CustomProxyListImplCopyWithImpl<$Res>;
@useResult
$Res call({List<CustomProxy> field0});
}
/// @nodoc
class __$$ProxySettings_CustomProxyListImplCopyWithImpl<$Res>
extends _$ProxySettingsCopyWithImpl<$Res,
_$ProxySettings_CustomProxyListImpl>
implements _$$ProxySettings_CustomProxyListImplCopyWith<$Res> {
__$$ProxySettings_CustomProxyListImplCopyWithImpl(
_$ProxySettings_CustomProxyListImpl _value,
$Res Function(_$ProxySettings_CustomProxyListImpl) _then)
: super(_value, _then);
/// Create a copy of ProxySettings
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? field0 = null,
}) {
return _then(_$ProxySettings_CustomProxyListImpl(
null == field0
? _value._field0
: field0 // ignore: cast_nullable_to_non_nullable
as List<CustomProxy>,
));
}
}
/// @nodoc
class _$ProxySettings_CustomProxyListImpl
extends ProxySettings_CustomProxyList {
const _$ProxySettings_CustomProxyListImpl(final List<CustomProxy> field0)
: _field0 = field0,
super._();
final List<CustomProxy> _field0;
@override
List<CustomProxy> get field0 {
if (_field0 is EqualUnmodifiableListView) return _field0;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(_field0);
}
class ProxySettings_CustomProxyList extends ProxySettings {
const ProxySettings_CustomProxyList(final List<CustomProxy> field0): _field0 = field0,super._();
@override
String toString() {
return 'ProxySettings.customProxyList(field0: $field0)';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$ProxySettings_CustomProxyListImpl &&
const DeepCollectionEquality().equals(other._field0, _field0));
}
@override
int get hashCode =>
Object.hash(runtimeType, const DeepCollectionEquality().hash(_field0));
/// Create a copy of ProxySettings
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$ProxySettings_CustomProxyListImplCopyWith<
_$ProxySettings_CustomProxyListImpl>
get copyWith => __$$ProxySettings_CustomProxyListImplCopyWithImpl<
_$ProxySettings_CustomProxyListImpl>(this, _$identity);
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() noProxy,
required TResult Function(List<CustomProxy> field0) customProxyList,
}) {
return customProxyList(field0);
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? noProxy,
TResult? Function(List<CustomProxy> field0)? customProxyList,
}) {
return customProxyList?.call(field0);
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? noProxy,
TResult Function(List<CustomProxy> field0)? customProxyList,
required TResult orElse(),
}) {
if (customProxyList != null) {
return customProxyList(field0);
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(ProxySettings_NoProxy value) noProxy,
required TResult Function(ProxySettings_CustomProxyList value)
customProxyList,
}) {
return customProxyList(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(ProxySettings_NoProxy value)? noProxy,
TResult? Function(ProxySettings_CustomProxyList value)? customProxyList,
}) {
return customProxyList?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(ProxySettings_NoProxy value)? noProxy,
TResult Function(ProxySettings_CustomProxyList value)? customProxyList,
required TResult orElse(),
}) {
if (customProxyList != null) {
return customProxyList(this);
}
return orElse();
}
final List<CustomProxy> _field0;
List<CustomProxy> get field0 {
if (_field0 is EqualUnmodifiableListView) return _field0;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(_field0);
}
abstract class ProxySettings_CustomProxyList extends ProxySettings {
const factory ProxySettings_CustomProxyList(final List<CustomProxy> field0) =
_$ProxySettings_CustomProxyListImpl;
const ProxySettings_CustomProxyList._() : super._();
List<CustomProxy> get field0;
/// Create a copy of ProxySettings
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$ProxySettings_CustomProxyListCopyWith<ProxySettings_CustomProxyList> get copyWith => _$ProxySettings_CustomProxyListCopyWithImpl<ProxySettings_CustomProxyList>(this, _$identity);
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is ProxySettings_CustomProxyList&&const DeepCollectionEquality().equals(other._field0, _field0));
}
@override
int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(_field0));
@override
String toString() {
return 'ProxySettings.customProxyList(field0: $field0)';
}
}
/// @nodoc
abstract mixin class $ProxySettings_CustomProxyListCopyWith<$Res> implements $ProxySettingsCopyWith<$Res> {
factory $ProxySettings_CustomProxyListCopyWith(ProxySettings_CustomProxyList value, $Res Function(ProxySettings_CustomProxyList) _then) = _$ProxySettings_CustomProxyListCopyWithImpl;
@useResult
$Res call({
List<CustomProxy> field0
});
}
/// @nodoc
class _$ProxySettings_CustomProxyListCopyWithImpl<$Res>
implements $ProxySettings_CustomProxyListCopyWith<$Res> {
_$ProxySettings_CustomProxyListCopyWithImpl(this._self, this._then);
final ProxySettings_CustomProxyList _self;
final $Res Function(ProxySettings_CustomProxyList) _then;
/// Create a copy of ProxySettings
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) {
return _then(ProxySettings_CustomProxyList(
null == field0 ? _self._field0 : field0 // ignore: cast_nullable_to_non_nullable
as List<CustomProxy>,
));
}
/// Create a copy of ProxySettings
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
_$$ProxySettings_CustomProxyListImplCopyWith<
_$ProxySettings_CustomProxyListImpl>
get copyWith => throw _privateConstructorUsedError;
}
/// @nodoc
mixin _$RedirectSettings {
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() noRedirect,
required TResult Function(int field0) limitedRedirects,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? noRedirect,
TResult? Function(int field0)? limitedRedirects,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? noRedirect,
TResult Function(int field0)? limitedRedirects,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(RedirectSettings_NoRedirect value) noRedirect,
required TResult Function(RedirectSettings_LimitedRedirects value)
limitedRedirects,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(RedirectSettings_NoRedirect value)? noRedirect,
TResult? Function(RedirectSettings_LimitedRedirects value)?
limitedRedirects,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(RedirectSettings_NoRedirect value)? noRedirect,
TResult Function(RedirectSettings_LimitedRedirects value)? limitedRedirects,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is RedirectSettings);
}
@override
int get hashCode => runtimeType.hashCode;
@override
String toString() {
return 'RedirectSettings()';
}
}
/// @nodoc
abstract class $RedirectSettingsCopyWith<$Res> {
factory $RedirectSettingsCopyWith(
RedirectSettings value, $Res Function(RedirectSettings) then) =
_$RedirectSettingsCopyWithImpl<$Res, RedirectSettings>;
class $RedirectSettingsCopyWith<$Res> {
$RedirectSettingsCopyWith(RedirectSettings _, $Res Function(RedirectSettings) __);
}
/// @nodoc
class _$RedirectSettingsCopyWithImpl<$Res, $Val extends RedirectSettings>
implements $RedirectSettingsCopyWith<$Res> {
_$RedirectSettingsCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of RedirectSettings
/// with the given fields replaced by the non-null parameter values.
}
/// @nodoc
abstract class _$$RedirectSettings_NoRedirectImplCopyWith<$Res> {
factory _$$RedirectSettings_NoRedirectImplCopyWith(
_$RedirectSettings_NoRedirectImpl value,
$Res Function(_$RedirectSettings_NoRedirectImpl) then) =
__$$RedirectSettings_NoRedirectImplCopyWithImpl<$Res>;
}
/// @nodoc
class __$$RedirectSettings_NoRedirectImplCopyWithImpl<$Res>
extends _$RedirectSettingsCopyWithImpl<$Res,
_$RedirectSettings_NoRedirectImpl>
implements _$$RedirectSettings_NoRedirectImplCopyWith<$Res> {
__$$RedirectSettings_NoRedirectImplCopyWithImpl(
_$RedirectSettings_NoRedirectImpl _value,
$Res Function(_$RedirectSettings_NoRedirectImpl) _then)
: super(_value, _then);
/// Create a copy of RedirectSettings
/// with the given fields replaced by the non-null parameter values.
}
/// @nodoc
class _$RedirectSettings_NoRedirectImpl extends RedirectSettings_NoRedirect {
const _$RedirectSettings_NoRedirectImpl() : super._();
@override
String toString() {
return 'RedirectSettings.noRedirect()';
}
class RedirectSettings_NoRedirect extends RedirectSettings {
const RedirectSettings_NoRedirect(): super._();
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$RedirectSettings_NoRedirectImpl);
}
@override
int get hashCode => runtimeType.hashCode;
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() noRedirect,
required TResult Function(int field0) limitedRedirects,
}) {
return noRedirect();
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? noRedirect,
TResult? Function(int field0)? limitedRedirects,
}) {
return noRedirect?.call();
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? noRedirect,
TResult Function(int field0)? limitedRedirects,
required TResult orElse(),
}) {
if (noRedirect != null) {
return noRedirect();
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(RedirectSettings_NoRedirect value) noRedirect,
required TResult Function(RedirectSettings_LimitedRedirects value)
limitedRedirects,
}) {
return noRedirect(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(RedirectSettings_NoRedirect value)? noRedirect,
TResult? Function(RedirectSettings_LimitedRedirects value)?
limitedRedirects,
}) {
return noRedirect?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(RedirectSettings_NoRedirect value)? noRedirect,
TResult Function(RedirectSettings_LimitedRedirects value)? limitedRedirects,
required TResult orElse(),
}) {
if (noRedirect != null) {
return noRedirect(this);
}
return orElse();
}
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is RedirectSettings_NoRedirect);
}
abstract class RedirectSettings_NoRedirect extends RedirectSettings {
const factory RedirectSettings_NoRedirect() =
_$RedirectSettings_NoRedirectImpl;
const RedirectSettings_NoRedirect._() : super._();
@override
int get hashCode => runtimeType.hashCode;
@override
String toString() {
return 'RedirectSettings.noRedirect()';
}
/// @nodoc
abstract class _$$RedirectSettings_LimitedRedirectsImplCopyWith<$Res> {
factory _$$RedirectSettings_LimitedRedirectsImplCopyWith(
_$RedirectSettings_LimitedRedirectsImpl value,
$Res Function(_$RedirectSettings_LimitedRedirectsImpl) then) =
__$$RedirectSettings_LimitedRedirectsImplCopyWithImpl<$Res>;
@useResult
$Res call({int field0});
}
/// @nodoc
class __$$RedirectSettings_LimitedRedirectsImplCopyWithImpl<$Res>
extends _$RedirectSettingsCopyWithImpl<$Res,
_$RedirectSettings_LimitedRedirectsImpl>
implements _$$RedirectSettings_LimitedRedirectsImplCopyWith<$Res> {
__$$RedirectSettings_LimitedRedirectsImplCopyWithImpl(
_$RedirectSettings_LimitedRedirectsImpl _value,
$Res Function(_$RedirectSettings_LimitedRedirectsImpl) _then)
: super(_value, _then);
/// Create a copy of RedirectSettings
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? field0 = null,
}) {
return _then(_$RedirectSettings_LimitedRedirectsImpl(
null == field0
? _value.field0
: field0 // ignore: cast_nullable_to_non_nullable
as int,
));
}
}
/// @nodoc
class _$RedirectSettings_LimitedRedirectsImpl
extends RedirectSettings_LimitedRedirects {
const _$RedirectSettings_LimitedRedirectsImpl(this.field0) : super._();
@override
final int field0;
class RedirectSettings_LimitedRedirects extends RedirectSettings {
const RedirectSettings_LimitedRedirects(this.field0): super._();
@override
String toString() {
return 'RedirectSettings.limitedRedirects(field0: $field0)';
}
final int field0;
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$RedirectSettings_LimitedRedirectsImpl &&
(identical(other.field0, field0) || other.field0 == field0));
}
/// Create a copy of RedirectSettings
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$RedirectSettings_LimitedRedirectsCopyWith<RedirectSettings_LimitedRedirects> get copyWith => _$RedirectSettings_LimitedRedirectsCopyWithImpl<RedirectSettings_LimitedRedirects>(this, _$identity);
@override
int get hashCode => Object.hash(runtimeType, field0);
/// Create a copy of RedirectSettings
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$RedirectSettings_LimitedRedirectsImplCopyWith<
_$RedirectSettings_LimitedRedirectsImpl>
get copyWith => __$$RedirectSettings_LimitedRedirectsImplCopyWithImpl<
_$RedirectSettings_LimitedRedirectsImpl>(this, _$identity);
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() noRedirect,
required TResult Function(int field0) limitedRedirects,
}) {
return limitedRedirects(field0);
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? noRedirect,
TResult? Function(int field0)? limitedRedirects,
}) {
return limitedRedirects?.call(field0);
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? noRedirect,
TResult Function(int field0)? limitedRedirects,
required TResult orElse(),
}) {
if (limitedRedirects != null) {
return limitedRedirects(field0);
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(RedirectSettings_NoRedirect value) noRedirect,
required TResult Function(RedirectSettings_LimitedRedirects value)
limitedRedirects,
}) {
return limitedRedirects(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(RedirectSettings_NoRedirect value)? noRedirect,
TResult? Function(RedirectSettings_LimitedRedirects value)?
limitedRedirects,
}) {
return limitedRedirects?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(RedirectSettings_NoRedirect value)? noRedirect,
TResult Function(RedirectSettings_LimitedRedirects value)? limitedRedirects,
required TResult orElse(),
}) {
if (limitedRedirects != null) {
return limitedRedirects(this);
}
return orElse();
}
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is RedirectSettings_LimitedRedirects&&(identical(other.field0, field0) || other.field0 == field0));
}
abstract class RedirectSettings_LimitedRedirects extends RedirectSettings {
const factory RedirectSettings_LimitedRedirects(final int field0) =
_$RedirectSettings_LimitedRedirectsImpl;
const RedirectSettings_LimitedRedirects._() : super._();
int get field0;
@override
int get hashCode => Object.hash(runtimeType,field0);
/// Create a copy of RedirectSettings
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
_$$RedirectSettings_LimitedRedirectsImplCopyWith<
_$RedirectSettings_LimitedRedirectsImpl>
get copyWith => throw _privateConstructorUsedError;
@override
String toString() {
return 'RedirectSettings.limitedRedirects(field0: $field0)';
}
}
/// @nodoc
abstract mixin class $RedirectSettings_LimitedRedirectsCopyWith<$Res> implements $RedirectSettingsCopyWith<$Res> {
factory $RedirectSettings_LimitedRedirectsCopyWith(RedirectSettings_LimitedRedirects value, $Res Function(RedirectSettings_LimitedRedirects) _then) = _$RedirectSettings_LimitedRedirectsCopyWithImpl;
@useResult
$Res call({
int field0
});
}
/// @nodoc
class _$RedirectSettings_LimitedRedirectsCopyWithImpl<$Res>
implements $RedirectSettings_LimitedRedirectsCopyWith<$Res> {
_$RedirectSettings_LimitedRedirectsCopyWithImpl(this._self, this._then);
final RedirectSettings_LimitedRedirects _self;
final $Res Function(RedirectSettings_LimitedRedirects) _then;
/// Create a copy of RedirectSettings
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) {
return _then(RedirectSettings_LimitedRedirects(
null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable
as int,
));
}
}
// dart format on

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff