Commit e4849df6 by Nguyễn Thị Thúy

Merge branch 'phase_2_check_version' into 'dev_phase2'

Phase 2 check version

See merge request !5
parents e7ab62e4 901d9269
......@@ -132,8 +132,8 @@ android {
applicationId "com.dcv.invest"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 3
versionName "1.3"
versionCode 2
versionName "1.2"
vectorDrawables.useSupportLibrary = true
}
splits {
......@@ -151,6 +151,12 @@ android {
keyAlias 'androiddebugkey'
keyPassword 'android'
}
release {
storeFile file('KeyStore')
storePassword 'dcvinvest'
keyAlias 'dcvinvest'
keyPassword 'dcvinvest'
}
}
buildTypes {
debug {
......@@ -159,8 +165,9 @@ android {
release {
// Caution! In production, you need to generate your own keystore file.
// see https://facebook.github.io/react-native/docs/signed-apk-android.
signingConfig signingConfigs.debug
signingConfig signingConfigs.release
minifyEnabled enableProguardInReleaseBuilds
debuggable true
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
}
}
......@@ -222,7 +229,8 @@ implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha02'
implementation jscFlavor
}
implementation 'com.google.firebase:firebase-analytics:17.2.2'
implementation 'com.google.android.play:core:1.7.3'
implementation 'com.google.android.material:material:1.0.0'
}
// Run this once to be able to run the application with BUCK
......
package com.dcv.invest;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentSender;
import android.graphics.Color;
import androidx.annotation.NonNull;
import com.facebook.react.bridge.ActivityEventListener;
import com.facebook.react.bridge.BaseActivityEventListener;
import com.facebook.react.bridge.LifecycleEventListener;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.play.core.appupdate.AppUpdateInfo;
import com.google.android.play.core.appupdate.AppUpdateManager;
import com.google.android.play.core.appupdate.AppUpdateManagerFactory;
import com.google.android.play.core.install.InstallState;
import com.google.android.play.core.install.InstallStateUpdatedListener;
import com.google.android.play.core.install.model.AppUpdateType;
import com.google.android.play.core.install.model.InstallStatus;
import com.google.android.play.core.install.model.UpdateAvailability;
import com.google.android.play.core.tasks.Task;
import java.util.Objects;
import static android.app.Activity.RESULT_OK;
public class InAppUpdateModule extends ReactContextBaseJavaModule implements InstallStateUpdatedListener, LifecycleEventListener {
private AppUpdateManager appUpdateManager;
private static ReactApplicationContext reactContext;
private static final int STALE_DAYS = 5;
private static final int MY_REQUEST_CODE = 0;
private final ActivityEventListener mActivityEventListener = new BaseActivityEventListener() {
@Override
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent intent) {
if (requestCode == MY_REQUEST_CODE) {
if (resultCode != RESULT_OK) {
System.out.println("Update flow failed! Result code: " + resultCode);
// If the update is cancelled or fails,
// you can request to start the update again.
}
}
}
};
InAppUpdateModule(ReactApplicationContext context) {
super(context);
reactContext = context;
reactContext.addActivityEventListener(mActivityEventListener);
reactContext.addLifecycleEventListener(this);
}
@NonNull
@Override
public String getName() {
return "InAppUpdate";
}
@ReactMethod
public void checkUpdate() throws Exception {
appUpdateManager = AppUpdateManagerFactory.create(reactContext);
appUpdateManager.registerListener(this);
Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();
if (appUpdateInfoTask.getException() != null) throw appUpdateInfoTask.getException();
appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
&& appUpdateInfo.clientVersionStalenessDays() != null
&& appUpdateInfo.clientVersionStalenessDays() > STALE_DAYS
&& appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
try {
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
AppUpdateType.IMMEDIATE,
reactContext.getCurrentActivity(),
MY_REQUEST_CODE);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
} else {
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
&& appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
try {
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
AppUpdateType.FLEXIBLE,
reactContext.getCurrentActivity(),
MY_REQUEST_CODE);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
}
}
});
}
@Override
public void onStateUpdate(InstallState state) {
if (state.installStatus() == InstallStatus.DOWNLOADED) {
popupSnackbarForCompleteUpdate();
}
}
private void popupSnackbarForCompleteUpdate() {
Snackbar snackbar =
Snackbar.make(Objects.requireNonNull(reactContext.getCurrentActivity()).findViewById(android.R.id.content).getRootView(),
"An update has just been downloaded.",
Snackbar.LENGTH_INDEFINITE);
snackbar.setAction("RESTART", view -> appUpdateManager.completeUpdate());
snackbar.setActionTextColor(Color.GREEN);
snackbar.show();
}
@Override
public void onHostResume() {
if (appUpdateManager != null) {
appUpdateManager
.getAppUpdateInfo()
.addOnSuccessListener(
appUpdateInfo -> {
if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED) {
popupSnackbarForCompleteUpdate();
}
if (appUpdateInfo.updateAvailability()
== UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {
try {
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
AppUpdateType.IMMEDIATE,
reactContext.getCurrentActivity(),
MY_REQUEST_CODE);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
}
});
}
}
@Override
public void onHostPause() {
}
@Override
public void onHostDestroy() {
if (appUpdateManager != null) {
appUpdateManager.unregisterListener(this);
}
}
}
package com.dcv.invest;
import androidx.annotation.NonNull;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class InAppUpdatePackage implements ReactPackage {
@NonNull
@Override
public List<NativeModule> createNativeModules(@NonNull ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new InAppUpdateModule(reactContext));
return modules;
}
@NonNull
@Override
public List<ViewManager> createViewManagers(@NonNull ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
......@@ -29,6 +29,7 @@ public class MainApplication extends Application implements ReactApplication {
// Packages that cannot be autolinked yet can be added manually here, for example:
// packages.add(new MyReactNativePackage());
// packages.add(new RNBootSplashPackage());
packages.add(new InAppUpdatePackage());
return packages;
}
......
......@@ -57,7 +57,7 @@
<key>NSCameraUsageDescription</key>
<string>Accect connect camera</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
<string/>
<key>NSPhotoLibraryUsageDescription</key>
<string>To upload images</string>
<key>UIAppFonts</key>
......@@ -92,5 +92,9 @@
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>itms-apps</string>
</array>
</dict>
</plist>
......@@ -8,17 +8,17 @@ import {SkypeIndicator} from 'react-native-indicators';
import {enableScreens} from 'react-native-screens';
import NoInternetComponent from './components/NoInternet';
import {getVersion} from 'react-native-device-info';
import DeviceInfo from 'react-native-device-info';
import VersionChecker from './Screens/VersionChecker';
enableScreens();
const RootView = (props) => {
useEffect(() => {
checkVersion();
}, []);
const checkVersion = (props) => {
const verCurrent = getVersion();
const verCurrent = DeviceInfo.getVersion();
console.log('version current', verCurrent);
};
......@@ -31,6 +31,7 @@ const RootView = (props) => {
<StackNavigation />
</View>
<VersionChecker/>
<NoInternetComponent />
</>
);
......
import React, {useEffect, useState} from 'react';
import {
View,
Text,
Modal,
TouchableOpacity,
StyleSheet,
Image,
TouchableWithoutFeedback,
Linking, Platform,
} from 'react-native';
import R from '../../assets/R';
import {getFontXD, getHeight, getWidth, HEIGHTXD, WIDTHXD} from '../../Config/Functions';
import I18n from '../../helper/i18/i18n';
import DeviceInfo from 'react-native-device-info';
import {getNewestVersionInfo} from '../../apis/Functions/users';
import InAppUpdate from '../../helper/InAppUpdate';
const VersionChecker = (props) => {
const [visible, setVisible] = useState(false);
const [isForceUpdate, setIsForceUpdate] = useState(false);
const [version, setVersion] = useState('1.0');
useEffect(() => {
checkVersion();
}, []);
const checkVersion = async () => {
const verCurrent = DeviceInfo.getVersion();
const res = await getNewestVersionInfo({
platform: Platform.OS,
});
if ((res.data.code = 200 && res.data.data)) {
console.log(res);
if (res.data.data[0].version_name !== verCurrent || res.data.data[0].build.toString() !== DeviceInfo.getBuildNumber) {
setVersion(res.data.data[0].version_name);
setVisible(true);
setIsForceUpdate(res.data.data[0].is_require_update == 0 ? false : true);
}
}
};
const setVisibleModal = (visible, version, isForceUpdate) => {
setVisible(visible);
setVersion(version);
setIsForceUpdate(isForceUpdate);
};
const _renderDivider = () => <View style={styles.dividerStyle}/>;
const onOutsidePressed = () => {
setVisible(false);
};
const onUpdatePressed = async () => {
try {
if (Platform.OS === 'ios') {
Linking.openURL('itms-apps://itunes.apple.com/us/app/dcv-invest/id1556621903?l=id');
} else {
// try {
// InAppUpdate.checkUpdate()
// } catch(e) {
// console.log(e)
// }
Linking.openURL('https://play.google.com/store/apps/details?id=com.dcv.invest');
}
} catch (error) {
}
};
const onRequestClose = () => null;
const renderBackdrop = () => {
return (
<View
style={{
backgroundColor: 'rgba(0,0,0,0.30)',
// backgroundColor: 'red',
position: 'absolute',
top: 0,
bottom: 0,
left: 0,
right: 0,
width: getWidth(),
height: getHeight(),
}}
/>
);
};
const cancelUpdate = () => {
setVisible(false);
};
return (
<Modal
onRequestClose={() => onRequestClose()}
transparent
animationType="fade"
style={{position: 'absolute'}}
visible={visible}
>
{renderBackdrop()}
<View pointerEvents="box-none" style={styles.containerStyle}>
<View style={styles.imageUpgradeContainer} zIndex={100}>
<Image
source={R.images.iconUpgrade}
style={[styles.imageUpgradeStyle, {tintColor: R.colors.main}]}/>
</View>
<View style={styles.contentContainerStyle}>
<Text style={styles.titleStyle}>{I18n.t('Update')}</Text>
<Text style={styles.versionLabelStyle}>
{I18n.t('Version')}
{': '}
{version}
</Text>
<Text style={styles.descStyle}>{I18n.t('UpdateDescription')}</Text>
{_renderDivider()}
{isForceUpdate ?
<TouchableOpacity onPress={() => onUpdatePressed()} style={styles.notNowContainerStyle}>
<Text
style={[styles.textNotNowStyle, {color: R.colors.main}]}>{I18n.t('Update')}</Text>
</TouchableOpacity>
:
<View style={[styles.notNowContainerStyle, {
flexDirection: 'row',
marginHorizontal: WIDTHXD(100),
}]}>
<TouchableOpacity onPress={() => cancelUpdate()}
style={[styles.btnButton, {paddingRight: WIDTHXD(90)}]}>
<Text
style={[styles.textNotNowStyle, {color: R.colors.color777}]}>{I18n.t('Cancel')}</Text>
</TouchableOpacity>
<View style={styles.dividerStyleVertical}></View>
<TouchableOpacity onPress={() => onUpdatePressed()}
style={[styles.btnButton, {paddingLeft: WIDTHXD(90)}]}>
<Text
style={[styles.textNotNowStyle, {color: R.colors.main}]}>{I18n.t('Update')}</Text>
</TouchableOpacity>
</View>
}
</View>
</View>
</Modal>
);
};
const styles = StyleSheet.create({
imageUpgradeStyle: {
width: 50,
height: 50,
tintColor: R.colors.primaryColor,
},
imageUpgradeContainer: {
width: 80,
height: 80,
borderRadius: 40,
backgroundColor: 'white',
alignItems: 'center',
justifyContent: 'center',
},
containerStyle: {
flex: 1,
width: getWidth() * 0.8,
alignSelf: 'center',
alignItems: 'center',
justifyContent: 'center',
},
contentContainerStyle: {
marginTop: -40,
paddingTop: 40,
width: getWidth() * 0.9,
backgroundColor: 'white',
alignItems: 'center',
justifyContent: 'center',
borderRadius: 15,
},
logoStyle: {
width: 65,
height: 65,
marginVertical: 20,
},
titleStyle: {
fontWeight: '600',
fontSize: 20,
color: 'black',
paddingHorizontal: 8,
textAlign: 'center',
},
versionLabelStyle: {
fontSize: 14,
color: R.colors.grey600,
marginTop: 5,
marginBottom: 15,
paddingHorizontal: 8,
textAlign: 'center',
},
descStyle: {
fontSize: getFontXD(46),
color: R.colors.grey900,
marginBottom: 20,
paddingHorizontal: 10,
textAlign: 'center',
},
notNowContainerStyle: {
height: HEIGHTXD(160),
width: '100%',
alignItems: 'center',
justifyContent: 'center',
},
btnButton: {
flex: 0,
},
textNotNowStyle: {
fontSize: getFontXD(46),
width: '100%',
textAlign: 'center',
color: R.colors.primaryColor,
},
starContainer: {
flexDirection: 'row',
width: '100%',
justifyContent: 'center',
alignItems: 'center',
height: 45,
},
dividerStyle: {
height: 0.5,
width: '100%',
backgroundColor: R.colors.borderC,
},
dividerStyleVertical: {
height: HEIGHTXD(160),
width: 0.5,
backgroundColor: R.colors.borderC,
},
});
export default VersionChecker;
......@@ -56,3 +56,8 @@ export const updateLangugeApi = async (body) =>
PostData(url.urlUpdateLanguage, body)
.then((res) => res)
.catch((err) => err);
export const getNewestVersionInfo = async (body) =>
GetData(url.urlGetNewestVersionInfo, body)
.then((res) => res)
.catch((err) => err);
......@@ -37,4 +37,5 @@ export default {
urlUpdateInforUser: root + 'api/v1/customers/update-general-info',
urlUpdateLanguage: root + 'api/v1/customers/update-language',
urlGetNewestVersionInfo: root + 'api/v1/settings/version',
};
......@@ -85,6 +85,7 @@ const images = {
iconHistoryMenu: require('./images/iconHistoryMenu1.png'),
iconProfileMenu: require('./images/iconProfileMenu.png'),
iconUpgrade: require('./images/iconUpgrade.png'),
};
export default images;
import {NativeModules} from 'react-native'
module.exports = NativeModules.InAppUpdate
export default {
greeting: 'Hi!',
home: 'Home',
contact: 'Contact',
setting: 'Setting',
SetLanguage: ' Set language',
MyProfile: 'My Profile',
VerifyAccount: 'Verify account',
Payments: 'Payments',
Rose: 'Rose',
TeamBonus: 'Team bonus',
MyPartner: 'My partner',
Account: 'Account',
Notification: 'Notification',
News: 'News',
Deposit: 'Deposit',
Withdraw: 'Withdraw',
Transfer: 'Transfer',
History: 'History',
NotVerified: 'Not verified',
Verified: 'Verified',
WaitVerification: 'Waiting verification',
AccountWallet: 'Account wallet',
Wallet: 'Wallet',
AccountCQG: 'Account CQG',
WaitOpenCQG: 'Wait open CQG',
OpenAccountCQG: 'Open account CQG',
AccountVerify: 'Account verify',
Profit: 'Profit',
RevenueTeam: 'Revenue team',
RevenueDonors: 'Revenue donors',
Invset: 'Invest',
Contract: 'Contract',
PaymentSetting: 'Payment method setting',
CustomerCare: 'Customer care',
Feedback: 'Feedback',
LegalDocument: 'Legal document',
Setting: 'Setting',
Logout: 'Logout',
SelectPaymentMethod: 'Select Payment Method',
InvestmentDeposit: 'Investment deposit',
ForgotPassword: 'Forgot password',
VerifyOTP: 'Verify OTP',
ChangeNewPassword: 'Change new password',
SendFeedback: 'Send feedback',
GeneralBusiness: 'General business',
Customer: 'Customer',
Partnership: 'Partnership',
AddPaymentMethod: 'Add payment method',
DetailMethod: 'Detail method',
Detail: 'Detail',
DetailVideo: 'Detail video',
NoData: 'No data!',
All: 'All',
PriceTable: 'Price table',
Chart: 'Chart',
Calendar: 'Calendar',
Fullname: 'Full name',
Birth: 'Birth',
Male: 'Male',
Status: 'Status',
Phone: 'Phone',
Enter_Phone: 'Enter phone',
Address: 'Address',
Update: 'Update',
ContactCode: 'Contact code',
TraddingAccountName: 'Tradding account name',
TraddingAccountNumber: 'Tradding account number',
GeneralInformation: 'General information',
Profile: 'Profile',
CustomerAgreement: 'Customer agreement',
BusinessAgreement: 'Business agreement',
PartnershipAgreement: 'Partnership agreement',
Waiting: 'Waiting',
Success: 'Success',
Ok: 'Ok',
Can_not_get_data: "Can't get data",
Search: 'Search',
NullDataSearch: 'Data not found',
greeting: 'Hi!',
home: 'Home',
contact: 'Contact',
setting: 'Setting',
SetLanguage: ' Set language',
MyProfile: 'My Profile',
VerifyAccount: 'Verify account',
Payments: 'Payments',
Rose: 'Rose',
TeamBonus: 'Team bonus',
MyPartner: 'My partner',
Account: 'Account',
Notification: 'Notification',
News: 'News',
Deposit: 'Deposit',
Withdraw: 'Withdraw',
Transfer: 'Transfer',
History: 'History',
NotVerified: 'Not verified',
Verified: 'Verified',
WaitVerification: 'Waiting verification',
AccountWallet: 'Account wallet',
Wallet: 'Wallet',
AccountCQG: 'Account CQG',
WaitOpenCQG: 'Wait open CQG',
OpenAccountCQG: 'Open account CQG',
AccountVerify: 'Account verify',
Profit: 'Profit',
RevenueTeam: 'Revenue team',
RevenueDonors: 'Revenue donors',
Invset: 'Invest',
Contract: 'Contract',
PaymentSetting: 'Payment method setting',
CustomerCare: 'Customer care',
Feedback: 'Feedback',
LegalDocument: 'Legal document',
Setting: 'Setting',
Logout: 'Logout',
SelectPaymentMethod: 'Select Payment Method',
InvestmentDeposit: 'Investment deposit',
ForgotPassword: 'Forgot password',
VerifyOTP: 'Verify OTP',
ChangeNewPassword: 'Change new password',
SendFeedback: 'Send feedback',
GeneralBusiness: 'General business',
Customer: 'Customer',
Partnership: 'Partnership',
AddPaymentMethod: 'Add payment method',
DetailMethod: 'Detail method',
Detail: 'Detail',
DetailVideo: 'Detail video',
NoData: 'No data!',
All: 'All',
PriceTable: 'Price table',
Chart: 'Chart',
Calendar: 'Calendar',
Fullname: 'Full name',
Birth: 'Birth',
Male: 'Male',
Status: 'Status',
Phone: 'Phone',
Enter_Phone: 'Enter phone',
Address: 'Address',
Update: 'Update',
ContactCode: 'Contact code',
TraddingAccountName: 'Tradding account name',
TraddingAccountNumber: 'Tradding account number',
GeneralInformation: 'General information',
Profile: 'Profile',
CustomerAgreement: 'Customer agreement',
BusinessAgreement: 'Business agreement',
PartnershipAgreement: 'Partnership agreement',
Waiting: 'Waiting',
Success: 'Success',
Ok: 'Ok',
Can_not_get_data: 'Can\'t get data',
Search: 'Search',
NullDataSearch: 'Data not found',
Cancel: 'Cancel',
Close: 'Close',
No_Internet: 'No internet',
Check_Internet_Connect: 'Check internet connect',
Retry: 'Retry',
Select_source_image: 'Select the source of the image',
Photo_library: 'Photo library',
Take_photo: 'Take a photo',
EnableCQG: 'Enable CQG',
Request_Open_Account_CQG: 'Request open account CQG',
Waiting_for_Progress: 'Waiting for progress',
PopupVerifyAccount:
'Your account is not verified. Go to account verification?',
PopupOpenCQG: 'Would you like to open a CQG account to make investments?',
Free: 'Free',
Open_account: 'Open account',
Provisional: 'Provisional',
Here: 'Here',
Open_account_demo: 'You can open a demo account',
Features_develop: 'No data!',
Language: 'Language',
Email: 'Email',
Password: 'Password',
Login: 'Login',
Register: 'Register',
Confirm_pass: 'Confirm password',
Code_introduce: 'Code introduce',
Account_already: 'Do you already have an account?',
Have_account: 'Do not have an account?',
Verify_code: 'Verification codes:',
Continue: 'Continue',
Re_send: 'Re send',
Copied: 'Copied!',
Please_fill_in: 'Please fill in ',
RequestFilter: 'Request filter',
FromDate: 'From date:',
ToDate: 'To date:',
Failed: 'Failed',
SelectRequestStatus: 'Select request status',
TopVideo: 'Video watching a lot',
Delete: 'Delete',
SelectBank: 'Select Bank',
Branch: 'Branch',
OwnerAccountName: 'Owner account name',
AccountNumber: 'Account Number',
DeletePaymentMethodConfirm: 'Do you went delete this payment method?',
Forbidden: 'Forbidden',
OwnerAccount: 'Owner Account',
Add: 'Add',
Note_cqg:
'Note: The fee is calculated on a monthly basis and is applied until the end of the day 30/12/2021',
CardType: 'Card type',
BankCode: 'Bank code',
CardNumberOrAccount: 'Card number/Account',
Confirm: 'Confirm',
AmountOfMoney: 'Amount of money',
Note: 'Note',
SourceAccount: 'Source account',
ChooseBeneficiaryAccount: 'Choose the beneficiary account',
BeneficiaryAccount: 'the beneficiary account',
FromWallet: 'From wallet',
FromCQGAccount: 'From CQG account',
SettingPaymentMethodConfirm:
'You have not the payment method. Go to payment method setting?',
EnterEmailRequest: 'Please enter email',
EnterEmail: 'Enter email',
GetVerificationCode: 'Get the verification code',
BackToLogin: 'Back to login',
OTPValidFiveMinute: 'The OTP code is valid for 5 minutes',
EnterNewPassword: 'Please enter a new password',
EnterNewPasswordHint: 'Enter a new password',
ReEnterPassword: 'Reenter password',
ConfirmNewPassword: 'Confirm new password',
ChangePasswordSuccess: 'Change password success',
EnterAllInfo: 'Please complete all information ',
Date: 'Date',
ReviewService: 'Review service of DCV Invest',
VeryBad: 'Very bad',
Bad: 'Bad',
Normal: 'Normal',
Good: 'Good',
VeryGood: 'Very good',
ShareYourFeel: 'Share your feel about service',
UploadImage: 'Upload image',
BonusMoney: 'Bonus money',
Content: 'Content',
CopyLink: 'Copied referral link ',
CardAccount: 'Card account',
FirstLastName: 'First and last name',
Name: 'Name',
PhoneNumber: 'Phone number',
IdentityCard: 'Identity card',
Passport: 'Passport',
CitizenIdentification: 'Citizen identification',
IdentityCardFrontPhoto: 'Photo on front of ID card',
IdentityCitizenCardFrontPhoto: 'Photo on front of ID/Citizen card',
IdentityCardBackPhoto: 'Photo on the back of ID card',
IdentityCitizenCardBackPhoto: 'Photo on the back of ID/Citizen card',
SignPhoto: 'Sign photo',
EnterOTPRequest: 'Please enter OTP code',
OTPInvalid: 'OTP code invalid',
Username: 'Username',
EnterPassword: 'Enter password',
ConfirmPassword: 'Confirm password',
RegisterAccountSuccess: 'Register account success!',
EnterReferralCode: 'Enter a referral code if available',
Male2: 'Male',
Female: 'Female',
Bank: 'Bank',
OwnerAccount2: 'Owner account',
NothingChange: 'Nothing change',
Tradding: 'Tradding',
ContractDescription: 'Contract description',
QualityStandard: 'Quality Standard',
CommodityTransactions: 'Commodity transactions',
CommodityCode: 'Commodity code',
Escrow: 'Escrow',
PositionLimit: 'Position limit',
PaymentMethod: 'Payment method',
TimeTransaction: 'Time transaction',
Time: 'Time',
TransactionSession: 'Transaction session',
MaturityMonth: 'Maturity month',
RegisteredDeliveryDate: 'Registered delivery date',
PriceInfo: 'Price Information',
ListedUnit: 'Listed unit',
PriceStep: 'Price step',
ContactSize: 'Contact size',
PriceRange: 'Price range',
FirstNotifyDate: 'First notify date',
EndlessTransactionDate: 'Endless transaction date',
Finance: 'Finance',
Support: 'Hỗ trợ',
Support_Customer: 'Support Customer',
Price_List: 'Price list',
Time_Transaction: 'Time transaction',
Due_Date: 'Due date',
Cancel: 'Cancel',
Close: 'Close',
No_Internet: 'No internet',
Check_Internet_Connect: 'Check internet connect',
Retry: 'Retry',
Select_source_image: 'Select the source of the image',
Photo_library: 'Photo library',
Take_photo: 'Take a photo',
EnableCQG: 'Enable CQG',
Request_Open_Account_CQG: 'Request open account CQG',
Waiting_for_Progress: 'Waiting for progress',
PopupVerifyAccount:
'Your account is not verified. Go to account verification?',
PopupOpenCQG: 'Would you like to open a CQG account to make investments?',
Free: 'Free',
Open_account: 'Open account',
Provisional: 'Provisional',
Here: 'Here',
Open_account_demo: 'You can open a demo account',
Features_develop: 'No data!',
Language: 'Language',
Email: 'Email',
Password: 'Password',
Login: 'Login',
Register: 'Register',
Confirm_pass: 'Confirm password',
Code_introduce: 'Code introduce',
Account_already: 'Do you already have an account?',
Have_account: 'Do not have an account?',
Verify_code: 'Verification codes:',
Continue: 'Continue',
Re_send: 'Re send',
Copied: 'Copied!',
Please_fill_in: 'Please fill in ',
RequestFilter: 'Request filter',
FromDate: 'From date:',
ToDate: 'To date:',
Failed: 'Failed',
SelectRequestStatus: 'Select request status',
TopVideo: 'Video watching a lot',
Delete: 'Delete',
SelectBank: 'Select Bank',
Branch: 'Branch',
OwnerAccountName: 'Owner account name',
AccountNumber: 'Account Number',
DeletePaymentMethodConfirm: 'Do you went delete this payment method?',
Forbidden: 'Forbidden',
OwnerAccount: 'Owner Account',
Add: 'Add',
Note_cqg:
'Note: The fee is calculated on a monthly basis and is applied until the end of the day 30/12/2021',
CardType: 'Card type',
BankCode: 'Bank code',
CardNumberOrAccount: 'Card number/Account',
Confirm: 'Confirm',
AmountOfMoney: 'Amount of money',
Note: 'Note',
SourceAccount: 'Source account',
ChooseBeneficiaryAccount: 'Choose the beneficiary account',
BeneficiaryAccount: 'the beneficiary account',
FromWallet: 'From wallet',
FromCQGAccount: 'From CQG account',
SettingPaymentMethodConfirm:
'You have not the payment method. Go to payment method setting?',
EnterEmailRequest: 'Please enter email',
EnterEmail: 'Enter email',
GetVerificationCode: 'Get the verification code',
BackToLogin: 'Back to login',
OTPValidFiveMinute: 'The OTP code is valid for 5 minutes',
EnterNewPassword: 'Please enter a new password',
EnterNewPasswordHint: 'Enter a new password',
ReEnterPassword: 'Reenter password',
ConfirmNewPassword: 'Confirm new password',
ChangePasswordSuccess: 'Change password success',
EnterAllInfo: 'Please complete all information ',
Date: 'Date',
ReviewService: 'Review service of DCV Invest',
VeryBad: 'Very bad',
Bad: 'Bad',
Normal: 'Normal',
Good: 'Good',
VeryGood: 'Very good',
ShareYourFeel: 'Share your feel about service',
UploadImage: 'Upload image',
BonusMoney: 'Bonus money',
Content: 'Content',
CopyLink: 'Copied referral link ',
CardAccount: 'Card account',
FirstLastName: 'First and last name',
Name: 'Name',
PhoneNumber: 'Phone number',
IdentityCard: 'Identity card',
Passport: 'Passport',
CitizenIdentification: 'Citizen identification',
IdentityCardFrontPhoto: 'Photo on front of ID card',
IdentityCitizenCardFrontPhoto: 'Photo on front of ID/Citizen card',
IdentityCardBackPhoto: 'Photo on the back of ID card',
IdentityCitizenCardBackPhoto: 'Photo on the back of ID/Citizen card',
SignPhoto: 'Sign photo',
EnterOTPRequest: 'Please enter OTP code',
OTPInvalid: 'OTP code invalid',
Username: 'Username',
EnterPassword: 'Enter password',
ConfirmPassword: 'Confirm password',
RegisterAccountSuccess: 'Register account success!',
EnterReferralCode: 'Enter a referral code if available',
Male2: 'Male',
Female: 'Female',
Bank: 'Bank',
OwnerAccount2: 'Owner account',
NothingChange: 'Nothing change',
Tradding: 'Tradding',
ContractDescription: 'Contract description',
QualityStandard: 'Quality Standard',
CommodityTransactions: 'Commodity transactions',
CommodityCode: 'Commodity code',
Escrow: 'Escrow',
PositionLimit: 'Position limit',
PaymentMethod: 'Payment method',
TimeTransaction: 'Time transaction',
Time: 'Time',
TransactionSession: 'Transaction session',
MaturityMonth: 'Maturity month',
RegisteredDeliveryDate: 'Registered delivery date',
PriceInfo: 'Price Information',
ListedUnit: 'Listed unit',
PriceStep: 'Price step',
ContactSize: 'Contact size',
PriceRange: 'Price range',
FirstNotifyDate: 'First notify date',
EndlessTransactionDate: 'Endless transaction date',
Finance: 'Finance',
Support: 'Hỗ trợ',
Support_Customer: 'Support Customer',
Price_List: 'Price list',
Time_Transaction: 'Time transaction',
Due_Date: 'Due date',
Version: 'Version',
UpdateDescription: 'A new version of DCVInvest is available. Update now to continue using and experiencing the latest system features!',
};
......@@ -220,4 +220,6 @@ export default {
Time_Transaction: 'Thời gian GD',
Due_Date: 'Lịch đáo hạn',
Enter_Phone: 'Nhập số điện thoại',
Version: 'Phiên bản',
UpdateDescription: 'Đã có phiên bản DCVInvest mới. Cập nhật ngay để tiếp tục sử dụng và trải nghiệm những tính năng mới nhất của hệ thống!',
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment