Skip to content

Commit 67a5ede

Browse files
committed
wip
1 parent 57b18e6 commit 67a5ede

File tree

2 files changed

+46
-103
lines changed

2 files changed

+46
-103
lines changed

ios/ios/ViewModels/CardViewModel.swift

Lines changed: 35 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import Combine
44

55
class CardViewModel: ObservableObject {
66
@Published var currentCard: Card?
7-
@Published var isLoading = false
87
@Published var errorMessage: String?
98
@Published var isGeneratingCard = false
109
@Published var generationProgress: String = "" // 生成プロセスの進行状況を表示
@@ -22,60 +21,6 @@ class CardViewModel: ObservableObject {
2221
return Array(cards[startIndex..<endIndex])
2322
}
2423

25-
@MainActor
26-
func loadCards() async {
27-
isLoading = true
28-
errorMessage = nil
29-
30-
guard let accessToken = keychainHelper.getAccessToken() else {
31-
errorMessage = "アクセストークンが見つかりません。ログインしてください。"
32-
isLoading = false
33-
return
34-
}
35-
36-
let fetchedCards = await tRPCService.shared.fetchActiveTasks(token: accessToken)
37-
print("📥 APIから\(fetchedCards.count)件のタスクを取得しました")
38-
39-
// 画像生成
40-
await generateImagesForCards(fetchedCards)
41-
42-
cards = fetchedCards
43-
currentCard = cards.first
44-
45-
isLoading = false
46-
}
47-
48-
/// APIから取得したカードに画像を生成する
49-
@MainActor
50-
private func generateImagesForCards(_ cardsToUpdate: [Card]) async {
51-
for i in 0..<cardsToUpdate.count {
52-
let card = cardsToUpdate[i]
53-
// 画像URLが空または存在しない場合は生成
54-
if card.imageURL.isEmpty {
55-
let taskName = card.displayName
56-
let emoji = emojiSelector.selectEmojiWithPriority(for: taskName)
57-
if let imagePath = await imageGenerator.generateTaskImage(taskText: taskName, emoji: emoji) {
58-
// imageURLを更新
59-
let updatedCard = Card(
60-
id: card.id,
61-
imageURL: imagePath,
62-
taskText: taskName,
63-
emoji: emoji,
64-
title: card.title,
65-
userId: card.userId,
66-
projectId: card.projectId,
67-
name: card.name,
68-
date: card.date,
69-
status: card.status,
70-
priority: card.priority,
71-
parentId: card.parentId
72-
)
73-
cards[i] = updatedCard
74-
}
75-
}
76-
}
77-
}
78-
7924
@MainActor
8025
func handleSwipe(direction: SwipeDirection) {
8126
guard let card = currentCard else { return }
@@ -103,6 +48,8 @@ class CardViewModel: ObservableObject {
10348
let result = await tRPCService.shared.splitTaskAI(taskId: card.id, token: accessToken)
10449
print("✂️ [API Mode] タスク分割成功:")
10550
print(result)
51+
52+
10653

10754
// 現在のカードを削除
10855
moveToNextCard()
@@ -133,13 +80,8 @@ class CardViewModel: ObservableObject {
13380
cards.remove(at: index)
13481
}
13582

136-
if cards.isEmpty {
137-
Task {
138-
await loadCards()
139-
}
140-
} else {
141-
currentCard = cards.first
142-
}
83+
// 次のカードを設定(空の場合はnil)
84+
currentCard = cards.first
14385
}
14486

14587
@MainActor
@@ -168,48 +110,56 @@ class CardViewModel: ObservableObject {
168110
isGeneratingCard = true
169111
errorMessage = nil
170112

171-
// ステップ1: 絵文字を選択
172-
generationProgress = "絵文字を選択中..."
173-
let emoji = emojiSelector.selectEmojiWithPriority(for: taskText)
174-
175-
// ステップ2: 翻訳と画像を生成
176-
generationProgress = "画像を生成中..."
177-
print("🎨 画像生成開始: \(taskText)")
178-
guard let imagePath = await imageGenerator.generateTaskImage(taskText: taskText, emoji: emoji) else {
179-
errorMessage = "画像の生成に失敗しました。再度お試しください。"
180-
print("❌ 画像生成失敗: \(taskText)")
113+
// ステップ1: バックエンドにタスクを作成
114+
generationProgress = "タスクを保存中..."
115+
guard let accessToken = keychainHelper.getAccessToken() else {
116+
errorMessage = "アクセストークンが見つかりません。ログインしてください。"
181117
isGeneratingCard = false
182118
generationProgress = ""
183119
return
184120
}
185-
print("✅ 画像生成成功: \(imagePath)")
186121

187-
// ステップ3: バックエンドにタスクを作成
188-
generationProgress = "タスクを保存中..."
189-
guard let accessToken = keychainHelper.getAccessToken() else {
190-
errorMessage = "アクセストークンが見つかりません。ログインしてください。"
122+
guard var newCard = await tRPCService.shared.projectCreateTask(projectName: taskText, TaskName: taskText, token: accessToken) else {
123+
errorMessage = "タスクの作成に失敗しました。"
191124
isGeneratingCard = false
192125
generationProgress = ""
193126
return
194127
}
195128

196-
guard let taskId = await tRPCService.shared.projectCreateTask(projectName: taskText, TaskName: taskText, token: accessToken) else {
197-
errorMessage = "タスクの作成に失敗しました。"
129+
// ステップ2: 絵文字を選択
130+
generationProgress = "絵文字を選択中..."
131+
let emoji = emojiSelector.selectEmojiWithPriority(for: taskText)
132+
133+
// ステップ3: 画像を生成
134+
generationProgress = "画像を生成中..."
135+
print("🎨 画像生成開始: \(taskText)")
136+
guard let imagePath = await imageGenerator.generateTaskImage(taskText: taskText, emoji: emoji) else {
137+
errorMessage = "画像の生成に失敗しました。再度お試しください。"
138+
print("❌ 画像生成失敗: \(taskText)")
198139
isGeneratingCard = false
199140
generationProgress = ""
200141
return
201142
}
143+
print("✅ 画像生成成功: \(imagePath)")
202144

203-
// ステップ4: 作成したタスクをカードスタックに追加
204-
let newCard = Card(
205-
id: taskId,
145+
// ステップ4: 画像とemoji情報を追加してカードを更新
146+
let cardWithImage = Card(
147+
id: newCard.id,
206148
imageURL: imagePath,
207149
taskText: taskText,
208150
emoji: emoji,
209-
title: taskText,
210-
name: taskText
151+
title: newCard.title,
152+
userId: newCard.userId,
153+
projectId: newCard.projectId,
154+
name: newCard.name,
155+
date: newCard.date,
156+
status: newCard.status,
157+
priority: newCard.priority,
158+
parentId: newCard.parentId
211159
)
212-
cards.insert(newCard, at: 0)
160+
161+
// ステップ5: カードスタックに追加
162+
cards.insert(cardWithImage, at: 0)
213163
currentCard = cards.first
214164
print("✅ タスクカード追加成功: \(taskText)")
215165

ios/ios/Views/ContentView.swift

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,7 @@ struct ContentView: View {
5050
.position(x: geometry.size.width - 40, y: geometry.size.height - 60)
5151
.opacity(0.4)
5252

53-
if viewModel.isLoading {
54-
ProgressView("Loading cards...")
55-
.font(.headline)
56-
.foregroundColor(.white)
57-
} else if let errorMessage = viewModel.errorMessage {
53+
if let errorMessage = viewModel.errorMessage {
5854
VStack(spacing: 20) {
5955
Image(systemName: "exclamationmark.triangle")
6056
.font(.system(size: 60))
@@ -64,12 +60,6 @@ struct ContentView: View {
6460
.foregroundColor(.white)
6561
.multilineTextAlignment(.center)
6662
.padding()
67-
Button("Retry") {
68-
Task {
69-
await viewModel.loadCards()
70-
}
71-
}
72-
.buttonStyle(.borderedProminent)
7363
}
7464
} else if let card = viewModel.currentCard {
7565
// カードスタック表示(中央に大きく配置)
@@ -128,13 +118,18 @@ struct ContentView: View {
128118
}
129119
}
130120
} else {
131-
VStack(spacing: 20) {
132-
Image(systemName: "photo.on.rectangle.angled")
133-
.font(.system(size: 60))
121+
VStack(spacing: 30) {
122+
Image(systemName: "mic.fill")
123+
.font(.system(size: 80))
134124
.foregroundColor(.white)
135-
Text("No more cards")
136-
.font(.headline)
125+
Text("マイク入力でタスクを追加")
126+
.font(.system(size: 24, weight: .semibold))
137127
.foregroundColor(.white)
128+
.multilineTextAlignment(.center)
129+
Text("下部のマイクボタンを長押しして\n音声でタスクを入力してください")
130+
.font(.system(size: 16))
131+
.foregroundColor(.white.opacity(0.8))
132+
.multilineTextAlignment(.center)
138133
}
139134
}
140135

@@ -175,8 +170,6 @@ struct ContentView: View {
175170
}
176171
}
177172
.task {
178-
await viewModel.loadCards()
179-
180173
speechViewModel.onRecognitionCompleted = { recognizedText in
181174
Task { @MainActor in
182175
await viewModel.addTaskCard(taskText: recognizedText)

0 commit comments

Comments
 (0)