code refactor

This commit is contained in:
MaysWind
2023-06-25 00:25:43 +08:00
parent e3d1a476e2
commit f72763306d
10 changed files with 106 additions and 149 deletions
+50
View File
@@ -0,0 +1,50 @@
<template>
<v-snackbar v-model="showState">
{{ messageContent }}
<template #actions>
<v-btn color="primary" variant="text" @click="showState = false">{{ $t('Close') }}</v-btn>
</template>
</v-snackbar>
</template>
<script>
export default {
props: [
'show',
'message'
],
emits: [
'update:show'
],
expose: [
'showMessage',
'showError'
],
data() {
const self = this;
return {
showState: self.show,
messageContent: self.message,
resolve: null,
reject: null
}
},
watch: {
'showState': function (newValue) {
this.$emit('update:show', newValue);
}
},
methods: {
showMessage(message) {
this.showState = true;
this.messageContent = this.$t(message);
},
showError(error) {
this.showState = true;
this.messageContent = this.$tError(error.message || error);
}
}
}
</script>
+6
View File
@@ -55,6 +55,7 @@ import {
import AmountInput from '@/components/desktop/AmountInput.vue'; import AmountInput from '@/components/desktop/AmountInput.vue';
import ConfirmDialog from '@/components/desktop/ConfirmDialog.vue'; import ConfirmDialog from '@/components/desktop/ConfirmDialog.vue';
import Snackbar from '@/components/desktop/Snackbar.vue';
import '@/styles/desktop/template/base/libs/vuetify/_index.scss'; import '@/styles/desktop/template/base/libs/vuetify/_index.scss';
import '@/styles/desktop/template/template/index.scss'; import '@/styles/desktop/template/template/index.scss';
@@ -221,6 +222,8 @@ const vuetify = createVuetify({
'info': '#2196f3', 'info': '#2196f3',
'warning': '#ff9500', 'warning': '#ff9500',
'error': '#ff3b30', 'error': '#ff3b30',
'income': '#ff3b30',
'expense': '#009688',
'on-primary': '#ffffff', 'on-primary': '#ffffff',
'on-success': '#ffffff', 'on-success': '#ffffff',
'on-warning': '#ffffff', 'on-warning': '#ffffff',
@@ -269,6 +272,8 @@ const vuetify = createVuetify({
'info': '#2196f3', 'info': '#2196f3',
'warning': '#ff9500', 'warning': '#ff9500',
'error': '#ff3b30', 'error': '#ff3b30',
'income': '#ff3b30',
'expense': '#009688',
'on-primary': '#ffffff', 'on-primary': '#ffffff',
'on-success': '#ffffff', 'on-success': '#ffffff',
'on-warning': '#ffffff', 'on-warning': '#ffffff',
@@ -322,6 +327,7 @@ app.component('VueDatePicker', VueDatePicker);
app.component('AmountInput', AmountInput); app.component('AmountInput', AmountInput);
app.component('ConfirmDialog', ConfirmDialog); app.component('ConfirmDialog', ConfirmDialog);
app.component('Snackbar', Snackbar);
app.config.globalProperties.$version = getVersion(); app.config.globalProperties.$version = getVersion();
app.config.globalProperties.$buildTime = getBuildTime(); app.config.globalProperties.$buildTime = getBuildTime();
+4 -16
View File
@@ -76,13 +76,7 @@
</v-col> </v-col>
</v-row> </v-row>
<v-snackbar v-model="showSnackbar"> <snackbar ref="snackbar" />
{{ snackbarMessage }}
<template #actions>
<v-btn color="primary" variant="text" @click="showSnackbar = false">{{ $t('Close') }}</v-btn>
</template>
</v-snackbar>
</template> </template>
<script> <script>
@@ -105,8 +99,6 @@ export default {
baseCurrency: userStore.currentUserDefaultCurrency, baseCurrency: userStore.currentUserDefaultCurrency,
baseAmount: '1', baseAmount: '1',
loading: false, loading: false,
showSnackbar: false,
snackbarMessage: '',
icons: { icons: {
refresh: mdiRefresh refresh: mdiRefresh
} }
@@ -157,7 +149,7 @@ export default {
} }
} }
this.showSnackbarMessage(this.$t('There is no exchange rates data for your default currency')); this.$refs.snackbar.showMessage('There is no exchange rates data for your default currency');
}, },
methods: { methods: {
update() { update() {
@@ -173,12 +165,12 @@ export default {
force: true force: true
}).then(() => { }).then(() => {
self.loading = false; self.loading = false;
self.showSnackbarMessage(self.$t('Exchange rates data has been updated')); self.$refs.snackbar.showMessage('Exchange rates data has been updated');
}).catch(error => { }).catch(error => {
self.loading = false; self.loading = false;
if (!error.processed) { if (!error.processed) {
self.showSnackbarMessage(self.$tError(error.message || error)); self.$refs.snackbar.showError(error);
} }
}); });
}, },
@@ -221,10 +213,6 @@ export default {
const trimmedRateStr = rateStr.substring(0, Math.max(6, Math.max(firstNonZeroPos, rateStr.indexOf('.') + 2))); const trimmedRateStr = rateStr.substring(0, Math.max(6, Math.max(firstNonZeroPos, rateStr.indexOf('.') + 2)));
return appendThousandsSeparator(trimmedRateStr); return appendThousandsSeparator(trimmedRateStr);
} }
},
showSnackbarMessage(message) {
this.showSnackbar = true;
this.snackbarMessage = message;
} }
} }
} }
+3 -15
View File
@@ -97,13 +97,7 @@
</v-col> </v-col>
</v-row> </v-row>
<v-snackbar v-model="showSnackbar"> <snackbar ref="snackbar" />
{{ snackbarMessage }}
<template #actions>
<v-btn color="primary" variant="text" @click="showSnackbar = false">{{ $t('Close') }}</v-btn>
</template>
</v-snackbar>
</template> </template>
<script> <script>
@@ -147,8 +141,6 @@ export default {
loadingOverview: true, loadingOverview: true,
todayFirstUnixTime: getTodayFirstUnixTime(), todayFirstUnixTime: getTodayFirstUnixTime(),
todayLastUnixTime: getTodayLastUnixTime(), todayLastUnixTime: getTodayLastUnixTime(),
showSnackbar: false,
snackbarMessage: '',
icons: { icons: {
refresh: mdiRefresh, refresh: mdiRefresh,
eye: mdiEyeOutline, eye: mdiEyeOutline,
@@ -279,13 +271,13 @@ export default {
self.loadingOverview = false; self.loadingOverview = false;
if (force) { if (force) {
self.showSnackbarMessage(self.$t('Data has been updated')); self.$refs.snackbar.showMessage('Data has been updated');
} }
}).catch(error => { }).catch(error => {
self.loadingOverview = false; self.loadingOverview = false;
if (!error.processed) { if (!error.processed) {
self.showSnackbarMessage(self.$tError(error.message || error)); self.$refs.snackbar.showError(error);
} }
}); });
}, },
@@ -295,10 +287,6 @@ export default {
} }
return this.$locale.getDisplayCurrency(amount, this.defaultCurrency) + (incomplete ? '+' : ''); return this.$locale.getDisplayCurrency(amount, this.defaultCurrency) + (incomplete ? '+' : '');
},
showSnackbarMessage(message) {
this.showSnackbar = true;
this.snackbarMessage = message;
} }
} }
} }
+7 -19
View File
@@ -117,13 +117,7 @@
</v-card-text> </v-card-text>
</v-card> </v-card>
<v-snackbar v-model="showSnackbar"> <snackbar ref="snackbar" />
{{ snackbarMessage }}
<template #actions>
<v-btn color="primary" variant="text" @click="showSnackbar = false">{{ $t('Close') }}</v-btn>
</template>
</v-snackbar>
<v-overlay class="justify-center align-center" :persistent="true" v-model="logining"> <v-overlay class="justify-center align-center" :persistent="true" v-model="logining">
<v-progress-circular indeterminate></v-progress-circular> <v-progress-circular indeterminate></v-progress-circular>
@@ -163,8 +157,6 @@ export default {
verifying: false, verifying: false,
show2faInput: false, show2faInput: false,
twoFAVerifyType: 'passcode', twoFAVerifyType: 'passcode',
showSnackbar: false,
snackbarMessage: '',
icons: { icons: {
eye: mdiEyeOutline, eye: mdiEyeOutline,
eyeSlash: mdiEyeOffOutline, eyeSlash: mdiEyeOffOutline,
@@ -211,12 +203,12 @@ export default {
const self = this; const self = this;
if (!self.username) { if (!self.username) {
self.showSnackbarMessage(self.$t('Username cannot be empty')); self.$refs.snackbar.showMessage('Username cannot be empty');
return; return;
} }
if (!self.password) { if (!self.password) {
self.showSnackbarMessage(self.$t('Password cannot be empty')); self.$refs.snackbar.showMessage('Password cannot be empty');
return; return;
} }
@@ -266,7 +258,7 @@ export default {
self.logining = false; self.logining = false;
if (!error.processed) { if (!error.processed) {
self.showSnackbarMessage(self.$tError(error.message || error)); self.$refs.snackbar.showError(error);
} }
}); });
}, },
@@ -278,10 +270,10 @@ export default {
} }
if (this.twoFAVerifyType === 'passcode' && !this.passcode) { if (this.twoFAVerifyType === 'passcode' && !this.passcode) {
self.showSnackbarMessage(self.$t('Passcode cannot be empty')); self.$refs.snackbar.showMessage('Passcode cannot be empty');
return; return;
} else if (this.twoFAVerifyType === 'backupcode' && !this.backupCode) { } else if (this.twoFAVerifyType === 'backupcode' && !this.backupCode) {
self.showSnackbarMessage(self.$t('Backup code cannot be empty')); self.$refs.snackbar.showMessage('Backup code cannot be empty');
return; return;
} }
@@ -308,7 +300,7 @@ export default {
self.verifying = false; self.verifying = false;
if (!error.processed) { if (!error.processed) {
self.showSnackbarMessage(self.$tError(error.message || error)); self.$refs.snackbar.showError(error);
} }
}); });
}, },
@@ -322,10 +314,6 @@ export default {
changeLanguage(locale) { changeLanguage(locale) {
const localeDefaultSettings = this.$locale.setLanguage(locale); const localeDefaultSettings = this.$locale.setLanguage(locale);
this.settingsStore.updateLocalizedDefaultSettings(localeDefaultSettings); this.settingsStore.updateLocalizedDefaultSettings(localeDefaultSettings);
},
showSnackbarMessage(message) {
this.showSnackbar = true;
this.snackbarMessage = message;
} }
} }
} }
+2 -14
View File
@@ -185,13 +185,7 @@
<v-progress-circular indeterminate></v-progress-circular> <v-progress-circular indeterminate></v-progress-circular>
</v-overlay> </v-overlay>
<v-snackbar v-model="showSnackbar"> <snackbar ref="snackbar" />
{{ snackbarMessage }}
<template #actions>
<v-btn color="red" variant="text" @click="showSnackbar = false">{{ $t('Close') }}</v-btn>
</template>
</v-snackbar>
</div> </div>
</template> </template>
@@ -236,8 +230,6 @@ export default {
showVerticalOverlayMenu: false, showVerticalOverlayMenu: false,
showLoading: false, showLoading: false,
showMobileQrCode: false, showMobileQrCode: false,
showSnackbar: false,
snackbarMessage: '',
icons: { icons: {
menu: mdiMenu, menu: mdiMenu,
overview: mdiHomeOutline, overview: mdiHomeOutline,
@@ -321,13 +313,9 @@ export default {
self.showLoading = false; self.showLoading = false;
if (!error.processed) { if (!error.processed) {
self.showSnackbarMessage(self.$tError(error.message || error)); self.$refs.snackbar.showError(error);
} }
}); });
},
showSnackbarMessage(message) {
this.showSnackbar = true;
this.snackbarMessage = message;
} }
} }
} }
@@ -170,14 +170,7 @@
</v-row> </v-row>
<confirm-dialog ref="confirmDialog"/> <confirm-dialog ref="confirmDialog"/>
<snackbar ref="snackbar" />
<v-snackbar v-model="showSnackbar">
{{ snackbarMessage }}
<template #actions>
<v-btn color="primary" variant="text" @click="showSnackbar = false">{{ $t('Close') }}</v-btn>
</template>
</v-snackbar>
</template> </template>
<script> <script>
@@ -224,9 +217,7 @@ export default {
shortTimeFormat: 0 shortTimeFormat: 0
}, },
loading: true, loading: true,
saving: false, saving: false
showSnackbar: false,
snackbarMessage: ''
}; };
}, },
computed: { computed: {
@@ -380,7 +371,7 @@ export default {
self.loading = false; self.loading = false;
if (!error.processed) { if (!error.processed) {
self.showSnackbarMessage(self.$tError(error.message || error)); self.$refs.snackbar.showError(error);
} }
}); });
}, },
@@ -391,7 +382,7 @@ export default {
const problemMessage = self.inputIsNotChangedProblemMessage || self.inputInvalidProblemMessage || self.extendInputInvalidProblemMessage || self.langAndRegionInputInvalidProblemMessage; const problemMessage = self.inputIsNotChangedProblemMessage || self.inputInvalidProblemMessage || self.extendInputInvalidProblemMessage || self.langAndRegionInputInvalidProblemMessage;
if (problemMessage) { if (problemMessage) {
self.showSnackbarMessage(self.$t(problemMessage)); self.$refs.snackbar.showMessage(problemMessage);
return; return;
} }
@@ -409,12 +400,12 @@ export default {
self.settingsStore.updateLocalizedDefaultSettings(localeDefaultSettings); self.settingsStore.updateLocalizedDefaultSettings(localeDefaultSettings);
} }
self.showSnackbarMessage(self.$t('Your profile has been successfully updated')); self.$refs.snackbar.showMessage('Your profile has been successfully updated');
}).catch(error => { }).catch(error => {
self.saving = false; self.saving = false;
if (!error.processed) { if (!error.processed) {
self.showSnackbarMessage(self.$tError(error.message || error)); self.$refs.snackbar.showError(error);
} }
}); });
}, },
@@ -445,10 +436,6 @@ export default {
this.newProfile.shortDateFormat = this.oldProfile.shortDateFormat; this.newProfile.shortDateFormat = this.oldProfile.shortDateFormat;
this.newProfile.longTimeFormat = this.oldProfile.longTimeFormat; this.newProfile.longTimeFormat = this.oldProfile.longTimeFormat;
this.newProfile.shortTimeFormat = this.oldProfile.shortTimeFormat; this.newProfile.shortTimeFormat = this.oldProfile.shortTimeFormat;
},
showSnackbarMessage(message) {
this.showSnackbar = true;
this.snackbarMessage = message;
} }
} }
}; };
@@ -137,14 +137,7 @@
</v-row> </v-row>
<confirm-dialog ref="confirmDialog"/> <confirm-dialog ref="confirmDialog"/>
<snackbar ref="snackbar" />
<v-snackbar v-model="showSnackbar">
{{ snackbarMessage }}
<template #actions>
<v-btn color="primary" variant="text" @click="showSnackbar = false">{{ $t('Close') }}</v-btn>
</template>
</v-snackbar>
</template> </template>
<script> <script>
@@ -176,8 +169,6 @@ export default {
currentPasswordForClearData: '', currentPasswordForClearData: '',
isCurrentPasswordVisible: false, isCurrentPasswordVisible: false,
clearingData: false, clearingData: false,
showSnackbar: false,
snackbarMessage: '',
icons: { icons: {
refresh: mdiRefresh, refresh: mdiRefresh,
transactions: mdiListBoxOutline, transactions: mdiListBoxOutline,
@@ -237,7 +228,7 @@ export default {
self.loadingDataStatistics = false; self.loadingDataStatistics = false;
if (!error.processed) { if (!error.processed) {
self.showSnackbarMessage(self.$tError(error.message || error)); self.$refs.snackbar.showError(error);
} }
}); });
}, },
@@ -257,7 +248,7 @@ export default {
self.exportingData = false; self.exportingData = false;
if (!error.processed) { if (!error.processed) {
self.showSnackbarMessage(self.$tError(error.message || error)); self.$refs.snackbar.showError(error);
} }
}); });
}, },
@@ -265,7 +256,7 @@ export default {
const self = this; const self = this;
if (!self.currentPasswordForClearData) { if (!self.currentPasswordForClearData) {
self.showSnackbarMessage(self.$t('Current password cannot be empty')); self.$refs.snackbar.showMessage('Current password cannot be empty');
return; return;
} }
@@ -282,20 +273,16 @@ export default {
}).then(() => { }).then(() => {
self.clearingData = false; self.clearingData = false;
self.showSnackbarMessage(self.$t('All user data has been cleared')); self.$refs.snackbar.showMessage('All user data has been cleared');
self.reloadUserDataStatistics(); self.reloadUserDataStatistics();
}).catch(error => { }).catch(error => {
self.clearingData = false; self.clearingData = false;
if (!error.processed) { if (!error.processed) {
self.showSnackbarMessage(self.$tError(error.message || error)); self.$refs.snackbar.showError(error);
} }
}); });
}); });
},
showSnackbarMessage(message) {
this.showSnackbar = true;
this.snackbarMessage = message;
} }
} }
} }
@@ -119,14 +119,7 @@
</v-row> </v-row>
<confirm-dialog ref="confirmDialog"/> <confirm-dialog ref="confirmDialog"/>
<snackbar ref="snackbar" />
<v-snackbar v-model="showSnackbar">
{{ snackbarMessage }}
<template #actions>
<v-btn color="primary" variant="text" @click="showSnackbar = false">{{ $t('Close') }}</v-btn>
</template>
</v-snackbar>
</template> </template>
<script> <script>
@@ -162,8 +155,6 @@ export default {
isConfirmPasswordVisible: false, isConfirmPasswordVisible: false,
updatingPassword: false, updatingPassword: false,
loadingSession: true, loadingSession: true,
showSnackbar: false,
snackbarMessage: '',
icons: { icons: {
refresh: mdiRefresh, refresh: mdiRefresh,
eye: mdiEyeOutline, eye: mdiEyeOutline,
@@ -223,7 +214,7 @@ export default {
self.loadingSession = false; self.loadingSession = false;
if (!error.processed) { if (!error.processed) {
self.showSnackbarMessage(self.$tError(error.message || error)); self.$refs.snackbar.showError(error);
} }
}); });
}, },
@@ -234,7 +225,7 @@ export default {
const problemMessage = self.inputProblemMessage; const problemMessage = self.inputProblemMessage;
if (problemMessage) { if (problemMessage) {
self.showSnackbarMessage(self.$t(problemMessage)); self.$refs.snackbar.showMessage(problemMessage);
return; return;
} }
@@ -260,13 +251,13 @@ export default {
self.settingsStore.updateLocalizedDefaultSettings(localeDefaultSettings); self.settingsStore.updateLocalizedDefaultSettings(localeDefaultSettings);
} }
self.showSnackbarMessage(self.$t('Your profile has been successfully updated')); self.$refs.snackbar.showMessage('Your profile has been successfully updated');
}).catch(error => { }).catch(error => {
self.updatingPassword = false; self.updatingPassword = false;
self.currentPassword = ''; self.currentPassword = '';
if (!error.processed) { if (!error.processed) {
self.showSnackbarMessage(self.$tError(error.message || error)); self.$refs.snackbar.showError(error);
} }
}); });
}, },
@@ -277,9 +268,9 @@ export default {
self.tokensStore.getAllTokens().then(tokens => { self.tokensStore.getAllTokens().then(tokens => {
if (isEquals(self.tokens, tokens)) { if (isEquals(self.tokens, tokens)) {
self.showSnackbarMessage(this.$t('Session list is up to date')); self.$refs.snackbar.showMessage('Session list is up to date');
} else { } else {
self.showSnackbarMessage(this.$t('Session list has been updated')); self.$refs.snackbar.showMessage('Session list has been updated');
} }
self.tokens = tokens; self.tokens = tokens;
@@ -288,7 +279,7 @@ export default {
self.loadingSession = false; self.loadingSession = false;
if (!error.processed) { if (!error.processed) {
self.showSnackbarMessage(self.$tError(error.message || error)); self.$refs.snackbar.showError(error);
} }
}); });
}, },
@@ -312,7 +303,7 @@ export default {
self.loadingSession = false; self.loadingSession = false;
if (!error.processed) { if (!error.processed) {
self.showSnackbarMessage(self.$tError(error.message || error)); self.$refs.snackbar.showError(error);
} }
}); });
}); });
@@ -336,12 +327,12 @@ export default {
} }
} }
self.showSnackbarMessage(this.$t('You have logged out all other sessions')); self.$refs.snackbar.showMessage('You have logged out all other sessions');
}).catch(error => { }).catch(error => {
self.loadingSession = false self.loadingSession = false
if (!error.processed) { if (!error.processed) {
self.showSnackbarMessage(self.$tError(error.message || error)); self.$refs.snackbar.showError(error);
} }
}); });
}); });
@@ -364,10 +355,6 @@ export default {
} else { } else {
return mdiDevices; return mdiDevices;
} }
},
showSnackbarMessage(message) {
this.showSnackbar = true;
this.snackbarMessage = message;
} }
} }
}; };
@@ -100,13 +100,7 @@
</v-col> </v-col>
</v-row> </v-row>
<v-snackbar v-model="showSnackbar"> <snackbar ref="snackbar" />
{{ snackbarMessage }}
<template #actions>
<v-btn color="primary" variant="text" @click="showSnackbar = false">{{ $t('Close') }}</v-btn>
</template>
</v-snackbar>
</template> </template>
<script> <script>
@@ -137,8 +131,6 @@ export default {
disabling: false, disabling: false,
regenerating: false, regenerating: false,
clipboardHolder: null, clipboardHolder: null,
showSnackbar: false,
snackbarMessage: '',
icons: { icons: {
eye: mdiEyeOutline, eye: mdiEyeOutline,
eyeSlash: mdiEyeOffOutline, eyeSlash: mdiEyeOffOutline,
@@ -161,7 +153,7 @@ export default {
self.loading = false; self.loading = false;
if (!error.processed) { if (!error.processed) {
self.showSnackbarMessage(self.$tError(error.message || error)); self.$refs.snackbar.showError(error);
} }
}); });
}, },
@@ -191,7 +183,7 @@ export default {
self.enabling = false; self.enabling = false;
if (!error.processed) { if (!error.processed) {
self.showSnackbarMessage(self.$tError(error.message || error)); self.$refs.snackbar.showError(error);
} }
}); });
}, },
@@ -199,7 +191,7 @@ export default {
const self = this; const self = this;
if (!self.currentPasscode) { if (!self.currentPasscode) {
self.showSnackbarMessage(self.$t('Passcode cannot be empty')); self.$refs.snackbar.showMessage('Passcode cannot be empty');
return; return;
} }
@@ -236,7 +228,7 @@ export default {
self.enableConfirming = false; self.enableConfirming = false;
if (!error.processed) { if (!error.processed) {
self.showSnackbarMessage(self.$tError(error.message || error)); self.$refs.snackbar.showError(error);
} }
}); });
}, },
@@ -244,7 +236,7 @@ export default {
const self = this; const self = this;
if (!self.currentPassword) { if (!self.currentPassword) {
self.showSnackbarMessage(self.$t('Current password cannot be empty')); self.$refs.snackbar.showMessage('Current password cannot be empty');
return; return;
} }
@@ -265,12 +257,12 @@ export default {
self.disabling = false; self.disabling = false;
self.status = false; self.status = false;
self.showSnackbarMessage(self.$t('Two factor authentication has been disabled')); self.$refs.snackbar.showMessage('Two factor authentication has been disabled');
}).catch(error => { }).catch(error => {
self.disabling = false; self.disabling = false;
if (!error.processed) { if (!error.processed) {
self.showSnackbarMessage(self.$tError(error.message || error)); self.$refs.snackbar.showError(error);
} }
}); });
}, },
@@ -278,7 +270,7 @@ export default {
const self = this; const self = this;
if (!self.currentPassword) { if (!self.currentPassword) {
self.showSnackbarMessage(self.$t('Current password cannot be empty')); self.$refs.snackbar.showMessage('Current password cannot be empty');
return; return;
} }
@@ -307,7 +299,7 @@ export default {
self.regenerating = false; self.regenerating = false;
if (!error.processed) { if (!error.processed) {
self.showSnackbarMessage(self.$tError(error.message || error)); self.$refs.snackbar.showError(error);
} }
}); });
}, },
@@ -323,14 +315,10 @@ export default {
el: '#copy-to-clipboard-icon', el: '#copy-to-clipboard-icon',
text: self.currentBackupCode, text: self.currentBackupCode,
successCallback: function () { successCallback: function () {
self.showSnackbarMessage(self.$t('Backup codes copied')); self.$refs.snackbar.showMessage('Backup codes copied');
} }
}); });
} }
},
showSnackbarMessage(message) {
this.showSnackbar = true;
this.snackbarMessage = message;
} }
} }
}; };