Skip to content

Commit 5b48a92

Browse files
committed
Link deployments to preview url; add a more button with view deployment
1 parent 79185c1 commit 5b48a92

File tree

2 files changed

+58
-17
lines changed

2 files changed

+58
-17
lines changed

app/api/tasks/[taskId]/deployment/route.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{
5050
data: {
5151
hasDeployment: true,
5252
previewUrl,
53+
deploymentUrl: task.previewUrl.includes('vercel.live/open-feedback/')
54+
? task.previewUrl
55+
: `https://vercel.com/${previewUrl.split('://')[1]}`,
5356
cached: true,
5457
},
5558
})
@@ -187,11 +190,15 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{
187190
// Store the preview URL in the database
188191
await db.update(tasks).set({ previewUrl }).where(eq(tasks.id, taskId))
189192

193+
// Get the deployment page URL from details_url if available
194+
const deploymentUrl = vercelDeploymentCheck?.details_url || vercelPreviewCheck?.details_url || undefined
195+
190196
return NextResponse.json({
191197
success: true,
192198
data: {
193199
hasDeployment: true,
194200
previewUrl,
201+
deploymentUrl,
195202
checkId: vercelDeploymentCheck?.id || vercelPreviewCheck?.id,
196203
createdAt: vercelDeploymentCheck?.completed_at || vercelPreviewCheck?.completed_at,
197204
},
@@ -234,6 +241,8 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{
234241
if (status.state === 'success') {
235242
let previewUrl = status.environment_url || status.target_url
236243
if (previewUrl) {
244+
// Store original URL for deployment page link
245+
const deploymentUrl = previewUrl
237246
// Convert feedback URL to actual deployment URL if needed
238247
previewUrl = convertFeedbackUrlToDeploymentUrl(previewUrl)
239248
// Store the preview URL in the database
@@ -244,6 +253,7 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{
244253
data: {
245254
hasDeployment: true,
246255
previewUrl,
256+
deploymentUrl,
247257
deploymentId: deployment.id,
248258
createdAt: deployment.created_at,
249259
},
@@ -275,6 +285,8 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{
275285
)
276286

277287
if (vercelStatus && vercelStatus.target_url) {
288+
// Store original URL for deployment page link
289+
const deploymentUrl = vercelStatus.target_url
278290
// Convert feedback URL to actual deployment URL if needed
279291
const previewUrl = convertFeedbackUrlToDeploymentUrl(vercelStatus.target_url)
280292
// Store the preview URL in the database
@@ -285,6 +297,7 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{
285297
data: {
286298
hasDeployment: true,
287299
previewUrl,
300+
deploymentUrl,
288301
createdAt: vercelStatus.created_at,
289302
},
290303
})

components/task-chat.tsx

Lines changed: 45 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ interface CheckRun {
5454
interface DeploymentInfo {
5555
hasDeployment: boolean
5656
previewUrl?: string
57+
deploymentUrl?: string
5758
message?: string
5859
createdAt?: string
5960
}
@@ -646,24 +647,51 @@ export function TaskChat({ taskId, task }: TaskChatProps) {
646647
</div>
647648
) : (
648649
<div className="space-y-2 px-2">
649-
<a
650-
href={deployment.previewUrl}
651-
target="_blank"
652-
rel="noopener noreferrer"
653-
className="flex items-center gap-3 p-2 rounded-md hover:bg-muted/50 transition-colors"
654-
>
655-
<svg className="w-4 h-4 flex-shrink-0" viewBox="0 0 76 65" fill="currentColor">
656-
<path d="M37.5274 0L75.0548 65H0L37.5274 0Z" />
657-
</svg>
658-
<div className="flex-1 min-w-0">
659-
<div className="text-xs font-medium truncate">Vercel Preview</div>
660-
<div className="text-xs text-muted-foreground">
661-
{deployment.createdAt
662-
? `Deployed ${new Date(deployment.createdAt).toLocaleString()}`
663-
: 'Preview deployment'}
650+
<div className="flex items-center gap-2 p-2 rounded-md hover:bg-muted/50 transition-colors group">
651+
<a
652+
href={deployment.previewUrl}
653+
target="_blank"
654+
rel="noopener noreferrer"
655+
className="flex items-center gap-3 flex-1 min-w-0"
656+
>
657+
<svg className="w-4 h-4 flex-shrink-0" viewBox="0 0 76 65" fill="currentColor">
658+
<path d="M37.5274 0L75.0548 65H0L37.5274 0Z" />
659+
</svg>
660+
<div className="flex-1 min-w-0">
661+
<div className="text-xs font-medium truncate">Vercel Preview</div>
662+
<div className="text-xs text-muted-foreground">
663+
{deployment.createdAt
664+
? `Deployed ${new Date(deployment.createdAt).toLocaleString()}`
665+
: 'Preview deployment'}
666+
</div>
664667
</div>
665-
</div>
666-
</a>
668+
</a>
669+
{deployment.deploymentUrl && (
670+
<DropdownMenu>
671+
<DropdownMenuTrigger asChild>
672+
<Button
673+
variant="ghost"
674+
size="sm"
675+
className="h-8 w-8 p-0 opacity-0 group-hover:opacity-100 transition-opacity"
676+
>
677+
<MoreVertical className="h-4 w-4" />
678+
</Button>
679+
</DropdownMenuTrigger>
680+
<DropdownMenuContent align="end">
681+
<DropdownMenuItem asChild>
682+
<a
683+
href={deployment.deploymentUrl}
684+
target="_blank"
685+
rel="noopener noreferrer"
686+
className="cursor-pointer"
687+
>
688+
View Deployment
689+
</a>
690+
</DropdownMenuItem>
691+
</DropdownMenuContent>
692+
</DropdownMenu>
693+
)}
694+
</div>
667695
</div>
668696
)}
669697
</div>

0 commit comments

Comments
 (0)