From 13bb69e03cd65bf98b803454a47b5e2e651e3f7c Mon Sep 17 00:00:00 2001 From: Kristina Date: Thu, 20 Mar 2025 11:36:57 +0400 Subject: [PATCH] Add lazy for emojis groups (#8292) Signed-off-by: Kristina Fefelova --- .../ui/src/components/emoji/EmojiGroup.svelte | 105 +++++++++++++ .../components/emoji/EmojiGroupPalette.svelte | 58 +++++++ .../ui/src/components/emoji/EmojiPopup.svelte | 146 ++++-------------- 3 files changed, 195 insertions(+), 114 deletions(-) create mode 100644 packages/ui/src/components/emoji/EmojiGroup.svelte create mode 100644 packages/ui/src/components/emoji/EmojiGroupPalette.svelte diff --git a/packages/ui/src/components/emoji/EmojiGroup.svelte b/packages/ui/src/components/emoji/EmojiGroup.svelte new file mode 100644 index 0000000000..2123a4ebef --- /dev/null +++ b/packages/ui/src/components/emoji/EmojiGroup.svelte @@ -0,0 +1,105 @@ + + + + +
+
+
+ {#if lazy} + + + + {:else} + + {/if} +
+ + diff --git a/packages/ui/src/components/emoji/EmojiGroupPalette.svelte b/packages/ui/src/components/emoji/EmojiGroupPalette.svelte new file mode 100644 index 0000000000..2a1d2f6eee --- /dev/null +++ b/packages/ui/src/components/emoji/EmojiGroupPalette.svelte @@ -0,0 +1,58 @@ + + + + +
+ {#each emojis as emoji} + { + dispatch('touchstart', { event, emoji }) + }} + on:contextmenu={(event) => { + dispatch('contextmenu', { event, emoji }) + }} + /> + {/each} +
+
+ + diff --git a/packages/ui/src/components/emoji/EmojiPopup.svelte b/packages/ui/src/components/emoji/EmojiPopup.svelte index 0232e4d7fe..599f057e68 100644 --- a/packages/ui/src/components/emoji/EmojiPopup.svelte +++ b/packages/ui/src/components/emoji/EmojiPopup.svelte @@ -6,7 +6,6 @@ import { createEventDispatcher, onMount, onDestroy } from 'svelte' import type { Emoji } from 'emojibase' import { - Label, Scroller, SearchInput, tooltip, @@ -14,13 +13,11 @@ showPopup, eventToHTMLElement, ButtonBase, - closeTooltip, - Spinner + closeTooltip } from '../../' import plugin from '../../plugin' import { searchEmoji, - resultEmojis, emojiStore, generateSkinToneEmojis, emojiCategories, @@ -32,10 +29,10 @@ setSkinTone } from '.' import type { EmojiWithGroup, EmojiCategory } from '.' - import EmojiButton from './EmojiButton.svelte' import ActionsPopup from './ActionsPopup.svelte' import SkinTonePopup from './SkinTonePopup.svelte' import IconSearch from './icons/Search.svelte' + import EmojiGroup from './EmojiGroup.svelte' export let embedded = false export let selected: string | undefined @@ -43,7 +40,6 @@ export let kind: 'default' | 'fade' = 'fade' const dispatch = createEventDispatcher() - closeTooltip() let scrollElement: HTMLDivElement const touchEvents = ['touchend', 'touchcancel', 'touchmove'] @@ -63,7 +59,6 @@ let timer: any = null const isMobile = $deviceInfo.isMobile - let loading: boolean = true let emojisCat = emojiCategories let currentCategory = emojisCat[0] $: emojiTabs = emojisCat @@ -212,11 +207,11 @@ (em) => em.categories !== undefined || (Array.isArray(em.emojis) && em.emojis.length > 0) ) currentCategory = emojisCat.find((ec) => ec.emojis !== undefined) ?? emojisCat[0] - loading = false } onMount(() => { if (scrollElement !== undefined) scrollElement.addEventListener('scroll', checkScroll) + closeTooltip() setTimeout(initEmoji) }) onDestroy(() => { @@ -229,7 +224,7 @@ $: outputGroups = updateGroups(searching, emojisCat) -
+
{#each categoryTabs as category (category.id)} @@ -237,7 +232,6 @@ class="hulyPopupEmoji-header__tab" class:selected={(searching && searchCategory[0].id === category.id) || (!searching && currentCategory.id === category.id)} - disabled={loading} data-id={category.id} use:tooltip={{ label: category.label }} on:click={() => { @@ -279,42 +273,34 @@ {generateSkinToneEmojis(0x1f590)[skinTone]}
- - {#if loading} -
- {:else} - {#each outputGroups as group (group.id)} - {@const canRemove = group.id === 'frequently-used'} - {@const emojisGroup = searching - ? $resultEmojis - : Array.isArray(group.emojis) - ? group.emojis - : $resultEmojis.filter((re) => re.key === group.id)} -
-
-
-
- {#each emojisGroup as emoji} - { - clampedContextMenu(event, emoji, canRemove) - }} - on:contextmenu={(event) => { - handleContextMenu(event, emoji, canRemove) - }} - /> - {/each} -
-
-
- {/each} - {/if} + + {#each outputGroups as group (group.id)} + {@const canRemove = group.id === 'frequently-used'} + { + const { event, emoji } = ev.detail + clampedContextMenu(event, emoji, canRemove) + }} + on:contextmenu={(ev) => { + const { event, emoji } = ev.detail + handleContextMenu(event, emoji, canRemove) + }} + /> + {/each} {#if !hidden && kind === 'fade'} @@ -428,55 +414,6 @@ padding: 0 0.75rem; } - .hulyPopupEmoji-group { - display: flex; - flex-direction: column; - flex-wrap: nowrap; - min-width: 0; - min-height: 0; - - &__header { - position: sticky; - flex-shrink: 0; - margin: 0.75rem 0.75rem 0.25rem; - padding: 0.25rem 0.375rem; - top: 0; - height: 1.5rem; - font-size: 0.75rem; - font-weight: 600; - text-transform: uppercase; - text-shadow: 0 0 0.25rem var(--theme-popup-color); - color: var(--theme-caption-color); - border-radius: 0.25rem; - z-index: 1; - pointer-events: none; - - &:first-child { - margin-top: 0; - } - &::before { - content: ''; - position: absolute; - top: -1px; - left: 0; - width: 100%; - height: 150%; - background: var(--theme-popup-trans-gradient); - z-index: -1; - } - } - &__palette { - display: flex; - justify-content: space-between; - flex-wrap: wrap; - flex-shrink: 0; - margin-inline: 0.75rem; - font-size: 1.25rem; - } - } - .hulyPopupEmoji-group + .hulyPopupEmoji-group { - margin-top: 0.5rem; - } .hulyPopupEmoji-footer { position: absolute; left: 50%; @@ -489,24 +426,5 @@ z-index: 1; pointer-events: none; } - - &.kind-default { - .hulyPopupEmoji-group__header { - background: var(--theme-popup-header); - - &::before { - content: none; - } - } - } - - &.loading { - .hulyPopupEmoji-header__tab { - color: var(--theme-trans-color); - } - :global(.scroll) { - justify-content: center; - } - } }