diff --git a/packages/shared/src/components/feeds/FeedSettings/FeedSettingsCreate.tsx b/packages/shared/src/components/feeds/FeedSettings/FeedSettingsCreate.tsx index 79e33e1005..03c7dfa7b7 100644 --- a/packages/shared/src/components/feeds/FeedSettings/FeedSettingsCreate.tsx +++ b/packages/shared/src/components/feeds/FeedSettings/FeedSettingsCreate.tsx @@ -1,24 +1,17 @@ import type { ReactElement } from 'react'; import React, { useCallback, useEffect, useRef, useState } from 'react'; import { useRouter } from 'next/router'; -import classNames from 'classnames'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import type { ClientError } from 'graphql-request'; import { Modal } from '../../modals/common/Modal'; import type { CreateFeedProps } from '../../../hooks'; import { useActions, useFeeds, useToastNotification } from '../../../hooks'; -import { emojiOptions } from '../../../lib/constants'; import { Button } from '../../buttons/Button'; +import { EmojiPicker } from '../../fields/EmojiPicker'; import { ButtonSize, ButtonVariant } from '../../buttons/common'; import { TextField } from '../../fields/TextField'; -import { IconSize } from '../../Icon'; -import { HashtagIcon } from '../../icons'; -import { - Typography, - TypographyType, - TypographyTag, -} from '../../typography/Typography'; +import { Typography, TypographyType } from '../../typography/Typography'; import { LogEvent } from '../../../lib/log'; import { useLogContext } from '../../../contexts/LogContext'; import { labels } from '../../../lib/labels'; @@ -235,45 +228,13 @@ export const FeedSettingsCreate = (): ReactElement => { setData((current) => ({ ...current, name: value })) } /> -
- - - Choose an icon - {' '} - (optional) - - -
+ + setData((current) => ({ ...current, icon: emoji })) + } + label="Icon (optional)" + /> - ))} - - + setData({ icon: emoji })} + label="Choose an icon" + /> )}
diff --git a/packages/shared/src/components/fields/EmojiPicker.tsx b/packages/shared/src/components/fields/EmojiPicker.tsx index debe892250..400c03024f 100644 --- a/packages/shared/src/components/fields/EmojiPicker.tsx +++ b/packages/shared/src/components/fields/EmojiPicker.tsx @@ -59,14 +59,32 @@ export const EmojiPicker = ({ }: EmojiPickerProps): ReactElement => { const [isOpen, setIsOpen] = useState(false); const [searchQuery, setSearchQuery] = useState(''); + const [dropdownPosition, setDropdownPosition] = useState({ + top: 0, + left: 0, + width: 0, + }); const inputRef = useRef(null); const containerRef = useRef(null); + const triggerRef = useRef(null); + + const updateDropdownPosition = useCallback(() => { + if (triggerRef.current) { + const rect = triggerRef.current.getBoundingClientRect(); + setDropdownPosition({ + top: rect.bottom + 4, + left: rect.left, + width: rect.width, + }); + } + }, []); useEffect(() => { if (isOpen) { + updateDropdownPosition(); inputRef.current?.focus(); } - }, [isOpen]); + }, [isOpen, updateDropdownPosition]); useEffect(() => { if (!isOpen) { @@ -83,9 +101,20 @@ export const EmojiPicker = ({ } }; + const handleScroll = () => { + updateDropdownPosition(); + }; + document.addEventListener('mousedown', handleClickOutside); - return () => document.removeEventListener('mousedown', handleClickOutside); - }, [isOpen]); + window.addEventListener('scroll', handleScroll, true); + window.addEventListener('resize', handleScroll); + + return () => { + document.removeEventListener('mousedown', handleClickOutside); + window.removeEventListener('scroll', handleScroll, true); + window.removeEventListener('resize', handleScroll); + }; + }, [isOpen, updateDropdownPosition]); const handleSelect = useCallback( (emoji: string) => { @@ -115,7 +144,7 @@ export const EmojiPicker = ({ {label} -
+
{value && ( - ))} - + {!isMobile && (shouldUpgrade ? (