22
33import { useState , useEffect } from "react" ;
44import { useParams } from "next/navigation" ;
5- import { ArrowLeft , Github , Clock , CheckCircle , XCircle , AlertCircle , GitCommit , FileText , ExternalLink , MessageSquare , Plus , Copy } from "lucide-react" ;
5+ import { ArrowLeft , Github , Clock , CheckCircle , XCircle , AlertCircle , GitCommit , FileText , ExternalLink , MessageSquare , Plus , Copy , Loader2 } from "lucide-react" ;
66import Link from "next/link" ;
77import { Button } from "@/components/ui/button" ;
88import { Input } from "@/components/ui/input" ;
@@ -16,6 +16,7 @@ import { ApiService } from "@/lib/api-service";
1616import { Task , Project , ChatMessage } from "@/types" ;
1717import { formatDiff , parseDiffStats } from "@/lib/utils" ;
1818import { DiffViewer } from "@/components/diff-viewer" ;
19+ import { toast } from "sonner" ;
1920
2021interface TaskWithProject extends Task {
2122 project ?: Project
@@ -32,6 +33,7 @@ export default function TaskDetailPage() {
3233 const [ diffStats , setDiffStats ] = useState ( { additions : 0 , deletions : 0 , files : 0 } ) ;
3334 const [ newMessage , setNewMessage ] = useState ( "" ) ;
3435 const [ githubToken , setGithubToken ] = useState ( "" ) ;
36+ const [ creatingPR , setCreatingPR ] = useState ( false ) ;
3537
3638 useEffect ( ( ) => {
3739 if ( typeof window !== 'undefined' ) {
@@ -111,30 +113,44 @@ export default function TaskDetailPage() {
111113 content : newMessage . trim ( )
112114 } ) ;
113115 setNewMessage ( "" ) ;
116+ toast . success ( "Message added successfully" ) ;
114117 loadTask ( ) ; // Reload to get updated messages
115118 } catch ( error ) {
116119 console . error ( 'Error adding message:' , error ) ;
117- alert ( 'Error adding message') ;
120+ toast . error ( 'Failed to add message') ;
118121 }
119122 } ;
120123
121124 const handleCreatePR = async ( ) => {
122125 if ( ! task || task . status !== "completed" || ! user ?. id ) return ;
123126
127+ setCreatingPR ( true ) ;
128+
124129 try {
125130 const prompt = ( task . chat_messages as unknown as ChatMessage [ ] ) ?. [ 0 ] ?. content || '' ;
126131 const modelName = task . agent === 'codex' ? 'Codex' : 'Claude Code' ;
127132
133+ toast . loading ( "Creating pull request..." ) ;
134+
128135 const response = await ApiService . createPullRequest ( user . id , task . id , {
129136 title : `${ modelName } : ${ prompt . substring ( 0 , 50 ) } ...` ,
130137 body : `Automated changes generated by ${ modelName } .\n\nPrompt: ${ prompt } ` ,
131138 github_token : githubToken
132139 } ) ;
133140
134- alert ( `Pull request created successfully! #${ response . pr_number } ` ) ;
141+ toast . dismiss ( ) ;
142+ toast . success ( `Pull request #${ response . pr_number } created successfully!` ) ;
143+
144+ // Refresh task data to show the new PR info
145+ await loadTask ( ) ;
146+
147+ // Open the PR in a new tab
135148 window . open ( response . pr_url , '_blank' ) ;
136149 } catch ( error ) {
137- alert ( `Error creating PR: ${ error } ` ) ;
150+ toast . dismiss ( ) ;
151+ toast . error ( `Failed to create PR: ${ error } ` ) ;
152+ } finally {
153+ setCreatingPR ( false ) ;
138154 }
139155 } ;
140156
@@ -216,10 +232,23 @@ export default function TaskDetailPage() {
216232 </ div >
217233 </ div >
218234 { task . status === "completed" && (
219- < Button onClick = { handleCreatePR } className = "gap-2" >
220- < ExternalLink className = "w-4 h-4" />
221- Create PR
222- </ Button >
235+ task . pr_url ? (
236+ < Button asChild variant = "outline" className = "gap-2" >
237+ < a href = { task . pr_url } target = "_blank" rel = "noopener noreferrer" >
238+ < ExternalLink className = "w-4 h-4" />
239+ View PR #{ task . pr_number }
240+ </ a >
241+ </ Button >
242+ ) : (
243+ < Button onClick = { handleCreatePR } disabled = { creatingPR } className = "gap-2" >
244+ { creatingPR ? (
245+ < Loader2 className = "w-4 h-4 animate-spin" />
246+ ) : (
247+ < ExternalLink className = "w-4 h-4" />
248+ ) }
249+ { creatingPR ? "Creating PR..." : "Create PR" }
250+ </ Button >
251+ )
223252 ) }
224253 </ div >
225254 </ div >
0 commit comments