update wip

This commit is contained in:
franzap
2024-10-06 16:18:54 -03:00
parent cd9fbeee5d
commit b8ecaa88c6
23 changed files with 307 additions and 432 deletions
+33 -12
View File
@@ -10,7 +10,6 @@ import 'package:convert/convert.dart';
import 'package:crypto/crypto.dart';
import 'package:flutter_data/flutter_data.dart';
import 'package:install_plugin/install_plugin.dart';
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';
@@ -27,7 +26,6 @@ part 'app.g.dart';
const kAndroidMimeType = 'application/vnd.android.package-archive';
@JsonSerializable()
@DataAdapter([NostrAdapter, AppAdapter])
class App extends BaseApp with DataModelMixin<App> {
final HasMany<Release> releases;
@@ -35,16 +33,24 @@ class App extends BaseApp with DataModelMixin<App> {
final BelongsTo<User> developer;
App(
{super.id,
super.pubkey,
super.createdAt,
{super.createdAt,
super.content,
super.tags,
super.signature,
required this.developer,
required this.releases,
required this.signer});
App.fromJson(super.map)
: developer =
BelongsTo<User>.fromJson(map['developer'] as Map<String, dynamic>),
releases =
HasMany<Release>.fromJson(map['releases'] as Map<String, dynamic>),
signer =
BelongsTo<User>.fromJson(map['signer'] as Map<String, dynamic>),
super.fromJson();
Map<String, dynamic> toJson() => super.toMap();
String? get installedVersion => DataModel.adapterFor(this)
.ref
.read(installedAppProvider)[id!.toString()]
@@ -59,7 +65,7 @@ class App extends BaseApp with DataModelMixin<App> {
return releases.ordered.firstOrNull?.artifacts
.where((a) =>
a.mimeType == 'application/vnd.android.package-archive' &&
a.architectures.contains('arm64-v8a'))
a.platforms.contains('android-arm64-v8a'))
.firstOrNull;
}
@@ -220,8 +226,9 @@ mixin AppAdapter on Adapter<App> {
Future<List<App>> loadAppModels(Map<String, dynamic> params) async {
final includes = params.remove('includes') ?? false;
final apps = await super.findAll(params: params);
final releases =
await ref.releases.findAll(params: {'#a': apps.map((app) => app.aTag)});
final releases = await ref.releases.findAll(params: {
'#a': apps.map((app) => app.getReplaceableEventLink().formatted)
});
final metadataIds =
releases.map((r) => r.tagMap['e']).nonNulls.expand((_) => _);
@@ -250,18 +257,25 @@ mixin AppAdapter on Adapter<App> {
OnSuccessAll<App>? onSuccess,
OnErrorAll<App>? onError,
DataRequestLabel? label}) async {
final m1 = DateTime.now().millisecondsSinceEpoch;
print('enters findall');
final map = await getInstalledAppsMap(defer: true);
final m2 = DateTime.now().millisecondsSinceEpoch;
if (params!.containsKey('installed')) {
if (map.keys.isNotEmpty) {
params['#d'] = map.keys;
params.remove('installed');
print('filtering by installed ${params['#d']}');
return await loadAppModels(params);
final z = await loadAppModels(params);
final m3 = DateTime.now().millisecondsSinceEpoch;
print('finish ${m3 - m1} ${m2 - m1}');
return z;
}
}
return await loadAppModels(params);
print('calling bottom loadappmodels');
final loadedAppModels = await loadAppModels(params);
return loadedAppModels;
}
@override
@@ -334,6 +348,13 @@ mixin AppAdapter on Adapter<App> {
}
return super.deserialize(data);
}
@override
App deserializeLocal(map, {String? key}) {
return App.fromJson(map);
// map = transformDeserialize(map);
// return internalWrapStopInit(() => _$AppFromJson(map), key: key);
}
}
Future<bool> _isHashMismatch(String path, String hash) async {
+2 -38
View File
@@ -37,12 +37,12 @@ mixin _$AppAdapter on Adapter<App> {
@override
App deserializeLocal(map, {String? key}) {
map = transformDeserialize(map);
return internalWrapStopInit(() => _$AppFromJson(map), key: key);
return internalWrapStopInit(() => App.fromJson(map), key: key);
}
@override
Map<String, dynamic> serializeLocal(model, {bool withRelationships = true}) {
final map = _$AppToJson(model);
final map = model.toJson();
return transformSerialize(map, withRelationships: withRelationships);
}
}
@@ -82,39 +82,3 @@ extension AppRelationshipGraphNodeX on RelationshipGraphNode<App> {
parent: this is RelationshipMeta ? this as RelationshipMeta : null);
}
}
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
App _$AppFromJson(Map<String, dynamic> json) => App(
id: json['id'],
pubkey: json['pubkey'] as String?,
createdAt: json['createdAt'] == null
? null
: DateTime.parse(json['createdAt'] as String),
content: json['content'] as String? ?? '',
tags: (json['tags'] as List<dynamic>?)
?.map(
(e) => (e as List<dynamic>).map((e) => e as String).toList())
.toList() ??
const [],
signature: json['signature'] as String?,
developer:
BelongsTo<User>.fromJson(json['developer'] as Map<String, dynamic>),
releases:
HasMany<Release>.fromJson(json['releases'] as Map<String, dynamic>),
signer: BelongsTo<User>.fromJson(json['signer'] as Map<String, dynamic>),
);
Map<String, dynamic> _$AppToJson(App instance) => <String, dynamic>{
'id': instance.id,
'pubkey': instance.pubkey,
'createdAt': instance.createdAt.toIso8601String(),
'content': instance.content,
'tags': instance.tags,
'signature': instance.signature,
'releases': instance.releases,
'signer': instance.signer,
'developer': instance.developer,
};
+7 -10
View File
@@ -1,25 +1,22 @@
import 'package:flutter_data/flutter_data.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:purplebase/purplebase.dart';
import 'package:zapstore/models/app.dart';
import 'package:zapstore/models/nostr_adapter.dart';
part 'app_curation_set.g.dart';
@JsonSerializable()
@DataAdapter([NostrAdapter, AppCurationSetAdapter])
class AppCurationSet extends BaseAppCurationSet
with DataModelMixin<AppCurationSet> {
final HasMany<App> apps;
AppCurationSet(
{super.id,
super.pubkey,
super.createdAt,
super.content,
super.tags,
super.signature,
required this.apps});
AppCurationSet({required this.apps});
AppCurationSet.fromJson(super.map)
: apps = HasMany<App>.fromJson(map['app'] as Map<String, dynamic>),
super.fromJson();
Map<String, dynamic> toJson() => super.toMap();
}
mixin AppCurationSetAdapter on Adapter<AppCurationSet> {
+2 -34
View File
@@ -26,12 +26,12 @@ mixin _$AppCurationSetAdapter on Adapter<AppCurationSet> {
@override
AppCurationSet deserializeLocal(map, {String? key}) {
map = transformDeserialize(map);
return internalWrapStopInit(() => _$AppCurationSetFromJson(map), key: key);
return internalWrapStopInit(() => AppCurationSet.fromJson(map), key: key);
}
@override
Map<String, dynamic> serializeLocal(model, {bool withRelationships = true}) {
final map = _$AppCurationSetToJson(model);
final map = model.toJson();
return transformSerialize(map, withRelationships: withRelationships);
}
}
@@ -64,35 +64,3 @@ extension AppCurationSetRelationshipGraphNodeX
parent: this is RelationshipMeta ? this as RelationshipMeta : null);
}
}
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
AppCurationSet _$AppCurationSetFromJson(Map<String, dynamic> json) =>
AppCurationSet(
id: json['id'],
pubkey: json['pubkey'] as String?,
createdAt: json['createdAt'] == null
? null
: DateTime.parse(json['createdAt'] as String),
content: json['content'] as String? ?? '',
tags: (json['tags'] as List<dynamic>?)
?.map(
(e) => (e as List<dynamic>).map((e) => e as String).toList())
.toList() ??
const [],
signature: json['signature'] as String?,
apps: HasMany<App>.fromJson(json['apps'] as Map<String, dynamic>),
);
Map<String, dynamic> _$AppCurationSetToJson(AppCurationSet instance) =>
<String, dynamic>{
'id': instance.id,
'pubkey': instance.pubkey,
'createdAt': instance.createdAt.toIso8601String(),
'content': instance.content,
'tags': instance.tags,
'signature': instance.signature,
'apps': instance.apps,
};
+3 -4
View File
@@ -1,11 +1,10 @@
import 'package:purplebase/purplebase.dart';
class AppFeedback extends BaseEvent {
class AppFeedback extends BaseEvent<AppFeedback> {
@override
int get kind => 1011;
AppFeedback({
super.id,
super.content,
});
required String content,
}) : super(content: content);
}
+17 -6
View File
@@ -1,5 +1,4 @@
import 'package:flutter_data/flutter_data.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:purplebase/purplebase.dart';
import 'package:zapstore/models/nostr_adapter.dart';
import 'package:zapstore/models/release.dart';
@@ -7,7 +6,6 @@ import 'package:zapstore/models/user.dart';
part 'file_metadata.g.dart';
@JsonSerializable()
@DataAdapter([NostrAdapter, FileMetadataAdapter])
class FileMetadata extends BaseFileMetadata with DataModelMixin<FileMetadata> {
final BelongsTo<User> author;
@@ -15,15 +13,28 @@ class FileMetadata extends BaseFileMetadata with DataModelMixin<FileMetadata> {
final BelongsTo<User> signer;
FileMetadata(
{super.id,
super.pubkey,
super.createdAt,
{super.createdAt,
super.content,
super.tags,
super.signature,
required this.author,
required this.release,
required this.signer});
FileMetadata.fromJson(super.map)
: author =
BelongsTo<User>.fromJson(map['author'] as Map<String, dynamic>),
release =
BelongsTo<Release>.fromJson(map['release'] as Map<String, dynamic>),
signer =
BelongsTo<User>.fromJson(map['signer'] as Map<String, dynamic>),
super.fromJson();
Map<String, dynamic> toJson() => super.toMap();
// String? get version => tagMap['version']?.firstOrNull;
int? get versionCode =>
int.tryParse(tagMap['version_code']?.firstOrNull ?? '');
String? get apkSignatureHash => tagMap['apk_signature_hash']?.firstOrNull;
}
mixin FileMetadataAdapter on Adapter<FileMetadata> {
+2 -38
View File
@@ -38,12 +38,12 @@ mixin _$FileMetadataAdapter on Adapter<FileMetadata> {
@override
FileMetadata deserializeLocal(map, {String? key}) {
map = transformDeserialize(map);
return internalWrapStopInit(() => _$FileMetadataFromJson(map), key: key);
return internalWrapStopInit(() => FileMetadata.fromJson(map), key: key);
}
@override
Map<String, dynamic> serializeLocal(model, {bool withRelationships = true}) {
final map = _$FileMetadataToJson(model);
final map = model.toJson();
return transformSerialize(map, withRelationships: withRelationships);
}
}
@@ -86,39 +86,3 @@ extension FileMetadataRelationshipGraphNodeX
parent: this is RelationshipMeta ? this as RelationshipMeta : null);
}
}
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
FileMetadata _$FileMetadataFromJson(Map<String, dynamic> json) => FileMetadata(
id: json['id'],
pubkey: json['pubkey'] as String?,
createdAt: json['createdAt'] == null
? null
: DateTime.parse(json['createdAt'] as String),
content: json['content'] as String? ?? '',
tags: (json['tags'] as List<dynamic>?)
?.map(
(e) => (e as List<dynamic>).map((e) => e as String).toList())
.toList() ??
const [],
signature: json['signature'] as String?,
author: BelongsTo<User>.fromJson(json['author'] as Map<String, dynamic>),
release:
BelongsTo<Release>.fromJson(json['release'] as Map<String, dynamic>),
signer: BelongsTo<User>.fromJson(json['signer'] as Map<String, dynamic>),
);
Map<String, dynamic> _$FileMetadataToJson(FileMetadata instance) =>
<String, dynamic>{
'id': instance.id,
'pubkey': instance.pubkey,
'createdAt': instance.createdAt.toIso8601String(),
'content': instance.content,
'tags': instance.tags,
'signature': instance.signature,
'author': instance.author,
'release': instance.release,
'signer': instance.signer,
};
+5 -6
View File
@@ -2,8 +2,9 @@ import 'package:flutter_data/flutter_data.dart';
import 'package:purplebase/purplebase.dart';
mixin NostrAdapter<T extends DataModelMixin<T>> on Adapter<T> {
late final RelayMessageNotifier notifier =
ref.read(relayMessageNotifierProvider.notifier);
// NOTE: it is very important to use const in the argument to preserve equality
RelayMessageNotifier get relay => ref.read(
relayMessageNotifierProvider(const ['wss://relay.zap.store']).notifier);
int get kind {
return BaseEvent.kindForType(internalType)!;
@@ -11,7 +12,6 @@ mixin NostrAdapter<T extends DataModelMixin<T>> on Adapter<T> {
@override
DeserializedData<T> deserialize(Object? data, {String? key}) {
// throw 'a';
final list = data is Iterable ? data : [data as Map];
final models = <T>[];
final included = <DataModelMixin>[];
@@ -32,7 +32,7 @@ mixin NostrAdapter<T extends DataModelMixin<T>> on Adapter<T> {
}
// Collect models for current kind and included for others
final eventType = BaseEvent.kinds[kind]!;
final eventType = BaseEvent.typeForKind(kind)!;
if (eventType == internalType) {
final newData = super.deserialize(map);
models.addAll(newData.models as Iterable<T>);
@@ -64,8 +64,7 @@ mixin NostrAdapter<T extends DataModelMixin<T>> on Adapter<T> {
tags: params ?? {},
);
final result =
await notifier.query(req, relayUrls: ['wss://relay.zap.store']);
final result = await relay.queryRaw(req);
final deserialized = await deserializeAsync(result, save: true);
return deserialized.models;
}
+12 -7
View File
@@ -1,6 +1,5 @@
import 'package:collection/collection.dart';
import 'package:flutter_data/flutter_data.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:purplebase/purplebase.dart';
import 'package:zapstore/models/app.dart';
import 'package:zapstore/models/file_metadata.dart';
@@ -9,7 +8,6 @@ import 'package:zapstore/models/user.dart';
part 'release.g.dart';
@JsonSerializable()
@DataAdapter([NostrAdapter, ReleaseAdapter])
class Release extends BaseRelease with DataModelMixin<Release> {
final HasMany<FileMetadata> artifacts;
@@ -17,15 +15,22 @@ class Release extends BaseRelease with DataModelMixin<Release> {
final BelongsTo<User> signer;
Release(
{super.id,
super.pubkey,
super.createdAt,
{super.createdAt,
super.content,
super.tags,
super.signature,
required this.artifacts,
required this.app,
required this.signer});
Release.fromJson(super.map)
: app = BelongsTo<App>.fromJson(map['app'] as Map<String, dynamic>),
artifacts = HasMany<FileMetadata>.fromJson(
map['artifacts'] as Map<String, dynamic>),
signer =
BelongsTo<User>.fromJson(map['signer'] as Map<String, dynamic>),
super.fromJson();
Map<String, dynamic> toJson() => super.toMap();
}
mixin ReleaseAdapter on Adapter<Release> {
@@ -48,5 +53,5 @@ mixin ReleaseAdapter on Adapter<Release> {
extension HasManyReleaseX on HasMany<Release> {
List<Release> get ordered =>
toList().sorted((a, b) => b.createdAt.compareTo(a.createdAt));
toList().sorted((a, b) => b.createdAt!.compareTo(a.createdAt!));
}
+2 -37
View File
@@ -39,12 +39,12 @@ mixin _$ReleaseAdapter on Adapter<Release> {
@override
Release deserializeLocal(map, {String? key}) {
map = transformDeserialize(map);
return internalWrapStopInit(() => _$ReleaseFromJson(map), key: key);
return internalWrapStopInit(() => Release.fromJson(map), key: key);
}
@override
Map<String, dynamic> serializeLocal(model, {bool withRelationships = true}) {
final map = _$ReleaseToJson(model);
final map = model.toJson();
return transformSerialize(map, withRelationships: withRelationships);
}
}
@@ -84,38 +84,3 @@ extension ReleaseRelationshipGraphNodeX on RelationshipGraphNode<Release> {
parent: this is RelationshipMeta ? this as RelationshipMeta : null);
}
}
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Release _$ReleaseFromJson(Map<String, dynamic> json) => Release(
id: json['id'],
pubkey: json['pubkey'] as String?,
createdAt: json['createdAt'] == null
? null
: DateTime.parse(json['createdAt'] as String),
content: json['content'] as String? ?? '',
tags: (json['tags'] as List<dynamic>?)
?.map(
(e) => (e as List<dynamic>).map((e) => e as String).toList())
.toList() ??
const [],
signature: json['signature'] as String?,
artifacts: HasMany<FileMetadata>.fromJson(
json['artifacts'] as Map<String, dynamic>),
app: BelongsTo<App>.fromJson(json['app'] as Map<String, dynamic>),
signer: BelongsTo<User>.fromJson(json['signer'] as Map<String, dynamic>),
);
Map<String, dynamic> _$ReleaseToJson(Release instance) => <String, dynamic>{
'id': instance.id,
'pubkey': instance.pubkey,
'createdAt': instance.createdAt.toIso8601String(),
'content': instance.content,
'tags': instance.tags,
'signature': instance.signature,
'artifacts': instance.artifacts,
'app': instance.app,
'signer': instance.signer,
};
+21 -21
View File
@@ -2,25 +2,28 @@ import 'dart:convert';
import 'package:collection/collection.dart';
import 'package:flutter_data/flutter_data.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:purplebase/purplebase.dart';
import 'package:zapstore/models/nostr_adapter.dart';
part 'user.g.dart';
@JsonSerializable()
@DataAdapter([NostrAdapter, UserAdapter])
class User extends BaseUser with DataModelMixin<User> {
User(
{super.id,
super.pubkey,
super.createdAt,
super.content,
{super.createdAt,
super.tags,
super.signature,
required this.followers,
required this.following});
User.fromJson(super.map)
: followers =
HasMany<User>.fromJson(map['followers'] as Map<String, dynamic>),
following =
HasMany<User>.fromJson(map['following'] as Map<String, dynamic>),
super.fromJson();
Map<String, dynamic> toJson() => super.toMap();
@DataRelationship(inverse: 'followers')
final HasMany<User> following;
@DataRelationship(inverse: 'following')
@@ -105,13 +108,12 @@ mixin UserAdapter on NostrAdapter<User> {
if (authors.isEmpty) {
return [];
}
final req = RelayRequest(
authors: Set<String>.from(authors),
kinds: {kind, if (params['contacts'] != null) 3},
);
final result =
await notifier.query(req, relayUrls: ['wss://relay.nostr.band']);
// TODO: was: kinds: {kind, if (params['contacts'] != null) 3},
final result = await relay.query<BaseUser>(
authors: Set<String>.from(authors),
relayUrls: ['wss://relay.nostr.band']);
if (onSuccess != null) {
return await onSuccess.call(DataResponse(statusCode: 200, body: result),
label ?? DataRequestLabel('findAll', type: type), this);
@@ -163,18 +165,16 @@ mixin UserAdapter on NostrAdapter<User> {
);
}
final req = RelayRequest(
authors: {publicKey},
kinds: {kind, if (params?['contacts'] != null) 3},
tags: params ?? {},
);
// trigger trust service indexing in the background
// sendRequest<dynamic>(
// Uri.parse('https://zap.store/api/trust/${publicKey.npub}/r'));
final result =
await notifier.query(req, relayUrls: ['wss://relay.nostr.band']);
// TODO: was: kinds: {kind, if (params?['contacts'] != null) 3},
final result = await relay.query<BaseUser>(
authors: {publicKey},
tags: params ?? {},
relayUrls: ['wss://relay.nostr.band']);
final data = await deserializeAsync(result, save: true);
return data.models.firstWhere((e) {
return e.id == publicKey;
+2 -36
View File
@@ -33,12 +33,12 @@ mixin _$UserAdapter on Adapter<User> {
@override
User deserializeLocal(map, {String? key}) {
map = transformDeserialize(map);
return internalWrapStopInit(() => _$UserFromJson(map), key: key);
return internalWrapStopInit(() => User.fromJson(map), key: key);
}
@override
Map<String, dynamic> serializeLocal(model, {bool withRelationships = true}) {
final map = _$UserToJson(model);
final map = model.toJson();
return transformSerialize(map, withRelationships: withRelationships);
}
}
@@ -71,37 +71,3 @@ extension UserRelationshipGraphNodeX on RelationshipGraphNode<User> {
parent: this is RelationshipMeta ? this as RelationshipMeta : null);
}
}
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
User _$UserFromJson(Map<String, dynamic> json) => User(
id: json['id'],
pubkey: json['pubkey'] as String?,
createdAt: json['createdAt'] == null
? null
: DateTime.parse(json['createdAt'] as String),
content: json['content'] as String? ?? '',
tags: (json['tags'] as List<dynamic>?)
?.map(
(e) => (e as List<dynamic>).map((e) => e as String).toList())
.toList() ??
const [],
signature: json['signature'] as String?,
followers:
HasMany<User>.fromJson(json['followers'] as Map<String, dynamic>),
following:
HasMany<User>.fromJson(json['following'] as Map<String, dynamic>),
);
Map<String, dynamic> _$UserToJson(User instance) => <String, dynamic>{
'id': instance.id,
'pubkey': instance.pubkey,
'createdAt': instance.createdAt.toIso8601String(),
'content': instance.content,
'tags': instance.tags,
'signature': instance.signature,
'following': instance.following,
'followers': instance.followers,
};
+18 -12
View File
@@ -135,19 +135,13 @@ AppLifecycleListener? _lifecycleListener;
final dataLibrariesInitializer = FutureProvider<void>((ref) async {
await ref.read(initializeFlutterData(adapterProvidersMap).future);
appLinks.uriLinkStream.listen((uri) async {
if (uri.scheme == "zapstore") {
final adapter = ref.apps.appAdapter;
final App? app = await adapter.findOne(uri.host);
if (app!=null) {
appRouter.go('/updates/details', extra: app);
}
}
});
ref
.read(relayMessageNotifierProvider.notifier)
.initialize(['wss://relay.zap.store', 'wss://relay.nostr.band']);
// NOTE: it is very important to use const in the argument to preserve equality
final relay = ref.read(
relayMessageNotifierProvider(const ['wss://relay.zap.store']).notifier);
await relay.initialize();
// TODO: , 'wss://relay.nostr.band'
_lifecycleListener = AppLifecycleListener(
onStateChange: (state) async {
@@ -159,8 +153,20 @@ final dataLibrariesInitializer = FutureProvider<void>((ref) async {
},
);
// Handle deep links
final appLinksSub = appLinks.uriLinkStream.listen((uri) async {
if (uri.scheme == "zapstore") {
final adapter = ref.apps.appAdapter;
final App? app = await adapter.findOne(uri.host);
if (app != null) {
appRouter.go('/updates/details', extra: app);
}
}
});
ref.onDispose(() {
_lifecycleListener?.dispose();
appLinksSub.cancel();
});
});
+29 -26
View File
@@ -30,9 +30,12 @@ class AppDetailScreen extends HookConsumerWidget {
final state = ref.apps.watchOne(model.id!,
alsoWatch: (_) =>
{_.releases, _.releases.artifacts, _.signer, _.developer});
// TODO: Why this? and not remote just above?
useFuture(useMemoized(() =>
ref.apps.findOne(model.id!, remote: true, params: {'includes': true})));
// TODO fix - hack to refresh on install changes
// TODO: Hack to refresh on install changes
final _ = ref.watch(installedAppProvider);
final app = state.model ?? model;
@@ -135,30 +138,30 @@ class AppDetailScreen extends HookConsumerWidget {
],
),
),
if (app.githubStars != null)
Padding(
padding: const EdgeInsets.all(8),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text('Github stars'),
Text(app.githubStars!)
],
),
),
if (app.githubForks != null)
Padding(
padding: const EdgeInsets.all(8),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text('Github forks'),
Text(app.githubForks!)
],
),
),
// if (app.githubStars != null)
// Padding(
// padding: const EdgeInsets.all(8),
// child: Row(
// mainAxisAlignment:
// MainAxisAlignment.spaceBetween,
// children: [
// Text('Github stars'),
// Text(app.githubStars!)
// ],
// ),
// ),
// if (app.githubForks != null)
// Padding(
// padding: const EdgeInsets.all(8),
// child: Row(
// mainAxisAlignment:
// MainAxisAlignment.spaceBetween,
// children: [
// Text('Github forks'),
// Text(app.githubForks!)
// ],
// ),
// ),
Padding(
padding: const EdgeInsets.all(8),
child: Row(
@@ -180,7 +183,7 @@ class AppDetailScreen extends HookConsumerWidget {
MainAxisAlignment.spaceBetween,
children: [
Text('App ID'),
Text(app.identifier)
Text(app.identifier!)
],
),
),
+2 -2
View File
@@ -110,9 +110,9 @@ class SearchScreen extends HookConsumerWidget {
if (searchResultState.value?.isNotEmpty ?? false)
for (final app in searchResultState.value!) AppCard(app: app),
Gap(20),
CategoriesContainer(),
// const CategoriesContainer(),
Gap(20),
LatestReleasesContainer(),
const LatestReleasesContainer(),
Gap(10),
],
),
+3 -4
View File
@@ -8,9 +8,9 @@ import 'package:gap/gap.dart';
import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:intl/intl.dart';
import 'package:purplebase/purplebase.dart';
import 'package:zapstore/main.data.dart';
import 'package:zapstore/models/app.dart';
import 'package:zapstore/models/feedback.dart';
import 'package:zapstore/models/settings.dart';
import 'package:zapstore/utils/extensions.dart';
import 'package:zapstore/utils/system_info.dart';
@@ -60,9 +60,8 @@ class SettingsScreen extends HookConsumerWidget {
if (controller.text.trim().isNotEmpty) {
final text =
'${controller.text.trim()} [from ${user.npub} on ${DateFormat('MMMM d, y').format(DateTime.now())}]';
final event = BaseEvent(kind: 1011, content: text).sign(kI);
await ref.apps.nostrAdapter.notifier
.publish(event, relayUrls: ['wss://relay.zap.store']);
final event = AppFeedback(content: text).sign(kI);
await ref.apps.nostrAdapter.relay.publish(event);
controller.clear();
}
},
+2 -2
View File
@@ -7,7 +7,7 @@ import 'package:gap/gap.dart';
import 'package:http/http.dart' as http;
import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:purplebase/purplebase.dart';
import 'package:zapstore/models/feedback.dart';
import 'package:zapstore/utils/extensions.dart';
import 'package:zapstore/utils/system_info.dart';
import 'package:zapstore/utils/theme.dart';
@@ -146,7 +146,7 @@ Future<void> _sendErrorReport(
};
final client = http.Client();
final event = BaseEvent(kind: 1011, content: jsonEncode(map)).sign(kI);
final event = AppFeedback(content: jsonEncode(map)).sign(kI);
await client.post(Uri.parse('https://relay.zap.store/'),
body: jsonEncode(event.toMap()),
headers: {'Content-Type': 'application/json'});
+1 -1
View File
@@ -26,7 +26,7 @@ class InstallButton extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final progress = ref.watch(installationProgressProvider(app.identifier));
final progress = ref.watch(installationProgressProvider(app.identifier!));
return GestureDetector(
onTap: switch (app.status) {
+2 -4
View File
@@ -9,9 +9,7 @@ import 'package:zapstore/models/app.dart';
import 'package:zapstore/widgets/app_card.dart';
class LatestReleasesContainer extends HookConsumerWidget {
const LatestReleasesContainer({
super.key,
});
const LatestReleasesContainer({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
@@ -46,7 +44,7 @@ class LatestReleasesAppNotifier extends AutoDisposeAsyncNotifier<List<App>> {
List<App> localFetch() {
return ref.releases
.findAllLocal()
.sorted((a, b) => b.createdAt.compareTo(a.createdAt))
.sorted((a, b) => b.createdAt!.compareTo(a.createdAt!))
.take(10)
.map((r) => r.app.value)
.nonNulls
+1 -1
View File
@@ -54,7 +54,7 @@ class ReleaseCard extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('Date'),
Text(formatter.format(release.createdAt)),
Text(formatter.format(release.createdAt!)),
],
),
),
+13 -10
View File
@@ -10,18 +10,21 @@ PODS:
- sqflite (0.0.3):
- Flutter
- FlutterMacOS
- "sqlite3 (3.45.3+1)":
- "sqlite3/common (= 3.45.3+1)"
- "sqlite3/common (3.45.3+1)"
- "sqlite3/fts5 (3.45.3+1)":
- "sqlite3 (3.46.1+1)":
- "sqlite3/common (= 3.46.1+1)"
- "sqlite3/common (3.46.1+1)"
- "sqlite3/dbstatvtab (3.46.1+1)":
- sqlite3/common
- "sqlite3/perf-threadsafe (3.45.3+1)":
- "sqlite3/fts5 (3.46.1+1)":
- sqlite3/common
- "sqlite3/rtree (3.45.3+1)":
- "sqlite3/perf-threadsafe (3.46.1+1)":
- sqlite3/common
- "sqlite3/rtree (3.46.1+1)":
- sqlite3/common
- sqlite3_flutter_libs (0.0.1):
- FlutterMacOS
- "sqlite3 (~> 3.45.3+1)"
- "sqlite3 (~> 3.46.0+1)"
- sqlite3/dbstatvtab
- sqlite3/fts5
- sqlite3/perf-threadsafe
- sqlite3/rtree
@@ -63,9 +66,9 @@ SPEC CHECKSUMS:
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
sqlite3: 02d1f07eaaa01f80a1c16b4b31dfcbb3345ee01a
sqlite3_flutter_libs: 8d204ef443cf0d5c1c8b058044eab53f3943a9c5
url_launcher_macos: d2691c7dd33ed713bf3544850a623080ec693d95
sqlite3: 0bb0e6389d824e40296f531b858a2a0b71c0d2fb
sqlite3_flutter_libs: 5ca46c1a04eddfbeeb5b16566164aa7ad1616e7b
url_launcher_macos: c82c93949963e55b228a30115bd219499a6fe404
PODFILE CHECKSUM: 236401fc2c932af29a9fcf0e97baeeb2d750d367
+123 -117
View File
@@ -61,10 +61,10 @@ packages:
dependency: transitive
description:
name: archive
sha256: ecf4273855368121b1caed0d10d4513c7241dfc813f7d3c8933b36622ae9b265
sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d
url: "https://pub.dev"
source: hosted
version: "3.5.1"
version: "3.6.1"
args:
dependency: transitive
description:
@@ -149,10 +149,10 @@ packages:
dependency: transitive
description:
name: build_daemon
sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1"
sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9"
url: "https://pub.dev"
source: hosted
version: "4.0.1"
version: "4.0.2"
build_resolvers:
dependency: transitive
description:
@@ -165,18 +165,18 @@ packages:
dependency: "direct main"
description:
name: build_runner
sha256: "3ac61a79bfb6f6cc11f693591063a7f19a7af628dc52f141743edac5c16e8c22"
sha256: "644dc98a0f179b872f612d3eb627924b578897c629788e858157fa5e704ca0c7"
url: "https://pub.dev"
source: hosted
version: "2.4.9"
version: "2.4.11"
build_runner_core:
dependency: transitive
description:
name: build_runner_core
sha256: "4ae8ffe5ac758da294ecf1802f2aff01558d8b1b00616aa7538ea9a8a5d50799"
sha256: e3c79f69a64bdfcd8a776a3c28db4eb6e3fb5356d013ae5eb2e52007706d5dbe
url: "https://pub.dev"
source: hosted
version: "7.3.0"
version: "7.3.1"
built_collection:
dependency: transitive
description:
@@ -197,26 +197,26 @@ packages:
dependency: "direct main"
description:
name: cached_network_image
sha256: "28ea9690a8207179c319965c13cd8df184d5ee721ae2ce60f398ced1219cea1f"
sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916"
url: "https://pub.dev"
source: hosted
version: "3.3.1"
version: "3.4.1"
cached_network_image_platform_interface:
dependency: transitive
description:
name: cached_network_image_platform_interface
sha256: "9e90e78ae72caa874a323d78fa6301b3fb8fa7ea76a8f96dc5b5bf79f283bf2f"
sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829"
url: "https://pub.dev"
source: hosted
version: "4.0.0"
version: "4.1.1"
cached_network_image_web:
dependency: transitive
description:
name: cached_network_image_web
sha256: "205d6a9f1862de34b93184f22b9d2d94586b2f05c581d546695e3d8f6a805cd7"
sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062"
url: "https://pub.dev"
source: hosted
version: "1.2.0"
version: "1.3.1"
characters:
dependency: transitive
description:
@@ -277,10 +277,10 @@ packages:
dependency: "direct main"
description:
name: crypto
sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27
url: "https://pub.dev"
source: hosted
version: "3.0.3"
version: "3.0.5"
cupertino_icons:
dependency: "direct main"
description:
@@ -317,18 +317,18 @@ packages:
dependency: "direct main"
description:
name: device_info_plus
sha256: eead12d1a1ed83d8283ab4c2f3fca23ac4082f29f25f29dff0f758f57d06ec91
sha256: a7fd703482b391a87d60b6061d04dfdeab07826b96f9abd8f5ed98068acc0074
url: "https://pub.dev"
source: hosted
version: "10.1.0"
version: "10.1.2"
device_info_plus_platform_interface:
dependency: transitive
description:
name: device_info_plus_platform_interface
sha256: d3b01d5868b50ae571cd1dc6e502fc94d956b665756180f7b16ead09e836fd64
sha256: "282d3cf731045a2feb66abfe61bbc40870ae50a3ed10a4d3d217556c35c8c2ba"
url: "https://pub.dev"
source: hosted
version: "7.0.0"
version: "7.0.1"
equatable:
dependency: transitive
description:
@@ -349,10 +349,10 @@ packages:
dependency: transitive
description:
name: ffi
sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21"
sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
version: "2.1.3"
file:
dependency: transitive
description:
@@ -378,10 +378,10 @@ packages:
dependency: transitive
description:
name: flutter_cache_manager
sha256: "395d6b7831f21f3b989ebedbb785545932adb9afe2622c1ffacf7f4b53a7e544"
sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386"
url: "https://pub.dev"
source: hosted
version: "3.3.2"
version: "3.4.1"
flutter_data:
dependency: "direct main"
description:
@@ -411,10 +411,10 @@ packages:
dependency: "direct main"
description:
name: flutter_layout_grid
sha256: "962a7ec8c7ea46c3b10606dac9c964f9143d10daa5ca28e40f4ce14eeef85b2a"
sha256: "88b4f8484a0874962e27c47733ad256aeb26acc694a9f029edbef771d301885a"
url: "https://pub.dev"
source: hosted
version: "2.0.6"
version: "2.0.7"
flutter_lints:
dependency: "direct dev"
description:
@@ -427,10 +427,10 @@ packages:
dependency: "direct main"
description:
name: flutter_markdown
sha256: "9921f9deda326f8a885e202b1e35237eadfc1345239a0f6f0f1ff287e047547f"
sha256: e17575ca576a34b46c58c91f9948891117a1bd97815d2e661813c7f90c647a78
url: "https://pub.dev"
source: hosted
version: "0.7.1"
version: "0.7.3+2"
flutter_phoenix:
dependency: "direct main"
description:
@@ -461,10 +461,10 @@ packages:
dependency: transitive
description:
name: freezed_annotation
sha256: c3fd9336eb55a38cc1bbd79ab17573113a8deccd0ecbbf926cca3c62803b5c2d
sha256: c2e2d632dd9b8a2b7751117abcfc2b4888ecfe181bd9fca7170d9ef02e595fe2
url: "https://pub.dev"
source: hosted
version: "2.4.1"
version: "2.4.4"
frontend_server_client:
dependency: transitive
description:
@@ -501,18 +501,18 @@ packages:
dependency: "direct main"
description:
name: go_router
sha256: "81f94e16d7063b60f0da3a79f872e140d6518f306749303bf981abd7d6b46734"
sha256: "6f1b756f6e863259a99135ff3c95026c3cdca17d10ebef2bba2261a25ddc8bbc"
url: "https://pub.dev"
source: hosted
version: "14.1.0"
version: "14.3.0"
graphs:
dependency: transitive
description:
name: graphs
sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19
sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0"
url: "https://pub.dev"
source: hosted
version: "2.3.1"
version: "2.3.2"
gtk:
dependency: transitive
description:
@@ -525,18 +525,18 @@ packages:
dependency: "direct main"
description:
name: hooks_riverpod
sha256: "45b2030a18bcd6dbd680c2c91bc3b33e3fe7c323e3acb5ecec93a613e2fbaa8a"
sha256: "97266a91c994951a06ef0ff3a1c7fb261e52ec7f74e87f0614ea0b7411b859b2"
url: "https://pub.dev"
source: hosted
version: "2.5.1"
version: "2.5.2"
http:
dependency: "direct main"
description:
name: http
sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938"
sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010
url: "https://pub.dev"
source: hosted
version: "1.2.1"
version: "1.2.2"
http_multi_server:
dependency: transitive
description:
@@ -573,10 +573,10 @@ packages:
dependency: transitive
description:
name: image
sha256: "4c68bfd5ae83e700b5204c1e74451e7bf3cf750e6843c6e158289cf56bda018e"
sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8"
url: "https://pub.dev"
source: hosted
version: "4.1.7"
version: "4.2.0"
inflection3:
dependency: transitive
description:
@@ -709,18 +709,18 @@ packages:
dependency: transitive
description:
name: mime
sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2"
sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a"
url: "https://pub.dev"
source: hosted
version: "1.0.5"
version: "1.0.6"
octo_image:
dependency: transitive
description:
name: octo_image
sha256: "45b40f99622f11901238e18d48f5f12ea36426d8eced9f4cbf58479c7aa2430d"
sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd"
url: "https://pub.dev"
source: hosted
version: "2.0.0"
version: "2.1.0"
package_config:
dependency: transitive
description:
@@ -741,18 +741,18 @@ packages:
dependency: "direct main"
description:
name: path_provider
sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161
sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378
url: "https://pub.dev"
source: hosted
version: "2.1.3"
version: "2.1.4"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d
sha256: "6f01f8e37ec30b07bc424b4deabac37cacb1bc7e2e515ad74486039918a37eb7"
url: "https://pub.dev"
source: hosted
version: "2.2.4"
version: "2.2.10"
path_provider_foundation:
dependency: transitive
description:
@@ -781,10 +781,10 @@ packages:
dependency: transitive
description:
name: path_provider_windows
sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
url: "https://pub.dev"
source: hosted
version: "2.2.1"
version: "2.3.0"
pausable_timer:
dependency: transitive
description:
@@ -813,34 +813,34 @@ packages:
dependency: transitive
description:
name: permission_handler_android
sha256: "8bb852cd759488893805c3161d0b2b5db55db52f773dbb014420b304055ba2c5"
sha256: "76e4ab092c1b240d31177bb64d2b0bea43f43d0e23541ec866151b9f7b2490fa"
url: "https://pub.dev"
source: hosted
version: "12.0.6"
version: "12.0.12"
permission_handler_apple:
dependency: transitive
description:
name: permission_handler_apple
sha256: e9ad66020b89ff1b63908f247c2c6f931c6e62699b756ef8b3c4569350cd8662
sha256: e6f6d73b12438ef13e648c4ae56bd106ec60d17e90a59c4545db6781229082a0
url: "https://pub.dev"
source: hosted
version: "9.4.4"
version: "9.4.5"
permission_handler_html:
dependency: transitive
description:
name: permission_handler_html
sha256: "54bf176b90f6eddd4ece307e2c06cf977fb3973719c35a93b85cc7093eb6070d"
sha256: af26edbbb1f2674af65a8f4b56e1a6f526156bc273d0e65dd8075fab51c78851
url: "https://pub.dev"
source: hosted
version: "0.1.1"
version: "0.1.3+2"
permission_handler_platform_interface:
dependency: transitive
description:
name: permission_handler_platform_interface
sha256: "48d4fcf201a1dad93ee869ab0d4101d084f49136ec82a8a06ed9cfeacab9fd20"
sha256: e9c8eadee926c4532d0305dff94b85bf961f16759c3af791486613152af4b4f9
url: "https://pub.dev"
source: hosted
version: "4.2.1"
version: "4.2.3"
permission_handler_windows:
dependency: transitive
description:
@@ -861,10 +861,10 @@ packages:
dependency: transitive
description:
name: platform
sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec"
sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65"
url: "https://pub.dev"
source: hosted
version: "3.1.4"
version: "3.1.5"
plugin_platform_interface:
dependency: transitive
description:
@@ -901,35 +901,33 @@ packages:
dependency: transitive
description:
name: pubspec_parse
sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367
sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8
url: "https://pub.dev"
source: hosted
version: "1.2.3"
version: "1.3.0"
purplebase:
dependency: "direct main"
description:
path: "."
ref: "0.1.1"
resolved-ref: "510bc0b2a92d6f2519e5ee25506afd729e40089a"
url: "https://github.com/purplebase/purplebase"
source: git
path: "../purplebase"
relative: true
source: path
version: "0.1.1"
quiver:
dependency: transitive
description:
name: quiver
sha256: b1c1ac5ce6688d77f65f3375a9abb9319b3cb32486bdc7a1e0fdf004d7ba4e47
sha256: ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2
url: "https://pub.dev"
source: hosted
version: "3.2.1"
version: "3.2.2"
rational:
dependency: transitive
description:
name: rational
sha256: ba58e9e18df9abde280e8b10051e4bce85091e41e8e7e411b6cde2e738d357cf
sha256: cb808fb6f1a839e6fc5f7d8cb3b0a10e1db48b3be102de73938c627f0b636336
url: "https://pub.dev"
source: hosted
version: "2.2.2"
version: "2.2.3"
riverpod:
dependency: transitive
description:
@@ -942,10 +940,10 @@ packages:
dependency: transitive
description:
name: rxdart
sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb"
sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962"
url: "https://pub.dev"
source: hosted
version: "0.27.7"
version: "0.28.0"
shelf:
dependency: transitive
description:
@@ -958,18 +956,18 @@ packages:
dependency: transitive
description:
name: shelf_web_socket
sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1"
sha256: "073c147238594ecd0d193f3456a5fe91c4b0abbcc68bf5cd95b36c4e194ac611"
url: "https://pub.dev"
source: hosted
version: "1.0.4"
version: "2.0.0"
skeletonizer:
dependency: "direct main"
description:
name: skeletonizer
sha256: "50c3fdf3d1bf6182129c03b53bc7ff6dca10ca0b8e71ccdee148b9322caabdba"
sha256: "3b202e4fa9c49b017d368fb0e570d4952bcd19972b67b2face071bdd68abbfae"
url: "https://pub.dev"
source: hosted
version: "1.1.2+1"
version: "1.4.2"
sky_engine:
dependency: transitive
description: flutter
@@ -1027,18 +1025,18 @@ packages:
dependency: transitive
description:
name: sqlite3
sha256: "1abbeb84bf2b1a10e5e1138c913123c8aa9d83cd64e5f9a0dd847b3c83063202"
sha256: "45f168ae2213201b54e09429ed0c593dc2c88c924a1488d6f9c523a255d567cb"
url: "https://pub.dev"
source: hosted
version: "2.4.2"
version: "2.4.6"
sqlite3_flutter_libs:
dependency: "direct main"
description:
name: sqlite3_flutter_libs
sha256: fb2a106a2ea6042fe57de2c47074cc31539a941819c91e105b864744605da3f5
sha256: "62bbb4073edbcdf53f40c80775f33eea01d301b7b81417e5b3fb7395416258c1"
url: "https://pub.dev"
source: hosted
version: "0.5.21"
version: "0.5.24"
stack_trace:
dependency: transitive
description:
@@ -1123,10 +1121,10 @@ packages:
dependency: "direct main"
description:
name: toastification
sha256: "5e751acc2fb5b8d008138dac255d62290fde4e5a24824f29809ac098c3dfe395"
sha256: "4d97fbfa463dfe83691044cba9f37cb185a79bb9205cfecb655fa1f6be126a13"
url: "https://pub.dev"
source: hosted
version: "2.0.0"
version: "2.3.0"
typed_data:
dependency: transitive
description:
@@ -1139,42 +1137,42 @@ packages:
dependency: "direct main"
description:
name: url_launcher
sha256: "6ce1e04375be4eed30548f10a315826fd933c1e493206eab82eed01f438c8d2e"
sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3"
url: "https://pub.dev"
source: hosted
version: "6.2.6"
version: "6.3.0"
url_launcher_android:
dependency: transitive
description:
name: url_launcher_android
sha256: "360a6ed2027f18b73c8d98e159dda67a61b7f2e0f6ec26e86c3ada33b0621775"
sha256: f0c73347dfcfa5b3db8bc06e1502668265d39c08f310c29bff4e28eea9699f79
url: "https://pub.dev"
source: hosted
version: "6.3.1"
version: "6.3.9"
url_launcher_ios:
dependency: transitive
description:
name: url_launcher_ios
sha256: "9149d493b075ed740901f3ee844a38a00b33116c7c5c10d7fb27df8987fb51d5"
sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e
url: "https://pub.dev"
source: hosted
version: "6.2.5"
version: "6.3.1"
url_launcher_linux:
dependency: transitive
description:
name: url_launcher_linux
sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811
sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af
url: "https://pub.dev"
source: hosted
version: "3.1.1"
version: "3.2.0"
url_launcher_macos:
dependency: transitive
description:
name: url_launcher_macos
sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234
sha256: "769549c999acdb42b8bcfa7c43d72bf79a382ca7441ab18a808e101149daf672"
url: "https://pub.dev"
source: hosted
version: "3.1.0"
version: "3.2.1"
url_launcher_platform_interface:
dependency: transitive
description:
@@ -1187,26 +1185,26 @@ packages:
dependency: transitive
description:
name: url_launcher_web
sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a"
sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e"
url: "https://pub.dev"
source: hosted
version: "2.3.1"
version: "2.3.3"
url_launcher_windows:
dependency: transitive
description:
name: url_launcher_windows
sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7
sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185"
url: "https://pub.dev"
source: hosted
version: "3.1.1"
version: "3.1.2"
uuid:
dependency: transitive
description:
name: uuid
sha256: "814e9e88f21a176ae1359149021870e87f7cddaf633ab678a5d2b0bff7fd1ba8"
sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff
url: "https://pub.dev"
source: hosted
version: "4.4.0"
version: "4.5.1"
vector_math:
dependency: transitive
description:
@@ -1235,18 +1233,34 @@ packages:
dependency: transitive
description:
name: web
sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb
url: "https://pub.dev"
source: hosted
version: "0.5.1"
version: "1.1.0"
web_socket:
dependency: transitive
description:
name: web_socket
sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83"
url: "https://pub.dev"
source: hosted
version: "0.1.6"
web_socket_channel:
dependency: transitive
description:
name: web_socket_channel
sha256: "58c6666b342a38816b2e7e50ed0f1e261959630becd4c879c4f26bfa14aa5a42"
sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f"
url: "https://pub.dev"
source: hosted
version: "2.4.5"
version: "3.0.1"
web_socket_client:
dependency: transitive
description:
name: web_socket_client
sha256: "0ec5230852349191188c013112e4d2be03e3fc83dbe80139ead9bf3a136e53b5"
url: "https://pub.dev"
source: hosted
version: "0.1.5"
win32:
dependency: "direct overridden"
description:
@@ -1259,26 +1273,18 @@ packages:
dependency: transitive
description:
name: win32_registry
sha256: "10589e0d7f4e053f2c61023a31c9ce01146656a70b7b7f0828c0b46d7da2a9bb"
sha256: "21ec76dfc731550fd3e2ce7a33a9ea90b828fdf19a5c3bcf556fa992cfa99852"
url: "https://pub.dev"
source: hosted
version: "1.1.3"
ws:
dependency: transitive
description:
name: ws
sha256: bb40a7b9219324ac285133c6b3c11bc16015d9cd5889e6555b76bd3e3a64b3e7
url: "https://pub.dev"
source: hosted
version: "1.0.0"
version: "1.1.5"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d
sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
url: "https://pub.dev"
source: hosted
version: "1.0.4"
version: "1.1.0"
xml:
dependency: transitive
description:
@@ -1296,5 +1302,5 @@ packages:
source: hosted
version: "3.1.2"
sdks:
dart: ">=3.3.0 <4.0.0"
flutter: ">=3.19.0"
dart: ">=3.4.0 <4.0.0"
flutter: ">=3.22.0"
+5 -4
View File
@@ -49,14 +49,15 @@ dependencies:
dependency_overrides:
purplebase:
git:
url: https://github.com/purplebase/purplebase
ref: 0.1.1
path: ../purplebase
# git:
# url: https://github.com/purplebase/purplebase
# ref: 0.1.1
flutter_data:
git:
url: https://github.com/zapstore/flutter_data
ref: d7376cf1eac8e9c563d4c6eed8e567adc877415c
win32: 5.5.4
win32: ^5.5.4
dev_dependencies:
flutter_test: