flet-dev / examples

Flet sample applications
MIT License
488 stars 197 forks source link

flet example chat #152

Open piidus opened 2 months ago

piidus commented 2 months ago

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)