Skip to content

Commit 5bf3afd

Browse files
committed
addon store initial
1 parent 57c3dcc commit 5bf3afd

23 files changed

Lines changed: 3376 additions & 592 deletions

File tree

apps/weblibre/lib/core/routing/routes.addons.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ part of 'routes.dart';
2727
name: 'AddonDetailsRoute',
2828
path: 'details/:addonId',
2929
),
30+
TypedGoRoute<AddonListingDetailsRoute>(
31+
name: 'AddonListingDetailsRoute',
32+
path: 'listing/:addonId',
33+
),
3034
TypedGoRoute<AddonPermissionsRoute>(
3135
name: 'AddonPermissionsRoute',
3236
path: 'permissions/:addonId',
@@ -57,6 +61,19 @@ class AddonDetailsRoute extends GoRouteData with $AddonDetailsRoute {
5761
}
5862
}
5963

64+
class AddonListingDetailsRoute extends GoRouteData
65+
with $AddonListingDetailsRoute {
66+
final String addonId;
67+
final AddonListing $extra;
68+
69+
const AddonListingDetailsRoute({required this.addonId, required this.$extra});
70+
71+
@override
72+
Widget build(BuildContext context, GoRouterState state) {
73+
return AddonListingDetailsScreen(listing: $extra);
74+
}
75+
}
76+
6077
class AddonPermissionsRoute extends GoRouteData with $AddonPermissionsRoute {
6178
final String addonId;
6279

apps/weblibre/lib/core/routing/routes.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import 'package:weblibre/domain/entities/profile.dart';
3030
import 'package:weblibre/features/about/presentation/screens/about.dart';
3131
import 'package:weblibre/features/addons/presentation/screens/addon_details.dart';
3232
import 'package:weblibre/features/addons/presentation/screens/addon_internal_settings.dart';
33+
import 'package:weblibre/features/addons/presentation/screens/addon_listing_details.dart';
3334
import 'package:weblibre/features/addons/presentation/screens/addon_manager.dart';
3435
import 'package:weblibre/features/addons/presentation/screens/addon_permissions.dart';
3536
import 'package:weblibre/features/bangs/data/models/bang.dart';

apps/weblibre/lib/core/routing/routes.g.dart

Lines changed: 35 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/weblibre/lib/features/addons/domain/providers.dart

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import 'package:flutter_mozilla_components/flutter_mozilla_components.dart';
2323
import 'package:riverpod/experimental/persist.dart';
2424
import 'package:riverpod_annotation/experimental/persist.dart';
2525
import 'package:riverpod_annotation/riverpod_annotation.dart';
26+
import 'package:weblibre/features/addons/utils/addon_html.dart';
2627
import 'package:weblibre/features/geckoview/domain/providers.dart';
2728
import 'package:weblibre/features/user/data/providers.dart';
2829

@@ -137,6 +138,50 @@ Future<AddonStoreInfo?> addonStoreInfo(Ref ref, String addonId) {
137138
return ref.read(addonServiceProvider).getAddonStoreInfo(addonId);
138139
}
139140

141+
@Riverpod()
142+
Future<List<AddonListing>> featuredAddonListings(Ref ref, AddonStoreApp app) {
143+
return ref.read(addonServiceProvider).getFeaturedAddonListings(app: app);
144+
}
145+
146+
@Riverpod()
147+
Future<List<AddonListing>> searchAddonListings(
148+
Ref ref,
149+
String query,
150+
AddonStoreApp app,
151+
) async {
152+
final trimmed = query.trim();
153+
if (trimmed.isEmpty) {
154+
return ref.watch(featuredAddonListingsProvider(app).future);
155+
}
156+
return ref.read(addonServiceProvider).searchAddonListings(
157+
query: trimmed,
158+
app: app,
159+
);
160+
}
161+
162+
@Riverpod(keepAlive: true)
163+
class AddonStoreAppFilter extends _$AddonStoreAppFilter {
164+
void setApp(AddonStoreApp app) => state = app;
165+
166+
@override
167+
AddonStoreApp build() => AddonStoreApp.android;
168+
}
169+
170+
@Riverpod()
171+
Future<String> addonDescriptionMarkdown(Ref ref, String addonId) async {
172+
final description = await ref.watch(
173+
addonDetailsProvider(
174+
addonId,
175+
).selectAsync((addon) => addon?.description ?? ''),
176+
);
177+
return turndownAddonHtml(description);
178+
}
179+
180+
@Riverpod()
181+
Future<String> addonHtmlMarkdown(Ref ref, String html) {
182+
return turndownAddonHtml(html);
183+
}
184+
140185
@Riverpod()
141186
Future<AddonUpdateAttemptInfo?> lastAddonUpdateAttempt(
142187
Ref ref,

0 commit comments

Comments
 (0)