🐛 Dozens of microservices releated changes

This commit is contained in:
2025-07-19 12:10:23 +08:00
parent 4499d4ec8e
commit 903008d397
9 changed files with 83 additions and 45 deletions

View File

@@ -39,7 +39,7 @@ class WebFeedNotifier
try { try {
final client = ref.read(apiClientProvider); final client = ref.read(apiClientProvider);
final response = await client.get( final response = await client.get(
'/publishers/${arg.pubName}/feeds/${arg.feedId}', '/sphere/publishers/${arg.pubName}/feeds/${arg.feedId}',
); );
return SnWebFeed.fromJson(response.data); return SnWebFeed.fromJson(response.data);
} catch (e) { } catch (e) {
@@ -51,7 +51,7 @@ class WebFeedNotifier
state = const AsyncValue.loading(); state = const AsyncValue.loading();
try { try {
final client = ref.read(apiClientProvider); final client = ref.read(apiClientProvider);
final url = '/publishers/${feed.publisherId}/feeds'; final url = '/sphere/publishers/${feed.publisherId}/feeds';
final response = final response =
feed.id.isEmpty feed.id.isEmpty
@@ -98,7 +98,7 @@ class WebFeedNotifier
try { try {
final client = ref.read(apiClientProvider); final client = ref.read(apiClientProvider);
await client.post( await client.post(
'/publishers/${arg.pubName}/feeds/$feedId/scrap', '/sphere/publishers/${arg.pubName}/feeds/$feedId/scrap',
options: Options( options: Options(
sendTimeout: const Duration(seconds: 60), sendTimeout: const Duration(seconds: 60),
receiveTimeout: const Duration(seconds: 180), receiveTimeout: const Duration(seconds: 180),
@@ -107,7 +107,7 @@ class WebFeedNotifier
// Reload the feed // Reload the feed
final response = await client.get( final response = await client.get(
'/publishers/${arg.pubName}/feeds/$feedId', '/sphere/publishers/${arg.pubName}/feeds/$feedId',
); );
state = AsyncValue.data(SnWebFeed.fromJson(response.data)); state = AsyncValue.data(SnWebFeed.fromJson(response.data));
} catch (error, stackTrace) { } catch (error, stackTrace) {

View File

@@ -83,7 +83,7 @@ class PublisherMemberListNotifier extends _$PublisherMemberListNotifier
final offset = cursor != null ? int.parse(cursor) : 0; final offset = cursor != null ? int.parse(cursor) : 0;
final response = await apiClient.get( final response = await apiClient.get(
'/publishers/$uname/members', '/sphere/publishers/$uname/members',
queryParameters: {'offset': offset, 'take': _pageSize}, queryParameters: {'offset': offset, 'take': _pageSize},
); );
@@ -143,13 +143,18 @@ class CreatorHubScreen extends HookConsumerWidget {
); );
void updatePublisher() { void updatePublisher() {
context.pushNamed('creatorEdit', pathParameters: {'name': currentPublisher.value!.name}).then(( context
value, .pushNamed(
) async { 'creatorEdit',
pathParameters: {'name': currentPublisher.value!.name},
)
.then((value) async {
if (value == null) return; if (value == null) return;
final data = await ref.refresh(publishersManagedProvider.future); final data = await ref.refresh(publishersManagedProvider.future);
currentPublisher.value = currentPublisher.value =
data.where((e) => e.id == currentPublisher.value!.id).firstOrNull; data
.where((e) => e.id == currentPublisher.value!.id)
.firstOrNull;
}); });
} }
@@ -350,7 +355,12 @@ class CreatorHubScreen extends HookConsumerWidget {
horizontal: 24, horizontal: 24,
), ),
onTap: () { onTap: () {
context.pushNamed('creatorStickers', pathParameters: {'name': currentPublisher.value!.name}); context.pushNamed(
'creatorStickers',
pathParameters: {
'name': currentPublisher.value!.name,
},
);
}, },
), ),
ListTile( ListTile(
@@ -362,7 +372,12 @@ class CreatorHubScreen extends HookConsumerWidget {
horizontal: 24, horizontal: 24,
), ),
onTap: () { onTap: () {
context.pushNamed('creatorPosts', pathParameters: {'name': currentPublisher.value!.name}); context.pushNamed(
'creatorPosts',
pathParameters: {
'name': currentPublisher.value!.name,
},
);
}, },
), ),
ListTile( ListTile(

View File

@@ -28,9 +28,12 @@ class StickersScreen extends HookConsumerWidget {
actions: [ actions: [
IconButton( IconButton(
onPressed: () { onPressed: () {
context.pushNamed('creatorStickerPackNew', queryParameters: {'pubName': pubName}).then(( context
value, .pushNamed(
) { 'creatorStickerPackNew',
queryParameters: {'pubName': pubName},
)
.then((value) {
if (value != null) { if (value != null) {
ref.invalidate(stickerPacksNotifierProvider(pubName)); ref.invalidate(stickerPacksNotifierProvider(pubName));
} }
@@ -71,7 +74,10 @@ class SliverStickerPacksList extends HookConsumerWidget {
subtitle: Text(sticker.description), subtitle: Text(sticker.description),
trailing: const Icon(Symbols.chevron_right), trailing: const Icon(Symbols.chevron_right),
onTap: () { onTap: () {
context.pushNamed('creatorStickerPackDetail', pathParameters: {'pubName': pubName, 'packId': sticker.id}); context.pushNamed(
'creatorStickerPackDetail',
pathParameters: {'pubName': pubName, 'packId': sticker.id},
);
}, },
); );
}, },
@@ -99,7 +105,7 @@ class StickerPacksNotifier extends _$StickerPacksNotifier
try { try {
final response = await client.get( final response = await client.get(
'/stickers', '/sphere/stickers',
queryParameters: { queryParameters: {
'offset': offset, 'offset': offset,
'take': _pageSize, 'take': _pageSize,
@@ -129,7 +135,7 @@ class StickerPacksNotifier extends _$StickerPacksNotifier
Future<SnStickerPack?> stickerPack(Ref ref, String? packId) async { Future<SnStickerPack?> stickerPack(Ref ref, String? packId) async {
if (packId == null) return null; if (packId == null) return null;
final apiClient = ref.watch(apiClientProvider); final apiClient = ref.watch(apiClientProvider);
final resp = await apiClient.get('/stickers/$packId'); final resp = await apiClient.get('/sphere/stickers/$packId');
return SnStickerPack.fromJson(resp.data); return SnStickerPack.fromJson(resp.data);
} }
@@ -175,7 +181,7 @@ class EditStickerPacksScreen extends HookConsumerWidget {
submitting.value = true; submitting.value = true;
final apiClient = ref.watch(apiClientProvider); final apiClient = ref.watch(apiClientProvider);
final resp = await apiClient.request( final resp = await apiClient.request(
'/stickers', '/sphere/stickers',
data: { data: {
'name': nameController.text, 'name': nameController.text,
'description': descriptionController.text, 'description': descriptionController.text,

View File

@@ -25,14 +25,14 @@ part 'hub.g.dart';
Future<DeveloperStats?> developerStats(Ref ref, String? uname) async { Future<DeveloperStats?> developerStats(Ref ref, String? uname) async {
if (uname == null) return null; if (uname == null) return null;
final apiClient = ref.watch(apiClientProvider); final apiClient = ref.watch(apiClientProvider);
final resp = await apiClient.get('/developers/$uname/stats'); final resp = await apiClient.get('/sphere/developers/$uname/stats');
return DeveloperStats.fromJson(resp.data); return DeveloperStats.fromJson(resp.data);
} }
@riverpod @riverpod
Future<List<SnPublisher>> developers(Ref ref) async { Future<List<SnPublisher>> developers(Ref ref) async {
final client = ref.watch(apiClientProvider); final client = ref.watch(apiClientProvider);
final resp = await client.get('/developers'); final resp = await client.get('/sphere/developers');
return resp.data return resp.data
.map((e) => SnPublisher.fromJson(e)) .map((e) => SnPublisher.fromJson(e))
.cast<SnPublisher>() .cast<SnPublisher>()
@@ -243,7 +243,12 @@ class DeveloperHubScreen extends HookConsumerWidget {
horizontal: 24, horizontal: 24,
), ),
onTap: () { onTap: () {
context.pushNamed('developerApps', pathParameters: {'name': currentDeveloper.value!.name}); context.pushNamed(
'developerApps',
pathParameters: {
'name': currentDeveloper.value!.name,
},
);
}, },
), ),
], ],
@@ -334,7 +339,7 @@ class _DeveloperEnrollmentSheet extends HookConsumerWidget {
Future<void> enroll(SnPublisher publisher) async { Future<void> enroll(SnPublisher publisher) async {
try { try {
final client = ref.read(apiClientProvider); final client = ref.read(apiClientProvider);
await client.post('/developers/${publisher.name}/enroll'); await client.post('/sphere/developers/${publisher.name}/enroll');
if (context.mounted) { if (context.mounted) {
Navigator.pop(context, true); Navigator.pop(context, true);
} }

View File

@@ -166,7 +166,7 @@ class RealmDetailScreen extends HookConsumerWidget {
apiClientProvider, apiClientProvider,
); );
await apiClient.post( await apiClient.post(
'/realms/$slug/members/me', '/sphere/realms/$slug/members/me',
); );
ref.invalidate( ref.invalidate(
realmIdentityProvider(slug), realmIdentityProvider(slug),
@@ -213,7 +213,10 @@ class RealmDetailScreen extends HookConsumerWidget {
return ChatRoomListTile( return ChatRoomListTile(
room: rooms[index], room: rooms[index],
onTap: () { onTap: () {
context.pushNamed('chatRoom', pathParameters: {'id': rooms[index].id}); context.pushNamed(
'chatRoom',
pathParameters: {'id': rooms[index].id},
);
}, },
); );
}, childCount: rooms.length), }, childCount: rooms.length),
@@ -251,7 +254,10 @@ class _RealmActionMenu extends HookConsumerWidget {
if (isModerator) if (isModerator)
PopupMenuItem( PopupMenuItem(
onTap: () { onTap: () {
context.pushReplacement('/sphere/realms/$realmSlug/edit'); context.pushReplacementNamed(
'realmEdit',
pathParameters: {'slug': realmSlug},
);
}, },
child: Row( child: Row(
children: [ children: [
@@ -319,7 +325,7 @@ class _RealmActionMenu extends HookConsumerWidget {
if (confirm) { if (confirm) {
final client = ref.watch(apiClientProvider); final client = ref.watch(apiClientProvider);
client.delete( client.delete(
'/realms/$realmSlug/members/me', '/sphere/realms/$realmSlug/members/me',
); );
ref.invalidate(realmsJoinedProvider); ref.invalidate(realmsJoinedProvider);
if (context.mounted) { if (context.mounted) {
@@ -389,7 +395,7 @@ class RealmMemberListNotifier extends _$RealmMemberListNotifier
final offset = cursor != null ? int.parse(cursor) : 0; final offset = cursor != null ? int.parse(cursor) : 0;
final response = await apiClient.get( final response = await apiClient.get(
'/realms/$realmSlug/members', '/sphere/realms/$realmSlug/members',
queryParameters: {'offset': offset, 'take': _pageSize}, queryParameters: {'offset': offset, 'take': _pageSize},
); );
@@ -432,7 +438,7 @@ class RealmMemberNotifier extends StateNotifier<RealmMemberState> {
try { try {
final response = await _apiClient.get( final response = await _apiClient.get(
'/realms/$realmSlug/members', '/sphere/realms/$realmSlug/members',
queryParameters: {'offset': offset, 'take': take}, queryParameters: {'offset': offset, 'take': take},
); );
@@ -487,7 +493,7 @@ class _RealmMemberListSheet extends HookConsumerWidget {
try { try {
final apiClient = ref.watch(apiClientProvider); final apiClient = ref.watch(apiClientProvider);
await apiClient.post( await apiClient.post(
'/realms/invites/$realmSlug', '/sphere/realms/invites/$realmSlug',
data: {'related_user_id': result.id, 'role': 0}, data: {'related_user_id': result.id, 'role': 0},
); );
// Refresh both providers // Refresh both providers
@@ -619,7 +625,7 @@ class _RealmMemberListSheet extends HookConsumerWidget {
apiClientProvider, apiClientProvider,
); );
await apiClient.delete( await apiClient.delete(
'/realms/$realmSlug/members/${member.accountId}', '/sphere/realms/$realmSlug/members/${member.accountId}',
); );
// Refresh both providers // Refresh both providers
memberNotifier.reset(); memberNotifier.reset();
@@ -769,7 +775,7 @@ class _RealmMemberRoleSheet extends HookConsumerWidget {
final apiClient = ref.read(apiClientProvider); final apiClient = ref.read(apiClientProvider);
await apiClient.patch( await apiClient.patch(
'/realms/$realmSlug/members/${member.accountId}/role', '/sphere/realms/$realmSlug/members/${member.accountId}/role',
data: newRole, data: newRole,
); );

View File

@@ -108,7 +108,10 @@ class RealmListScreen extends HookConsumerWidget {
title: Text(value[item].name), title: Text(value[item].name),
subtitle: Text(value[item].description), subtitle: Text(value[item].description),
onTap: () { onTap: () {
context.pushNamed('realmDetail', pathParameters: {'slug': value[item].slug}); context.pushNamed(
'realmDetail',
pathParameters: {'slug': value[item].slug},
);
}, },
contentPadding: const EdgeInsets.only( contentPadding: const EdgeInsets.only(
left: 16, left: 16,
@@ -253,7 +256,7 @@ class EditRealmScreen extends HookConsumerWidget {
try { try {
final client = ref.watch(apiClientProvider); final client = ref.watch(apiClientProvider);
final resp = await client.request( final resp = await client.request(
slug == null ? '/realms' : '/realms/$slug', '/sphere${slug == null ? '/realms' : '/realms/$slug'}',
data: { data: {
'slug': slugController.text, 'slug': slugController.text,
'name': nameController.text, 'name': nameController.text,

View File

@@ -51,7 +51,7 @@ class TransactionListNotifier extends _$TransactionListNotifier
final queryParams = {'offset': offset, 'take': _pageSize}; final queryParams = {'offset': offset, 'take': _pageSize};
final response = await client.get( final response = await client.get(
'/wallets/transactions', '/id/wallets/transactions',
queryParameters: queryParams, queryParameters: queryParams,
); );
final total = int.parse(response.headers.value('X-Total') ?? '0'); final total = int.parse(response.headers.value('X-Total') ?? '0');
@@ -110,7 +110,7 @@ class WalletScreen extends HookConsumerWidget {
), ),
], ],
), ),
); ).center();
} }
return Column( return Column(

View File

@@ -27,7 +27,10 @@ class CloudFileWidget extends ConsumerWidget {
final serverUrl = ref.watch(serverUrlProvider); final serverUrl = ref.watch(serverUrlProvider);
final uri = '$serverUrl/drive/files/${item.id}'; final uri = '$serverUrl/drive/files/${item.id}';
var ratio = double.parse(item.fileMeta?['ratio'] ?? 1); var ratio =
item.fileMeta?['ratio'] is num
? item.fileMeta!['ratio'].toDouble()
: double.parse(item.fileMeta?['ratio'] ?? 1);
if (ratio == 0) ratio = 1.0; if (ratio == 0) ratio = 1.0;
final content = switch (item.mimeType?.split('/').firstOrNull) { final content = switch (item.mimeType?.split('/').firstOrNull) {
"image" => AspectRatio( "image" => AspectRatio(

View File

@@ -34,7 +34,7 @@ class RealmListNotifier extends _$RealmListNotifier
}; };
final response = await client.get( final response = await client.get(
'/discovery/realms', '/sphere/discovery/realms',
queryParameters: queryParams, queryParameters: queryParams,
); );
final total = int.parse(response.headers.value('X-Total') ?? '0'); final total = int.parse(response.headers.value('X-Total') ?? '0');