28 lines
1.1 KiB
Python
28 lines
1.1 KiB
Python
from typing import Optional, Callable, Awaitable
|
|
|
|
from nicegui import ui
|
|
|
|
|
|
class ChatInput(ui.textarea):
|
|
|
|
def __init__(self,
|
|
placeholder: str = 'Type your message...',
|
|
on_enter: Optional[Callable[[str], Awaitable[None]]] = None,
|
|
*args, **kwargs) -> None:
|
|
super().__init__(placeholder=placeholder, *args, **kwargs)
|
|
self._on_enter_callback = on_enter
|
|
self.classes('flex-grow').props('outlined dense autogrow')
|
|
self.on('keydown', self._handle_keydown)
|
|
|
|
async def _handle_keydown(self, event) -> None:
|
|
"""Handle keyboard shortcuts for message input"""
|
|
if hasattr(event, 'args') and event.args:
|
|
key_event = event.args
|
|
if key_event.get('key') == 'Enter' and not key_event.get('shiftKey', False):
|
|
# Enter without Shift: Send message
|
|
event.args['preventDefault'] = True
|
|
if self._on_enter_callback and self.value:
|
|
await self._on_enter_callback(self.value)
|
|
self.value = ''
|
|
# Shift+Enter: Allow default behavior (new line)
|