postComment method

Future<bool> postComment(
  1. String content
)

Implementation

Future<bool> postComment(String content) async {
  final text = content.trim();
  final pubkey = ndk.accounts.getPublicKey();
  if (text.isEmpty || pubkey == null || !canComment || _state.posting) {
    return false;
  }
  _setState(_state.copyWith(posting: true, clearError: true));
  try {
    final event = Nip01Event(
      pubKey: pubkey,
      kind: 1111,
      tags: [
        ['A', applicationAddress, ...relays.take(1)],
        ['K', softwareApplicationKind.toString()],
        ['P', release.event.pubKey],
        ['a', releaseAddress, ...relays.take(1)],
        ['k', softwareReleaseKind.toString()],
        ['p', release.event.pubKey],
      ],
      content: text,
    );
    final responses = await ndk.broadcast
        .broadcast(
          nostrEvent: event,
          specificRelays: relays.isEmpty ? null : relays,
        )
        .broadcastDoneFuture;
    if (!responses.any((response) => response.broadcastSuccessful)) {
      final relayErrors = responses
          .map((response) => response.msg.trim())
          .where((message) => message.isNotEmpty)
          .toSet()
          .join('; ');
      throw StateError(
        relayErrors.isEmpty
            ? 'No relay accepted the comment.'
            : 'No relay accepted the comment: $relayErrors',
      );
    }
    _setState(_state.copyWith(posting: false));
    final activeLoad = _loadFuture;
    if (activeLoad != null) await activeLoad;
    await load();
    return true;
  } catch (error) {
    _setState(
      _state.copyWith(
        posting: false,
        error: error.toString(),
        errorFromPosting: true,
      ),
    );
    return false;
  }
}