diff --git a/.idea/material_theme_project_new.xml b/.idea/material_theme_project_new.xml index 766912b..2abc67e 100644 --- a/.idea/material_theme_project_new.xml +++ b/.idea/material_theme_project_new.xml @@ -3,7 +3,10 @@ diff --git a/src/features/writing/components/WritingChecker.tsx b/src/features/writing/components/WritingChecker.tsx index e03a846..7028939 100644 --- a/src/features/writing/components/WritingChecker.tsx +++ b/src/features/writing/components/WritingChecker.tsx @@ -17,7 +17,7 @@ export function WritingChecker() { const [improvedExpanded, setImprovedExpanded] = useState(false) const [remaining, setRemaining] = useState(getRemainingChecks) - const { mutate: checkWriting, isPending, isError, error, data: feedback } = useWritingCheck() + const { mutate: checkWriting, isPending, isError, error, data: feedback, reset: resetMutation } = useWritingCheck() const { requireAuth } = useRequireAuth() const user = useAuthStore((s) => s.user) const { mutate: awardActivity } = useAwardActivity() @@ -28,12 +28,13 @@ export function WritingChecker() { useEffect(() => { if (!user) { setRemaining(getRemainingChecks()) + resetMutation() return } countTodayWritingSubmissions(user.id).then((used) => { setRemaining(AUTH_LIMIT - used) }) - }, [user]) + }, [user, resetMutation]) const charCount = text.length const canSubmit = text.trim().length > 0 && remaining > 0 && charCount <= MAX_CHARS && !isPending diff --git a/src/hooks/use-writing-check.ts b/src/hooks/use-writing-check.ts index 8a60946..a03b5c8 100644 --- a/src/hooks/use-writing-check.ts +++ b/src/hooks/use-writing-check.ts @@ -13,7 +13,18 @@ async function callEdgeFunction(content: string): Promise { body: { content }, }) - if (error) throw new Error(error.message ?? "Đã có lỗi khi chấm bài. Vui lòng thử lại.") + if (error) { + // The Supabase SDK wraps non-2xx responses in a generic FunctionsHttpError. + // Try to parse the actual error body returned by the edge function. + try { + const body = await (error as unknown as { context: Response }).context.json() + if (body?.error) throw new Error(body.error) + } catch { + // ignore parse failure, fall through to generic message + } + throw new Error("Đã có lỗi khi chấm bài. Vui lòng thử lại.") + } + if (!data) throw new Error("Phản hồi từ AI không hợp lệ. Vui lòng thử lại.") return data