mirror of
https://github.com/twonlyapp/twonly-app.git
synced 2026-01-15 19:58:41 +00:00
delete user account
This commit is contained in:
parent
a9f94e46a3
commit
86d87b84ac
16 changed files with 357 additions and 72 deletions
|
|
@ -128,6 +128,9 @@
|
||||||
"settingsHelpTerms": "Nutzungsbedingungen",
|
"settingsHelpTerms": "Nutzungsbedingungen",
|
||||||
"settingsAppearanceTheme": "Theme",
|
"settingsAppearanceTheme": "Theme",
|
||||||
"settingsAccountDeleteAccount": "Konto löschen",
|
"settingsAccountDeleteAccount": "Konto löschen",
|
||||||
|
"settingsAccountDeleteAccountWithBallance": "Im nächsten Schritt kannst du auswählen, was du mit dem Restguthaben ({credit}) machen willst.",
|
||||||
|
"settingsAccountDeleteAccountNoInternet": "Zum Löschen deines Accounts ist eine Internetverbindung erforderlich.",
|
||||||
|
"settingsAccountDeleteAccountNoBallance": "Wenn du dein Konto gelöscht hast, gibt es keinen Weg zurück.",
|
||||||
"settingsAccountDeleteModalTitle": "Bist du sicher?",
|
"settingsAccountDeleteModalTitle": "Bist du sicher?",
|
||||||
"settingsAccountDeleteModalBody": "Dein Konto wird gelöscht. Es gibt keine Möglichkeit, es wiederherzustellen.",
|
"settingsAccountDeleteModalBody": "Dein Konto wird gelöscht. Es gibt keine Möglichkeit, es wiederherzustellen.",
|
||||||
"contactVerifyNumberTitle": "Sicherheitsnummer verifizieren",
|
"contactVerifyNumberTitle": "Sicherheitsnummer verifizieren",
|
||||||
|
|
|
||||||
|
|
@ -224,6 +224,9 @@
|
||||||
"settingsAppearanceTheme": "Theme",
|
"settingsAppearanceTheme": "Theme",
|
||||||
"@settingsAppearanceTheme": {},
|
"@settingsAppearanceTheme": {},
|
||||||
"settingsAccountDeleteAccount": "Delete account",
|
"settingsAccountDeleteAccount": "Delete account",
|
||||||
|
"settingsAccountDeleteAccountWithBallance": "In the next step, you can select what you want to to with the remaining credit ({credit}).",
|
||||||
|
"settingsAccountDeleteAccountNoBallance": "Once you delete your account, there is no going back.",
|
||||||
|
"settingsAccountDeleteAccountNoInternet": "An Internet connection is required to delete your account.",
|
||||||
"@settingsAccountDeleteAccount": {},
|
"@settingsAccountDeleteAccount": {},
|
||||||
"settingsAccountDeleteModalTitle": "Are you sure?",
|
"settingsAccountDeleteModalTitle": "Are you sure?",
|
||||||
"@settingsAccountDeleteModalTitle": {},
|
"@settingsAccountDeleteModalTitle": {},
|
||||||
|
|
|
||||||
|
|
@ -770,6 +770,24 @@ abstract class AppLocalizations {
|
||||||
/// **'Delete account'**
|
/// **'Delete account'**
|
||||||
String get settingsAccountDeleteAccount;
|
String get settingsAccountDeleteAccount;
|
||||||
|
|
||||||
|
/// No description provided for @settingsAccountDeleteAccountWithBallance.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'In the next step, you can select what you want to to with the remaining credit ({credit}).'**
|
||||||
|
String settingsAccountDeleteAccountWithBallance(Object credit);
|
||||||
|
|
||||||
|
/// No description provided for @settingsAccountDeleteAccountNoBallance.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Once you delete your account, there is no going back.'**
|
||||||
|
String get settingsAccountDeleteAccountNoBallance;
|
||||||
|
|
||||||
|
/// No description provided for @settingsAccountDeleteAccountNoInternet.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'An Internet connection is required to delete your account.'**
|
||||||
|
String get settingsAccountDeleteAccountNoInternet;
|
||||||
|
|
||||||
/// No description provided for @settingsAccountDeleteModalTitle.
|
/// No description provided for @settingsAccountDeleteModalTitle.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
|
|
|
||||||
|
|
@ -375,6 +375,19 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
@override
|
@override
|
||||||
String get settingsAccountDeleteAccount => 'Konto löschen';
|
String get settingsAccountDeleteAccount => 'Konto löschen';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String settingsAccountDeleteAccountWithBallance(Object credit) {
|
||||||
|
return 'Im nächsten Schritt kannst du auswählen, was du mit dem Restguthaben ($credit) machen willst.';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get settingsAccountDeleteAccountNoBallance =>
|
||||||
|
'Wenn du dein Konto gelöscht hast, gibt es keinen Weg zurück.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get settingsAccountDeleteAccountNoInternet =>
|
||||||
|
'Zum Löschen deines Accounts ist eine Internetverbindung erforderlich.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settingsAccountDeleteModalTitle => 'Bist du sicher?';
|
String get settingsAccountDeleteModalTitle => 'Bist du sicher?';
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -370,6 +370,19 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
@override
|
@override
|
||||||
String get settingsAccountDeleteAccount => 'Delete account';
|
String get settingsAccountDeleteAccount => 'Delete account';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String settingsAccountDeleteAccountWithBallance(Object credit) {
|
||||||
|
return 'In the next step, you can select what you want to to with the remaining credit ($credit).';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get settingsAccountDeleteAccountNoBallance =>
|
||||||
|
'Once you delete your account, there is no going back.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get settingsAccountDeleteAccountNoInternet =>
|
||||||
|
'An Internet connection is required to delete your account.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settingsAccountDeleteModalTitle => 'Are you sure?';
|
String get settingsAccountDeleteModalTitle => 'Are you sure?';
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1851,6 +1851,38 @@ class ApplicationData_DownloadDone extends $pb.GeneratedMessage {
|
||||||
void clearDownloadToken() => clearField(1);
|
void clearDownloadToken() => clearField(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ApplicationData_DeleteAccount extends $pb.GeneratedMessage {
|
||||||
|
factory ApplicationData_DeleteAccount() => create();
|
||||||
|
ApplicationData_DeleteAccount._() : super();
|
||||||
|
factory ApplicationData_DeleteAccount.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
|
||||||
|
factory ApplicationData_DeleteAccount.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
|
||||||
|
|
||||||
|
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ApplicationData.DeleteAccount', package: const $pb.PackageName(_omitMessageNames ? '' : 'client_to_server'), createEmptyInstance: create)
|
||||||
|
..hasRequiredFields = false
|
||||||
|
;
|
||||||
|
|
||||||
|
@$core.Deprecated(
|
||||||
|
'Using this can add significant overhead to your binary. '
|
||||||
|
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
|
||||||
|
'Will be removed in next major version')
|
||||||
|
ApplicationData_DeleteAccount clone() => ApplicationData_DeleteAccount()..mergeFromMessage(this);
|
||||||
|
@$core.Deprecated(
|
||||||
|
'Using this can add significant overhead to your binary. '
|
||||||
|
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
|
||||||
|
'Will be removed in next major version')
|
||||||
|
ApplicationData_DeleteAccount copyWith(void Function(ApplicationData_DeleteAccount) updates) => super.copyWith((message) => updates(message as ApplicationData_DeleteAccount)) as ApplicationData_DeleteAccount;
|
||||||
|
|
||||||
|
$pb.BuilderInfo get info_ => _i;
|
||||||
|
|
||||||
|
@$core.pragma('dart2js:noInline')
|
||||||
|
static ApplicationData_DeleteAccount create() => ApplicationData_DeleteAccount._();
|
||||||
|
ApplicationData_DeleteAccount createEmptyInstance() => create();
|
||||||
|
static $pb.PbList<ApplicationData_DeleteAccount> createRepeated() => $pb.PbList<ApplicationData_DeleteAccount>();
|
||||||
|
@$core.pragma('dart2js:noInline')
|
||||||
|
static ApplicationData_DeleteAccount getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ApplicationData_DeleteAccount>(create);
|
||||||
|
static ApplicationData_DeleteAccount? _defaultInstance;
|
||||||
|
}
|
||||||
|
|
||||||
enum ApplicationData_ApplicationData {
|
enum ApplicationData_ApplicationData {
|
||||||
textmessage,
|
textmessage,
|
||||||
getuserbyusername,
|
getuserbyusername,
|
||||||
|
|
@ -1875,6 +1907,7 @@ enum ApplicationData_ApplicationData {
|
||||||
uploaddone,
|
uploaddone,
|
||||||
getsignedprekeybyuserid,
|
getsignedprekeybyuserid,
|
||||||
updatesignedprekey,
|
updatesignedprekey,
|
||||||
|
deleteaccount,
|
||||||
notSet
|
notSet
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1903,6 +1936,7 @@ class ApplicationData extends $pb.GeneratedMessage {
|
||||||
ApplicationData_UploadDone? uploaddone,
|
ApplicationData_UploadDone? uploaddone,
|
||||||
ApplicationData_GetSignedPreKeyByUserId? getsignedprekeybyuserid,
|
ApplicationData_GetSignedPreKeyByUserId? getsignedprekeybyuserid,
|
||||||
ApplicationData_UpdateSignedPreKey? updatesignedprekey,
|
ApplicationData_UpdateSignedPreKey? updatesignedprekey,
|
||||||
|
ApplicationData_DeleteAccount? deleteaccount,
|
||||||
}) {
|
}) {
|
||||||
final $result = create();
|
final $result = create();
|
||||||
if (textmessage != null) {
|
if (textmessage != null) {
|
||||||
|
|
@ -1974,6 +2008,9 @@ class ApplicationData extends $pb.GeneratedMessage {
|
||||||
if (updatesignedprekey != null) {
|
if (updatesignedprekey != null) {
|
||||||
$result.updatesignedprekey = updatesignedprekey;
|
$result.updatesignedprekey = updatesignedprekey;
|
||||||
}
|
}
|
||||||
|
if (deleteaccount != null) {
|
||||||
|
$result.deleteaccount = deleteaccount;
|
||||||
|
}
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
ApplicationData._() : super();
|
ApplicationData._() : super();
|
||||||
|
|
@ -2004,10 +2041,11 @@ class ApplicationData extends $pb.GeneratedMessage {
|
||||||
21 : ApplicationData_ApplicationData.uploaddone,
|
21 : ApplicationData_ApplicationData.uploaddone,
|
||||||
22 : ApplicationData_ApplicationData.getsignedprekeybyuserid,
|
22 : ApplicationData_ApplicationData.getsignedprekeybyuserid,
|
||||||
23 : ApplicationData_ApplicationData.updatesignedprekey,
|
23 : ApplicationData_ApplicationData.updatesignedprekey,
|
||||||
|
24 : ApplicationData_ApplicationData.deleteaccount,
|
||||||
0 : ApplicationData_ApplicationData.notSet
|
0 : ApplicationData_ApplicationData.notSet
|
||||||
};
|
};
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ApplicationData', package: const $pb.PackageName(_omitMessageNames ? '' : 'client_to_server'), createEmptyInstance: create)
|
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ApplicationData', package: const $pb.PackageName(_omitMessageNames ? '' : 'client_to_server'), createEmptyInstance: create)
|
||||||
..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])
|
..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24])
|
||||||
..aOM<ApplicationData_TextMessage>(1, _omitFieldNames ? '' : 'textmessage', subBuilder: ApplicationData_TextMessage.create)
|
..aOM<ApplicationData_TextMessage>(1, _omitFieldNames ? '' : 'textmessage', subBuilder: ApplicationData_TextMessage.create)
|
||||||
..aOM<ApplicationData_GetUserByUsername>(2, _omitFieldNames ? '' : 'getuserbyusername', subBuilder: ApplicationData_GetUserByUsername.create)
|
..aOM<ApplicationData_GetUserByUsername>(2, _omitFieldNames ? '' : 'getuserbyusername', subBuilder: ApplicationData_GetUserByUsername.create)
|
||||||
..aOM<ApplicationData_GetPrekeysByUserId>(3, _omitFieldNames ? '' : 'getprekeysbyuserid', subBuilder: ApplicationData_GetPrekeysByUserId.create)
|
..aOM<ApplicationData_GetPrekeysByUserId>(3, _omitFieldNames ? '' : 'getprekeysbyuserid', subBuilder: ApplicationData_GetPrekeysByUserId.create)
|
||||||
|
|
@ -2031,6 +2069,7 @@ class ApplicationData extends $pb.GeneratedMessage {
|
||||||
..aOM<ApplicationData_UploadDone>(21, _omitFieldNames ? '' : 'uploaddone', subBuilder: ApplicationData_UploadDone.create)
|
..aOM<ApplicationData_UploadDone>(21, _omitFieldNames ? '' : 'uploaddone', subBuilder: ApplicationData_UploadDone.create)
|
||||||
..aOM<ApplicationData_GetSignedPreKeyByUserId>(22, _omitFieldNames ? '' : 'getsignedprekeybyuserid', subBuilder: ApplicationData_GetSignedPreKeyByUserId.create)
|
..aOM<ApplicationData_GetSignedPreKeyByUserId>(22, _omitFieldNames ? '' : 'getsignedprekeybyuserid', subBuilder: ApplicationData_GetSignedPreKeyByUserId.create)
|
||||||
..aOM<ApplicationData_UpdateSignedPreKey>(23, _omitFieldNames ? '' : 'updatesignedprekey', subBuilder: ApplicationData_UpdateSignedPreKey.create)
|
..aOM<ApplicationData_UpdateSignedPreKey>(23, _omitFieldNames ? '' : 'updatesignedprekey', subBuilder: ApplicationData_UpdateSignedPreKey.create)
|
||||||
|
..aOM<ApplicationData_DeleteAccount>(24, _omitFieldNames ? '' : 'deleteaccount', subBuilder: ApplicationData_DeleteAccount.create)
|
||||||
..hasRequiredFields = false
|
..hasRequiredFields = false
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
@ -2310,6 +2349,17 @@ class ApplicationData extends $pb.GeneratedMessage {
|
||||||
void clearUpdatesignedprekey() => clearField(23);
|
void clearUpdatesignedprekey() => clearField(23);
|
||||||
@$pb.TagNumber(23)
|
@$pb.TagNumber(23)
|
||||||
ApplicationData_UpdateSignedPreKey ensureUpdatesignedprekey() => $_ensure(22);
|
ApplicationData_UpdateSignedPreKey ensureUpdatesignedprekey() => $_ensure(22);
|
||||||
|
|
||||||
|
@$pb.TagNumber(24)
|
||||||
|
ApplicationData_DeleteAccount get deleteaccount => $_getN(23);
|
||||||
|
@$pb.TagNumber(24)
|
||||||
|
set deleteaccount(ApplicationData_DeleteAccount v) { setField(24, v); }
|
||||||
|
@$pb.TagNumber(24)
|
||||||
|
$core.bool hasDeleteaccount() => $_has(23);
|
||||||
|
@$pb.TagNumber(24)
|
||||||
|
void clearDeleteaccount() => clearField(24);
|
||||||
|
@$pb.TagNumber(24)
|
||||||
|
ApplicationData_DeleteAccount ensureDeleteaccount() => $_ensure(23);
|
||||||
}
|
}
|
||||||
|
|
||||||
class Response_PreKey extends $pb.GeneratedMessage {
|
class Response_PreKey extends $pb.GeneratedMessage {
|
||||||
|
|
|
||||||
|
|
@ -159,8 +159,9 @@ const ApplicationData$json = {
|
||||||
{'1': 'uploaddone', '3': 21, '4': 1, '5': 11, '6': '.client_to_server.ApplicationData.UploadDone', '9': 0, '10': 'uploaddone'},
|
{'1': 'uploaddone', '3': 21, '4': 1, '5': 11, '6': '.client_to_server.ApplicationData.UploadDone', '9': 0, '10': 'uploaddone'},
|
||||||
{'1': 'getsignedprekeybyuserid', '3': 22, '4': 1, '5': 11, '6': '.client_to_server.ApplicationData.GetSignedPreKeyByUserId', '9': 0, '10': 'getsignedprekeybyuserid'},
|
{'1': 'getsignedprekeybyuserid', '3': 22, '4': 1, '5': 11, '6': '.client_to_server.ApplicationData.GetSignedPreKeyByUserId', '9': 0, '10': 'getsignedprekeybyuserid'},
|
||||||
{'1': 'updatesignedprekey', '3': 23, '4': 1, '5': 11, '6': '.client_to_server.ApplicationData.UpdateSignedPreKey', '9': 0, '10': 'updatesignedprekey'},
|
{'1': 'updatesignedprekey', '3': 23, '4': 1, '5': 11, '6': '.client_to_server.ApplicationData.UpdateSignedPreKey', '9': 0, '10': 'updatesignedprekey'},
|
||||||
|
{'1': 'deleteaccount', '3': 24, '4': 1, '5': 11, '6': '.client_to_server.ApplicationData.DeleteAccount', '9': 0, '10': 'deleteaccount'},
|
||||||
],
|
],
|
||||||
'3': [ApplicationData_TextMessage$json, ApplicationData_GetUserByUsername$json, ApplicationData_UpdateGoogleFcmToken$json, ApplicationData_GetUserById$json, ApplicationData_RedeemVoucher$json, ApplicationData_SwitchToPayedPlan$json, ApplicationData_UpdatePlanOptions$json, ApplicationData_CreateVoucher$json, ApplicationData_GetLocation$json, ApplicationData_GetVouchers$json, ApplicationData_GetAvailablePlans$json, ApplicationData_GetAddAccountsInvites$json, ApplicationData_GetCurrentPlanInfos$json, ApplicationData_RedeemAdditionalCode$json, ApplicationData_RemoveAdditionalUser$json, ApplicationData_GetPrekeysByUserId$json, ApplicationData_GetSignedPreKeyByUserId$json, ApplicationData_UpdateSignedPreKey$json, ApplicationData_GetUploadToken$json, ApplicationData_UploadData$json, ApplicationData_UploadDone$json, ApplicationData_DownloadData$json, ApplicationData_DownloadDone$json],
|
'3': [ApplicationData_TextMessage$json, ApplicationData_GetUserByUsername$json, ApplicationData_UpdateGoogleFcmToken$json, ApplicationData_GetUserById$json, ApplicationData_RedeemVoucher$json, ApplicationData_SwitchToPayedPlan$json, ApplicationData_UpdatePlanOptions$json, ApplicationData_CreateVoucher$json, ApplicationData_GetLocation$json, ApplicationData_GetVouchers$json, ApplicationData_GetAvailablePlans$json, ApplicationData_GetAddAccountsInvites$json, ApplicationData_GetCurrentPlanInfos$json, ApplicationData_RedeemAdditionalCode$json, ApplicationData_RemoveAdditionalUser$json, ApplicationData_GetPrekeysByUserId$json, ApplicationData_GetSignedPreKeyByUserId$json, ApplicationData_UpdateSignedPreKey$json, ApplicationData_GetUploadToken$json, ApplicationData_UploadData$json, ApplicationData_UploadDone$json, ApplicationData_DownloadData$json, ApplicationData_DownloadDone$json, ApplicationData_DeleteAccount$json],
|
||||||
'8': [
|
'8': [
|
||||||
{'1': 'ApplicationData'},
|
{'1': 'ApplicationData'},
|
||||||
],
|
],
|
||||||
|
|
@ -352,6 +353,11 @@ const ApplicationData_DownloadDone$json = {
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@$core.Deprecated('Use applicationDataDescriptor instead')
|
||||||
|
const ApplicationData_DeleteAccount$json = {
|
||||||
|
'1': 'DeleteAccount',
|
||||||
|
};
|
||||||
|
|
||||||
/// Descriptor for `ApplicationData`. Decode as a `google.protobuf.DescriptorProto`.
|
/// Descriptor for `ApplicationData`. Decode as a `google.protobuf.DescriptorProto`.
|
||||||
final $typed_data.Uint8List applicationDataDescriptor = $convert.base64Decode(
|
final $typed_data.Uint8List applicationDataDescriptor = $convert.base64Decode(
|
||||||
'Cg9BcHBsaWNhdGlvbkRhdGESUQoLdGV4dG1lc3NhZ2UYASABKAsyLS5jbGllbnRfdG9fc2Vydm'
|
'Cg9BcHBsaWNhdGlvbkRhdGESUQoLdGV4dG1lc3NhZ2UYASABKAsyLS5jbGllbnRfdG9fc2Vydm'
|
||||||
|
|
@ -394,32 +400,34 @@ final $typed_data.Uint8List applicationDataDescriptor = $convert.base64Decode(
|
||||||
'9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5HZXRTaWduZWRQcmVLZXlCeVVzZXJJZEgAUhdnZXRz'
|
'9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5HZXRTaWduZWRQcmVLZXlCeVVzZXJJZEgAUhdnZXRz'
|
||||||
'aWduZWRwcmVrZXlieXVzZXJpZBJmChJ1cGRhdGVzaWduZWRwcmVrZXkYFyABKAsyNC5jbGllbn'
|
'aWduZWRwcmVrZXlieXVzZXJpZBJmChJ1cGRhdGVzaWduZWRwcmVrZXkYFyABKAsyNC5jbGllbn'
|
||||||
'RfdG9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5VcGRhdGVTaWduZWRQcmVLZXlIAFISdXBkYXRl'
|
'RfdG9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5VcGRhdGVTaWduZWRQcmVLZXlIAFISdXBkYXRl'
|
||||||
'c2lnbmVkcHJla2V5GmoKC1RleHRNZXNzYWdlEhcKB3VzZXJfaWQYASABKANSBnVzZXJJZBISCg'
|
'c2lnbmVkcHJla2V5ElcKDWRlbGV0ZWFjY291bnQYGCABKAsyLy5jbGllbnRfdG9fc2VydmVyLk'
|
||||||
'Rib2R5GAMgASgMUgRib2R5EiAKCXB1c2hfZGF0YRgEIAEoDEgAUghwdXNoRGF0YYgBAUIMCgpf'
|
'FwcGxpY2F0aW9uRGF0YS5EZWxldGVBY2NvdW50SABSDWRlbGV0ZWFjY291bnQaagoLVGV4dE1l'
|
||||||
'cHVzaF9kYXRhGi8KEUdldFVzZXJCeVVzZXJuYW1lEhoKCHVzZXJuYW1lGAEgASgJUgh1c2Vybm'
|
'c3NhZ2USFwoHdXNlcl9pZBgBIAEoA1IGdXNlcklkEhIKBGJvZHkYAyABKAxSBGJvZHkSIAoJcH'
|
||||||
'FtZRo1ChRVcGRhdGVHb29nbGVGY21Ub2tlbhIdCgpnb29nbGVfZmNtGAEgASgJUglnb29nbGVG'
|
'VzaF9kYXRhGAQgASgMSABSCHB1c2hEYXRhiAEBQgwKCl9wdXNoX2RhdGEaLwoRR2V0VXNlckJ5'
|
||||||
'Y20aJgoLR2V0VXNlckJ5SWQSFwoHdXNlcl9pZBgBIAEoA1IGdXNlcklkGikKDVJlZGVlbVZvdW'
|
'VXNlcm5hbWUSGgoIdXNlcm5hbWUYASABKAlSCHVzZXJuYW1lGjUKFFVwZGF0ZUdvb2dsZUZjbV'
|
||||||
'NoZXISGAoHdm91Y2hlchgBIAEoCVIHdm91Y2hlchpwChFTd2l0Y2hUb1BheWVkUGxhbhIXCgdw'
|
'Rva2VuEh0KCmdvb2dsZV9mY20YASABKAlSCWdvb2dsZUZjbRomCgtHZXRVc2VyQnlJZBIXCgd1'
|
||||||
'bGFuX2lkGAEgASgJUgZwbGFuSWQSHwoLcGF5X21vbnRobHkYAiABKAhSCnBheU1vbnRobHkSIQ'
|
'c2VyX2lkGAEgASgDUgZ1c2VySWQaKQoNUmVkZWVtVm91Y2hlchIYCgd2b3VjaGVyGAEgASgJUg'
|
||||||
'oMYXV0b19yZW5ld2FsGAMgASgIUgthdXRvUmVuZXdhbBo2ChFVcGRhdGVQbGFuT3B0aW9ucxIh'
|
'd2b3VjaGVyGnAKEVN3aXRjaFRvUGF5ZWRQbGFuEhcKB3BsYW5faWQYASABKAlSBnBsYW5JZBIf'
|
||||||
'CgxhdXRvX3JlbmV3YWwYASABKAhSC2F1dG9SZW5ld2FsGjAKDUNyZWF0ZVZvdWNoZXISHwoLdm'
|
'CgtwYXlfbW9udGhseRgCIAEoCFIKcGF5TW9udGhseRIhCgxhdXRvX3JlbmV3YWwYAyABKAhSC2'
|
||||||
'FsdWVfY2VudHMYASABKA1SCnZhbHVlQ2VudHMaDQoLR2V0TG9jYXRpb24aDQoLR2V0Vm91Y2hl'
|
'F1dG9SZW5ld2FsGjYKEVVwZGF0ZVBsYW5PcHRpb25zEiEKDGF1dG9fcmVuZXdhbBgBIAEoCFIL'
|
||||||
'cnMaEwoRR2V0QXZhaWxhYmxlUGxhbnMaFwoVR2V0QWRkQWNjb3VudHNJbnZpdGVzGhUKE0dldE'
|
'YXV0b1JlbmV3YWwaMAoNQ3JlYXRlVm91Y2hlchIfCgt2YWx1ZV9jZW50cxgBIAEoDVIKdmFsdW'
|
||||||
'N1cnJlbnRQbGFuSW5mb3MaNwoUUmVkZWVtQWRkaXRpb25hbENvZGUSHwoLaW52aXRlX2NvZGUY'
|
'VDZW50cxoNCgtHZXRMb2NhdGlvbhoNCgtHZXRWb3VjaGVycxoTChFHZXRBdmFpbGFibGVQbGFu'
|
||||||
'AiABKAlSCmludml0ZUNvZGUaLwoUUmVtb3ZlQWRkaXRpb25hbFVzZXISFwoHdXNlcl9pZBgBIA'
|
'cxoXChVHZXRBZGRBY2NvdW50c0ludml0ZXMaFQoTR2V0Q3VycmVudFBsYW5JbmZvcxo3ChRSZW'
|
||||||
'EoA1IGdXNlcklkGi0KEkdldFByZWtleXNCeVVzZXJJZBIXCgd1c2VyX2lkGAEgASgDUgZ1c2Vy'
|
'RlZW1BZGRpdGlvbmFsQ29kZRIfCgtpbnZpdGVfY29kZRgCIAEoCVIKaW52aXRlQ29kZRovChRS'
|
||||||
'SWQaMgoXR2V0U2lnbmVkUHJlS2V5QnlVc2VySWQSFwoHdXNlcl9pZBgBIAEoA1IGdXNlcklkGp'
|
'ZW1vdmVBZGRpdGlvbmFsVXNlchIXCgd1c2VyX2lkGAEgASgDUgZ1c2VySWQaLQoSR2V0UHJla2'
|
||||||
'sBChJVcGRhdGVTaWduZWRQcmVLZXkSKAoQc2lnbmVkX3ByZWtleV9pZBgBIAEoA1IOc2lnbmVk'
|
'V5c0J5VXNlcklkEhcKB3VzZXJfaWQYASABKANSBnVzZXJJZBoyChdHZXRTaWduZWRQcmVLZXlC'
|
||||||
'UHJla2V5SWQSIwoNc2lnbmVkX3ByZWtleRgCIAEoDFIMc2lnbmVkUHJla2V5EjYKF3NpZ25lZF'
|
'eVVzZXJJZBIXCgd1c2VyX2lkGAEgASgDUgZ1c2VySWQamwEKElVwZGF0ZVNpZ25lZFByZUtleR'
|
||||||
'9wcmVrZXlfc2lnbmF0dXJlGAMgASgMUhVzaWduZWRQcmVrZXlTaWduYXR1cmUaOwoOR2V0VXBs'
|
'IoChBzaWduZWRfcHJla2V5X2lkGAEgASgDUg5zaWduZWRQcmVrZXlJZBIjCg1zaWduZWRfcHJl'
|
||||||
'b2FkVG9rZW4SKQoQcmVjaXBpZW50c19jb3VudBgBIAEoDVIPcmVjaXBpZW50c0NvdW50GokBCg'
|
'a2V5GAIgASgMUgxzaWduZWRQcmVrZXkSNgoXc2lnbmVkX3ByZWtleV9zaWduYXR1cmUYAyABKA'
|
||||||
'pVcGxvYWREYXRhEiEKDHVwbG9hZF90b2tlbhgBIAEoDFILdXBsb2FkVG9rZW4SFgoGb2Zmc2V0'
|
'xSFXNpZ25lZFByZWtleVNpZ25hdHVyZRo7Cg5HZXRVcGxvYWRUb2tlbhIpChByZWNpcGllbnRz'
|
||||||
'GAIgASgNUgZvZmZzZXQSEgoEZGF0YRgDIAEoDFIEZGF0YRIfCghjaGVja3N1bRgEIAEoDEgAUg'
|
'X2NvdW50GAEgASgNUg9yZWNpcGllbnRzQ291bnQaiQEKClVwbG9hZERhdGESIQoMdXBsb2FkX3'
|
||||||
'hjaGVja3N1bYgBAUILCglfY2hlY2tzdW0aWgoKVXBsb2FkRG9uZRIhCgx1cGxvYWRfdG9rZW4Y'
|
'Rva2VuGAEgASgMUgt1cGxvYWRUb2tlbhIWCgZvZmZzZXQYAiABKA1SBm9mZnNldBISCgRkYXRh'
|
||||||
'ASABKAxSC3VwbG9hZFRva2VuEikKEHJlY2lwaWVudHNfY291bnQYAiABKA1SD3JlY2lwaWVudH'
|
'GAMgASgMUgRkYXRhEh8KCGNoZWNrc3VtGAQgASgMSABSCGNoZWNrc3VtiAEBQgsKCV9jaGVja3'
|
||||||
'NDb3VudBpNCgxEb3dubG9hZERhdGESJQoOZG93bmxvYWRfdG9rZW4YASABKAxSDWRvd25sb2Fk'
|
'N1bRpaCgpVcGxvYWREb25lEiEKDHVwbG9hZF90b2tlbhgBIAEoDFILdXBsb2FkVG9rZW4SKQoQ'
|
||||||
'VG9rZW4SFgoGb2Zmc2V0GAIgASgNUgZvZmZzZXQaNQoMRG93bmxvYWREb25lEiUKDmRvd25sb2'
|
'cmVjaXBpZW50c19jb3VudBgCIAEoDVIPcmVjaXBpZW50c0NvdW50Gk0KDERvd25sb2FkRGF0YR'
|
||||||
'FkX3Rva2VuGAEgASgMUg1kb3dubG9hZFRva2VuQhEKD0FwcGxpY2F0aW9uRGF0YQ==');
|
'IlCg5kb3dubG9hZF90b2tlbhgBIAEoDFINZG93bmxvYWRUb2tlbhIWCgZvZmZzZXQYAiABKA1S'
|
||||||
|
'Bm9mZnNldBo1CgxEb3dubG9hZERvbmUSJQoOZG93bmxvYWRfdG9rZW4YASABKAxSDWRvd25sb2'
|
||||||
|
'FkVG9rZW4aDwoNRGVsZXRlQWNjb3VudEIRCg9BcHBsaWNhdGlvbkRhdGE=');
|
||||||
|
|
||||||
@$core.Deprecated('Use responseDescriptor instead')
|
@$core.Deprecated('Use responseDescriptor instead')
|
||||||
const Response$json = {
|
const Response$json = {
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,7 @@ class ErrorCode extends $pb.ProtobufEnum {
|
||||||
static const ErrorCode PlanDowngrade = ErrorCode._(1025, _omitEnumNames ? '' : 'PlanDowngrade');
|
static const ErrorCode PlanDowngrade = ErrorCode._(1025, _omitEnumNames ? '' : 'PlanDowngrade');
|
||||||
static const ErrorCode PlanUpgradeNotYearly = ErrorCode._(1026, _omitEnumNames ? '' : 'PlanUpgradeNotYearly');
|
static const ErrorCode PlanUpgradeNotYearly = ErrorCode._(1026, _omitEnumNames ? '' : 'PlanUpgradeNotYearly');
|
||||||
static const ErrorCode InvalidSignedPreKey = ErrorCode._(1027, _omitEnumNames ? '' : 'InvalidSignedPreKey');
|
static const ErrorCode InvalidSignedPreKey = ErrorCode._(1027, _omitEnumNames ? '' : 'InvalidSignedPreKey');
|
||||||
|
static const ErrorCode UserIdNotFound = ErrorCode._(1028, _omitEnumNames ? '' : 'UserIdNotFound');
|
||||||
|
|
||||||
static const $core.List<ErrorCode> values = <ErrorCode> [
|
static const $core.List<ErrorCode> values = <ErrorCode> [
|
||||||
Unknown,
|
Unknown,
|
||||||
|
|
@ -76,6 +77,7 @@ class ErrorCode extends $pb.ProtobufEnum {
|
||||||
PlanDowngrade,
|
PlanDowngrade,
|
||||||
PlanUpgradeNotYearly,
|
PlanUpgradeNotYearly,
|
||||||
InvalidSignedPreKey,
|
InvalidSignedPreKey,
|
||||||
|
UserIdNotFound,
|
||||||
];
|
];
|
||||||
|
|
||||||
static final $core.Map<$core.int, ErrorCode> _byValue = $pb.ProtobufEnum.initByValue(values);
|
static final $core.Map<$core.int, ErrorCode> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,7 @@ const ErrorCode$json = {
|
||||||
{'1': 'PlanDowngrade', '2': 1025},
|
{'1': 'PlanDowngrade', '2': 1025},
|
||||||
{'1': 'PlanUpgradeNotYearly', '2': 1026},
|
{'1': 'PlanUpgradeNotYearly', '2': 1026},
|
||||||
{'1': 'InvalidSignedPreKey', '2': 1027},
|
{'1': 'InvalidSignedPreKey', '2': 1027},
|
||||||
|
{'1': 'UserIdNotFound', '2': 1028},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -65,5 +66,5 @@ final $typed_data.Uint8List errorCodeDescriptor = $convert.base64Decode(
|
||||||
'Cg5JbnZhbGlkUHJlS2V5cxD8BxITCg5Wb3VjaGVySW5WYWxpZBD9BxITCg5QbGFuTm90QWxsb3'
|
'Cg5JbnZhbGlkUHJlS2V5cxD8BxITCg5Wb3VjaGVySW5WYWxpZBD9BxITCg5QbGFuTm90QWxsb3'
|
||||||
'dlZBD+BxIVChBQbGFuTGltaXRSZWFjaGVkEP8HEhQKD05vdEVub3VnaENyZWRpdBCACBISCg1Q'
|
'dlZBD+BxIVChBQbGFuTGltaXRSZWFjaGVkEP8HEhQKD05vdEVub3VnaENyZWRpdBCACBISCg1Q'
|
||||||
'bGFuRG93bmdyYWRlEIEIEhkKFFBsYW5VcGdyYWRlTm90WWVhcmx5EIIIEhgKE0ludmFsaWRTaW'
|
'bGFuRG93bmdyYWRlEIEIEhkKFFBsYW5VcGdyYWRlTm90WWVhcmx5EIIIEhgKE0ludmFsaWRTaW'
|
||||||
'duZWRQcmVLZXkQgwg=');
|
'duZWRQcmVLZXkQgwgSEwoOVXNlcklkTm90Rm91bmQQhAg=');
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -532,6 +532,13 @@ class ApiService {
|
||||||
return await sendRequestSync(req);
|
return await sendRequestSync(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<Result> deleteAccount() async {
|
||||||
|
var get = ApplicationData_DeleteAccount();
|
||||||
|
var appData = ApplicationData()..deleteaccount = get;
|
||||||
|
var req = createClientToServerFromApplicationData(appData);
|
||||||
|
return await sendRequestSync(req);
|
||||||
|
}
|
||||||
|
|
||||||
Future<Result> redeemUserInviteCode(String inviteCode) async {
|
Future<Result> redeemUserInviteCode(String inviteCode) async {
|
||||||
var get = ApplicationData_RedeemAdditionalCode()..inviteCode = inviteCode;
|
var get = ApplicationData_RedeemAdditionalCode()..inviteCode = inviteCode;
|
||||||
var appData = ApplicationData()..redeemadditionalcode = get;
|
var appData = ApplicationData()..redeemadditionalcode = get;
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,55 @@
|
||||||
|
import 'package:collection/collection.dart';
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
import 'package:restart_app/restart_app.dart';
|
import 'package:restart_app/restart_app.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:twonly/globals.dart';
|
||||||
|
import 'package:twonly/src/model/protobuf/api/server_to_client.pb.dart';
|
||||||
import 'package:twonly/src/views/components/alert_dialog.dart';
|
import 'package:twonly/src/views/components/alert_dialog.dart';
|
||||||
import 'package:twonly/src/utils/misc.dart';
|
import 'package:twonly/src/utils/misc.dart';
|
||||||
import 'package:twonly/src/utils/storage.dart';
|
import 'package:twonly/src/utils/storage.dart';
|
||||||
|
import 'package:twonly/src/views/settings/account/refund_credits.view.dart';
|
||||||
|
import 'package:twonly/src/views/settings/subscription/subscription.view.dart';
|
||||||
|
|
||||||
class AccountView extends StatelessWidget {
|
class AccountView extends StatefulWidget {
|
||||||
const AccountView({super.key});
|
const AccountView({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<AccountView> createState() => _AccountViewState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _AccountViewState extends State<AccountView> {
|
||||||
|
String? formattedBallance;
|
||||||
|
bool hasRemainingBallance = false;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
initAsync();
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
Future initAsync() async {
|
||||||
|
final ballance = await loadPlanBalance(useCache: false);
|
||||||
|
if (ballance == null || !mounted) return;
|
||||||
|
int ballanceInCents = ballance.transactions
|
||||||
|
.where((x) =>
|
||||||
|
(x.transactionType != Response_TransactionTypes.ThanksForTesting ||
|
||||||
|
kDebugMode))
|
||||||
|
.map((a) => a.depositCents.toInt())
|
||||||
|
.sum;
|
||||||
|
if (ballanceInCents < 0) {
|
||||||
|
ballanceInCents = 0;
|
||||||
|
}
|
||||||
|
hasRemainingBallance = (ballanceInCents > 0);
|
||||||
|
Locale myLocale = Localizations.localeOf(context);
|
||||||
|
formattedBallance = NumberFormat.currency(
|
||||||
|
locale: myLocale.toString(),
|
||||||
|
symbol: '€',
|
||||||
|
decimalDigits: 2,
|
||||||
|
).format(ballanceInCents / 100);
|
||||||
|
setState(() {});
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
|
|
@ -19,23 +62,75 @@ class AccountView extends StatelessWidget {
|
||||||
title: Text("Transfer account"),
|
title: Text("Transfer account"),
|
||||||
subtitle: Text("Coming soon"),
|
subtitle: Text("Coming soon"),
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
showAlertDialog(context, "Coming soon",
|
showAlertDialog(
|
||||||
"This feature is not yet implemented!");
|
context,
|
||||||
|
"Coming soon",
|
||||||
|
"This feature is not yet implemented!",
|
||||||
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
Divider(),
|
||||||
|
Container(
|
||||||
|
alignment: Alignment.center,
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 10.0, vertical: 20),
|
||||||
|
child: Text(
|
||||||
|
"Danger Zone",
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 20,
|
||||||
|
color: Colors.red,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
title: Text(context.lang.settingsAccountDeleteAccount,
|
title: Text(
|
||||||
style: TextStyle(color: Colors.red)),
|
context.lang.settingsAccountDeleteAccount,
|
||||||
onTap: () async {
|
style: TextStyle(color: Colors.red),
|
||||||
|
),
|
||||||
|
subtitle: (formattedBallance == null)
|
||||||
|
? Text(context.lang.settingsAccountDeleteAccountNoInternet)
|
||||||
|
: (hasRemainingBallance)
|
||||||
|
? Text(context.lang
|
||||||
|
.settingsAccountDeleteAccountWithBallance(
|
||||||
|
formattedBallance!))
|
||||||
|
: Text(context.lang.settingsAccountDeleteAccountNoBallance),
|
||||||
|
onTap: (formattedBallance == null)
|
||||||
|
? null
|
||||||
|
: () async {
|
||||||
|
if (hasRemainingBallance) {
|
||||||
|
bool? canGoNext = await Navigator.push(context,
|
||||||
|
MaterialPageRoute(builder: (context) {
|
||||||
|
return RefundCreditsView(
|
||||||
|
formattedBalance: formattedBallance!,
|
||||||
|
);
|
||||||
|
}));
|
||||||
|
initAsync();
|
||||||
|
if (canGoNext == null || !canGoNext) return;
|
||||||
|
}
|
||||||
|
if (!context.mounted) return;
|
||||||
bool ok = await showAlertDialog(
|
bool ok = await showAlertDialog(
|
||||||
context,
|
context,
|
||||||
context.lang.settingsAccountDeleteModalTitle,
|
context.lang.settingsAccountDeleteModalTitle,
|
||||||
context.lang.settingsAccountDeleteModalBody);
|
context.lang.settingsAccountDeleteModalBody,
|
||||||
|
);
|
||||||
if (ok) {
|
if (ok) {
|
||||||
|
final res = await apiService.deleteAccount();
|
||||||
|
if (res.isError) {
|
||||||
|
if (!context.mounted) return;
|
||||||
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
|
SnackBar(
|
||||||
|
content: Text(
|
||||||
|
"Could not delete the account. Please ensure you have a internet connection!",
|
||||||
|
),
|
||||||
|
duration: Duration(seconds: 3),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
await deleteLocalUserData();
|
await deleteLocalUserData();
|
||||||
Restart.restartApp(
|
Restart.restartApp(
|
||||||
notificationTitle: 'Successfully logged out',
|
notificationTitle: 'Account successfully deleted',
|
||||||
notificationBody: 'Click here to open the app again',
|
notificationBody: 'Click here to open the app again',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
77
lib/src/views/settings/account/refund_credits.view.dart
Normal file
77
lib/src/views/settings/account/refund_credits.view.dart
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
||||||
|
import 'package:twonly/src/views/settings/subscription/voucher.view.dart';
|
||||||
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
|
||||||
|
class RefundCreditsView extends StatefulWidget {
|
||||||
|
const RefundCreditsView({super.key, required this.formattedBalance});
|
||||||
|
final String formattedBalance;
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<RefundCreditsView> createState() => _RefundCreditsViewState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _RefundCreditsViewState extends State<RefundCreditsView> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: const Text('Refund Credits'),
|
||||||
|
),
|
||||||
|
body: Padding(
|
||||||
|
padding: const EdgeInsets.all(16.0),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Center(
|
||||||
|
child: Text(
|
||||||
|
'Remaining balance: ${widget.formattedBalance}',
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 20), // Space between balance and options
|
||||||
|
|
||||||
|
ListTile(
|
||||||
|
title: Text("Create a Voucher"),
|
||||||
|
onTap: () async {
|
||||||
|
await Navigator.push(context,
|
||||||
|
MaterialPageRoute(builder: (context) {
|
||||||
|
return VoucherView();
|
||||||
|
}));
|
||||||
|
Navigator.pop(context, false);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
ListTile(
|
||||||
|
title: Text("Spend to an Open Source Project"),
|
||||||
|
onTap: () async {},
|
||||||
|
),
|
||||||
|
ListTile(
|
||||||
|
title: Text("Spend to an NGO"),
|
||||||
|
onTap: () async {},
|
||||||
|
),
|
||||||
|
ListTile(
|
||||||
|
title: Text("Spend to twonly"),
|
||||||
|
onTap: () async {},
|
||||||
|
),
|
||||||
|
Divider(),
|
||||||
|
ListTile(
|
||||||
|
title: Text(
|
||||||
|
"Learn more about your donation",
|
||||||
|
),
|
||||||
|
subtitle: Text(
|
||||||
|
"This will open our webpage which will provide you more informations where we will donate your remaining ballance if you choose this option.",
|
||||||
|
),
|
||||||
|
onTap: () {
|
||||||
|
launchUrl(Uri.parse("https://twonly.eu/de/donation/"));
|
||||||
|
},
|
||||||
|
trailing: FaIcon(
|
||||||
|
FontAwesomeIcons.arrowUpRightFromSquare,
|
||||||
|
size: 15,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -57,7 +57,7 @@ class _AdditionalUsersViewState extends State<AdditionalUsersView> {
|
||||||
Future initAsync(bool force) async {
|
Future initAsync(bool force) async {
|
||||||
additionalInvites = await loadAdditionalUserInvites();
|
additionalInvites = await loadAdditionalUserInvites();
|
||||||
if (force) {
|
if (force) {
|
||||||
ballance = await loadPlanBallance();
|
ballance = await loadPlanBalance();
|
||||||
}
|
}
|
||||||
setState(() {});
|
setState(() {});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ class _ManageSubscriptionViewState extends State<ManageSubscriptionView> {
|
||||||
|
|
||||||
Future initAsync(bool force) async {
|
Future initAsync(bool force) async {
|
||||||
if (force) {
|
if (force) {
|
||||||
ballance = await loadPlanBallance();
|
ballance = await loadPlanBalance();
|
||||||
if (ballance != null) {
|
if (ballance != null) {
|
||||||
autoRenewal = ballance!.autoRenewal;
|
autoRenewal = ballance!.autoRenewal;
|
||||||
}
|
}
|
||||||
|
|
@ -90,12 +90,6 @@ class _ManageSubscriptionViewState extends State<ManageSubscriptionView> {
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
// SizedBox(height: 20),
|
|
||||||
// Divider(),
|
|
||||||
// ListTile(
|
|
||||||
// title: Text("Cancel subscription"),
|
|
||||||
// onTap: () async {},
|
|
||||||
// ),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -10,12 +10,13 @@ import 'package:twonly/src/views/settings/subscription/voucher.view.dart';
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
|
||||||
class SelectPaymentView extends StatefulWidget {
|
class SelectPaymentView extends StatefulWidget {
|
||||||
const SelectPaymentView(
|
const SelectPaymentView({
|
||||||
{super.key,
|
super.key,
|
||||||
this.planId,
|
this.planId,
|
||||||
this.payMonthly,
|
this.payMonthly,
|
||||||
this.valueInCents,
|
this.valueInCents,
|
||||||
this.refund});
|
this.refund,
|
||||||
|
});
|
||||||
|
|
||||||
final String? planId;
|
final String? planId;
|
||||||
final bool? payMonthly;
|
final bool? payMonthly;
|
||||||
|
|
@ -33,7 +34,7 @@ enum PaymentMethods {
|
||||||
}
|
}
|
||||||
|
|
||||||
class _SelectPaymentViewState extends State<SelectPaymentView> {
|
class _SelectPaymentViewState extends State<SelectPaymentView> {
|
||||||
int? ballanceInCents;
|
int? balanceInCents;
|
||||||
int checkoutInCents = 0;
|
int checkoutInCents = 0;
|
||||||
bool tryAutoRenewal = true;
|
bool tryAutoRenewal = true;
|
||||||
|
|
||||||
|
|
@ -47,9 +48,9 @@ class _SelectPaymentViewState extends State<SelectPaymentView> {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future initAsync() async {
|
Future initAsync() async {
|
||||||
final ballance = await loadPlanBallance();
|
final balance = await loadPlanBalance();
|
||||||
ballanceInCents =
|
balanceInCents =
|
||||||
ballance!.transactions.map((a) => a.depositCents.toInt()).sum;
|
balance!.transactions.map((a) => a.depositCents.toInt()).sum;
|
||||||
setState(() {});
|
setState(() {});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -74,7 +75,7 @@ class _SelectPaymentViewState extends State<SelectPaymentView> {
|
||||||
? "${localePrizing(context, checkoutInCents)}/${(widget.payMonthly!) ? context.lang.month : context.lang.year}"
|
? "${localePrizing(context, checkoutInCents)}/${(widget.payMonthly!) ? context.lang.month : context.lang.year}"
|
||||||
: localePrizing(context, checkoutInCents);
|
: localePrizing(context, checkoutInCents);
|
||||||
bool canPay = (paymentMethods == PaymentMethods.twonlyCredit &&
|
bool canPay = (paymentMethods == PaymentMethods.twonlyCredit &&
|
||||||
(ballanceInCents == null || ballanceInCents! >= checkoutInCents));
|
(balanceInCents == null || balanceInCents! >= checkoutInCents));
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: Text(context.lang.selectPaymentMethode),
|
title: Text(context.lang.selectPaymentMethode),
|
||||||
|
|
@ -98,9 +99,9 @@ class _SelectPaymentViewState extends State<SelectPaymentView> {
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Text(context.lang.twonlyCredit),
|
Text(context.lang.twonlyCredit),
|
||||||
if (ballanceInCents != null)
|
if (balanceInCents != null)
|
||||||
Text(
|
Text(
|
||||||
"${context.lang.currentBalance}: ${localePrizing(context, ballanceInCents!)}",
|
"${context.lang.currentBalance}: ${localePrizing(context, balanceInCents!)}",
|
||||||
style: TextStyle(fontSize: 10),
|
style: TextStyle(fontSize: 10),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ String localePrizing(BuildContext context, int cents) {
|
||||||
).format(cents / 100);
|
).format(cents / 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Response_PlanBallance?> loadPlanBallance() async {
|
Future<Response_PlanBallance?> loadPlanBalance({bool useCache = true}) async {
|
||||||
Response_PlanBallance? ballance;
|
Response_PlanBallance? ballance;
|
||||||
final user = await getUser();
|
final user = await getUser();
|
||||||
if (user == null) return ballance;
|
if (user == null) return ballance;
|
||||||
|
|
@ -43,7 +43,7 @@ Future<Response_PlanBallance?> loadPlanBallance() async {
|
||||||
if (ballance != null) {
|
if (ballance != null) {
|
||||||
user.lastPlanBallance = ballance.writeToJson();
|
user.lastPlanBallance = ballance.writeToJson();
|
||||||
await updateUser(user);
|
await updateUser(user);
|
||||||
} else if (user.lastPlanBallance != null) {
|
} else if (user.lastPlanBallance != null && useCache) {
|
||||||
try {
|
try {
|
||||||
ballance = Response_PlanBallance.fromJson(
|
ballance = Response_PlanBallance.fromJson(
|
||||||
user.lastPlanBallance!,
|
user.lastPlanBallance!,
|
||||||
|
|
@ -113,7 +113,7 @@ class _SubscriptionViewState extends State<SubscriptionView> {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future initAsync() async {
|
Future initAsync() async {
|
||||||
ballance = await loadPlanBallance();
|
ballance = await loadPlanBalance();
|
||||||
if (ballance != null && ballance!.hasAdditionalAccountOwnerId()) {
|
if (ballance != null && ballance!.hasAdditionalAccountOwnerId()) {
|
||||||
final ownerId = ballance!.additionalAccountOwnerId.toInt();
|
final ownerId = ballance!.additionalAccountOwnerId.toInt();
|
||||||
Contact? contact = await twonlyDB.contactsDao
|
Contact? contact = await twonlyDB.contactsDao
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue