Skip to main content

yggdrasil/
context.rs

1//! 前端全局上下文定义。
2//!
3//! 保存当前登录用户与组件图鉴筛选状态,供组件在客户端与服务端渲染期间共享访问。
4//! 由 `crate::app::App` 通过 `provide_context` 提供,组件用 `expect_context` 读取。
5
6use leptos::prelude::*;
7use std::sync::Arc;
8
9use crate::models::user::PublicUser;
10
11/// 用户上下文,用于在组件树中传递登录状态。
12#[derive(Clone, Copy)]
13pub struct UserContext {
14    /// 当前登录用户,未登录时为 `None`。
15    pub user: RwSignal<Option<Arc<PublicUser>>>,
16    /// 是否已完成会话校验,避免重复触发验证请求。
17    pub checked: RwSignal<bool>,
18}
19
20impl UserContext {
21    /// 创建未登录、未校验的初始上下文。
22    pub fn new() -> Self {
23        Self {
24            user: RwSignal::new(None),
25            checked: RwSignal::new(false),
26        }
27    }
28}
29
30impl Default for UserContext {
31    fn default() -> Self {
32        Self::new()
33    }
34}
35
36/// 组件图鉴的筛选状态:在图鉴列表与详情页之间保持,返回列表时恢复。
37#[derive(Clone, Default, PartialEq)]
38pub struct ShowcaseFilters {
39    pub category: String,
40    pub search: String,
41    /// 宽屏详情栏当前展示的组件;`None` 时取筛选结果的第一项。
42    pub selected: Option<String>,
43    pub return_to: Option<String>,
44}