@blocklet/ui-react
Version:
Some useful front-end web components that can be used in Blocklets.
148 lines (113 loc) • 7.9 kB
Markdown
# UserCenter
`UserCenter` 元件是一個全面的預建介面,提供完整的用戶個人檔案和設定管理頁面。它整合了多種功能,包括使用者資訊顯示、通行證管理、隱私控制、通知設定和 DID 儲存管理,為使用者提供了一個集中式的中心。
此元件設計為高度可擴展,允許開發者透過 blocklet 的元資料新增自訂分頁和內容,確保在不同應用程式中提供一致的使用者體驗。
<!-- DIAGRAM_IMAGE_START:architecture:4:3:1765962229 -->

<!-- DIAGRAM_IMAGE_END -->
## 基本用法
要使用 `UserCenter`,您需要提供 `currentTab` prop,它決定了哪個區塊是作用中的。這通常來自應用程式的路由器。
```javascript UserCenter 範例 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} />;
}
```
## Props
`UserCenter` 元件接受多個 props 來客製化其行為和外觀。
<x-field-group>
<x-field data-name="children" data-type="React.ReactNode" data-required="false">
<x-field-desc markdown>用於呈現 blocklet 導覽設定中定義的自訂分頁內容。當 `currentTab` 符合自訂分頁的 URL 時,`UserCenter` 將顯示 children。</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` 元件以進行自訂的 props。</x-field-desc>
</x-field>
<x-field data-name="footerProps" data-type="object" data-required="false">
<x-field-desc markdown>要傳遞給底層 `Footer` 元件以進行自訂的 props。</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` 為每位使用者包含以下分頁:
| 分頁 | 說明 | 可見性 |
| ------------------- | ------------------------------------------------------------------------------ | --------------- |
| **NFTs** | 顯示使用者的 NFT 收藏。 | 公開 |
| **社交動態** | 如果啟用社交功能,則顯示使用者的追蹤者和追蹤中清單。 | 公開 |
| **設定** | 存取個人檔案、隱私、通知和會話管理。 | 僅限擁有者 |
| **儲存空間** | 用於管理與 DID Spaces 連接以進行去中心化儲存的介面。 | 僅限擁有者 |
### 使用者個人檔案 (`UserBasicInfo`)
`UserBasicInfo` 元件是一個專用區塊(在桌面上通常是側邊欄),顯示必要的使用者詳細資訊:
- **頭像和姓名**:顯示使用者的個人資料圖片和全名。擁有者可以點擊頭像來打開個人檔案切換器。
- **DID**:顯示使用者的去中心化識別碼,並提供複製或查看其 QR 碼的選項。
- **社交操作**:對於公開的個人檔案,它會顯示「追蹤」或「取消追蹤」按鈕。
- **元資料**:顯示使用者提供的資訊,如個人簡介、地點和社交連結。
- **私人資訊**:對於擁有者,它會顯示私人詳細資訊,如電子郵件和電話號碼。
### 通行證管理
在主要的個人檔案分頁(NFTs)上,當前登入的使用者會看到一個專門用於其 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` prop 符合您定義的 `link` 時,該子元素將被呈現。
```javascript MyActivity.js icon=logos:react
import React from 'react';
import { UserCenter } from '@blocklet/ui-react';
function MyActivityComponent() {
return <div>這是自訂的活動內容。</div>;
}
export default function ProfilePageWithActivity() {
// 此值將來自您的路由器,例如 '/profile/activity'
const currentTab = '/profile/activity';
return (
<UserCenter currentTab={currentTab}>
{currentTab === '/profile/activity' && <MyActivityComponent />}
</UserCenter>
);
}
```
這種方法讓您能夠將特定於應用程式的頁面無縫整合到標準的 `UserCenter` 佈局中。