Skip to content

Commit b3dcfba

Browse files
committed
Merge branch 'master' into cl/merge-v1.13.0-into-f-droid
2 parents cce88b1 + 9a4ae4a commit b3dcfba

14 files changed

+164
-59
lines changed

.github/workflows/ios_integration_test.yml

+4-4
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,16 @@ jobs:
2929
- device: "iPhone 14 Pro Max"
3030
record_video: true
3131
# With this flag we can run the CI against different node versions to check compatibility.
32-
docker_tag: "1.5.1"
32+
docker_tag: "1.5.4"
3333
- device: "iPhone 8 Plus"
3434
record_video: false
35-
docker_tag: "1.5.1"
35+
docker_tag: "1.5.4"
3636
- device: "iPad Pro (12.9-inch) (6th generation)"
3737
record_video: false
38-
docker_tag: "1.5.1"
38+
docker_tag: "1.5.4"
3939
- device: "iPad Pro (12.9-inch) (2nd generation)"
4040
record_video: false
41-
docker_tag: "1.5.1"
41+
docker_tag: "1.5.4"
4242
fail-fast: false
4343
steps:
4444
# Setup Environment

app/lib/l10n/arb/app_de.arb

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"appSettings": "App-Einstellungen",
2727
"attestNotificationBody": "Wenn alle Teilnehmer die Attestierungen geschickt haben, kannst du versuchen das Einkommen zu erhalten.",
2828
"attestNotificationTitle": "Teilnehmer attestiert",
29+
"available": "Verfügbar",
2930
"balance": "Kontostand",
3031
"balanceTooLowBody": "Du hast nicht genug Geld auf dem Konto. Du kannst nicht dein ganzes Geld schicken, weil du noch ein wenig für die Gebühren brauchst.",
3132
"balanceTooLowTitle": "Kontostand zu tief",
@@ -48,6 +49,7 @@
4849
"changeYourPin": "PIN ändern",
4950
"checkEmailApp": "Keine Email-App installiert",
5051
"chosenRightCommunity": "Die Daten sind für eine andere Community. Bitte wechsle die Community um Geld zu senden.",
52+
"claim": "Einfordern",
5153
"claimRewardsNotificationBody": "Du hast dein Gemeinschaftseinkommen bereits erhalten.",
5254
"claimRewardsNotificationTitle": "Gemeinschaftseinkommen angefordert",
5355
"claimsScannedAlready": "bereits gescannter Antrag wurde aktualisiert",

app/lib/l10n/arb/app_en.arb

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"appSettings": "App settings",
2727
"attestNotificationBody": "If all participants have sent the attestations, you can try to claim the income.",
2828
"attestNotificationTitle": "Attested attendees",
29+
"available": "Available",
2930
"balance": "Balance",
3031
"balanceTooLowBody": "You don't have sufficient funds in your account. You can't send all your money because you need some for the fees.",
3132
"balanceTooLowTitle": "Balance too low",
@@ -48,6 +49,7 @@
4849
"changeYourPin": "Change PIN",
4950
"checkEmailApp": "Check that you have downloaded the Email app",
5051
"chosenRightCommunity": "The data is for a different community. Please change the community to send funds.",
52+
"claim": "Claim",
5153
"claimRewardsNotificationBody": "You have already received your community income!",
5254
"claimRewardsNotificationTitle": "Claimed the community income",
5355
"claimsScannedAlready": "Updated previously scanned claim",

app/lib/l10n/arb/app_fr.arb

+3-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"appSettings": "Paramètres de l'app",
2727
"attestNotificationBody": "Une fois que tous les participants ont envoyé les attestations, tu peux essayer d'obtenir le revenu.",
2828
"attestNotificationTitle": "Participants attestés",
29+
"available": "Disponible",
2930
"balance": "Solde du compte",
3031
"balanceTooLowBody": "Tu n'as pas assez d'argent sur ton compte. Tu ne peux pas envoyer tout ton argent, car il t'en faut encore un peu pour payer les frais.",
3132
"balanceTooLowTitle": "Solde trop bas",
@@ -48,12 +49,13 @@
4849
"changeYourPin": "Changer le NIP",
4950
"checkEmailApp": "Aucune application de Email installée",
5051
"chosenRightCommunity": "Les données sont destinées à une autre communauté. S'il te plaît, change la communauté pour envoyer le paiement.",
52+
"claim": "Réclamer",
5153
"claimRewardsNotificationBody": "Tu as déjà reçu ton revenu communautaire.",
5254
"claimRewardsNotificationTitle": "Revenu communautaire demandé",
5355
"claimsScannedAlready": "La demande déjà scannée a été mise à jour",
5456
"claimsScannedDecodeFailed": "La demande scannée n'a pas pu être décodée. Ton vis-à-vis doit mettre à jour l'application.",
5557
"claimsScannedNew": "Nouvelle demande scannée",
56-
"claimsSubmit": "Déposer une demande",
58+
"claimsSubmit": "Déposer les demandes",
5759
"closeGathering": "Fermer la rencontre.",
5860
"communities": "Communautés",
5961
"communityChoose": "Choisis une communauté",

