mirror of
https://gitlab.com/mysocialportal/relatica
synced 2024-10-20 05:13:31 +00:00
62 lines
1.8 KiB
Dart
62 lines
1.8 KiB
Dart
|
import 'dart:collection';
|
||
|
|
||
|
import 'package:flutter/foundation.dart';
|
||
|
import 'package:result_monad/result_monad.dart';
|
||
|
|
||
|
import '../friendica_client/friendica_client.dart';
|
||
|
import '../friendica_client/paged_response.dart';
|
||
|
import '../friendica_client/paging_data.dart';
|
||
|
import '../globals.dart';
|
||
|
import '../models/exec_error.dart';
|
||
|
import '../models/follow_request.dart';
|
||
|
import 'auth_service.dart';
|
||
|
|
||
|
class FollowRequestsManager extends ChangeNotifier {
|
||
|
static const maxIterations = 20;
|
||
|
final _requests = <String, FollowRequest>{};
|
||
|
|
||
|
List<FollowRequest> get requests => UnmodifiableListView(_requests.values);
|
||
|
|
||
|
Result<FollowRequest, ExecError> getByUserId(String id) {
|
||
|
final request = _requests[id];
|
||
|
return request != null
|
||
|
? Result.ok(request)
|
||
|
: buildErrorResult(
|
||
|
type: ErrorType.rangeError,
|
||
|
message: 'Request for $id not found',
|
||
|
);
|
||
|
}
|
||
|
|
||
|
Future<void> update() async {
|
||
|
var result = await _processPage(PagingData());
|
||
|
var count = 0;
|
||
|
final updatedRequests = <FollowRequest>{};
|
||
|
while (result.isSuccess &&
|
||
|
result.value.hasMorePages &&
|
||
|
count < maxIterations) {
|
||
|
result
|
||
|
.andThenSuccess((requests) => updatedRequests.addAll(requests.data));
|
||
|
result = await _processPage(result.value.next);
|
||
|
count++;
|
||
|
}
|
||
|
|
||
|
_requests.clear();
|
||
|
for (final r in updatedRequests) {
|
||
|
_requests[r.connection.id] = r;
|
||
|
}
|
||
|
notifyListeners();
|
||
|
}
|
||
|
|
||
|
FutureResult<PagedResponse<List<FollowRequest>>, ExecError> _processPage(
|
||
|
PagingData? page) async {
|
||
|
if (page == null) {
|
||
|
return buildErrorResult(type: ErrorType.rangeError);
|
||
|
}
|
||
|
final result =
|
||
|
await RelationshipsClient(getIt<AccountsService>().currentProfile)
|
||
|
.getFollowRequests(page);
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
}
|