Skip to content

Commit 1be1839

Browse files
feat(cat-voices): campaign total ask (#3734)
* remove totalAsk and proposalsCount from campaign model * proposalsCount -> finalProposalsCount * CampaignCategoryViewModel.id -> CampaignCategoryViewModel.ref * little DiscoveryCubit state build cleanup * watch campaign total ask in discovery * smaller voting category model * new proposal campaign * safe check * proposal builder category total ask * chore: missing TODO * category details * watch proposals template total ask * finish integration of total_ask * close * remove print and add TODO * documents getLatestOf * categoryId -> categoryRef * chore: make logger private * feat: Make MultiCurrencyAmount immutable
1 parent b272597 commit 1be1839

File tree

70 files changed

+3021
-558
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

70 files changed

+3021
-558
lines changed

catalyst_voices/apps/voices/lib/dependency/dependencies.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,13 @@ final class Dependencies extends DependencyProvider {
272272
get<SignedDocumentManager>(),
273273
);
274274
})
275-
..registerLazySingleton<CampaignRepository>(CampaignRepository.new)
275+
..registerLazySingleton<CampaignRepository>(
276+
() {
277+
return CampaignRepository(
278+
get<DatabaseDocumentsDataSource>(),
279+
);
280+
},
281+
)
276282
..registerLazySingleton<DocumentRepository>(() {
277283
return DocumentRepository(
278284
get<CatalystDatabase>(),

catalyst_voices/apps/voices/lib/pages/category/card_information.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,15 @@ class CardInformation extends StatelessWidget {
2828
padding: padding,
2929
children: [
3030
CategoryProposalsDetailsCard(
31-
categoryId: category.id,
31+
categoryRef: category.ref,
3232
categoryName: category.formattedName,
33-
categoryProposalsCount: category.proposalsCount,
33+
categoryFinalProposalsCount: category.finalProposalsCount,
3434
),
3535
const SizedBox(height: 16),
3636
Offstage(
3737
offstage: !isActiveProposer,
3838
child: CreateProposalCard(
39-
categoryId: category.id,
39+
categoryRef: category.ref,
4040
categoryName: category.formattedName,
4141
categoryDos: category.dos,
4242
categoryDonts: category.donts,

catalyst_voices/apps/voices/lib/pages/category/category_compact_detail_view.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class CategoryCompactDetailView extends StatelessWidget {
3232
_CategoryBrief(
3333
categoryName: category.formattedName,
3434
categoryDescription: category.description,
35-
categoryRef: category.id,
35+
categoryRef: category.ref,
3636
),
3737
FundsDetailCard(
3838
allFunds: category.availableFunds,

catalyst_voices/apps/voices/lib/pages/category/category_detail_view.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ class CategoryDetailView extends StatelessWidget {
3232
_CategoryBrief(
3333
categoryName: category.formattedName,
3434
categoryDescription: category.description,
35-
categoryRef: category.id,
35+
categoryRef: category.ref,
3636
image: category.image,
37-
proposalCount: category.proposalsCount,
37+
finalProposalsCount: category.finalProposalsCount,
3838
),
3939
const SizedBox(height: 64),
4040
FundsDetailCard(
@@ -59,14 +59,14 @@ class _CategoryBrief extends StatelessWidget {
5959
final String categoryDescription;
6060
final SignedDocumentRef categoryRef;
6161
final SvgGenImage image;
62-
final int proposalCount;
62+
final int finalProposalsCount;
6363

6464
const _CategoryBrief({
6565
required this.categoryName,
6666
required this.categoryDescription,
6767
required this.categoryRef,
6868
required this.image,
69-
required this.proposalCount,
69+
required this.finalProposalsCount,
7070
});
7171

7272
@override
@@ -98,7 +98,7 @@ class _CategoryBrief extends StatelessWidget {
9898
categoryName: categoryName,
9999
categoryDescription: categoryDescription,
100100
categoryRef: categoryRef,
101-
showViewAllButton: proposalCount > 0,
101+
showViewAllButton: finalProposalsCount > 0,
102102
),
103103
),
104104
],

catalyst_voices/apps/voices/lib/pages/category/category_page.dart

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ import 'package:flutter/material.dart';
1616
import 'package:skeletonizer/skeletonizer.dart';
1717

1818
class CategoryPage extends StatefulWidget {
19-
final SignedDocumentRef categoryId;
19+
final SignedDocumentRef categoryRef;
2020

21-
const CategoryPage({super.key, required this.categoryId});
21+
const CategoryPage({super.key, required this.categoryRef});
2222

2323
@override
2424
State<CategoryPage> createState() => _CategoryPageState();
@@ -106,6 +106,8 @@ class _CategoryDetailContent extends StatelessWidget {
106106

107107
@override
108108
Widget build(BuildContext context) {
109+
// TODO(damian-molinski): refactor it into single class object in category_detail_state.dart
110+
// and do not rely on context.select<SessionCubit> here.
109111
return BlocSelector<
110112
CategoryDetailCubit,
111113
CategoryDetailState,
@@ -114,7 +116,7 @@ class _CategoryDetailContent extends StatelessWidget {
114116
selector: (state) {
115117
return (
116118
show: state.isLoading,
117-
data: state.category ?? CampaignCategoryDetailsViewModel.placeholder(),
119+
data: state.selectedCategoryDetails ?? CampaignCategoryDetailsViewModel.placeholder(),
118120
);
119121
},
120122
builder: (context, state) {
@@ -139,9 +141,9 @@ class _CategoryDetailContent extends StatelessWidget {
139141
}
140142

141143
class _CategoryDetailError extends StatelessWidget {
142-
final SignedDocumentRef categoryId;
144+
final SignedDocumentRef categoryRef;
143145

144-
const _CategoryDetailError({required this.categoryId});
146+
const _CategoryDetailError({required this.categoryRef});
145147

146148
@override
147149
Widget build(BuildContext context) {
@@ -165,7 +167,7 @@ class _CategoryDetailError extends StatelessWidget {
165167
? null
166168
: () {
167169
unawaited(
168-
context.read<CategoryDetailCubit>().getCategoryDetail(categoryId),
170+
context.read<CategoryDetailCubit>().getCategoryDetail(categoryRef),
169171
);
170172
},
171173
),
@@ -187,7 +189,7 @@ class _CategoryPageState extends State<CategoryPage> {
187189
children: [
188190
const _CategoryDetailContent(),
189191
_CategoryDetailError(
190-
categoryId: widget.categoryId,
192+
categoryRef: widget.categoryRef,
191193
),
192194
].constrainedDelegate(),
193195
),
@@ -198,9 +200,9 @@ class _CategoryPageState extends State<CategoryPage> {
198200
void didUpdateWidget(CategoryPage oldWidget) {
199201
super.didUpdateWidget(oldWidget);
200202

201-
if (widget.categoryId != oldWidget.categoryId) {
203+
if (widget.categoryRef != oldWidget.categoryRef) {
202204
unawaited(
203-
context.read<CategoryDetailCubit>().getCategoryDetail(widget.categoryId),
205+
context.read<CategoryDetailCubit>().getCategoryDetail(widget.categoryRef),
204206
);
205207
}
206208
}
@@ -215,17 +217,16 @@ class _CategoryPageState extends State<CategoryPage> {
215217
@override
216218
void initState() {
217219
super.initState();
218-
unawaited(context.read<CategoryDetailCubit>().getCategories());
219-
unawaited(
220-
context.read<CategoryDetailCubit>().getCategoryDetail(widget.categoryId),
221-
);
222-
_listenForProposalRef(context.read<CategoryDetailCubit>());
220+
final cubit = context.read<CategoryDetailCubit>()..watchActiveCampaignCategories();
221+
unawaited(cubit.getCategoryDetail(widget.categoryRef));
222+
_listenForProposalRef(cubit);
223223
}
224224

225+
// TODO(damian-molinski): refactor it to signal pattern
225226
void _listenForProposalRef(CategoryDetailCubit cubit) {
226227
// listen for updates
227228
_categoryRefSub = cubit.stream
228-
.map((event) => event.category?.id)
229+
.map((event) => event.selectedCategoryRef)
229230
.distinct()
230231
.listen(_onCategoryRefChanged);
231232
}

catalyst_voices/apps/voices/lib/pages/category/change_category_button.dart

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,27 +14,20 @@ class ChangeCategoryButton extends StatelessWidget {
1414

1515
@override
1616
Widget build(BuildContext context) {
17-
return BlocSelector<
18-
CategoryDetailCubit,
19-
CategoryDetailState,
20-
List<DropdownMenuViewModel<ProposalsCategoryFilter>>
21-
>(
22-
selector: (state) {
23-
final selectedCategory = state.category?.id ?? '';
24-
return state.categories
25-
.map(
26-
(e) => DropdownMenuViewModel(
27-
value: ProposalsRefCategoryFilter(ref: e.id),
28-
name: e.formattedName,
29-
isSelected: e.id == selectedCategory,
30-
),
31-
)
32-
.toList();
33-
},
17+
return BlocSelector<CategoryDetailCubit, CategoryDetailState, CategoryDetailStatePicker>(
18+
selector: (state) => state.picker,
3419
builder: (context, state) {
3520
return CampaignCategoryPicker(
3621
onSelected: (value) => unawaited(_changeCategory(context, value)),
37-
items: state,
22+
items: state.items.map(
23+
(item) {
24+
return DropdownMenuViewModel(
25+
value: ProposalsRefCategoryFilter(ref: item.ref),
26+
name: item.name,
27+
isSelected: item.isSelected,
28+
);
29+
},
30+
).toList(),
3831
buttonBuilder:
3932
(
4033
context,

catalyst_voices/apps/voices/lib/pages/discovery/sections/campaign_details/widgets/campaign_categories.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class CampaignCategories extends StatelessWidget {
3232
.map(
3333
(e) => Skeletonizer(
3434
enabled: isLoading,
35-
child: CampaignCategoryCard(key: ValueKey(e.id), category: e),
35+
child: CampaignCategoryCard(key: ValueKey(e.ref), category: e),
3636
),
3737
)
3838
.toList(),

catalyst_voices/apps/voices/lib/pages/spaces/appbar/spaces_appbar/voting_appbar.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class _CategoryVotingAppbar extends StatelessWidget {
4242
@override
4343
Widget build(BuildContext context) {
4444
return BlocSelector<VotingCubit, VotingState, bool>(
45-
selector: (state) => state.selectedCategory != null,
45+
selector: (state) => state.hasSelectedCategory,
4646
builder: (context, hasCategory) {
4747
return _VotingAppbar(
4848
showLeading: isAppUnlock && hasCategory,

catalyst_voices/apps/voices/lib/pages/voting/widgets/grid/voting_proposals_sub_header.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class VotingProposalsSubHeader extends StatelessWidget {
99
@override
1010
Widget build(BuildContext context) {
1111
return BlocSelector<VotingCubit, VotingState, bool>(
12-
selector: (state) => state.selectedCategory != null,
12+
selector: (state) => state.hasSelectedCategory,
1313
builder: (context, hasCategory) {
1414
return Text(
1515
hasCategory ? context.l10n.categoryProposals : context.l10n.proposals,

catalyst_voices/apps/voices/lib/pages/voting/widgets/header/voting_category_header.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import 'package:catalyst_voices/common/ext/build_context_ext.dart';
22
import 'package:catalyst_voices/pages/voting/widgets/header/voting_category_picker.dart';
33
import 'package:catalyst_voices_assets/catalyst_voices_assets.dart';
4+
import 'package:catalyst_voices_blocs/catalyst_voices_blocs.dart';
45
import 'package:catalyst_voices_brands/catalyst_voices_brands.dart';
56
import 'package:catalyst_voices_localization/catalyst_voices_localization.dart';
67
import 'package:catalyst_voices_view_models/catalyst_voices_view_models.dart';
78
import 'package:flutter/material.dart';
89

910
class VotingCategoryHeader extends StatelessWidget {
10-
final CampaignCategoryDetailsViewModel category;
11+
final VotingHeaderCategoryData category;
1112

1213
const VotingCategoryHeader({
1314
super.key,
@@ -21,7 +22,7 @@ class VotingCategoryHeader extends StatelessWidget {
2122
child: Stack(
2223
children: [
2324
Positioned.fill(
24-
child: _Background(image: category.image),
25+
child: _Background(image: CategoryImageUrl.image(category.imageUrl)),
2526
),
2627
Padding(
2728
padding: const EdgeInsets.fromLTRB(28, 32, 32, 44),

0 commit comments

Comments
 (0)