feat: show emoji picker on non-touch devices
This commit is contained in:
@@ -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"
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
Reference in New Issue
Block a user