xiaoluoboding / vue-sonner

🔔 An opinionated toast component for Vue.
https://vue-sonner.vercel.app
MIT License
803 stars 41 forks source link

can we dismiss the toast programmatically? `toast.dismiss()` does not work #50

Open thoriqadillah opened 6 months ago

thoriqadillah commented 6 months ago

i am working on GUI using wails, and I tried to make my own toast because somehow the toast can't be styled using the toast option you provided using tailwind. and the toast itself is not really match up the design of my app, so i need to make my own anyway

the problem is, when i tried to use my own component, the value from the option somehow still appearing outside my component. and i am struggling to dismiss the toast because toast.dismiss() is not working. i don't know if this has something to do with wails or not

btw, i use vue-shadcn port here is my implementation

// some imports

export type ToastOption = Omit<ExternalToast, 'invert' | 'icon' | 'important' | 'style' | 'unstyled' | 'descriptionClassName' | 'className' | 'promise' /** | 'action' */ > & {
    type?: NonNullable<Parameters<typeof toastVariants>[0]>['text']
    action?: {
        label?: string,
        icon?: Component,
        onClick: () => void
    }
}

export type ToastProps = ToastOption & {
    title: string
}

export function toast(title: string, data?: ToastOption) {    
    callToast(markRaw(
        defineComponent({ render: () => h(Toast, { title, ...data }) })), 
        { 
            ...data,
            // description: undefined,
            // onAutoClose: data?.onAutoClose,
            // onDismiss: data?.onDismiss,
            // duration: data?.duration,
            // cancel: data?.cancel,
            // id: data?.id || new Date().getTime().toString(),
        }
    )
}

image

thoriqadillah commented 6 months ago

i found the answer. after looking trough your code, it turns it will close the sonner after the custom component emits closeToast event

can you at least give us more concise documentation about this component so that we don't have to look deeper into your code? I think diving deeper to the code is not really necessary if we have good documentation

ishaiavrahami commented 5 months ago

Hi, did you find the solution to this? When i dismiss my custom toast it throws an error in the console that breaks it.

Please help if you can @thoriqadillah

thoriqadillah commented 5 months ago

Just create emitter with name closeToast. For closing the toast, just emit it like this, after that the vue-sonner will take care of closing the toast

const props = defineProps<ToastProps>()
const emit = defineEmits<{
    (e: 'closeToast'): void
}>()

function dismiss() {
    if (props.onDismiss) props.onDismiss({ id: props.id! })
    emit('closeToast')
}

function click() {
    if (props.action) props.action.onClick()
    emit('closeToast')
}
ishaiavrahami commented 5 months ago

I’m not sure I understand. I use the standard toast.dismiss() but it throws an error. What example did you provide me above. PS I’m using Js not Ts @thoriqadillah

thoriqadillah commented 5 months ago

If you create your custom toast, toast.dismiss will not work (i forgot the reason tho). I think the toast.dismiss only close the original toast, not our custom toast.

Vue sonner do not provide clear api to close the toast. After going deeper into the code, it turns out that to close the toast, we need to create emitter named closeToast and then emit it. Just try it out, and see if that works

ishaiavrahami commented 5 months ago

I understand now. Where should I create the emitter?

thoriqadillah commented 5 months ago

Inside your toast

ishaiavrahami commented 5 months ago
Screenshot 2024-04-05 at 3 11 45 PM

still getting this error after adding.

Screenshot 2024-04-05 at 3 12 04 PM

maybe im not getting you

thoriqadillah commented 5 months ago

Take a look at my code (might as well shameless plug my project lol)

In Toast.vue is my custom toast using the vue-sonner In index.ts is how i define the composable (function that calls the toast)

I'm using typescript tho, so i hope you understand some typescript, and i think you should start using typescript at some point

But, the most important thing is in Toast.vue. There, you define your emitter named closeToast. And when the user click close button or something, emit the closeToast to close the vue-sonner

ishaiavrahami commented 5 months ago

Got it to work and i want to personally thank you! @thoriqadillah

vinaysudani commented 1 month ago

Emiting closeToast from custom component works. Thanks @thoriqadillah for writing it here, it helped me.

Mentioning it in documentation would be helpful to others.