feat(wip): Update entities and adopt a proper repository workflow for trip "obtention"

This commit is contained in:
2025-12-29 00:23:10 +01:00
parent 239b63ca81
commit 81ed2fd8c3
34 changed files with 1929 additions and 1925 deletions

View 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);
});

View 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);

View File

@@ -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);
}
}

View File

@@ -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);
};
});