Skip to content

feat: アクティビティ機能 - 在室状況ダッシュボード #182

@newt239

Description

@newt239

概要

部室への入退室管理機能(アクティビティ機能)のメインダッシュボードページを実装する。

背景

バックエンドで以下のPRによりアクティビティ機能のAPIが実装済み:

実装内容

1. ページ作成: pages/activity/index.tsx

データ取得(SSR):

  • getServerSidePropsGET /activity/place/{place}/current を呼び出し、在室中ユーザー一覧をpropsとして渡す
  • 場所は当面 omiya-bushitsu 固定(将来的に複数場所対応を検討)
  • 認証エラー(401/403)の場合は /login へリダイレクト

在室状況表示:

  • 各ユーザーのアイコン、名前、自己紹介(短)、入室時刻を表示
  • ユーザー名クリックで /member/{userId} に遷移
  • 在室者がいない場合は空状態メッセージ表示

チェックイン/チェックアウト機能(クライアントサイド):

  • コンポーネント内で apiClient を直接使用してPOST
  • POST /activity/checkin でチェックイン
  • POST /activity/checkout でチェックアウト
  • 自分が在室中かどうか(在室者一覧に自分が含まれるか)でボタンの表示を切り替え
  • 成功後に router.reload() でページを再取得
  • エラー時は useErrorState でエラー表示

2. コンポーネント: components/Activity/

  • CurrentUsersList.tsx - 在室中ユーザー一覧
  • CheckInOutButton.tsx - チェックイン/アウトボタン

3. ナビゲーション追加

  • components/Home/Drawer.tsx のメニューに「アクティビティ」項目を追加

利用するAPIエンドポイント

メソッド パス 取得方法 用途
GET /activity/place/{place}/current SSR (getServerSideProps) 在室中ユーザー一覧取得
POST /activity/checkin クライアント (apiClient) チェックイン
POST /activity/checkout クライアント (apiClient) チェックアウト

APIスキーマ(型定義は生成済み)

// リクエスト
ReqPostActivityCheckin: { place: string }
ReqPostActivityCheckout: { place: string; checkout_at?: string }

// レスポンス
ResGetActivityPlacePlaceCurrent: {
  users: {
    userId: string;
    username: string;
    shortIntroduction: string;
    iconUrl: string;
    checkedInAt: string; // ISO datetime
  }[];
}

実装パターン

  • データ取得: getServerSideProps + createServerApiClient(req)pages/event/index.tsx 参照)
  • ミューテーション: コンポーネント内で apiClient.POST() + router.reload()components/Budget/NewBudgetDialog.tsx 参照)
  • エラーハンドリング: useErrorStatesetNewError / removeError

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions