Files
wr.do/app/layout.tsx
weiruchenai1 509ad15652 feat: 实现分层存储配额管理和UI优化
🆕 新增功能:
- 添加存储桶容量限制配置功能,支持按存储桶设置最大容量
- 新增存储桶使用情况API端点 (/api/storage/bucket-usage)
- 实现Plan配额和存储桶配额的分层显示

🎨 界面优化:
- 存储使用情况面板支持双层配额显示
- 上传错误提示改为右对齐显示
- Toast通知位置改为右下角
- 为存储桶配置添加帮助提示

🔧 功能改进:
- 优化上传前容量检查逻辑
- 改进错误信息显示,使用中文提示
- 智能显示更严格的配额限制
- 完善国际化支持

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-22 12:47:23 +08:00

58 lines
1.9 KiB
TypeScript

import "@/styles/globals.css";
import { fontHeading, fontSans, fontSatoshi } from "@/assets/fonts";
import { SessionProvider } from "next-auth/react";
import { NextIntlClientProvider } from "next-intl";
import { getLocale, getMessages } from "next-intl/server";
import { ThemeProvider } from "next-themes";
import { ViewTransitions } from "next-view-transitions";
import { cn, constructMetadata } from "@/lib/utils";
import { Toaster } from "@/components/ui/sonner";
import ModalProvider from "@/components/modals/providers";
import GoogleAnalytics from "@/components/shared/GoogleAnalytics";
import UmamiAnalytics from "@/components/shared/UmamiAnalytics";
import { TailwindIndicator } from "@/components/tailwind-indicator";
interface RootLayoutProps {
children: React.ReactNode;
}
export const metadata = constructMetadata();
export default async function RootLayout({ children }: RootLayoutProps) {
const locale = await getLocale();
const messages = await getMessages();
return (
<ViewTransitions>
<html lang={locale} suppressHydrationWarning>
<body
className={cn(
"min-h-screen bg-background font-sans antialiased",
fontSans.variable,
fontHeading.variable,
fontSatoshi.variable,
)}
>
<NextIntlClientProvider messages={messages}>
<SessionProvider>
<ThemeProvider
attribute="class"
defaultTheme="light"
enableSystem
disableTransitionOnChange
>
<ModalProvider>{children}</ModalProvider>
<Toaster richColors closeButton position="bottom-right" />
<TailwindIndicator />
</ThemeProvider>
</SessionProvider>
</NextIntlClientProvider>
<GoogleAnalytics />
<UmamiAnalytics />
</body>
</html>
</ViewTransitions>
);
}