main.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #!/usr/bin/env python3
  2. from nicegui import ui
  3. from icecream import ic
  4. messages = []
  5. @ui.page('/')
  6. def main():
  7. async def scroll_to_bottom() -> None:
  8. await ui.run_javascript(f'window.scrollTo(0, getElement({content.id}).clientHeight)', respond=False)
  9. async def send() -> None:
  10. messages.append(f'**{name.value}**: {message.value}')
  11. message.value = ''
  12. await scroll_to_bottom()
  13. ui.add_head_html('''
  14. <style>
  15. a:link, a:visited {
  16. color: inherit !important;
  17. text-decoration: none;
  18. font-weight: 500;
  19. }
  20. </style>''')
  21. def update_messages():
  22. if len(messages) == message_count:
  23. return
  24. content.clear()
  25. with content:
  26. for message in messages:
  27. ui.markdown(message).classes('text-lg m-2')
  28. message_count = 0
  29. with ui.column().classes('w-full max-w-2xl mx-auto') as content:
  30. with ui.element('q-page-scroller').props('reverse position="top-right" :scroll-offset="0" :offset="[0, 18]'):
  31. ui.button().props('icon="keyboard_arrow_down" fab')
  32. with ui.footer().classes('bg-white text-black'), ui.column().classes('w-full max-w-3xl mx-auto my-6'):
  33. with ui.row().classes('w-full no-wrap items-center'):
  34. name = ui.input(placeholder='name').props('rounded outlined autofocus input-class="ml-3"')
  35. message = ui.input().props('rounded outlined input-class="ml-3"') \
  36. .classes('w-full self-center').on('keydown.enter', send)
  37. ui.markdown(
  38. 'simple chat app built with [NiceGUI](https://nicegui.io)'
  39. ).classes('text-xs self-end mr-8 m-[-1em] text-primary')
  40. ui.timer(1, update_messages)
  41. ui.run()