From d932f1edb5f5151bbf356a55b032900172928710 Mon Sep 17 00:00:00 2001 From: Dicken Date: Thu, 28 May 2026 11:37:32 +0200 Subject: [PATCH] Smilies bei Nachrichten --- frontend/src/tools/nachrichten.jsx | 98 ++++++++++++++++++++++++++++-- 1 file changed, 92 insertions(+), 6 deletions(-) diff --git a/frontend/src/tools/nachrichten.jsx b/frontend/src/tools/nachrichten.jsx index f2560d5..915b44f 100644 --- a/frontend/src/tools/nachrichten.jsx +++ b/frontend/src/tools/nachrichten.jsx @@ -10,6 +10,68 @@ import { decryptMsg, } from '../crypto.js'; +// ── Emoji-Konvertierung ─────────────────────────────────────────────────────── +const EMOJI_MAP = { + ':D':'😁', ':)':'🙂', ':-)':'🙂', '(:':'🙂', ';)':'😉', ';-)':'😉', + ':P':'😛', ':-P':'😛', ':p':'😛', ':O':'😮', ':-O':'😮', ':o':'😮', + ':(':'😢', ':-(':'😢', ":'(":'😭', '>:(':"😠", '>:-(':"😠", + ':*':'😘', ':-*':'😘', '<3':'❤️', ':)':"😈", + ':3':"🐱", ':$':"😳", +}; + +// Ersetze Kürzel am Ende des Textes (nach Leerzeichen oder Satzanfang) +function convertEmojis(text) { + let result = text; + for (const [code, emoji] of Object.entries(EMOJI_MAP)) { + const escaped = code.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + result = result.replace(new RegExp(`(^|\\s)${escaped}(?=\\s|$)`, 'g'), `$1${emoji}`); + } + return result; +} + +// ── Emoji-Picker Daten ──────────────────────────────────────────────────────── +const EMOJI_GROUPS = [ + { label:'Smileys', emojis:['😀','😁','😂','🤣','😊','😇','🙂','😉','😌','😍','🥰','😘','😎','🤩','😏','😒','😞','😢','😭','😤','😠','😡','🤬','😈','👿','💀','😱','😨','😰','😓','🤔','🤐','😶','😐','😑','😬','🙄','😴','🤧','🤒','😷','🤕'] }, + { label:'Gesten', emojis:['👍','👎','👌','✌️','🤞','🤟','🤙','👋','🤚','🖐','✋','🤜','🤛','👏','🙌','🤝','🙏','💪','🫶','❤️','🧡','💛','💚','💙','💜','🖤','💔','💯','💥','✨','🎉','🔥','⭐','🌟'] }, + { label:'Dinge', emojis:['😂💀','🎮','🏆','🎯','🎲','🃏','🎸','🎵','🎤','📱','💻','⌨️','🖱️','📷','🎬','📺','🚀','🛸','🌍','🌈','☀️','🌙','⭐','🍕','🍔','🍟','🌮','🍩','🍺','☕','🧃'] }, +]; + +function EmojiPicker({ onSelect, onClose }) { + const [group, setGroup] = useState(0); + return ( +
e.preventDefault()}> +
+ {EMOJI_GROUPS.map((g,i) => ( + + ))} +
+
+ {EMOJI_GROUPS[group].emojis.filter(e => e.length <= 2 || [...e].length <= 2).concat( + EMOJI_GROUPS[group].emojis.filter(e => [...e].length > 2) + ).map((em,i) => ( + + ))} +
+
+ ); +} + export default function Nachrichten({ toast, mobile }) { const [kp, setKp] = useState(null); const [initError, setInitError] = useState(false); @@ -21,6 +83,7 @@ export default function Nachrichten({ toast, mobile }) { const [partnerFp, setPartnerFp] = useState(''); const [text, setText] = useState(''); const [sending, setSending] = useState(false); + const [showPicker, setShowPicker] = useState(false); const bottomRef = useRef(null); const pollRef = useRef(null); @@ -367,19 +430,42 @@ export default function Nachrichten({ toast, mobile }) { Senden nicht möglich ) : ( -
+
+ {showPicker && ( + { setText(t => t + em); setShowPicker(false); }} + onClose={() => setShowPicker(false)} + /> + )}