Skip to content

Commit

Permalink
Merge branch 'main' into feat/add-proposals-history-section
Browse files Browse the repository at this point in the history
# Conflicts:
#	lib/core/network/repository/proposal_repository.dart
  • Loading branch information
nbetsaif committed Oct 3, 2024
2 parents 1f119c6 + a6c036f commit d5de864
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 18 deletions.
2 changes: 1 addition & 1 deletion lib/core/di/repositories_module.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,5 @@ void _registerRepositoriesModule() {

_registerLazySingleton(() => TransactionHistoryRepository(service: _getIt<TransactionHistoryService>()));

_registerLazySingleton(() => ProposalRepository(_getIt<ProposalService>(),_getIt<ProfileService>()));
_registerLazySingleton(() => ProposalRepository(_getIt<DaoService>(),_getIt<ProposalService>(),_getIt<ProfileService>()));
}
4 changes: 3 additions & 1 deletion lib/core/network/api/services/proposal_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,11 @@ class ProposalService {
Future<Result<Map<String, dynamic>, 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);
}




}
17 changes: 14 additions & 3 deletions lib/core/network/repository/proposal_repository.dart
Original file line number Diff line number Diff line change
@@ -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';
Expand All @@ -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<Result<List<ProposalModel>, HyphaError>> getProposals(
UserProfileData user, GetProposalsUseCaseInput input) async {
Expand Down Expand Up @@ -143,7 +150,7 @@ class ProposalRepository {
return Future.wait(proposalFutures);
}

void sortProposals(List<ProposalModel> proposals) {
void sortProposals(List<ProposalModel> proposals,) {
proposals.sort((a, b) {
final int daoNameComparison = (a.dao?.settingsDaoTitle ?? '')
.compareTo(b.dao?.settingsDaoTitle ?? '');
Expand Down Expand Up @@ -177,7 +184,9 @@ class ProposalRepository {

try {
final Map<String, dynamic> response = result.valueOrCrash;
final ProposalDetailsModel proposalDetails =
final Result<DaoData?, HyphaError> dao= await _daoService.getDaoById(network: Network.telos, daoId:response['data']['getDocument']['dao'][0]['docId'] );
final Result<ProfileData, HyphaError> 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++) {
Expand All @@ -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',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -120,8 +121,7 @@ class _ProposalDetailsViewState extends State<ProposalDetailsView> {
style: context.hyphaTextTheme.mediumTitles,
),
),
// TODO(Saif): display creator image
//ProposalCreator(_proposalDetailsModel.creator),
ProposalCreator(_proposalDetailsModel.creator),
...List.generate(
2,
(index) => Padding(
Expand Down
28 changes: 17 additions & 11 deletions lib/ui/proposals/filter/components/hypha_filter_card.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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,
),
Expand All @@ -41,19 +41,25 @@ 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),
),
],
),
const Spacer(),
ValueListenableBuilder<dynamic>(
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,
),
);
},
Expand Down

0 comments on commit d5de864

Please sign in to comment.