flet example chat
update page dialog with version code is under
import flet as ft
class Message: def init(self, user_name: str, text: str, message_type: str): self.user_name = user_name self.text = text self.message_type = message_type
class ChatMessage(ft.Row): def init(self, message: Message): super().init() self.vertical_alignment = ft.CrossAxisAlignment.START self.controls = [ ft.CircleAvatar( content=ft.Text(self.get_initials(message.user_name)), color=ft.colors.WHITE, bgcolor=self.get_avatar_color(message.user_name), ), ft.Column( [ ft.Text(message.user_name, weight="bold"), ft.Text(message.text, selectable=True), ], tight=True, spacing=5, ), ]
def get_initials(self, user_name: str):
if user_name:
return user_name[:1].capitalize()
else:
return "Unknown" # or any default value you prefer
def get_avatar_color(self, user_name: str):
colors_lookup = [
ft.colors.AMBER,
ft.colors.BLUE,
ft.colors.BROWN,
ft.colors.CYAN,
ft.colors.GREEN,
ft.colors.INDIGO,
ft.colors.LIME,
ft.colors.ORANGE,
ft.colors.PINK,
ft.colors.PURPLE,
ft.colors.RED,
ft.colors.TEAL,
ft.colors.YELLOW,
]
return colors_lookup[hash(user_name) % len(colors_lookup)]
def main(page: ft.Page): page.horizontal_alignment = ft.CrossAxisAlignment.STRETCH page.title = "Flet Chat"
def join_chat_click(e):
if not join_user_name.value:
join_user_name.error_text = "Name cannot be blank!"
join_user_name.update()
else:
page.session.set("user_name", join_user_name.value)
# page.dialog.open = False
dialog.open = False
new_message.prefix = ft.Text(f"{join_user_name.value}: ")
page.pubsub.send_all(
Message(
user_name=join_user_name.value,
text=f"{join_user_name.value} has joined the chat.",
message_type="login_message",
)
)
page.update()
def send_message_click(e):
if new_message.value != "":
page.pubsub.send_all(
Message(
page.session.get("user_name"),
new_message.value,
message_type="chat_message",
)
)
new_message.value = ""
new_message.focus()
page.update()
def on_message(message: Message):
if message.message_type == "chat_message":
m = ChatMessage(message)
elif message.message_type == "login_message":
m = ft.Text(message.text, italic=True, color=ft.colors.BLACK45, size=12)
chat.controls.append(m)
page.update()
page.pubsub.subscribe(on_message)
# A dialog asking for a user display name
join_user_name = ft.TextField(
label="Enter your name to join the chat",
autofocus=True,
on_submit=join_chat_click,
)
dialog = ft.AlertDialog(
open=True,
modal=True,
title=ft.Text("Welcome!"),
content=ft.Column([join_user_name], width=300, height=70, tight=True),
actions=[ft.ElevatedButton(text="Join chat", on_click=join_chat_click)],
actions_alignment=ft.MainAxisAlignment.END,
)
page.overlay.append(dialog)
# Chat messages
chat = ft.ListView(
expand=True,
spacing=10,
auto_scroll=True,
)
# A new message entry form
new_message = ft.TextField(
hint_text="Write a message...",
autofocus=True,
shift_enter=True,
min_lines=1,
max_lines=5,
filled=True,
expand=True,
on_submit=send_message_click,
)
# Add everything to the page
page.add(
ft.Container(
content=chat,
border=ft.border.all(1, ft.colors.OUTLINE),
border_radius=5,
padding=10,
expand=True,
),
ft.Row(
[
new_message,
ft.IconButton(
icon=ft.icons.SEND_ROUNDED,
tooltip="Send message",
on_click=send_message_click,
),
]
),
)
ft.app(target=main)