forked from github/CopilotForXcode
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCodeReviewMainView.swift
More file actions
122 lines (104 loc) · 3.73 KB
/
CodeReviewMainView.swift
File metadata and controls
122 lines (104 loc) · 3.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import ComposableArchitecture
import ConversationServiceProvider
import LanguageServerProtocol
import SwiftUI
import SharedUIComponents
// MARK: - Main View
struct CodeReviewMainView: View {
let store: StoreOf<Chat>
let round: CodeReviewRound
@State private var selectedFileUris: [DocumentUri]
@AppStorage(\.chatFontSize) var chatFontSize
private var changedFileUris: [DocumentUri] {
round.request?.changedFileUris ?? []
}
private var hasChangedFiles: Bool {
!changedFileUris.isEmpty
}
private var hasFileComments: Bool {
guard let fileComments = round.response?.fileComments else { return false }
return !fileComments.isEmpty
}
static let HelloMessage: String = "Sure, I can help you with that."
public init(store: StoreOf<Chat>, round: CodeReviewRound) {
self.store = store
self.round = round
self.selectedFileUris = round.request?.selectedFileUris ?? []
}
var helloMessageView: some View {
Text(Self.HelloMessage)
.scaledFont(.system(size: chatFontSize))
}
var statusIcon: some View {
Group {
switch round.status {
case .running:
ProgressView()
.controlSize(.small)
.frame(width: 16, height: 16)
.scaledScaleEffect(0.7)
case .completed:
Image(systemName: "checkmark")
.foregroundColor(.green)
.scaledFont(.body)
case .error:
Image(systemName: "xmark.circle")
.foregroundColor(.red)
.scaledFont(.body)
case .cancelled:
Image(systemName: "slash.circle")
.foregroundColor(.gray)
.scaledFont(.body)
case .waitForConfirmation:
EmptyView()
case .accepted:
EmptyView()
}
}
}
var statusView: some View {
Group {
switch round.status {
case .waitForConfirmation, .accepted:
EmptyView()
default:
HStack(spacing: 4) {
statusIcon
.scaledFrame(width: 16, height: 16)
Text("Running Code Review...")
.scaledFont(.system(size: chatFontSize))
.foregroundColor(.secondary)
Spacer()
}
}
}
}
var shouldShowHelloMessage: Bool { round.statusHistory.contains(.waitForConfirmation) }
var shouldShowRunningStatus: Bool { round.statusHistory.contains(.running) }
var body: some View {
WithPerceptionTracking {
VStack(alignment: .leading, spacing: 8) {
if shouldShowHelloMessage {
helloMessageView
}
if hasChangedFiles {
FileSelectionSection(
store: store,
round: round,
changedFileUris: changedFileUris,
selectedFileUris: $selectedFileUris
)
}
if shouldShowRunningStatus {
statusView
}
if hasFileComments {
ReviewResultsSection(store: store, round: round)
}
if round.status == .completed || round.status == .error {
ReviewSummarySection(round: round)
}
}
}
}
}