Data loading fixes

This commit is contained in:
franzap
2024-05-06 22:11:56 -03:00
parent 8691f677b1
commit 063c540910
3 changed files with 36 additions and 34 deletions
+1 -1
View File
@@ -23,7 +23,7 @@ void main() {
print('initializing local storage at $path');
return path;
},
clear: LocalStorageClearStrategy.whenError,
clear: LocalStorageClearStrategy.always,
),
)
],
+21 -7
View File
@@ -13,12 +13,14 @@ import 'package:json_annotation/json_annotation.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:purplebase/purplebase.dart';
import 'package:zapstore/main.data.dart';
import 'package:zapstore/models/file_metadata.dart';
import 'package:zapstore/models/nostr_adapter.dart';
import 'package:zapstore/models/release.dart';
import 'package:zapstore/models/user.dart';
import 'package:http/http.dart' as http;
import 'package:path/path.dart' as path;
import 'package:zapstore/screens/search_screen.dart';
part 'app.g.dart';
@@ -30,7 +32,7 @@ class App extends Event<App> with BaseApp {
late final BelongsTo<User> developer;
String? get installedVersion =>
adapter.ref.read(installedAppProvider)[id!.toString()];
DataModel.adapterFor(this).ref.read(installedAppProvider)[id!.toString()];
FileMetadata? get latestMetadata {
// if (Platform.isAndroid) {
@@ -87,6 +89,18 @@ mixin AppAdapter on Adapter<App> {
DataRequestLabel? label}) async {
final map = await getInstalledAppsMap();
findApps(Map<String, dynamic> params) async {
final apps = await super.findAll(params: params);
final releases = await ref.releases
.findAll(params: {'#a': apps.map((app) => app.aTag)});
final metadataIds = releases.map((r) => r.tagMap['e']!).expand((_) => _);
await ref.fileMetadata.findAll(params: {
'ids': metadataIds,
'#m': [kAndroidMimeType]
});
return apps;
}
if (params!.containsKey('installed')) {
if (map.keys.isNotEmpty) {
params['#d'] = map.keys;
@@ -95,14 +109,14 @@ mixin AppAdapter on Adapter<App> {
final apps = findAllLocal();
if (apps.isNotEmpty) {
super.findAll(params: params);
findApps(params);
return apps;
}
return super.findAll(params: params);
return findApps(params);
}
}
return super.findAll(params: params);
return findApps(params);
}
static AndroidPackageManager? _packageManager;
@@ -192,7 +206,7 @@ extension AppX on App {
if (await file.exists()) {
await installOnDevice();
} else {
StreamSubscription? _sub;
StreamSubscription? sub;
final client = http.Client();
final sink = file.openWrite();
@@ -209,7 +223,7 @@ extension AppX on App {
}
final totalBytes = response.contentLength ?? int.tryParse(size) ?? 1;
_sub = response.stream.listen((chunk) {
sub = response.stream.listen((chunk) {
final data = Uint8List.fromList(chunk);
sink.add(data);
downloadedBytes += data.length;
@@ -218,7 +232,7 @@ extension AppX on App {
}, onError: (e) {
throw e;
}, onDone: () async {
await _sub?.cancel();
await sub?.cancel();
await sink.close();
client.close();
await installOnDevice();
+14 -26
View File
@@ -2,9 +2,7 @@ import 'package:auto_size_text/auto_size_text.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:external_app_launcher/external_app_launcher.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:flutter_styled_toast/flutter_styled_toast.dart';
import 'package:gap/gap.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:intl/intl.dart';
@@ -12,7 +10,6 @@ import 'package:url_launcher/url_launcher.dart';
import 'package:zapstore/main.data.dart';
import 'package:zapstore/models/app.dart';
import 'package:zapstore/models/release.dart';
import 'package:zapstore/screens/search_screen.dart';
import 'package:zapstore/utils/extensions.dart';
import 'package:zapstore/widgets/card.dart';
import 'package:zapstore/widgets/pill_widget.dart';
@@ -31,15 +28,6 @@ class AppDetailScreen extends HookConsumerWidget {
final state = ref.apps.watchOne(model.id!,
alsoWatch: (_) => {_.releases, _.releases.artifacts});
useFuture(useMemoized(() async {
final releases = await ref.releases.findAll(params: {'#a': model.aTag});
final metadataIds = releases.map((r) => r.tagMap['e']!).expand((_) => _);
await ref.fileMetadata.findAll(params: {
'ids': metadataIds,
'#m': [kAndroidMimeType]
});
}));
final app = state.model ?? model;
return Column(
@@ -99,20 +87,6 @@ class AppDetailScreen extends HookConsumerWidget {
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
if (app.signer.isPresent)
GestureDetector(
onTap: () async {
final url = Uri.parse(
'https://primal.net/p/${app.signer.value!.npub}');
if (!await launchUrl(url)) {
throw Exception('Could not launch $url');
}
},
child: AuthorContainer(
user: app.signer.value!,
text: 'Curated by',
oneLine: false),
),
if (app.developer.isPresent)
GestureDetector(
onTap: () async {
@@ -127,6 +101,20 @@ class AppDetailScreen extends HookConsumerWidget {
text: 'Built by',
oneLine: false),
),
if (app.signer.isPresent)
GestureDetector(
onTap: () async {
final url = Uri.parse(
'https://primal.net/p/${app.signer.value!.npub}');
if (!await launchUrl(url)) {
throw Exception('Could not launch $url');
}
},
child: AuthorContainer(
user: app.signer.value!,
text: 'Signed by',
oneLine: false),
),
],
),
),