gamebrary/src/components/Game/GameProgress.vue

133 lines
3.2 KiB
Vue
Raw Normal View History

2020-08-22 12:21:15 +00:00
<template lang="html">
<b-button
v-b-modal.progress
2020-09-24 04:15:31 +00:00
v-b-tooltip.hover
2020-08-22 12:21:15 +00:00
variant="info"
2020-11-03 22:12:49 +00:00
:title="$t('progresses.modalTitle')"
2020-08-22 12:21:15 +00:00
>
2020-10-08 17:55:26 +00:00
<icon name="clock" white />
2020-08-22 12:21:15 +00:00
<b-modal
id="progress"
2020-10-14 00:08:56 +00:00
:header-bg-variant="nightMode ? 'dark' : null"
:header-text-variant="nightMode ? 'white' : null"
:body-bg-variant="nightMode ? 'dark' : null"
:body-text-variant="nightMode ? 'white' : null"
:footer-bg-variant="nightMode ? 'dark' : null"
:footer-text-variant="nightMode ? 'white' : null"
2020-11-03 22:12:49 +00:00
footer-class="d-flex justify-content-between pt-0"
2020-08-22 12:21:15 +00:00
@show="show"
>
2020-10-14 00:09:37 +00:00
<template v-slot:modal-header="{ close }">
<modal-header
2020-11-03 22:12:49 +00:00
:title="$t('progresses.modalTitle')"
2020-10-14 21:47:02 +00:00
@close="close"
/>
2020-10-14 00:09:37 +00:00
</template>
2020-11-03 22:12:49 +00:00
<b-input-group :prepend="`${localProgress}%`" size="lg">
2020-08-22 12:21:15 +00:00
<b-form-input
size="lg"
v-model="localProgress"
type="range"
max="100"
step="5"
/>
</b-input-group>
<template v-slot:modal-footer>
<b-button
variant="danger"
:disabled="deleting"
@click="deleteProgress"
>
<b-spinner small v-if="deleting" />
2020-11-03 22:12:49 +00:00
<span v-else>{{ $t('global.delete') }}</span>
2020-08-22 12:21:15 +00:00
</b-button>
<b-button
variant="primary"
:disabled="saving"
@click="saveProgress"
>
<b-spinner small v-if="saving" />
2020-11-03 22:12:49 +00:00
<span v-else>{{ $t('global.save') }}</span>
2020-08-22 12:21:15 +00:00
</b-button>
</template>
</b-modal>
</b-button>
</template>
<script>
2020-10-14 00:08:56 +00:00
import { mapState, mapGetters } from 'vuex';
2020-08-22 12:21:15 +00:00
export default {
props: {
game: Object,
},
data() {
return {
localProgress: '0',
saving: false,
deleting: false,
};
},
computed: {
...mapState(['progresses']),
2020-10-14 00:08:56 +00:00
...mapGetters(['nightMode']),
2020-08-22 12:21:15 +00:00
},
methods: {
show() {
const { id } = this.game;
this.localProgress = this.progresses[id]
? JSON.parse(JSON.stringify(this.progresses[id]))
: '0';
this.saving = false;
this.deleting = false;
},
async deleteProgress() {
const { id, name } = this.game;
this.deleting = true;
this.$store.commit('REMOVE_GAME_PROGRESS', id);
await this.$store.dispatch('SAVE_PROGRESSES_NO_MERGE')
.catch(() => {
this.$bvToast.toast('There was an error deleting your progress', { title: `${name} progress`, variant: 'error' });
this.deleting = false;
});
this.$bvToast.toast('Progress deleted', { title: `${name} progress`, variant: 'success' });
this.$bvModal.hide('progress');
},
async saveProgress() {
const { id, name } = this.game;
this.saving = true;
this.$store.commit('SET_GAME_PROGRESS', {
progress: this.localProgress,
gameId: id,
});
await this.$store.dispatch('SAVE_PROGRESSES')
.catch(() => {
this.saving = false;
this.$bvToast.toast('There was an error saving your progress', { title: 'Error', variant: 'error' });
});
this.$bvToast.toast('Progress updated', { title: `${name} progress`, variant: 'success' });
this.$bvModal.hide('progress');
},
},
};
</script>