mirror of
https://github.com/DayuanJiang/next-ai-draw-io.git
synced 2026-01-08 01:02:29 +08:00
* feat: add URL content extraction for AI diagram generation * Changes made as recommended by Claude: 1. Added a request timeout to prevent server resources from being tied up (route.ts) 2. Implemented runtime validation for the API response shape (url-utils.ts) 3. Removed hardcoded English error messages and replaced them with localized strings (url-input-dialog.tsx) 4. Fixed the incorrect i18n namespace (changed from pdf.* to url.*) (url-input-dialog.tsx and en/ja/zh.json) * chore: restore package.json and package-lock.json * fix: use i18n strings for URL dialog error messages --------- Co-authored-by: dayuan.jiang <jdy.toh@gmail.com>
50 lines
1.3 KiB
TypeScript
50 lines
1.3 KiB
TypeScript
import { z } from "zod"
|
|
|
|
export interface UrlData {
|
|
url: string
|
|
title: string
|
|
content: string
|
|
charCount: number
|
|
isExtracting: boolean
|
|
}
|
|
|
|
const UrlResponseSchema = z.object({
|
|
title: z.string().default("Untitled"),
|
|
content: z.string(),
|
|
charCount: z.number().int().nonnegative(),
|
|
})
|
|
|
|
export async function extractUrlContent(url: string): Promise<UrlData> {
|
|
const response = await fetch("/api/parse-url", {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify({ url }),
|
|
})
|
|
|
|
// Try to parse JSON once
|
|
const raw = await response
|
|
.json()
|
|
.catch(() => ({ error: "Unexpected non-JSON response" }))
|
|
|
|
if (!response.ok) {
|
|
const message =
|
|
typeof raw === "object" && raw && "error" in raw
|
|
? String((raw as any).error)
|
|
: "Failed to extract URL content"
|
|
throw new Error(message)
|
|
}
|
|
|
|
const parsed = UrlResponseSchema.safeParse(raw)
|
|
if (!parsed.success) {
|
|
throw new Error("Malformed response from URL extraction API")
|
|
}
|
|
|
|
return {
|
|
url,
|
|
title: parsed.data.title,
|
|
content: parsed.data.content,
|
|
charCount: parsed.data.charCount,
|
|
isExtracting: false,
|
|
}
|
|
}
|