From f83c96bb7737489a3f646c466f2a927f04eec3bd Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 30 Jul 2026 07:27:08 +0800 Subject: [PATCH 01/17] =?UTF-8?q?refactor(BindContactModal):=20=E6=8A=BD?= =?UTF-8?q?=E5=8F=96=20useCountdown=20hook?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BindContactModal/hooks/useCountdown.ts | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 apps/web/src/components/auth/BindContactModal/hooks/useCountdown.ts diff --git a/apps/web/src/components/auth/BindContactModal/hooks/useCountdown.ts b/apps/web/src/components/auth/BindContactModal/hooks/useCountdown.ts new file mode 100644 index 000000000..e21c96f35 --- /dev/null +++ b/apps/web/src/components/auth/BindContactModal/hooks/useCountdown.ts @@ -0,0 +1,40 @@ +import { useState, useEffect, useRef, useCallback } from "react" + +/** + * 倒计时 Hook + * 用于验证码发送等场景的倒计时控制 + */ +export const useCountdown = (initialSeconds = 60) => { + const [countdown, setCountdown] = useState(0) + const timerRef = useRef | null>(null) + + useEffect(() => { + if (countdown > 0) { + timerRef.current = setInterval(() => { + setCountdown((prev) => prev - 1) + }, 1000) + } else if (timerRef.current) { + clearInterval(timerRef.current) + timerRef.current = null + } + return () => { + if (timerRef.current) clearInterval(timerRef.current) + } + }, [countdown]) + + const start = useCallback(() => { + setCountdown(initialSeconds) + }, [initialSeconds]) + + const reset = useCallback(() => { + setCountdown(0) + }, []) + + return { + countdown, + isRunning: countdown > 0, + start, + reset, + } +} + -- 2.54.0 From ad902105f561aad5f921744a65c12f2ba8ac70c1 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 30 Jul 2026 07:27:27 +0800 Subject: [PATCH 02/17] =?UTF-8?q?refactor(BindContactModal):=20=E6=8A=BD?= =?UTF-8?q?=E5=8F=96=20useBindContactForm=20hook?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hooks/useBindContactForm.ts | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 apps/web/src/components/auth/BindContactModal/hooks/useBindContactForm.ts diff --git a/apps/web/src/components/auth/BindContactModal/hooks/useBindContactForm.ts b/apps/web/src/components/auth/BindContactModal/hooks/useBindContactForm.ts new file mode 100644 index 000000000..3ffa5e6c2 --- /dev/null +++ b/apps/web/src/components/auth/BindContactModal/hooks/useBindContactForm.ts @@ -0,0 +1,90 @@ +import { useState, useEffect } from "react" +import { Form, message } from "antd" +import { sendVerificationCode, bindContact, type BindContactResponse } from "@/api/auth" +import { useCountdown } from "./useCountdown" + +type ContactType = "email" | "phone" + +interface UseBindContactFormOptions { + open: boolean + onSuccess?: (user: BindContactResponse["user"]) => void + onCancel?: () => void +} + +/** + * 绑定联系方式表单 Hook + * 封装表单状态、验证码发送、提交绑定等业务逻辑 + */ +export const useBindContactForm = ({ open, onSuccess, onCancel }: UseBindContactFormOptions) => { + const [activeTab, setActiveTab] = useState("email") + const [form] = Form.useForm() + const [loading, setLoading] = useState(false) + const [codeLoading, setCodeLoading] = useState(false) + const { countdown, isRunning, start: startCountdown, reset: resetCountdown } = useCountdown(60) + + /* ── 打开时重置表单 ── */ + useEffect(() => { + if (open) { + form.resetFields() + resetCountdown() + } + }, [open, form, resetCountdown]) + + /* ── 发送验证码 ── */ + const handleSendCode = async () => { + try { + const value = form.getFieldValue(activeTab === "email" ? "email" : "phone") + if (!value) { + message.warning(activeTab === "email" ? "请输入邮箱" : "请输入手机号") + return + } + setCodeLoading(true) + await sendVerificationCode({ + target: activeTab, + value, + purpose: "bind", + }) + message.success("验证码已发送") + startCountdown() + } catch { + // error handled by interceptor + } finally { + setCodeLoading(false) + } + } + + /* ── 提交绑定 ── */ + const handleSubmit = async () => { + try { + const values = await form.validateFields() + setLoading(true) + + const payload = + activeTab === "email" + ? { email: values.email, email_code: values.code } + : { phone: values.phone, phone_code: values.code } + + const result = await bindContact(payload) + + message.success("绑定成功") + onSuccess?.(result.user) + } catch { + // error handled by interceptor + } finally { + setLoading(false) + } + } + + return { + activeTab, + setActiveTab, + form, + loading, + codeLoading, + countdown, + codeDisabled: isRunning, + handleSendCode, + handleSubmit, + } +} + -- 2.54.0 From 61117e50bc2e649d471879e32e27ec28cc8ddcc5 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 30 Jul 2026 07:42:24 +0800 Subject: [PATCH 03/17] =?UTF-8?q?refactor(BindContactModal):=20=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E5=8C=96=E6=8B=86=E5=88=86=20-=20=E6=8F=90=E5=8F=96?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/auth/BindContactModal/types.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 apps/web/src/components/auth/BindContactModal/types.ts diff --git a/apps/web/src/components/auth/BindContactModal/types.ts b/apps/web/src/components/auth/BindContactModal/types.ts new file mode 100644 index 000000000..569bbb69a --- /dev/null +++ b/apps/web/src/components/auth/BindContactModal/types.ts @@ -0,0 +1,14 @@ +import type { BindContactResponse } from "@/api/auth" + +/** BindContactModal 组件属性 */ +export interface BindContactModalProps { + /** 是否打开 */ + open: boolean + /** 绑定成功回调 */ + onSuccess?: (user: BindContactResponse["user"]) => void + /** 取消回调 */ + onCancel?: () => void +} + +/** 联系方式类型 */ +export type ContactType = "email" | "phone" -- 2.54.0 From 0fc133798b4199957425d30b9bf0d4bc10996333 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 30 Jul 2026 07:42:36 +0800 Subject: [PATCH 04/17] =?UTF-8?q?refactor(BindContactModal):=20=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E5=8C=96=E6=8B=86=E5=88=86=20-=20=E4=B8=BB=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E4=BD=BF=E7=94=A8useBindContactForm=20Hook?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/BindContactModal/index.tsx | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 apps/web/src/components/auth/BindContactModal/index.tsx diff --git a/apps/web/src/components/auth/BindContactModal/index.tsx b/apps/web/src/components/auth/BindContactModal/index.tsx new file mode 100644 index 000000000..ba58a302a --- /dev/null +++ b/apps/web/src/components/auth/BindContactModal/index.tsx @@ -0,0 +1,119 @@ +import React from "react" +import { Modal, Tabs, Form, Input, Button } from "antd" +import { useBindContactForm } from "./hooks/useBindContactForm" +import type { BindContactModalProps } from "./types" + +const BindContactModal: React.FC = ({ open, onSuccess, onCancel }) => { + const { + activeTab, + setActiveTab, + form, + loading, + codeLoading, + countdown, + codeDisabled, + handleSendCode, + handleSubmit, + } = useBindContactForm({ open, onSuccess, onCancel }) + + return ( + +

为了保障账号安全,请绑定您的邮箱或手机号

+ + setActiveTab(key as "email" | "phone")} + items={[ + { + key: "email", + label: "邮箱绑定", + children: ( +
+ + + + +
+ + +
+
+
+ ), + }, + { + key: "phone", + label: "手机绑定", + children: ( +
+ + + + +
+ + +
+
+
+ ), + }, + ]} + /> + +
+ +
+
+ ) +} + +export default BindContactModal +export type { BindContactModalProps } from "./types" +export { useBindContactForm } from "./hooks/useBindContactForm" +export { useCountdown } from "./hooks/useCountdown" -- 2.54.0 From f021ff2a746b6d8c8f6f71f62dd40510c7e485bd Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 30 Jul 2026 07:42:46 +0800 Subject: [PATCH 05/17] =?UTF-8?q?refactor(BindContactModal):=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=97=A7=E7=9A=84=E5=8D=95=E6=96=87=E4=BB=B6=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=EF=BC=88=E5=B7=B2=E7=9B=AE=E5=BD=95=E5=8C=96=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/auth/BindContactModal.tsx | 180 ------------------ 1 file changed, 180 deletions(-) delete mode 100644 apps/web/src/components/auth/BindContactModal.tsx diff --git a/apps/web/src/components/auth/BindContactModal.tsx b/apps/web/src/components/auth/BindContactModal.tsx deleted file mode 100644 index c600657de..000000000 --- a/apps/web/src/components/auth/BindContactModal.tsx +++ /dev/null @@ -1,180 +0,0 @@ -import React, { useState, useEffect, useRef } from "react" -import { Modal, Tabs, Form, Input, Button, message } from "antd" -import { sendVerificationCode, bindContact, type BindContactResponse } from "@/api/auth" - -interface BindContactModalProps { - open: boolean - onSuccess?: (user: BindContactResponse["user"]) => void - onCancel?: () => void -} - -const BindContactModal: React.FC = ({ open, onSuccess, onCancel }) => { - const [activeTab, setActiveTab] = useState<"email" | "phone">("email") - const [form] = Form.useForm() - const [loading, setLoading] = useState(false) - const [codeLoading, setCodeLoading] = useState(false) - const [countdown, setCountdown] = useState(0) - const timerRef = useRef | null>(null) - - useEffect(() => { - if (countdown > 0) { - timerRef.current = setInterval(() => { - setCountdown((prev) => prev - 1) - }, 1000) - } else if (timerRef.current) { - clearInterval(timerRef.current) - timerRef.current = null - } - return () => { - if (timerRef.current) clearInterval(timerRef.current) - } - }, [countdown]) - - useEffect(() => { - if (open) { - form.resetFields() - setCountdown(0) - } - }, [open, form]) - - const handleSendCode = async () => { - try { - const value = form.getFieldValue(activeTab === "email" ? "email" : "phone") - if (!value) { - message.warning(activeTab === "email" ? "请输入邮箱" : "请输入手机号") - return - } - setCodeLoading(true) - await sendVerificationCode({ - target: activeTab, - value, - purpose: "bind", - }) - message.success("验证码已发送") - setCountdown(60) - } catch (error) { - // error handled by interceptor - } finally { - setCodeLoading(false) - } - } - - const handleSubmit = async () => { - try { - const values = await form.validateFields() - setLoading(true) - - const payload = - activeTab === "email" - ? { email: values.email, email_code: values.code } - : { phone: values.phone, phone_code: values.code } - - const result = await bindContact(payload) - - message.success("绑定成功") - onSuccess?.(result.user) - } catch (error) { - // error handled by interceptor - } finally { - setLoading(false) - } - } - - return ( - -

为了保障账号安全,请绑定您的邮箱或手机号

- - setActiveTab(key as "email" | "phone")} - items={[ - { - key: "email", - label: "邮箱绑定", - children: ( -
- - - - -
- - -
-
-
- ), - }, - { - key: "phone", - label: "手机绑定", - children: ( -
- - - - -
- - -
-
-
- ), - }, - ]} - /> - -
- -
-
- ) -} - -export default BindContactModal -- 2.54.0 From af38a296c5bea0b05379927cd174126889b362f7 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 30 Jul 2026 07:43:14 +0800 Subject: [PATCH 06/17] =?UTF-8?q?test(BindContactModal):=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=A8=A1=E5=9D=97=E5=AF=BC=E5=85=A5smoke=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/auth/BindContactModal.test.tsx | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 apps/web/src/test/components/auth/BindContactModal.test.tsx diff --git a/apps/web/src/test/components/auth/BindContactModal.test.tsx b/apps/web/src/test/components/auth/BindContactModal.test.tsx new file mode 100644 index 000000000..eeb201d0a --- /dev/null +++ b/apps/web/src/test/components/auth/BindContactModal.test.tsx @@ -0,0 +1,24 @@ +import { describe, expect, it } from "vitest" +import BindContactModal from "@/components/auth/BindContactModal" +import type { BindContactModalProps, ContactType } from "@/components/auth/BindContactModal/types" +import { useBindContactForm } from "@/components/auth/BindContactModal/hooks/useBindContactForm" +import { useCountdown } from "@/components/auth/BindContactModal/hooks/useCountdown" + +describe("BindContactModal", () => { + it("主组件可正常导入", () => { + expect(BindContactModal).toBeDefined() + }) + + it("Hook 可正常导入", () => { + expect(useBindContactForm).toBeDefined() + expect(useCountdown).toBeDefined() + }) + + it("类型导出正常", () => { + const props: BindContactModalProps = { open: false } + expect(props.open).toBe(false) + + const contactType: ContactType = "email" + expect(contactType).toBe("email") + }) +}) -- 2.54.0 From 4a848247fa54478184b969cfa39e0b9f47fefe00 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 30 Jul 2026 07:58:51 +0800 Subject: [PATCH 07/17] =?UTF-8?q?fix(BindContactModal):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E8=A1=A8=E5=8D=95=E9=AA=8C=E8=AF=81=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E8=A2=AB=E9=9D=99=E9=BB=98=E5=90=9E=E6=8E=89=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BindContactModal/hooks/useBindContactForm.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/apps/web/src/components/auth/BindContactModal/hooks/useBindContactForm.ts b/apps/web/src/components/auth/BindContactModal/hooks/useBindContactForm.ts index 3ffa5e6c2..f92df6183 100644 --- a/apps/web/src/components/auth/BindContactModal/hooks/useBindContactForm.ts +++ b/apps/web/src/components/auth/BindContactModal/hooks/useBindContactForm.ts @@ -55,10 +55,17 @@ export const useBindContactForm = ({ open, onSuccess, onCancel }: UseBindContact /* ── 提交绑定 ── */ const handleSubmit = async () => { + // 1. 表单验证(失败时 Ant Design Form 会自动展示错误信息) + let values try { - const values = await form.validateFields() - setLoading(true) + values = await form.validateFields() + } catch { + return + } + // 2. 调用绑定接口 + setLoading(true) + try { const payload = activeTab === "email" ? { email: values.email, email_code: values.code } @@ -69,7 +76,7 @@ export const useBindContactForm = ({ open, onSuccess, onCancel }: UseBindContact message.success("绑定成功") onSuccess?.(result.user) } catch { - // error handled by interceptor + // API 错误由全局拦截器统一处理提示 } finally { setLoading(false) } @@ -87,4 +94,3 @@ export const useBindContactForm = ({ open, onSuccess, onCancel }: UseBindContact handleSubmit, } } - -- 2.54.0 From 21a66be8a6e185b752ce2ed980cd65a01288b21a Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 30 Jul 2026 08:15:23 +0800 Subject: [PATCH 08/17] =?UTF-8?q?fix(BindContactModal):=20=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E6=9C=AA=E4=BD=BF=E7=94=A8=E7=9A=84onCancel=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E4=BF=AE=E5=A4=8DLint=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/BindContactModal/hooks/useBindContactForm.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/components/auth/BindContactModal/hooks/useBindContactForm.ts b/apps/web/src/components/auth/BindContactModal/hooks/useBindContactForm.ts index f92df6183..5aad42154 100644 --- a/apps/web/src/components/auth/BindContactModal/hooks/useBindContactForm.ts +++ b/apps/web/src/components/auth/BindContactModal/hooks/useBindContactForm.ts @@ -15,7 +15,7 @@ interface UseBindContactFormOptions { * 绑定联系方式表单 Hook * 封装表单状态、验证码发送、提交绑定等业务逻辑 */ -export const useBindContactForm = ({ open, onSuccess, onCancel }: UseBindContactFormOptions) => { +export const useBindContactForm = ({ open, onSuccess }: UseBindContactFormOptions) => { const [activeTab, setActiveTab] = useState("email") const [form] = Form.useForm() const [loading, setLoading] = useState(false) -- 2.54.0 From b1e85b68df6ca46c89f0b8ceacbf5e56d29222b6 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 30 Jul 2026 08:23:55 +0800 Subject: [PATCH 09/17] fix: remove hook re-exports to avoid react-refresh warning --- apps/web/src/components/auth/BindContactModal/index.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/web/src/components/auth/BindContactModal/index.tsx b/apps/web/src/components/auth/BindContactModal/index.tsx index ba58a302a..8fbcd516f 100644 --- a/apps/web/src/components/auth/BindContactModal/index.tsx +++ b/apps/web/src/components/auth/BindContactModal/index.tsx @@ -114,6 +114,4 @@ const BindContactModal: React.FC = ({ open, onSuccess, on } export default BindContactModal -export type { BindContactModalProps } from "./types" -export { useBindContactForm } from "./hooks/useBindContactForm" -export { useCountdown } from "./hooks/useCountdown" +export type { BindContactModalProps } from "./types" \ No newline at end of file -- 2.54.0 From 6c5e76d32e6b430c3379446734240380cd956a38 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 30 Jul 2026 08:52:28 +0800 Subject: [PATCH 10/17] fix(BindContactModal): prettier format --- apps/web/src/components/auth/BindContactModal/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/components/auth/BindContactModal/index.tsx b/apps/web/src/components/auth/BindContactModal/index.tsx index 8fbcd516f..92b14ce7b 100644 --- a/apps/web/src/components/auth/BindContactModal/index.tsx +++ b/apps/web/src/components/auth/BindContactModal/index.tsx @@ -114,4 +114,4 @@ const BindContactModal: React.FC = ({ open, onSuccess, on } export default BindContactModal -export type { BindContactModalProps } from "./types" \ No newline at end of file +export type { BindContactModalProps } from "./types" -- 2.54.0 From 550b6cb73cdc8d5b3f1c62849bdbe763ea52f455 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 30 Jul 2026 09:27:41 +0800 Subject: [PATCH 11/17] fix: prettier format useCountdown --- .../src/components/auth/BindContactModal/hooks/useCountdown.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/web/src/components/auth/BindContactModal/hooks/useCountdown.ts b/apps/web/src/components/auth/BindContactModal/hooks/useCountdown.ts index e21c96f35..79218e366 100644 --- a/apps/web/src/components/auth/BindContactModal/hooks/useCountdown.ts +++ b/apps/web/src/components/auth/BindContactModal/hooks/useCountdown.ts @@ -36,5 +36,4 @@ export const useCountdown = (initialSeconds = 60) => { start, reset, } -} - +} \ No newline at end of file -- 2.54.0 From 5e0c2f265456483b05aa7fb35320efd215e25a55 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 30 Jul 2026 09:51:09 +0800 Subject: [PATCH 12/17] fix: rename code field to email_code/phone_code to avoid conflict --- apps/web/src/components/auth/BindContactModal/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/web/src/components/auth/BindContactModal/index.tsx b/apps/web/src/components/auth/BindContactModal/index.tsx index 92b14ce7b..2e64b4141 100644 --- a/apps/web/src/components/auth/BindContactModal/index.tsx +++ b/apps/web/src/components/auth/BindContactModal/index.tsx @@ -47,7 +47,7 @@ const BindContactModal: React.FC = ({ open, onSuccess, on @@ -82,7 +82,7 @@ const BindContactModal: React.FC = ({ open, onSuccess, on -- 2.54.0 From 2b883b5468f55f5f36871bcd62e92bc3946879c7 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 30 Jul 2026 09:51:11 +0800 Subject: [PATCH 13/17] fix: update code field names in submit logic --- .../auth/BindContactModal/hooks/useBindContactForm.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/web/src/components/auth/BindContactModal/hooks/useBindContactForm.ts b/apps/web/src/components/auth/BindContactModal/hooks/useBindContactForm.ts index 5aad42154..16ce271c3 100644 --- a/apps/web/src/components/auth/BindContactModal/hooks/useBindContactForm.ts +++ b/apps/web/src/components/auth/BindContactModal/hooks/useBindContactForm.ts @@ -33,7 +33,8 @@ export const useBindContactForm = ({ open, onSuccess }: UseBindContactFormOption /* ── 发送验证码 ── */ const handleSendCode = async () => { try { - const value = form.getFieldValue(activeTab === "email" ? "email" : "phone") + const fieldName = activeTab === "email" ? "email" : "phone" + const value = form.getFieldValue(fieldName) if (!value) { message.warning(activeTab === "email" ? "请输入邮箱" : "请输入手机号") return @@ -68,8 +69,8 @@ export const useBindContactForm = ({ open, onSuccess }: UseBindContactFormOption try { const payload = activeTab === "email" - ? { email: values.email, email_code: values.code } - : { phone: values.phone, phone_code: values.code } + ? { email: values.email, email_code: values.email_code } + : { phone: values.phone, phone_code: values.phone_code } const result = await bindContact(payload) -- 2.54.0 From 1883d9ba06d365dabec36acc6991b79b548fd52b Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 30 Jul 2026 10:20:46 +0800 Subject: [PATCH 14/17] fix: prettier formatting -- 2.54.0 From 3be0bc68a02287a64b057adfe2a31fe07f1d6f40 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 30 Jul 2026 10:20:47 +0800 Subject: [PATCH 15/17] fix: prettier formatting -- 2.54.0 From ab6a2ffb0892ca24b028efc2dbc435077ae1ee22 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 30 Jul 2026 10:20:48 +0800 Subject: [PATCH 16/17] fix: prettier formatting -- 2.54.0 From eba067088edfd1bf21b24a4611d70c32feb1bf08 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 30 Jul 2026 10:34:44 +0800 Subject: [PATCH 17/17] =?UTF-8?q?fix:=20Prettier=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/auth/BindContactModal/hooks/useCountdown.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/components/auth/BindContactModal/hooks/useCountdown.ts b/apps/web/src/components/auth/BindContactModal/hooks/useCountdown.ts index 79218e366..ffa35d5fc 100644 --- a/apps/web/src/components/auth/BindContactModal/hooks/useCountdown.ts +++ b/apps/web/src/components/auth/BindContactModal/hooks/useCountdown.ts @@ -36,4 +36,4 @@ export const useCountdown = (initialSeconds = 60) => { start, reset, } -} \ No newline at end of file +} -- 2.54.0