# useDid

`useDid` Hook 是一个便捷的实用程序，可以轻松地从 `session.user` 对象中提取和使用特定的 DID 相关信息。它简化了用户对象的解析过程，无需手动处理即可获取永久 DID、钱包信息和已连接账户等常用数据。

此 Hook 应在 `SessionProvider` 的子组件中使用，以确保其能够访问会话上下文。

## 如何使用

要使用此 Hook，请将其与 `useSession` 一起导入。调用 `useSession` 获取当前会话状态，然后将 `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.user` 存在时，该 Hook 才会计算数据。">
    <x-field data-name="user" data-type="object" data-required="false" data-desc="成功登录后由会话上下文提供的用户对象。"></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('User Wallet DID:', walletDid);
  }
}
```