Skip to content

Commit c60bb00

Browse files
refactor: replace direct rust api methods call by pubkey formatter
1 parent 63e9a97 commit c60bb00

File tree

11 files changed

+49
-81
lines changed

11 files changed

+49
-81
lines changed

lib/config/providers/auth_provider.dart

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import 'package:whitenoise/config/states/auth_state.dart';
99
import 'package:whitenoise/src/rust/api.dart' show createWhitenoiseConfig, initializeWhitenoise;
1010
import 'package:whitenoise/src/rust/api/accounts.dart';
1111
import 'package:whitenoise/src/rust/api/error.dart' show ApiError;
12-
import 'package:whitenoise/src/rust/api/utils.dart';
12+
import 'package:whitenoise/utils/pubkey_formatter.dart';
1313

1414
/// Auth Provider
1515
///
@@ -291,16 +291,10 @@ class AuthNotifier extends Notifier<AuthState> {
291291
// Check if there are other accounts available
292292
final remainingAccounts = await getAccounts();
293293
// Normalize pubkeys to hex then filter
294-
final activeHex =
295-
activeAccount.pubkey.startsWith('npub')
296-
? hexPubkeyFromNpub(npub: activeAccount.pubkey)
297-
: activeAccount.pubkey.toLowerCase();
294+
final activeHex = PubkeyFormatter(pubkey: activeAccount.pubkey).toHex();
298295
final otherAccounts = <Account>[];
299296
for (final account in remainingAccounts) {
300-
final keyHex =
301-
account.pubkey.startsWith('npub')
302-
? hexPubkeyFromNpub(npub: account.pubkey)
303-
: account.pubkey.toLowerCase();
297+
final keyHex = PubkeyFormatter(pubkey: account.pubkey).toHex();
304298
if (keyHex != activeHex) otherAccounts.add(account);
305299
}
306300
if (otherAccounts.isNotEmpty) {

lib/config/providers/group_provider.dart

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import 'package:whitenoise/domain/models/user_model.dart';
1111
import 'package:whitenoise/src/rust/api/error.dart' show ApiError;
1212
import 'package:whitenoise/src/rust/api/groups.dart';
1313
import 'package:whitenoise/src/rust/api/users.dart' as rust_users;
14-
import 'package:whitenoise/src/rust/api/utils.dart';
1514
import 'package:whitenoise/utils/error_handling.dart';
15+
import 'package:whitenoise/utils/pubkey_formatter.dart';
1616

1717
class GroupsNotifier extends Notifier<GroupsState> {
1818
final _logger = Logger('GroupsNotifier');
@@ -155,8 +155,8 @@ class GroupsNotifier extends Notifier<GroupsState> {
155155
final activePubkey = ref.read(activePubkeyProvider) ?? '';
156156
if (activePubkey.isEmpty) return null;
157157

158-
final currentUserNpub = npubFromHexPubkey(hexPubkey: activePubkey);
159-
final otherUserNpub = npubFromHexPubkey(hexPubkey: otherUserPubkeyHex);
158+
final currentUserNpub = PubkeyFormatter(pubkey: activePubkey).toNpub();
159+
final otherUserNpub = PubkeyFormatter(pubkey: otherUserPubkeyHex).toNpub();
160160

161161
final directMessageGroups = await getDirectMessageGroups();
162162

@@ -310,11 +310,10 @@ class GroupsNotifier extends Notifier<GroupsState> {
310310
final List<User> members = [];
311311
for (final memberPubkey in memberPubkeys) {
312312
try {
313-
final pubkeyString = npubFromHexPubkey(hexPubkey: memberPubkey);
314-
313+
final npub = PubkeyFormatter(pubkey: memberPubkey).toNpub() ?? '';
315314
try {
316315
final metadata = await rust_users.userMetadata(pubkey: memberPubkey);
317-
final user = User.fromMetadata(metadata, pubkeyString);
316+
final user = User.fromMetadata(metadata, npub);
318317
members.add(user);
319318
} catch (metadataError) {
320319
// Log the full exception details with proper Whitenoise ApiError unpacking
@@ -328,10 +327,10 @@ class GroupsNotifier extends Notifier<GroupsState> {
328327
_logger.warning(logMessage, metadataError);
329328
// Create a fallback user with minimal info
330329
final fallbackUser = User(
331-
id: pubkeyString,
330+
id: npub,
332331
displayName: 'Unknown User',
333332
nip05: '',
334-
publicKey: pubkeyString,
333+
publicKey: npub,
335334
);
336335
members.add(fallbackUser);
337336
}
@@ -389,12 +388,11 @@ class GroupsNotifier extends Notifier<GroupsState> {
389388
final List<User> admins = [];
390389
for (final adminPubkey in adminPubkeys) {
391390
try {
392-
// Get pubkey string first to avoid multiple uses of the same PublicKey object
393-
final pubkeyString = npubFromHexPubkey(hexPubkey: adminPubkey);
391+
final npub = PubkeyFormatter(pubkey: adminPubkey).toNpub() ?? '';
394392

395393
try {
396394
final metadata = await rust_users.userMetadata(pubkey: adminPubkey);
397-
final user = User.fromMetadata(metadata, pubkeyString);
395+
final user = User.fromMetadata(metadata, npub);
398396
admins.add(user);
399397
} catch (metadataError) {
400398
// Log the full exception details with proper ApiError unpacking
@@ -408,10 +406,10 @@ class GroupsNotifier extends Notifier<GroupsState> {
408406
_logger.warning(logMessage, metadataError);
409407
// Create a fallback user with minimal info
410408
final fallbackUser = User(
411-
id: pubkeyString,
409+
id: npub,
412410
displayName: 'Unknown User',
413411
nip05: '',
414-
publicKey: pubkeyString,
412+
publicKey: npub,
415413
);
416414
admins.add(fallbackUser);
417415
}
@@ -595,7 +593,7 @@ class GroupsNotifier extends Notifier<GroupsState> {
595593
final groupInformation = await getGroupInformation(groupId: group.mlsGroupId);
596594
if (groupInformation.groupType == GroupType.directMessage) {
597595
try {
598-
final currentUserNpub = npubFromHexPubkey(hexPubkey: currentUserPubkey);
596+
final currentUserNpub = PubkeyFormatter(pubkey: currentUserPubkey).toNpub();
599597
final otherMember = getOtherGroupMember(group.mlsGroupId, currentUserNpub);
600598

601599
if (otherMember == null) {
@@ -883,11 +881,10 @@ class GroupsNotifier extends Notifier<GroupsState> {
883881
return;
884882
}
885883

886-
final usersPubkeyHex = await Future.wait(
887-
membersNpubs.map((userNpub) async {
888-
return hexPubkeyFromNpub(npub: userNpub);
889-
}),
890-
);
884+
final usersPubkeyHex =
885+
membersNpubs.map((userNpub) {
886+
return PubkeyFormatter(pubkey: userNpub).toHex() ?? '';
887+
}).toList();
891888

892889
await addMembersToGroup(
893890
pubkey: activePubkey,
@@ -938,11 +935,10 @@ class GroupsNotifier extends Notifier<GroupsState> {
938935
return;
939936
}
940937

941-
final usersPubkeyHex = await Future.wait(
942-
membersNpubs.map((userNpub) async {
943-
return hexPubkeyFromNpub(npub: userNpub);
944-
}),
945-
);
938+
final usersPubkeyHex =
939+
membersNpubs.map((userNpub) {
940+
return PubkeyFormatter(pubkey: userNpub).toHex() ?? '';
941+
}).toList();
946942

947943
await removeMembersFromGroup(
948944
pubkey: activePubkey,

lib/config/providers/metadata_cache_provider.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import 'package:logging/logging.dart';
66
import 'package:whitenoise/config/providers/active_pubkey_provider.dart';
77
import 'package:whitenoise/domain/models/contact_model.dart';
88
import 'package:whitenoise/src/rust/api/users.dart' as wn_users_api;
9-
import 'package:whitenoise/src/rust/api/utils.dart';
9+
import 'package:whitenoise/utils/pubkey_formatter.dart';
1010
import 'package:whitenoise/utils/public_key_validation_extension.dart';
1111

1212
/// Cached metadata with basic expiration
@@ -68,7 +68,7 @@ class MetadataCacheNotifier extends Notifier<MetadataCacheState> {
6868
/// Convert hex to npub safely
6969
Future<String> _safeHexToNpub(String hexPubkey) async {
7070
try {
71-
return npubFromHexPubkey(hexPubkey: hexPubkey);
71+
return PubkeyFormatter(pubkey: hexPubkey).toNpub() ?? '';
7272
} catch (e) {
7373
_logger.warning('Failed to convert hex to npub for $hexPubkey: $e');
7474
return hexPubkey;
@@ -78,7 +78,7 @@ class MetadataCacheNotifier extends Notifier<MetadataCacheState> {
7878
/// Convert npub to hex safely
7979
Future<String> _safeNpubToHex(String npub) async {
8080
try {
81-
return hexPubkeyFromNpub(npub: npub);
81+
return PubkeyFormatter(pubkey: npub).toHex() ?? '';
8282
} catch (e) {
8383
_logger.warning('Failed to convert npub to hex for $npub: $e');
8484
return npub;

lib/domain/services/dm_chat_service.dart

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,15 @@ import 'package:whitenoise/config/providers/group_provider.dart';
44
import 'package:whitenoise/domain/models/contact_model.dart';
55
import 'package:whitenoise/domain/models/dm_chat_data.dart';
66
import 'package:whitenoise/src/rust/api/users.dart' as wn_users_api;
7-
import 'package:whitenoise/src/rust/api/utils.dart';
8-
import 'package:whitenoise/utils/public_key_validation_extension.dart';
7+
import 'package:whitenoise/utils/pubkey_formatter.dart';
98

109
class DMChatService {
1110
static Future<DMChatData?> getDMChatData(String groupId, WidgetRef ref) async {
1211
try {
1312
final activePubkey = ref.read(activePubkeyProvider) ?? '';
1413
if (activePubkey.isEmpty) return null;
1514

16-
final currentUserNpub = npubFromHexPubkey(
17-
hexPubkey: activePubkey,
18-
);
19-
15+
final currentUserNpub = PubkeyFormatter(pubkey: activePubkey).toNpub();
2016
final otherMember = ref
2117
.read(groupsProvider.notifier)
2218
.getOtherGroupMember(
@@ -27,10 +23,7 @@ class DMChatService {
2723
if (otherMember != null) {
2824
final user = await wn_users_api.getUser(pubkey: otherMember.publicKey);
2925
final otherMemberPubkey = otherMember.publicKey;
30-
String otherMemberNpubPubkey = otherMemberPubkey;
31-
if (otherMemberPubkey.isValidHexPublicKey) {
32-
otherMemberNpubPubkey = npubFromHexPubkey(hexPubkey: otherMemberPubkey);
33-
}
26+
final otherMemberNpubPubkey = PubkeyFormatter(pubkey: otherMemberPubkey).toNpub() ?? '';
3427
final contactModel = ContactModel.fromMetadata(
3528
pubkey: otherMemberNpubPubkey,
3629
metadata: user.metadata,

lib/ui/chat/chat_info/group_chat_info.dart

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,7 @@ class _GroupChatInfoState extends ConsumerState<GroupChatInfo> {
3030
final groupDetails = ref.read(groupsProvider).groupsMap?[widget.groupId];
3131
if (groupDetails?.nostrGroupId != null) {
3232
try {
33-
final npub = npubFromHexPubkey(
34-
hexPubkey: groupDetails!.nostrGroupId,
35-
);
33+
final npub = PubkeyFormatter(pubkey: groupDetails?.nostrGroupId).toNpub();
3634
if (mounted) {
3735
setState(() {
3836
groupNpub = npub;
@@ -104,7 +102,7 @@ class _GroupChatInfoState extends ConsumerState<GroupChatInfo> {
104102
Future<void> _loadCurrentUserNpub() async {
105103
final activeAccount = ref.read(activePubkeyProvider) ?? '';
106104
if (activeAccount.isNotEmpty) {
107-
final currentUserNpub = npubFromHexPubkey(hexPubkey: activeAccount);
105+
final currentUserNpub = PubkeyFormatter(pubkey: activeAccount).toNpub();
108106
if (mounted) {
109107
setState(() {
110108
this.currentUserNpub = currentUserNpub;

lib/ui/chat/invite/chat_invite_screen.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ import 'package:whitenoise/config/providers/group_provider.dart';
77
import 'package:whitenoise/config/providers/toast_message_provider.dart';
88
import 'package:whitenoise/config/providers/user_profile_data_provider.dart';
99
import 'package:whitenoise/config/providers/welcomes_provider.dart';
10-
import 'package:whitenoise/src/rust/api/utils.dart';
1110
import 'package:whitenoise/src/rust/api/welcomes.dart';
1211
import 'package:whitenoise/ui/chat/widgets/contact_info.dart';
1312
import 'package:whitenoise/ui/core/themes/src/extensions.dart';
1413
import 'package:whitenoise/ui/core/ui/wn_app_bar.dart';
1514
import 'package:whitenoise/ui/core/ui/wn_avatar.dart';
1615
import 'package:whitenoise/ui/core/ui/wn_button.dart';
16+
import 'package:whitenoise/utils/pubkey_formatter.dart';
1717
import 'package:whitenoise/utils/string_extensions.dart';
1818

1919
class ChatInviteScreen extends ConsumerStatefulWidget {
@@ -178,7 +178,7 @@ class GroupInviteHeader extends StatelessWidget {
178178
),
179179
Gap(16.h),
180180
Text(
181-
npubFromHexPubkey(hexPubkey: welcome.nostrGroupId).formatPublicKey(),
181+
PubkeyFormatter(pubkey: welcome.nostrGroupId).toNpub()?.formatPublicKey() ?? '',
182182
textAlign: TextAlign.center,
183183
style: TextStyle(
184184
fontSize: 14.sp,
@@ -280,7 +280,7 @@ class DMInviteHeader extends ConsumerWidget {
280280
),
281281
Gap(12.h),
282282
Text(
283-
npubFromHexPubkey(hexPubkey: welcome.welcomer).formatPublicKey(),
283+
PubkeyFormatter(pubkey: welcome.welcomer).toNpub()?.formatPublicKey() ?? '',
284284
textAlign: TextAlign.center,
285285
style: TextStyle(
286286
fontSize: 12.sp,

lib/ui/chat/widgets/chat_header_widget.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ import 'package:whitenoise/config/providers/group_provider.dart';
66
import 'package:whitenoise/domain/models/dm_chat_data.dart';
77
import 'package:whitenoise/domain/services/dm_chat_service.dart';
88
import 'package:whitenoise/src/rust/api/groups.dart';
9-
import 'package:whitenoise/src/rust/api/utils.dart';
109
import 'package:whitenoise/ui/core/themes/assets.dart';
1110
import 'package:whitenoise/ui/core/themes/src/extensions.dart';
1211
import 'package:whitenoise/ui/core/ui/wn_avatar.dart';
12+
import 'package:whitenoise/utils/pubkey_formatter.dart';
1313
import 'package:whitenoise/utils/string_extensions.dart';
1414

1515
class ChatContactHeader extends ConsumerWidget {
@@ -56,14 +56,14 @@ class _GroupChatHeaderState extends ConsumerState<GroupChatHeader> {
5656
@override
5757
void initState() {
5858
super.initState();
59-
_groupNpub = npubFromHexPubkey(hexPubkey: widget.group.nostrGroupId);
59+
_groupNpub = PubkeyFormatter(pubkey: widget.group.nostrGroupId).toNpub();
6060
}
6161

6262
@override
6363
void didUpdateWidget(GroupChatHeader oldWidget) {
6464
super.didUpdateWidget(oldWidget);
6565
if (oldWidget.group.nostrGroupId != widget.group.nostrGroupId) {
66-
_groupNpub = npubFromHexPubkey(hexPubkey: widget.group.nostrGroupId);
66+
_groupNpub = PubkeyFormatter(pubkey: widget.group.nostrGroupId).toNpub();
6767
}
6868
}
6969

lib/ui/contact_list/group_welcome_invitation_sheet.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ import 'package:whitenoise/config/extensions/toast_extension.dart';
66
import 'package:whitenoise/config/providers/active_pubkey_provider.dart';
77
import 'package:whitenoise/src/rust/api/metadata.dart' show FlutterMetadata;
88
import 'package:whitenoise/src/rust/api/users.dart' as wn_users_api;
9-
import 'package:whitenoise/src/rust/api/utils.dart';
109
import 'package:whitenoise/src/rust/api/welcomes.dart';
1110
import 'package:whitenoise/ui/core/themes/src/extensions.dart';
1211
import 'package:whitenoise/ui/core/ui/wn_avatar.dart';
1312
import 'package:whitenoise/ui/core/ui/wn_bottom_sheet.dart';
1413
import 'package:whitenoise/ui/core/ui/wn_button.dart';
14+
import 'package:whitenoise/utils/pubkey_formatter.dart';
1515
import 'package:whitenoise/utils/string_extensions.dart';
1616

1717
class GroupWelcomeInvitationSheet extends StatelessWidget {
@@ -126,7 +126,7 @@ class _GroupMessageInviteState extends ConsumerState<GroupMessageInvite> {
126126

127127
Future<String> _getDisplayablePublicKey() async {
128128
try {
129-
final npub = npubFromHexPubkey(hexPubkey: widget.welcome.nostrGroupId);
129+
final npub = PubkeyFormatter(pubkey: widget.welcome.nostrGroupId).toNpub() ?? '';
130130
return npub;
131131
} catch (e) {
132132
return widget.welcome.nostrGroupId.formatPublicKey();
@@ -296,7 +296,7 @@ class _DirectMessageInviteCardState extends ConsumerState<DirectMessageInviteCar
296296

297297
Future<String> _getDisplayablePublicKey() async {
298298
try {
299-
final npub = npubFromHexPubkey(hexPubkey: widget.welcome.welcomer);
299+
final npub = PubkeyFormatter(pubkey: widget.welcome.welcomer).toNpub() ?? '';
300300
return npub;
301301
} catch (e) {
302302
return widget.welcome.welcomer.formatPublicKey();

lib/ui/contact_list/widgets/contact_list_tile.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ import 'package:flutter/material.dart';
22
import 'package:flutter_screenutil/flutter_screenutil.dart';
33
import 'package:gap/gap.dart';
44
import 'package:whitenoise/domain/models/contact_model.dart';
5-
import 'package:whitenoise/src/rust/api/utils.dart';
65
import 'package:whitenoise/ui/core/themes/assets.dart';
76
import 'package:whitenoise/ui/core/themes/src/extensions.dart';
87
import 'package:whitenoise/ui/core/ui/wn_avatar.dart';
98
import 'package:whitenoise/ui/core/ui/wn_image.dart';
9+
import 'package:whitenoise/utils/pubkey_formatter.dart';
1010
import 'package:whitenoise/utils/string_extensions.dart';
1111

1212
class ContactListTile extends StatelessWidget {
@@ -33,7 +33,7 @@ class ContactListTile extends StatelessWidget {
3333

3434
Future<String> _getNpub(String publicKeyHex) async {
3535
try {
36-
final npub = npubFromHexPubkey(hexPubkey: publicKeyHex);
36+
final npub = PubkeyFormatter(pubkey: publicKeyHex).toNpub() ?? '';
3737
return npub.formatPublicKey();
3838
} catch (e) {
3939
// Return the full hex key as fallback

lib/ui/settings/general_settings_screen.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import 'package:whitenoise/domain/models/contact_model.dart';
1515
import 'package:whitenoise/domain/services/draft_message_service.dart';
1616
import 'package:whitenoise/routing/routes.dart';
1717
import 'package:whitenoise/src/rust/api/accounts.dart' show Account, getAccounts;
18-
import 'package:whitenoise/src/rust/api/utils.dart';
1918
import 'package:whitenoise/ui/contact_list/widgets/contact_list_tile.dart';
2019
import 'package:whitenoise/ui/core/themes/assets.dart';
2120
import 'package:whitenoise/ui/core/themes/src/extensions.dart';
@@ -25,6 +24,7 @@ import 'package:whitenoise/ui/core/ui/wn_dialog.dart';
2524
import 'package:whitenoise/ui/core/ui/wn_image.dart';
2625
import 'package:whitenoise/ui/settings/developer/developer_settings_screen.dart';
2726
import 'package:whitenoise/ui/settings/profile/switch_profile_bottom_sheet.dart';
27+
import 'package:whitenoise/utils/pubkey_formatter.dart';
2828
import 'package:whitenoise/utils/public_key_validation_extension.dart';
2929

3030
class GeneralSettingsScreen extends ConsumerStatefulWidget {
@@ -152,7 +152,7 @@ class _GeneralSettingsScreenState extends ConsumerState<GeneralSettingsScreen> {
152152
// Try to convert npub to hex for matching
153153
String hexKey = selectedProfile.publicKey;
154154
if (selectedProfile.publicKey.isValidNpubPublicKey) {
155-
hexKey = hexPubkeyFromNpub(npub: selectedProfile.publicKey);
155+
hexKey = PubkeyFormatter(pubkey: selectedProfile.publicKey).toHex() ?? '';
156156
}
157157

158158
selectedAccount = _accounts.where((account) => account.pubkey == hexKey).firstOrNull;

0 commit comments

Comments
 (0)