Files
linkding-ios/lib/screens/bookmarks/provider/favicon_loader.provider.dart
Juan Gilsanz Polo c19ffed623 Cache favicons
2024-02-25 14:42:39 +01:00

48 lines
1.3 KiB
Dart

import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:favicon/favicon.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:linkdy/screens/bookmarks/model/favicon_loader.model.dart';
import 'package:linkdy/models/favicon_item.dart';
part 'favicon_loader.provider.g.dart';
@riverpod
FutureOr<FaviconItem?> fetchFavicon(FetchFaviconRef ref, String bookmarkUrl) async {
final exists = ref.watch(faviconStoreProvider).favicons.where((favicon) => favicon.url == bookmarkUrl).toList();
if (exists.isNotEmpty) {
return exists[0];
}
final faviconResult = await FaviconFinder.getBest(bookmarkUrl);
if (faviconResult == null) {
return null;
}
final result = await http.get(Uri.parse(faviconResult.url));
if (result.statusCode == 200) {
final faviconItem = FaviconItem(
url: bookmarkUrl,
favicon: faviconResult.url.contains("svg") ? result.body : base64.encode(result.bodyBytes),
isSvg: faviconResult.url.contains("svg"),
);
ref.read(faviconStoreProvider).favicons.add(faviconItem);
return faviconItem;
} else {
return null;
}
}
@Riverpod(keepAlive: true)
class FaviconStore extends _$FaviconStore {
@override
FaviconLoaderModel build() {
return FaviconLoaderModel(
favicons: [],
);
}
}