# UserCenter

`UserCenter` 组件是一个全面的、预构建的界面，提供完整的用户个人资料和设置管理页面。它集成了多种功能，包括用户信息显示、通行证管理、隐私控制、通知设置和 DID 存储管理，为用户提供了一个集中的枢纽。

该组件被设计为高度可扩展，允许开发者通过 blocklet 的元数据添加自定义标签页和内容，从而确保在不同应用中提供一致的用户体验。

<!-- DIAGRAM_IMAGE_START:architecture:4:3:1765962229 -->
![UserCenter](assets/diagram/user-center-diagram-0.zh.jpg)
<!-- DIAGRAM_IMAGE_END -->

## 基本用法

要使用 `UserCenter`，您需要提供 `currentTab` 属性，它决定了哪个部分是活动的。该值通常从应用的路由器中获取。

```javascript UserCenter Example icon=logos:react
import React from 'react';
import { UserCenter } from '@blocklet/ui-react';

export default function ProfilePage() {
  // 在实际应用中，您会从路由器中获取此值。
  // 例如，如果 URL 是 /profile/settings，currentTab 的值将是 '/profile/settings'。
  const currentTab = '/profile/nfts';

  return <UserCenter currentTab={currentTab} />;
}
```

## 属性

`UserCenter` 组件接受多个属性来自定义其行为和外观。

<x-field-group>
  <x-field data-name="children" data-type="React.ReactNode" data-required="false">
    <x-field-desc markdown>用于为 blocklet 导航设置中定义的自定义标签页渲染内容。当 `currentTab` 与自定义标签页的 URL 匹配时，`UserCenter` 将显示子组件。</x-field-desc>
  </x-field>
  <x-field data-name="currentTab" data-type="string" data-required="true">
    <x-field-desc markdown>当前活动标签页的值。该值应与可用标签页之一（默认或自定义）的 `value` 属性匹配。它用于高亮显示正确的标签页并展示其对应的内容。</x-field-desc>
  </x-field>
  <x-field data-name="userDid" data-type="string" data-required="false">
    <x-field-desc markdown>要显示其个人资料的用户的 DID。如果省略，组件将尝试从 URL 查询参数（`?did=...`）中获取 DID，或默认使用当前登录的用户。</x-field-desc>
  </x-field>
  <x-field data-name="embed" data-type="boolean" data-default="false" data-required="false">
    <x-field-desc markdown>如果设置为 `true`，组件将以嵌入模式渲染，不包含主要的 `Header` 和 `Footer`，使其适合集成到其他布局或页面中。</x-field-desc>
  </x-field>
  <x-field data-name="onlyProfile" data-type="boolean" data-default="false" data-required="false">
    <x-field-desc markdown>如果设置为 `true`，则仅显示 `UserBasicInfo` 个人资料卡片，不包含任何标签页或内容部分。这在仅需要紧凑型用户个人资料的场景下非常有用。</x-field-desc>
  </x-field>
  <x-field data-name="hideFooter" data-type="boolean" data-default="false" data-required="false">
    <x-field-desc markdown>如果设置为 `true`，`Footer` 组件将不会被渲染。</x-field-desc>
  </x-field>
  <x-field data-name="headerProps" data-type="object" data-required="false">
    <x-field-desc markdown>传递给底层 `Header` 组件以进行自定义的属性。</x-field-desc>
  </x-field>
  <x-field data-name="footerProps" data-type="object" data-required="false">
    <x-field-desc markdown>传递给底层 `Footer` 组件以进行自定义的属性。</x-field-desc>
  </x-field>
  <x-field data-name="onDestroySelf" data-type="() => void" data-required="false">
    <x-field-desc markdown>当非所有者用户从设置中的“危险区域”发起账户删除流程时触发的回调函数。</x-field-desc>
  </x-field>
  <x-field data-name="notLoginContent" data-type="React.ReactNode" data-required="false">
    <x-field-desc markdown>当没有用户登录且未提供 `userDid` 时显示的自定义内容。如果未设置，则显示默认的登录提示。</x-field-desc>
  </x-field>
