| |
|
| | |
| | import React from 'react'; |
| |
|
| | export type Language = 'en' | 'zh' | 'ja' | 'ko' | 'es' | 'fr'; |
| |
|
| | export type CompositionMode = 'classic' | 'dynamic' | 'cinematic'; |
| |
|
| | export type Resolution = 'standard' | 'high' | 'ultra'; |
| |
|
| | export type SubjectType = 'female' | 'male' | 'couple' | 'child' | 'family'; |
| |
|
| | export interface WeddingStyle { |
| | id: string; |
| | name: string; |
| | prompt: string; |
| | promptKeywords?: string[]; |
| | description: string; |
| | coverColor: string; |
| | previewImage?: string; |
| | category?: string; |
| | icon?: React.ReactNode; |
| | isCustom?: boolean; |
| | tags?: ('hot' | 'new' | 'recommend')[]; |
| | isLocked?: boolean; |
| | groupCount?: number; |
| | } |
| |
|
| | export interface GenerationConfig { |
| | customInstruction?: string; |
| | filter: string; |
| | blurAmount: number; |
| | compositionMode: CompositionMode; |
| | resolution: Resolution; |
| | subjectType?: SubjectType; |
| | } |
| |
|
| | export interface GeneratedResult { |
| | styleId: string; |
| | imageUrl: string; |
| | timestamp: number; |
| | config?: GenerationConfig; |
| | } |
| |
|
| | export type GenerationStatus = 'idle' | 'generating' | 'success' | 'error' | 'partial'; |
| |
|
| | |
| |
|
| | export interface LeadData { |
| | id: string; |
| | userId?: string; |
| | name: string; |
| | phone: string; |
| | wechat?: string; |
| | service?: string; |
| | budget?: string; |
| | date?: string; |
| | timestamp: number; |
| | status: 'new' | 'contacted' | 'booked'; |
| | |
| | preferredStyle?: string; |
| | generationCount?: number; |
| | syncStatus?: 'pending' | 'synced' | 'failed'; |
| | crmId?: string; |
| | } |
| |
|
| | export interface GenerationLog { |
| | styleId: string; |
| | styleName: string; |
| | userId: string; |
| | timestamp: number; |
| | ip: string; |
| | location: string; |
| | device: string; |
| | } |
| |
|
| | export interface AdminConfig { |
| | promoText: string; |
| | promoEnds: string; |
| | contactPhone: string; |
| | showBanner: boolean; |
| | footerAddress: string; |
| | |
| | |
| | logoUrl?: string; |
| |
|
| | |
| | shareTitle?: string; |
| | shareDesc?: string; |
| | shareImage?: string; |
| | redPacketMax?: number; |
| | slashDifficulty?: number; |
| | shareConfig?: any; |
| |
|
| | |
| | aboutStory?: string; |
| | aboutPhilosophy?: string; |
| | aboutLocation?: string; |
| | qrCodeUrl?: string; |
| |
|
| | |
| | pointsShare?: number; |
| | pointsInvite?: number; |
| | pointsBook?: number; |
| | pointsVipCost?: number; |
| |
|
| | |
| | crmApiUrl?: string; |
| | crmApiKey?: string; |
| | geminiApiKey?: string; |
| | geminiApiUrl?: string; |
| | } |
| |
|
| | export interface PointHistory { |
| | id: string; |
| | action: 'share' | 'invite' | 'book' | 'redeem' | 'admin_adjust' | 'slash_help'; |
| | points: number; |
| | timestamp: number; |
| | desc: string; |
| | } |
| |
|
| | export interface StaffPermissions { |
| | canExportLeads: boolean; |
| | canDeleteLeads: boolean; |
| | canManageSettings: boolean; |
| | canManageUsers: boolean; |
| | canManageStaff: boolean; |
| | } |
| |
|
| | export interface UserAccount { |
| | id: string; |
| | name: string; |
| | phone?: string; |
| | password?: string; |
| | avatar?: string; |
| | points: number; |
| | isVip: boolean; |
| | joinDate: number; |
| | history: PointHistory[]; |
| | role: 'user' | 'staff' | 'admin'; |
| | permissions?: StaffPermissions; |
| | favorites?: string[]; |
| | |
| | styleStats?: Record<string, number>; |
| | |
| | |
| | redPacketBalance?: number; |
| | slashProgress?: Record<string, number>; |
| | } |
| |
|
| | export type VideoTemplate = 'default' | 'flash' | 'slow' | 'story'; |
| |
|
| | export interface FeedbackItem { |
| | id: string; |
| | userId?: string; |
| | type: 'bug' | 'suggestion' | 'other'; |
| | rating: number; |
| | content: string; |
| | timestamp: number; |
| | contact?: string; |
| | } |
| |
|