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