feat: show emoji picker on non-touch devices

This commit is contained in:
codytseng
2025-05-28 22:04:38 +08:00
parent 94e2a446e8
commit 4785efd43c
2 changed files with 18 additions and 1 deletions

View File

@@ -3,12 +3,14 @@ import { Button } from '@/components/ui/button'
import { ScrollArea } from '@/components/ui/scroll-area' import { ScrollArea } from '@/components/ui/scroll-area'
import { useToast } from '@/hooks/use-toast' import { useToast } from '@/hooks/use-toast'
import { createCommentDraftEvent, createShortTextNoteDraftEvent } from '@/lib/draft-event' import { createCommentDraftEvent, createShortTextNoteDraftEvent } from '@/lib/draft-event'
import { isTouchDevice } from '@/lib/utils'
import { useNostr } from '@/providers/NostrProvider' import { useNostr } from '@/providers/NostrProvider'
import postContentCache from '@/services/post-content-cache.service' import postContentCache from '@/services/post-content-cache.service'
import { ImageUp, LoaderCircle, Settings } from 'lucide-react' import { ImageUp, LoaderCircle, Settings, Smile } from 'lucide-react'
import { Event, kinds } from 'nostr-tools' import { Event, kinds } from 'nostr-tools'
import { useRef, useState } from 'react' import { useRef, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import EmojiPickerDialog from '../EmojiPickerDialog'
import Mentions from './Mentions' import Mentions from './Mentions'
import { usePostEditor } from './PostEditorProvider' import { usePostEditor } from './PostEditorProvider'
import PostOptions from './PostOptions' import PostOptions from './PostOptions'
@@ -124,6 +126,16 @@ export default function PostContent({
{uploadingFiles > 0 ? <LoaderCircle className="animate-spin" /> : <ImageUp />} {uploadingFiles > 0 ? <LoaderCircle className="animate-spin" /> : <ImageUp />}
</Button> </Button>
</Uploader> </Uploader>
{/* I'm not sure why, but after triggering the virtual keyboard,
opening the emoji picker drawer causes an issue,
the emoji I tap isn't the one that gets inserted. */}
{!isTouchDevice() && (
<EmojiPickerDialog onEmojiClick={(emoji) => textareaRef.current?.insertText(emoji)}>
<Button variant="ghost" size="icon">
<Smile />
</Button>
</EmojiPickerDialog>
)}
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"

View File

@@ -24,6 +24,11 @@ export function isTorBrowser() {
return /torbrowser/i.test(ua) return /torbrowser/i.test(ua)
} }
export function isTouchDevice() {
if (typeof window === 'undefined' || !window.navigator) return false
return 'ontouchstart' in window || navigator.maxTouchPoints > 0
}
export function isInViewport(el: HTMLElement) { export function isInViewport(el: HTMLElement) {
const rect = el.getBoundingClientRect() const rect = el.getBoundingClientRect()
return ( return (