|
2 | 2 | import { toastsStore } from "$lib/stores/toasts.store"; |
3 | 3 | import { fade, fly } from "svelte/transition"; |
4 | 4 | import { i18n } from "$lib/stores/i18n"; |
5 | | - import type { |
6 | | - ToastLevel, |
7 | | - ToastMsg, |
8 | | - ToastPosition, |
9 | | - ToastTheme, |
10 | | - } from "$lib/types/toast"; |
| 5 | + import type { ToastLevel, ToastMsg } from "$lib/types/toast"; |
11 | 6 | import { onDestroy, onMount, type Component } from "svelte"; |
12 | 7 | import Spinner from "./Spinner.svelte"; |
13 | 8 | import IconWarning from "$lib/icons/IconWarning.svelte"; |
|
19 | 14 | import { isNullish, nonNullish } from "@dfinity/utils"; |
20 | 15 | import Html from "./Html.svelte"; |
21 | 16 |
|
22 | | - export let msg: ToastMsg; |
| 17 | + interface Props { |
| 18 | + msg: ToastMsg; |
| 19 | + } |
| 20 | +
|
| 21 | + let { msg }: Props = $props(); |
23 | 22 |
|
24 | 23 | const iconMapper = (level: ToastLevel): Component | undefined => |
25 | 24 | ({ |
|
32 | 31 |
|
33 | 32 | const close = () => toastsStore.hide(msg.id); |
34 | 33 |
|
35 | | - let text: string; |
36 | | - let level: ToastLevel; |
37 | | - let spinner: boolean | undefined; |
38 | | - let title: string | undefined; |
39 | | - let overflow: "scroll" | "truncate" | "clamp" | undefined; |
40 | | - let position: ToastPosition | undefined; |
41 | | - let icon: Component | undefined; |
42 | | - let theme: ToastTheme | undefined; |
43 | | - let renderAsHtml: boolean | undefined; |
44 | | -
|
45 | | - $: ({ |
| 34 | + let { |
46 | 35 | text, |
47 | 36 | level, |
48 | 37 | spinner, |
|
52 | 41 | icon, |
53 | 42 | theme, |
54 | 43 | renderAsHtml, |
55 | | - } = msg); |
| 44 | + } = $derived(msg); |
| 45 | +
|
| 46 | + let scroll = $derived(overflow === undefined || overflow === "scroll"); |
| 47 | +
|
| 48 | + let truncate = $derived(overflow === "truncate"); |
56 | 49 |
|
57 | | - let scroll: boolean; |
58 | | - $: scroll = overflow === undefined || overflow === "scroll"; |
59 | | - let truncate: boolean; |
60 | | - $: truncate = overflow === "truncate"; |
61 | | - let clamp: boolean; |
62 | | - $: clamp = overflow === "clamp"; |
| 50 | + let clamp = $derived(overflow === "clamp"); |
63 | 51 |
|
64 | | - let timeoutId: NodeJS.Timeout | undefined = undefined; |
| 52 | + let timeoutId = $state<NodeJS.Timeout | undefined>(); |
65 | 53 |
|
66 | 54 | const autoHide = () => { |
67 | 55 | const { duration } = msg; |
|
99 | 87 | {#if spinner} |
100 | 88 | <Spinner size="small" inline /> |
101 | 89 | {:else if nonNullish(icon)} |
102 | | - <svelte:component this={icon} /> |
| 90 | + {@const IconCmp = icon} |
| 91 | + <IconCmp /> |
103 | 92 | {:else if iconMapper(level)} |
104 | | - <svelte:component this={iconMapper(level)} size={DEFAULT_ICON_SIZE} /> |
| 93 | + {@const MappedIconCmp = iconMapper(level)} |
| 94 | + <MappedIconCmp size={DEFAULT_ICON_SIZE} /> |
105 | 95 | {/if} |
106 | 96 | </div> |
107 | 97 |
|
|
126 | 116 | <button |
127 | 117 | data-tid="close-button" |
128 | 118 | class="close" |
129 | | - on:click={close} |
| 119 | + onclick={close} |
130 | 120 | aria-label={$i18n.core.close}><IconClose /></button |
131 | 121 | > |
132 | 122 | </div> |
|
0 commit comments