Show robot on profile page

This commit is contained in:
2025-08-23 17:32:49 +08:00
parent 178c12b893
commit 0251697951
9 changed files with 240 additions and 43 deletions

View File

@@ -7,6 +7,7 @@ import 'package:go_router/go_router.dart';
import 'package:gap/gap.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:island/models/chat.dart';
import 'package:island/models/developer.dart';
import 'package:island/models/relationship.dart';
import 'package:island/models/account.dart';
import 'package:island/pods/config.dart';
@@ -112,6 +113,24 @@ Future<SnRelationship?> accountRelationship(Ref ref, String uname) async {
}
}
@riverpod
Future<SnDeveloper?> accountBotDeveloper(Ref ref, String uname) async {
final account = await ref.watch(accountProvider(uname).future);
if (account.automatedId == null) return null;
final apiClient = ref.watch(apiClientProvider);
try {
final resp = await apiClient.get(
"/develop/bots/${account.automatedId}/developer",
);
return SnDeveloper.fromJson(resp.data);
} catch (err) {
if (err is DioException && err.response?.statusCode == 404) {
return null;
}
rethrow;
}
}
class AccountProfileScreen extends HookConsumerWidget {
final String name;
const AccountProfileScreen({super.key, required this.name});
@@ -128,6 +147,7 @@ class AccountProfileScreen extends HookConsumerWidget {
);
final accountChat = ref.watch(accountDirectChatProvider(name));
final accountRelationship = ref.watch(accountRelationshipProvider(name));
final accountDeveloper = ref.watch(accountBotDeveloperProvider(name));
final appbarColor = ref.watch(accountAppbarForcegroundColorProvider(name));
@@ -292,6 +312,19 @@ class AccountProfileScreen extends HookConsumerWidget {
),
],
),
if (accountDeveloper.value != null)
Row(
spacing: 7,
children: [
const Icon(Symbols.smart_toy, size: 18),
Text(
'botAutomatedBy'.tr(
args: [accountDeveloper.value!.publisher!.nick],
),
).fontSize(13),
],
).opacity(0.75),
const Gap(4),
AccountStatusWidget(uname: name, padding: EdgeInsets.zero),
],
),

View File

@@ -639,5 +639,128 @@ class _AccountRelationshipProviderElement
String get uname => (origin as AccountRelationshipProvider).uname;
}
String _$accountBotDeveloperHash() =>
r'673534770640a8cf1484ea0af0f4d0ef283ef157';
/// See also [accountBotDeveloper].
@ProviderFor(accountBotDeveloper)
const accountBotDeveloperProvider = AccountBotDeveloperFamily();
/// See also [accountBotDeveloper].
class AccountBotDeveloperFamily extends Family<AsyncValue<SnDeveloper?>> {
/// See also [accountBotDeveloper].
const AccountBotDeveloperFamily();
/// See also [accountBotDeveloper].
AccountBotDeveloperProvider call(String uname) {
return AccountBotDeveloperProvider(uname);
}
@override
AccountBotDeveloperProvider getProviderOverride(
covariant AccountBotDeveloperProvider provider,
) {
return call(provider.uname);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'accountBotDeveloperProvider';
}
/// See also [accountBotDeveloper].
class AccountBotDeveloperProvider
extends AutoDisposeFutureProvider<SnDeveloper?> {
/// See also [accountBotDeveloper].
AccountBotDeveloperProvider(String uname)
: this._internal(
(ref) => accountBotDeveloper(ref as AccountBotDeveloperRef, uname),
from: accountBotDeveloperProvider,
name: r'accountBotDeveloperProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$accountBotDeveloperHash,
dependencies: AccountBotDeveloperFamily._dependencies,
allTransitiveDependencies:
AccountBotDeveloperFamily._allTransitiveDependencies,
uname: uname,
);
AccountBotDeveloperProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.uname,
}) : super.internal();
final String uname;
@override
Override overrideWith(
FutureOr<SnDeveloper?> Function(AccountBotDeveloperRef provider) create,
) {
return ProviderOverride(
origin: this,
override: AccountBotDeveloperProvider._internal(
(ref) => create(ref as AccountBotDeveloperRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
uname: uname,
),
);
}
@override
AutoDisposeFutureProviderElement<SnDeveloper?> createElement() {
return _AccountBotDeveloperProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is AccountBotDeveloperProvider && other.uname == uname;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, uname.hashCode);
return _SystemHash.finish(hash);
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin AccountBotDeveloperRef on AutoDisposeFutureProviderRef<SnDeveloper?> {
/// The parameter `uname` of this provider.
String get uname;
}
class _AccountBotDeveloperProviderElement
extends AutoDisposeFutureProviderElement<SnDeveloper?>
with AccountBotDeveloperRef {
_AccountBotDeveloperProviderElement(super.provider);
@override
String get uname => (origin as AccountBotDeveloperProvider).uname;
}
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package