Skip to content

Commit

Permalink
refactor: removing ratingsListModelProvider
Browse files Browse the repository at this point in the history
Removed the ratingsListModelProvider, opting to use ratingsModelProvider instead and nesting the calls deeper in the widget tree
  • Loading branch information
matthew-hagemann committed Sep 14, 2023
1 parent 060bdb0 commit 19337bb
Show file tree
Hide file tree
Showing 13 changed files with 218 additions and 390 deletions.
122 changes: 66 additions & 56 deletions lib/src/detail/detail_page.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import 'package:app_center/src/ratings/ratings_l10n.dart';
import 'package:app_center/src/ratings/ratings_model.dart';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
Expand All @@ -15,13 +17,16 @@ import '/l10n.dart';
import '/layout.dart';
import '/snapd.dart';
import '/widgets.dart';
import '../ratings/ratings_l10n.dart';
import '../ratings/ratings_model.dart';

const _kPrimaryButtonMaxWidth = 136.0;
const _kChannelDropdownWidth = 220.0;

typedef SnapInfo = ({String label, Widget value});
class SnapInfo {
final String label;
final Widget value;

SnapInfo({required this.label, required this.value});
}

class DetailPage extends ConsumerWidget {
const DetailPage({super.key, required this.snapName});
Expand All @@ -34,22 +39,12 @@ class DetailPage extends ConsumerWidget {
final updatesModel = ref.watch(updatesModelProvider);

return snapModel.state.when(
data: (snapData) {
final snapId = snapModel.snap.id; // Replace with actual field name
final ratingsModel = ref.watch(ratingsModelProvider(snapId));

return ratingsModel.state.when(
data: (_) => ResponsiveLayoutBuilder(
builder: (_) => _SnapView(
snapModel: snapModel,
updatesModel: updatesModel,
ratingsModel: ratingsModel,
),
),
error: (error, stackTrace) => ErrorWidget(error),
loading: () => const Center(child: YaruCircularProgressIndicator()),
);
},
data: (snapData) => ResponsiveLayoutBuilder(
builder: (_) => _SnapView(
snapModel: snapModel,
updatesModel: updatesModel,
),
),
error: (error, stackTrace) => ErrorWidget(error),
loading: () => const Center(child: YaruCircularProgressIndicator()),
);
Expand All @@ -60,28 +55,17 @@ class _SnapView extends ConsumerWidget {
const _SnapView({
required this.snapModel,
required this.updatesModel,
required this.ratingsModel,
});

final SnapModel snapModel;
final UpdatesModel updatesModel;
final RatingsModel ratingsModel;

@override
Widget build(BuildContext context, WidgetRef ref) {
final l10n = AppLocalizations.of(context);

final snapInfos = <SnapInfo>[
(
label:
'${ratingsModel.snapRating?.totalVotes ?? 0} ${l10n.snapRatingsVotes}',
value: Text(
ratingsModel.snapRating?.ratingsBand.localize(l10n) ?? ' ',
style: TextStyle(
color: ratingsModel.snapRating!.ratingsBand.getColor(context),
fontSize: 12),
)
), // Placeholder
(
SnapInfo(
label: l10n.detailPageConfinementLabel,
value: Row(
mainAxisSize: MainAxisSize.min,
Expand All @@ -99,27 +83,27 @@ class _SnapView extends ConsumerWidget {
],
),
),
(
SnapInfo(
label: l10n.detailPageDownloadSizeLabel,
value: Text(
snapModel.channelInfo != null
? context.formatByteSize(snapModel.channelInfo!.size)
: '',
)
),
),
(
SnapInfo(
label: l10n.detailPagePublishedLabel,
value: Text(
snapModel.channelInfo != null
? DateFormat.yMMMd().format(snapModel.channelInfo!.releasedAt)
: '',
),
),
(
SnapInfo(
label: l10n.detailPageLicenseLabel,
value: Text(snapModel.snap.license ?? ''),
),
(
SnapInfo(
label: l10n.detailPageLinksLabel,
value: Column(
children: [
Expand Down Expand Up @@ -158,7 +142,11 @@ class _SnapView extends ConsumerWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_SnapInfos(snapInfos: snapInfos, layout: layout),
_SnapInfos(
snapInfos: snapInfos,
snapId: snapModel.snap.id,
layout: layout,
),
const Divider(),
if (snapModel.hasGallery)
_Section(
Expand Down Expand Up @@ -191,36 +179,58 @@ class _SnapView extends ConsumerWidget {
}
}

class _SnapInfos extends StatelessWidget {
class _SnapInfos extends ConsumerWidget {
const _SnapInfos({
required this.snapInfos,
required this.snapId,
required this.layout,
});

final List<SnapInfo> snapInfos;
final ResponsiveLayout layout;
final String snapId;

@override
Widget build(BuildContext context) {
Widget build(BuildContext context, WidgetRef ref) {
final l10n = AppLocalizations.of(context);
final ratingsModel = ref.watch(ratingsModelProvider(snapId));

final ratings = ratingsModel.state.whenOrNull(
data: (_) => SnapInfo(
label:
'${ratingsModel.snapRating?.totalVotes ?? 0} ${l10n.snapRatingsVotes}',
value: Text(
ratingsModel.snapRating?.ratingsBand.localize(l10n) ?? '',
style: TextStyle(
color: ratingsModel.snapRating?.ratingsBand.getColor(context)),
),
),
);

return Wrap(
spacing: kPagePadding,
runSpacing: 8,
children: snapInfos
.map((info) => SizedBox(
width: (layout.totalWidth -
(layout.snapInfoColumnCount - 1) * kPagePadding) /
layout.snapInfoColumnCount,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(info.label),
DefaultTextStyle.merge(
style: const TextStyle(fontWeight: FontWeight.w500),
child: info.value,
),
],
),
))
children: [
if (ratings != null) ratings,
...snapInfos,
]
.map(
(info) => SizedBox(
width: (layout.totalWidth -
(layout.snapInfoColumnCount - 1) * kPagePadding) /
layout.snapInfoColumnCount,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(info.label),
DefaultTextStyle.merge(
style: const TextStyle(fontWeight: FontWeight.w500),
child: info.value,
),
],
),
),
)
.toList(),
);
}
Expand Down
40 changes: 11 additions & 29 deletions lib/src/explore/explore_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:snapd/snapd.dart';
import 'package:yaru_icons/yaru_icons.dart';
import 'package:yaru_widgets/widgets.dart';

import '../ratings/ratings_list_model.dart';
import '/l10n.dart';
import '/layout.dart';
import '/search.dart';
Expand Down Expand Up @@ -129,33 +127,17 @@ class _CategorySnapList extends ConsumerWidget {
.toList() ??
[];

final snapIds = snaps.map((snap) => snap.id).toList();

return Consumer(
builder: (BuildContext context, WidgetRef ref, Widget? child) {
final ratingsList = ref.watch(ratingsListModelProvider(snapIds));

return ratingsList.state.when(
data: (ratings) => showScreenshots
? SnapImageCardGrid(
snaps: snaps,
ratings: ratingsList.snapRatings!,
onTap: (snap) =>
StoreNavigator.pushDetail(context, name: snap.name),
)
: SnapCardGrid(
snaps: snaps,
ratings: ratingsList.snapRatings!,
onTap: (snap) =>
StoreNavigator.pushDetail(context, name: snap.name),
),
error: (error, stack) =>
SliverToBoxAdapter(child: ErrorWidget(error)),
loading: () => const SliverToBoxAdapter(
child: Center(child: YaruCircularProgressIndicator())),
);
},
);
return showScreenshots
? SnapImageCardGrid(
snaps: snaps,
onTap: (snap) =>
StoreNavigator.pushDetail(context, name: snap.name),
)
: SnapCardGrid(
snaps: snaps,
onTap: (snap) =>
StoreNavigator.pushDetail(context, name: snap.name),
);
}
}

Expand Down
2 changes: 1 addition & 1 deletion lib/src/ratings/ratings_l10n.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'package:app_center/l10n.dart';
import 'package:flutter/material.dart';

import '../../l10n.dart';
import 'exports.dart';

extension RatingsBandL10n on RatingsBand {
Expand Down
40 changes: 0 additions & 40 deletions lib/src/ratings/ratings_list_model.dart

This file was deleted.

27 changes: 2 additions & 25 deletions lib/src/ratings/ratings_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,8 @@ class RatingsService {
}

Future<Rating?> getRating(String snapId) async {
try {
await _ensureValidToken();
return _client.getRating(snapId, _jwt!);
} catch (e) {
return null;
}
await _ensureValidToken();
return _client.getRating(snapId, _jwt!);
}

Future<void> vote(Vote vote) async {
Expand All @@ -53,23 +49,4 @@ class RatingsService {
await _ensureValidToken();
return await _client.listMyVotes(snapFilter, _jwt!);
}

Future<Map<String, Rating?>> getRatings(List<String> snapIds) async {
await _ensureValidToken();

final Map<String, Rating?> resultMap = {};
final List<Future<void>> futures = [];

for (final String snapId in snapIds) {
final future = getRating(snapId).then((rating) {
resultMap[snapId] = rating;
}).catchError((error) {
resultMap[snapId] = null;
});
futures.add(future);
}

await Future.wait(futures);
return resultMap;
}
}
Loading

0 comments on commit 19337bb

Please sign in to comment.