feat: display larger emojis for emoji-only notes and remove auto-space after custom emoji insertion
Show emojis at a larger size when a note contains only emojis (≤3), similar to Telegram. Also remove the automatic space inserted after custom emoji in the post editor. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
1c3d58f490
commit
c9bd7ca7d7
2 changed files with 29 additions and 3 deletions
|
|
@ -12,6 +12,7 @@ import {
|
||||||
import { getImetaInfosFromEvent } from '@/lib/event'
|
import { getImetaInfosFromEvent } from '@/lib/event'
|
||||||
import { containsMarkdown } from '@/lib/markdown'
|
import { containsMarkdown } from '@/lib/markdown'
|
||||||
import { getEmojiInfosFromEmojiTags, getImetaInfoFromImetaTag } from '@/lib/tag'
|
import { getEmojiInfosFromEmojiTags, getImetaInfoFromImetaTag } from '@/lib/tag'
|
||||||
|
import { EMOJI_REGEX } from '@/constants'
|
||||||
import { cn } from '@/lib/utils'
|
import { cn } from '@/lib/utils'
|
||||||
import mediaUpload from '@/services/media-upload.service'
|
import mediaUpload from '@/services/media-upload.service'
|
||||||
import { TImetaInfo } from '@/types'
|
import { TImetaInfo } from '@/types'
|
||||||
|
|
@ -102,6 +103,28 @@ export default function Content({
|
||||||
return { nodes, allImages, emojiInfos, lastNormalUrl }
|
return { nodes, allImages, emojiInfos, lastNormalUrl }
|
||||||
}, [event, resolvedContent, isMarkdown])
|
}, [event, resolvedContent, isMarkdown])
|
||||||
|
|
||||||
|
const isEmojiOnly = useMemo(() => {
|
||||||
|
if (!nodes || nodes.length === 0) return false
|
||||||
|
const nonWhitespace = nodes.filter(
|
||||||
|
(node) => !(node.type === 'text' && /^\s*$/.test(node.data))
|
||||||
|
)
|
||||||
|
let emojiCount = 0
|
||||||
|
for (const node of nonWhitespace) {
|
||||||
|
if (node.type === 'emoji') {
|
||||||
|
emojiCount++
|
||||||
|
} else if (node.type === 'text') {
|
||||||
|
const matches = node.data.match(new RegExp(EMOJI_REGEX.source, 'gu'))
|
||||||
|
if (!matches || node.data.replace(new RegExp(EMOJI_REGEX.source, 'gu'), '').trim() !== '') {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
emojiCount += matches.length
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return emojiCount > 0 && emojiCount <= 3
|
||||||
|
}, [nodes])
|
||||||
|
|
||||||
const handleHighlight = (text: string) => {
|
const handleHighlight = (text: string) => {
|
||||||
setSelectedText(text)
|
setSelectedText(text)
|
||||||
setShowHighlightEditor(true)
|
setShowHighlightEditor(true)
|
||||||
|
|
@ -139,9 +162,12 @@ export default function Content({
|
||||||
let imageIndex = 0
|
let imageIndex = 0
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div ref={contentRef} className={cn('whitespace-pre-wrap text-wrap break-words', className)}>
|
<div ref={contentRef} className={cn('whitespace-pre-wrap text-wrap break-words', isEmojiOnly && 'flex items-end gap-1', className)}>
|
||||||
{nodes.map((node, index) => {
|
{nodes.map((node, index) => {
|
||||||
if (node.type === 'text') {
|
if (node.type === 'text') {
|
||||||
|
if (isEmojiOnly) {
|
||||||
|
return <span key={index} className="text-7xl leading-none">{node.data}</span>
|
||||||
|
}
|
||||||
return node.data
|
return node.data
|
||||||
}
|
}
|
||||||
if (node.type === 'image' || node.type === 'images') {
|
if (node.type === 'image' || node.type === 'images') {
|
||||||
|
|
@ -187,7 +213,7 @@ export default function Content({
|
||||||
const shortcode = node.data.split(':')[1]
|
const shortcode = node.data.split(':')[1]
|
||||||
const emoji = emojiInfos.find((e) => e.shortcode === shortcode)
|
const emoji = emojiInfos.find((e) => e.shortcode === shortcode)
|
||||||
if (!emoji) return node.data
|
if (!emoji) return node.data
|
||||||
return <Emoji classNames={{ img: 'mb-1' }} emoji={emoji} key={index} />
|
return <Emoji classNames={{ img: isEmojiOnly ? 'size-20' : 'mb-1' }} emoji={emoji} key={index} />
|
||||||
}
|
}
|
||||||
if (node.type === 'youtube') {
|
if (node.type === 'youtube') {
|
||||||
return (
|
return (
|
||||||
|
|
|
||||||
|
|
@ -151,7 +151,7 @@ const PostTextarea = forwardRef<
|
||||||
const emojiNode = editor.schema.nodes.emoji.create({
|
const emojiNode = editor.schema.nodes.emoji.create({
|
||||||
name: customEmojiService.getEmojiId(emoji)
|
name: customEmojiService.getEmojiId(emoji)
|
||||||
})
|
})
|
||||||
editor.chain().insertContent(emojiNode).insertContent(' ').run()
|
editor.chain().insertContent(emojiNode).run()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue