diff --git a/src/lib/components/index.ts b/src/lib/components/index.ts index c5a94d8..46bf83b 100644 --- a/src/lib/components/index.ts +++ b/src/lib/components/index.ts @@ -37,4 +37,5 @@ export * from './atom'; export * from './container'; export * from './calendar'; export * from './date-picker'; -export * from './qr-code'; \ No newline at end of file +export * from './qr-code'; +export * from './lazy'; diff --git a/src/lib/components/lazy/index.ts b/src/lib/components/lazy/index.ts new file mode 100644 index 0000000..a5334cf --- /dev/null +++ b/src/lib/components/lazy/index.ts @@ -0,0 +1 @@ +export { default as Lazy } from './lazy.svelte'; diff --git a/src/lib/components/lazy/lazy.stories.svelte b/src/lib/components/lazy/lazy.stories.svelte new file mode 100644 index 0000000..d2ebd31 --- /dev/null +++ b/src/lib/components/lazy/lazy.stories.svelte @@ -0,0 +1,35 @@ + + + + + + {#snippet children({ args })} + + {#snippet children({})} + { + await delay(1000 * 5); + + return res.default; + })} + > + Hello World + + {#snippet loading()} + Loading... + {/snippet} + + {/snippet} + + {/snippet} + diff --git a/src/lib/components/lazy/lazy.svelte b/src/lib/components/lazy/lazy.svelte new file mode 100644 index 0000000..c4cbc43 --- /dev/null +++ b/src/lib/components/lazy/lazy.svelte @@ -0,0 +1,28 @@ + + + + {@render children?.()} + + +{#if err && error} + {@render error?.()} +{:else if !Lazy} + {@render loading?.()} +{/if} diff --git a/src/lib/components/lazy/types.ts b/src/lib/components/lazy/types.ts new file mode 100644 index 0000000..8c5b85f --- /dev/null +++ b/src/lib/components/lazy/types.ts @@ -0,0 +1,12 @@ +import type { Component, Snippet } from 'svelte'; +import type { HtmlAtomProps } from '../atom'; + +// eslint-disable-next-line @typescript-eslint/no-empty-object-type +export interface LazyExtendProps {} + +export interface LazyProps extends HtmlAtomProps<'button'>, LazyExtendProps { + promise: Promise; + children?: Snippet; + error?: Snippet; + loading?: Snippet; +}