Move user-related info into its own store

This commit is contained in:
tommyxchow 2021-12-21 23:20:38 -05:00
parent 7fef2e7225
commit 69a4432696
5 changed files with 116 additions and 54 deletions

View file

@ -3,7 +3,7 @@ import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:flutter_web_auth/flutter_web_auth.dart';
import 'package:frosty/api/twitch_api.dart';
import 'package:frosty/constants.dart';
import 'package:frosty/models/user.dart';
import 'package:frosty/core/user/user_store.dart';
import 'package:mobx/mobx.dart';
part 'auth_store.g.dart';
@ -17,18 +17,13 @@ abstract class _AuthBase with Store {
/// Whether the token is valid or not.
var _tokenIsValid = false;
/// The store containing information relevant to the current user.
final user = UserStore();
/// The current token.
@readonly
String? _token;
/// The current user's info.
@readonly
UserTwitch? _user;
/// The user's list of blocked users.
@readonly
var _blockedUsers = ObservableList<UserBlockedTwitch>();
/// Whether the user is logged in or not.
@readonly
var _isLoggedIn = false;
@ -54,11 +49,8 @@ abstract class _AuthBase with Store {
await _storage.write(key: 'DEFAULT_TOKEN', value: _token);
}
} else {
// Get and update the current user's info.
_user = await Twitch.getUserInfo(headers: headersTwitch);
// Get and update the current user's list of blocked users.
if (_user?.id != null) _blockedUsers = (await Twitch.getUserBlockedList(id: _user!.id, headers: headersTwitch)).asObservable();
// Initialize the user store.
await user.init(headers: headersTwitch);
_isLoggedIn = true;
}
@ -102,10 +94,8 @@ abstract class _AuthBase with Store {
// Store the user token.
await _storage.write(key: 'USER_TOKEN', value: _token);
// Retrieve the user info and set it
_user = await Twitch.getUserInfo(headers: headersTwitch);
if (_user?.id != null) _blockedUsers = (await Twitch.getUserBlockedList(id: _user!.id, headers: headersTwitch)).asObservable();
// Initialize the user with the new token.
user.init(headers: headersTwitch);
// Set the login status to logged in.
_isLoggedIn = true;
@ -122,7 +112,7 @@ abstract class _AuthBase with Store {
_token = null;
// Clear the user info.
_user = null;
user.dispose();
// Set the login status to logged out.
_isLoggedIn = false;

View file

@ -34,40 +34,6 @@ mixin _$AuthStore on _AuthBase, Store {
});
}
final _$_userAtom = Atom(name: '_AuthBase._user');
UserTwitch? get user {
_$_userAtom.reportRead();
return super._user;
}
@override
UserTwitch? get _user => user;
@override
set _user(UserTwitch? value) {
_$_userAtom.reportWrite(value, super._user, () {
super._user = value;
});
}
final _$_blockedUsersAtom = Atom(name: '_AuthBase._blockedUsers');
ObservableList<UserBlockedTwitch> get blockedUsers {
_$_blockedUsersAtom.reportRead();
return super._blockedUsers;
}
@override
ObservableList<UserBlockedTwitch> get _blockedUsers => blockedUsers;
@override
set _blockedUsers(ObservableList<UserBlockedTwitch> value) {
_$_blockedUsersAtom.reportWrite(value, super._blockedUsers, () {
super._blockedUsers = value;
});
}
final _$_isLoggedInAtom = Atom(name: '_AuthBase._isLoggedIn');
bool get isLoggedIn {

View file

@ -0,0 +1,32 @@
import 'package:frosty/api/twitch_api.dart';
import 'package:frosty/models/user.dart';
import 'package:mobx/mobx.dart';
part 'user_store.g.dart';
class UserStore = _UserStoreBase with _$UserStore;
abstract class _UserStoreBase with Store {
/// The current user's info.
@readonly
UserTwitch? _details;
/// The user's list of blocked users.
@readonly
var _blockedUsers = ObservableList<UserBlockedTwitch>();
@action
Future<void> init({required Map<String, String> headers}) async {
// Get and update the current user's info.
_details = await Twitch.getUserInfo(headers: headers);
// Get and update the current user's list of blocked users.
if (_details?.id != null) _blockedUsers = (await Twitch.getUserBlockedList(id: _details!.id, headers: headers)).asObservable();
}
@action
void dispose() {
_details = null;
_blockedUsers.clear();
}
}

View file

@ -0,0 +1,73 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'user_store.dart';
// **************************************************************************
// StoreGenerator
// **************************************************************************
// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic
mixin _$UserStore on _UserStoreBase, Store {
final _$_detailsAtom = Atom(name: '_UserStoreBase._details');
UserTwitch? get details {
_$_detailsAtom.reportRead();
return super._details;
}
@override
UserTwitch? get _details => details;
@override
set _details(UserTwitch? value) {
_$_detailsAtom.reportWrite(value, super._details, () {
super._details = value;
});
}
final _$_blockedUsersAtom = Atom(name: '_UserStoreBase._blockedUsers');
ObservableList<UserBlockedTwitch> get blockedUsers {
_$_blockedUsersAtom.reportRead();
return super._blockedUsers;
}
@override
ObservableList<UserBlockedTwitch> get _blockedUsers => blockedUsers;
@override
set _blockedUsers(ObservableList<UserBlockedTwitch> value) {
_$_blockedUsersAtom.reportWrite(value, super._blockedUsers, () {
super._blockedUsers = value;
});
}
final _$initAsyncAction = AsyncAction('_UserStoreBase.init');
@override
Future<void> init({required Map<String, String> headers}) {
return _$initAsyncAction.run(() => super.init(headers: headers));
}
final _$_UserStoreBaseActionController =
ActionController(name: '_UserStoreBase');
@override
void dispose() {
final _$actionInfo = _$_UserStoreBaseActionController.startAction(
name: '_UserStoreBase.dispose');
try {
return super.dispose();
} finally {
_$_UserStoreBaseActionController.endAction(_$actionInfo);
}
}
@override
String toString() {
return '''
''';
}
}

View file

@ -34,7 +34,8 @@ abstract class _FollowedStreamsStoreBase with Store {
Future<void> getFollowedStreams() async {
_isLoading = true;
final newFollowedStreams = await Twitch.getFollowedStreams(id: authStore.user!.id, headers: authStore.headersTwitch, cursor: _followedStreamsCurrentCursor);
final newFollowedStreams =
await Twitch.getFollowedStreams(id: authStore.user.details!.id, headers: authStore.headersTwitch, cursor: _followedStreamsCurrentCursor);
if (newFollowedStreams != null) {
if (_followedStreamsCurrentCursor == null) {