60 lines
1.3 KiB
TypeScript
60 lines
1.3 KiB
TypeScript
"use client";
|
|
/**
|
|
* 通用返回按钮
|
|
*
|
|
* 原始 Dart: lib/ui/auth/widgets/back_button.dart(被 auth/chat/sidebar 共用)。
|
|
*/
|
|
import { useRouter } from "next/navigation";
|
|
import { type MouseEvent } from "react";
|
|
|
|
import styles from "./auth-back-button.module.css";
|
|
|
|
export interface AuthBackButtonProps {
|
|
/** 自定义跳转目标(默认 history.back)。 */
|
|
href?: string;
|
|
/** 自定义点击处理(覆盖默认跳转)。 */
|
|
onClick?: (e: MouseEvent<HTMLButtonElement>) => void;
|
|
className?: string;
|
|
ariaLabel?: string;
|
|
}
|
|
|
|
export function AuthBackButton({
|
|
href,
|
|
onClick,
|
|
className,
|
|
ariaLabel = "Back",
|
|
}: AuthBackButtonProps) {
|
|
const router = useRouter();
|
|
return (
|
|
<button
|
|
type="button"
|
|
aria-label={ariaLabel}
|
|
className={[styles.button, className].filter(Boolean).join(" ")}
|
|
onClick={(e) => {
|
|
if (onClick) {
|
|
onClick(e);
|
|
return;
|
|
}
|
|
if (href) router.push(href);
|
|
else router.back();
|
|
}}
|
|
>
|
|
<svg
|
|
width="20"
|
|
height="20"
|
|
viewBox="0 0 24 24"
|
|
fill="none"
|
|
aria-hidden="true"
|
|
>
|
|
<path
|
|
d="M15 18l-6-6 6-6"
|
|
stroke="currentColor"
|
|
strokeWidth="2"
|
|
strokeLinecap="round"
|
|
strokeLinejoin="round"
|
|
/>
|
|
</svg>
|
|
</button>
|
|
);
|
|
}
|