import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:gap/gap.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:island/models/sticker.dart'; import 'package:island/pods/network.dart'; import 'package:island/widgets/app_scaffold.dart'; import 'package:material_symbols_icons/symbols.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_paging_utils/riverpod_paging_utils.dart'; part 'marketplace.g.dart'; @riverpod class MarketplaceStickerPacksNotifier extends _$MarketplaceStickerPacksNotifier with CursorPagingNotifierMixin { @override Future> build() { return fetch(cursor: null); } @override Future> fetch({ required String? cursor, }) async { final client = ref.read(apiClientProvider); final offset = cursor == null ? 0 : int.parse(cursor); final response = await client.get( '/sphere/stickers', queryParameters: {'offset': offset, 'take': 20}, ); final total = int.parse(response.headers.value('X-Total') ?? '0'); final List data = response.data; final stickers = data.map((e) => SnStickerPack.fromJson(e)).toList(); final hasMore = offset + stickers.length < total; final nextCursor = hasMore ? (offset + stickers.length).toString() : null; return CursorPagingData( items: stickers, hasMore: hasMore, nextCursor: nextCursor, ); } } /// User-facing marketplace screen for browsing sticker packs. /// This version does NOT rely on publisher name (no pubName). class MarketplaceStickersScreen extends HookConsumerWidget { const MarketplaceStickersScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { return AppScaffold( appBar: AppBar( title: const Text('stickers').tr(), actions: const [Gap(8)], ), body: const SliverMarketplaceStickerPacksList(), ); } } class SliverMarketplaceStickerPacksList extends HookConsumerWidget { const SliverMarketplaceStickerPacksList({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { return PagingHelperView( provider: marketplaceStickerPacksNotifierProvider, futureRefreshable: marketplaceStickerPacksNotifierProvider.future, notifierRefreshable: marketplaceStickerPacksNotifierProvider.notifier, contentBuilder: (data, widgetCount, endItemView) => ListView.builder( padding: EdgeInsets.zero, itemCount: widgetCount, itemBuilder: (context, index) { if (index == widgetCount - 1) { return endItemView; } final pack = data.items[index]; return ListTile( title: Text(pack.name), subtitle: Text(pack.description), trailing: const Icon(Symbols.chevron_right), onTap: () { // Navigate to user-facing sticker pack detail page. // Adjust the route name/parameters if your app uses different ones. context.pushNamed( 'stickerPackDetail', pathParameters: {'packId': pack.id}, ); }, ); }, ), ); } }