From 6bd1affa34cbfa423bfd3097be994fa41ff1d90e Mon Sep 17 00:00:00 2001 From: franzap <_@franzap.com> Date: Thu, 13 Jun 2024 20:22:07 -0300 Subject: [PATCH] Fix text/plain NIP-05 response (& auto-prepend _@) Show errors in toast Closes #90 --- lib/models/user.dart | 30 ++++++++++++++++++++++-------- lib/widgets/app_drawer.dart | 11 ++++++++--- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/lib/models/user.dart b/lib/models/user.dart index bee2517..5d0fc69 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -120,6 +120,11 @@ mixin UserAdapter on NostrAdapter { return data.models; } + @override + bool isOfflineError(Object? error) { + return false; + } + @override Future findOne(Object id, {bool remote = true, @@ -131,24 +136,33 @@ mixin UserAdapter on NostrAdapter { DataRequestLabel? label}) async { if (id.toString().isEmpty) return null; - String? publicKey = id.toString(); + var publicKey = id.toString(); if (publicKey.startsWith('npub')) { publicKey = publicKey.hexKey; - } else if (publicKey.contains('@')) { - final [username, domain] = id.toString().split('@'); + } else { + // If it's not an npub we treat the string as NIP-05 + if (!publicKey.contains('@')) { + // If it does not have a @, we treat the string as a domain name + publicKey = '_@$publicKey'; + } + + final [username, domain] = publicKey.split('@'); publicKey = await sendRequest( Uri.parse('https://$domain/.well-known/nostr.json?name=$username'), onSuccess: (response, label) { - return (response.body as Map)['names']?[username]; + var body = response.body; + if (body is String) { + body = jsonDecode(body); + } + return (body as Map)['names']?[username]; + }, + onError: (e, _) { + throw e; }, ); } - if (publicKey == null) { - return null; - } - final req = RelayRequest( authors: {publicKey}, kinds: {kind, if (params?['contacts'] != null) 3}, diff --git a/lib/widgets/app_drawer.dart b/lib/widgets/app_drawer.dart index 3ec6647..2a7188d 100644 --- a/lib/widgets/app_drawer.dart +++ b/lib/widgets/app_drawer.dart @@ -5,6 +5,7 @@ import 'package:gap/gap.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:zapstore/main.data.dart'; import 'package:zapstore/models/settings.dart'; +import 'package:zapstore/utils/extensions.dart'; import 'package:zapstore/widgets/rounded_image.dart'; class LoginContainer extends HookConsumerWidget { @@ -76,9 +77,13 @@ class LoginContainer extends HookConsumerWidget { child: CircularProgressIndicator(), ), onPressed: () async { - final user = - await ref.users.findOne(controller.text.trim()); - ref.settings.findOneLocalById('_')!.user.value = user; + return ref.users + .findOne(controller.text.trim()) + .then((user) { + ref.settings.findOneLocalById('_')!.user.value = user; + }).catchError((e) { + context.showError(e.toString()); + }); }, builder: (context, child, callback, buttonState) { return Padding(