@@ -11,20 +11,14 @@ public struct PromptToCodeGroup {
1111 public var promptToCodes : IdentifiedArrayOf < PromptToCodePanel . State > = [ ]
1212 public var activeDocumentURL : PromptToCodePanel . State . ID ? = XcodeInspector . shared
1313 . realtimeActiveDocumentURL
14+ public var selectedTabId : URL ?
1415 public var activePromptToCode : PromptToCodePanel . State ? {
1516 get {
16- if let detached = promptToCodes
17- . first ( where: { !$0. promptToCodeState. isAttachedToTarget } )
18- {
19- return detached
20- }
21- guard let id = activeDocumentURL else { return nil }
22- return promptToCodes [ id: id]
17+ guard let selectedTabId else { return promptToCodes. first }
18+ return promptToCodes [ id: selectedTabId] ?? promptToCodes. first
2319 }
2420 set {
25- if let id = newValue? . id {
26- promptToCodes [ id: id] = newValue
27- }
21+ selectedTabId = newValue? . id
2822 }
2923 }
3024 }
@@ -41,7 +35,11 @@ public struct PromptToCodeGroup {
4135 case discardAcceptedPromptToCodeIfNotContinuous( id: PromptToCodePanel . State . ID )
4236 case updateActivePromptToCode( documentURL: URL )
4337 case discardExpiredPromptToCode( documentURLs: [ URL ] )
44- case promptToCode( PromptToCodePanel . State . ID , PromptToCodePanel . Action )
38+ case tabClicked( id: URL )
39+ case closeTabButtonClicked( id: URL )
40+ case switchToNextTab
41+ case switchToPreviousTab
42+ case promptToCode( IdentifiedActionOf < PromptToCodePanel > )
4543 case activePromptToCode( PromptToCodePanel . Action )
4644 }
4745
@@ -51,22 +49,28 @@ public struct PromptToCodeGroup {
5149 Reduce { state, action in
5250 switch action {
5351 case let . activateOrCreatePromptToCode( s) :
54- if let promptToCode = state. activePromptToCode {
52+ if let promptToCode = state. activePromptToCode, s . id == promptToCode . id {
5553 return . run { send in
56- await send ( . promptToCode( promptToCode. id, . focusOnTextField) )
54+ await send ( . promptToCode( . element(
55+ id: promptToCode. id,
56+ action: . focusOnTextField
57+ ) ) )
5758 }
5859 }
5960 return . run { send in
6061 await send ( . createPromptToCode( s, sendImmediately: false ) )
6162 }
6263 case let . createPromptToCode( newPromptToCode, sendImmediately) :
6364 // insert at 0 so it has high priority then the other detached prompt to codes
64- state. promptToCodes. insert ( newPromptToCode, at : 0 )
65+ state. promptToCodes. append ( newPromptToCode)
6566 return . run { send in
6667 if sendImmediately,
6768 !newPromptToCode. contextInputController. instruction. string. isEmpty
6869 {
69- await send ( . promptToCode( newPromptToCode. id, . modifyCodeButtonTapped) )
70+ await send ( . promptToCode( . element(
71+ id: newPromptToCode. id,
72+ action: . modifyCodeButtonTapped
73+ ) ) )
7074 }
7175 } . cancellable (
7276 id: PromptToCodePanel . CancellationKey. modifyCode ( newPromptToCode. id) ,
@@ -94,6 +98,37 @@ public struct PromptToCodeGroup {
9498 }
9599 return . none
96100
101+ case let . tabClicked( id) :
102+ state. selectedTabId = id
103+ return . none
104+
105+ case let . closeTabButtonClicked( id) :
106+ return . run { send in
107+ await send ( . promptToCode( . element(
108+ id: id,
109+ action: . cancelButtonTapped
110+ ) ) )
111+ }
112+
113+ case . switchToNextTab:
114+ if let selectedTabId = state. selectedTabId,
115+ let index = state. promptToCodes. index ( id: selectedTabId)
116+ {
117+ let nextIndex = ( index + 1 ) % state. promptToCodes. count
118+ state. selectedTabId = state. promptToCodes [ nextIndex] . id
119+ }
120+ return . none
121+
122+ case . switchToPreviousTab:
123+ if let selectedTabId = state. selectedTabId,
124+ let index = state. promptToCodes. index ( id: selectedTabId)
125+ {
126+ let previousIndex = ( index - 1 + state. promptToCodes. count) % state
127+ . promptToCodes. count
128+ state. selectedTabId = state. promptToCodes [ previousIndex] . id
129+ }
130+ return . none
131+
97132 case . promptToCode:
98133 return . none
99134
@@ -104,22 +139,28 @@ public struct PromptToCodeGroup {
104139 . ifLet ( \. activePromptToCode, action: \. activePromptToCode) {
105140 PromptToCodePanel ( )
106141 }
107- . forEach ( \. promptToCodes, action: / Action . promptToCode, element: {
142+ . forEach ( \. promptToCodes, action: \ . promptToCode, element: {
108143 PromptToCodePanel ( )
109144 } )
110145
111146 Reduce { state, action in
112147 switch action {
113- case let . promptToCode( id, . cancelButtonTapped) :
148+ case let . promptToCode( . element ( id, . cancelButtonTapped) ) :
114149 state. promptToCodes. remove ( id: id)
150+ let isEmpty = state. promptToCodes. isEmpty
115151 return . run { _ in
116- activatePreviousActiveXcode ( )
152+ if isEmpty {
153+ activatePreviousActiveXcode ( )
154+ }
117155 }
118156 case . activePromptToCode( . cancelButtonTapped) :
119- guard let id = state. activePromptToCode ? . id else { return . none }
157+ guard let id = state. selectedTabId else { return . none }
120158 state. promptToCodes. remove ( id: id)
159+ let isEmpty = state. promptToCodes. isEmpty
121160 return . run { _ in
122- activatePreviousActiveXcode ( )
161+ if isEmpty {
162+ activatePreviousActiveXcode ( )
163+ }
123164 }
124165 default : return . none
125166 }
0 commit comments