diff --git a/lib/core/di/repositories_module.dart b/lib/core/di/repositories_module.dart index 2839a415..a52ca0de 100644 --- a/lib/core/di/repositories_module.dart +++ b/lib/core/di/repositories_module.dart @@ -23,5 +23,5 @@ void _registerRepositoriesModule() { _registerLazySingleton(() => TransactionHistoryRepository(service: _getIt())); - _registerLazySingleton(() => ProposalRepository(_getIt(),_getIt())); + _registerLazySingleton(() => ProposalRepository(_getIt(),_getIt(),_getIt())); } \ No newline at end of file diff --git a/lib/core/network/api/services/proposal_service.dart b/lib/core/network/api/services/proposal_service.dart index 6a829e41..2cce17d2 100644 --- a/lib/core/network/api/services/proposal_service.dart +++ b/lib/core/network/api/services/proposal_service.dart @@ -23,9 +23,11 @@ class ProposalService { Future, HyphaError>> getProposalDetails( String proposalId, UserProfileData user) async { final String query = - '{"query":"query proposalDetails(\$docId: String!) { getDocument(docId: \$docId) {__typename docId creator createdDate ... on Votable {pass: voteAggregate(filter: { vote_vote_s: { regexp: \\"/.*pass*./\\" } }) {count} fail: voteAggregate(filter: { vote_vote_s: { regexp: \\"/.*fail*./\\" } }) {count} vote { ... on Vote { vote_voter_n vote_vote_s } } } ... on Edit {details_title_s details_description_s details_periodCount_i details_deferredPercX100_i ballot_expiration_t dao {settings {settings_daoTitle_s settings_periodDurationSec_i}} details_ballotAlignment_i details_ballotQuorum_i} ... on Queststart {details_title_s details_description_s details_periodCount_i details_deferredPercX100_i start {details_startTime_t} ballot_expiration_t dao {settings {settings_daoTitle_s settings_periodDurationSec_i}} details_ballotAlignment_i details_ballotQuorum_i details_pegAmount_a details_voiceAmount_a details_rewardAmount_a} ... on Questcomple {details_title_s details_description_s ballot_expiration_t dao {settings {settings_daoTitle_s settings_periodDurationSec_i}} details_pegAmount_a details_voiceAmount_a details_rewardAmount_a} ... on Policy {details_title_s details_description_s details_periodCount_i details_deferredPercX100_i ballot_expiration_t dao {settings {settings_daoTitle_s settings_periodDurationSec_i}} details_ballotAlignment_i details_ballotQuorum_i details_pegAmount_a details_voiceAmount_a details_rewardAmount_a} ... on Payout {details_title_s details_description_s details_periodCount_i details_deferredPercX100_i start {details_startTime_t} ballot_expiration_t dao {settings {settings_daoTitle_s settings_periodDurationSec_i}} details_ballotAlignment_i details_ballotQuorum_i details_pegAmount_a details_voiceAmount_a details_rewardAmount_a} ... on Badge {details_title_s details_description_s details_periodCount_i ballot_expiration_t dao {settings {settings_daoTitle_s settings_periodDurationSec_i}} details_ballotAlignment_i details_ballotQuorum_i} ... on Poll {details_title_s details_description_s ballot_expiration_t dao {settings {settings_daoTitle_s settings_periodDurationSec_i}} details_ballotAlignment_i details_ballotQuorum_i} ... on Budget {details_title_s details_description_s details_deferredPercX100_i ballot_expiration_t dao {settings {settings_daoTitle_s settings_periodDurationSec_i}} details_ballotAlignment_i details_ballotQuorum_i details_pegAmount_a details_voiceAmount_a details_rewardAmount_a} ... on Assignment {details_title_s details_description_s details_periodCount_i details_deferredPercX100_i start {details_startTime_t} details_rewardSalaryPerPeriod_a details_voiceSalaryPerPeriod_a details_pegSalaryPerPeriod_a ballot_expiration_t dao {settings {settings_daoTitle_s settings_periodDurationSec_i}} details_timeShareX100_i details_ballotAlignment_i details_ballotQuorum_i} } }", "variables":{"docId":"$proposalId"}}'; + '{"query":"query proposalDetails(\$docId: String!) { getDocument(docId: \$docId) {__typename docId creator createdDate ... on Votable {pass: voteAggregate(filter: { vote_vote_s: { regexp: \\"/.*pass*./\\" } }) {count} fail: voteAggregate(filter: { vote_vote_s: { regexp: \\"/.*fail*./\\" } }) {count} vote { ... on Vote { vote_voter_n vote_vote_s } } } ... on Edit {details_title_s details_description_s details_periodCount_i details_deferredPercX100_i ballot_expiration_t dao {docId settings {settings_daoTitle_s settings_periodDurationSec_i}} details_ballotAlignment_i details_ballotQuorum_i} ... on Queststart {details_title_s details_description_s details_periodCount_i details_deferredPercX100_i start {details_startTime_t} ballot_expiration_t dao {docId settings {settings_daoTitle_s settings_periodDurationSec_i}} details_ballotAlignment_i details_ballotQuorum_i details_pegAmount_a details_voiceAmount_a details_rewardAmount_a} ... on Questcomple {details_title_s details_description_s ballot_expiration_t dao {docId settings {settings_daoTitle_s settings_periodDurationSec_i}} details_pegAmount_a details_voiceAmount_a details_rewardAmount_a} ... on Policy {details_title_s details_description_s details_periodCount_i details_deferredPercX100_i ballot_expiration_t dao {docId settings {settings_daoTitle_s settings_periodDurationSec_i}} details_ballotAlignment_i details_ballotQuorum_i details_pegAmount_a details_voiceAmount_a details_rewardAmount_a} ... on Payout {details_title_s details_description_s details_periodCount_i details_deferredPercX100_i start {details_startTime_t} ballot_expiration_t dao {docId settings {settings_daoTitle_s settings_periodDurationSec_i}} details_ballotAlignment_i details_ballotQuorum_i details_pegAmount_a details_voiceAmount_a details_rewardAmount_a} ... on Badge {details_title_s details_description_s details_periodCount_i ballot_expiration_t dao {docId settings {settings_daoTitle_s settings_periodDurationSec_i}} details_ballotAlignment_i details_ballotQuorum_i} ... on Poll {details_title_s details_description_s ballot_expiration_t dao {docId settings {settings_daoTitle_s settings_periodDurationSec_i}} details_ballotAlignment_i details_ballotQuorum_i} ... on Budget {details_title_s details_description_s details_deferredPercX100_i ballot_expiration_t dao {docId settings {settings_daoTitle_s settings_periodDurationSec_i}} details_ballotAlignment_i details_ballotQuorum_i details_pegAmount_a details_voiceAmount_a details_rewardAmount_a} ... on Assignment {details_title_s details_description_s details_periodCount_i details_deferredPercX100_i start {details_startTime_t} details_rewardSalaryPerPeriod_a details_voiceSalaryPerPeriod_a details_pegSalaryPerPeriod_a ballot_expiration_t dao {docId settings {settings_daoTitle_s settings_periodDurationSec_i}} details_timeShareX100_i details_ballotAlignment_i details_ballotQuorum_i} } }", "variables":{"docId":"$proposalId"}}'; return _graphQLService.graphQLQuery(network: user.network, query: query); } + + } \ No newline at end of file diff --git a/lib/core/network/repository/proposal_repository.dart b/lib/core/network/repository/proposal_repository.dart index b5e0b98a..8a62c983 100644 --- a/lib/core/network/repository/proposal_repository.dart +++ b/lib/core/network/repository/proposal_repository.dart @@ -1,9 +1,11 @@ import 'package:hypha_wallet/core/error_handler/model/hypha_error.dart'; import 'package:hypha_wallet/core/extension/base_proposal_model_extension.dart'; import 'package:hypha_wallet/core/logging/log_helper.dart'; +import 'package:hypha_wallet/core/network/api/services/dao_service.dart'; import 'package:hypha_wallet/core/network/api/services/proposal_service.dart'; import 'package:hypha_wallet/core/network/models/dao_data_model.dart'; import 'package:hypha_wallet/core/network/models/dao_proposals_model.dart'; +import 'package:hypha_wallet/core/network/models/network.dart'; import 'package:hypha_wallet/core/network/models/proposal_details_model.dart'; import 'package:hypha_wallet/core/network/models/proposal_model.dart'; import 'package:hypha_wallet/core/network/models/user_profile_data.dart'; @@ -16,8 +18,13 @@ import 'package:hypha_wallet/ui/proposals/list/interactor/get_proposals_use_case class ProposalRepository { final ProposalService _proposalService; final ProfileService _profileService; + final DaoService _daoService; - ProposalRepository(this._proposalService, this._profileService); + + + ProposalRepository( + this._daoService, + this._proposalService, this._profileService); Future, HyphaError>> getProposals( UserProfileData user, GetProposalsUseCaseInput input) async { @@ -143,7 +150,7 @@ class ProposalRepository { return Future.wait(proposalFutures); } - void sortProposals(List proposals) { + void sortProposals(List proposals,) { proposals.sort((a, b) { final int daoNameComparison = (a.dao?.settingsDaoTitle ?? '') .compareTo(b.dao?.settingsDaoTitle ?? ''); @@ -177,7 +184,9 @@ class ProposalRepository { try { final Map response = result.valueOrCrash; - final ProposalDetailsModel proposalDetails = + final Result dao= await _daoService.getDaoById(network: Network.telos, daoId:response['data']['getDocument']['dao'][0]['docId'] ); + final Result creator = await _profileService.getProfile(response['data']['getDocument']['creator']); + final ProposalDetailsModel proposalDetails = ProposalDetailsModel.fromJson(response['data']['getDocument']); if (proposalDetails.votes != null) { for (int i = 0; i < proposalDetails.votes!.length; i++) { @@ -190,6 +199,8 @@ class ProposalRepository { } } } + proposalDetails.creator=creator.asValue!.value; + proposalDetails.dao=dao.asValue!.value; return Result.value(proposalDetails); } catch (e, stackTrace) { LogHelper.e('Error parsing data into proposal details model', diff --git a/lib/ui/proposals/details/components/proposal_details_view.dart b/lib/ui/proposals/details/components/proposal_details_view.dart index fcafb141..c9ed7ec4 100644 --- a/lib/ui/proposals/details/components/proposal_details_view.dart +++ b/lib/ui/proposals/details/components/proposal_details_view.dart @@ -13,6 +13,7 @@ import 'package:hypha_wallet/design/dividers/hypha_divider.dart'; import 'package:hypha_wallet/design/hypha_colors.dart'; import 'package:hypha_wallet/design/themes/extensions/theme_extension_provider.dart'; import 'package:hypha_wallet/ui/proposals/components/proposal_button.dart'; +import 'package:hypha_wallet/ui/proposals/components/proposal_creator.dart'; import 'package:hypha_wallet/ui/proposals/components/proposal_expiration_timer.dart'; import 'package:hypha_wallet/ui/proposals/components/proposal_header.dart'; import 'package:hypha_wallet/ui/proposals/components/proposal_percentage_indicator.dart'; @@ -120,8 +121,7 @@ class _ProposalDetailsViewState extends State { style: context.hyphaTextTheme.mediumTitles, ), ), - // TODO(Saif): display creator image - //ProposalCreator(_proposalDetailsModel.creator), + ProposalCreator(_proposalDetailsModel.creator), ...List.generate( 2, (index) => Padding( diff --git a/lib/ui/proposals/filter/components/hypha_filter_card.dart b/lib/ui/proposals/filter/components/hypha_filter_card.dart index 372373ef..49bcfcad 100644 --- a/lib/ui/proposals/filter/components/hypha_filter_card.dart +++ b/lib/ui/proposals/filter/components/hypha_filter_card.dart @@ -12,22 +12,22 @@ class HyphaFilterCard extends StatelessWidget { final dynamic valueNotifier; final int index; - const HyphaFilterCard(this.valueNotifier, this.index, {this.dao, this.title, this.subTitle, super.key}); + const HyphaFilterCard(this.valueNotifier, this.index, + {this.dao, this.title, this.subTitle, super.key}); @override Widget build(BuildContext context) { - // TODO(Saif): fix the card height (filter by status) return GestureDetector( onTap: () { valueNotifier.value = valueNotifier.value == index ? null : index; }, child: HyphaCard( - child: Padding( + child: Container( + height: dao != null ? null : 54, padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 20), child: Row( children: [ - if (dao != null) - DaoImage(dao), + if (dao != null) DaoImage(dao), const SizedBox( width: 10, ), @@ -41,7 +41,8 @@ class HyphaFilterCard extends StatelessWidget { if (subTitle != null) Text( subTitle!, - style: context.hyphaTextTheme.ralMediumBody.copyWith(color: HyphaColors.midGrey), + style: context.hyphaTextTheme.ralMediumBody + .copyWith(color: HyphaColors.midGrey), ), ], ), @@ -49,11 +50,16 @@ class HyphaFilterCard extends StatelessWidget { ValueListenableBuilder( valueListenable: valueNotifier, builder: (context, selectedIndex, child) { - return Visibility( - visible: selectedIndex == index, - child: const CircleAvatar( - radius: 12, - backgroundColor: HyphaColors.primaryBlu, + return CircleAvatar( + radius: 12, + backgroundColor: selectedIndex == index + ? HyphaColors.primaryBlu + : HyphaColors.midGrey.withOpacity(.3), + child: CircleAvatar( + radius: selectedIndex == index ? 4 : 10.5, + backgroundColor: selectedIndex == index + ? HyphaColors.white + : HyphaColors.lightBlack, ), ); },