@shopware-ag/meteor-component-library
Version:
The meteor component library is a Vue component library developed by Shopware. It is based on the [Meteor Design System](https://shopware.design/).
100 lines (89 loc) • 3.15 kB
text/typescript
import MtToast from "./mt-toast.vue";
import MtButton from "@/components/form/mt-button/mt-button.vue";
import MtSelect from "@/components/form/mt-select/mt-select.vue";
import MtTextField from "@/components/form/mt-text-field/mt-text-field.vue";
import MtCheckbox from "@/components/form/mt-checkbox/mt-checkbox.vue";
import type { Toast } from "./mt-toast.vue";
import type { StoryObj } from "@storybook/vue3";
import type { SlottedMeta } from "@/_internal/story-helper";
import { createId } from "@/utils/id";
export type MtToastMeta = SlottedMeta<typeof MtToast, "">;
export default {
title: "Components/Feedback Indicator/mt-toast",
component: MtToast,
render: (args) => ({
components: { MtToast, MtButton, MtSelect, MtTextField, MtCheckbox },
template: `
<h2>Spawn some toasts 🍞</h2>
<div style="width: 420px;">
<mt-text-field label="ToastMessage" v-model="msg" />
<div style="display: flex; gap: 12px;">
<mt-checkbox label="Display toast icon?" v-model:checked="displayIcon" />
<mt-checkbox label="Toast manually dismissible?" v-model:checked="dismissible" />
<mt-checkbox label="Add action?" v-model:checked="action" />
</div>
</div>
<div style="width: 420px; display: flex; justify-content: space-around;">
<mt-button @click="onAddToast('critical')" variant="critical">Add critical toast</mt-button>
<mt-button @click="onAddToast('positive')" variant="primary">Add positive toast</mt-button>
<mt-button @click="onAddToast('informal')" variant="secondary">Add informal toast</mt-button>
</div>
<MtToast
:toasts="toasts"
@remove-toast="removeToast"
/>
`,
setup: () => {
return {
args,
};
},
data(): {
toasts: Toast[];
msg: string;
displayIcon: boolean;
dismissible: boolean;
action: boolean;
} {
return {
toasts: [],
msg: "Max three words",
displayIcon: false,
dismissible: false,
action: false,
};
},
methods: {
onAddToast(type: string) {
let icon = "regular-bug";
if (type === "positive") {
icon = "regular-checkmark";
}
if (type === "informal") {
icon = "regular-lightbulb";
}
this.toasts = [
{
id: createId(), // auto generated at the sdk
// Provided by the user
msg: this.msg,
type,
dismissible: this.dismissible,
icon: this.displayIcon ? icon : undefined,
action: this.action
? { label: "action", callback: () => console.log("action") }
: undefined,
},
...this.toasts,
];
},
removeToast(id: number) {
this.toasts = this.toasts.filter((toast: Toast) => toast.id !== id);
},
},
}),
} as MtToastMeta;
export type MtToastStory = StoryObj<MtToastMeta>;
export const Default: MtToastStory = {
name: "mt-toast",
};