# useDid

`useDid`フックは、`session.user`オブジェクトから特定のDID関連情報を簡単に抽出して操作するための便利なユーティリティです。手動での処理なしに、永続DID、ウォレット情報、接続済みアカウントなどの一般的に必要なデータを取得するためにユーザーオブジェクトの解析を簡素化します。

このフックは、セッションコンテキストにアクセスできるように、`SessionProvider`の子であるコンポーネント内で使用する必要があります。

## 使用方法

このフックを使用するには、`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`フックは、単一のオブジェクトをパラメータとして受け取ります。

<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`フックから取得したセッションオブジェクト。このフックは`session.user`が存在する場合にのみデータを計算します。">
    <x-field data-name="user" data-type="object" data-required="false" data-desc="ログイン成功後にセッションコンテキストによって提供されるユーザーオブジェクト。"></x-field>
  </x-field>
</x-field>

## 戻り値

このフックは、派生したさまざまな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`フックは、エクスポートされた一連のヘルパー関数に基づいて構築されています。フックのリアクティブな状態管理が不要で、単にユーザーオブジェクトから特定の情報を抽出したい場合は、これらの関数を直接インポートして使用できます。

| 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);
  }
}
```