analysis_providers.dart 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import 'package:flutter_riverpod/flutter_riverpod.dart';
  2. import 'dart:io';
  3. import '../data/models/analysis_models.dart';
  4. import 'analysis_api_service.dart';
  5. const _defaultApiBaseUrl = String.fromEnvironment(
  6. 'TC_API_BASE_URL',
  7. defaultValue: 'http://127.0.0.1:8000/api',
  8. );
  9. final apiBaseUrlProvider = Provider<String>((ref) => _defaultApiBaseUrl);
  10. final analysisApiServiceProvider = Provider<AnalysisApiService>((ref) {
  11. return AnalysisApiService(baseUrl: _defaultApiBaseUrl);
  12. });
  13. final selectedSessionIdProvider = StateProvider<String?>((ref) => null);
  14. final selectedObservationIdProvider = StateProvider<String?>((ref) => null);
  15. final sessionListProvider = FutureProvider<List<AnalysisSessionSummary>>((
  16. ref,
  17. ) async {
  18. final api = ref.watch(analysisApiServiceProvider);
  19. return api.listSessions();
  20. });
  21. final observationListProvider = FutureProvider<List<ObservationSummary>>((
  22. ref,
  23. ) async {
  24. final api = ref.watch(analysisApiServiceProvider);
  25. return api.listObservations();
  26. });
  27. final selectedSessionSnapshotProvider =
  28. FutureProvider<AnalysisSessionSnapshot?>((ref) async {
  29. final sessionId = ref.watch(selectedSessionIdProvider);
  30. if (sessionId == null) {
  31. return null;
  32. }
  33. final api = ref.watch(analysisApiServiceProvider);
  34. return api.getSession(sessionId);
  35. });
  36. final selectedObservationProvider = FutureProvider<ObservationSummary?>((ref) async {
  37. final observationId = ref.watch(selectedObservationIdProvider);
  38. if (observationId == null) {
  39. return null;
  40. }
  41. final api = ref.watch(analysisApiServiceProvider);
  42. return api.getObservation(observationId);
  43. });
  44. final sessionActionsProvider = Provider<SessionActions>((ref) {
  45. return SessionActions(ref);
  46. });
  47. class SessionActions {
  48. SessionActions(this._ref);
  49. final Ref _ref;
  50. Future<AnalysisSessionSummary> createDemoSession() async {
  51. return createCapturedSession(
  52. durationMs: 4820,
  53. sampleRate: 16000,
  54. channels: 1,
  55. tags: const ['stub', 'periodic', 'mobile-lab'],
  56. captureMetadata: const {
  57. 'source': 'flutter-demo',
  58. 'noise_floor_db': -41,
  59. 'device': 'flutter-shell',
  60. },
  61. );
  62. }
  63. Future<AnalysisSessionSummary> createCapturedSession({
  64. required int durationMs,
  65. required int sampleRate,
  66. required int channels,
  67. List<String> tags = const [],
  68. Map<String, dynamic> captureMetadata = const {},
  69. }) async {
  70. final api = _ref.read(analysisApiServiceProvider);
  71. final observation = await api.createObservation(
  72. durationMs: durationMs,
  73. sampleRate: sampleRate,
  74. channels: channels,
  75. tags: tags,
  76. captureMetadata: captureMetadata,
  77. );
  78. final session = await api.createSession(observationId: observation.id);
  79. _ref.read(selectedSessionIdProvider.notifier).state = session.sessionId;
  80. _ref.read(selectedObservationIdProvider.notifier).state = null;
  81. _ref.invalidate(observationListProvider);
  82. _ref.invalidate(sessionListProvider);
  83. _ref.invalidate(selectedSessionSnapshotProvider);
  84. _ref.invalidate(selectedObservationProvider);
  85. return session;
  86. }
  87. Future<AnalysisSessionSummary> createUploadedSession({
  88. required String filePath,
  89. required int durationMs,
  90. required int sampleRate,
  91. required int channels,
  92. List<String> tags = const [],
  93. Map<String, dynamic> captureMetadata = const {},
  94. }) async {
  95. final api = _ref.read(analysisApiServiceProvider);
  96. final file = File(filePath);
  97. if (!await file.exists()) {
  98. throw Exception('Recorded file not found at $filePath');
  99. }
  100. final observation = await api.uploadObservation(
  101. filePath: filePath,
  102. durationMs: durationMs,
  103. sampleRate: sampleRate,
  104. channels: channels,
  105. tags: tags,
  106. captureMetadata: captureMetadata,
  107. );
  108. final session = await api.createSession(observationId: observation.id);
  109. _ref.read(selectedSessionIdProvider.notifier).state = session.sessionId;
  110. _ref.read(selectedObservationIdProvider.notifier).state = null;
  111. _ref.invalidate(observationListProvider);
  112. _ref.invalidate(sessionListProvider);
  113. _ref.invalidate(selectedSessionSnapshotProvider);
  114. _ref.invalidate(selectedObservationProvider);
  115. return session;
  116. }
  117. Future<AnalysisSessionSummary> createSessionForObservation(
  118. String observationId, {
  119. String mode = 'initial_analysis',
  120. }) async {
  121. final api = _ref.read(analysisApiServiceProvider);
  122. final session = await api.createSession(
  123. observationId: observationId,
  124. mode: mode,
  125. );
  126. _ref.read(selectedSessionIdProvider.notifier).state = session.sessionId;
  127. _ref.read(selectedObservationIdProvider.notifier).state = null;
  128. _ref.invalidate(sessionListProvider);
  129. _ref.invalidate(selectedSessionSnapshotProvider);
  130. _ref.invalidate(selectedObservationProvider);
  131. return session;
  132. }
  133. void selectSession(String sessionId) {
  134. _ref.read(selectedSessionIdProvider.notifier).state = sessionId;
  135. _ref.read(selectedObservationIdProvider.notifier).state = null;
  136. _ref.invalidate(selectedSessionSnapshotProvider);
  137. _ref.invalidate(selectedObservationProvider);
  138. }
  139. void selectObservation(String observationId) {
  140. _ref.read(selectedObservationIdProvider.notifier).state = observationId;
  141. _ref.read(selectedSessionIdProvider.notifier).state = null;
  142. _ref.invalidate(selectedObservationProvider);
  143. _ref.invalidate(selectedSessionSnapshotProvider);
  144. }
  145. }