Skip to content

Commit

Permalink
- Fix transaction details
Browse files Browse the repository at this point in the history
- Fix Nodes
- Add processing sync status
  • Loading branch information
OmarHatem28 committed Feb 6, 2025
1 parent c9aa1c5 commit 28752a6
Show file tree
Hide file tree
Showing 41 changed files with 69 additions and 18 deletions.
2 changes: 1 addition & 1 deletion assets/decred_node_list.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
-
uri:
uri: default-spv-nodes
is_default: true
-
uri: dcrd.sethforprivacy.com:9108
Expand Down
3 changes: 1 addition & 2 deletions cw_core/lib/node.dart
Original file line number Diff line number Diff line change
Expand Up @@ -360,8 +360,7 @@ class Node extends HiveObject with Keyable {
}

Future<bool> requestDecredNode() async {
final decredMainnetPort = 9108;
if (uri.host == "" && uri.port == decredMainnetPort) {
if (uri.host == "default-spv-nodes") {
// Just show default port as ok. The wallet will connect to a list of known
// nodes automatically.
return true;
Expand Down
10 changes: 10 additions & 0 deletions cw_core/lib/sync_status.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,16 @@ class SyncingSyncStatus extends SyncStatus {
}
}

class ProcessingSyncStatus extends SyncStatus {
final String? message;

ProcessingSyncStatus({this.message});

@override
double progress() => 0.99;

}

class SyncedSyncStatus extends SyncStatus {
@override
double progress() => 1.0;
Expand Down
12 changes: 6 additions & 6 deletions cw_decred/lib/wallet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ abstract class DecredWalletBase
bool synced = false;
bool watchingOnly;
bool connecting = false;
String persistantPeer = "";
String persistantPeer = "default-spv-nodes";
FeeCache feeRateFast = FeeCache(defaultFeeRate);
FeeCache feeRateMedium = FeeCache(defaultFeeRate);
FeeCache feeRateSlow = FeeCache(defaultFeeRate);
Expand Down Expand Up @@ -207,15 +207,15 @@ abstract class DecredWalletBase
if (syncStatusCode == 2) {
final headersProg = headersHeight / targetHeight;
// Only allow headers progress to go up half way.
syncStatus = SyncingSyncStatus(targetHeight - headersHeight, headersProg / 2);
syncStatus = SyncingSyncStatus(targetHeight - headersHeight, headersProg);
return false;
}

// TODO: This step takes a while so should really get more info to the UI
// that we are discovering addresses.
if (syncStatusCode == 3) {
// Hover at half.
syncStatus = SyncingSyncStatus(0, .5);
syncStatus = ProcessingSyncStatus();
return false;
}

Expand All @@ -235,8 +235,8 @@ abstract class DecredWalletBase
return;
}
connecting = true;
String addr = "";
if (node.uri.host != "") {
String addr = "default-spv-nodes";
if (node.uri.host != addr) {
addr = node.uri.host;
if (node.uri.port != "") {
addr += ":" + node.uri.port.toString();
Expand Down Expand Up @@ -279,7 +279,7 @@ abstract class DecredWalletBase
syncStatus = ConnectingSyncStatus();
libdcrwallet.startSyncAsync(
name: walletInfo.name,
peers: persistantPeer,
peers: persistantPeer == "default-spv-nodes" ? "" : persistantPeer,
);
syncTimer = Timer.periodic(
Duration(seconds: syncIntervalSyncing), (Timer t) => performBackgroundTasks());
Expand Down
4 changes: 2 additions & 2 deletions cw_decred/lib/wallet_addresses.dart
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,8 @@ abstract class DecredWalletAddressesBase extends WalletAddresses with Store {
}
final res = libdcrwallet.addresses(walletInfo.name, nUsed, nUnused);
final decoded = json.decode(res);
final usedAddrs = List<String>.from(decoded["used"]);
final unusedAddrs = List<String>.from(decoded["unused"]);
final usedAddrs = List<String>.from(decoded["used"] ?? []);
final unusedAddrs = List<String>.from(decoded["unused"] ?? []);
// index is the index of the first unused address.
final index = decoded["index"] ?? 0;
return new LibAddresses(usedAddrs, unusedAddrs, index);
Expand Down
4 changes: 4 additions & 0 deletions lib/core/sync_status_title.dart
Original file line number Diff line number Diff line change
Expand Up @@ -63,5 +63,9 @@ String syncStatusTitle(SyncStatus syncStatus) {
return S.current.sync_status_attempting_scan;
}

if (syncStatus is ProcessingSyncStatus) {
return syncStatus.message ?? S.current.processing;
}

return '';
}
5 changes: 3 additions & 2 deletions lib/entities/default_settings_migration.dart
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ const newCakeWalletBitcoinUri = 'btc-electrum.cakewallet.com:50002';
const wowneroDefaultNodeUri = 'node3.monerodevs.org:34568';
const zanoDefaultNodeUri = 'zano.cakewallet.com:11211';
const moneroWorldNodeUri = '.moneroworld.com';
const decredDefaultUri = ":9108";
const decredDefaultUri = "default-spv-nodes";

Future<void> defaultSettingsMigration(
{required int version,
Expand Down Expand Up @@ -511,8 +511,9 @@ Future<void> defaultSettingsMigration(

await sharedPreferences.setInt(
PreferencesKey.currentDefaultSettingsMigrationVersion, version);
} catch (e) {
} catch (e, s) {
printV('Migration error: ${e.toString()}');
printV('Migration error: ${s}');
}
});

Expand Down
3 changes: 3 additions & 0 deletions lib/reactions/check_connection.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ void startCheckConnectionReaction(WalletBase wallet, SettingsStore settingsStore
if (wallet.type == WalletType.bitcoin && wallet.syncStatus is SyncingSyncStatus) {
return;
}
if (wallet.type == WalletType.decred && wallet.syncStatus is ProcessingSyncStatus) {
return;
}

try {
final connectivityResult = await (Connectivity().checkConnectivity());
Expand Down
2 changes: 1 addition & 1 deletion lib/reactions/on_wallet_sync_status_change.dart
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ void startWalletSyncStatusChangeReaction(
await updateHavenRate(fiatConversionStore);
}
}
if (status is SyncingSyncStatus) {
if (status is SyncingSyncStatus || status is ProcessingSyncStatus) {
await WakelockPlus.enable();
}
if (status is SyncedSyncStatus || status is FailedSyncStatus) {
Expand Down
4 changes: 2 additions & 2 deletions lib/src/screens/dashboard/widgets/sync_indicator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ class SyncIndicator extends StatelessWidget {
builder: (_) {
final syncIndicatorWidth = 237.0;
final status = dashboardViewModel.status;
final statusText = status != null ? syncStatusTitle(status) : '';
final progress = status != null ? status.progress() : 0.0;
final statusText = syncStatusTitle(status);
final progress = status.progress();
final indicatorOffset = progress * syncIndicatorWidth;
final indicatorWidth = progress < 1
? indicatorOffset > 0 ? indicatorOffset : 0.0
Expand Down
4 changes: 4 additions & 0 deletions lib/view_model/dashboard/dashboard_view_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,10 @@ abstract class DashboardViewModelBase with Store {
statusText = S.current.please_try_to_connect_to_another_node;
}

if (status is ProcessingSyncStatus) {
statusText = (status as ProcessingSyncStatus).message ?? S.current.processing;
}

return statusText;
}

Expand Down
5 changes: 3 additions & 2 deletions lib/view_model/transaction_details_view_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ abstract class TransactionDetailsViewModelBase with Store {
final dateFormat = DateFormatter.withCurrentLocal();
final tx = transactionInfo;

// TODO: can be cleaned further
switch (wallet.type) {
case WalletType.monero:
_addMoneroListItems(tx, dateFormat);
Expand Down Expand Up @@ -711,13 +712,13 @@ abstract class TransactionDetailsViewModelBase with Store {
if (showRecipientAddress && tx.to != null)
StandartListItem(
title: S.current.transaction_details_recipient_address,
value: tron!.getTronBase58Address(tx.to!, wallet),
value: tx.to!,
key: ValueKey('standard_list_item_transaction_details_recipient_address_key'),
),
if (tx.from != null)
StandartListItem(
title: S.current.transaction_details_source_address,
value: tron!.getTronBase58Address(tx.from!, wallet),
value: tx.from!,
key: ValueKey('standard_list_item_transaction_details_source_address_key'),
),
];
Expand Down
1 change: 1 addition & 0 deletions pubspec_base.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ flutter:
- assets/tron_node_list.yml
- assets/wownero_node_list.yml
- assets/zano_node_list.yml
- assets/decred_node_list.yml
- assets/text/
- assets/faq/
- assets/animation/
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_ar.arb
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,7 @@
"proceed_after_one_minute": "إذا لم تستمر الشاشة بعد دقيقة واحدة ، فتحقق من بريدك الإلكتروني.",
"proceed_on_device": "تابع جهازك",
"proceed_on_device_description": "يرجى اتباع الإرشادات المطلوبة على محفظة الأجهزة الخاصة بك",
"processing": "يعالج",
"profile": "حساب تعريفي",
"provider_error": "خطأ ${provider}",
"public_key": "مفتاح عمومي",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_bg.arb
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,7 @@
"proceed_after_one_minute": "Ако процесът продължи повече от 1 минута, проверете своя имейл.",
"proceed_on_device": "Продължете на вашето устройство",
"proceed_on_device_description": "Моля, следвайте инструкциите, подканени на вашия хардуер",
"processing": "Обработка",
"profile": "Профил",
"provider_error": "Грешка на ${provider} ",
"public_key": "Публичен ключ",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_cs.arb
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,7 @@
"proceed_after_one_minute": "Pokud proces nepokročí během 1 minuty, zkontrolujte svůj e-mail.",
"proceed_on_device": "Pokračujte ve svém zařízení",
"proceed_on_device_description": "Postupujte podle pokynů na výzvu na vaší hardwarové peněžence",
"processing": "Zpracování",
"profile": "Profil",
"provider_error": "${provider} chyba",
"public_key": "Veřejný klíč",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_de.arb
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,7 @@
"proceed_after_one_minute": "Wenn der Bildschirm nach 1 Minute nicht weitergeht, überprüfen Sie bitte Ihre E-Mail.",
"proceed_on_device": "Fahren Sie auf Ihrem Gerät fort",
"proceed_on_device_description": "Bitte befolgen Sie die Anweisungen, die auf Ihrer Hardware-Wallet angezeigt werden",
"processing": "Verarbeitung",
"profile": "Profil",
"provider_error": "${provider}-Fehler",
"public_key": "Öffentlicher Schlüssel",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,7 @@
"proceed_after_one_minute": "If the screen doesn’t proceed after 1 minute, check your email.",
"proceed_on_device": "Proceed on your device",
"proceed_on_device_description": "Please follow the instructions prompted on your hardware wallet",
"processing": "Processing",
"profile": "Profile",
"provider_error": "${provider} error",
"public_key": "Public key",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_es.arb
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,7 @@
"proceed_after_one_minute": "Si la pantalla no continúa después de 1 minuto, revisa tu correo electrónico.",
"proceed_on_device": "Continúa con tu dispositivo",
"proceed_on_device_description": "Sigue las instrucciones solicitadas en su billetera de hardware",
"processing": "Tratamiento",
"profile": "Perfil",
"provider_error": "${provider} error",
"public_key": "Clave pública",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_fr.arb
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,7 @@
"proceed_after_one_minute": "Si l'écran ne s'affiche pas après 1 minute, vérifiez vos e-mails.",
"proceed_on_device": "Continuez sur votre appareil",
"proceed_on_device_description": "Veuillez suivre les instructions affichées sur votre portefeuille physique.",
"processing": "Traitement",
"profile": "Profil",
"provider_error": "Erreur de ${provider}",
"public_key": "Clef publique",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_ha.arb
Original file line number Diff line number Diff line change
Expand Up @@ -536,6 +536,7 @@
"proceed_after_one_minute": "Idan allon bai ci gaba ba bayan minti 1, duba imel ɗin ku.",
"proceed_on_device": "Ci gaba akan na'urarka",
"proceed_on_device_description": "Da fatan za a bi umarnin akan walatware",
"processing": "Aiki",
"profile": "Rabin fuska",
"provider_error": "${provider} kuskure",
"public_key": "Maɓallin jama'a",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_hi.arb
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,7 @@
"proceed_after_one_minute": "यदि 1 मिनट के बाद भी स्क्रीन आगे नहीं बढ़ती है, तो अपना ईमेल देखें।",
"proceed_on_device": "अपने डिवाइस पर आगे बढ़ें",
"proceed_on_device_description": "कृपया अपने हार्डवेयर वॉलेट पर दिए गए निर्देशों का पालन करें",
"processing": "प्रसंस्करण",
"profile": "प्रोफ़ाइल",
"provider_error": "${provider} त्रुटि",
"public_key": "सार्वजनिक कुंजी",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_hr.arb
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,7 @@
"proceed_after_one_minute": "Ako se zaslon ne nastavi nakon 1 minute, provjerite svoju e-poštu.",
"proceed_on_device": "Nastavite na svom uređaju",
"proceed_on_device_description": "Slijedite upute zatražene na vašem hardverskom novčaniku",
"processing": "Obrada",
"profile": "Profil",
"provider_error": "${provider} greška",
"public_key": "Javni ključ",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_hy.arb
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,7 @@
"proceed_after_one_minute": "Եթե էկրանը 1 րոպեից ավել չի անցնում, ստուգեք ձեր էլեկտրոնային փոստը",
"proceed_on_device": "Շարունակեք ձեր սարքի վրա",
"proceed_on_device_description": "Խնդրում ենք հետևել ձեր սարքի վրա ցուցադրվող հրահանգներին",
"processing": "Վերամշակում",
"profile": "Պրոֆիլ",
"provider_error": "${provider} սխալ",
"public_key": "Հանրային բանալի",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_id.arb
Original file line number Diff line number Diff line change
Expand Up @@ -536,6 +536,7 @@
"proceed_after_one_minute": "Jika layar tidak bergerak setelah 1 menit, periksa email Anda.",
"proceed_on_device": "Lanjutkan di perangkat Anda",
"proceed_on_device_description": "Harap ikuti instruksi yang diminta di dompet perangkat keras Anda",
"processing": "Pengolahan",
"profile": "Profil",
"provider_error": "${provider} error",
"public_key": "Kunci publik",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_it.arb
Original file line number Diff line number Diff line change
Expand Up @@ -536,6 +536,7 @@
"proceed_after_one_minute": "Se lo schermo non procede dopo 1 minuto, controlla la tua email.",
"proceed_on_device": "Procedi sul tuo dispositivo",
"proceed_on_device_description": "Segui le istruzioni richieste sul portafoglio hardware",
"processing": "Elaborazione",
"profile": "Profilo",
"provider_error": "${provider} errore",
"public_key": "Chiave pubblica",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_ja.arb
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,7 @@
"proceed_after_one_minute": "1分経っても画面が進まない場合は、メールを確認してください。",
"proceed_on_device": "デバイスに進みます",
"proceed_on_device_description": "ハードウェアウォレットにプロンプ​​トされた指示に従ってください",
"processing": "処理",
"profile": "プロフィール",
"provider_error": "${provider} エラー",
"public_key": "公開鍵",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_ko.arb
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,7 @@
"proceed_after_one_minute": "1분 후에도 화면이 진행되지 않으면 이메일을 확인하세요.",
"proceed_on_device": "장치를 진행하십시오",
"proceed_on_device_description": "하드웨어 지갑에 표시된 지침을 따르십시오",
"processing": "처리",
"profile": "프로필",
"provider_error": "${provider} 오류",
"public_key": "공개 키",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_my.arb
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,7 @@
"proceed_after_one_minute": "မျက်နှာပြင်သည် ၁ မိနစ်အကြာတွင် ဆက်လက်မလုပ်ဆောင်ပါက သင့်အီးမေးလ်ကို စစ်ဆေးပါ။",
"proceed_on_device": "သင့်စက်ပေါ်တွင်ဆက်လက်ဆောင်ရွက်ပါ",
"proceed_on_device_description": "သင်၏ hardware ပိုက်ဆံအိတ်ပေါ်ရှိညွှန်ကြားချက်များကိုလိုက်နာပါ",
"processing": "လုပ်ကိုင်ခြင်း",
"profile": "ကိုယ်ရေးအကျဉ်း",
"provider_error": "${provider} အမှား",
"public_key": "အများသူငှာသော့",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_nl.arb
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,7 @@
"proceed_after_one_minute": "Als het scherm na 1 minuut niet verder gaat, controleer dan uw e-mail.",
"proceed_on_device": "Ga verder met uw apparaat",
"proceed_on_device_description": "Volg de instructies die zijn aangevraagd op uw hardware -portemonnee",
"processing": "Verwerking",
"profile": "Profiel",
"provider_error": "${provider} fout",
"public_key": "Publieke sleutel",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_pl.arb
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,7 @@
"proceed_after_one_minute": "Jeśli ekran nie przejdzie dalej po 1 minucie, sprawdź pocztę.",
"proceed_on_device": "Kontynuuj swoje urządzenie",
"proceed_on_device_description": "Postępuj zgodnie z instrukcjami wyświetlonymi w portfelu sprzętowym",
"processing": "Przetwarzanie",
"profile": "Profil",
"provider_error": "${provider} pomyłka",
"public_key": "Klucz publiczny",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_pt.arb
Original file line number Diff line number Diff line change
Expand Up @@ -536,6 +536,7 @@
"proceed_after_one_minute": "Se a tela não prosseguir após 1 minuto, verifique seu e-mail.",
"proceed_on_device": "Prossiga no seu dispositivo",
"proceed_on_device_description": "Siga as instruções solicitadas em sua carteira de hardware",
"processing": "Processamento",
"profile": "Perfil",
"provider_error": "${provider} erro",
"public_key": "Chave pública",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_ru.arb
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,7 @@
"proceed_after_one_minute": "Если через 1 минуту экран не отображается, проверьте свою электронную почту.",
"proceed_on_device": "Пройдите на свое устройство",
"proceed_on_device_description": "Пожалуйста, следуйте инструкциям, представленным на вашем аппаратном кошельке",
"processing": "Обработка",
"profile": "Профиль",
"provider_error": "${provider} ошибка",
"public_key": "Публичный ключ",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_th.arb
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,7 @@
"proceed_after_one_minute": "หากหน้าจอไม่ดำเนินการหลังจาก 1 นาทีโปรดตรวจสอบอีเมลของคุณ",
"proceed_on_device": "ดำเนินการบนอุปกรณ์ของคุณ",
"proceed_on_device_description": "โปรดทำตามคำแนะนำที่ได้รับแจ้งไว้ในกระเป๋าเงินฮาร์ดแวร์ของคุณ",
"processing": "กำลังประมวลผล",
"profile": "ประวัติโดยย่อ",
"provider_error": "ข้อผิดพลาด ${provider}",
"public_key": "คีย์สาธารณะ",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_tl.arb
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,7 @@
"proceed_after_one_minute": "Kung ang screen ay hindi magpapatuloy pagkatapos ng 1 minuto, suriin ang iyong email.",
"proceed_on_device": "Magpatuloy sa iyong hardware wallet",
"proceed_on_device_description": "Mangyaring sundin ang mga tagubilin na sinenyasan sa iyong hardware wallet",
"processing": "Pagproseso",
"profile": "Profile",
"provider_error": "${provider} error",
"public_key": "Public key",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_tr.arb
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,7 @@
"proceed_after_one_minute": "Ekran 1 dakika sonra ilerlemezse, e-postanızı kontrol edin.",
"proceed_on_device": "Cihazınıza devam edin",
"proceed_on_device_description": "Lütfen donanım cüzdanınızda istenen talimatları izleyin",
"processing": "İşleme",
"profile": "Profil",
"provider_error": "${provider} hatası",
"public_key": "Genel Anahtar",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_uk.arb
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,7 @@
"proceed_after_one_minute": "Якщо екран не продовжується через 1 хвилину, перевірте свою електронну пошту.",
"proceed_on_device": "Продовжуйте свій пристрій",
"proceed_on_device_description": "Будь ласка, дотримуйтесь інструкцій, підказаних на вашому апаратному гаманці",
"processing": "Обробка",
"profile": "Профіль",
"provider_error": "${provider} помилка",
"public_key": "Публічний ключ",
Expand Down
1 change: 1 addition & 0 deletions res/values/strings_ur.arb
Original file line number Diff line number Diff line change
Expand Up @@ -536,6 +536,7 @@
"proceed_after_one_minute": "اگر اسکرین 1 منٹ کے بعد آگے نہیں بڑھتی ہے تو اپنا ای میل چیک کریں۔",
"proceed_on_device": "اپنے آلے پر آگے بڑھیں",
"proceed_on_device_description": "براہ کرم اپنے ہارڈ ویئر پرس پر آنے والی ہدایات پر عمل کریں",
"processing": "پروسیسنگ",
"profile": "پروفائل",
"provider_error": "${provider} خرابی۔",
"public_key": "عوامی کلید",
Expand Down
Loading

0 comments on commit 28752a6

Please sign in to comment.