- Add NewsTickerWidget with horizontal auto-scrolling at 40px/sec - Add NewsData and NewsHeadline Freezed models - Add news datasource fetching from /tools/news endpoint - Add news provider with 30-minute auto-refresh - Place ticker between Welcome card and System Stats on dashboard - Show placeholder headlines when no data (italic, muted style) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
39 lines
978 B
Dart
39 lines
978 B
Dart
import 'package:dio/dio.dart';
|
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
|
import 'package:tatlock_ui/core/api/api_client.dart';
|
|
import 'package:tatlock_ui/features/front_hall/data/models/news_model.dart';
|
|
|
|
part 'news_datasource.g.dart';
|
|
|
|
/// Data source for news data operations.
|
|
///
|
|
/// Fetches news headlines from Core API.
|
|
class NewsDatasource {
|
|
NewsDatasource(this._dio);
|
|
|
|
final Dio _dio;
|
|
|
|
static const _basePath = '/tools/news';
|
|
|
|
/// Gets current news headlines.
|
|
///
|
|
/// Returns headlines for the news ticker.
|
|
Future<NewsData> getNews() async {
|
|
final response = await _dio.get<Map<String, dynamic>>(_basePath);
|
|
final data = response.data;
|
|
|
|
if (data == null) {
|
|
throw Exception('Failed to fetch news data');
|
|
}
|
|
|
|
return NewsData.fromJson(data);
|
|
}
|
|
}
|
|
|
|
/// Provides the news datasource.
|
|
@riverpod
|
|
NewsDatasource newsDatasource(Ref ref) {
|
|
final dio = ref.watch(coreApiClientProvider);
|
|
return NewsDatasource(dio);
|
|
}
|