# useDid

`useDid` hook 是一個方便的實用程式，可輕鬆地從 `session.user` 物件中提取和使用特定的 DID 相關資訊。它簡化了使用者物件的解析過程，無需手動處理即可獲取永久 DID、錢包資訊和已連接帳戶等常用資料。

此 hook 應在 `SessionProvider` 的子元件中使用，以確保它能存取 session 上下文。

## 如何使用

若要使用此 hook，請將其與 `useSession` 一起匯入。呼叫 `useSession` 以取得目前的 session 狀態，然後將 `session` 物件傳遞給 `useDid`。

```javascript Basic Usage icon=logos:react
import { useSession } from '@arcblock/did-connect-react';
import { useDid } from '@arcblock/did-connect-react/lib/User';

function UserProfile() {
  const { session } = useSession();
  const {
    did,
    walletDid,
    connectedDids,
    sourceProvider,
    connectedAccounts,
  } = useDid({ session });

  if (!session.user) {
    return <p>請登入以查看您的 DID 資訊。</p>;
  }

  return (
    <div>
      <h2>使用者 DID 資訊</h2>
      <p><strong>永久 DID：</strong> {did}</p>
      <p><strong>錢包 DID：</strong> {walletDid || 'N/A'}</p>
      <p><strong>登入方式：</strong> {sourceProvider}</p>
      <h3>已連接的帳戶 ({connectedAccounts.length})</h3>
      <ul>
        {connectedAccounts.map((account) => (
          <li key={account.did}>
            {account.provider}: {account.did}
          </li>
        ))}
      </ul>
    </div>
  );
}
```

## 參數

`useDid` hook 接受一個物件作為其參數。

<x-field data-name="options" data-type="object" data-required="true">
  <x-field data-name="session" data-type="object" data-required="true" data-desc="從 `useSession` hook 取得的 session 物件。只有當 `session.user` 存在時，此 hook 才會計算資料。">
    <x-field data-name="user" data-type="object" data-required="false" data-desc="成功登入後由 session 上下文提供的使用者物件。"></x-field>
  </x-field>
</x-field>

## 傳回值

此 hook 會傳回一個狀態物件，其中包含各種衍生的 DID 資訊。每當 `session.user` 物件變更時，此物件都會更新。

<x-field-group>
  <x-field data-name="did" data-type="string" data-desc="使用者的永久 DID。這是 `permanentDid` 的別名。"></x-field>
  <x-field data-name="wallet" data-type="object" data-desc="提供者為 'wallet' 的已連接帳戶物件。如果沒有連接錢包，則傳回 `undefined`。">
      <x-field data-name="did" data-type="string" data-desc="錢包帳戶的 DID。"></x-field>
      <x-field data-name="provider" data-type="string" data-desc="提供者名稱，此處為 'wallet'。"></x-field>
  </x-field>
  <x-field data-name="walletDid" data-type="string" data-desc="使用者已連接錢包的 DID。如果沒有連接錢包，則傳回 `undefined`。"></x-field>
  <x-field data-name="permanentDid" data-type="string" data-desc="使用者的永久 DID，即來自 `user.did` 的主要識別碼。"></x-field>
  <x-field data-name="connectedDids" data-type="string[]" data-desc="一個包含使用者所有已連接帳戶 DID 的陣列。"></x-field>
  <x-field data-name="connectedAccounts" data-type="object[]" data-desc="完整的已連接帳戶物件陣列。">
    <x-field data-name="did" data-type="string" data-desc="已連接帳戶的 DID。"></x-field>
    <x-field data-name="provider" data-type="string" data-desc="帳戶的提供者（例如 'wallet'、'github'）。"></x-field>
  </x-field>
  <x-field data-name="sourceProvider" data-type="string" data-desc="使用者最初用於登入的提供者（例如 'wallet'、'github'）。預設為 'wallet'。"></x-field>
  <x-field data-name="sourceProviders" data-type="string[]" data-desc="一個包含使用者所有已連接帳戶提供者名稱的陣列。"></x-field>
</x-field-group>

## 獨立的輔助函數

`useDid` hook 建立在一組匯出的輔助函數之上。如果您不需要 hook 的響應式狀態管理，而只想從使用者物件中提取特定資訊，可以直接匯入並使用這些函數。

| Function                 | Description                                                  |
| ------------------------ | ------------------------------------------------------------ |
| `getPermanentDid(user)`  | 從使用者物件中提取永久 DID。             |
| `getWalletDid(user)`     | 提取已連接錢包的 DID。                    |
| `getConnectedAccounts(user)` | 擷取已連接帳戶的陣列。                 |
| `getConnectedDids(user)`   | 擷取一個包含所有已連接帳戶 DID 的陣列。      |
| `getSourceProvider(user)`  | 取得用於初始登入的提供者。                |
| `getSourceProviders(user)` | 取得一個包含所有已連接提供者名稱的陣列。               |
| `getWallet(user)`        | 尋找並傳回完整的錢包帳戶物件。        |

### 範例：使用輔助函數

```javascript Direct Function Usage icon=logos:javascript
import { getWalletDid } from '@arcblock/did-connect-react/lib/User/use-did';
import { useSession } from '@arcblock/did-connect-react';

// 這種方法在事件處理常式或其他非 React 函數中可能很有用
function handleUserAction() {
  const { session } = useSession();
  if (session.user) {
    const walletDid = getWalletDid(session.user);
    console.log('使用者錢包 DID：', walletDid);
  }
}
```