mirror of
https://github.com/friebetill/TubeCards.git
synced 2025-08-15 18:42:58 +08:00
121 lines
3.4 KiB
Dart
121 lines
3.4 KiB
Dart
import 'dart:math';
|
|
|
|
import 'package:ferry/typed_links.dart';
|
|
|
|
import '../../../services/tubecards/deck_service.dart';
|
|
import '../../queries/__generated__/decks.data.gql.dart';
|
|
import '../../queries/__generated__/decks.req.gql.dart';
|
|
import '../../queries/__generated__/decks.var.gql.dart';
|
|
import 'connection_utils.dart';
|
|
|
|
class DecksHelper {
|
|
DecksHelper(
|
|
this.proxy, {
|
|
required bool? isActive,
|
|
bool? isPublic,
|
|
String? roleId,
|
|
}) : firstPageRequest = GDecksReq((b) => b.vars
|
|
..first = decksPageSize
|
|
..isActive = isActive
|
|
..isPublic = isPublic
|
|
..roleId = roleId);
|
|
|
|
final CacheProxy proxy;
|
|
final GDecksReq firstPageRequest;
|
|
|
|
void changeTotalCountBy(int amount) {
|
|
final pageRequests = getAllPageRequests(
|
|
proxy,
|
|
firstPageRequest,
|
|
_buildNextRequest,
|
|
_hasNextPage,
|
|
);
|
|
|
|
for (final request in pageRequests) {
|
|
final cachedResponse = proxy.readQuery(request)!;
|
|
|
|
final updatedResponse = cachedResponse.rebuild((b) => b
|
|
.viewer
|
|
.deckConnection
|
|
.totalCount = max(0, b.viewer.deckConnection.totalCount! + amount));
|
|
|
|
proxy.writeQuery(request, updatedResponse);
|
|
}
|
|
}
|
|
|
|
void addDeck(Map<String, dynamic> deck) {
|
|
final createdAt = DateTime.parse(deck['createdAt'] as String);
|
|
final request =
|
|
getRequestToPredicatePage<GDecksData, GDecksVars, GDecksReq>(
|
|
proxy,
|
|
firstPageRequest,
|
|
(data) {
|
|
if (data.viewer.deckConnection?.nodes == null) {
|
|
return true;
|
|
}
|
|
|
|
return data.viewer.deckConnection!.nodes
|
|
.any((d) => d.createdAt.isAfter(createdAt)) ||
|
|
!data.viewer.deckConnection!.pageInfo.hasNextPage;
|
|
},
|
|
_buildNextRequest,
|
|
_hasNextPage,
|
|
);
|
|
if (request == null) {
|
|
return;
|
|
}
|
|
|
|
final cachedResponse = proxy.readQuery(request)!;
|
|
|
|
final updatedResponse = cachedResponse.rebuild((b) {
|
|
var insertIndex = cachedResponse.viewer.deckConnection?.nodes
|
|
.indexWhere((d) => d.createdAt.isAfter(createdAt)) ??
|
|
0;
|
|
insertIndex = insertIndex != -1
|
|
? insertIndex
|
|
: cachedResponse.viewer.deckConnection!.nodes.length;
|
|
|
|
b.viewer.deckConnection.nodes.insert(
|
|
insertIndex,
|
|
GDecksData_viewer_deckConnection_nodes.fromJson(deck)!,
|
|
);
|
|
});
|
|
|
|
proxy.writeQuery(request, updatedResponse);
|
|
}
|
|
|
|
void removeDeck(String id) {
|
|
final pageRequestWithDeck =
|
|
getRequestToPredicatePage<GDecksData, GDecksVars, GDecksReq>(
|
|
proxy,
|
|
firstPageRequest,
|
|
(page) => _idPredicate(page, id),
|
|
_buildNextRequest,
|
|
_hasNextPage,
|
|
);
|
|
if (pageRequestWithDeck == null) {
|
|
return;
|
|
}
|
|
|
|
final cachedResponse = proxy.readQuery(pageRequestWithDeck)!;
|
|
final updatedResponse = cachedResponse.rebuild((b) {
|
|
b.viewer.deckConnection.nodes.removeWhere((c) => c.id == id);
|
|
});
|
|
|
|
proxy.writeQuery(pageRequestWithDeck, updatedResponse);
|
|
}
|
|
|
|
GDecksReq _buildNextRequest(GDecksReq request, GDecksData response) {
|
|
return request.rebuild((b) =>
|
|
b.vars.after = response.viewer.deckConnection!.pageInfo.endCursor);
|
|
}
|
|
|
|
bool _hasNextPage(GDecksData? response) {
|
|
return response?.viewer.deckConnection!.pageInfo.endCursor != null;
|
|
}
|
|
|
|
bool _idPredicate(GDecksData response, String cardId) {
|
|
return response.viewer.deckConnection!.nodes.any((c) => c.id == cardId);
|
|
}
|
|
}
|