.github
android
assets
ios
lib
controllers
providers
channel.dart
chat_call.dart
config.dart
link_preview.dart
navigation.dart
notification.dart
post.dart
relationship.dart
sn_attachment.dart
sn_network.dart
theme.dart
user_directory.dart
userinfo.dart
websocket.dart
widget.dart
screens
types
widgets
firebase_options.dart
main.dart
router.dart
theme.dart
linux
macos
snap
web
windows
.gitignore
.metadata
.roadsignrc
analysis_options.yaml
build.yaml
devtools_options.yaml
firebase.json
pubspec.lock
pubspec.yaml
roadsign.toml
51 lines
1.2 KiB
Dart
51 lines
1.2 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:surface/providers/sn_network.dart';
|
|
import 'package:surface/types/account.dart';
|
|
|
|
class UserDirectoryProvider {
|
|
late final SnNetworkProvider _sn;
|
|
|
|
UserDirectoryProvider(BuildContext context) {
|
|
_sn = context.read<SnNetworkProvider>();
|
|
}
|
|
|
|
final Map<String, int> _idCache = {};
|
|
final Map<int, SnAccount> _cache = {};
|
|
|
|
Future<List<SnAccount?>> listAccount(Iterable<dynamic> id) async {
|
|
final out = await Future.wait(
|
|
id.map((e) => getAccount(e)),
|
|
);
|
|
return out;
|
|
}
|
|
|
|
Future<SnAccount?> getAccount(dynamic id) async {
|
|
if (id is String && _idCache.containsKey(id)) {
|
|
id = _idCache[id];
|
|
}
|
|
if (_cache.containsKey(id)) {
|
|
return _cache[id];
|
|
}
|
|
|
|
try {
|
|
final resp = await _sn.client.get('/cgi/id/users/$id');
|
|
final account = SnAccount.fromJson(
|
|
resp.data as Map<String, dynamic>,
|
|
);
|
|
_cache[account.id] = account;
|
|
if (id is String) _idCache[id] = account.id;
|
|
return account;
|
|
} catch (err) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
SnAccount? getAccountFromCache(dynamic id) {
|
|
if (id is String && _idCache.containsKey(id)) {
|
|
id = _idCache[id];
|
|
}
|
|
return _cache[id];
|
|
}
|
|
}
|