feat: 媒体库 blob 去重存储与品牌/注册等前端调整
新增: - blob_store 二进制去重存储 + blob_dedup 测试 其它: - 后端 settings/auth/media_library/upload/operations 服务与 handler 调整 - 前端品牌(BrandLockup/BrandCropModal/BrandSeoPanel)、注册、媒体库、分析详情页、Header/SiteChrome 等更新
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
"use client";
|
||||
|
||||
import { useState, useEffect } from "react";
|
||||
import { useState, useEffect, useRef } from "react";
|
||||
import { useRouter } from "next/navigation";
|
||||
import Link from "next/link";
|
||||
import { UserPlus } from "lucide-react";
|
||||
@@ -44,8 +44,33 @@ export default function RegisterClient({
|
||||
const [notice, setNotice] = useState(registerNotice);
|
||||
const [sending, setSending] = useState(false);
|
||||
const [sentMessage, setSentMessage] = useState("");
|
||||
// 重发倒计时(秒);>0 期间按钮锁定不可点
|
||||
const [countdown, setCountdown] = useState(0);
|
||||
const countdownTimer = useRef<ReturnType<typeof setInterval> | null>(null);
|
||||
const verifyEmail = initialVerifyEmail;
|
||||
|
||||
// 卸载时清理倒计时,避免泄漏
|
||||
useEffect(() => {
|
||||
return () => {
|
||||
if (countdownTimer.current) clearInterval(countdownTimer.current);
|
||||
};
|
||||
}, []);
|
||||
|
||||
const startCountdown = () => {
|
||||
if (countdownTimer.current) clearInterval(countdownTimer.current);
|
||||
setCountdown(60);
|
||||
countdownTimer.current = setInterval(() => {
|
||||
setCountdown((c) => {
|
||||
if (c <= 1) {
|
||||
if (countdownTimer.current) clearInterval(countdownTimer.current);
|
||||
countdownTimer.current = null;
|
||||
return 0;
|
||||
}
|
||||
return c - 1;
|
||||
});
|
||||
}, 1000);
|
||||
};
|
||||
|
||||
// 已登录用户不必再注册,直接回首页
|
||||
useEffect(() => {
|
||||
if (!hasAuthCookieHint()) return;
|
||||
@@ -166,8 +191,9 @@ export default function RegisterClient({
|
||||
<button
|
||||
type="button"
|
||||
className="btn btn-line shrink-0"
|
||||
disabled={sending || !email}
|
||||
disabled={sending || countdown > 0 || !email}
|
||||
onClick={async () => {
|
||||
// 点击即锁定,防止重复发送
|
||||
setSending(true);
|
||||
setError("");
|
||||
try {
|
||||
@@ -176,6 +202,7 @@ export default function RegisterClient({
|
||||
purpose: "register",
|
||||
});
|
||||
setSentMessage(r.message);
|
||||
startCountdown();
|
||||
} catch (err) {
|
||||
setError((err as Error).message);
|
||||
} finally {
|
||||
@@ -183,7 +210,11 @@ export default function RegisterClient({
|
||||
}
|
||||
}}
|
||||
>
|
||||
{sending ? "正在排队…" : "发送验证码"}
|
||||
{sending
|
||||
? "正在排队…"
|
||||
: countdown > 0
|
||||
? `${countdown}s 后可重发`
|
||||
: "发送验证码"}
|
||||
</button>
|
||||
</div>
|
||||
{sentMessage && (
|
||||
|
||||
Reference in New Issue
Block a user