feat: 实现 Mini Game AI 工具平台
基于 Next.js 15、React 19 和 TypeScript 构建面向小游戏开发者的 AI 赋能工具平台。 主要功能: - 首页:包含 Hero、功能展示、优势介绍、定价和 CTA 区域 - 三大核心工具:视频转序列帧、图片压缩、音频压缩 - 响应式布局:包含顶部导航、页脚和侧边栏 - 文件上传:支持拖拽上传,使用 react-dropzone - 进度追踪:实时显示上传和处理进度 - 可配置工具:每个工具都支持自定义参数配置 - 结果预览:支持下载处理后的文件 - 4K 优化:针对大屏幕优化的响应式设计 - API 路由:文件上传和处理的模拟实现 技术栈: - Next.js 15 (App Router) - React 19 - TypeScript (严格模式) - Tailwind CSS(自定义 4K 断点) - shadcn/ui 组件库 - Framer Motion 动画 - Zustand 状态管理 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
45
src/store/authStore.ts
Normal file
45
src/store/authStore.ts
Normal file
@@ -0,0 +1,45 @@
|
||||
import { create } from "zustand";
|
||||
import { type User } from "@/types";
|
||||
|
||||
interface AuthState {
|
||||
user: User | null;
|
||||
isAuthenticated: boolean;
|
||||
isLoading: boolean;
|
||||
|
||||
// Actions
|
||||
setUser: (user: User | null) => void;
|
||||
login: (user: User) => void;
|
||||
logout: () => void;
|
||||
setLoading: (isLoading: boolean) => void;
|
||||
}
|
||||
|
||||
export const useAuthStore = create<AuthState>((set) => ({
|
||||
user: null,
|
||||
isAuthenticated: false,
|
||||
isLoading: true,
|
||||
|
||||
setUser: (user) =>
|
||||
set({
|
||||
user,
|
||||
isAuthenticated: !!user,
|
||||
}),
|
||||
|
||||
login: (user) =>
|
||||
set({
|
||||
user,
|
||||
isAuthenticated: true,
|
||||
isLoading: false,
|
||||
}),
|
||||
|
||||
logout: () =>
|
||||
set({
|
||||
user: null,
|
||||
isAuthenticated: false,
|
||||
isLoading: false,
|
||||
}),
|
||||
|
||||
setLoading: (isLoading) =>
|
||||
set({
|
||||
isLoading,
|
||||
}),
|
||||
}));
|
||||
62
src/store/uploadStore.ts
Normal file
62
src/store/uploadStore.ts
Normal file
@@ -0,0 +1,62 @@
|
||||
import { create } from "zustand";
|
||||
import { type UploadedFile, type ProcessingProgress } from "@/types";
|
||||
|
||||
interface UploadState {
|
||||
files: UploadedFile[];
|
||||
processingStatus: ProcessingProgress;
|
||||
isProcessing: boolean;
|
||||
|
||||
// Actions
|
||||
addFile: (file: UploadedFile) => void;
|
||||
removeFile: (id: string) => void;
|
||||
clearFiles: () => void;
|
||||
|
||||
setProcessingStatus: (status: Partial<ProcessingProgress>) => void;
|
||||
resetProcessingStatus: () => void;
|
||||
|
||||
setIsProcessing: (isProcessing: boolean) => void;
|
||||
}
|
||||
|
||||
export const useUploadStore = create<UploadState>((set) => ({
|
||||
files: [],
|
||||
processingStatus: {
|
||||
status: "idle",
|
||||
progress: 0,
|
||||
message: "",
|
||||
},
|
||||
isProcessing: false,
|
||||
|
||||
addFile: (file) =>
|
||||
set((state) => ({
|
||||
files: [...state.files, file],
|
||||
})),
|
||||
|
||||
removeFile: (id) =>
|
||||
set((state) => ({
|
||||
files: state.files.filter((f) => f.id !== id),
|
||||
})),
|
||||
|
||||
clearFiles: () =>
|
||||
set({
|
||||
files: [],
|
||||
}),
|
||||
|
||||
setProcessingStatus: (status) =>
|
||||
set((state) => ({
|
||||
processingStatus: { ...state.processingStatus, ...status },
|
||||
})),
|
||||
|
||||
resetProcessingStatus: () =>
|
||||
set({
|
||||
processingStatus: {
|
||||
status: "idle",
|
||||
progress: 0,
|
||||
message: "",
|
||||
},
|
||||
}),
|
||||
|
||||
setIsProcessing: (isProcessing) =>
|
||||
set({
|
||||
isProcessing,
|
||||
}),
|
||||
}));
|
||||
Reference in New Issue
Block a user