@weni/unnnic-system 3.7.1 → 3.8.2-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -1
- package/dist/components/Accordion/Accordion.vue.d.ts +1 -1
- package/dist/components/Alert/Alert.vue.d.ts +17 -116
- package/dist/components/Alert/Alert.vue.d.ts.map +1 -1
- package/dist/components/Alert/Version1dot1.vue.d.ts +2 -38
- package/dist/components/Alert/Version1dot1.vue.d.ts.map +1 -1
- package/dist/components/AudioRecorder/AudioHandler.vue.d.ts +2 -2
- package/dist/components/AudioRecorder/AudioPlayer.vue.d.ts +1 -1
- package/dist/components/AudioRecorder/AudioRecorder.vue.d.ts +5 -5
- package/dist/components/AvatarIcon/AvatarIcon.vue.d.ts +3 -3
- package/dist/components/Banner/Banner.vue.d.ts +1 -1
- package/dist/components/Banner/InfoBanner.vue.d.ts +1 -1
- package/dist/components/Breadcrumb/Breadcrumb.vue.d.ts +1 -1
- package/dist/components/Button/Button.vue.d.ts +1 -1
- package/dist/components/Button/Button.vue.d.ts.map +1 -1
- package/dist/components/Button/ButtonIcon.vue.d.ts +1 -1
- package/dist/components/Button/types.d.ts +1 -1
- package/dist/components/Button/types.d.ts.map +1 -1
- package/dist/components/Card/AccountCard.vue.d.ts +5 -5
- package/dist/components/Card/BlankCard.vue.d.ts +1 -1
- package/dist/components/Card/Card.vue.d.ts +27 -27
- package/dist/components/Card/CardCompany.vue.d.ts +5 -5
- package/dist/components/Card/CardData.vue.d.ts +1 -1
- package/dist/components/Card/CardStatusesContainer.vue.d.ts +5 -5
- package/dist/components/Card/ContentCard.vue.d.ts +3 -3
- package/dist/components/Card/DashCard.vue.d.ts +5 -5
- package/dist/components/Card/DefaultCard.vue.d.ts +1 -1
- package/dist/components/Card/MarketplaceCard.vue.d.ts +2 -2
- package/dist/components/Card/SimpleCard.vue.d.ts +3 -3
- package/dist/components/Card/StatusCard.vue.d.ts +2 -2
- package/dist/components/Card/TitleCard.vue.d.ts +3 -3
- package/dist/components/CardImage/CardImage.vue.d.ts +24 -31
- package/dist/components/CardInformation/CardInformation.vue.d.ts +5 -5
- package/dist/components/CardProject/CardProject.vue.d.ts +3 -3
- package/dist/components/Carousel/Carousel.vue.d.ts +7 -7
- package/dist/components/Carousel/TagCarousel.vue.d.ts +6 -6
- package/dist/components/ChartBar/ChartBar.vue.d.ts +5 -5
- package/dist/components/ChartLine/ChartLine.vue.d.ts +1 -1
- package/dist/components/ChatText/ChatText.vue.d.ts +2 -2
- package/dist/components/ChatsContact/ChatsContact.vue.d.ts +27 -34
- package/dist/components/ChatsDashboardTagLive/ChatsDashboardTagLive.vue.d.ts +1 -1
- package/dist/components/ChatsHeader/ChatsHeader.vue.d.ts +1 -1
- package/dist/components/ChatsHeader/ChatsHeader.vue.d.ts.map +1 -1
- package/dist/components/ChatsMessage/ChatsMessage.vue.d.ts +5 -5
- package/dist/components/ChatsMessage/ChatsMessageStatusBackdrop.vue.d.ts +2 -2
- package/dist/components/ChatsNavbar/ChatsNavbar.vue.d.ts +1 -1
- package/dist/components/ChatsUserAvatar/ChatsUserAvatar.vue.d.ts +2 -2
- package/dist/components/Checkbox/Checkbox.vue.d.ts +19 -26
- package/dist/components/Checkbox/Checkbox.vue.d.ts.map +1 -1
- package/dist/components/CheckboxGroup/CheckboxGroup.vue.d.ts +28 -0
- package/dist/components/CheckboxGroup/CheckboxGroup.vue.d.ts.map +1 -0
- package/dist/components/Comment/Comment.vue.d.ts +1 -1
- package/dist/components/DataArea/DataArea.vue.d.ts +2 -2
- package/dist/components/DataTable/index.vue.d.ts +1 -1
- package/dist/components/DataTable/index.vue.d.ts.map +1 -1
- package/dist/components/DateFilter/DateFilter.vue.d.ts +251 -41
- package/dist/components/DatePicker/DatePicker.vue.d.ts +4 -4
- package/dist/components/Drawer/Drawer.vue.d.ts +4 -4
- package/dist/components/Dropdown/Dropdown.vue.d.ts +1 -1
- package/dist/components/Dropdown/LanguageSelect.vue.d.ts +3 -3
- package/dist/components/Flag.vue.d.ts +2 -2
- package/dist/components/FormElement/FormElement.vue.d.ts +51 -28
- package/dist/components/FormElement/FormElement.vue.d.ts.map +1 -1
- package/dist/components/Icon.vue.d.ts +1 -1
- package/dist/components/Icon.vue.d.ts.map +1 -1
- package/dist/components/IconLoading/IconLoading.vue.d.ts +1 -1
- package/dist/components/ImportCard/ImportCard.vue.d.ts +4 -4
- package/dist/components/Input/BaseInput.vue.d.ts +33 -2
- package/dist/components/Input/BaseInput.vue.d.ts.map +1 -1
- package/dist/components/Input/Input.vue.d.ts +251 -41
- package/dist/components/Input/Input.vue.d.ts.map +1 -1
- package/dist/components/Input/TextInput.vue.d.ts +85 -25
- package/dist/components/Input/TextInput.vue.d.ts.map +1 -1
- package/dist/components/InputDatePicker/InputDatePicker.vue.d.ts +257 -47
- package/dist/components/InputNext/InputNext.vue.d.ts +5 -5
- package/dist/components/Label/Label.vue.d.ts +9 -15
- package/dist/components/Label/Label.vue.d.ts.map +1 -1
- package/dist/components/Modal/Modal.vue.d.ts +2 -2
- package/dist/components/ModalDialog/ModalDialog.vue.d.ts +199 -34
- package/dist/components/ModalDialog/ModalDialog.vue.d.ts.map +1 -1
- package/dist/components/ModalNext/ModalNext.vue.d.ts +256 -46
- package/dist/components/ModalUpload/ModalUpload.vue.d.ts +8 -8
- package/dist/components/MoodRating/MoodRating.vue.d.ts +1 -1
- package/dist/components/MultiSelect/MultiSelect.vue.d.ts +20 -14
- package/dist/components/Pagination/Pagination.vue.d.ts +3 -3
- package/dist/components/ProgressBar/ProgressBar.vue.d.ts +1 -1
- package/dist/components/Radio/Radio.vue.d.ts +8 -6
- package/dist/components/Radio/Radio.vue.d.ts.map +1 -1
- package/dist/components/SelectSmart/SelectSmart.vue.d.ts +113 -60
- package/dist/components/SelectSmart/SelectSmartMultipleHeader.vue.d.ts +5 -5
- package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts +21 -28
- package/dist/components/SelectSmart/SelectSmartOption.vue.d.ts.map +1 -1
- package/dist/components/SelectTime/index.vue.d.ts +85 -25
- package/dist/components/SkeletonLoading/skeletonTheme.vue.d.ts +1 -1
- package/dist/components/Slider/Slider.vue.d.ts +2 -2
- package/dist/components/StarRating/StarRating.vue.d.ts +1 -1
- package/dist/components/Switch/Switch.vue.d.ts +55 -21
- package/dist/components/Switch/Switch.vue.d.ts.map +1 -1
- package/dist/components/Tab/Tab.vue.d.ts +13 -2
- package/dist/components/TableNext/TableBodyCell.vue.d.ts +2 -2
- package/dist/components/TableNext/TablePagination.vue.d.ts +3 -3
- package/dist/components/TabsExpanded/TabsExpanded.vue.d.ts +1 -1
- package/dist/components/Tag/BrandTag.vue.d.ts +1 -1
- package/dist/components/Tag/DefaultTag.vue.d.ts +1 -1
- package/dist/components/Tag/IndicatorTag.vue.d.ts +2 -2
- package/dist/components/Tag/Tag.vue.d.ts +5 -5
- package/dist/components/TextArea/TextArea.vue.d.ts +66 -30
- package/dist/components/TextArea/TextArea.vue.d.ts.map +1 -1
- package/dist/components/Toast/Toast.vue.d.ts +16 -0
- package/dist/components/Toast/Toast.vue.d.ts.map +1 -0
- package/dist/components/Toast/ToastManager.d.ts +14 -0
- package/dist/components/Toast/ToastManager.d.ts.map +1 -0
- package/dist/components/Toast/types.d.ts +35 -0
- package/dist/components/Toast/types.d.ts.map +1 -0
- package/dist/components/ToolTip/ToolTip.vue.d.ts +1 -1
- package/dist/components/Tour/Tour.vue.d.ts +3 -3
- package/dist/components/Tour/TourPopover.vue.d.ts +3 -3
- package/dist/components/UploadArea/UploadArea.vue.d.ts +4 -4
- package/dist/components/index.d.ts +3993 -1340
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/ui/dialog/Dialog.vue.d.ts +23 -0
- package/dist/components/ui/dialog/Dialog.vue.d.ts.map +1 -0
- package/dist/components/ui/dialog/DialogClose.vue.d.ts +19 -0
- package/dist/components/ui/dialog/DialogClose.vue.d.ts.map +1 -0
- package/dist/components/ui/dialog/DialogContent.vue.d.ts +40 -0
- package/dist/components/ui/dialog/DialogContent.vue.d.ts.map +1 -0
- package/dist/components/ui/dialog/DialogFooter.vue.d.ts +25 -0
- package/dist/components/ui/dialog/DialogFooter.vue.d.ts.map +1 -0
- package/dist/components/ui/dialog/DialogHeader.vue.d.ts +29 -0
- package/dist/components/ui/dialog/DialogHeader.vue.d.ts.map +1 -0
- package/dist/components/ui/dialog/DialogTitle.vue.d.ts +23 -0
- package/dist/components/ui/dialog/DialogTitle.vue.d.ts.map +1 -0
- package/dist/components/ui/dialog/DialogTrigger.vue.d.ts +19 -0
- package/dist/components/ui/dialog/DialogTrigger.vue.d.ts.map +1 -0
- package/dist/components/ui/dialog/index.d.ts +8 -0
- package/dist/components/ui/dialog/index.d.ts.map +1 -0
- package/dist/components/ui/popover/Popover.vue.d.ts +23 -0
- package/dist/components/ui/popover/Popover.vue.d.ts.map +1 -0
- package/dist/components/ui/popover/PopoverContent.vue.d.ts +28 -0
- package/dist/components/ui/popover/PopoverContent.vue.d.ts.map +1 -0
- package/dist/components/ui/popover/PopoverFooter.vue.d.ts +18 -0
- package/dist/components/ui/popover/PopoverFooter.vue.d.ts.map +1 -0
- package/dist/components/ui/popover/PopoverTrigger.vue.d.ts +19 -0
- package/dist/components/ui/popover/PopoverTrigger.vue.d.ts.map +1 -0
- package/dist/components/ui/popover/index.d.ts +6 -0
- package/dist/components/ui/popover/index.d.ts.map +1 -0
- package/dist/{es-484b4c46.mjs → es-4bdcf86e.mjs} +1 -1
- package/dist/{index-dc007393.mjs → index-0d6fa367.mjs} +18908 -11929
- package/dist/locales/en.json.d.ts +2 -1
- package/dist/locales/es.json.d.ts +2 -1
- package/dist/locales/pt_br.json.d.ts +2 -1
- package/dist/{pt-br-f73c4b3a.mjs → pt-br-51af7f2a.mjs} +1 -1
- package/dist/style.css +1 -1
- package/dist/unnnic.mjs +197 -172
- package/dist/unnnic.umd.js +56 -50
- package/dist/utils/call.d.ts +2 -1
- package/dist/utils/call.d.ts.map +1 -1
- package/package.json +3 -2
- package/src/assets/icons/checkbox-checked-disabled.svg +3 -0
- package/src/assets/icons/checkbox-checked.svg +3 -0
- package/src/assets/icons/checkbox-less-disabled.svg +3 -0
- package/src/assets/icons/checkbox-less.svg +3 -0
- package/src/assets/icons/radio-checked.svg +3 -0
- package/src/assets/icons/switch-checked-disabled.svg +3 -0
- package/src/assets/icons/switch-checked.svg +3 -0
- package/src/assets/scss/tailwind.scss +8 -0
- package/src/components/Alert/Alert.vue +26 -135
- package/src/components/Alert/SIMPLE_MIGRATION_GUIDE.md +152 -0
- package/src/components/Alert/Version1dot1.vue +0 -36
- package/src/components/Alert/__tests__/Alert.spec.js +2 -45
- package/src/components/Alert/__tests__/Version1dot1.spec.js +0 -21
- package/src/components/Alert/__tests__/__snapshots__/Alert.spec.js.snap +11 -7
- package/src/components/Alert/__tests__/__snapshots__/Version1dot1.spec.js.snap +2 -2
- package/src/components/Button/Button.vue +68 -117
- package/src/components/Button/types.ts +0 -1
- package/src/components/Checkbox/Checkbox.vue +98 -64
- package/src/components/Checkbox/__tests__/Checkbox.spec.js +6 -21
- package/src/components/CheckboxGroup/CheckboxGroup.vue +96 -0
- package/src/components/FormElement/FormElement.vue +63 -93
- package/src/components/Icon.vue +2 -0
- package/src/components/Input/BaseInput.vue +33 -14
- package/src/components/Input/Input.scss +20 -21
- package/src/components/Input/Input.vue +79 -56
- package/src/components/Input/TextInput.vue +80 -68
- package/src/components/Input/__test__/Input.spec.js +13 -33
- package/src/components/Input/__test__/TextInput.spec.js +6 -8
- package/src/components/Input/__test__/__snapshots__/Input.spec.js.snap +14 -5
- package/src/components/Input/__test__/__snapshots__/TextInput.spec.js.snap +1 -1
- package/src/components/Label/Label.vue +52 -21
- package/src/components/Label/__tests__/Label.spec.js +1 -1
- package/src/components/Label/__tests__/__snapshots__/Label.spec.js.snap +1 -1
- package/src/components/ModalDialog/ModalDialog.vue +60 -146
- package/src/components/ModalDialog/__tests__/__snapshots__/ModalDialog.spec.js.snap +1 -22
- package/src/components/Popover/__tests__/Popover.spec.js +147 -0
- package/src/components/Popover/__tests__/__snapshots__/Popover.spec.js.snap +8 -0
- package/src/components/Popover/index.vue +146 -0
- package/src/components/Radio/Radio.vue +80 -67
- package/src/components/Radio/__test__/Radio.spec.js +14 -20
- package/src/components/Radio/__test__/__snapshots__/Radio.spec.js.snap +3 -3
- package/src/components/RadioGroup/RadioGroup.vue +142 -0
- package/src/components/Select/SelectOption.vue +65 -0
- package/src/components/Select/__tests__/Select.spec.js +412 -0
- package/src/components/Select/__tests__/SelectItem.spec.js +330 -0
- package/src/components/Select/__tests__/SelectOption.spec.js +174 -0
- package/src/components/Select/__tests__/__snapshots__/Select.spec.js.snap +97 -0
- package/src/components/Select/__tests__/__snapshots__/SelectItem.spec.js.snap +15 -0
- package/src/components/Select/__tests__/__snapshots__/SelectOption.spec.js.snap +25 -0
- package/src/components/Select/index.vue +245 -0
- package/src/components/SelectSmart/SelectSmart.vue +4 -3
- package/src/components/Switch/Switch.vue +123 -96
- package/src/components/Switch/__tests__/Switch.spec.js +8 -75
- package/src/components/Switch/__tests__/__snapshots__/Switch.spec.js.snap +5 -6
- package/src/components/Tab/Tab.vue +37 -23
- package/src/components/Tab/__test__/__snapshots__/Tab.spec.js.snap +1 -1
- package/src/components/TableNext/__test__/__snapshots__/TableNext.spec.js.snap +2 -2
- package/src/components/TableNext/__test__/__snapshots__/TablePagination.spec.js.snap +2 -2
- package/src/components/TextArea/TextArea.vue +34 -11
- package/src/components/TextArea/__test__/__snapshots__/TextArea.spec.js.snap +11 -3
- package/src/components/Toast/Toast.vue +246 -0
- package/src/components/Toast/ToastManager.ts +110 -0
- package/src/components/Toast/__tests__/Toast.spec.js +284 -0
- package/src/components/Toast/__tests__/ToastManager.spec.js +294 -0
- package/src/components/Toast/types.ts +57 -0
- package/src/components/index.ts +61 -9
- package/src/components/ui/dialog/Dialog.vue +15 -0
- package/src/components/ui/dialog/DialogClose.vue +25 -0
- package/src/components/ui/dialog/DialogContent.vue +114 -0
- package/src/components/ui/dialog/DialogFooter.vue +46 -0
- package/src/components/ui/dialog/DialogHeader.vue +78 -0
- package/src/components/ui/dialog/DialogTitle.vue +34 -0
- package/src/components/ui/dialog/DialogTrigger.vue +12 -0
- package/src/components/ui/dialog/index.ts +7 -0
- package/src/components/ui/popover/Popover.vue +19 -0
- package/src/components/ui/popover/PopoverContent.vue +109 -0
- package/src/components/ui/popover/PopoverFooter.vue +32 -0
- package/src/components/ui/popover/PopoverTrigger.vue +23 -0
- package/src/components/ui/popover/index.ts +5 -0
- package/src/locales/en.json +2 -1
- package/src/locales/es.json +2 -1
- package/src/locales/pt_br.json +2 -1
- package/src/stories/Alert.stories.js +6 -67
- package/src/stories/Button.stories.js +29 -39
- package/src/stories/Checkbox.stories.js +11 -4
- package/src/stories/CheckboxGroup.stories.js +105 -0
- package/src/stories/Dialog.stories.js +832 -0
- package/src/stories/Input.stories.js +71 -76
- package/src/stories/Label.stories.js +7 -0
- package/src/stories/ModalDialog.mdx +3 -0
- package/src/stories/ModalDialog.stories.js +1 -1
- package/src/stories/Popover.stories.js +396 -0
- package/src/stories/RadioGroup.stories.js +144 -0
- package/src/stories/Select.stories.js +158 -0
- package/src/stories/Switch.stories.js +10 -5
- package/src/stories/Tab.stories.js +11 -4
- package/src/stories/TextArea.stories.js +13 -2
- package/src/stories/Toast.mdx +123 -0
- package/src/stories/Toast.stories.js +126 -0
- package/src/types/scheme-colors.d.ts +1 -0
- package/src/utils/call.js +46 -18
- package/src/components/Alert/AlertBanner.vue +0 -182
- package/src/components/Alert/AlertCaller.vue +0 -49
- package/src/components/Alert/__tests__/AlertBanner.spec.js +0 -89
- package/src/components/Alert/__tests__/AlertCaller.spec.js +0 -98
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { shallowMount } from '@vue/test-utils';
|
|
2
|
+
import { beforeEach, describe, expect, afterEach, test, vi } from 'vitest';
|
|
3
|
+
import Toast from '../Toast.vue';
|
|
4
|
+
|
|
5
|
+
describe('UnnnicToast', () => {
|
|
6
|
+
let wrapper;
|
|
7
|
+
let mockAction;
|
|
8
|
+
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
mockAction = vi.fn();
|
|
11
|
+
vi.useFakeTimers();
|
|
12
|
+
|
|
13
|
+
wrapper = shallowMount(Toast, {
|
|
14
|
+
props: {
|
|
15
|
+
title: 'Test Toast',
|
|
16
|
+
},
|
|
17
|
+
global: {
|
|
18
|
+
stubs: {
|
|
19
|
+
Transition: {
|
|
20
|
+
template: '<div data-testid="toast-transition"><slot /></div>',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
afterEach(() => {
|
|
28
|
+
if (wrapper) {
|
|
29
|
+
wrapper.unmount();
|
|
30
|
+
}
|
|
31
|
+
vi.useRealTimers();
|
|
32
|
+
vi.clearAllMocks();
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const transition = () =>
|
|
36
|
+
wrapper.findComponent('[data-testid="toast-transition"]');
|
|
37
|
+
const toast = () => wrapper.find('[data-testid="toast"]');
|
|
38
|
+
const content = () => wrapper.find('[data-testid="toast-content"]');
|
|
39
|
+
const header = () => wrapper.find('[data-testid="toast-header"]');
|
|
40
|
+
const title = () => wrapper.find('[data-testid="toast-title"]');
|
|
41
|
+
const text = () => wrapper.find('[data-testid="toast-text"]');
|
|
42
|
+
const actionButton = () =>
|
|
43
|
+
wrapper.findComponent('[data-testid="toast-action-button"]');
|
|
44
|
+
const closeIcon = () =>
|
|
45
|
+
wrapper.findComponent('[data-testid="toast-close-icon"]');
|
|
46
|
+
const typeIcon = () =>
|
|
47
|
+
wrapper.findComponent('[data-testid="toast-type-icon"]');
|
|
48
|
+
|
|
49
|
+
describe('Rendering', () => {
|
|
50
|
+
test('renders correctly with required props', () => {
|
|
51
|
+
expect(transition().exists()).toBe(true);
|
|
52
|
+
expect(header().exists()).toBe(true);
|
|
53
|
+
|
|
54
|
+
expect(typeIcon().exists()).toBe(true);
|
|
55
|
+
expect(typeIcon().props('icon')).toBe('info');
|
|
56
|
+
expect(typeIcon().props('scheme')).toBe('blue-500');
|
|
57
|
+
expect(typeIcon().props('size')).toBe('ant');
|
|
58
|
+
|
|
59
|
+
expect(title().exists()).toBe(true);
|
|
60
|
+
expect(title().text()).toBe('Test Toast');
|
|
61
|
+
|
|
62
|
+
expect(text().exists()).toBe(false);
|
|
63
|
+
|
|
64
|
+
expect(toast().exists()).toBe(true);
|
|
65
|
+
expect(content().exists()).toBe(true);
|
|
66
|
+
expect(actionButton().exists()).toBe(false);
|
|
67
|
+
|
|
68
|
+
expect(closeIcon().exists()).toBe(true);
|
|
69
|
+
expect(closeIcon().props('icon')).toBe('close');
|
|
70
|
+
expect(closeIcon().props('scheme')).toBe('neutral-dark');
|
|
71
|
+
expect(closeIcon().props('size')).toBe('ant');
|
|
72
|
+
expect(closeIcon().props('clickable')).toBe(true);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
test('renders description when provided', async () => {
|
|
76
|
+
await wrapper.setProps({ description: 'Test description' });
|
|
77
|
+
|
|
78
|
+
expect(text().exists()).toBe(true);
|
|
79
|
+
expect(text().text()).toBe('Test description');
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
test('applies correct CSS class based on type', async () => {
|
|
83
|
+
const types = ['informational', 'attention', 'success', 'error'];
|
|
84
|
+
|
|
85
|
+
for (const type of types) {
|
|
86
|
+
await wrapper.setProps({ type });
|
|
87
|
+
|
|
88
|
+
expect(toast().classes()).toContain(`unnnic-toast--${type}`);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
test('sets correct ARIA attributes for different types', async () => {
|
|
93
|
+
// Error type
|
|
94
|
+
await wrapper.setProps({ type: 'error' });
|
|
95
|
+
expect(toast().attributes('role')).toBe('alert');
|
|
96
|
+
expect(toast().attributes('aria-live')).toBe('assertive');
|
|
97
|
+
|
|
98
|
+
// Other types
|
|
99
|
+
await wrapper.setProps({ type: 'informational' });
|
|
100
|
+
expect(toast().attributes('role')).toBe('status');
|
|
101
|
+
expect(toast().attributes('aria-live')).toBe('polite');
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
describe('Icon Configuration', () => {
|
|
106
|
+
test('displays correct icon for each type', async () => {
|
|
107
|
+
const typeConfigs = [
|
|
108
|
+
{ type: 'informational', expectedIcon: 'info' },
|
|
109
|
+
{ type: 'attention', expectedIcon: 'error' },
|
|
110
|
+
{ type: 'success', expectedIcon: 'check_circle' },
|
|
111
|
+
{ type: 'error', expectedIcon: 'cancel' },
|
|
112
|
+
];
|
|
113
|
+
|
|
114
|
+
for (const { type, expectedIcon } of typeConfigs) {
|
|
115
|
+
await wrapper.setProps({ type });
|
|
116
|
+
const icon = typeIcon();
|
|
117
|
+
expect(icon.props('icon')).toBe(expectedIcon);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
test('displays correct scheme color for each type', async () => {
|
|
122
|
+
const typeConfigs = [
|
|
123
|
+
{ type: 'informational', expectedScheme: 'blue-500' },
|
|
124
|
+
{ type: 'attention', expectedScheme: 'yellow-500' },
|
|
125
|
+
{ type: 'success', expectedScheme: 'green-500' },
|
|
126
|
+
{ type: 'error', expectedScheme: 'red-500' },
|
|
127
|
+
];
|
|
128
|
+
|
|
129
|
+
for (const { type, expectedScheme } of typeConfigs) {
|
|
130
|
+
await wrapper.setProps({ type });
|
|
131
|
+
const icon = typeIcon();
|
|
132
|
+
expect(icon.props('scheme')).toBe(expectedScheme);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
describe('Close Functionality', () => {
|
|
138
|
+
test('emits close event when close button is clicked', async () => {
|
|
139
|
+
const closeButton = closeIcon();
|
|
140
|
+
await closeButton.trigger('click');
|
|
141
|
+
|
|
142
|
+
expect(wrapper.emitted('close')).toBeTruthy();
|
|
143
|
+
expect(wrapper.emitted('close')).toHaveLength(1);
|
|
144
|
+
|
|
145
|
+
expect(wrapper.vm.isVisible).toBe(false);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
test('emits close event when close button is activated with Enter key', async () => {
|
|
149
|
+
const closeButton = closeIcon();
|
|
150
|
+
await closeButton.trigger('keydown.enter');
|
|
151
|
+
|
|
152
|
+
expect(wrapper.emitted('close')).toBeTruthy();
|
|
153
|
+
expect(wrapper.emitted('close')).toHaveLength(1);
|
|
154
|
+
|
|
155
|
+
expect(wrapper.vm.isVisible).toBe(false);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
test('hides toast when close is triggered', async () => {
|
|
159
|
+
expect(toast().exists()).toBe(true);
|
|
160
|
+
|
|
161
|
+
await wrapper.vm.handleClose();
|
|
162
|
+
await wrapper.vm.$nextTick();
|
|
163
|
+
|
|
164
|
+
expect(toast().exists()).toBe(false);
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
describe('Action Button', () => {
|
|
169
|
+
test('renders action button when provided', async () => {
|
|
170
|
+
await wrapper.setProps({
|
|
171
|
+
button: {
|
|
172
|
+
text: 'Action',
|
|
173
|
+
action: mockAction,
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
expect(actionButton().exists()).toBe(true);
|
|
178
|
+
expect(actionButton().props('text')).toBe('Action');
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
test('does not render action button when not provided', async () => {
|
|
182
|
+
expect(actionButton().exists()).toBe(false);
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
test('calls action function when action button is clicked', async () => {
|
|
186
|
+
await wrapper.setProps({
|
|
187
|
+
button: {
|
|
188
|
+
text: 'Action',
|
|
189
|
+
action: mockAction,
|
|
190
|
+
},
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
await actionButton().trigger('click');
|
|
194
|
+
|
|
195
|
+
expect(mockAction).toHaveBeenCalledTimes(1);
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
test('calls action function when action button is activated with Enter key', async () => {
|
|
199
|
+
await wrapper.setProps({
|
|
200
|
+
button: {
|
|
201
|
+
text: 'Action',
|
|
202
|
+
action: mockAction,
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
await actionButton().trigger('keydown.enter');
|
|
207
|
+
|
|
208
|
+
expect(mockAction).toHaveBeenCalledTimes(1);
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
test('does not throw error when action button has no action function', async () => {
|
|
212
|
+
await wrapper.setProps({
|
|
213
|
+
button: {
|
|
214
|
+
text: 'Action',
|
|
215
|
+
action: undefined,
|
|
216
|
+
},
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
expect(async () => {
|
|
220
|
+
await actionButton().trigger('click');
|
|
221
|
+
}).not.toThrow();
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
describe('Timeout Functionality', () => {
|
|
226
|
+
const createTimeoutWrapper = (timeout = 1000) => {
|
|
227
|
+
return shallowMount(Toast, {
|
|
228
|
+
props: { title: 'Test Toast', timeout },
|
|
229
|
+
});
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
test('auto-closes after timeout period', async () => {
|
|
233
|
+
wrapper = createTimeoutWrapper();
|
|
234
|
+
vi.advanceTimersByTime(1000);
|
|
235
|
+
|
|
236
|
+
await wrapper.vm.$nextTick();
|
|
237
|
+
expect(wrapper.emitted('close')).toBeTruthy();
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
test('does not auto-close when timeout is 0', async () => {
|
|
241
|
+
wrapper = createTimeoutWrapper(0);
|
|
242
|
+
vi.advanceTimersByTime(5000);
|
|
243
|
+
|
|
244
|
+
await wrapper.vm.$nextTick();
|
|
245
|
+
expect(wrapper.emitted('close')).toBeFalsy();
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
test('does not auto-close when timeout is negative', async () => {
|
|
249
|
+
wrapper = createTimeoutWrapper(-1);
|
|
250
|
+
vi.advanceTimersByTime(5000);
|
|
251
|
+
|
|
252
|
+
await wrapper.vm.$nextTick();
|
|
253
|
+
expect(wrapper.emitted('close')).toBeFalsy();
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
test('clears timeout when component is unmounted', () => {
|
|
257
|
+
const clearTimeoutSpy = vi.spyOn(window, 'clearTimeout');
|
|
258
|
+
wrapper = createTimeoutWrapper();
|
|
259
|
+
|
|
260
|
+
wrapper.unmount();
|
|
261
|
+
expect(clearTimeoutSpy).toHaveBeenCalled();
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
describe('Transitions', () => {
|
|
266
|
+
test('emits destroy event after leave transition', async () => {
|
|
267
|
+
await wrapper.vm.handleClose();
|
|
268
|
+
await wrapper.vm.$nextTick();
|
|
269
|
+
|
|
270
|
+
await transition().vm.$emit('after-leave');
|
|
271
|
+
|
|
272
|
+
expect(wrapper.emitted('destroy')).toBeTruthy();
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
describe('Default Props', () => {
|
|
277
|
+
test('uses correct default values', () => {
|
|
278
|
+
expect(wrapper.props('description')).toBe('');
|
|
279
|
+
expect(wrapper.props('button')).toBeUndefined();
|
|
280
|
+
expect(wrapper.props('timeout')).toBe(5000);
|
|
281
|
+
expect(wrapper.props('type')).toBe('informational');
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
});
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, afterEach, test, vi } from 'vitest';
|
|
2
|
+
|
|
3
|
+
vi.mock('vue', () => ({
|
|
4
|
+
createApp: vi.fn(() => ({
|
|
5
|
+
mount: vi.fn(),
|
|
6
|
+
unmount: vi.fn(),
|
|
7
|
+
})),
|
|
8
|
+
}));
|
|
9
|
+
|
|
10
|
+
vi.mock('../Toast.vue', () => ({
|
|
11
|
+
default: {
|
|
12
|
+
name: 'Toast',
|
|
13
|
+
template: '<div data-testid="toast">Mock Toast</div>',
|
|
14
|
+
},
|
|
15
|
+
}));
|
|
16
|
+
|
|
17
|
+
import toastManager, { toast } from '../ToastManager';
|
|
18
|
+
import Toast from '../Toast.vue';
|
|
19
|
+
|
|
20
|
+
describe('ToastManager', () => {
|
|
21
|
+
let mockCreateApp;
|
|
22
|
+
let mockMount;
|
|
23
|
+
let mockUnmount;
|
|
24
|
+
|
|
25
|
+
beforeEach(async () => {
|
|
26
|
+
vi.clearAllMocks();
|
|
27
|
+
|
|
28
|
+
document.body.innerHTML = '';
|
|
29
|
+
|
|
30
|
+
const { createApp } = await import('vue');
|
|
31
|
+
mockCreateApp = createApp;
|
|
32
|
+
mockMount = vi.fn();
|
|
33
|
+
mockUnmount = vi.fn();
|
|
34
|
+
|
|
35
|
+
mockCreateApp.mockReturnValue({
|
|
36
|
+
mount: mockMount,
|
|
37
|
+
unmount: mockUnmount,
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
Object.defineProperty(globalThis, 'document', {
|
|
41
|
+
value: {
|
|
42
|
+
...document,
|
|
43
|
+
createElement: vi.fn((tagName) => {
|
|
44
|
+
const element = {
|
|
45
|
+
tagName: tagName.toUpperCase(),
|
|
46
|
+
setAttribute: vi.fn(),
|
|
47
|
+
appendChild: vi.fn(),
|
|
48
|
+
remove: vi.fn(),
|
|
49
|
+
children: [],
|
|
50
|
+
parentNode: null,
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
if (tagName === 'div') {
|
|
54
|
+
element.appendChild = vi.fn((child) => {
|
|
55
|
+
child.parentNode = element;
|
|
56
|
+
element.children.push(child);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return element;
|
|
61
|
+
}),
|
|
62
|
+
body: {
|
|
63
|
+
...document.body,
|
|
64
|
+
appendChild: vi.fn(),
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
writable: true,
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
afterEach(() => {
|
|
72
|
+
if (toastManager.toasts) {
|
|
73
|
+
toastManager.toasts.clear();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
document.body.innerHTML = '';
|
|
77
|
+
|
|
78
|
+
vi.clearAllMocks();
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
describe('Container Management', () => {
|
|
82
|
+
test('creates container on first toast', () => {
|
|
83
|
+
const createElementSpy = vi.spyOn(document, 'createElement');
|
|
84
|
+
const appendChildSpy = vi.spyOn(document.body, 'appendChild');
|
|
85
|
+
|
|
86
|
+
toastManager.show({ title: 'Test Toast' });
|
|
87
|
+
|
|
88
|
+
expect(createElementSpy).toHaveBeenCalledWith('div');
|
|
89
|
+
expect(appendChildSpy).toHaveBeenCalled();
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
test('reuses existing container', () => {
|
|
93
|
+
const createElementSpy = vi.spyOn(document, 'createElement');
|
|
94
|
+
|
|
95
|
+
toastManager.show({ title: 'First Toast' });
|
|
96
|
+
const firstCallCount = createElementSpy.mock.calls.length;
|
|
97
|
+
|
|
98
|
+
toastManager.show({ title: 'Second Toast' });
|
|
99
|
+
const secondCallCount = createElementSpy.mock.calls.length;
|
|
100
|
+
|
|
101
|
+
// First toast: container div + wrapper div = 2 calls
|
|
102
|
+
// Second toast: only wrapper div = 1 more call
|
|
103
|
+
// Total: 3 calls (1 container + 2 wrappers)
|
|
104
|
+
expect(secondCallCount).toBe(firstCallCount + 1);
|
|
105
|
+
|
|
106
|
+
expect(createElementSpy).toHaveBeenCalledWith('div');
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
describe('Toast Instance Management', () => {
|
|
111
|
+
test('generates unique IDs for toasts', () => {
|
|
112
|
+
const toast1 = toastManager.show({ title: 'First Toast' });
|
|
113
|
+
const toast2 = toastManager.show({ title: 'Second Toast' });
|
|
114
|
+
|
|
115
|
+
expect(toast1.id).not.toBe(toast2.id);
|
|
116
|
+
expect(toast1.id).toMatch(/^toast-\d+$/);
|
|
117
|
+
expect(toast2.id).toMatch(/^toast-\d+$/);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
test('stores toast instances in map', () => {
|
|
121
|
+
const toast1 = toastManager.show({ title: 'First Toast' });
|
|
122
|
+
const toast2 = toastManager.show({ title: 'Second Toast' });
|
|
123
|
+
|
|
124
|
+
expect(toastManager.toasts.has(toast1.id)).toBe(true);
|
|
125
|
+
expect(toastManager.toasts.has(toast2.id)).toBe(true);
|
|
126
|
+
expect(toastManager.toasts.size).toBe(2);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
test('creates toast with correct props', () => {
|
|
130
|
+
const props = {
|
|
131
|
+
title: 'Test Toast',
|
|
132
|
+
description: 'Test Description',
|
|
133
|
+
type: 'success',
|
|
134
|
+
timeout: 3000,
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
toastManager.show(props);
|
|
138
|
+
|
|
139
|
+
expect(mockCreateApp).toHaveBeenCalledWith(
|
|
140
|
+
Toast,
|
|
141
|
+
expect.objectContaining({
|
|
142
|
+
title: 'Test Toast',
|
|
143
|
+
description: 'Test Description',
|
|
144
|
+
type: 'success',
|
|
145
|
+
timeout: 3000,
|
|
146
|
+
onClose: expect.any(Function),
|
|
147
|
+
onDestroy: expect.any(Function),
|
|
148
|
+
}),
|
|
149
|
+
);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
test('mounts toast app to wrapper element', () => {
|
|
153
|
+
toastManager.show({ title: 'Test Toast' });
|
|
154
|
+
|
|
155
|
+
expect(mockMount).toHaveBeenCalled();
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
describe('Toast Close Functionality', () => {
|
|
160
|
+
test('removes toast from map when closed', () => {
|
|
161
|
+
const toastInstance = toastManager.show({ title: 'Test Toast' });
|
|
162
|
+
|
|
163
|
+
expect(toastManager.toasts.has(toastInstance.id)).toBe(true);
|
|
164
|
+
|
|
165
|
+
toastManager.close(toastInstance.id);
|
|
166
|
+
|
|
167
|
+
expect(toastManager.toasts.has(toastInstance.id)).toBe(false);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
test('handles closing non-existent toast gracefully', () => {
|
|
171
|
+
expect(() => {
|
|
172
|
+
toastManager.close('non-existent-id');
|
|
173
|
+
}).not.toThrow();
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
test('calls close when onClose is triggered', () => {
|
|
177
|
+
const closeSpy = vi.spyOn(toastManager, 'close');
|
|
178
|
+
|
|
179
|
+
toastManager.show({ title: 'Test Toast' });
|
|
180
|
+
|
|
181
|
+
const createAppCall = mockCreateApp.mock.calls[0];
|
|
182
|
+
const props = createAppCall[1];
|
|
183
|
+
const onCloseCallback = props.onClose;
|
|
184
|
+
|
|
185
|
+
onCloseCallback();
|
|
186
|
+
|
|
187
|
+
expect(closeSpy).toHaveBeenCalled();
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
describe('Toast Destroy Functionality', () => {
|
|
192
|
+
test('unmounts app and removes wrapper on destroy', () => {
|
|
193
|
+
toastManager.show({ title: 'Test Toast' });
|
|
194
|
+
|
|
195
|
+
const createAppCall = mockCreateApp.mock.calls[0];
|
|
196
|
+
const props = createAppCall[1];
|
|
197
|
+
const onDestroyCallback = props.onDestroy;
|
|
198
|
+
|
|
199
|
+
onDestroyCallback();
|
|
200
|
+
|
|
201
|
+
expect(mockUnmount).toHaveBeenCalled();
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
test('resolves promise when toast is destroyed', async () => {
|
|
205
|
+
const toastInstance = toastManager.show({ title: 'Test Toast' });
|
|
206
|
+
|
|
207
|
+
const createAppCall = mockCreateApp.mock.calls[0];
|
|
208
|
+
const props = createAppCall[1];
|
|
209
|
+
const onDestroyCallback = props.onDestroy;
|
|
210
|
+
|
|
211
|
+
const promiseResolved = vi.fn();
|
|
212
|
+
toastInstance.promise.then(promiseResolved);
|
|
213
|
+
|
|
214
|
+
onDestroyCallback();
|
|
215
|
+
|
|
216
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
217
|
+
|
|
218
|
+
expect(promiseResolved).toHaveBeenCalled();
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
describe('Toast API', () => {
|
|
223
|
+
beforeEach(() => {
|
|
224
|
+
vi.spyOn(toastManager, 'show').mockReturnValue({
|
|
225
|
+
id: 'mock-id',
|
|
226
|
+
props: {},
|
|
227
|
+
close: vi.fn(),
|
|
228
|
+
promise: Promise.resolve(),
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
test('toast.info creates informational toast', () => {
|
|
233
|
+
toast.info('Info Title', 'Info Description', { timeout: 1000 });
|
|
234
|
+
|
|
235
|
+
expect(toastManager.show).toHaveBeenCalledWith({
|
|
236
|
+
title: 'Info Title',
|
|
237
|
+
description: 'Info Description',
|
|
238
|
+
timeout: 1000,
|
|
239
|
+
type: 'informational',
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
test('toast.success creates success toast', () => {
|
|
244
|
+
toast.success('Success Title', 'Success Description');
|
|
245
|
+
|
|
246
|
+
expect(toastManager.show).toHaveBeenCalledWith({
|
|
247
|
+
title: 'Success Title',
|
|
248
|
+
description: 'Success Description',
|
|
249
|
+
type: 'success',
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
test('toast.attention creates attention toast', () => {
|
|
254
|
+
toast.attention('Attention Title');
|
|
255
|
+
|
|
256
|
+
expect(toastManager.show).toHaveBeenCalledWith({
|
|
257
|
+
title: 'Attention Title',
|
|
258
|
+
type: 'attention',
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
test('toast.error creates error toast', () => {
|
|
263
|
+
toast.error('Error Title', 'Error Description', {
|
|
264
|
+
button: { text: 'Retry', action: vi.fn() },
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
expect(toastManager.show).toHaveBeenCalledWith({
|
|
268
|
+
title: 'Error Title',
|
|
269
|
+
description: 'Error Description',
|
|
270
|
+
button: { text: 'Retry', action: expect.any(Function) },
|
|
271
|
+
type: 'error',
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
test('toast methods return promises', async () => {
|
|
276
|
+
const infoPromise = toast.info('Test');
|
|
277
|
+
const successPromise = toast.success('Test');
|
|
278
|
+
const attentionPromise = toast.attention('Test');
|
|
279
|
+
const errorPromise = toast.error('Test');
|
|
280
|
+
|
|
281
|
+
expect(infoPromise).toBeInstanceOf(Promise);
|
|
282
|
+
expect(successPromise).toBeInstanceOf(Promise);
|
|
283
|
+
expect(attentionPromise).toBeInstanceOf(Promise);
|
|
284
|
+
expect(errorPromise).toBeInstanceOf(Promise);
|
|
285
|
+
|
|
286
|
+
await Promise.all([
|
|
287
|
+
infoPromise,
|
|
288
|
+
successPromise,
|
|
289
|
+
attentionPromise,
|
|
290
|
+
errorPromise,
|
|
291
|
+
]);
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
});
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export interface ToastManager {
|
|
2
|
+
show: (props: ToastProps) => ToastInstance;
|
|
3
|
+
close: (id: string) => void;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export interface ToastButton {
|
|
7
|
+
text: string;
|
|
8
|
+
action: () => void;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export type ToastType = 'informational' | 'attention' | 'success' | 'error';
|
|
12
|
+
|
|
13
|
+
export interface ToastProps extends ToastOptions {
|
|
14
|
+
title: string;
|
|
15
|
+
description?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface ToastOptions {
|
|
19
|
+
type?: ToastType;
|
|
20
|
+
button?: ToastButton;
|
|
21
|
+
timeout?: number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface ToastEmits {
|
|
25
|
+
close: [];
|
|
26
|
+
destroy: [];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface ToastInstance {
|
|
30
|
+
id: string;
|
|
31
|
+
props: ToastProps;
|
|
32
|
+
close: () => void;
|
|
33
|
+
promise: Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface ToastCall {
|
|
37
|
+
info: (
|
|
38
|
+
title: string,
|
|
39
|
+
description?: string,
|
|
40
|
+
options?: ToastOptions,
|
|
41
|
+
) => Promise<void>;
|
|
42
|
+
success: (
|
|
43
|
+
title: string,
|
|
44
|
+
description?: string,
|
|
45
|
+
options?: ToastOptions,
|
|
46
|
+
) => Promise<void>;
|
|
47
|
+
attention: (
|
|
48
|
+
title: string,
|
|
49
|
+
description?: string,
|
|
50
|
+
options?: ToastOptions,
|
|
51
|
+
) => Promise<void>;
|
|
52
|
+
error: (
|
|
53
|
+
title: string,
|
|
54
|
+
description?: string,
|
|
55
|
+
options?: ToastOptions,
|
|
56
|
+
) => Promise<void>;
|
|
57
|
+
}
|