Python/产品需求文档AI生成/application/components/navigation_bar.py

138 lines
4.0 KiB
Python

# -*- coding: utf-8 -*-
"""
导航栏组件
"""
import reflex
from ..state import State
def create_session_modal(trigger) -> reflex.Component:
"""
创建会话模态窗组件
"""
return reflex.dialog.root(
reflex.dialog.trigger(trigger),
reflex.dialog.content(
reflex.form(
reflex.hstack(
reflex.input(
name="session_name",
placeholder="会话名称",
flex="auto",
min_width="20ch",
),
reflex.button("创建会话"),
spacing="2",
wrap="wrap",
width="100%",
),
on_submit=State.create_session,
),
background_color=reflex.color("mauve", 1),
),
open=State.create_session_modal_is_open,
on_open_change=State.toggle_create_session_modal,
)
def session_history_item(session_name: str) -> reflex.Component:
"""
会话历史侧边栏中一次会话组件
:param session_name: 会话名称
:return: Component
"""
return reflex.drawer.close(
reflex.hstack(
reflex.button(
session_name,
on_click=lambda: State.switch_session(
session_name
), # 点击按钮将切换会话
width="80%",
variant="surface",
),
reflex.button(
reflex.icon(
tag="trash",
on_click=lambda: State.delete_session(
session_name
), # 点击按钮删除会话
stroke_width=1,
),
width="20%",
variant="surface",
color_scheme="red",
),
width="100%",
),
key=session_name, # 使用会话名称作为唯一标识(会话名称不可重复)
)
def session_history(trigger) -> reflex.Component:
"""
会话历史侧边栏组件
"""
return reflex.drawer.root(
reflex.drawer.trigger(trigger),
reflex.drawer.overlay(),
reflex.drawer.portal(
reflex.drawer.content(
reflex.vstack(
reflex.heading("会话列表", color=reflex.color("mauve", 11)),
reflex.divider(),
reflex.foreach(
State.get_session_names, # 获取所有会话名称
lambda session_name: session_history_item(
session_name=session_name
), # 创建会话组件
),
align_items="stretch",
width="100%",
),
top="auto",
right="auto",
height="100%",
width="20em",
padding="2em",
background_color=reflex.color("mauve", 2),
outline="none",
)
),
direction="left",
)
def navigation_bar() -> reflex.Component:
"""
导航栏组件
"""
return reflex.hstack(
reflex.badge(
State.current_session_name,
size="3",
variant="soft",
margin_inline_end="auto",
),
create_session_modal(
reflex.box(
reflex.tooltip(reflex.icon("message-square-plus"), content="创建会话")
)
),
session_history(
reflex.box(
reflex.tooltip(
reflex.icon("messages-square"),
content="会话历史",
)
)
),
justify_content="space-between",
align_items="center",
padding="12px",
border_bottom=f"1px solid {reflex.color('mauve', 3)}",
background_color=reflex.color("mauve", 2),
)