| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 | 
							- 'use client'
 
- import type { ChangeEvent, FC } from 'react'
 
- import React, { useState } from 'react'
 
- import data from '@emoji-mart/data'
 
- import type { EmojiMartData } from '@emoji-mart/data'
 
- import { init } from 'emoji-mart'
 
- import {
 
-   MagnifyingGlassIcon,
 
- } from '@heroicons/react/24/outline'
 
- import Input from '@/app/components/base/input'
 
- import Divider from '@/app/components/base/divider'
 
- import { searchEmoji } from '@/utils/emoji'
 
- import cn from '@/utils/classnames'
 
- declare global {
 
-   // eslint-disable-next-line ts/no-namespace
 
-   namespace JSX {
 
-     // eslint-disable-next-line ts/consistent-type-definitions
 
-     interface IntrinsicElements {
 
-       'em-emoji': React.DetailedHTMLProps< React.HTMLAttributes<HTMLElement>, HTMLElement >
 
-     }
 
-   }
 
- }
 
- init({ data })
 
- const backgroundColors = [
 
-   '#FFEAD5',
 
-   '#E4FBCC',
 
-   '#D3F8DF',
 
-   '#E0F2FE',
 
-   '#E0EAFF',
 
-   '#EFF1F5',
 
-   '#FBE8FF',
 
-   '#FCE7F6',
 
-   '#FEF7C3',
 
-   '#E6F4D7',
 
-   '#D5F5F6',
 
-   '#D1E9FF',
 
-   '#D1E0FF',
 
-   '#D5D9EB',
 
-   '#ECE9FE',
 
-   '#FFE4E8',
 
- ]
 
- type IEmojiPickerInnerProps = {
 
-   emoji?: string
 
-   background?: string
 
-   onSelect?: (emoji: string, background: string) => void
 
-   className?: string
 
- }
 
- const EmojiPickerInner: FC<IEmojiPickerInnerProps> = ({
 
-   onSelect,
 
-   className,
 
- }) => {
 
-   const { categories } = data as EmojiMartData
 
-   const [selectedEmoji, setSelectedEmoji] = useState('')
 
-   const [selectedBackground, setSelectedBackground] = useState(backgroundColors[0])
 
-   const [searchedEmojis, setSearchedEmojis] = useState<string[]>([])
 
-   const [isSearching, setIsSearching] = useState(false)
 
-   React.useEffect(() => {
 
-     if (selectedEmoji && selectedBackground)
 
-       onSelect?.(selectedEmoji, selectedBackground)
 
-   }, [onSelect, selectedEmoji, selectedBackground])
 
-   return <div className={cn(className)}>
 
-     <div className='flex flex-col items-center w-full px-3 pb-2'>
 
-       <div className="relative w-full">
 
-         <div className="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
 
-           <MagnifyingGlassIcon className="w-5 h-5 text-text-quaternary" aria-hidden="true" />
 
-         </div>
 
-         <Input
 
-           className="pl-10"
 
-           type="search"
 
-           id="search"
 
-           placeholder="Search emojis..."
 
-           onChange={async (e: ChangeEvent<HTMLInputElement>) => {
 
-             if (e.target.value === '') {
 
-               setIsSearching(false)
 
-             }
 
-             else {
 
-               setIsSearching(true)
 
-               const emojis = await searchEmoji(e.target.value)
 
-               setSearchedEmojis(emojis)
 
-             }
 
-           }}
 
-         />
 
-       </div>
 
-     </div>
 
-     <Divider className='my-3' />
 
-     <div className="w-full max-h-[200px] overflow-x-hidden overflow-y-auto px-3">
 
-       {isSearching && <>
 
-         <div key={'category-search'} className='flex flex-col'>
 
-           <p className='system-xs-medium-uppercase text-text-primary mb-1'>Search</p>
 
-           <div className='w-full h-full grid grid-cols-8 gap-1'>
 
-             {searchedEmojis.map((emoji: string, index: number) => {
 
-               return <div
 
-                 key={`emoji-search-${index}`}
 
-                 className='inline-flex w-10 h-10 rounded-lg items-center justify-center'
 
-                 onClick={() => {
 
-                   setSelectedEmoji(emoji)
 
-                 }}
 
-               >
 
-                 <div className='cursor-pointer w-8 h-8 p-1 flex items-center justify-center rounded-lg hover:ring-1 ring-offset-1 ring-components-input-border-hover'>
 
-                   <em-emoji id={emoji} />
 
-                 </div>
 
-               </div>
 
-             })}
 
-           </div>
 
-         </div>
 
-       </>}
 
-       {categories.map((category, index: number) => {
 
-         return <div key={`category-${index}`} className='flex flex-col'>
 
-           <p className='system-xs-medium-uppercase text-text-primary mb-1'>{category.id}</p>
 
-           <div className='w-full h-full grid grid-cols-8 gap-1'>
 
-             {category.emojis.map((emoji, index: number) => {
 
-               return <div
 
-                 key={`emoji-${index}`}
 
-                 className='inline-flex w-10 h-10 rounded-lg items-center justify-center'
 
-                 onClick={() => {
 
-                   setSelectedEmoji(emoji)
 
-                 }}
 
-               >
 
-                 <div className='cursor-pointer w-8 h-8 p-1 flex items-center justify-center rounded-lg hover:ring-1 ring-offset-1 ring-components-input-border-hover'>
 
-                   <em-emoji id={emoji} />
 
-                 </div>
 
-               </div>
 
-             })}
 
-           </div>
 
-         </div>
 
-       })}
 
-     </div>
 
-     {/* Color Select */}
 
-     <div className={cn('p-3 pb-0', selectedEmoji === '' ? 'opacity-25' : '')}>
 
-       <p className='system-xs-medium-uppercase text-text-primary mb-2'>Choose Style</p>
 
-       <div className='w-full h-full grid grid-cols-8 gap-1'>
 
-         {backgroundColors.map((color) => {
 
-           return <div
 
-             key={color}
 
-             className={
 
-               cn(
 
-                 'cursor-pointer',
 
-                 'hover:ring-1 ring-offset-1',
 
-                 'inline-flex w-10 h-10 rounded-lg items-center justify-center',
 
-                 color === selectedBackground ? 'ring-1 ring-components-input-border-hover' : '',
 
-               )}
 
-             onClick={() => {
 
-               setSelectedBackground(color)
 
-             }}
 
-           >
 
-             <div className={cn(
 
-               'w-8 h-8 p-1 flex items-center justify-center rounded-lg',
 
-             )
 
-             } style={{ background: color }}>
 
-               {selectedEmoji !== '' && <em-emoji id={selectedEmoji} />}
 
-             </div>
 
-           </div>
 
-         })}
 
-       </div>
 
-     </div>
 
-   </div>
 
- }
 
- export default EmojiPickerInner
 
 
  |