1
- import 'package:catalyst_voices/common/ext/space_ext.dart' ;
1
+ import 'package:catalyst_cardano_serialization/catalyst_cardano_serialization.dart' ;
2
+ import 'package:catalyst_voices/common/ext/build_context_ext.dart' ;
2
3
import 'package:catalyst_voices/pages/overall_spaces/space/space_overview_header.dart' ;
3
4
import 'package:catalyst_voices/pages/overall_spaces/space/space_overview_nav_tile.dart' ;
4
5
import 'package:catalyst_voices/pages/overall_spaces/space_overview_container.dart' ;
6
+ import 'package:catalyst_voices/routes/routes.dart' ;
7
+ import 'package:catalyst_voices/widgets/cards/small_proposal_card.dart' ;
5
8
import 'package:catalyst_voices/widgets/widgets.dart' ;
6
9
import 'package:catalyst_voices_assets/catalyst_voices_assets.dart' ;
10
+ import 'package:catalyst_voices_blocs/catalyst_voices_blocs.dart' ;
11
+ import 'package:catalyst_voices_localization/catalyst_voices_localization.dart' ;
7
12
import 'package:catalyst_voices_models/catalyst_voices_models.dart' ;
8
13
import 'package:flutter/material.dart' ;
14
+ import 'package:flutter_bloc/flutter_bloc.dart' ;
15
+ import 'package:go_router/go_router.dart' ;
9
16
10
17
class DiscoveryOverview extends StatelessWidget {
11
18
const DiscoveryOverview ({super .key});
@@ -17,11 +24,13 @@ class DiscoveryOverview extends StatelessWidget {
17
24
children: [
18
25
SpaceOverviewHeader (Space .discovery),
19
26
_DiscoveryDashboardTile (),
20
- VoicesDivider (indent: 0 , endIndent: 0 , height: 16 ),
21
- _RolesTile (),
22
27
_FeedbackTile (),
23
28
VoicesDivider (indent: 0 , endIndent: 0 , height: 16 ),
24
- _DocumentationTile (),
29
+ Expanded (
30
+ child: SingleChildScrollView (
31
+ child: _PublishedProposalSelector (1 , 5 ),
32
+ ),
33
+ ),
25
34
],
26
35
),
27
36
);
@@ -36,46 +45,144 @@ class _DiscoveryDashboardTile extends StatelessWidget {
36
45
return SpaceOverviewNavTile (
37
46
leading: VoicesAssets .icons.home.buildIcon (),
38
47
title: Text (
39
- 'Discovery Dashboard' ,
48
+ context.l10n.discoveryHomepage ,
40
49
style: Theme .of (context).textTheme.bodyLarge,
41
50
),
42
- backgroundColor : Space .discovery. backgroundColor (context),
51
+ onTap : () => GoRouter . of (context). go ( const DiscoveryRoute ().location ),
43
52
);
44
53
}
45
54
}
46
55
47
- class _RolesTile extends StatelessWidget {
48
- const _RolesTile ();
56
+ class _FeedbackTile extends StatelessWidget {
57
+ const _FeedbackTile ();
49
58
50
59
@override
51
60
Widget build (BuildContext context) {
52
- return SpaceOverviewNavTile (
53
- leading: VoicesAssets .icons.user.buildIcon (),
54
- title: const Text ('Catalyst Roles' ),
61
+ return BlocSelector <SessionCubit , SessionState , bool >(
62
+ selector: (state) {
63
+ return state.account? .isProposer ?? false ;
64
+ },
65
+ builder: (context, state) {
66
+ return Visibility .maintain (
67
+ visible: state,
68
+ child: SpaceOverviewNavTile (
69
+ leading: VoicesAssets .icons.documentText.buildIcon (),
70
+ title: Text (
71
+ context.l10n.feedbackOnProposals,
72
+ style: Theme .of (context).textTheme.bodyLarge,
73
+ ),
74
+ onTap: state
75
+ ? () => GoRouter .of (context).go (const ProposalsRoute ().location)
76
+ : null ,
77
+ ),
78
+ );
79
+ },
55
80
);
56
81
}
57
82
}
58
83
59
- class _FeedbackTile extends StatelessWidget {
60
- const _FeedbackTile ();
84
+ class _Header extends StatelessWidget {
85
+ final int currentProposals;
86
+ final int maxProposals;
87
+ const _Header ({
88
+ required this .maxProposals,
89
+ required this .currentProposals,
90
+ });
61
91
62
92
@override
63
93
Widget build (BuildContext context) {
64
- return SpaceOverviewNavTile (
65
- leading: VoicesAssets .icons.annotation.buildIcon (),
66
- title: const Text ('Feedback' ),
94
+ return Padding (
95
+ padding: const EdgeInsets .symmetric (vertical: 18 )
96
+ ..add (
97
+ const EdgeInsets .only (left: 16 ),
98
+ ),
99
+ child: Text (
100
+ context.l10n.noPublishedProposalsOnMaxCount (
101
+ currentProposals,
102
+ maxProposals,
103
+ ),
104
+ style: context.textTheme.titleMedium? .copyWith (
105
+ color: context.colors.textOnPrimaryLevel1,
106
+ ),
107
+ ),
67
108
);
68
109
}
69
110
}
70
111
71
- class _DocumentationTile extends StatelessWidget {
72
- const _DocumentationTile ();
112
+ class _PublishedProposals extends StatelessWidget {
113
+ final int currentProposals;
114
+ final int maxProposals;
115
+ const _PublishedProposals (
116
+ this .currentProposals,
117
+ this .maxProposals,
118
+ );
73
119
74
120
@override
75
121
Widget build (BuildContext context) {
76
- return SpaceOverviewNavTile (
77
- leading: VoicesAssets .icons.arrowRight.buildIcon (),
78
- title: const Text ('Catalyst Gitbook documentation' ),
122
+ // TODO(LynxLynxx): replace with real data
123
+ final proposal = Proposal (
124
+ selfRef: SignedDocumentRef .generateFirstRef (),
125
+ title: 'Latest proposal that is making its rounds.' ,
126
+ category: 'F14: Cardano Use Cases: Concept' ,
127
+ description: 'Lorem ipsum dolor sit ' ,
128
+ fundsRequested: const Coin (100000 ),
129
+ status: ProposalStatus .draft,
130
+ publish: ProposalPublish .localDraft,
131
+ commentsCount: 0 ,
132
+ duration: 6 ,
133
+ author: 'Alex Wells' ,
134
+ updateDate: DateTime .now (),
135
+ versionCount: 1 ,
136
+ );
137
+ return Column (
138
+ mainAxisSize: MainAxisSize .min,
139
+ crossAxisAlignment: CrossAxisAlignment .start,
140
+ children: [
141
+ _Header (
142
+ maxProposals: maxProposals,
143
+ currentProposals: currentProposals,
144
+ ),
145
+ SmallProposalCard (
146
+ proposal: proposal.copyWith (
147
+ publish: ProposalPublish .submittedProposal,
148
+ commentsCount: 1 ,
149
+ ),
150
+ ),
151
+ const SizedBox (height: 12 ),
152
+ SmallProposalCard (
153
+ proposal: proposal.copyWith (
154
+ publish: ProposalPublish .publishedDraft,
155
+ commentsCount: 12 ,
156
+ ),
157
+ ),
158
+ ],
159
+ );
160
+ }
161
+ }
162
+
163
+ class _PublishedProposalSelector extends StatelessWidget {
164
+ final int currentProposals;
165
+ final int maxProposals;
166
+ const _PublishedProposalSelector (
167
+ this .currentProposals,
168
+ this .maxProposals,
169
+ );
170
+
171
+ @override
172
+ Widget build (BuildContext context) {
173
+ return BlocSelector <SessionCubit , SessionState , bool >(
174
+ selector: (state) {
175
+ return ! (state.account? .isProposer ?? false );
176
+ },
177
+ builder: (context, state) {
178
+ return Offstage (
179
+ offstage: state,
180
+ child: _PublishedProposals (
181
+ currentProposals,
182
+ maxProposals,
183
+ ),
184
+ );
185
+ },
79
186
);
80
187
}
81
188
}
0 commit comments