Skip to content

Commit 9c726be

Browse files
feat: Migrate component Toast to Svelte 5 (#669)
# Motivation Migrating component `Toast` to Svelte 5.
1 parent 2c95d30 commit 9c726be

File tree

1 file changed

+19
-29
lines changed

1 file changed

+19
-29
lines changed

src/lib/components/Toast.svelte

Lines changed: 19 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,7 @@
22
import { toastsStore } from "$lib/stores/toasts.store";
33
import { fade, fly } from "svelte/transition";
44
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";
116
import { onDestroy, onMount, type Component } from "svelte";
127
import Spinner from "./Spinner.svelte";
138
import IconWarning from "$lib/icons/IconWarning.svelte";
@@ -19,7 +14,11 @@
1914
import { isNullish, nonNullish } from "@dfinity/utils";
2015
import Html from "./Html.svelte";
2116
22-
export let msg: ToastMsg;
17+
interface Props {
18+
msg: ToastMsg;
19+
}
20+
21+
let { msg }: Props = $props();
2322
2423
const iconMapper = (level: ToastLevel): Component | undefined =>
2524
({
@@ -32,17 +31,7 @@
3231
3332
const close = () => toastsStore.hide(msg.id);
3433
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 {
4635
text,
4736
level,
4837
spinner,
@@ -52,16 +41,15 @@
5241
icon,
5342
theme,
5443
renderAsHtml,
55-
} = msg);
44+
} = $derived(msg);
45+
46+
let scroll = $derived(overflow === undefined || overflow === "scroll");
47+
48+
let truncate = $derived(overflow === "truncate");
5649
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");
6351
64-
let timeoutId: NodeJS.Timeout | undefined = undefined;
52+
let timeoutId = $state<NodeJS.Timeout | undefined>();
6553
6654
const autoHide = () => {
6755
const { duration } = msg;
@@ -99,9 +87,11 @@
9987
{#if spinner}
10088
<Spinner size="small" inline />
10189
{:else if nonNullish(icon)}
102-
<svelte:component this={icon} />
90+
{@const IconCmp = icon}
91+
<IconCmp />
10392
{: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} />
10595
{/if}
10696
</div>
10797

@@ -126,7 +116,7 @@
126116
<button
127117
data-tid="close-button"
128118
class="close"
129-
on:click={close}
119+
onclick={close}
130120
aria-label={$i18n.core.close}><IconClose /></button
131121
>
132122
</div>

0 commit comments

Comments
 (0)