Skip to content

Commit

Permalink
Provide stream to listen to causes updates
Browse files Browse the repository at this point in the history
  • Loading branch information
JElgar committed Oct 22, 2024
1 parent 7045ea4 commit d5748e2
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 32 deletions.
51 changes: 20 additions & 31 deletions lib/services/causes_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import 'package:nowu/services/analytics.dart';
import 'package:nowu/services/api_service.dart';
import 'package:nowu/services/auth.dart';
import 'package:nowu/utils/let.dart';
import 'package:nowu/utils/stream_store.dart';
import 'package:supabase_flutter/supabase_flutter.dart';

export 'package:nowu/models/action.dart';
Expand All @@ -22,22 +23,6 @@ export 'package:nowu/models/cause.dart';
export 'package:nowu/models/learning.dart';
export 'package:nowu/models/organisation.dart';

class UserInfoStore {
final _userInfoStreamController = StreamController<CausesUser?>.broadcast();
CausesUser? _userInfo;

Stream<CausesUser?> get userInfoStream => _userInfoStreamController.stream;

CausesUser? get userInfo => _userInfo;

void set userInfo(CausesUser? userInfo) {
_userInfo = userInfo;
_userInfoStreamController.add(_userInfo);
}

UserInfoStore(CausesUser? userInfo) : _userInfo = userInfo;
}

class CausesService {
final _authService = locator<AuthenticationService>();
final _analyticsService = locator<AnalyticsService>();
Expand All @@ -48,7 +33,7 @@ class CausesService {
_authService.authState.listen((event) {
switch (event.event) {
case AuthChangeEvent.signedOut:
_userInfoStore.userInfo = null;
_userInfoStore.value = null;
break;
default:
break;
Expand All @@ -57,26 +42,32 @@ class CausesService {
}

// Cache of user info
UserInfoStore _userInfoStore = UserInfoStore(null);

Stream<CausesUser?> get userInfoStream => _userInfoStore.userInfoStream;
StreamStore<CausesUser?> _userInfoStore = StreamStore<CausesUser?>(null);
StreamStore<List<Cause>?> _causesStore = StreamStore<List<Cause>?>(null);

List<Cause>? _causes;
Stream<CausesUser?> get userInfoStream => _userInfoStore.stream;
Stream<List<Cause>?> get causesStream => _causesStore.stream;

Future<List<Cause>?> _fetchCauses() async {
_logger.info('Fetching causes from the service');
final (response, userInfo) = await (
_causeServiceClient.getCausesApi().causesList(),
getUserInfo(),
).wait;
return response.data

final causes = response.data
?.map(
(model) => Cause.fromApiModel(
model,
userInfo,
),
)
.toList();

_logger.info('Got causes, ${_causesStore.value}');

_causesStore.value = causes;
return causes;
}

Api.CauseApiClient get _causeServiceClient => _apiService.apiClient;
Expand All @@ -86,11 +77,10 @@ class CausesService {
/// Input params
/// Returns a list of Causes from the API
Future<List<Cause>> listCauses() async {
if (_causes == null) {
_causes = await _fetchCauses();
if (_causesStore.value == null) {
await _fetchCauses();
}
_logger.info('Got causes, $_causes');
return _causes!;
return _causesStore.value!;
}

Future<Cause> getCause(int id) async {
Expand Down Expand Up @@ -139,7 +129,7 @@ class CausesService {
),
);

_userInfoStore.userInfo = response.data?.let(CausesUser.fromApiModel);
_userInfoStore.value = response.data?.let(CausesUser.fromApiModel);

// After selecting causes we fetch all causes to updated 'selected' status
await _fetchCauses();
Expand Down Expand Up @@ -214,13 +204,12 @@ class CausesService {
}
final response =
await _causeServiceClient.getMeApi().meCausesInfoRetrieve();
return _userInfoStore.userInfo =
response.data?.let(CausesUser.fromApiModel);
return _userInfoStore.value = response.data?.let(CausesUser.fromApiModel);
}

Future<CausesUser?> getUserInfo() async {
if (_userInfoStore.userInfo != null) {
return _userInfoStore.userInfo;
if (_userInfoStore.value != null) {
return _userInfoStore.value;
}
return fetchUserInfo();
}
Expand Down
8 changes: 7 additions & 1 deletion lib/ui/views/causes/bloc/causes_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,13 @@ class CausesBloc extends Cubit<CausesState> {

CausesBloc({required CausesService causesService})
: _causesService = causesService,
super(const CausesState.loading());
super(const CausesState.loading()) {
_causesService.causesStream.listen((causes) {
if (causes != null) {
emit(CausesState.loaded(causes: causes));
}
});
}

void fetchCauses() async {
emit(const CausesState.loading());
Expand Down
1 change: 1 addition & 0 deletions lib/ui/views/profile_setup/profile_setup_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,7 @@ class _AcceptTandCInput extends StatelessWidget {
case TsAndCsValidationError.acceptRequired:
return 'You must accept our terms and conditions to use the app';
}
return null;
}

@override
Expand Down
17 changes: 17 additions & 0 deletions lib/utils/stream_store.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import 'dart:async';

class StreamStore<T> {
final _streamController = StreamController<T>.broadcast();
T _value;

Stream<T> get stream => _streamController.stream;

T get value => _value;

void set value(T value) {
_value = value;
_streamController.add(_value);
}

StreamStore(T value) : _value = value;
}

0 comments on commit d5748e2

Please sign in to comment.