app/lib/l10n/arb/app_ru.arb

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"appSettings": "Настройки приложения",
2727
"attestNotificationBody": "Если все участники отправили свои подтверждения, можно попробовать получить доход.",
2828
"attestNotificationTitle": "Фаза Аттестации успешно завершена",
29+
"available": "Доступно",
2930
"balance": "Баланс",
3031
"balanceTooLowBody": "У вас недостаточно средств на счету. Вы не можете отправить все свои деньги, так как часть нужна для оплаты комиссии.",
3132
"balanceTooLowTitle": "Недостаточно средств на счете",
@@ -48,6 +49,7 @@
4849
"changeYourPin": "Изменить PIN-код",
4950
"checkEmailApp": "Убедитесь, что вы загрузили приложение электронной почты",
5051
"chosenRightCommunity": "Данные относятся к другому сообществу. Пожалуйста, измените сообщество, чтобы отправить средства.",
52+
"claim": "Заявление",
5153
"claimRewardsNotificationBody": "Ваш запрос на вознаграждение получен и будет обработан в кратчайшие сроки. Вы получили свой доход сообщества!",
5254
"claimRewardsNotificationTitle": "Доход сообщества запрошен",
5355
"claimsScannedAlready": "Ранее отсканированные заявления обновлены",

app/lib/page/profile/account/account_manage_page.dart

+47-27
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ import 'package:encointer_wallet/common/components/logo/community_icon.dart';
1010
import 'package:encointer_wallet/theme/theme.dart';
1111
import 'package:encointer_wallet/config.dart';
1212
import 'package:encointer_wallet/utils/repository_provider.dart';
13+
import 'package:encointer_wallet/page/profile/account/benefits.dart';
1314
import 'package:encointer_wallet/page/profile/account/export_result_page.dart';
1415
import 'package:encointer_wallet/page/profile/contacts/account_share_page.dart';
15-
import 'package:encointer_wallet/page/profile/account/faucet_list_tile.dart';
1616
import 'package:encointer_wallet/service/log/log_service.dart';
1717
import 'package:encointer_wallet/service/substrate_api/api.dart';
1818
import 'package:encointer_wallet/modules/modules.dart';
@@ -52,7 +52,21 @@ class _AccountManagePageState extends State<AccountManagePage> {
5252
}
5353

5454
Future<void> _init() async {
55-
faucets = await webApi.encointer.getAllFaucetsWithAccount();
55+
final allFaucets = await webApi.encointer.getAllFaucetsWithAccount();
56+
57+
// show faucets we have reputation for and faucets for `chosenCid`.
58+
final relevantCids = _appStore.encointer.account!.reputations.values.map((e) => e.communityIdentifier).toSet()
59+
..add(_appStore.encointer.chosenCid!);
60+
61+
faucets = Map.fromEntries(allFaucets.entries.where((e) {
62+
final whitelist = e.value.whitelist;
63+
if (whitelist == null) {
64+
// if the whitelist is null, all communities may access it.
65+
return true;
66+
} else {
67+
return containsAny(whitelist, relevantCids.toList());
68+
}
69+
}));
5670
setState(() {});
5771
}
5872

