feat(wip): Update entities and adopt a proper repository workflow for trip "obtention"
This commit is contained in:
49
frontend/lib/presentation/providers/core_providers.dart
Normal file
49
frontend/lib/presentation/providers/core_providers.dart
Normal file
@@ -0,0 +1,49 @@
|
||||
import 'package:anyway/core/dio_client.dart';
|
||||
import 'package:anyway/data/repositories/local_onboarding_repository.dart';
|
||||
import 'package:anyway/domain/repositories/onboarding_repository.dart';
|
||||
import 'package:anyway/domain/repositories/trip_repository.dart';
|
||||
import 'package:anyway/data/repositories/backend_trip_repository.dart';
|
||||
import 'package:anyway/data/datasources/trip_remote_datasource.dart';
|
||||
import 'package:anyway/data/repositories/preferences_repository_impl.dart';
|
||||
import 'package:anyway/domain/repositories/preferences_repository.dart';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
/// Provide a configured Dio instance (used by data layer)
|
||||
final dioProvider = Provider<Dio>((ref) {
|
||||
// baseUrl can be configured via environment; use a sensible default
|
||||
return Dio(BaseOptions(
|
||||
baseUrl: 'https://anyway.anydev.info',
|
||||
connectTimeout: const Duration(seconds: 5),
|
||||
receiveTimeout: const Duration(seconds: 120),
|
||||
headers: {
|
||||
HttpHeaders.acceptHeader: 'application/json',
|
||||
HttpHeaders.contentTypeHeader: 'application/json',
|
||||
},
|
||||
));
|
||||
});
|
||||
|
||||
/// Provide a simple wrapper client if needed elsewhere
|
||||
final dioClientProvider = Provider<DioClient>((ref) {
|
||||
final dio = ref.read(dioProvider);
|
||||
return DioClient(baseUrl: dio.options.baseUrl);
|
||||
});
|
||||
|
||||
/// Onboarding repository backed by SharedPreferences
|
||||
final onboardingRepositoryProvider = Provider<OnboardingRepository>((ref) {
|
||||
return LocalOnboardingRepository();
|
||||
});
|
||||
|
||||
/// Preferences repository (local persistence)
|
||||
final preferencesRepositoryProvider = Provider<PreferencesRepository>((ref) {
|
||||
return PreferencesRepositoryImpl();
|
||||
});
|
||||
|
||||
/// Trip repository backed by the backend
|
||||
final tripRepositoryProvider = Provider<TripRepository>((ref) {
|
||||
final dio = ref.read(dioProvider);
|
||||
final remote = TripRemoteDataSourceImpl(dio: dio);
|
||||
return BackendTripRepository(remote: remote);
|
||||
});
|
||||
16
frontend/lib/presentation/providers/landmark_providers.dart
Normal file
16
frontend/lib/presentation/providers/landmark_providers.dart
Normal file
@@ -0,0 +1,16 @@
|
||||
import 'package:anyway/domain/entities/landmark.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
class IntermediateLandmarksNotifier extends Notifier<List<Landmark>> {
|
||||
@override
|
||||
List<Landmark> build() => [];
|
||||
|
||||
void setLandmarks(List<Landmark> landmarks) {
|
||||
state = List.unmodifiable(landmarks);
|
||||
}
|
||||
|
||||
void clear() => state = [];
|
||||
}
|
||||
|
||||
final intermediateLandmarksProvider =
|
||||
NotifierProvider<IntermediateLandmarksNotifier, List<Landmark>>(IntermediateLandmarksNotifier.new);
|
||||
@@ -1,9 +1,10 @@
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:anyway/domain/repositories/onboarding_repository.dart';
|
||||
import 'package:anyway/presentation/providers/core_providers.dart';
|
||||
|
||||
final onboardingStateProvider = FutureProvider<bool>((ref) async {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
return prefs.getBool('onboardingCompleted') ?? false;
|
||||
final repo = ref.watch(onboardingRepositoryProvider);
|
||||
return repo.isOnboarded();
|
||||
});
|
||||
|
||||
|
||||
@@ -16,9 +17,10 @@ class OnboardingController {
|
||||
OnboardingController(this.ref);
|
||||
|
||||
Future<void> setOnboarded(bool value) async {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
await prefs.setBool('onboardingCompleted', value);
|
||||
final repo = ref.read(onboardingRepositoryProvider);
|
||||
await repo.setOnboarded(value);
|
||||
// refresh the read provider so UI updates
|
||||
ref.invalidate(onboardingStateProvider);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,16 @@
|
||||
// import 'package:anyway/data/repositories/trip_repository.dart';
|
||||
// import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:anyway/domain/entities/preferences.dart';
|
||||
import 'package:anyway/domain/entities/trip.dart';
|
||||
import 'package:anyway/presentation/providers/landmark_providers.dart';
|
||||
|
||||
// final weatherRepositoryProvider = Provider<TripRepository>((ref) {
|
||||
// return TripRepositoryImpl(???);
|
||||
// });
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:anyway/presentation/providers/core_providers.dart';
|
||||
|
||||
// Provides a function that creates a trip given preferences.
|
||||
final createTripProvider = Provider<Future<Trip> Function(Preferences)>((ref) {
|
||||
return (Preferences prefs) async {
|
||||
final repo = ref.read(tripRepositoryProvider);
|
||||
final landmarks = await repo.searchLandmarks(prefs);
|
||||
ref.read(intermediateLandmarksProvider.notifier).setLandmarks(landmarks);
|
||||
return repo.getTrip(preferences: prefs, landmarks: landmarks);
|
||||
};
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user