</x-field-group>

## 核心功能

`UserCenter` 由几个关键部分和组件组成，提供开箱即用的丰富用户体验。

### 默认标签页

默认情况下，`UserCenter` 为每个用户包含以下标签页：

| 标签页 | 描述 | 可见性 |
| ------------------- | ------------------------------------------------------------------------------ | --------------- |
| **NFT** | 显示用户的 NFT 收藏。 | 公开 |
| **社交动态** | 如果启用了社交功能，则显示用户的关注者和正在关注列表。 | 公开 |
| **设置** | 访问个人资料、隐私、通知和会话管理。 | 仅所有者可见 |
| **存储** | 用于管理与 DID Spaces 的连接以进行去中心化存储的界面。 | 仅所有者可见 |

### 用户个人资料 (`UserBasicInfo`)

`UserBasicInfo` 组件是一个专用部分（在桌面上通常是侧边栏），用于显示用户的基本详细信息：
- **头像和姓名**：显示用户的个人资料图片和全名。所有者可以点击头像打开个人资料切换器。
- **DID**：显示用户的去中心化标识符，并提供复制或查看其二维码的选项。
- **社交操作**：对于公开的个人资料，显示“关注”或“取消关注”按钮。
- **元数据**：显示用户提供的信息，如简介、位置和社交链接。
- **私密信息**：对于所有者，显示电子邮件和电话号码等私密详细信息。

### 通行证管理

在主个人资料标签页（NFT）上，当前登录的用户会看到一个专门用于其 DID 通行证的部分。该区域列出了所有关联的通行证，标明其状态（例如，活动、已吊销），并高亮显示当前正在使用的通行证。

### 设置

“设置”标签页是一个综合面板，仅对拥有该个人资料的用户可见。它分为几个子部分：

- **通用设置**：允许用户更新其公开的个人资料信息，如姓名、简介和社交链接。
- **通知管理**：配置接收通知的方式（钱包、电子邮件、推送）并管理 Webhook。
- **第三方登录**：管理与其他身份提供商（如 Google、GitHub 或 Passkeys）的连接。
- **隐私管理**：控制用户个人资料上不同标签页的可见性，将其设置为公开或私密。
- **会话管理**：查看并撤销不同设备上的活动登录会话。
- **危险区域**：为非所有者角色提供删除自己账户的选项。

## 自定义

您可以通过 blocklet 的配置添加新的标签页来扩展 `UserCenter`。

1. **在 `blocklet.yml` 中定义自定义标签页**

   在您的 `blocklet.yml` 文件中，向 `navigation.userCenter` 数组添加条目。每个条目代表一个新的标签页。

    ```yaml blocklet.yml icon=mdi:code-block-tags
    navigation:
      - title: User Center
        role: guest
        userCenter:
          - title: My Activity
            link: /profile/activity
            icon: 'material-symbols:history'
            # 如果此标签页应仅对个人资料所有者可见，则设置为 true
            private: false
    ```

2. **为自定义标签页渲染内容**

   在您的组件中，传递一个子元素，当 `currentTab` 属性与您定义的 `link` 匹配时，该子元素将被渲染。

    ```javascript MyActivity.js icon=logos:react
    import React from 'react';
    import { UserCenter } from '@blocklet/ui-react';

    function MyActivityComponent() {
      return <div>This is the custom activity content.</div>;
    }

    export default function ProfilePageWithActivity() {
      // 此值将来自您的路由器，例如 '/profile/activity'
      const currentTab = '/profile/activity';

      return (
        <UserCenter currentTab={currentTab}>
          {currentTab === '/profile/activity' && <MyActivityComponent />}
        </UserCenter>
      );
    }
    ```

这种方法允许您将特定于应用的页面无缝集成到标准的 `UserCenter` 布局中。