diff --git a/lib/main.dart b/lib/main.dart index 94c3fb1..c3d2786 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -23,7 +23,7 @@ void main() { print('initializing local storage at $path'); return path; }, - clear: LocalStorageClearStrategy.whenError, + clear: LocalStorageClearStrategy.always, ), ) ], diff --git a/lib/models/app.dart b/lib/models/app.dart index f8e7214..fcabaca 100644 --- a/lib/models/app.dart +++ b/lib/models/app.dart @@ -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 with BaseApp { late final BelongsTo 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 { DataRequestLabel? label}) async { final map = await getInstalledAppsMap(); + findApps(Map 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 { 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(); diff --git a/lib/screens/app_detail_screen.dart b/lib/screens/app_detail_screen.dart index 976e1a2..f2db059 100644 --- a/lib/screens/app_detail_screen.dart +++ b/lib/screens/app_detail_screen.dart @@ -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), + ), ], ), ),