Closed
Description
Version: 0.4.3
Problem
When defining the component, using it for different states, and passing the props to the component with different values, it is not using a new component.
How to reproduce
Define the modal one time and reuse it for different states:
useAlert.ts
import Alert from '~/components/Modals/Alert.vue';
import { createConfirmDialog } from 'vuejs-confirm-dialog';
const alertModal = createConfirmDialog(Alert);
export const showModal = async (options: Modal.Options) => {
await alertModal.close()
return alertModal.reveal(...[options]);
};
export const showDangerMessage = (options: Modal.Options) => {
options.type = 'danger';
return showModal(options);
};
export const showInfoMessage = (options: Modal.Options) => {
options.type = 'info';
return showModal(options);
};
export const showWarningMessage = (options: Modal.Options) => {
options.type = 'warning';
return showModal(options);
};
export const showSuccessMessage = (options: Modal.Options) => {
options.type = 'success';
return showModal(options);
};
alerts.vue
<script setup lang="ts">
import DefaultButton from "~/components/Buttons/DefaultButton.vue";
import {showDangerMessage, showInfoMessage, showWarningMessage} from "~/composables/useAlert";
import {definePageMeta} from "#imports";
definePageMeta({
layout: 'dashboard'
})
const confirmDelete = async () => {
const {data, isCanceled} = await showWarningMessage({
title: 'Confirm Delete',
message: 'Are you sure want to delete this object?',
confirmButton: 'Confirm & Delete',
cancelButton: 'Cancel this actions',
dismissible: false
})
if (!isCanceled) {
await showInfoMessage({title: 'You confirmed the action', message: 'There is nothing to do with anymore.'})
} else {
await showInfoMessage({title: 'You canceled this action', message: 'There is nothing to do with anymore.'})
}
}
</script>
<template>
<div>
<DefaultButton
class="mr-2"
@click.prevent="showDangerMessage({title: 'Something went wrong', message: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'})">
Show Error Message
</DefaultButton>
<DefaultButton
class="mr-2"
@click.prevent="showInfoMessage({title: 'Info Message', message: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'})">
Show Info Message
</DefaultButton>
<DefaultButton
class="mr-2"
@click.prevent="showWarningMessage({title: 'Warning Message', message: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'})">
Show Warning Message
</DefaultButton>
<DefaultButton
class="mr-2"
@click.prevent="showWarningMessage({title: 'Warning Message', message: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'})">
Show Warning Message
</DefaultButton>
<DefaultButton @click.prevent="confirmDelete">
Confirm Delete
</DefaultButton>
</div>
</template>
Alert.vue
<script setup lang="ts">
import DefaultButton from "~/components/Buttons/DefaultButton.vue";
import {onMounted} from "vue";
import DangerButton from "~/components/Buttons/DangerButton.vue";
interface Props {
title: string;
message: string;
dismissible?: boolean,
autoHide?: boolean;
timeout?: number;
confirmButton?: string;
cancelButton?: string | boolean;
type: Modal.Type
}
const props = withDefaults(defineProps<Props>(), {
dismissible: true,
autoHide: false,
timeout: 10000,
confirmButton: 'Close',
cancelButton: false
})
const emit = defineEmits<{
(event: 'confirm'): void
(event: 'cancel'): void
}>()
onMounted(() => {
if (props.autoHide) {
setTimeout(() => {
emit('cancel')
}, props.timeout)
}
})
</script>
<template>
<Modal
:model-value="true"
:dismissible="dismissible"
:class="`modal-type-${type}`"
@close="emit('cancel')"
>
<div class="text-center text-[24px]">
{{ title }}
</div>
<p class="text-center">{{ message }}</p>
<div class="text-center pt-4 flex">
<DangerButton v-if="cancelButton" class="flex-grow mr-2" @click="emit('cancel')">
{{ cancelButton }}
</DangerButton>
<DefaultButton class="flex-grow" @click="emit('confirm')">
{{ confirmButton }}
</DefaultButton>
</div>
</Modal>
</template>
CleanShot.2022-10-27.at.18.04.46.mp4
Possible solution
When executing the reveal
method, it should re-init the children component with new properties - in this case, it will clear the properties passed before.
Temporary solution
Init the component every time with const alertModal = createConfirmDialog(Alert);