koel/resources/assets/js/components/ui/Overlay.vue

78 lines
1.8 KiB
Vue
Raw Normal View History

2022-04-15 14:24:30 +00:00
<template>
<div v-if="state.showing" id="overlay" :class="state.type" class="overlay" data-testid="overlay">
2022-04-15 14:24:30 +00:00
<div class="display">
2022-08-01 08:58:25 +00:00
<SoundBars v-if="state.type === 'loading'"/>
2022-07-15 07:23:55 +00:00
<icon v-if="state.type === 'error'" :icon="faCircleExclamation"/>
<icon v-if="state.type === 'warning'" :icon="faWarning"/>
<icon v-if="state.type === 'info'" :icon="faCircleInfo"/>
<icon v-if="state.type === 'success'" :icon="faCircleCheck"/>
2022-04-15 14:24:30 +00:00
2022-05-11 15:24:28 +00:00
<span class="message" v-html="state.message"/>
2022-04-15 14:24:30 +00:00
</div>
2022-05-11 15:24:28 +00:00
<button v-if="state.dismissible" class="btn-dismiss" type="button" @click.prevent="hide">Close</button>
2022-04-15 14:24:30 +00:00
</div>
</template>
2022-04-15 17:00:08 +00:00
<script lang="ts" setup>
2022-07-15 07:23:55 +00:00
import { faCircleCheck, faCircleExclamation, faCircleInfo, faWarning } from '@fortawesome/free-solid-svg-icons'
2022-04-15 14:24:30 +00:00
import { eventBus } from '@/utils'
2022-04-15 17:00:08 +00:00
import { defineAsyncComponent, reactive } from 'vue'
2022-04-15 14:24:30 +00:00
2022-08-01 08:58:25 +00:00
const SoundBars = defineAsyncComponent(() => import('@/components/ui/SoundBars.vue'))
2022-04-15 14:24:30 +00:00
2022-04-15 17:00:08 +00:00
const state = reactive<OverlayState>({
2022-07-16 09:52:39 +00:00
showing: false,
2022-04-15 17:00:08 +00:00
dismissible: false,
type: 'loading',
message: ''
})
2022-04-15 14:24:30 +00:00
2022-04-15 17:00:08 +00:00
const show = (options: Partial<OverlayState>) => {
Object.assign(state, options)
2022-04-15 17:00:08 +00:00
state.showing = true
}
const hide = () => (state.showing = false)
eventBus.on('SHOW_OVERLAY', options => show(options))
.on('HIDE_OVERLAY', () => hide())
2022-04-15 14:24:30 +00:00
</script>
<style lang="scss">
#overlay {
background-color: var(--color-bg-primary);
flex-direction: column;
.display {
2022-08-01 08:58:25 +00:00
display: flex;
align-items: baseline;
justify-content: center;
2022-04-15 14:24:30 +00:00
2022-07-15 07:23:55 +00:00
.message {
margin-left: 6px;
2022-04-15 14:24:30 +00:00
}
}
&.error {
color: var(--color-red);
}
&.success {
color: var(--color-green);
}
&.info {
color: var(--color-blue);
}
&.loading {
color: var(--color-text-secondary);
}
&.warning {
color: var(--color-highlight);
}
}
</style>