@@ -140,7 +154,6 @@ class _AccountManagePageState extends State<AccountManagePage> {
140154
final h3Grey = context.titleLarge.copyWith(fontSize: 19, color: AppColors.encointerGrey);
141155
final isKeyboard = MediaQuery.of(context).viewInsets.bottom != 0;
142156
final store = context.watch<AppStore>();
143-
final appSettingsStore = context.watch<AppSettings>();
144157
final appConfig = RepositoryProvider.of<AppConfig>(context);
145158

146159
final accountToBeEditedPubKey = ModalRoute.of(context)!.settings.arguments as String?;
@@ -152,28 +165,26 @@ class _AccountManagePageState extends State<AccountManagePage> {
152165
_nameCtrl!.selection = TextSelection.fromPosition(TextPosition(offset: _nameCtrl!.text.length));
153166

154167
// Not an ideal practice, but we only release a dev-version of the faucet, and cleanup can be later.
155-
List<Widget> benefits() {
156-
return [
157-
Text(l10n.benefits, style: h3Grey, textAlign: TextAlign.left),
158-
if (faucets != null)
159-
store.account.currentAccountPubKey! == accountToBeEditedPubKey
160-
? ListView.builder(
161-
shrinkWrap: true,
162-
itemCount: faucets!.length,
163-
itemBuilder: (BuildContext context, int index) {
164-
final faucetPubKeyHex = faucets!.keys.elementAt(index);
165-
return FaucetListTile(
166-
store,
167-
userAddress: addressSS58,
168-
faucet: faucets![faucetPubKeyHex]!,
169-
faucetPubKey: faucetPubKeyHex,
170-
);
171-
},
172-
)
173-
: Text(l10n.canUseFaucetOnlyWithCurrentAccount, style: h3Grey, textAlign: TextAlign.left)
174-
else
175-
appConfig.isIntegrationTest ? const SizedBox.shrink() : const CupertinoActivityIndicator(),
176-
];
168+
Widget benefits() {
169+
if (faucets == null) {
170+
return appConfig.isIntegrationTest ? const SizedBox.shrink() : const CupertinoActivityIndicator();
171+
}
172+
173+
if (store.account.currentAccountPubKey! != accountToBeEditedPubKey) {
174+
return Column(children: [
175+
Text(l10n.benefits, style: h3Grey, textAlign: TextAlign.left),
176+
Text(l10n.canUseFaucetOnlyWithCurrentAccount, style: h3Grey, textAlign: TextAlign.left),
177+
]);
178+
}
179+
180+
return Benefits(
181+
store,
182+
faucets: faucets!,
183+
userAddress: Address(
184+
pubkey: AddressUtils.pubKeyHexToPubKey(accountToBeEditedPubKey),
185+
prefix: store.settings.endpoint.ss58!,
186+
),
187+
);
177188
}
178189

179190
return Observer(
@@ -260,8 +271,7 @@ class _AccountManagePageState extends State<AccountManagePage> {
260271
addressSS58,
261272
),
262273
),
263-
// spread the List<Widget> so that it does not create a nested list.
264-
if (appSettingsStore.developerMode) ...benefits(),
274+
benefits(),
265275
const Spacer(),
266276
DecoratedBox(
267277
// width: double.infinity,
@@ -395,3 +405,13 @@ class CommunityIcon extends StatelessWidget {
395405
);
396406
}
397407
}
408+
409+
/// Checks if any entry in list one is contained in another list.
410+
bool containsAny(List<dynamic> list1, List<dynamic> list2) {
411+
for (final entry in list1) {
412+
if (list2.contains(entry)) {
413+
return true;
414+
}
415+
}
416+
return false;
417+
}
+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import 'package:flutter_mobx/flutter_mobx.dart';
2+
import 'package:flutter/cupertino.dart';
3+
import 'package:flutter/material.dart';
4+
5+
import 'package:encointer_wallet/models/faucet/faucet.dart';
6+
import 'package:encointer_wallet/store/app.dart';
7+
import 'package:encointer_wallet/config/consts.dart';
8+
import 'package:encointer_wallet/l10n/l10.dart';
9+
import 'package:encointer_wallet/page/profile/account/faucet_list_tile.dart';
10+
import 'package:encointer_wallet/theme/theme.dart';
11+
import 'package:encointer_wallet/utils/format.dart';
12+
import 'package:ew_keyring/ew_keyring.dart';
13+
14+
class Benefits extends StatelessWidget {
15+
const Benefits(
16+
this.store, {
17+
required this.faucets,
18+
required this.userAddress,
19+
super.key,
20+
});
21+
22+
final AppStore store;
23+
24+
final Address userAddress;
25+
final Map<String, Faucet> faucets;
26+
27+
@override
28+
Widget build(BuildContext context) {
29+
final l10n = context.l10n;
30+
final titleLarge = context.titleLarge.copyWith(fontSize: 19, color: AppColors.encointerGrey);
31+
final titleMedium = context.titleMedium.copyWith(color: AppColors.encointerGrey);
32+
33+
return Column(
34+
children: [
35+
Text('KSM ${l10n.benefits}', style: titleLarge, textAlign: TextAlign.left),
36+
Observer(
37+
builder: (_) => Row(
38+
mainAxisAlignment: MainAxisAlignment.spaceBetween,
39+
children: [
40+
Text(
41+
l10n.balance,
42+
style: titleMedium,
43+
textAlign: TextAlign.left,
44+
),
45+
Text(
46+
'${Fmt.token(store.assets.totalBalance, ertDecimals)} KSM',
47+
style: titleMedium,
48+
textAlign: TextAlign.left,
49+
),
50+
],
51+
),
52+
),
53+
ListView.builder(
54+
shrinkWrap: true,
55+
itemCount: faucets.length,
56+
itemBuilder: (BuildContext context, int index) {
57+
final faucetPubKeyHex = faucets.keys.elementAt(index);
58+
return FaucetListTile(
59+
store,
60+
userAddress: userAddress.encode(),
61+
faucet: faucets[faucetPubKeyHex]!,
62+
faucetPubKey: faucetPubKeyHex,
63+
);
64+
},
65+
)
66+
],
67+
);
68+
}
69+
}

app/lib/page/profile/account/faucet_list_tile.dart

+16-22
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@ import 'package:flutter/cupertino.dart';
22
import 'package:flutter/material.dart';
33

44
import 'package:encointer_wallet/common/components/submit_button.dart';
5-
import 'package:encointer_wallet/config/consts.dart';
65
import 'package:encointer_wallet/models/communities/community_identifier.dart';
76
import 'package:encointer_wallet/models/faucet/faucet.dart';
87
import 'package:encointer_wallet/service/tx/lib/src/submit_tx_wrappers.dart';
98
import 'package:encointer_wallet/theme/theme.dart';
9+
import 'package:encointer_wallet/l10n/l10.dart';
10+
import 'package:encointer_wallet/config/consts.dart';
11+
import 'package:encointer_wallet/utils/format.dart';
1012
import 'package:encointer_wallet/gen/assets.gen.dart';
1113
import 'package:encointer_wallet/service/substrate_api/api.dart';
1214
import 'package:encointer_wallet/store/app.dart';
13-
import 'package:encointer_wallet/utils/format.dart';
1415

1516
class FaucetListTile extends StatefulWidget {
1617
const FaucetListTile(
@@ -33,17 +34,19 @@ class FaucetListTile extends StatefulWidget {
3334

3435
class _FaucetListTileState extends State<FaucetListTile> {
3536
late Future<Map<int, CommunityIdentifier>> future;
36-
late Future<BigInt> nativeBalance;
37+
38+
int? remainingClaims;
3739

3840
@override
3941
void initState() {
4042
super.initState();
4143
future = _getUncommittedReputationIds(widget.userAddress);
42-
nativeBalance = getNativeFreeBalance(widget.userAddress);
4344
}
4445

4546
@override
4647
Widget build(BuildContext context) {
48+
final l10n = context.l10n;
49+
4750
return ListTile(
4851
contentPadding: const EdgeInsets.symmetric(),
4952
leading: SizedBox(
@@ -60,16 +63,9 @@ class _FaucetListTileState extends State<FaucetListTile> {
6063
),
6164
subtitle: Row(
6265
children: [
63-
const Text('KSM: '),
64-
FutureBuilder(
65-
future: nativeBalance,
66-
builder: (BuildContext context, AsyncSnapshot<BigInt> snapshot) {
67-
if (snapshot.hasData) {
68-
return Text(Fmt.token(snapshot.data!, ertDecimals));
69-
} else {
70-
return const CupertinoActivityIndicator();
71-
}
72-
})
66+
Text('${l10n.available}: '),
67+
if (remainingClaims != null) Text('$remainingClaims') else const CupertinoActivityIndicator(),
68+
Text(' x ${Fmt.token(BigInt.from(widget.faucet.dripAmount), ertDecimals - 3)} mKSM')
7369
],
7470
),
7571
trailing: FutureBuilder(
@@ -85,13 +81,12 @@ class _FaucetListTileState extends State<FaucetListTile> {
8581
widget.faucetPubKey,
8682
);
8783
future = _getUncommittedReputationIds(widget.userAddress);
88-
nativeBalance = getNativeFreeBalance(widget.userAddress);
8984
setState(() {});
9085
},
91-
child: const Text('Claim'),
86+
child: Text(l10n.claim),
9287
);
9388
} else {
94-
return const SubmitButtonSmall(child: Text('No Claim'));
89+
return SubmitButtonSmall(child: Text(l10n.claim));
9590
}
9691
} else {
9792
return const CupertinoActivityIndicator();
@@ -126,6 +121,10 @@ class _FaucetListTileState extends State<FaucetListTile> {
126121
);
127122

128123
await Future.wait(futures);
124+
125+
remainingClaims = ids.length;
126+
// update the text widgets with the remaining claims.
127+
setState(() {});
129128
return ids;
130129
}
131130

@@ -147,9 +146,4 @@ class _FaucetListTileState extends State<FaucetListTile> {
147146
txPaymentAsset: store.encointer.getTxPaymentAsset(store.encointer.chosenCid),
148147
);
149148
}
150-
151-
Future<BigInt> getNativeFreeBalance(String address) async {
152-
final balance = await webApi.assets.getBalanceOf(address);
153-
return balance.free;
154-
}
155149
}

app/lib/service/substrate_api/api.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,10 @@ class Api {
8686

8787
Log.d('Obtained basic network data: ${store.settings.endpoint.value!}', 'Api');
8888

89-
encointer.getCommunityData();
90-
9189
// need to do this from here as we can't access instance fields in constructor.
9290
account.setFetchAccountData(fetchAccountData);
91+
92+
fetchAccountData();
9393
}
9494

9595
Future<void> close() async {

0 commit comments

Comments
 (0)