-
Notifications
You must be signed in to change notification settings - Fork 1
Closed
Labels
Description
概要
部室への入退室管理機能(アクティビティ機能)のメインダッシュボードページを実装する。
背景
バックエンドで以下のPRによりアクティビティ機能のAPIが実装済み:
- feat: アクティビティ機能の基礎実装 digicore_v3_backend#242 - 基礎実装(DBスキーマ、仕様書)
- feat: アクティビティ入退室エンドポイントの実装 digicore_v3_backend#244 - 入退室エンドポイント(checkin/checkout/強制checkout/レコード編集)
- feat: アクティビティ統計エンドポイントの追加 digicore_v3_backend#245 - 統計エンドポイント(在室者一覧/訪問履歴/ユーザー記録)
実装内容
1. ページ作成: pages/activity/index.tsx
データ取得(SSR):
getServerSidePropsでGET /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参照) - エラーハンドリング:
useErrorStateのsetNewError/removeError
Reactions are currently unavailable