diff --git a/lib/models/zap_receipt.dart b/lib/models/zap_receipt.dart index 1c6f66d..0a51cb0 100644 --- a/lib/models/zap_receipt.dart +++ b/lib/models/zap_receipt.dart @@ -6,7 +6,7 @@ import 'package:zapstore/utils/extensions.dart'; part 'zap_receipt.g.dart'; -@DataAdapter([NostrAdapter]) +@DataAdapter([NostrAdapter, ZapReceiptAdapter]) class ZapReceipt extends base.ZapReceipt with DataModelMixin { final BelongsTo recipient; final BelongsTo signer; @@ -32,4 +32,14 @@ mixin ZapReceiptAdapter on Adapter { } return super.deserialize(data); } + + List findByRecipient( + {required String pubkey, required String eventId}) { + // NOTE: This query is technically incorrect using IN, but the probability of clashing p/e IDs is extremely low + // This will be fixed with the new purplebase + final result = db.select( + "SELECT z.key, data from zapReceipts z, json_each(json_extract(data, '\$.tags')) WHERE json_extract(value, '\$[0]') in ('p', 'e') and json_extract(value, '\$[1]') in (?, ?)", + [pubkey, eventId]); + return deserializeFromResult(result); + } } diff --git a/lib/models/zap_receipt.g.dart b/lib/models/zap_receipt.g.dart index 6f100fa..a106043 100644 --- a/lib/models/zap_receipt.g.dart +++ b/lib/models/zap_receipt.g.dart @@ -44,13 +44,14 @@ mixin _$ZapReceiptAdapter on Adapter { final _zapReceiptsFinders = {}; class $ZapReceiptAdapter = Adapter - with _$ZapReceiptAdapter, NostrAdapter; + with _$ZapReceiptAdapter, NostrAdapter, ZapReceiptAdapter; final zapReceiptsAdapterProvider = Provider>( (ref) => $ZapReceiptAdapter(ref, InternalHolder(_zapReceiptsFinders))); extension ZapReceiptAdapterX on Adapter { NostrAdapter get nostrAdapter => this as NostrAdapter; + ZapReceiptAdapter get zapReceiptAdapter => this as ZapReceiptAdapter; } extension ZapReceiptRelationshipGraphNodeX diff --git a/lib/widgets/zap_receipts.dart b/lib/widgets/zap_receipts.dart index 0e7f487..5728092 100644 --- a/lib/widgets/zap_receipts.dart +++ b/lib/widgets/zap_receipts.dart @@ -1,7 +1,7 @@ import 'dart:async'; +import 'package:flutter_data/flutter_data.dart'; import 'package:ndk/domain_layer/entities/nip_01_event.dart'; -import 'package:purplebase/purplebase.dart' hide FileMetadata; import 'package:zapstore/main.data.dart'; import 'package:flutter/material.dart'; @@ -9,6 +9,7 @@ import 'package:gap/gap.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:zapstore/models/file_metadata.dart'; import 'package:zapstore/models/user.dart'; +import 'package:zapstore/models/zap_receipt.dart'; import 'package:zapstore/widgets/rounded_image.dart'; class ZapReceipts extends HookConsumerWidget { @@ -74,12 +75,10 @@ class ZapReceiptsNotifier extends StateNotifier>> { StreamSubscription? sub; ZapReceiptsNotifier(this.ref, this.fileMetadata) - : super(AsyncData(ref.zapReceipts - // TODO: Perform an actual query - .findAllLocal() - .where((r) => - r.recipient.id == fileMetadata.author.id && - r.eventId == fileMetadata.id) + : super(AsyncData(ref.zapReceipts.zapReceiptAdapter + .findByRecipient( + pubkey: fileMetadata.author.id!.toString(), + eventId: fileMetadata.id!.toString()) .toSet())) { final adapter = ref.users.nostrAdapter; @@ -91,10 +90,8 @@ class ZapReceiptsNotifier extends StateNotifier>> { pubKey: recipient, eventId: fileMetadata.event.id); sub = receiptsResponse.stream.listen((data) { - state = AsyncData({ - if (state.hasValue) ...state.value!, - Event.getConstructor()!.call(data.toJson()) - }); + final model = ZapReceipt.fromJson(data.toJson()).init().saveLocal(); + state = AsyncData({if (state.hasValue) ...state.value!, model}); }); }