<template>
    <DocSectionText v-bind="$attrs">
        <p>Headless mode is enabled by defining a <i>container</i> slot that lets you implement entire toast UI instead of the default elements.</p>
    </DocSectionText>
    <div class="card flex justify-content-center">
        <Toast position="top-center" group="headless" @close="visible = false">
            <template #container="{ message, closeCallback }">
                <section class="flex p-3 gap-3 w-full bg-black-alpha-90" style="border-radius: 10px">
                    <i class="pi pi-cloud-upload text-primary-500 text-2xl"></i>
                    <div class="flex flex-column gap-3 w-full">
                        <p class="m-0 font-semibold text-base text-white">{{ message.summary }}</p>
                        <p class="m-0 text-base text-700">{{ message.detail }}</p>
                        <div class="flex flex-column gap-2">
                            <ProgressBar :value="progress" :showValue="false" :style="{ height: '4px' }"></ProgressBar>
                            <label class="text-right text-xs text-white">{{ progress }}% uploaded...</label>
                        </div>
                        <div class="flex gap-3 mb-3">
                            <Button label="Another Upload?" text class="py-1 px-2" @click="closeCallback"></Button>
                            <Button label="Cancel" text class="text-white py-1 px-2" @click="closeCallback"></Button>
                        </div>
                    </div>
                </section>
            </template>
        </Toast>
        <Button @click="show" label="View" />
    </div>
    <DocSectionCode :code="code" />
</template>

<script>
export default {
    data() {
        return {
            visible: false,
            progress: 0,
            interval: null,
            code: {
                basic: `
<Toast position="top-center" group="headless" @close="visible = false">
    <template #container="{ message, closeCallback }">
        <section class="flex p-3 gap-3 w-full bg-black-alpha-90" style="border-radius: 10px">
            <i class="pi pi-cloud-upload text-primary-500 text-2xl"></i>
            <div class="flex flex-column gap-3 w-full">
                <p class="m-0 font-semibold text-base text-white">{{ message.summary }}</p>
                <p class="m-0 text-base text-700">{{ message.detail }}</p>
                <div class="flex flex-column gap-2">
                    <ProgressBar :value="progress" :showValue="false" :style="{ height: '4px' }"></ProgressBar>
                    <label class="text-right text-xs text-white">{{ progress }}% uploaded...</label>
                </div>
                <div class="flex gap-3 mb-3">
                    <Button label="Another Upload?" text class="py-1 px-2" @click="closeCallback"></Button>
                    <Button label="Cancel" text class="text-white py-1 px-2" @click="closeCallback"></Button>
                </div>
            </div>
        </section>
    </template>
</Toast>
<Button @click="show" label="View" />
`,
                options: `
<template>
    <div class="card flex justify-content-center">
        <Toast position="top-center" group="headless" @close="visible = false">
            <template #container="{ message, closeCallback }">
                <section class="flex p-3 gap-3 w-full bg-black-alpha-90" style="border-radius: 10px">
                    <i class="pi pi-cloud-upload text-primary-500 text-2xl"></i>
                    <div class="flex flex-column gap-3 w-full">
                        <p class="m-0 font-semibold text-base text-white">{{ message.summary }}</p>
                        <p class="m-0 text-base text-700">{{ message.detail }}</p>
                        <div class="flex flex-column gap-2">
                            <ProgressBar :value="progress" :showValue="false" :style="{ height: '4px' }"></ProgressBar>
                            <label class="text-right text-xs text-white">{{ progress }}% uploaded...</label>
                        </div>
                        <div class="flex gap-3 mb-3">
                            <Button label="Another Upload?" text class="py-1 px-2" @click="closeCallback"></Button>
                            <Button label="Cancel" text class="text-white py-1 px-2" @click="closeCallback"></Button>
                        </div>
                    </div>
                </section>
            </template>
        </Toast>
        <Button @click="show" label="View" />
    </div>
</template>

<script>
export default {
    data() {
        return {
            visible: false,
            progress: 0,
            interval: null
        }
    },
    beforeUnmount() {
        if (this.interval) {
            clearInterval(this.interval);
        }
    },
    methods: {
        show() {
            if (!this.visible) {
                this.$toast.add({ severity: 'custom', summary: 'Uploading your files.', group: 'headless' });
                this.visible = true;
                this.progress = 0;

                if (this.interval) {
                    clearInterval(this.interval);
                }

                this.interval = setInterval(() => {
                    if (this.progress <= 100) {
                        this.progress = this.progress + 20;
                    }

                    if (this.progress >= 100) {
                        this.progress = 100;
                        clearInterval(this.interval);
                    }
                }, 1000);
            }
        }
    }
};
<\/script>
`,
                composition: `
<template>
    <div class="card flex justify-content-center">
        <Toast position="top-center" group="headless" @close="visible = false">
            <template #container="{ message, closeCallback }">
                <section class="flex p-3 gap-3 w-full bg-black-alpha-90" style="border-radius: 10px">
                    <i class="pi pi-cloud-upload text-primary-500 text-2xl"></i>
                    <div class="flex flex-column gap-3 w-full">
                        <p class="m-0 font-semibold text-base text-white">{{ message.summary }}</p>
                        <p class="m-0 text-base text-700">{{ message.detail }}</p>
                        <div class="flex flex-column gap-2">
                            <ProgressBar :value="progress" :showValue="false" :style="{ height: '4px' }"></ProgressBar>
                            <label class="text-right text-xs text-white">{{ progress }}% uploaded...</label>
                        </div>
                        <div class="flex gap-3 mb-3">
                            <Button label="Another Upload?" text class="py-1 px-2" @click="closeCallback"></Button>
                            <Button label="Cancel" text class="text-white py-1 px-2" @click="closeCallback"></Button>
                        </div>
                    </div>
                </section>
            </template>
        </Toast>
        <Button @click="show" label="View" />
    </div>
</template>

<script setup>
import { useToast } from "primevue/usetoast";
import { ref, onUnmounted } from 'vue';
const toast = useToast();
const visible = ref(false);
const progress = ref(0);
const interval = ref();

onUnmounted(() => {
    if (interval.value) {
        clearInterval(interval.value);
    }
})

const show = () => {
    if (!visible.value) {
        toast.add({ severity: 'custom', summary: 'Uploading your files.', group: 'headless' });
        visible.value = true;
        progress.value = 0;

        if (interval.value) {
            clearInterval(interval.value);
        }

        interval.value = setInterval(() => {
            if (progress.value <= 100) {
                progress.value = progress.value + 20;
            }

            if (progress.value >= 100) {
                progress.value = 100;
                clearInterval(interval.value);
            }
        }, 1000);
    }
};
<\/script>
`
            }
        };
    },
    beforeUnmount() {
        if (this.interval) {
            clearInterval(this.interval);
        }
    },
    methods: {
        show() {
            if (!this.visible) {
                this.$toast.add({ severity: 'custom', summary: 'Uploading your files.', group: 'headless' });
                this.visible = true;
                this.progress = 0;

                if (this.interval) {
                    clearInterval(this.interval);
                }

                this.interval = setInterval(() => {
                    if (this.progress <= 100) {
                        this.progress = this.progress + 20;
                    }

                    if (this.progress >= 100) {
                        this.progress = 100;
                        clearInterval(this.interval);
                    }
                }, 1000);
            }
        }
    }
};
</script>