feature: update owners by websocket

This commit is contained in:
Alzalia 2025-08-08 14:23:23 +02:00
parent 49e74feb4f
commit 116bacf428
6 changed files with 139 additions and 23 deletions

View file

@ -1,5 +1,8 @@
import 'dart:async';
import 'dart:convert';
import 'package:flutter/foundation.dart';
import 'package:rxdart/rxdart.dart';
import 'package:seshat/data/services/api_client.dart';
import 'package:seshat/data/services/websocket_client.dart';
import 'package:seshat/domain/models/owner.dart';
@ -14,6 +17,10 @@ class OwnerRepository {
final ApiClient _apiClient;
final WebsocketClient _wsClient;
final BehaviorSubject<Owner> _ownersController = BehaviorSubject<Owner>(
sync: true,
);
late final StreamSubscription sub;
List<Owner>? _cachedOwners;
Future<Result<Owner>> postOwner(
@ -29,29 +36,27 @@ class OwnerRepository {
Future<Result<List<Owner>>> getOwners() async {
if (_cachedOwners == null) {
final result = await _apiClient.getOwners();
_wsClient.connect();
if (result is Ok<List<Owner>>) {
_cachedOwners = result.value;
}
sub = _wsClient.owners.listen((owner) {
debugPrint("\n\n\n\n[3] Added : $owner\n\n\n\n");
_cachedOwners!.add(owner);
_ownersController.add(owner);
});
return result;
} else {
return Result.ok(_cachedOwners!);
}
}
Stream<Owner> liveOwners() async* {
await for (String data in await _wsClient.connect()) {
Map<String, dynamic> decodedData = jsonDecode(
data,
).cast<Map<String, dynamic>>();
Owner owner = Owner.fromJSON(decodedData);
if (_cachedOwners == null) {
await getOwners();
} else {
_cachedOwners!.add(owner);
yield* Stream.value(owner);
}
}
Stream<Owner> get liveOwners => _ownersController.stream;
dispose() {
sub.cancel();
}
}