|
| 1 | +# Grok API Tech トレンド機能追加計画 |
| 2 | + |
| 3 | +## 概要 |
| 4 | + |
| 5 | +Grok APIを使用してTechトレンドを取得する機能を astute-crow プロジェクトに追加します。 |
| 6 | +Convex連携は不要で、独立したサービスとして実装します。 |
| 7 | + |
| 8 | +## 現在のコードベース構造 |
| 9 | + |
| 10 | +- **メインエントリーポイント**: `src/main.ts` |
| 11 | +- **既存コンポーネント**: `src/components/ZennTrends.ts` (Zennトレンド表示) |
| 12 | +- **既存サービス**: `src/services/zennService.ts` (Convex連携) |
| 13 | +- **型定義**: `src/types/zenn.ts` |
| 14 | +- **スタイル**: `src/style.css` |
| 15 | + |
| 16 | +## 実装計画 |
| 17 | + |
| 18 | +### 1. Grok API サービスの作成 |
| 19 | + |
| 20 | +**ファイル**: `src/services/grokService.ts` |
| 21 | + |
| 22 | +#### 主要機能 |
| 23 | +- Grok APIとの通信管理 |
| 24 | +- APIキー管理(環境変数 `VITE_GROK_API_KEY`) |
| 25 | +- レート制限対応 |
| 26 | +- エラーハンドリング |
| 27 | +- ローカルキャッシュ機能(localStorage使用) |
| 28 | + |
| 29 | +#### 実装メソッド |
| 30 | +```typescript |
| 31 | +class GrokService { |
| 32 | + async getTechTrends(): Promise<GrokTrend[]> |
| 33 | + async refreshTrends(): Promise<GrokTrend[]> |
| 34 | + clearCache(): void |
| 35 | + private handleApiError(error: any): void |
| 36 | + private getCachedData(): GrokTrend[] | null |
| 37 | + private setCachedData(data: GrokTrend[]): void |
| 38 | +} |
| 39 | +``` |
| 40 | + |
| 41 | +### 2. 型定義の追加 |
| 42 | + |
| 43 | +**ファイル**: `src/types/grok.ts` |
| 44 | + |
| 45 | +#### 定義する型 |
| 46 | +```typescript |
| 47 | +interface GrokTrend { |
| 48 | + id: string |
| 49 | + title: string |
| 50 | + description: string |
| 51 | + url: string |
| 52 | + category: string |
| 53 | + score: number |
| 54 | + publishedAt: string |
| 55 | + source: string |
| 56 | +} |
| 57 | + |
| 58 | +interface GrokTrendsResponse { |
| 59 | + trends: GrokTrend[] |
| 60 | + metadata: { |
| 61 | + totalCount: number |
| 62 | + lastUpdated: string |
| 63 | + } |
| 64 | +} |
| 65 | + |
| 66 | +interface GrokTrendsState { |
| 67 | + trends: GrokTrend[] |
| 68 | + loading: LoadingState |
| 69 | + error: ErrorState | null |
| 70 | + lastUpdated: string | null |
| 71 | +} |
| 72 | +``` |
| 73 | + |
| 74 | +### 3. Grokトレンドコンポーネントの作成 |
| 75 | + |
| 76 | +**ファイル**: `src/components/GrokTrends.ts` |
| 77 | + |
| 78 | +#### 設計方針 |
| 79 | +- ZennTrendsコンポーネントと同様の構造 |
| 80 | +- 状態管理(loading, error, success) |
| 81 | +- カード形式でのトレンド表示 |
| 82 | +- 手動更新機能 |
| 83 | + |
| 84 | +#### 主要メソッド |
| 85 | +```typescript |
| 86 | +class GrokTrends { |
| 87 | + init(): Promise<void> |
| 88 | + loadTrends(): Promise<void> |
| 89 | + refresh(): Promise<void> |
| 90 | + render(): void |
| 91 | + private createTrendCard(trend: GrokTrend): string |
| 92 | + private createLoadingState(): string |
| 93 | + private createErrorState(): string |
| 94 | +} |
| 95 | +``` |
| 96 | + |
| 97 | +### 4. メインファイルの更新 |
| 98 | + |
| 99 | +**ファイル**: `src/main.ts` |
| 100 | + |
| 101 | +#### 変更内容 |
| 102 | +- HTMLテンプレートに新しいセクション追加 |
| 103 | +- GrokTrendsコンポーネントの初期化 |
| 104 | +- 既存のZennTrendsと並行表示 |
| 105 | + |
| 106 | +```typescript |
| 107 | +document.querySelector<HTMLDivElement>('#app')!.innerHTML = ` |
| 108 | + <div class="container"> |
| 109 | + <section id="zenn-trends"></section> |
| 110 | + <section id="grok-trends"></section> |
| 111 | + </div> |
| 112 | +` |
| 113 | + |
| 114 | +// コンポーネント初期化 |
| 115 | +const zennTrends = new ZennTrends('zenn-trends'); |
| 116 | +const grokTrends = new GrokTrends('grok-trends'); |
| 117 | + |
| 118 | +Promise.all([ |
| 119 | + zennTrends.init(), |
| 120 | + grokTrends.init() |
| 121 | +]).catch(console.error); |
| 122 | +``` |
| 123 | + |
| 124 | +### 5. スタイルの調整 |
| 125 | + |
| 126 | +**ファイル**: `src/style.css` |
| 127 | + |
| 128 | +#### 追加内容 |
| 129 | +- Grokトレンド用のスタイル |
| 130 | +- 共通カードスタイルのリファクタリング |
| 131 | +- セクション間のマージン調整 |
| 132 | +- レスポンシブデザイン対応 |
| 133 | + |
| 134 | +### 6. 環境変数の設定 |
| 135 | + |
| 136 | +#### 新規ファイル |
| 137 | +- `.env.example`: 設定例の追加 |
| 138 | + |
| 139 | +#### 内容 |
| 140 | +``` |
| 141 | +# Grok API |
| 142 | +VITE_GROK_API_KEY=your_grok_api_key_here |
| 143 | +
|
| 144 | +# Convex (existing) |
| 145 | +VITE_CONVEX_URL=your_convex_url_here |
| 146 | +``` |
| 147 | + |
| 148 | +## 実装詳細 |
| 149 | + |
| 150 | +### API エンドポイント |
| 151 | +- Grok APIの具体的なエンドポイントURL(要確認) |
| 152 | +- 認証方法(APIキー、Bearer token等) |
| 153 | +- レスポンス形式の詳細 |
| 154 | + |
| 155 | +### エラーハンドリング戦略 |
| 156 | +1. **ネットワークエラー**: リトライ機能付き |
| 157 | +2. **APIエラー**: 適切なエラーメッセージ表示 |
| 158 | +3. **認証エラー**: 設定確認メッセージ |
| 159 | +4. **レート制限**: 自動的な遅延処理 |
| 160 | + |
| 161 | +### キャッシュ戦略 |
| 162 | +- **保存場所**: localStorage |
| 163 | +- **有効期限**: 30分 |
| 164 | +- **キャッシュクリア**: 手動更新時 |
| 165 | + |
| 166 | +### セキュリティ考慮事項 |
| 167 | +- APIキーの安全な管理 |
| 168 | +- HTTPS通信の確保 |
| 169 | +- XSS対策(HTMLエスケープ) |
| 170 | + |
| 171 | +## 開発フェーズ |
| 172 | + |
| 173 | +### Phase 1: 基本実装 |
| 174 | +1. GrokService の作成 |
| 175 | +2. 型定義の追加 |
| 176 | +3. 基本的なAPI通信テスト |
| 177 | + |
| 178 | +### Phase 2: UI実装 |
| 179 | +1. GrokTrendsコンポーネントの作成 |
| 180 | +2. メインファイルの更新 |
| 181 | +3. 基本スタイルの適用 |
| 182 | + |
| 183 | +### Phase 3: 機能強化 |
| 184 | +1. エラーハンドリングの充実 |
| 185 | +2. キャッシュ機能の実装 |
| 186 | +3. UI/UX の改善 |
| 187 | + |
| 188 | +### Phase 4: 最終調整 |
| 189 | +1. スタイルの最適化 |
| 190 | +2. パフォーマンステスト |
| 191 | +3. エラーケースのテスト |
| 192 | + |
| 193 | +## 注意事項 |
| 194 | + |
| 195 | +- Convex連携は実装しない(要件通り) |
| 196 | +- Grok APIのドキュメント確認が必要 |
| 197 | +- APIキーの取得方法の確認が必要 |
| 198 | +- レート制限の詳細確認が必要 |
| 199 | + |
| 200 | +## 今後の拡張可能性 |
| 201 | + |
| 202 | +- フィルタリング機能(カテゴリ別) |
| 203 | +- ソート機能(スコア順、日付順) |
| 204 | +- 詳細表示モーダル |
| 205 | +- お気に入り機能 |
| 206 | +- エクスポート機能 |
0 commit comments