UNPKG

@udecode/plate-emoji

Version:

Emoji plugin for Plate

1 lines 46.1 kB
{"version":3,"sources":["../../src/react/EmojiPlugin.tsx","../../src/lib/BaseEmojiPlugin.ts","../../src/lib/types.ts","../../src/lib/constants.ts","../../src/lib/transforms/insertEmoji.ts","../../src/lib/utils/EmojiLibrary/EmojiInlineLibrary.ts","../../src/lib/utils/Grid/Grid.ts","../../src/lib/utils/Grid/GridSection.ts","../../src/lib/utils/IndexSearch/IndexSearch.ts","../../src/lib/utils/IndexSearch/EmojiFloatingIndexSearch.ts","../../src/react/hooks/useEmojiDropdownMenuState.ts","../../src/react/storage/LocalStorage.ts","../../src/react/storage/FrequentEmojiStorage.ts","../../src/react/utils/EmojiObserver.ts","../../src/react/utils/EmojiPickerState.ts","../../src/react/utils/EmojiLibrary/EmojiFloatingGrid.ts","../../src/react/utils/EmojiLibrary/EmojiFloatingGridBuilder.ts","../../src/react/utils/EmojiLibrary/EmojiFloatingLibrary.ts","../../src/react/hooks/useEmojiPicker.ts"],"sourcesContent":["import { toPlatePlugin } from '@udecode/plate/react';\n\nimport { BaseEmojiInputPlugin, BaseEmojiPlugin } from '../lib';\n\nexport const EmojiInputPlugin = toPlatePlugin(BaseEmojiInputPlugin);\n\nexport const EmojiPlugin = toPlatePlugin(BaseEmojiPlugin, {\n plugins: [EmojiInputPlugin],\n});\n","import type { Emoji, EmojiMartData } from '@emoji-mart/data';\n\nimport {\n type Descendant,\n type PluginConfig,\n createSlatePlugin,\n createTSlatePlugin,\n} from '@udecode/plate';\nimport {\n type TriggerComboboxPluginOptions,\n withTriggerCombobox,\n} from '@udecode/plate-combobox';\n\nimport { DEFAULT_EMOJI_LIBRARY } from './constants';\n\nexport type EmojiInputConfig = PluginConfig<\n 'emoji',\n {\n /**\n * The emoji data.\n *\n * @example\n * import emojiMartData from '@emoji-mart/data';\n */\n data?: EmojiMartData;\n createEmojiNode?: (emoji: Emoji) => Descendant;\n } & TriggerComboboxPluginOptions\n>;\n\nexport const BaseEmojiInputPlugin = createSlatePlugin({\n key: 'emoji_input',\n node: { isElement: true, isInline: true, isVoid: true },\n});\n\nexport const BaseEmojiPlugin = createTSlatePlugin<EmojiInputConfig>({\n key: 'emoji',\n options: {\n data: DEFAULT_EMOJI_LIBRARY,\n trigger: ':',\n triggerPreviousCharPattern: /^\\s?$/,\n createComboboxInput: () => ({\n children: [{ text: '' }],\n type: BaseEmojiInputPlugin.key,\n }),\n createEmojiNode: ({ skins }) => ({ text: skins[0].native }),\n },\n plugins: [BaseEmojiInputPlugin],\n}).overrideEditor(withTriggerCombobox);\n","export type EmojiSettingsType = {\n buttonSize: {\n value: number;\n };\n categories: {\n value?: EmojiCategoryList[];\n };\n perLine: {\n value: number;\n };\n showFrequent: {\n value: boolean;\n key?: string;\n limit?: number;\n prefix?: string;\n };\n};\n\ntype ReverseMap<T> = T[keyof T];\n\nexport const EmojiCategory = {\n Activity: 'activity',\n Custom: 'custom',\n Flags: 'flags',\n Foods: 'foods',\n Frequent: 'frequent',\n Nature: 'nature',\n Objects: 'objects',\n People: 'people',\n Places: 'places',\n Symbols: 'symbols',\n} as const;\n\nexport type EmojiCategoryList = ReverseMap<typeof EmojiCategory>;\n\nexport type EmojiIconList<T = string> = {\n categories: Record<EmojiCategoryList, { outline: T; solid: T }>;\n search: {\n delete: T;\n loupe: T;\n };\n};\n\nexport type FrequentEmojis = Record<string, number>;\n\nexport type i18nProps = {\n categories: Record<EmojiCategoryList, string>;\n clear: string;\n pick: string;\n search: string;\n searchNoResultsSubtitle: string;\n searchNoResultsTitle: string;\n searchResult: string;\n skins: Record<'1' | '2' | '3' | '4' | '5' | '6' | 'choose', string>;\n};\n","import type { EmojiMartData } from '@emoji-mart/data';\n\nimport {\n type EmojiCategoryList,\n type EmojiSettingsType,\n type FrequentEmojis,\n type i18nProps,\n EmojiCategory,\n} from './types';\n\nexport const EMOJI_MAX_SEARCH_RESULT = 60;\n\nexport const DEFAULT_EMOJI_LIBRARY: EmojiMartData = {\n aliases: {},\n categories: [\n {\n id: 'people',\n emojis: ['+1'],\n },\n ],\n emojis: {\n '+1': {\n id: '+1',\n keywords: [],\n name: 'Thumbs Up',\n skins: [\n {\n native: '👍',\n unified: '1f44d',\n },\n {\n native: '👍🏻',\n unified: '1f44d-1f3fb',\n },\n {\n native: '👍🏼',\n unified: '1f44d-1f3fc',\n },\n {\n native: '👍🏽',\n unified: '1f44d-1f3fd',\n },\n {\n native: '👍🏾',\n unified: '1f44d-1f3fe',\n },\n {\n native: '👍🏿',\n unified: '1f44d-1f3ff',\n },\n ],\n version: 1,\n },\n },\n sheet: {\n cols: 1,\n rows: 1,\n },\n};\n\nexport const defaultCategories: EmojiCategoryList[] = [\n EmojiCategory.People,\n EmojiCategory.Nature,\n EmojiCategory.Foods,\n EmojiCategory.Activity,\n EmojiCategory.Places,\n EmojiCategory.Objects,\n EmojiCategory.Symbols,\n EmojiCategory.Flags,\n];\n\nexport const EmojiSettings: EmojiSettingsType = {\n buttonSize: {\n value: 36,\n },\n categories: {\n value: undefined,\n },\n perLine: {\n value: 8,\n },\n showFrequent: {\n limit: 16,\n value: true,\n },\n};\n\nexport const DEFAULT_FREQUENTLY_USED_EMOJI: FrequentEmojis = {\n '+1': 1,\n clap: 1,\n grinning: 1,\n heart: 1,\n heart_eyes: 1,\n hugging_face: 1,\n joy: 1,\n kissing_heart: 1,\n laughing: 1,\n pray: 1,\n rocket: 1,\n scream: 1,\n see_no_evil: 1,\n};\n\nexport const NUM_OF_CATEGORIES = Object.values(EmojiCategory).length;\n\nexport const i18n: i18nProps = {\n categories: {\n activity: 'Activity',\n custom: 'Custom',\n flags: 'Flags',\n foods: 'Food & Drink',\n frequent: 'Frequently used',\n nature: 'Animals & Nature',\n objects: 'Objects',\n people: 'Smileys & People',\n places: 'Travel & Places',\n symbols: 'Symbols',\n },\n clear: 'Clear',\n pick: 'Pick an emoji...',\n search: 'Search all emoji',\n searchNoResultsSubtitle: 'That emoji couldn’t be found',\n searchNoResultsTitle: 'Oh no!',\n searchResult: 'Search Results',\n skins: {\n '1': 'Default',\n '2': 'Light',\n '3': 'Medium-Light',\n '4': 'Medium',\n '5': 'Medium-Dark',\n '6': 'Dark',\n choose: 'Choose default skin tone',\n },\n};\n","import type { Emoji } from '@emoji-mart/data';\nimport type { SlateEditor } from '@udecode/plate';\n\nimport { BaseEmojiPlugin } from '../BaseEmojiPlugin';\n\nexport const insertEmoji = <TEmoji extends Emoji = Emoji>(\n editor: SlateEditor,\n emoji: TEmoji\n) => {\n const { createEmojiNode } = editor.getOptions(BaseEmojiPlugin);\n\n const emojiNode = createEmojiNode!(emoji);\n editor.tf.insertNodes(emojiNode);\n};\n","import type {\n Emoji,\n EmojiLibrary,\n Emojis,\n IEmojiLibrary,\n} from './EmojiLibrary.types';\n\nimport { DEFAULT_EMOJI_LIBRARY } from '../../constants';\n\nexport type THash = Record<string, string>;\n\nexport class EmojiInlineLibrary implements IEmojiLibrary {\n protected _emojis: Emojis;\n protected _hash: THash = {};\n protected _keys: string[] = [];\n\n constructor(library: EmojiLibrary = DEFAULT_EMOJI_LIBRARY) {\n this._emojis = library.emojis;\n this.init();\n }\n\n private createSearchableString(emoji: Emoji) {\n const { id, keywords, name } = emoji;\n\n return `${id},${this.getName(name)},${keywords.join(',')}`;\n }\n\n private getName(name: string) {\n return name.toLowerCase().split(' ').join(',');\n }\n\n private init() {\n Object.values(this._emojis).forEach((emoji) => {\n const searchableString = this.createSearchableString(emoji);\n this._keys.push(searchableString);\n this._hash[searchableString] = emoji.id;\n });\n }\n\n getEmoji(id: string) {\n return this._emojis[id];\n }\n\n getEmojiId(key: string) {\n return this._hash[key];\n }\n\n get keys(): string[] {\n return this._keys;\n }\n}\n","import type {\n GridElements,\n IGrid,\n IGridSection,\n SectionElements,\n SectionId,\n} from './Grid.types';\n\nexport class Grid<R, T extends SectionId = SectionId> implements IGrid<R, T> {\n protected grid = new Map<T, IGridSection<R, T>>();\n protected rowsCount = 1;\n protected sectionsIds: T[] = [];\n\n public addSection(\n sectionId: T,\n section: IGridSection<R, T>,\n elements: GridElements\n ) {\n section.setIndexRowStart(this.rowsCount).addElements(elements[sectionId]);\n this.rowsCount += section.rowsNum;\n this.grid.set(sectionId, section);\n this.sectionsIds.push(sectionId);\n\n return this;\n }\n\n public indexOf(sectionId: T) {\n return this.sectionsIds.indexOf(sectionId);\n }\n\n public section(sectionId: T) {\n return this.grid.get(sectionId)!;\n }\n\n public sections() {\n return Array.from(this.grid.values());\n }\n\n public updateSection(sectionId: T, elements: SectionElements) {\n if (this.grid.has(sectionId)) {\n const section = this.grid.get(sectionId);\n section!.updateElements(elements);\n }\n\n return this;\n }\n\n public get size() {\n return this.grid.size;\n }\n}\n","import type {\n GridRows,\n IGridSection,\n SectionElements,\n SectionId,\n Unknown,\n} from './Grid.types';\n\nexport abstract class AGridSection<R extends Unknown, T = SectionId>\n implements IGridSection<R, T>\n{\n protected _indexRowStart = 0;\n protected _root!: R;\n protected _rowsNum = 0;\n protected rows: GridRows = [];\n\n constructor(\n protected _id: T,\n protected perLine = 8\n ) {\n this.createRootRef();\n }\n\n private addRow(elements: SectionElements, lastPosition: number) {\n const start = lastPosition * this.perLine;\n const end = start + this.perLine;\n this.rows.push({\n id: this._indexRowStart + lastPosition,\n elements: elements.slice(start, end),\n });\n }\n\n private initRows(elements: SectionElements) {\n let i = 0;\n\n while (i < this.rowsNum) {\n this.addRow(elements, i++);\n }\n }\n\n protected abstract createRootRef(): void;\n\n public addElements(elements: SectionElements) {\n this._rowsNum = Math.ceil(elements.length / this.perLine);\n this.initRows(elements);\n\n return this;\n }\n\n getRows() {\n return this.rows;\n }\n\n public setIndexRowStart(start: number) {\n this._indexRowStart = start;\n\n return this;\n }\n\n public updateElements(elements: SectionElements) {\n this.rows = [];\n this.addElements(elements);\n\n return this;\n }\n\n get id() {\n return this._id;\n }\n\n get root(): R {\n return this._root;\n }\n\n get rowsNum() {\n return this._rowsNum;\n }\n}\n","import type { Emoji } from '@emoji-mart/data';\n\nimport type { IEmojiLibrary } from '../EmojiLibrary';\n\nimport { EMOJI_MAX_SEARCH_RESULT } from '../../constants';\n\ninterface IIndexSearch {\n get: () => Emoji[];\n hasFound: () => boolean;\n search: (input: string) => void;\n}\n\nexport abstract class AIndexSearch implements IIndexSearch {\n protected input: string | undefined;\n protected maxResult = EMOJI_MAX_SEARCH_RESULT;\n protected result: string[] = [];\n protected scores = {};\n\n protected constructor(protected library: IEmojiLibrary) {}\n\n private createSearchResult(value: string) {\n this.scores = {};\n this.result = [];\n\n for (const key of this.library!.keys) {\n const score = key.indexOf(`${value}`);\n\n if (score === -1) continue;\n\n const emojiId = this.library!.getEmojiId(key);\n this.result.push(emojiId);\n\n (this.scores as any)[emojiId] || ((this.scores as any)[emojiId] = 0);\n (this.scores as any)[emojiId] += emojiId === value ? 0 : score + 1;\n }\n }\n\n private sortResultByScores(result: string[], scores: {}) {\n result.sort((a, b) => {\n const aScore = (scores as any)[a];\n const bScore = (scores as any)[b];\n\n if (aScore === bScore) {\n return a.localeCompare(b);\n }\n\n return aScore - bScore;\n });\n }\n\n get() {\n const emojis = [];\n\n for (const key of this.result) {\n const emoji = this.library?.getEmoji(key);\n emojis.push(emoji);\n\n if (emojis.length >= this.maxResult) break;\n }\n\n return emojis;\n }\n\n getEmoji(): Emoji | undefined {\n return this.get()[0];\n }\n\n hasFound(exact = false) {\n if (exact && this.input) {\n return this.result.includes(this.input);\n }\n\n return this.result.length > 0;\n }\n\n search(input: string): this {\n this.input = input.toLowerCase();\n const value = this.input;\n\n if (value) {\n this.createSearchResult(value);\n this.sortResultByScores(this.result, this.scores);\n } else {\n this.scores = {};\n this.result = [];\n }\n\n return this;\n }\n}\n","import type { IEmojiLibrary } from '../EmojiLibrary';\n\nimport { AIndexSearch } from './IndexSearch';\n\nexport class EmojiFloatingIndexSearch extends AIndexSearch {\n protected static instance?: EmojiFloatingIndexSearch;\n\n private constructor(protected library: IEmojiLibrary) {\n super(library);\n }\n\n public static getInstance(library: IEmojiLibrary) {\n if (!EmojiFloatingIndexSearch.instance) {\n EmojiFloatingIndexSearch.instance = new EmojiFloatingIndexSearch(library);\n }\n\n return EmojiFloatingIndexSearch.instance;\n }\n}\n","import { usePluginOption, useStableMemo } from '@udecode/plate/react';\n\nimport {\n type EmojiSettingsType,\n EmojiFloatingIndexSearch,\n EmojiSettings,\n} from '../../lib';\nimport { EmojiPlugin } from '../EmojiPlugin';\nimport { FrequentEmojiStorage } from '../storage';\nimport { EmojiFloatingLibrary } from '../utils';\nimport { useEmojiPicker } from './useEmojiPicker';\n\nexport type EmojiDropdownMenuOptions = {\n closeOnSelect?: boolean;\n settings?: EmojiSettingsType;\n};\n\nexport function useEmojiDropdownMenuState({\n closeOnSelect = true,\n settings = EmojiSettings,\n}: EmojiDropdownMenuOptions = {}) {\n const data = usePluginOption(EmojiPlugin, 'data')!;\n\n const [emojiLibrary, indexSearch] = useStableMemo(() => {\n const frequentEmojiStorage = new FrequentEmojiStorage({\n limit: settings.showFrequent.limit,\n });\n\n const emojiLibrary = EmojiFloatingLibrary.getInstance(\n settings,\n frequentEmojiStorage,\n data\n );\n\n const indexSearch = EmojiFloatingIndexSearch.getInstance(emojiLibrary);\n\n return [emojiLibrary, indexSearch] as const;\n }, [settings]);\n\n const { isOpen, setIsOpen, ...emojiPickerState } = useEmojiPicker({\n closeOnSelect,\n emojiLibrary,\n indexSearch,\n });\n\n return {\n emojiPickerState,\n isOpen,\n setIsOpen,\n };\n}\n","export interface ILocalStorage<T> {\n get: () => T;\n set: (value: T) => void;\n}\n\nexport class LocalStorage<T> implements ILocalStorage<T> {\n constructor(\n protected key: string,\n protected defaultValue: T\n ) {}\n\n get(): T {\n let value = this.defaultValue;\n\n if (typeof window === 'undefined') return value;\n\n const valueInLocalStorage = window.localStorage.getItem(this.key);\n\n if (valueInLocalStorage) {\n try {\n value = JSON.parse(valueInLocalStorage);\n } catch {\n window.localStorage.removeItem(this.key);\n }\n }\n\n return value;\n }\n\n set(value: any) {\n window.localStorage.setItem(this.key, JSON.stringify(value));\n }\n}\n","import type {\n FrequentEmojiStorageProps,\n IFrequentEmojiStorage,\n} from '../utils';\n\nimport { DEFAULT_FREQUENTLY_USED_EMOJI } from '../../lib/constants';\nimport { type FrequentEmojis, EmojiCategory } from '../../lib/types';\nimport { LocalStorage } from './LocalStorage';\n\nexport class FrequentEmojiStorage implements IFrequentEmojiStorage {\n protected key = EmojiCategory.Frequent;\n protected limit = 8;\n protected localStorage;\n protected prefix = 'emoji';\n\n constructor(\n props: FrequentEmojiStorageProps,\n protected defaultValue = DEFAULT_FREQUENTLY_USED_EMOJI\n ) {\n this.limit = props.limit ?? this.limit;\n const key = `${props.prefix ?? this.prefix}:${props.key ?? this.key}`;\n this.localStorage = new LocalStorage(key, defaultValue);\n }\n\n get(): FrequentEmojis {\n const data = this.localStorage.get();\n\n return Object.fromEntries(\n Object.keys(data)\n .sort((a, b) => data[b] - data[a])\n .map((key) => [key, data[key]])\n );\n }\n\n getList(): string[] {\n return Object.keys(this.get()).splice(0, this.limit);\n }\n\n set(value: any) {\n this.localStorage.set(value);\n }\n\n update(emojiId: string) {\n const prevEmojis = this.localStorage.get();\n const count = prevEmojis![emojiId] ? prevEmojis[emojiId] + 1 : 1;\n\n const emojis: FrequentEmojis = {\n ...prevEmojis,\n [emojiId]: count,\n };\n\n this.localStorage.set(emojis);\n\n return emojis;\n }\n}\n","import type React from 'react';\n\nimport type { EmojiCategoryList } from '../../lib';\nimport type { IEmojiFloatingLibrary } from './EmojiLibrary';\nimport type { MapEmojiCategoryList } from './EmojiPickerState';\n\nconst setVisibleSections = (\n entries: IntersectionObserverEntry[],\n visibleSections: MapEmojiCategoryList\n) => {\n for (const entry of entries) {\n const id = (entry.target as HTMLDivElement).dataset.id as EmojiCategoryList;\n visibleSections.set(id, entry.isIntersecting);\n }\n};\n\nconst getSectionInFocus = (\n visibleSections: MapEmojiCategoryList\n): EmojiCategoryList | undefined => {\n for (const [id, ratio] of visibleSections) {\n if (ratio) {\n return id;\n }\n }\n};\n\nexport type ObserverCategoriesType = {\n ancestorRef: React.MutableRefObject<HTMLDivElement | null>;\n emojiLibrary: IEmojiFloatingLibrary;\n setFocusedAndVisibleSections: SetFocusedAndVisibleSectionsType;\n};\n\nexport type SetFocusedAndVisibleSectionsType = (\n visibleSections: MapEmojiCategoryList,\n categoryId?: EmojiCategoryList\n) => void;\n\nexport const observeCategories = ({\n ancestorRef,\n emojiLibrary,\n setFocusedAndVisibleSections,\n}: ObserverCategoriesType) => {\n const observerOptions = {\n root: ancestorRef.current,\n threshold: 0,\n };\n\n const visibleSections: MapEmojiCategoryList = new Map();\n\n const observer = new IntersectionObserver((entries) => {\n setVisibleSections(entries, visibleSections);\n const focusedSectionId = getSectionInFocus(visibleSections);\n\n focusedSectionId &&\n setFocusedAndVisibleSections(visibleSections, focusedSectionId);\n }, observerOptions);\n\n for (const section of emojiLibrary.getGrid().sections()) {\n if (section.root.current) observer.observe(section.root.current);\n }\n\n return observer;\n};\n","import React from 'react';\n\nimport type { Emoji } from '@emoji-mart/data';\n\nimport { type EmojiCategoryList, EmojiCategory } from '../../lib';\n\nexport type EmojiPickerStateDispatch = {\n type: string;\n payload?: Partial<EmojiPickerStateProps>;\n};\n\nexport type EmojiPickerStateProps = {\n hasFound: boolean;\n isOpen: boolean;\n isSearching: boolean;\n searchResult: Emoji[];\n searchValue: string;\n visibleCategories: MapEmojiCategoryList;\n emoji?: Emoji;\n focusedCategory?: EmojiCategoryList;\n frequentEmoji?: string;\n};\n\nexport type MapEmojiCategoryList = Map<EmojiCategoryList, boolean>;\n\nconst initialState: EmojiPickerStateProps = {\n emoji: undefined,\n focusedCategory: undefined,\n frequentEmoji: undefined,\n hasFound: false,\n isOpen: false,\n isSearching: false,\n searchResult: [],\n searchValue: '',\n visibleCategories: new Map(),\n};\n\nexport const EmojiPickerState = (): [\n EmojiPickerStateProps,\n React.Dispatch<EmojiPickerStateDispatch>,\n] => {\n const [cache, dispatch] = React.useReducer(\n (state: EmojiPickerStateProps, action: EmojiPickerStateDispatch) => {\n const { payload, type } = action;\n\n switch (type) {\n case 'CLEAR_SEARCH': {\n return {\n ...state,\n focusedCategory: EmojiCategory.Frequent,\n hasFound: false,\n isSearching: false,\n searchValue: '',\n };\n }\n case 'SET_CLOSE': {\n return {\n ...state,\n emoji: undefined,\n isOpen: false,\n };\n }\n case 'SET_EMOJI':\n case 'SET_FOCUSED_AND_VISIBLE_CATEGORIES':\n case 'SET_SEARCH': {\n return { ...state, ...payload };\n }\n case 'SET_FOCUSED_CATEGORY': {\n return {\n ...state,\n ...payload,\n hasFound: false,\n isSearching: false,\n searchValue: '',\n };\n }\n case 'SET_OPEN': {\n return {\n ...state,\n isOpen: true,\n };\n }\n case 'UPDATE_FREQUENT_EMOJIS': {\n return {\n ...state,\n ...payload,\n emoji: undefined,\n };\n }\n case 'UPDATE_SEARCH_RESULT': {\n return {\n ...state,\n ...payload,\n focusedCategory: undefined,\n isSearching: true,\n };\n }\n default: {\n throw new Error(`Unhandled action type: ${type}`);\n }\n }\n },\n initialState\n );\n\n return [cache, dispatch];\n};\n","import React from 'react';\n\nimport {\n type EmojiCategoryList,\n type IGrid,\n AGridSection,\n Grid,\n} from '../../../lib';\n\nexport type EmojiFloatingGridType = IGrid<\n React.RefObject<HTMLDivElement | null>,\n EmojiCategoryList\n>;\n\nexport class EmojiFloatingGrid extends Grid<\n React.RefObject<HTMLDivElement | null>,\n EmojiCategoryList\n> {\n public createRootRef() {\n return React.createRef<HTMLDivElement>();\n }\n}\n\nexport class EmojiGridSectionWithRoot extends AGridSection<\n React.RefObject<HTMLDivElement | null>,\n EmojiCategoryList\n> {\n protected createRootRef() {\n this._root = React.createRef<HTMLDivElement>();\n }\n}\n","import type {\n EmojiCategoryList,\n EmojiSettingsType,\n GridElements,\n} from '../../../lib';\nimport type { IFrequentEmojiStorage } from './EmojiFloatingLibrary.types';\n\nimport {\n EmojiFloatingGrid,\n EmojiGridSectionWithRoot,\n} from './EmojiFloatingGrid';\n\nexport class EmojiFloatingGridBuilder {\n protected grid = new EmojiFloatingGrid();\n\n constructor(\n protected localStorage: IFrequentEmojiStorage,\n protected sections: EmojiCategoryList[],\n protected elements: GridElements,\n protected settings: EmojiSettingsType\n ) {}\n\n private addFrequent() {\n if (this.settings.showFrequent.value) {\n const id = 'frequent';\n this.grid.addSection(\n id,\n new EmojiGridSectionWithRoot(id, this.settings.perLine.value),\n {\n [id]: this.localStorage.getList(),\n }\n );\n }\n }\n\n public build() {\n if (this.elements.frequent) {\n this.addFrequent();\n }\n\n this.sections.forEach((id) => {\n if (this.elements[id]?.length) {\n this.grid.addSection(\n id,\n new EmojiGridSectionWithRoot(id, this.settings.perLine.value),\n this.elements\n );\n }\n });\n\n return this.grid;\n }\n}\n","import type { EmojiFloatingGridType } from './EmojiFloatingGrid';\nimport type {\n IEmojiFloatingLibrary,\n IFrequentEmojiStorage,\n} from './EmojiFloatingLibrary.types';\n\nimport {\n type EmojiCategoryList,\n type EmojiLibrary,\n type EmojiSettingsType,\n DEFAULT_EMOJI_LIBRARY,\n defaultCategories,\n EmojiCategory,\n EmojiInlineLibrary,\n} from '../../../lib';\nimport { EmojiFloatingGridBuilder } from './EmojiFloatingGridBuilder';\n\nexport class EmojiFloatingLibrary\n extends EmojiInlineLibrary\n implements IEmojiFloatingLibrary\n{\n private static instance?: EmojiFloatingLibrary;\n\n private categories: EmojiCategoryList[] = defaultCategories;\n private emojis: Partial<Record<EmojiCategoryList, string[]>> = {};\n private grid: EmojiFloatingGridType;\n\n private constructor(\n protected settings: EmojiSettingsType,\n protected localStorage: IFrequentEmojiStorage,\n protected library: EmojiLibrary = DEFAULT_EMOJI_LIBRARY\n ) {\n super(library);\n\n this.categories = settings.categories.value ?? this.categories;\n\n this.initEmojis(library.categories);\n\n this.grid = new EmojiFloatingGridBuilder(\n this.localStorage,\n this.categories,\n this.emojis,\n settings\n ).build();\n }\n\n public static getInstance(\n settings: EmojiSettingsType,\n localStorage: IFrequentEmojiStorage,\n library = DEFAULT_EMOJI_LIBRARY\n ) {\n if (!EmojiFloatingLibrary.instance) {\n EmojiFloatingLibrary.instance = new EmojiFloatingLibrary(\n settings,\n localStorage,\n library\n );\n }\n\n return EmojiFloatingLibrary.instance;\n }\n\n private initEmojis(categoriesLibrary: any) {\n for (const category of categoriesLibrary) {\n (this.emojis as any)[category.id] = category.emojis;\n }\n }\n\n public getGrid() {\n return this.grid;\n }\n\n public indexOf(focusedCategory: EmojiCategoryList) {\n const index = this.grid.indexOf(focusedCategory);\n\n return index < 1 ? 0 : index;\n }\n\n public updateFrequentCategory(emojiId: string) {\n this.localStorage.update(emojiId);\n this.grid.updateSection(\n EmojiCategory.Frequent,\n this.localStorage.getList()\n );\n }\n}\n","import React from 'react';\n\nimport type { Emoji } from '@emoji-mart/data';\n\nimport { useEditorRef } from '@udecode/plate/react';\n\nimport {\n type AIndexSearch,\n type EmojiCategoryList,\n type EmojiIconList,\n type EmojiSettingsType,\n type i18nProps,\n i18n,\n insertEmoji,\n} from '../../lib';\nimport {\n type IEmojiFloatingLibrary,\n type MapEmojiCategoryList,\n type SetFocusedAndVisibleSectionsType,\n EmojiPickerState,\n observeCategories,\n} from '../utils';\n\nexport type MutableRefs = React.MutableRefObject<{\n content: React.RefObject<HTMLDivElement | null> | undefined;\n contentRoot: React.RefObject<HTMLDivElement | null> | undefined;\n}>;\n\nexport type UseEmojiPickerProps = {\n closeOnSelect: boolean;\n emojiLibrary: IEmojiFloatingLibrary;\n indexSearch: AIndexSearch;\n};\n\nexport type UseEmojiPickerType<\n T extends React.ReactElement<any> = React.ReactElement<any>,\n> = {\n emojiLibrary: IEmojiFloatingLibrary;\n hasFound: boolean;\n i18n: i18nProps;\n icons: EmojiIconList<T>;\n isOpen: boolean;\n isSearching: boolean;\n refs: MutableRefs;\n searchResult: Emoji[];\n searchValue: string;\n visibleCategories: MapEmojiCategoryList;\n clearSearch: () => void;\n setIsOpen: (isOpen: boolean) => void;\n setSearch: (value: string) => void;\n handleCategoryClick: (id: EmojiCategoryList) => void;\n onMouseOver: (emoji?: Emoji) => void;\n onSelectEmoji: (emoji: Emoji) => void;\n emoji?: Emoji;\n focusedCategory?: EmojiCategoryList;\n settings?: EmojiSettingsType;\n styles?: any;\n};\n\nexport const useEmojiPicker = ({\n closeOnSelect,\n emojiLibrary,\n indexSearch,\n}: UseEmojiPickerProps): Omit<UseEmojiPickerType, 'icons' | 'settings'> => {\n const editor = useEditorRef();\n\n const [state, dispatch] = EmojiPickerState();\n const refs = React.useRef({\n content: React.createRef<HTMLDivElement>(),\n contentRoot: React.createRef<HTMLDivElement>(),\n });\n\n const setIsOpen = React.useCallback(\n (isOpen: boolean) => {\n dispatch({\n type: isOpen ? 'SET_OPEN' : 'SET_CLOSE',\n });\n },\n [dispatch]\n );\n\n const setFocusedAndVisibleSections =\n React.useCallback<SetFocusedAndVisibleSectionsType>(\n (visibleSections, categoryId) => {\n dispatch({\n payload: {\n focusedCategory: categoryId,\n visibleCategories: visibleSections,\n },\n type: 'SET_FOCUSED_AND_VISIBLE_CATEGORIES',\n });\n },\n [dispatch]\n );\n\n const handleSearchInput = React.useCallback(\n (input: string) => {\n const value = String(input).replaceAll(/\\s/g, '');\n\n if (!value && !input) {\n dispatch({ type: 'CLEAR_SEARCH' });\n\n return;\n }\n\n const hasFound = indexSearch.search(value).hasFound();\n\n dispatch({\n payload: {\n hasFound,\n searchResult: indexSearch.get(),\n searchValue: value,\n },\n type: 'UPDATE_SEARCH_RESULT',\n });\n },\n [dispatch, indexSearch]\n );\n\n const setSearch = React.useCallback(\n (value: string) => {\n value ? handleSearchInput(value) : dispatch({ type: 'CLEAR_SEARCH' });\n },\n [dispatch, handleSearchInput]\n );\n\n const clearSearch = React.useCallback(() => {\n dispatch({ type: 'CLEAR_SEARCH' });\n }, [dispatch]);\n\n const onMouseOver = React.useCallback(\n (emoji?: Emoji) => {\n dispatch({ payload: { emoji }, type: 'SET_EMOJI' });\n },\n [dispatch]\n );\n\n const updateFrequentEmojis = React.useCallback(\n (emojiId: string) => {\n emojiLibrary.updateFrequentCategory(emojiId);\n\n dispatch({\n payload: {\n frequentEmoji: emojiId,\n isOpen: closeOnSelect ? false : state.isOpen,\n },\n type: 'UPDATE_FREQUENT_EMOJIS',\n });\n },\n [closeOnSelect, dispatch, emojiLibrary, state.isOpen]\n );\n\n const onSelectEmoji = React.useCallback(\n (emoji: Emoji) => {\n insertEmoji(editor, emoji);\n updateFrequentEmojis(emoji.id);\n },\n [editor, updateFrequentEmojis]\n );\n\n const handleCategoryClick = React.useCallback(\n (categoryId: EmojiCategoryList) => {\n dispatch({\n payload: { focusedCategory: categoryId },\n type: 'SET_FOCUSED_CATEGORY',\n });\n\n const getSectionPositionToScrollIntoView = () => {\n const trashHold = 1;\n const section = emojiLibrary.getGrid().section(categoryId);\n\n const contentRootScrollTop =\n refs.current.contentRoot.current?.scrollTop ?? 0;\n const contentRootTopPosition =\n refs.current.contentRoot.current?.getBoundingClientRect().top ?? 0;\n const sectionTopPosition =\n section?.root.current?.getBoundingClientRect().top ?? 0;\n\n return (\n trashHold +\n contentRootScrollTop +\n sectionTopPosition -\n contentRootTopPosition\n );\n };\n\n if (refs.current.contentRoot.current) {\n refs.current.contentRoot.current.scrollTop =\n getSectionPositionToScrollIntoView();\n }\n },\n [dispatch, emojiLibrary]\n );\n\n React.useEffect(() => {\n if (state.isOpen && !state.isSearching) {\n // Timeout to allow the category element refs to populate\n setTimeout(() => {\n observeCategories({\n ancestorRef: refs.current.contentRoot,\n emojiLibrary,\n setFocusedAndVisibleSections,\n });\n }, 0);\n }\n }, [\n emojiLibrary,\n state.isOpen,\n state.isSearching,\n setFocusedAndVisibleSections,\n ]);\n\n return {\n clearSearch,\n emoji: state.emoji,\n emojiLibrary,\n i18n,\n refs,\n setIsOpen,\n setSearch,\n handleCategoryClick,\n onMouseOver,\n onSelectEmoji,\n ...state,\n };\n};\n"],"mappings":"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","names":["React","React","React","React","emojiLibrary","indexSearch"]}