diff --git a/lib/models/file_metadata.dart b/lib/models/file_metadata.dart index 7b81fb8..e722668 100644 --- a/lib/models/file_metadata.dart +++ b/lib/models/file_metadata.dart @@ -34,7 +34,7 @@ class FileMetadata extends ZapstoreEvent with BaseFileMetadata { final uri = Uri.parse(url); final response = await http.get(uri); - final dir = await getApplicationDocumentsDirectory(); + final dir = await getApplicationSupportDirectory(); final file = File(path.join(dir.path, path.basename(url))); await file.writeAsBytes(response.bodyBytes); @@ -53,8 +53,6 @@ class FileMetadata extends ZapstoreEvent with BaseFileMetadata { throw Exception( 'installation error: ${code != null ? PackageInstallerStatus.byCode(code) : ''}'); } - // final apps = await packageManager.getInstalledPackages(); - // apps?.firstWhere((e) => e.packageName == release.value!.identifier); } } diff --git a/lib/screens/app_detail_screen.dart b/lib/screens/app_detail_screen.dart index f84c2f6..92af992 100644 --- a/lib/screens/app_detail_screen.dart +++ b/lib/screens/app_detail_screen.dart @@ -164,7 +164,9 @@ class AppDetailScreen extends HookConsumerWidget { foregroundColor: Colors.white, minimumSize: const Size.fromHeight(50), ), - onPressed: () {}, + onPressed: () { + app.releases.first.artifacts.first.install(); + }, child: const Text('Install'), ), ), diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index 9803987..d7cbe8a 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -1,8 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_data/flutter_data.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:gap/gap.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:zapstore/main.data.dart'; +import 'package:zapstore/utils/extensions.dart'; class SettingsScreen extends HookConsumerWidget { const SettingsScreen({super.key}); @@ -12,18 +14,24 @@ class SettingsScreen extends HookConsumerWidget { final controller = useTextEditingController(); return Column( children: [ - ElevatedButton( - onPressed: () async { - ref.apps.logLevel = 2; - await ref.apps.clearLocal(); - }, - child: Text('clear all'), + Text( + 'Share your feedback with us', + style: context.theme.textTheme.headlineLarge, ), + Gap(20), TextField( controller: controller, autofocus: true, maxLines: 10, ), + Gap(20), + ElevatedButton( + onPressed: () async { + ref.apps.logLevel = 2; + await ref.apps.clearLocal(); + }, + child: Text('Send'), + ), ], ); } diff --git a/lib/screens/updates_screen.dart b/lib/screens/updates_screen.dart index 5c49aff..ce73bf1 100644 --- a/lib/screens/updates_screen.dart +++ b/lib/screens/updates_screen.dart @@ -1,19 +1,70 @@ +import 'package:android_package_manager/android_package_manager.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:flutter_data/flutter_data.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:zapstore/main.data.dart'; +import 'package:zapstore/models/app.dart'; +import 'package:zapstore/widgets/card.dart'; + +final testApp = { + "id": "945b30320b5b9ca315adecda68b1e18effd10e8933d2fd770cd04c014af153a4", + "pubkey": "78ce6faa72264387284e647ba6938995735ec8c7d5c5a65737e55130f026307d", + "sig": + "c5d4d8a0dfe4a3e52a45866f4c29e3ae063cbc3a5607a6a01979d30a31655cc6a567e7f3388f3f0772fddb6ad6702b181fc24d3d9e9cdff795af8edec6122af5", + "kind": 32267, + "created_at": 1714425637, + "content": + "Primal is a Nostr client featuring:\n\n- Easy onboarding\\\n- Smooth, fast and rich feeds\\\n- Content discovery\n", + "tags": [ + ["d", "net.primal.android"], + ["name", "Primal"], + ["repository", "https://github.com/PrimalHQ/primal-android-app"], + [ + "icon", + "https://cdn.zap.store/778bc7fc496a95187b9dcc7c2ba8325a156912d64a2e22e91ed52d0dbf00716c.png" + ], + ] +}; + +final installedAppsStateProvider = StateNotifierProvider.autoDispose< + DataStateNotifier>, DataState>>((ref) { + final packageManager = AndroidPackageManager(); + final n = DataStateNotifier( + data: DataState>( + [], + // ref.apps.deserialize(testApp).models, + isLoading: true, + )); + + () async { + final infos = await packageManager.getInstalledPackages(); + final ids = infos! + .map((i) => i.packageName) + .nonNulls + .where((n) => !n.startsWith('android') || !n.startsWith('com.android')) + .toSet(); + print('querying for $ids'); + final apps = await ref.apps.findAll(params: {'#d': ids}); + print('got ${apps.length}'); + n.updateWith(model: apps); + }(); + return n; +}); class UpdatesScreen extends HookConsumerWidget { const UpdatesScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { - final controller = useTextEditingController(); - return Expanded( - child: TextField( - controller: controller, - autofocus: true, - maxLines: 10, - ), + final state = ref.watch(installedAppsStateProvider); + + return ListView.builder( + shrinkWrap: true, + itemCount: state.model.length, + itemBuilder: (context, index) { + final app = state.model[index]; + return CardWidget(app: app); + }, ); } } diff --git a/lib/widgets/app_drawer.dart b/lib/widgets/app_drawer.dart index b9cd668..d7acd2d 100644 --- a/lib/widgets/app_drawer.dart +++ b/lib/widgets/app_drawer.dart @@ -29,19 +29,6 @@ class AppDrawer extends HookConsumerWidget { }, child: Text('Log in'), ), - // ElevatedButton( - // onPressed: () async { - // ref.read(loggedInUser.notifier).state = null; - // controller.clear(); - // // final as = await packageManager.getInstalledApplications(); - // // for (final a in as!) { - // // if (!a.packageName!.contains('android')) { - // // print(a.packageName); - // // } - // // } - // }, - // child: Text('check'), - // ), if (u2 != null) Expanded( child: Column(