Browse Source

bug-fix emoji drawer

imwald
Silberengel 1 week ago
parent
commit
43b07ebfe5
  1. 26
      src/components/EmojiPicker/index.tsx
  2. 5
      src/components/EmojiPickerDialog/index.tsx

26
src/components/EmojiPicker/index.tsx

@ -1,4 +1,5 @@
import { EMOJI_PICKER_DATA_SOURCE } from '@/lib/emoji-picker-data-source' import { EMOJI_PICKER_DATA_SOURCE } from '@/lib/emoji-picker-data-source'
import { cn } from '@/lib/utils'
import { preloadEmojiPickerModule } from '@/lib/emoji-picker-preload' import { preloadEmojiPickerModule } from '@/lib/emoji-picker-preload'
import { DEFAULT_LIKE_REACTION_CONTENT, DEFAULT_LIKE_REACTION_DISPLAY_EMOJI, DEFAULT_SUGGESTED_EMOJIS } from '@/lib/like-reaction-emojis' import { DEFAULT_LIKE_REACTION_CONTENT, DEFAULT_LIKE_REACTION_DISPLAY_EMOJI, DEFAULT_SUGGESTED_EMOJIS } from '@/lib/like-reaction-emojis'
import { recordEmojiUsed } from '@/lib/recently-used-emojis' import { recordEmojiUsed } from '@/lib/recently-used-emojis'
@ -14,12 +15,16 @@ export { DEFAULT_SUGGESTED_EMOJIS as EMOJI_PICKER_REACTIONS } from '@/lib/like-r
export default function EmojiPicker({ export default function EmojiPicker({
onEmojiClick, onEmojiClick,
reactionsDefaultOpen, reactionsDefaultOpen,
reactions reactions,
layout = 'popover'
}: { }: {
onEmojiClick: (emoji: string | TEmoji | undefined, event: Event) => void onEmojiClick: (emoji: string | TEmoji | undefined, event: Event) => void
reactionsDefaultOpen?: boolean reactionsDefaultOpen?: boolean
reactions?: string[] reactions?: string[]
/** `drawer` fills the mobile sheet; `popover` uses a fixed height for dropdowns. */
layout?: 'drawer' | 'popover'
}) { }) {
const inDrawer = layout === 'drawer'
const { themeSetting } = useTheme() const { themeSetting } = useTheme()
const { pubkey } = useNostr() const { pubkey } = useNostr()
const [mode, setMode] = useState<'reactions' | 'full'>( const [mode, setMode] = useState<'reactions' | 'full'>(
@ -66,8 +71,13 @@ export default function EmojiPicker({
picker.style.width = '100%' picker.style.width = '100%'
picker.style.minWidth = '280px' picker.style.minWidth = '280px'
picker.style.maxWidth = '350px' picker.style.maxWidth = '350px'
if (inDrawer) {
picker.style.height = '100%'
picker.style.minHeight = '0'
} else {
picker.style.height = 'min(350px, 50dvh)' picker.style.height = 'min(350px, 50dvh)'
picker.style.minHeight = '280px' picker.style.minHeight = '280px'
}
picker.style.setProperty('--num-columns', '8') picker.style.setProperty('--num-columns', '8')
const handleClick = (e: Event) => { const handleClick = (e: Event) => {
@ -124,7 +134,7 @@ export default function EmojiPicker({
pickerRef.current = null pickerRef.current = null
} }
} }
}, [mode]) }, [mode, inDrawer])
useEffect(() => { useEffect(() => {
if (pickerRef.current) { if (pickerRef.current) {
@ -197,11 +207,19 @@ export default function EmojiPicker({
} }
return ( return (
<div className="flex w-full min-w-0 flex-col"> <div
className={cn(
'flex w-full min-w-0 flex-col',
inDrawer && 'min-h-0 flex-1'
)}
>
{ownEmojisRow} {ownEmojisRow}
<div <div
ref={containerRef} ref={containerRef}
className="relative h-[min(320px,45dvh)] min-h-[240px] w-full min-w-[280px] max-w-[350px] shrink-0" className={cn(
'relative w-full min-w-[280px] max-w-[350px]',
inDrawer ? 'min-h-0 flex-1' : 'h-[min(320px,45dvh)] min-h-[240px] shrink-0'
)}
> >
{!pickerReady ? ( {!pickerReady ? (
<div className="absolute inset-0 flex items-center justify-center text-sm text-muted-foreground"> <div className="absolute inset-0 flex items-center justify-center text-sm text-muted-foreground">

5
src/components/EmojiPickerDialog/index.tsx

@ -50,7 +50,7 @@ export default function EmojiPickerDialog({
<DrawerContent <DrawerContent
dragHandle="vaul" dragHandle="vaul"
portalContainer={portalContainer} portalContainer={portalContainer}
className="max-h-[min(60dvh,calc(100dvh-8rem))] px-2 pb-2" className="flex h-[min(72dvh,calc(100dvh-5rem))] max-h-[min(72dvh,calc(100dvh-5rem))] flex-col overflow-hidden px-2"
onPointerDownOutside={(e) => { onPointerDownOutside={(e) => {
const t = e.target as HTMLElement | null const t = e.target as HTMLElement | null
if (t?.closest?.('[data-vaul-overlay]')) return if (t?.closest?.('[data-vaul-overlay]')) return
@ -60,9 +60,10 @@ export default function EmojiPickerDialog({
<DrawerHeader className="sr-only"> <DrawerHeader className="sr-only">
<DrawerTitle>Emoji Picker</DrawerTitle> <DrawerTitle>Emoji Picker</DrawerTitle>
</DrawerHeader> </DrawerHeader>
<div className="flex w-full max-w-[100vw] min-w-0 min-h-0 flex-col overflow-hidden pb-1"> <div className="flex min-h-0 w-full max-w-[100vw] flex-1 flex-col overflow-hidden">
{pickerMounted ? ( {pickerMounted ? (
<EmojiPicker <EmojiPicker
layout="drawer"
onEmojiClick={(emoji, e) => { onEmojiClick={(emoji, e) => {
e.stopPropagation() e.stopPropagation()
setOpen(false) setOpen(false)

Loading…
Cancel
Save