gamebrary/src/pages/Wallpapers.vue

169 lines
4 KiB
Vue
Raw Normal View History

<template lang="html">
2021-01-20 21:21:06 +00:00
<b-container>
2020-11-23 23:15:29 +00:00
<empty-state
v-if="showEmptyState"
:title="$t('wallpapers.title')"
message="Upload a wallpaper to customize your boards"
action-text="Upload a wallpaper"
:busy="saving"
@action="triggerFileUpload"
/>
2020-11-21 06:32:14 +00:00
2020-11-23 23:15:29 +00:00
<template v-else>
<div class="d-flex justify-content-between align-items-center mb-3">
<h3 class="m-0">
{{ $t('wallpapers.title') }}
</h3>
2021-02-21 01:46:38 +00:00
<div class="space-used d-none d-sm-inline ml-auto mr-3 pt-3">
2021-02-18 00:50:37 +00:00
<small
class="d-block text-center"
:class="{ 'text-danger': outOfSpace }"
v-text="usedSpaceText"
/>
2021-02-03 22:57:07 +00:00
<b-progress
:value="spaceUsed"
:max="maxSpace"
:variant="outOfSpace ? 'danger' : 'success'"
class="mb-3"
/>
</div>
2020-11-23 23:15:29 +00:00
<b-button
variant="primary"
2020-12-15 05:34:36 +00:00
:disabled="outOfSpace"
2020-11-23 23:15:29 +00:00
@click="triggerFileUpload"
>
2021-01-20 21:21:06 +00:00
<b-spinner small v-if="saving" />
<template v-else>
<i class="fas fa-upload fa-fw" aria-hidden />
2021-01-20 21:21:06 +00:00
<span class="d-none d-sm-inline">Upload</span>
</template>
2020-11-23 23:15:29 +00:00
</b-button>
</div>
<b-alert
v-if="isDuplicate && !saving && file && file.name"
show
dismissible
variant="warning"
>
{{ $t('wallpapers.form.duplicateMessage', { fileName: file.name }) }}
</b-alert>
2021-02-21 01:46:38 +00:00
<wallpapers-list v-if="wallpapers.length" />
2020-11-23 23:15:29 +00:00
<b-alert show v-else>You don't have any wallpapers.</b-alert>
</template>
2021-01-20 21:21:06 +00:00
<b-form-file
class="d-none file-input"
v-model="file"
accept="image/*"
:browse-text="$t('wallpapers.form.upload')"
:placeholder="$t('wallpapers.form.placeholder')"
@input="uploadWallpaper"
/>
2020-11-21 06:32:14 +00:00
</b-container>
</template>
<script>
2020-10-14 00:35:40 +00:00
import { mapState, mapGetters } from 'vuex';
2020-11-23 23:15:29 +00:00
import EmptyState from '@/components/EmptyState';
2021-02-18 00:50:37 +00:00
import { bytesToSize } from '@/utils';
import WallpapersList from '@/components/WallpapersList';
export default {
2020-11-23 23:15:29 +00:00
components: {
EmptyState,
2021-02-18 00:50:37 +00:00
WallpapersList,
2020-11-23 23:15:29 +00:00
},
data() {
return {
file: null,
saving: false,
loading: false,
2020-11-21 06:32:14 +00:00
isPaid: true,
2020-12-15 05:34:36 +00:00
maxSpace: '67108864', // 64mb storage limit
wallpaperUrls: [],
};
},
computed: {
...mapState(['user', 'board', 'wallpapers']),
2021-02-21 18:14:46 +00:00
...mapGetters(['darkTheme']),
2021-02-18 00:50:37 +00:00
usedSpaceText() {
return `${this.formattedSpaceUsed} of ${bytesToSize(this.maxSpace)} used`;
},
existingFiles() {
return this.wallpapers.map(({ name }) => name);
},
2020-11-23 23:15:29 +00:00
showEmptyState() {
return this.wallpapers.length === 0;
},
isDuplicate() {
const { file, existingFiles } = this;
return file && file.name && existingFiles.includes(file.name);
},
2020-11-21 06:32:14 +00:00
formattedSpaceUsed() {
return this.spaceUsed
2021-02-18 00:50:37 +00:00
? bytesToSize(this.spaceUsed)
: 0;
2020-11-21 06:32:14 +00:00
},
2020-12-15 05:34:36 +00:00
spaceUsed() {
2021-02-01 19:31:22 +00:00
return this.wallpapers.reduce((total, file) => total + file.metadata.size || 0, 0);
2020-12-15 05:34:36 +00:00
},
outOfSpace() {
return this.spaceUsed >= this.maxSpace;
},
},
methods: {
2020-11-21 14:31:02 +00:00
triggerFileUpload() {
document.querySelector('.file-input input').click();
},
2020-11-01 16:20:48 +00:00
uploadWallpaper() {
2020-10-31 17:43:20 +00:00
if (this.isDuplicate) {
2020-12-10 05:26:57 +00:00
return this.$bvToast.toast('File already exists', { variant: 'warning' });
2020-10-31 17:43:20 +00:00
}
if (!this.file) {
2020-11-01 16:20:48 +00:00
return false;
2020-10-31 17:43:20 +00:00
}
this.saving = true;
2020-11-01 16:20:48 +00:00
return this.$store.dispatch('UPLOAD_WALLPAPER', this.file)
2020-10-31 17:43:20 +00:00
.then(() => {
2020-12-10 05:26:57 +00:00
this.$bvToast.toast('File uploaded');
2020-10-31 17:43:20 +00:00
this.file = null;
this.saving = false;
this.$bus.$emit('WALLPAPER_UPLOADED');
})
.catch(() => {
this.saving = false;
2020-12-10 05:26:57 +00:00
this.$bvToast.toast('There was an error uploading wallpaper', { variant: 'danger' });
});
},
},
};
</script>
<style lang="scss" rel="stylesheet/scss" scoped>
2021-02-03 22:57:07 +00:00
.space-used {
width: 120px;
}
</style>