sa2kit 1.6.60 → 1.6.62
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/UniversalFileService-C3WQAFOV.js +15 -0
- package/dist/{UniversalFileService-J6ET6KZK.js.map → UniversalFileService-C3WQAFOV.js.map} +1 -1
- package/dist/UniversalFileService-O3IEROBN.mjs +6 -0
- package/dist/{UniversalFileService-336GFY6N.mjs.map → UniversalFileService-O3IEROBN.mjs.map} +1 -1
- package/dist/ai/llm/index.d.mts +70 -0
- package/dist/ai/llm/index.d.ts +70 -0
- package/dist/ai/llm/index.js +54 -0
- package/dist/ai/llm/index.js.map +1 -0
- package/dist/ai/llm/index.mjs +5 -0
- package/dist/ai/llm/index.mjs.map +1 -0
- package/dist/ai/llm/ui/electron/index.d.mts +5 -0
- package/dist/ai/llm/ui/electron/index.d.ts +5 -0
- package/dist/ai/llm/ui/electron/index.js +21 -0
- package/dist/ai/llm/ui/electron/index.js.map +1 -0
- package/dist/ai/llm/ui/electron/index.mjs +8 -0
- package/dist/ai/llm/ui/electron/index.mjs.map +1 -0
- package/dist/ai/llm/ui/miniapp/index.d.mts +9 -0
- package/dist/ai/llm/ui/miniapp/index.d.ts +9 -0
- package/dist/ai/llm/ui/miniapp/index.js +107 -0
- package/dist/ai/llm/ui/miniapp/index.js.map +1 -0
- package/dist/ai/llm/ui/miniapp/index.mjs +101 -0
- package/dist/ai/llm/ui/miniapp/index.mjs.map +1 -0
- package/dist/ai/llm/ui/rn/index.d.mts +9 -0
- package/dist/ai/llm/ui/rn/index.d.ts +9 -0
- package/dist/ai/llm/ui/rn/index.js +249 -0
- package/dist/ai/llm/ui/rn/index.js.map +1 -0
- package/dist/ai/llm/ui/rn/index.mjs +243 -0
- package/dist/ai/llm/ui/rn/index.mjs.map +1 -0
- package/dist/ai/llm/ui/web/index.d.mts +15 -0
- package/dist/ai/llm/ui/web/index.d.ts +15 -0
- package/dist/ai/llm/ui/web/index.js +21 -0
- package/dist/ai/llm/ui/web/index.js.map +1 -0
- package/dist/ai/llm/ui/web/index.mjs +8 -0
- package/dist/ai/llm/ui/web/index.mjs.map +1 -0
- package/dist/ar/index.d.mts +7 -0
- package/dist/ar/index.d.ts +7 -0
- package/dist/ar/index.js +17 -0
- package/dist/ar/index.js.map +1 -0
- package/dist/ar/index.mjs +4 -0
- package/dist/ar/index.mjs.map +1 -0
- package/dist/auth/index.js +22 -22
- package/dist/auth/index.mjs +2 -2
- package/dist/auth/legacy/db/index.d.mts +5 -0
- package/dist/auth/legacy/db/index.d.ts +5 -0
- package/dist/auth/legacy/db/index.js +34 -0
- package/dist/auth/legacy/db/index.js.map +1 -0
- package/dist/auth/legacy/db/index.mjs +5 -0
- package/dist/auth/legacy/db/index.mjs.map +1 -0
- package/dist/auth/legacy/index.d.mts +51 -0
- package/dist/auth/legacy/index.d.ts +51 -0
- package/dist/auth/legacy/index.js +146 -0
- package/dist/auth/legacy/index.js.map +1 -0
- package/dist/auth/legacy/index.mjs +13 -0
- package/dist/auth/legacy/index.mjs.map +1 -0
- package/dist/auth/legacy/logic/index.d.mts +9 -0
- package/dist/auth/legacy/logic/index.d.ts +9 -0
- package/dist/auth/legacy/logic/index.js +18 -0
- package/dist/auth/legacy/logic/index.js.map +1 -0
- package/dist/auth/legacy/logic/index.mjs +5 -0
- package/dist/auth/legacy/logic/index.mjs.map +1 -0
- package/dist/auth/legacy/routes/index.d.mts +50 -0
- package/dist/auth/legacy/routes/index.d.ts +50 -0
- package/dist/auth/legacy/routes/index.js +34 -0
- package/dist/auth/legacy/routes/index.js.map +1 -0
- package/dist/auth/legacy/routes/index.mjs +5 -0
- package/dist/auth/legacy/routes/index.mjs.map +1 -0
- package/dist/auth/legacy/schema/index.d.mts +401 -0
- package/dist/auth/legacy/schema/index.d.ts +401 -0
- package/dist/auth/legacy/schema/index.js +29 -0
- package/dist/auth/legacy/schema/index.js.map +1 -0
- package/dist/auth/legacy/schema/index.mjs +4 -0
- package/dist/auth/legacy/schema/index.mjs.map +1 -0
- package/dist/auth/legacy/server/index.d.mts +15 -0
- package/dist/auth/legacy/server/index.d.ts +15 -0
- package/dist/auth/legacy/server/index.js +65 -0
- package/dist/auth/legacy/server/index.js.map +1 -0
- package/dist/auth/legacy/server/index.mjs +8 -0
- package/dist/auth/legacy/server/index.mjs.map +1 -0
- package/dist/auth/legacy/services/index.d.mts +40 -0
- package/dist/auth/legacy/services/index.d.ts +40 -0
- package/dist/auth/legacy/services/index.js +14 -0
- package/dist/auth/legacy/services/index.js.map +1 -0
- package/dist/auth/legacy/services/index.mjs +5 -0
- package/dist/auth/legacy/services/index.mjs.map +1 -0
- package/dist/auth/legacy/ui/miniapp/index.d.mts +10 -0
- package/dist/auth/legacy/ui/miniapp/index.d.ts +10 -0
- package/dist/auth/legacy/ui/miniapp/index.js +23 -0
- package/dist/auth/legacy/ui/miniapp/index.js.map +1 -0
- package/dist/auth/legacy/ui/miniapp/index.mjs +6 -0
- package/dist/auth/legacy/ui/miniapp/index.mjs.map +1 -0
- package/dist/auth/legacy/ui/web/index.d.mts +22 -0
- package/dist/auth/legacy/ui/web/index.d.ts +22 -0
- package/dist/auth/legacy/ui/web/index.js +31 -0
- package/dist/auth/legacy/ui/web/index.js.map +1 -0
- package/dist/auth/legacy/ui/web/index.mjs +6 -0
- package/dist/auth/legacy/ui/web/index.mjs.map +1 -0
- package/dist/calendar/index.d.mts +390 -237
- package/dist/calendar/index.d.ts +390 -237
- package/dist/calendar/index.js +3825 -3785
- package/dist/calendar/index.js.map +1 -1
- package/dist/calendar/index.mjs +3730 -3696
- package/dist/calendar/index.mjs.map +1 -1
- package/dist/calendar/routes/index.js +30 -327
- package/dist/calendar/routes/index.js.map +1 -1
- package/dist/calendar/routes/index.mjs +1 -323
- package/dist/calendar/routes/index.mjs.map +1 -1
- package/dist/calendar/server.d.mts +6 -0
- package/dist/calendar/server.d.ts +6 -0
- package/dist/calendar/server.js +41 -13
- package/dist/calendar/server.js.map +1 -1
- package/dist/calendar/server.mjs +2 -2
- package/dist/calendar/server.mjs.map +1 -1
- package/dist/chunk-24F7KUED.js +263 -0
- package/dist/chunk-24F7KUED.js.map +1 -0
- package/dist/{chunk-YMS6BPXS.js → chunk-27IUMDDK.js} +3 -3
- package/dist/{chunk-YMS6BPXS.js.map → chunk-27IUMDDK.js.map} +1 -1
- package/dist/chunk-37M6NZIF.js +279 -0
- package/dist/chunk-37M6NZIF.js.map +1 -0
- package/dist/chunk-3JMUNOUT.js +144 -0
- package/dist/chunk-3JMUNOUT.js.map +1 -0
- package/dist/chunk-3PFCOTJP.mjs +256 -0
- package/dist/chunk-3PFCOTJP.mjs.map +1 -0
- package/dist/{chunk-NZZZUMMX.mjs → chunk-57MVE5LL.mjs} +3 -3
- package/dist/{chunk-NZZZUMMX.mjs.map → chunk-57MVE5LL.mjs.map} +1 -1
- package/dist/{chunk-622Y6LTH.mjs → chunk-5BLZEVWK.mjs} +196 -468
- package/dist/chunk-5BLZEVWK.mjs.map +1 -0
- package/dist/{chunk-YN4MJFIG.js → chunk-5LCGOCKG.js} +5 -5
- package/dist/{chunk-YN4MJFIG.js.map → chunk-5LCGOCKG.js.map} +1 -1
- package/dist/chunk-6XUQ2B4K.js +219 -0
- package/dist/chunk-6XUQ2B4K.js.map +1 -0
- package/dist/{chunk-NCOXT7SK.js → chunk-77UEPWVQ.js} +4 -4
- package/dist/{chunk-NCOXT7SK.js.map → chunk-77UEPWVQ.js.map} +1 -1
- package/dist/chunk-CFM56MGO.mjs +35 -0
- package/dist/chunk-CFM56MGO.mjs.map +1 -0
- package/dist/chunk-CPSFYP34.mjs +140 -0
- package/dist/chunk-CPSFYP34.mjs.map +1 -0
- package/dist/chunk-D22QBOCM.mjs +336 -0
- package/dist/chunk-D22QBOCM.mjs.map +1 -0
- package/dist/chunk-DA4QV64P.mjs +35 -0
- package/dist/chunk-DA4QV64P.mjs.map +1 -0
- package/dist/chunk-EKDLZND6.js +275 -0
- package/dist/chunk-EKDLZND6.js.map +1 -0
- package/dist/chunk-EKQPFZXQ.js +12 -0
- package/dist/chunk-EKQPFZXQ.js.map +1 -0
- package/dist/chunk-ERAAB5VG.js +324 -0
- package/dist/chunk-ERAAB5VG.js.map +1 -0
- package/dist/chunk-ESLY72VI.mjs +175 -0
- package/dist/chunk-ESLY72VI.mjs.map +1 -0
- package/dist/chunk-FGQGWW73.js +38 -0
- package/dist/chunk-FGQGWW73.js.map +1 -0
- package/dist/chunk-FXQOXLDE.js +120 -0
- package/dist/chunk-FXQOXLDE.js.map +1 -0
- package/dist/chunk-FZELCJR7.mjs +19 -0
- package/dist/chunk-FZELCJR7.mjs.map +1 -0
- package/dist/{chunk-HHVDOIPV.js → chunk-H3P2PGZL.js} +3 -3
- package/dist/{chunk-HHVDOIPV.js.map → chunk-H3P2PGZL.js.map} +1 -1
- package/dist/chunk-HBQMN5QM.mjs +10 -0
- package/dist/chunk-HBQMN5QM.mjs.map +1 -0
- package/dist/chunk-ITRIXMXF.mjs +862 -0
- package/dist/chunk-ITRIXMXF.mjs.map +1 -0
- package/dist/chunk-IUWSCUDC.js +4 -0
- package/dist/chunk-IUWSCUDC.js.map +1 -0
- package/dist/chunk-JCKCKRC2.js +50 -0
- package/dist/chunk-JCKCKRC2.js.map +1 -0
- package/dist/chunk-L7GQNY54.mjs +286 -0
- package/dist/chunk-L7GQNY54.mjs.map +1 -0
- package/dist/{chunk-ZRWED7Q6.js → chunk-LDVJ7URJ.js} +235 -520
- package/dist/chunk-LDVJ7URJ.js.map +1 -0
- package/dist/{chunk-CYTXGBP2.js → chunk-MLP74E3O.js} +573 -1607
- package/dist/chunk-MLP74E3O.js.map +1 -0
- package/dist/chunk-NAX4TUT7.js +182 -0
- package/dist/chunk-NAX4TUT7.js.map +1 -0
- package/dist/chunk-NW4EN4YI.mjs +213 -0
- package/dist/chunk-NW4EN4YI.mjs.map +1 -0
- package/dist/chunk-P3QMT3AY.mjs +44 -0
- package/dist/chunk-P3QMT3AY.mjs.map +1 -0
- package/dist/chunk-PJ4KYAQZ.mjs +631 -0
- package/dist/chunk-PJ4KYAQZ.mjs.map +1 -0
- package/dist/chunk-PLSEAREM.js +345 -0
- package/dist/chunk-PLSEAREM.js.map +1 -0
- package/dist/{chunk-EGJPS7OL.mjs → chunk-QZU4UJZG.mjs} +3 -3
- package/dist/{chunk-EGJPS7OL.mjs.map → chunk-QZU4UJZG.mjs.map} +1 -1
- package/dist/chunk-RJVR33ME.mjs +3 -0
- package/dist/chunk-RJVR33ME.mjs.map +1 -0
- package/dist/chunk-SYBHDB2D.js +650 -0
- package/dist/chunk-SYBHDB2D.js.map +1 -0
- package/dist/chunk-TVKVM7JT.js +21 -0
- package/dist/chunk-TVKVM7JT.js.map +1 -0
- package/dist/{chunk-PONZPO3U.mjs → chunk-UTB72ZJ7.mjs} +414 -1448
- package/dist/chunk-UTB72ZJ7.mjs.map +1 -0
- package/dist/chunk-V7EVKD5G.mjs +116 -0
- package/dist/chunk-V7EVKD5G.mjs.map +1 -0
- package/dist/chunk-VGPR3KLR.js +872 -0
- package/dist/chunk-VGPR3KLR.js.map +1 -0
- package/dist/chunk-VS7WATQD.js +255 -0
- package/dist/chunk-VS7WATQD.js.map +1 -0
- package/dist/chunk-VSP7XJT5.mjs +272 -0
- package/dist/chunk-VSP7XJT5.mjs.map +1 -0
- package/dist/{chunk-CSDIPQQO.mjs → chunk-VTKAIOP5.mjs} +5 -5
- package/dist/{chunk-CSDIPQQO.mjs.map → chunk-VTKAIOP5.mjs.map} +1 -1
- package/dist/chunk-VULJUXTF.mjs +267 -0
- package/dist/chunk-VULJUXTF.mjs.map +1 -0
- package/dist/chunk-XAHM6B3V.js +44 -0
- package/dist/chunk-XAHM6B3V.js.map +1 -0
- package/dist/chunk-YSF5YISM.mjs +248 -0
- package/dist/chunk-YSF5YISM.mjs.map +1 -0
- package/dist/{chunk-OFYBMMWT.mjs → chunk-YYJEVAJI.mjs} +3 -3
- package/dist/{chunk-OFYBMMWT.mjs.map → chunk-YYJEVAJI.mjs.map} +1 -1
- package/dist/components/index.d.mts +1 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.js +182 -181
- package/dist/components/index.mjs +4 -3
- package/dist/index-DNKZ7-R_.d.mts +184 -0
- package/dist/index-DNKZ7-R_.d.ts +184 -0
- package/dist/index.d.mts +4 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +285 -229
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +15 -10
- package/dist/index.mjs.map +1 -1
- package/dist/mikuFusionGame/index.js +3 -3
- package/dist/mikuFusionGame/index.mjs +2 -2
- package/dist/mmd/index.d.mts +67 -9
- package/dist/mmd/index.d.ts +67 -9
- package/dist/mmd/index.js +969 -625
- package/dist/mmd/index.js.map +1 -1
- package/dist/mmd/index.mjs +969 -628
- package/dist/mmd/index.mjs.map +1 -1
- package/dist/portfolio/index.js +10 -9
- package/dist/portfolio/index.mjs +5 -4
- package/dist/qqbot/index.d.mts +2 -0
- package/dist/qqbot/index.d.ts +2 -0
- package/dist/qqbot/index.js +21 -0
- package/dist/qqbot/index.js.map +1 -0
- package/dist/qqbot/index.mjs +4 -0
- package/dist/qqbot/index.mjs.map +1 -0
- package/dist/qqbot/server/index.d.mts +91 -0
- package/dist/qqbot/server/index.d.ts +91 -0
- package/dist/qqbot/server/index.js +21 -0
- package/dist/qqbot/server/index.js.map +1 -0
- package/dist/qqbot/server/index.mjs +4 -0
- package/dist/qqbot/server/index.mjs.map +1 -0
- package/dist/qqbot/ui/web/index.d.mts +10 -0
- package/dist/qqbot/ui/web/index.d.ts +10 -0
- package/dist/qqbot/ui/web/index.js +105 -0
- package/dist/qqbot/ui/web/index.js.map +1 -0
- package/dist/qqbot/ui/web/index.mjs +99 -0
- package/dist/qqbot/ui/web/index.mjs.map +1 -0
- package/dist/screenReceiver/index.d.mts +78 -0
- package/dist/screenReceiver/index.d.ts +78 -0
- package/dist/screenReceiver/index.js +17 -0
- package/dist/screenReceiver/index.js.map +1 -0
- package/dist/screenReceiver/index.mjs +4 -0
- package/dist/screenReceiver/index.mjs.map +1 -0
- package/dist/screenReceiver/server/index.d.mts +36 -0
- package/dist/screenReceiver/server/index.d.ts +36 -0
- package/dist/screenReceiver/server/index.js +160 -0
- package/dist/screenReceiver/server/index.js.map +1 -0
- package/dist/screenReceiver/server/index.mjs +157 -0
- package/dist/screenReceiver/server/index.mjs.map +1 -0
- package/dist/showmasterpiece/db/index.js +42 -42
- package/dist/showmasterpiece/db/index.mjs +1 -1
- package/dist/showmasterpiece/index.js +52 -41
- package/dist/showmasterpiece/index.js.map +1 -1
- package/dist/showmasterpiece/index.mjs +15 -4
- package/dist/showmasterpiece/index.mjs.map +1 -1
- package/dist/showmasterpiece/server/index.js +42 -42
- package/dist/showmasterpiece/server/index.mjs +1 -1
- package/dist/showmasterpiece/ui/miniapp/index.d.mts +2 -0
- package/dist/showmasterpiece/ui/miniapp/index.d.ts +2 -0
- package/dist/showmasterpiece/ui/miniapp/index.js +83 -55
- package/dist/showmasterpiece/ui/miniapp/index.js.map +1 -1
- package/dist/showmasterpiece/ui/miniapp/index.mjs +83 -55
- package/dist/showmasterpiece/ui/miniapp/index.mjs.map +1 -1
- package/dist/showmasterpiece/ui/web/index.js +43 -32
- package/dist/showmasterpiece/ui/web/index.mjs +15 -4
- package/dist/testYourself/index.js +13 -13
- package/dist/testYourself/index.mjs +2 -2
- package/dist/types-B-hOccQw.d.mts +122 -0
- package/dist/types-B8rGXc4e.d.mts +38 -0
- package/dist/types-Cg89HGz2.d.ts +38 -0
- package/dist/types-CvKvpyN8.d.mts +48 -0
- package/dist/types-CvKvpyN8.d.ts +48 -0
- package/dist/types-Dy6x2gJW.d.ts +122 -0
- package/dist/universalFile/server/index.js +11 -11
- package/dist/universalFile/server/index.mjs +4 -4
- package/package.json +101 -1
- package/dist/UniversalFileService-336GFY6N.mjs +0 -6
- package/dist/UniversalFileService-J6ET6KZK.js +0 -15
- package/dist/chunk-622Y6LTH.mjs.map +0 -1
- package/dist/chunk-CYTXGBP2.js.map +0 -1
- package/dist/chunk-GVVS4IMM.mjs +0 -302
- package/dist/chunk-GVVS4IMM.mjs.map +0 -1
- package/dist/chunk-PONZPO3U.mjs.map +0 -1
- package/dist/chunk-WC5QFO3T.js +0 -314
- package/dist/chunk-WC5QFO3T.js.map +0 -1
- package/dist/chunk-ZRWED7Q6.js.map +0 -1
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { init_hooks, init_masterpiecesService, init_masterpiecesConfigService, init_cartService, init_bookingService, init_bookingAdminService, init_cartHistoryService, init_CartContext, useCartContext, useDeadlinePopup, useBooking, useBookingForm, updateCollectionOrder, moveCollectionDown, moveCollectionUp, getAllCollections, updateArtworkOrder, moveArtworkDown, moveArtworkUp, getArtworksByCollection, BookingService, useMasterpieces, CartProvider, useMasterpiecesConfig, useBookingAdmin, getConfig, createCategory } from './chunk-OX6VMQDU.mjs';
|
|
2
2
|
import { normalizeHomeTabConfig, getCategoryDisplayName, buildDefaultHomeTabConfig } from './chunk-MFG2Y6UR.mjs';
|
|
3
|
+
import { AuthGuard, UserMenu } from './chunk-ITRIXMXF.mjs';
|
|
4
|
+
import { AuthProvider, useAuth } from './chunk-ESLY72VI.mjs';
|
|
3
5
|
import { UniversalExportClient, UniversalExportButton } from './chunk-TGNUEULF.mjs';
|
|
4
|
-
import { Card, Badge, CardContent,
|
|
6
|
+
import { Card, Badge, CardContent, GenericOrderManager, Modal, CardHeader, CardTitle, CardDescription, Tabs, TabsList, TabsTrigger, TabsContent, Label, Textarea, Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from './chunk-5BLZEVWK.mjs';
|
|
7
|
+
import { Button, Input } from './chunk-L7GQNY54.mjs';
|
|
5
8
|
import { __require } from './chunk-WMJKH4XE.mjs';
|
|
6
|
-
import
|
|
7
|
-
import { Check, Minus, Plus, ShoppingCart, ShoppingBag, Book, Eye, ImageIcon, ChevronLeft, ChevronRight, Grid3x3, X, Trash2, Calendar, Clock, CheckCircle, Package, Search, RefreshCw, Download, XCircle, Save, Edit, Settings, AlertTriangle, EyeOff, Database, Loader, ArrowLeft, User, Image, Info, History, Bell, Cog, RotateCcw, ArrowUpDown
|
|
9
|
+
import React23, { useState, useEffect, useRef, useCallback, useMemo } from 'react';
|
|
10
|
+
import { Check, Minus, Plus, ShoppingCart, ShoppingBag, Book, Eye, ImageIcon, ChevronLeft, ChevronRight, Grid3x3, X, Trash2, Calendar, Clock, CheckCircle, Package, Search, RefreshCw, Download, XCircle, Save, Edit, Settings, AlertTriangle, EyeOff, Database, Loader, ArrowLeft, User, Image, Info, History, Bell, Cog, RotateCcw, ArrowUpDown } from 'lucide-react';
|
|
8
11
|
import Link from 'next/link';
|
|
9
|
-
import { createPortal } from 'react-dom';
|
|
10
12
|
|
|
11
13
|
// src/showmasterpiece/ui/web/components/AddToCartButton.tsx
|
|
12
14
|
init_hooks();
|
|
@@ -80,9 +82,9 @@ var AddToCartButton = ({
|
|
|
80
82
|
console.error("\u66F4\u65B0\u8D2D\u7269\u8F66\u6570\u91CF\u5931\u8D25:", error);
|
|
81
83
|
}
|
|
82
84
|
};
|
|
83
|
-
return /* @__PURE__ */
|
|
85
|
+
return /* @__PURE__ */ React23.createElement("div", { className: `flex flex-col gap-2 ${className}` }, isInCart ? (
|
|
84
86
|
// 已在购物车中的状态
|
|
85
|
-
/* @__PURE__ */
|
|
87
|
+
/* @__PURE__ */ React23.createElement("div", { className: "flex flex-col gap-2" }, /* @__PURE__ */ React23.createElement(
|
|
86
88
|
"button",
|
|
87
89
|
{
|
|
88
90
|
onClick: (e) => {
|
|
@@ -91,9 +93,9 @@ var AddToCartButton = ({
|
|
|
91
93
|
disabled: loading,
|
|
92
94
|
className: `flex items-center justify-center gap-2 rounded-lg font-medium transition-colors ${sizeStyles[size]} bg-green-600 text-white disabled:opacity-50`
|
|
93
95
|
},
|
|
94
|
-
/* @__PURE__ */
|
|
95
|
-
/* @__PURE__ */
|
|
96
|
-
), /* @__PURE__ */
|
|
96
|
+
/* @__PURE__ */ React23.createElement(Check, { size: 16 }),
|
|
97
|
+
/* @__PURE__ */ React23.createElement("span", null, "\u5DF2\u52A0\u5165\u8D2D\u7269\u8F66")
|
|
98
|
+
), /* @__PURE__ */ React23.createElement("div", { className: "flex items-center justify-center border border-gray-300 rounded-lg bg-white" }, /* @__PURE__ */ React23.createElement(
|
|
97
99
|
"button",
|
|
98
100
|
{
|
|
99
101
|
onClick: (e) => {
|
|
@@ -103,8 +105,8 @@ var AddToCartButton = ({
|
|
|
103
105
|
disabled: loading,
|
|
104
106
|
className: "px-2 py-1 hover:bg-gray-50 disabled:opacity-50 transition-colors"
|
|
105
107
|
},
|
|
106
|
-
/* @__PURE__ */
|
|
107
|
-
), /* @__PURE__ */
|
|
108
|
+
/* @__PURE__ */ React23.createElement(Minus, { size: 14 })
|
|
109
|
+
), /* @__PURE__ */ React23.createElement("span", { className: "px-3 py-1 min-w-[2rem] text-center font-medium" }, currentQuantity), /* @__PURE__ */ React23.createElement(
|
|
108
110
|
"button",
|
|
109
111
|
{
|
|
110
112
|
onClick: (e) => {
|
|
@@ -114,11 +116,11 @@ var AddToCartButton = ({
|
|
|
114
116
|
disabled: loading,
|
|
115
117
|
className: "px-2 py-1 hover:bg-gray-50 transition-colors"
|
|
116
118
|
},
|
|
117
|
-
/* @__PURE__ */
|
|
119
|
+
/* @__PURE__ */ React23.createElement(Plus, { size: 14 })
|
|
118
120
|
)))
|
|
119
121
|
) : (
|
|
120
122
|
// 未在购物车中的状态
|
|
121
|
-
/* @__PURE__ */
|
|
123
|
+
/* @__PURE__ */ React23.createElement("div", { className: "flex flex-col gap-2" }, showQuantitySelector && /* @__PURE__ */ React23.createElement("div", { className: "flex items-center justify-center border border-gray-300 rounded-lg bg-white" }, /* @__PURE__ */ React23.createElement(
|
|
122
124
|
"button",
|
|
123
125
|
{
|
|
124
126
|
onClick: (e) => {
|
|
@@ -128,8 +130,8 @@ var AddToCartButton = ({
|
|
|
128
130
|
disabled: quantity <= 1 || loading,
|
|
129
131
|
className: "px-2 py-1 hover:bg-gray-50 disabled:opacity-50 transition-colors"
|
|
130
132
|
},
|
|
131
|
-
/* @__PURE__ */
|
|
132
|
-
), /* @__PURE__ */
|
|
133
|
+
/* @__PURE__ */ React23.createElement(Minus, { size: 14 })
|
|
134
|
+
), /* @__PURE__ */ React23.createElement("span", { className: "px-3 py-1 min-w-[2rem] text-center font-medium" }, quantity), /* @__PURE__ */ React23.createElement(
|
|
133
135
|
"button",
|
|
134
136
|
{
|
|
135
137
|
onClick: (e) => {
|
|
@@ -139,8 +141,8 @@ var AddToCartButton = ({
|
|
|
139
141
|
disabled: loading,
|
|
140
142
|
className: "px-2 py-1 hover:bg-gray-50 transition-colors"
|
|
141
143
|
},
|
|
142
|
-
/* @__PURE__ */
|
|
143
|
-
)), /* @__PURE__ */
|
|
144
|
+
/* @__PURE__ */ React23.createElement(Plus, { size: 14 })
|
|
145
|
+
)), /* @__PURE__ */ React23.createElement(
|
|
144
146
|
"button",
|
|
145
147
|
{
|
|
146
148
|
onClick: (e) => {
|
|
@@ -150,8 +152,8 @@ var AddToCartButton = ({
|
|
|
150
152
|
disabled: loading,
|
|
151
153
|
className: `flex items-center justify-center gap-2 rounded-lg font-medium transition-colors ${sizeStyles[size]} bg-blue-600 text-white hover:bg-blue-700 disabled:opacity-50`
|
|
152
154
|
},
|
|
153
|
-
/* @__PURE__ */
|
|
154
|
-
/* @__PURE__ */
|
|
155
|
+
/* @__PURE__ */ React23.createElement(ShoppingCart, { size: 16 }),
|
|
156
|
+
/* @__PURE__ */ React23.createElement("span", null, "\u52A0\u5165\u8D2D\u7269\u8F66")
|
|
155
157
|
))
|
|
156
158
|
));
|
|
157
159
|
};
|
|
@@ -200,8 +202,8 @@ var CollectionCard = ({
|
|
|
200
202
|
setImageLoading(false);
|
|
201
203
|
setImageError(true);
|
|
202
204
|
};
|
|
203
|
-
const renderImageLoading = () => /* @__PURE__ */
|
|
204
|
-
const renderImageError = () => /* @__PURE__ */
|
|
205
|
+
const renderImageLoading = () => /* @__PURE__ */ React23.createElement("div", { className: "absolute inset-0 flex items-center justify-center" }, /* @__PURE__ */ React23.createElement("div", { className: "w-8 h-8 border-2 border-prussian-blue-300 border-t-moonstone rounded-full animate-spin" }));
|
|
206
|
+
const renderImageError = () => /* @__PURE__ */ React23.createElement("div", { className: "absolute inset-0 flex flex-col items-center justify-center gap-2 text-prussian-blue-600 text-sm text-center p-4" }, /* @__PURE__ */ React23.createElement(ImageIcon, { size: 32, className: "text-prussian-blue-500" }), /* @__PURE__ */ React23.createElement("span", null, "\u56FE\u7247\u52A0\u8F7D\u5931\u8D25"));
|
|
205
207
|
const renderCoverImage = () => {
|
|
206
208
|
if (!shouldLoadImage) {
|
|
207
209
|
return renderImageLoading();
|
|
@@ -210,7 +212,7 @@ var CollectionCard = ({
|
|
|
210
212
|
return renderImageError();
|
|
211
213
|
}
|
|
212
214
|
console.log("\u{1F50D} [CollectionCard] \u6E32\u67D3\u5C01\u9762\u56FE\u7247:", collection.coverImage, "collection:", collection);
|
|
213
|
-
return /* @__PURE__ */
|
|
215
|
+
return /* @__PURE__ */ React23.createElement(
|
|
214
216
|
"img",
|
|
215
217
|
{
|
|
216
218
|
src: collection.coverImage,
|
|
@@ -231,22 +233,22 @@ var CollectionCard = ({
|
|
|
231
233
|
return `\xA5${price}`;
|
|
232
234
|
};
|
|
233
235
|
const isProduct = collection.category !== "collection" /* COLLECTION */;
|
|
234
|
-
return /* @__PURE__ */
|
|
236
|
+
return /* @__PURE__ */ React23.createElement(
|
|
235
237
|
Card,
|
|
236
238
|
{
|
|
237
239
|
ref: cardRef,
|
|
238
240
|
className: `overflow-hidden transition-all duration-300 transform w-full max-w-sm mx-auto group border-prussian-blue-200/30 shadow-lg hover:shadow-xl bg-gradient-to-br from-white to-prussian-blue-900/5 ${!(collection.pages && collection.pages.length > 0) ? "cursor-default" : "cursor-pointer hover:-translate-y-1 hover:shadow-moonstone/20 hover:border-moonstone/40"}`,
|
|
239
241
|
onClick: collection.pages && collection.pages.length > 0 ? () => onSelect(collection) : void 0
|
|
240
242
|
},
|
|
241
|
-
/* @__PURE__ */
|
|
243
|
+
/* @__PURE__ */ React23.createElement("div", { className: "relative w-full bg-gradient-to-br from-prussian-blue-900/5 to-oxford-blue-100/10 flex items-center justify-center overflow-hidden aspect-[1/1.414]" }, /* @__PURE__ */ React23.createElement("div", { className: "absolute inset-0 bg-gradient-to-t from-rich-black/60 via-oxford-blue/20 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300" }), /* @__PURE__ */ React23.createElement("div", { className: "absolute bottom-4 left-4 z-10" }, /* @__PURE__ */ React23.createElement(
|
|
242
244
|
Badge,
|
|
243
245
|
{
|
|
244
246
|
variant: "secondary",
|
|
245
247
|
className: "bg-moonstone/90 text-white backdrop-blur-sm border-none hover:bg-cerulean/90 transition-colors shadow-lg"
|
|
246
248
|
},
|
|
247
|
-
isProduct ? /* @__PURE__ */
|
|
249
|
+
isProduct ? /* @__PURE__ */ React23.createElement(React23.Fragment, null, /* @__PURE__ */ React23.createElement(ShoppingBag, { size: 16, className: "mr-1" }), "\u5546\u54C1") : /* @__PURE__ */ React23.createElement(React23.Fragment, null, /* @__PURE__ */ React23.createElement(Book, { size: 16, className: "mr-1" }), collection.pages.length, " \u9875")
|
|
248
250
|
)), renderCoverImage()),
|
|
249
|
-
/* @__PURE__ */
|
|
251
|
+
/* @__PURE__ */ React23.createElement(CardContent, { className: "p-6" }, /* @__PURE__ */ React23.createElement("h3", { className: "text-xl font-bold text-rich-black mb-2 line-clamp-2 group-hover:text-moonstone transition-colors" }, collection.title), /* @__PURE__ */ React23.createElement("p", { className: "text-prussian-blue-600 text-sm mb-1" }, "\u7F16\u53F7\uFF1A", collection.number), collection.category && /* @__PURE__ */ React23.createElement("p", { className: "text-prussian-blue-600 text-sm mb-1" }, "\u5206\u7C7B\uFF1A", collection.category.displayName), /* @__PURE__ */ React23.createElement("p", { className: "text-prussian-blue-700 text-sm mb-2 font-medium" }, "\u4EF7\u683C\uFF1A", formatPrice(collection.price)), collection.description && /* @__PURE__ */ React23.createElement("p", { className: "text-prussian-blue-500 text-sm mb-4 line-clamp-2" }, collection.description), /* @__PURE__ */ React23.createElement("div", { className: "flex gap-2" }, collection.pages && collection.pages.length > 0 && /* @__PURE__ */ React23.createElement(
|
|
250
252
|
Button,
|
|
251
253
|
{
|
|
252
254
|
className: "flex-1 bg-gradient-to-r from-moonstone to-cerulean hover:from-cerulean hover:to-moonstone text-white gap-2 shadow-lg transition-all duration-300 hover:shadow-moonstone/30",
|
|
@@ -255,9 +257,9 @@ var CollectionCard = ({
|
|
|
255
257
|
onSelect(collection);
|
|
256
258
|
}
|
|
257
259
|
},
|
|
258
|
-
/* @__PURE__ */
|
|
260
|
+
/* @__PURE__ */ React23.createElement(Eye, { size: 16 }),
|
|
259
261
|
"\u67E5\u770B\u8BE6\u60C5"
|
|
260
|
-
), /* @__PURE__ */
|
|
262
|
+
), /* @__PURE__ */ React23.createElement(
|
|
261
263
|
AddToCartButton,
|
|
262
264
|
{
|
|
263
265
|
collection,
|
|
@@ -324,14 +326,14 @@ var ArtworkViewer = ({
|
|
|
324
326
|
}
|
|
325
327
|
}, 100);
|
|
326
328
|
};
|
|
327
|
-
return /* @__PURE__ */
|
|
329
|
+
return /* @__PURE__ */ React23.createElement(Card, { className: "w-full max-w-full box-border mx-auto shadow-lg border-prussian-blue-200/30 bg-gradient-to-br from-white to-prussian-blue-900/5" }, /* @__PURE__ */ React23.createElement(CardContent, { className: "p-6 lg:p-5 md:p-4 sm:p-3" }, /* @__PURE__ */ React23.createElement("div", { className: "relative min-h-[600px] flex items-center justify-center bg-gradient-to-br from-prussian-blue-900/5 to-oxford-blue-100/10 rounded-lg overflow-hidden lg:min-h-[500px] md:min-h-[450px] sm:min-h-[350px] sm:rounded-md" }, imageLoading && /* @__PURE__ */ React23.createElement("div", { className: "absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 flex flex-col items-center justify-center gap-4 text-prussian-blue-600 text-center p-4" }, /* @__PURE__ */ React23.createElement("div", { className: "w-10 h-10 border-[3px] border-prussian-blue-300 border-t-moonstone rounded-full animate-spin" }), /* @__PURE__ */ React23.createElement("p", null, "\u52A0\u8F7D\u4E2D...")), imageError && /* @__PURE__ */ React23.createElement("div", { className: "absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 flex flex-col items-center justify-center gap-4 text-prussian-blue-600 text-center p-4" }, /* @__PURE__ */ React23.createElement(ImageIcon, { size: 48, className: "text-prussian-blue-500" }), /* @__PURE__ */ React23.createElement("p", null, "\u56FE\u7247\u52A0\u8F7D\u5931\u8D25"), /* @__PURE__ */ React23.createElement(
|
|
328
330
|
Button,
|
|
329
331
|
{
|
|
330
332
|
onClick: retryImageLoad,
|
|
331
333
|
className: "bg-gradient-to-r from-moonstone to-cerulean hover:from-cerulean hover:to-moonstone text-white shadow-lg transition-all duration-300"
|
|
332
334
|
},
|
|
333
335
|
"\u91CD\u8BD5"
|
|
334
|
-
)), imageSrc && !imageError && /* @__PURE__ */
|
|
336
|
+
)), imageSrc && !imageError && /* @__PURE__ */ React23.createElement(
|
|
335
337
|
"img",
|
|
336
338
|
{
|
|
337
339
|
src: imageSrc,
|
|
@@ -341,7 +343,7 @@ var ArtworkViewer = ({
|
|
|
341
343
|
onLoad: handleImageLoad,
|
|
342
344
|
onError: handleImageError
|
|
343
345
|
}
|
|
344
|
-
), /* @__PURE__ */
|
|
346
|
+
), /* @__PURE__ */ React23.createElement(
|
|
345
347
|
Button,
|
|
346
348
|
{
|
|
347
349
|
onClick: onPrev,
|
|
@@ -351,8 +353,8 @@ var ArtworkViewer = ({
|
|
|
351
353
|
className: "absolute top-1/2 left-4 transform -translate-y-1/2 bg-white/95 backdrop-blur-sm shadow-lg hover:bg-moonstone-900/10 hover:scale-105 hover:shadow-xl disabled:opacity-40 z-10 rounded-full p-3 border-prussian-blue-200 hover:border-moonstone/40 md:left-3 sm:left-2",
|
|
352
354
|
"aria-label": "\u4E0A\u4E00\u5F20"
|
|
353
355
|
},
|
|
354
|
-
/* @__PURE__ */
|
|
355
|
-
), /* @__PURE__ */
|
|
356
|
+
/* @__PURE__ */ React23.createElement(ChevronLeft, { size: 24 })
|
|
357
|
+
), /* @__PURE__ */ React23.createElement(
|
|
356
358
|
Button,
|
|
357
359
|
{
|
|
358
360
|
onClick: onNext,
|
|
@@ -362,8 +364,8 @@ var ArtworkViewer = ({
|
|
|
362
364
|
className: "absolute top-1/2 right-4 transform -translate-y-1/2 bg-white/95 backdrop-blur-sm shadow-lg hover:bg-moonstone-900/10 hover:scale-105 hover:shadow-xl disabled:opacity-40 z-10 rounded-full p-3 border-prussian-blue-200 hover:border-moonstone/40 md:right-3 sm:right-2",
|
|
363
365
|
"aria-label": "\u4E0B\u4E00\u5F20"
|
|
364
366
|
},
|
|
365
|
-
/* @__PURE__ */
|
|
366
|
-
)), /* @__PURE__ */
|
|
367
|
+
/* @__PURE__ */ React23.createElement(ChevronRight, { size: 24 })
|
|
368
|
+
)), /* @__PURE__ */ React23.createElement("div", { className: "mt-6 w-full max-w-full box-border lg:mt-5 md:mt-5 sm:mt-4" }, /* @__PURE__ */ React23.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React23.createElement("h2", { className: "text-2xl font-bold text-rich-black leading-tight lg:text-xl md:text-xl sm:text-lg sm:leading-5" }, artwork.title), /* @__PURE__ */ React23.createElement("div", { className: "flex flex-wrap gap-2" }, /* @__PURE__ */ React23.createElement(Badge, { variant: "outline", className: "border-moonstone/30 text-cerulean bg-moonstone-900/5" }, "\u7F16\u53F7\uFF1A", artwork.number), artwork.createdTime && /* @__PURE__ */ React23.createElement(Badge, { variant: "outline", className: "border-moonstone/30 text-cerulean bg-moonstone-900/5" }, "\u521B\u4F5C\u65F6\u95F4\uFF1A", artwork.createdTime), artwork.theme && /* @__PURE__ */ React23.createElement(Badge, { variant: "outline", className: "border-moonstone/30 text-cerulean bg-moonstone-900/5" }, "\u4E3B\u9898\uFF1A", artwork.theme)), artwork.description && /* @__PURE__ */ React23.createElement("p", { className: "text-base text-prussian-blue-700 leading-relaxed sm:text-sm sm:leading-6" }, artwork.description)))));
|
|
367
369
|
};
|
|
368
370
|
var MobileAlbumViewer = ({
|
|
369
371
|
artworks,
|
|
@@ -520,9 +522,9 @@ var MobileAlbumViewer = ({
|
|
|
520
522
|
setShowThumbnails(false);
|
|
521
523
|
};
|
|
522
524
|
if (!currentArtwork) {
|
|
523
|
-
return /* @__PURE__ */
|
|
525
|
+
return /* @__PURE__ */ React23.createElement("div", { className: "flex items-center justify-center w-full h-full text-white" }, /* @__PURE__ */ React23.createElement("span", null, "\u6682\u65E0\u53EF\u5C55\u793A\u7684\u4F5C\u54C1"));
|
|
524
526
|
}
|
|
525
|
-
return /* @__PURE__ */
|
|
527
|
+
return /* @__PURE__ */ React23.createElement("div", { className: "relative w-full h-full bg-gradient-to-br from-rich-black to-oxford-blue" }, /* @__PURE__ */ React23.createElement(
|
|
526
528
|
"div",
|
|
527
529
|
{
|
|
528
530
|
ref: imageContainerRef,
|
|
@@ -531,8 +533,8 @@ var MobileAlbumViewer = ({
|
|
|
531
533
|
onTouchMove: handleTouchMove,
|
|
532
534
|
onTouchEnd: handleTouchEnd
|
|
533
535
|
},
|
|
534
|
-
imageLoading && /* @__PURE__ */
|
|
535
|
-
imageError && /* @__PURE__ */
|
|
536
|
+
imageLoading && /* @__PURE__ */ React23.createElement("div", { className: "absolute inset-0 flex items-center justify-center bg-rich-black/50" }, /* @__PURE__ */ React23.createElement("div", { className: "flex flex-col items-center gap-4 text-white" }, /* @__PURE__ */ React23.createElement("div", { className: "w-10 h-10 border-[3px] border-prussian-blue-300 border-t-moonstone rounded-full animate-spin" }), /* @__PURE__ */ React23.createElement("p", null, "\u52A0\u8F7D\u4E2D..."))),
|
|
537
|
+
imageError && /* @__PURE__ */ React23.createElement("div", { className: "absolute inset-0 flex items-center justify-center bg-rich-black/50" }, /* @__PURE__ */ React23.createElement("div", { className: "flex flex-col items-center gap-4 text-white text-center p-4" }, /* @__PURE__ */ React23.createElement(ImageIcon, { size: 48, className: "text-moonstone" }), /* @__PURE__ */ React23.createElement("p", null, "\u56FE\u7247\u52A0\u8F7D\u5931\u8D25"), /* @__PURE__ */ React23.createElement(
|
|
536
538
|
Button,
|
|
537
539
|
{
|
|
538
540
|
onClick: retryImageLoad,
|
|
@@ -540,7 +542,7 @@ var MobileAlbumViewer = ({
|
|
|
540
542
|
},
|
|
541
543
|
"\u91CD\u8BD5"
|
|
542
544
|
))),
|
|
543
|
-
imageSrc && !imageError && /* @__PURE__ */
|
|
545
|
+
imageSrc && !imageError && /* @__PURE__ */ React23.createElement(
|
|
544
546
|
"img",
|
|
545
547
|
{
|
|
546
548
|
src: imageSrc,
|
|
@@ -555,7 +557,7 @@ var MobileAlbumViewer = ({
|
|
|
555
557
|
onError: handleImageError
|
|
556
558
|
}
|
|
557
559
|
),
|
|
558
|
-
/* @__PURE__ */
|
|
560
|
+
/* @__PURE__ */ React23.createElement(
|
|
559
561
|
Button,
|
|
560
562
|
{
|
|
561
563
|
onClick: onPrev,
|
|
@@ -565,9 +567,9 @@ var MobileAlbumViewer = ({
|
|
|
565
567
|
className: "absolute top-1/2 left-4 transform -translate-y-1/2 bg-rich-black/70 backdrop-blur-sm text-white border-moonstone/30 hover:bg-oxford-blue/80 disabled:opacity-40 z-10 rounded-full w-12 h-12 shadow-lg",
|
|
566
568
|
"aria-label": "\u4E0A\u4E00\u5F20"
|
|
567
569
|
},
|
|
568
|
-
/* @__PURE__ */
|
|
570
|
+
/* @__PURE__ */ React23.createElement(ChevronLeft, { size: 24 })
|
|
569
571
|
),
|
|
570
|
-
/* @__PURE__ */
|
|
572
|
+
/* @__PURE__ */ React23.createElement(
|
|
571
573
|
Button,
|
|
572
574
|
{
|
|
573
575
|
onClick: onNext,
|
|
@@ -577,9 +579,9 @@ var MobileAlbumViewer = ({
|
|
|
577
579
|
className: "absolute top-1/2 right-4 transform -translate-y-1/2 bg-rich-black/70 backdrop-blur-sm text-white border-moonstone/30 hover:bg-oxford-blue/80 disabled:opacity-40 z-10 rounded-full w-12 h-12 shadow-lg",
|
|
578
580
|
"aria-label": "\u4E0B\u4E00\u5F20"
|
|
579
581
|
},
|
|
580
|
-
/* @__PURE__ */
|
|
582
|
+
/* @__PURE__ */ React23.createElement(ChevronRight, { size: 24 })
|
|
581
583
|
),
|
|
582
|
-
/* @__PURE__ */
|
|
584
|
+
/* @__PURE__ */ React23.createElement("div", { className: "absolute top-0 left-0 right-0 bg-gradient-to-b from-rich-black/80 via-oxford-blue/40 to-transparent p-4 z-20" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center justify-between text-white" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React23.createElement(Badge, { variant: "secondary", className: "bg-moonstone/30 text-white border-moonstone/50 backdrop-blur-sm" }, currentIndex + 1, " / ", artworks.length)), /* @__PURE__ */ React23.createElement(
|
|
583
585
|
Button,
|
|
584
586
|
{
|
|
585
587
|
onClick: toggleThumbnails,
|
|
@@ -588,10 +590,10 @@ var MobileAlbumViewer = ({
|
|
|
588
590
|
className: "text-white hover:bg-moonstone/30 rounded-full w-10 h-10 backdrop-blur-sm",
|
|
589
591
|
"aria-label": "\u663E\u793A\u7F29\u7565\u56FE"
|
|
590
592
|
},
|
|
591
|
-
/* @__PURE__ */
|
|
593
|
+
/* @__PURE__ */ React23.createElement(Grid3x3, { size: 20 })
|
|
592
594
|
))),
|
|
593
|
-
/* @__PURE__ */
|
|
594
|
-
), showThumbnails && /* @__PURE__ */
|
|
595
|
+
/* @__PURE__ */ React23.createElement("div", { className: "absolute bottom-0 left-0 right-0 bg-gradient-to-t from-rich-black/80 via-oxford-blue/40 to-transparent p-4 z-20" }, /* @__PURE__ */ React23.createElement("div", { className: "text-white" }, /* @__PURE__ */ React23.createElement("h2", { className: "text-xl font-bold mb-2" }, currentArtwork.title), /* @__PURE__ */ React23.createElement("div", { className: "flex flex-wrap gap-2 mb-2" }, /* @__PURE__ */ React23.createElement(Badge, { variant: "secondary", className: "bg-moonstone/30 text-white border-moonstone/50 backdrop-blur-sm" }, "\u7F16\u53F7\uFF1A", currentArtwork.number), currentArtwork.createdTime && /* @__PURE__ */ React23.createElement(Badge, { variant: "secondary", className: "bg-moonstone/30 text-white border-moonstone/50 backdrop-blur-sm" }, "\u521B\u4F5C\u65F6\u95F4\uFF1A", currentArtwork.createdTime), currentArtwork.theme && /* @__PURE__ */ React23.createElement(Badge, { variant: "secondary", className: "bg-moonstone/30 text-white border-moonstone/50 backdrop-blur-sm" }, "\u4E3B\u9898\uFF1A", currentArtwork.theme)), currentArtwork.description && /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-white/90 leading-relaxed" }, currentArtwork.description)))
|
|
596
|
+
), showThumbnails && /* @__PURE__ */ React23.createElement("div", { className: "absolute inset-0 bg-gradient-to-br from-rich-black/95 to-oxford-blue/90 backdrop-blur-sm z-30 flex flex-col" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center justify-between p-4 border-b border-moonstone/30" }, /* @__PURE__ */ React23.createElement("h3", { className: "text-white text-lg font-semibold" }, "\u9009\u62E9\u56FE\u7247"), /* @__PURE__ */ React23.createElement(
|
|
595
597
|
Button,
|
|
596
598
|
{
|
|
597
599
|
onClick: () => setShowThumbnails(false),
|
|
@@ -599,21 +601,21 @@ var MobileAlbumViewer = ({
|
|
|
599
601
|
variant: "ghost",
|
|
600
602
|
className: "text-white hover:bg-moonstone/30 rounded-full"
|
|
601
603
|
},
|
|
602
|
-
/* @__PURE__ */
|
|
603
|
-
)), /* @__PURE__ */
|
|
604
|
+
/* @__PURE__ */ React23.createElement(X, { size: 20 })
|
|
605
|
+
)), /* @__PURE__ */ React23.createElement(
|
|
604
606
|
"div",
|
|
605
607
|
{
|
|
606
608
|
ref: thumbnailsRef,
|
|
607
609
|
className: "flex-1 p-4 overflow-y-auto grid grid-cols-3 sm:grid-cols-4 md:grid-cols-5 lg:grid-cols-6 gap-2 content-start"
|
|
608
610
|
},
|
|
609
|
-
artworks.map((artwork, index) => /* @__PURE__ */
|
|
611
|
+
artworks.map((artwork, index) => /* @__PURE__ */ React23.createElement(
|
|
610
612
|
"button",
|
|
611
613
|
{
|
|
612
614
|
key: artwork.id,
|
|
613
615
|
onClick: () => selectThumbnail(index),
|
|
614
616
|
className: `relative aspect-square rounded-lg overflow-hidden border-2 transition-all ${index === currentIndex ? "border-moonstone scale-95 shadow-lg shadow-moonstone/30" : "border-prussian-blue-300/30 hover:border-moonstone/50"}`
|
|
615
617
|
},
|
|
616
|
-
/* @__PURE__ */
|
|
618
|
+
/* @__PURE__ */ React23.createElement(
|
|
617
619
|
"img",
|
|
618
620
|
{
|
|
619
621
|
src: artwork.image || `/api/showmasterpiece/collections/${collectionId}/artworks/${artwork.id}/image`,
|
|
@@ -621,8 +623,8 @@ var MobileAlbumViewer = ({
|
|
|
621
623
|
className: "w-full h-full object-cover"
|
|
622
624
|
}
|
|
623
625
|
),
|
|
624
|
-
index === currentIndex && /* @__PURE__ */
|
|
625
|
-
/* @__PURE__ */
|
|
626
|
+
index === currentIndex && /* @__PURE__ */ React23.createElement("div", { className: "absolute inset-0 bg-moonstone/20 flex items-center justify-center" }, /* @__PURE__ */ React23.createElement("div", { className: "w-6 h-6 bg-moonstone rounded-full flex items-center justify-center shadow-lg" }, /* @__PURE__ */ React23.createElement("div", { className: "w-2 h-2 bg-white rounded-full" }))),
|
|
627
|
+
/* @__PURE__ */ React23.createElement("div", { className: "absolute bottom-0 left-0 right-0 bg-gradient-to-t from-rich-black/80 to-transparent p-1" }, /* @__PURE__ */ React23.createElement("div", { className: "text-white text-xs text-center truncate" }, index + 1))
|
|
626
628
|
))
|
|
627
629
|
)));
|
|
628
630
|
};
|
|
@@ -688,7 +690,7 @@ var ThumbnailItem = ({ page, index, isActive, onSelect }) => {
|
|
|
688
690
|
setImageLoading(false);
|
|
689
691
|
setImageError(true);
|
|
690
692
|
};
|
|
691
|
-
return /* @__PURE__ */
|
|
693
|
+
return /* @__PURE__ */ React23.createElement(
|
|
692
694
|
"button",
|
|
693
695
|
{
|
|
694
696
|
id: `thumbnail-${page.id}`,
|
|
@@ -696,7 +698,7 @@ var ThumbnailItem = ({ page, index, isActive, onSelect }) => {
|
|
|
696
698
|
className: `w-full p-2 border-2 border-prussian-blue-200/30 rounded-lg bg-gradient-to-br from-white to-prussian-blue-900/5 cursor-pointer transition-all duration-200 min-h-[44px] flex items-center justify-center hover:border-moonstone/40 hover:bg-moonstone-900/10 focus:outline-none focus:ring-2 focus:ring-moonstone focus:ring-offset-2 lg:flex-shrink-0 lg:min-w-[220px] lg:max-w-[220px] lg:p-3.5 md:min-w-[200px] md:max-w-[200px] md:p-3 md:min-h-12 sm:min-w-[180px] sm:max-w-[180px] sm:p-2.5 sm:rounded-md ${isActive ? "border-moonstone bg-moonstone-900/10 shadow-lg shadow-moonstone/20" : ""}`,
|
|
697
699
|
"aria-label": `\u67E5\u770B\u7B2C ${index + 1} \u9875\uFF1A${page.title}`
|
|
698
700
|
},
|
|
699
|
-
/* @__PURE__ */
|
|
701
|
+
/* @__PURE__ */ React23.createElement("div", { className: "relative w-16 h-20 flex items-center justify-center bg-gradient-to-br from-prussian-blue-900/5 to-oxford-blue-100/10 rounded border border-prussian-blue-200/20 overflow-hidden flex-shrink-0 lg:w-11 lg:h-15 md:w-10 md:h-14 sm:w-9 sm:h-13 sm:rounded-sm" }, imageLoading && /* @__PURE__ */ React23.createElement("div", { className: "absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 flex items-center justify-center" }, /* @__PURE__ */ React23.createElement("div", { className: "w-4 h-4 border border-prussian-blue-300 border-t-moonstone rounded-full animate-spin" })), imageError && /* @__PURE__ */ React23.createElement("div", { className: "absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 flex items-center justify-center text-prussian-blue-400 text-xs" }, /* @__PURE__ */ React23.createElement(ImageIcon, { size: 20 })), imageSrc && !imageError && /* @__PURE__ */ React23.createElement(
|
|
700
702
|
"img",
|
|
701
703
|
{
|
|
702
704
|
src: imageSrc,
|
|
@@ -706,7 +708,7 @@ var ThumbnailItem = ({ page, index, isActive, onSelect }) => {
|
|
|
706
708
|
onError: handleImageError
|
|
707
709
|
}
|
|
708
710
|
)),
|
|
709
|
-
/* @__PURE__ */
|
|
711
|
+
/* @__PURE__ */ React23.createElement("div", { className: "text-left flex-1 min-w-0 lg:flex lg:flex-col lg:gap-1 lg:ml-3.5 md:ml-3 sm:ml-2.5" }, /* @__PURE__ */ React23.createElement("h4", { className: "font-medium text-sm text-rich-black mb-1 overflow-hidden text-ellipsis whitespace-nowrap leading-tight lg:text-xs md:text-xs sm:text-xs sm:mb-0.5" }, page.title), /* @__PURE__ */ React23.createElement("p", { className: "text-xs text-prussian-blue-600 mb-0 overflow-hidden text-ellipsis whitespace-nowrap lg:text-xs md:text-xs sm:text-xs" }, page.number))
|
|
710
712
|
);
|
|
711
713
|
};
|
|
712
714
|
var ThumbnailSidebar = ({
|
|
@@ -714,7 +716,7 @@ var ThumbnailSidebar = ({
|
|
|
714
716
|
currentPage,
|
|
715
717
|
onPageSelect
|
|
716
718
|
}) => {
|
|
717
|
-
return /* @__PURE__ */
|
|
719
|
+
return /* @__PURE__ */ React23.createElement("div", { className: "bg-gradient-to-br from-white to-prussian-blue-900/5 rounded-2xl shadow-2xl border border-prussian-blue-200/30 p-6 w-full max-w-full box-border mb-0 lg:p-5 lg:mb-4 md:p-4 md:mb-4 md:rounded-xl sm:p-3.5 sm:rounded-xl" }, /* @__PURE__ */ React23.createElement("div", { className: "flex justify-between items-center mb-4 lg:mb-3.5 md:mb-3 sm:mb-2.5" }, /* @__PURE__ */ React23.createElement("h3", { className: "text-lg font-semibold text-rich-black mb-0 leading-tight lg:text-base md:text-base sm:text-sm" }, "\u4F5C\u54C1\u5217\u8868"), /* @__PURE__ */ React23.createElement("span", { className: "text-sm text-cerulean font-medium lg:text-sm md:text-sm sm:text-xs" }, currentPage + 1, " / ", pages.length)), /* @__PURE__ */ React23.createElement("div", { className: "flex flex-col gap-3 max-h-[600px] overflow-y-auto scrollbar-thin scrollbar-thumb-moonstone/50 scrollbar-track-prussian-blue-100/30 lg:flex-row lg:gap-4 lg:max-h-none lg:overflow-x-auto lg:overflow-y-hidden lg:pb-2.5 lg:scroll-snap-x lg:scroll-smooth md:gap-3.5 md:pb-2 sm:gap-2.5 sm:pb-1.5" }, pages.map((page, index) => /* @__PURE__ */ React23.createElement(
|
|
718
720
|
ThumbnailItem,
|
|
719
721
|
{
|
|
720
722
|
key: page.id,
|
|
@@ -1242,7 +1244,7 @@ async function refreshFileServiceConfig() {
|
|
|
1242
1244
|
const ossConfig = config?.storageProviders?.["aliyun-oss"];
|
|
1243
1245
|
if (ossConfig && ossConfig.enabled) {
|
|
1244
1246
|
console.log("\u{1F504} [ShowMasterpiece] \u91CD\u65B0\u521D\u59CB\u5316OSS Provider\u4EE5\u5E94\u7528\u65B0\u914D\u7F6E");
|
|
1245
|
-
const { UniversalFileService } = await import('./UniversalFileService-
|
|
1247
|
+
const { UniversalFileService } = await import('./UniversalFileService-O3IEROBN.mjs');
|
|
1246
1248
|
const fileService = new UniversalFileService(config);
|
|
1247
1249
|
await fileService.initialize();
|
|
1248
1250
|
await fileService.reinitializeStorageProviders?.();
|
|
@@ -1573,7 +1575,7 @@ function CollectionOrderManagerV2({
|
|
|
1573
1575
|
}
|
|
1574
1576
|
};
|
|
1575
1577
|
const renderCollection = (collection, index, isFirst, isLast) => {
|
|
1576
|
-
return /* @__PURE__ */
|
|
1578
|
+
return /* @__PURE__ */ React23.createElement("div", { style: { display: "flex", alignItems: "center", gap: "12px", flex: 1 } }, /* @__PURE__ */ React23.createElement(
|
|
1577
1579
|
"img",
|
|
1578
1580
|
{
|
|
1579
1581
|
src: collection.coverImage || "/placeholder-image.png",
|
|
@@ -1586,7 +1588,7 @@ function CollectionOrderManagerV2({
|
|
|
1586
1588
|
border: "1px solid #e5e7eb"
|
|
1587
1589
|
}
|
|
1588
1590
|
}
|
|
1589
|
-
), /* @__PURE__ */
|
|
1591
|
+
), /* @__PURE__ */ React23.createElement("div", { style: { flex: 1, minWidth: 0 } }, /* @__PURE__ */ React23.createElement("h4", { style: {
|
|
1590
1592
|
margin: "0 0 4px 0",
|
|
1591
1593
|
color: "#1f2937",
|
|
1592
1594
|
fontSize: "16px",
|
|
@@ -1594,14 +1596,14 @@ function CollectionOrderManagerV2({
|
|
|
1594
1596
|
whiteSpace: "nowrap",
|
|
1595
1597
|
overflow: "hidden",
|
|
1596
1598
|
textOverflow: "ellipsis"
|
|
1597
|
-
} }, collection.title), /* @__PURE__ */
|
|
1599
|
+
} }, collection.title), /* @__PURE__ */ React23.createElement("p", { style: {
|
|
1598
1600
|
fontSize: 13,
|
|
1599
1601
|
color: "#64748b",
|
|
1600
1602
|
marginBottom: 2,
|
|
1601
1603
|
whiteSpace: "nowrap",
|
|
1602
1604
|
overflow: "hidden",
|
|
1603
1605
|
textOverflow: "ellipsis"
|
|
1604
|
-
} }, "\u7F16\u53F7\uFF1A", collection.number), collection.category && /* @__PURE__ */
|
|
1606
|
+
} }, "\u7F16\u53F7\uFF1A", collection.number), collection.category && /* @__PURE__ */ React23.createElement("span", { style: {
|
|
1605
1607
|
display: "inline-block",
|
|
1606
1608
|
padding: "2px 8px",
|
|
1607
1609
|
background: "#dbeafe",
|
|
@@ -1611,7 +1613,7 @@ function CollectionOrderManagerV2({
|
|
|
1611
1613
|
borderRadius: "12px"
|
|
1612
1614
|
} }, collection.category)));
|
|
1613
1615
|
};
|
|
1614
|
-
return /* @__PURE__ */
|
|
1616
|
+
return /* @__PURE__ */ React23.createElement(
|
|
1615
1617
|
GenericOrderManager,
|
|
1616
1618
|
{
|
|
1617
1619
|
operations,
|
|
@@ -1680,7 +1682,7 @@ function ArtworkOrderManagerV2({
|
|
|
1680
1682
|
}
|
|
1681
1683
|
};
|
|
1682
1684
|
const renderArtwork = (artwork, index, isFirst, isLast) => {
|
|
1683
|
-
return /* @__PURE__ */
|
|
1685
|
+
return /* @__PURE__ */ React23.createElement("div", { style: { display: "flex", alignItems: "center", gap: "12px", flex: 1 } }, /* @__PURE__ */ React23.createElement("div", { style: {
|
|
1684
1686
|
display: "flex",
|
|
1685
1687
|
alignItems: "center",
|
|
1686
1688
|
justifyContent: "center",
|
|
@@ -1691,7 +1693,7 @@ function ArtworkOrderManagerV2({
|
|
|
1691
1693
|
overflow: "hidden",
|
|
1692
1694
|
background: "#f9fafb",
|
|
1693
1695
|
flexShrink: 0
|
|
1694
|
-
} }, artwork.image ? /* @__PURE__ */
|
|
1696
|
+
} }, artwork.image ? /* @__PURE__ */ React23.createElement(
|
|
1695
1697
|
"img",
|
|
1696
1698
|
{
|
|
1697
1699
|
src: artwork.image,
|
|
@@ -1710,7 +1712,7 @@ function ArtworkOrderManagerV2({
|
|
|
1710
1712
|
}
|
|
1711
1713
|
}
|
|
1712
1714
|
}
|
|
1713
|
-
) : /* @__PURE__ */
|
|
1715
|
+
) : /* @__PURE__ */ React23.createElement("div", { style: {
|
|
1714
1716
|
display: "flex",
|
|
1715
1717
|
alignItems: "center",
|
|
1716
1718
|
justifyContent: "center",
|
|
@@ -1718,7 +1720,7 @@ function ArtworkOrderManagerV2({
|
|
|
1718
1720
|
height: "100%",
|
|
1719
1721
|
color: "#9ca3af",
|
|
1720
1722
|
background: "#f3f4f6"
|
|
1721
|
-
} }, /* @__PURE__ */
|
|
1723
|
+
} }, /* @__PURE__ */ React23.createElement(Image, { size: 24 })), /* @__PURE__ */ React23.createElement("div", { className: "placeholder", style: {
|
|
1722
1724
|
display: "none",
|
|
1723
1725
|
alignItems: "center",
|
|
1724
1726
|
justifyContent: "center",
|
|
@@ -1726,7 +1728,7 @@ function ArtworkOrderManagerV2({
|
|
|
1726
1728
|
height: "100%",
|
|
1727
1729
|
color: "#9ca3af",
|
|
1728
1730
|
background: "#f3f4f6"
|
|
1729
|
-
} }, /* @__PURE__ */
|
|
1731
|
+
} }, /* @__PURE__ */ React23.createElement(Image, { size: 24 }))), /* @__PURE__ */ React23.createElement("div", { style: { flex: 1, minWidth: 0 } }, /* @__PURE__ */ React23.createElement("h4", { style: {
|
|
1730
1732
|
margin: "0 0 4px 0",
|
|
1731
1733
|
color: "#1f2937",
|
|
1732
1734
|
fontSize: "16px",
|
|
@@ -1735,21 +1737,21 @@ function ArtworkOrderManagerV2({
|
|
|
1735
1737
|
whiteSpace: "nowrap",
|
|
1736
1738
|
overflow: "hidden",
|
|
1737
1739
|
textOverflow: "ellipsis"
|
|
1738
|
-
} }, artwork.title), /* @__PURE__ */
|
|
1740
|
+
} }, artwork.title), /* @__PURE__ */ React23.createElement("p", { style: {
|
|
1739
1741
|
margin: "0 0 4px 0",
|
|
1740
1742
|
color: "#6b7280",
|
|
1741
1743
|
fontSize: "14px",
|
|
1742
1744
|
whiteSpace: "nowrap",
|
|
1743
1745
|
overflow: "hidden",
|
|
1744
1746
|
textOverflow: "ellipsis"
|
|
1745
|
-
} }, "\u7F16\u53F7\uFF1A", artwork.number), artwork.createdTime && /* @__PURE__ */
|
|
1747
|
+
} }, "\u7F16\u53F7\uFF1A", artwork.number), artwork.createdTime && /* @__PURE__ */ React23.createElement("p", { style: {
|
|
1746
1748
|
margin: "0 0 4px 0",
|
|
1747
1749
|
color: "#6b7280",
|
|
1748
1750
|
fontSize: "14px",
|
|
1749
1751
|
whiteSpace: "nowrap",
|
|
1750
1752
|
overflow: "hidden",
|
|
1751
1753
|
textOverflow: "ellipsis"
|
|
1752
|
-
} }, "\u521B\u4F5C\u65F6\u95F4\uFF1A", artwork.createdTime), artwork.theme && /* @__PURE__ */
|
|
1754
|
+
} }, "\u521B\u4F5C\u65F6\u95F4\uFF1A", artwork.createdTime), artwork.theme && /* @__PURE__ */ React23.createElement("span", { style: {
|
|
1753
1755
|
display: "inline-block",
|
|
1754
1756
|
background: "#dbeafe",
|
|
1755
1757
|
color: "#1d4ed8",
|
|
@@ -1759,7 +1761,7 @@ function ArtworkOrderManagerV2({
|
|
|
1759
1761
|
marginRight: "6px"
|
|
1760
1762
|
} }, artwork.theme)));
|
|
1761
1763
|
};
|
|
1762
|
-
return /* @__PURE__ */
|
|
1764
|
+
return /* @__PURE__ */ React23.createElement(
|
|
1763
1765
|
GenericOrderManager,
|
|
1764
1766
|
{
|
|
1765
1767
|
operations,
|
|
@@ -1838,14 +1840,14 @@ var UniversalImageUpload = ({
|
|
|
1838
1840
|
};
|
|
1839
1841
|
const handleDivClick = (e) => {
|
|
1840
1842
|
};
|
|
1841
|
-
return /* @__PURE__ */
|
|
1843
|
+
return /* @__PURE__ */ React23.createElement(
|
|
1842
1844
|
"div",
|
|
1843
1845
|
{
|
|
1844
1846
|
className: "border-2 border-dashed border-slate-300 rounded-xl p-8 text-center hover:border-blue-400 hover:bg-slate-50 transition-all duration-200 cursor-pointer",
|
|
1845
1847
|
onClick: handleDivClick,
|
|
1846
1848
|
style: { position: "relative", zIndex: 1 }
|
|
1847
1849
|
},
|
|
1848
|
-
/* @__PURE__ */
|
|
1850
|
+
/* @__PURE__ */ React23.createElement(
|
|
1849
1851
|
"input",
|
|
1850
1852
|
{
|
|
1851
1853
|
type: "file",
|
|
@@ -1865,7 +1867,7 @@ var UniversalImageUpload = ({
|
|
|
1865
1867
|
}
|
|
1866
1868
|
}
|
|
1867
1869
|
),
|
|
1868
|
-
/* @__PURE__ */
|
|
1870
|
+
/* @__PURE__ */ React23.createElement("div", { className: "text-slate-500 pointer-events-none" }, uploading ? /* @__PURE__ */ React23.createElement(React23.Fragment, null, /* @__PURE__ */ React23.createElement("div", { className: "animate-spin w-10 h-10 border-3 border-blue-500 border-t-transparent rounded-full mx-auto mb-3" }), /* @__PURE__ */ React23.createElement("p", { className: "text-sm font-medium" }, "\u6B63\u5728\u4E0A\u4F20\u5230\u4E91\u5B58\u50A8...")) : /* @__PURE__ */ React23.createElement(React23.Fragment, null, /* @__PURE__ */ React23.createElement("svg", { className: "w-16 h-16 mx-auto mb-4 text-slate-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React23.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12" })), /* @__PURE__ */ React23.createElement("p", { className: "text-lg font-semibold text-slate-700 mb-2" }, placeholder), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-600 mb-1" }, "\u652F\u6301 JPG\u3001PNG\u3001GIF\u3001WebP \u683C\u5F0F"), /* @__PURE__ */ React23.createElement("p", { className: "text-xs text-blue-600" }, "\u81EA\u52A8\u4E0A\u4F20\u5230\u4E91\u5B58\u50A8\uFF0C\u4EAB\u53D7CDN\u52A0\u901F")))
|
|
1869
1871
|
);
|
|
1870
1872
|
};
|
|
1871
1873
|
const renderPreview = () => {
|
|
@@ -1873,7 +1875,7 @@ var UniversalImageUpload = ({
|
|
|
1873
1875
|
return null;
|
|
1874
1876
|
}
|
|
1875
1877
|
const imageUrl = value || (fileId ? `/api/universal-file/${fileId}` : "");
|
|
1876
|
-
return /* @__PURE__ */
|
|
1878
|
+
return /* @__PURE__ */ React23.createElement("div", { className: "mt-4" }, /* @__PURE__ */ React23.createElement("div", { className: "relative inline-block group" }, /* @__PURE__ */ React23.createElement(
|
|
1877
1879
|
"img",
|
|
1878
1880
|
{
|
|
1879
1881
|
src: imageUrl,
|
|
@@ -1883,7 +1885,7 @@ var UniversalImageUpload = ({
|
|
|
1883
1885
|
e.currentTarget.style.display = "none";
|
|
1884
1886
|
}
|
|
1885
1887
|
}
|
|
1886
|
-
), /* @__PURE__ */
|
|
1888
|
+
), /* @__PURE__ */ React23.createElement(
|
|
1887
1889
|
"button",
|
|
1888
1890
|
{
|
|
1889
1891
|
type: "button",
|
|
@@ -1891,10 +1893,10 @@ var UniversalImageUpload = ({
|
|
|
1891
1893
|
className: "absolute -top-3 -right-3 bg-red-500 text-white rounded-full w-7 h-7 flex items-center justify-center hover:bg-red-600 transition-colors shadow-lg opacity-0 group-hover:opacity-100",
|
|
1892
1894
|
title: "\u5220\u9664\u56FE\u7247"
|
|
1893
1895
|
},
|
|
1894
|
-
/* @__PURE__ */
|
|
1896
|
+
/* @__PURE__ */ React23.createElement("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React23.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }))
|
|
1895
1897
|
)));
|
|
1896
1898
|
};
|
|
1897
|
-
return /* @__PURE__ */
|
|
1899
|
+
return /* @__PURE__ */ React23.createElement("div", { className }, label && /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-3" }, label), fileId && /* @__PURE__ */ React23.createElement("div", { className: "mb-3 p-3 bg-emerald-50 border border-emerald-200 rounded-lg text-sm text-emerald-700" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React23.createElement("svg", { className: "w-4 h-4", fill: "currentColor", viewBox: "0 0 20 20" }, /* @__PURE__ */ React23.createElement("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", clipRule: "evenodd" })), /* @__PURE__ */ React23.createElement("span", null, "\u56FE\u7247\u5DF2\u4E0A\u4F20\u5230\u4E91\u5B58\u50A8"))), renderUploadArea(), renderPreview(), /* @__PURE__ */ React23.createElement("div", { className: "mt-3 text-xs text-slate-500" }, businessType === "cover" ? "\u5C01\u9762\u56FE\u7247" : "\u4F5C\u54C1\u56FE\u7247", "\u5C06\u81EA\u52A8\u4E0A\u4F20\u5230\u4E91\u5B58\u50A8\u5E76\u901A\u8FC7CDN\u5206\u53D1\uFF0C\u63D0\u4F9B\u66F4\u597D\u7684\u6027\u80FD\u548C\u7528\u6237\u4F53\u9A8C"));
|
|
1898
1900
|
};
|
|
1899
1901
|
|
|
1900
1902
|
// src/showmasterpiece/ui/web/components/CartPage.tsx
|
|
@@ -2040,7 +2042,7 @@ var CartPage = ({ userId, onClose }) => {
|
|
|
2040
2042
|
}
|
|
2041
2043
|
};
|
|
2042
2044
|
if (checkoutSuccess) {
|
|
2043
|
-
return /* @__PURE__ */
|
|
2045
|
+
return /* @__PURE__ */ React23.createElement("div", { className: "max-w-2xl mx-auto p-6" }, /* @__PURE__ */ React23.createElement("div", { className: "text-center" }, /* @__PURE__ */ React23.createElement("div", { className: "text-green-500 text-6xl mb-4" }, "\u2705"), /* @__PURE__ */ React23.createElement("h2", { className: "text-2xl font-bold text-gray-900 mb-4" }, "\u6279\u91CF\u9884\u8BA2\u63D0\u4EA4\u6210\u529F\uFF01"), /* @__PURE__ */ React23.createElement("p", { className: "text-gray-600 mb-6" }, "\u60A8\u7684\u6279\u91CF\u9884\u8BA2\u5DF2\u6210\u529F\u63D0\u4EA4\uFF0C\u6211\u4EEC\u4F1A\u5C3D\u5FEB\u4E0E\u60A8\u8054\u7CFB\u786E\u8BA4\u3002"), /* @__PURE__ */ React23.createElement(
|
|
2044
2046
|
"button",
|
|
2045
2047
|
{
|
|
2046
2048
|
onClick: handleContinueShopping,
|
|
@@ -2049,45 +2051,45 @@ var CartPage = ({ userId, onClose }) => {
|
|
|
2049
2051
|
"\u7EE7\u7EED\u8D2D\u7269"
|
|
2050
2052
|
)));
|
|
2051
2053
|
}
|
|
2052
|
-
return /* @__PURE__ */
|
|
2054
|
+
return /* @__PURE__ */ React23.createElement("div", { className: "max-w-4xl mx-auto p-3 sm:p-6" }, /* @__PURE__ */ React23.createElement("div", { className: "text-center mb-6 sm:mb-8" }, /* @__PURE__ */ React23.createElement("h1", { className: "text-2xl sm:text-3xl font-bold text-gray-900 mb-2" }, "\u8D2D\u7269\u8F66"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm sm:text-base text-gray-600" }, "\u7BA1\u7406\u60A8\u9009\u62E9\u7684\u8C37\u5B50\uFF0C\u786E\u8BA4\u540E\u6279\u91CF\u9884\u8BA2")), error && /* @__PURE__ */ React23.createElement("div", { className: "bg-red-50 border border-red-200 rounded-lg p-3 sm:p-4 mb-4 sm:mb-6" }, /* @__PURE__ */ React23.createElement("div", { className: "flex" }, /* @__PURE__ */ React23.createElement("div", { className: "text-red-400 mr-3 flex-shrink-0" }, /* @__PURE__ */ React23.createElement("svg", { className: "w-5 h-5", fill: "currentColor", viewBox: "0 0 20 20" }, /* @__PURE__ */ React23.createElement("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z", clipRule: "evenodd" }))), /* @__PURE__ */ React23.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React23.createElement("h3", { className: "text-sm font-medium text-red-800" }, "\u64CD\u4F5C\u5931\u8D25"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-red-700 mt-1 break-words" }, error)))), cart.items.length === 0 && !loading && /* @__PURE__ */ React23.createElement("div", { className: "text-center py-8 sm:py-12" }, /* @__PURE__ */ React23.createElement(ShoppingBag, { className: "w-12 h-12 sm:w-16 sm:h-16 text-gray-400 mx-auto mb-4" }), /* @__PURE__ */ React23.createElement("h3", { className: "text-base sm:text-lg font-medium text-gray-900 mb-2" }, "\u8D2D\u7269\u8F66\u4E3A\u7A7A"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm sm:text-base text-gray-600 mb-6" }, "\u60A8\u8FD8\u6CA1\u6709\u6DFB\u52A0\u4EFB\u4F55\u8C37\u5B50\u5230\u8D2D\u7269\u8F66"), /* @__PURE__ */ React23.createElement(
|
|
2053
2055
|
"button",
|
|
2054
2056
|
{
|
|
2055
2057
|
onClick: onClose,
|
|
2056
2058
|
className: "bg-blue-600 text-white px-4 py-3 sm:py-2 rounded-lg hover:bg-blue-700 transition-colors text-base"
|
|
2057
2059
|
},
|
|
2058
2060
|
"\u7EE7\u7EED\u6D4F\u89C8\u8C37\u5B50"
|
|
2059
|
-
)), cart.items.length > 0 && /* @__PURE__ */
|
|
2061
|
+
)), cart.items.length > 0 && /* @__PURE__ */ React23.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-sm border" }, cart.items.map((item) => /* @__PURE__ */ React23.createElement("div", { key: item.collectionId, className: "flex flex-col sm:flex-row items-start sm:items-center p-3 sm:p-4 border-b last:border-b-0 gap-3 sm:gap-4" }, item.collection.coverImage ? /* @__PURE__ */ React23.createElement(
|
|
2060
2062
|
"img",
|
|
2061
2063
|
{
|
|
2062
2064
|
src: item.collection.coverImage,
|
|
2063
2065
|
alt: item.collection.title,
|
|
2064
2066
|
className: "w-16 h-16 sm:w-16 sm:h-16 object-cover rounded-md flex-shrink-0"
|
|
2065
2067
|
}
|
|
2066
|
-
) : /* @__PURE__ */
|
|
2068
|
+
) : /* @__PURE__ */ React23.createElement("div", { className: "w-16 h-16 sm:w-16 sm:h-16 bg-gray-100 rounded-md flex-shrink-0 flex items-center justify-center text-gray-400 text-xs" }, "\u6682\u65E0\u56FE\u7247"), /* @__PURE__ */ React23.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ React23.createElement("h3", { className: "font-semibold text-gray-900 text-sm sm:text-base line-clamp-2" }, item.collection.title), /* @__PURE__ */ React23.createElement("p", { className: "text-xs sm:text-sm text-gray-600" }, "\u7F16\u53F7\uFF1A", item.collection.number), /* @__PURE__ */ React23.createElement("p", { className: "text-xs sm:text-sm text-gray-600" }, "\u4EF7\u683C\uFF1A", item.collection.price ? `\xA5${item.collection.price}` : "\u4EF7\u683C\u5F85\u5B9A")), /* @__PURE__ */ React23.createElement("div", { className: "flex flex-col sm:flex-row items-center gap-2 sm:gap-4 w-full sm:w-auto" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center space-x-2" }, /* @__PURE__ */ React23.createElement(
|
|
2067
2069
|
"button",
|
|
2068
2070
|
{
|
|
2069
2071
|
onClick: () => updateCartItem2({ collectionId: item.collectionId, quantity: item.quantity - 1 }),
|
|
2070
2072
|
disabled: loading,
|
|
2071
2073
|
className: "w-10 h-10 sm:w-8 sm:h-8 rounded-full border border-gray-300 flex items-center justify-center hover:bg-gray-50 disabled:opacity-50"
|
|
2072
2074
|
},
|
|
2073
|
-
/* @__PURE__ */
|
|
2074
|
-
), /* @__PURE__ */
|
|
2075
|
+
/* @__PURE__ */ React23.createElement(Minus, { size: 18, className: "sm:w-4 sm:h-4" })
|
|
2076
|
+
), /* @__PURE__ */ React23.createElement("span", { className: "w-16 sm:w-12 text-center font-medium text-sm sm:text-base" }, item.quantity), /* @__PURE__ */ React23.createElement(
|
|
2075
2077
|
"button",
|
|
2076
2078
|
{
|
|
2077
2079
|
onClick: () => updateCartItem2({ collectionId: item.collectionId, quantity: item.quantity + 1 }),
|
|
2078
2080
|
disabled: loading,
|
|
2079
2081
|
className: "w-10 h-10 sm:w-8 sm:h-8 rounded-full border border-gray-300 flex items-center justify-center hover:bg-gray-50 disabled:opacity-50"
|
|
2080
2082
|
},
|
|
2081
|
-
/* @__PURE__ */
|
|
2082
|
-
)), /* @__PURE__ */
|
|
2083
|
+
/* @__PURE__ */ React23.createElement(Plus, { size: 18, className: "sm:w-4 sm:h-4" })
|
|
2084
|
+
)), /* @__PURE__ */ React23.createElement("div", { className: "text-center sm:text-right" }, /* @__PURE__ */ React23.createElement("p", { className: "font-semibold text-gray-900 text-sm sm:text-base" }, "\xA5", (item.collection.price || 0) * item.quantity))), /* @__PURE__ */ React23.createElement(
|
|
2083
2085
|
"button",
|
|
2084
2086
|
{
|
|
2085
2087
|
onClick: () => removeFromCart2({ collectionId: item.collectionId }),
|
|
2086
2088
|
disabled: loading,
|
|
2087
2089
|
className: "text-red-500 hover:text-red-700 disabled:opacity-50 p-2 sm:p-1"
|
|
2088
2090
|
},
|
|
2089
|
-
/* @__PURE__ */
|
|
2090
|
-
)))), /* @__PURE__ */
|
|
2091
|
+
/* @__PURE__ */ React23.createElement(Trash2, { size: 20, className: "sm:w-5 sm:h-5" })
|
|
2092
|
+
)))), /* @__PURE__ */ React23.createElement("div", { className: "bg-gray-50 rounded-lg p-3 sm:p-4" }, /* @__PURE__ */ React23.createElement("div", { className: "flex justify-between items-center mb-2" }, /* @__PURE__ */ React23.createElement("span", { className: "text-sm sm:text-base text-gray-600" }, "\u5546\u54C1\u603B\u6570\uFF1A"), /* @__PURE__ */ React23.createElement("span", { className: "text-sm sm:text-base font-semibold" }, cart.totalQuantity)), /* @__PURE__ */ React23.createElement("div", { className: "flex justify-between items-center" }, /* @__PURE__ */ React23.createElement("span", { className: "text-sm sm:text-base text-gray-600" }, "\u603B\u4EF7\u683C\uFF1A"), /* @__PURE__ */ React23.createElement("span", { className: "text-lg sm:text-xl font-bold text-blue-600" }, "\xA5", cart.totalPrice))), /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-sm border p-4 sm:p-6" }, /* @__PURE__ */ React23.createElement("div", { className: "flex justify-between items-center mb-4" }, /* @__PURE__ */ React23.createElement("h3", { className: "text-base sm:text-lg font-semibold text-gray-900" }, "\u6279\u91CF\u9884\u8BA2\u4FE1\u606F"), process.env.NODE_ENV === "development" && /* @__PURE__ */ React23.createElement(
|
|
2091
2093
|
"button",
|
|
2092
2094
|
{
|
|
2093
2095
|
type: "button",
|
|
@@ -2095,7 +2097,7 @@ var CartPage = ({ userId, onClose }) => {
|
|
|
2095
2097
|
className: "px-3 py-1 text-xs bg-yellow-100 text-yellow-800 rounded-md hover:bg-yellow-200 transition-colors"
|
|
2096
2098
|
},
|
|
2097
2099
|
"\u586B\u5145\u6D4B\u8BD5\u6570\u636E"
|
|
2098
|
-
)), /* @__PURE__ */
|
|
2100
|
+
)), /* @__PURE__ */ React23.createElement("form", { onSubmit: handleCheckout, className: "space-y-4" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { htmlFor: "qqNumber", className: "block text-sm font-medium text-gray-700 mb-2" }, "QQ\u53F7 ", /* @__PURE__ */ React23.createElement("span", { className: "text-red-500" }, "*")), /* @__PURE__ */ React23.createElement(
|
|
2099
2101
|
"input",
|
|
2100
2102
|
{
|
|
2101
2103
|
type: "text",
|
|
@@ -2106,7 +2108,7 @@ var CartPage = ({ userId, onClose }) => {
|
|
|
2106
2108
|
placeholder: "\u8BF7\u8F93\u5165\u60A8\u7684QQ\u53F7",
|
|
2107
2109
|
disabled: isCheckingOut
|
|
2108
2110
|
}
|
|
2109
|
-
), formErrors.qqNumber && /* @__PURE__ */
|
|
2111
|
+
), formErrors.qqNumber && /* @__PURE__ */ React23.createElement("p", { className: "mt-1 text-sm text-red-600" }, formErrors.qqNumber)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { htmlFor: "phoneNumber", className: "block text-sm font-medium text-gray-700 mb-2" }, "\u624B\u673A\u53F7 ", /* @__PURE__ */ React23.createElement("span", { className: "text-red-500" }, "*")), /* @__PURE__ */ React23.createElement(
|
|
2110
2112
|
"input",
|
|
2111
2113
|
{
|
|
2112
2114
|
type: "tel",
|
|
@@ -2117,7 +2119,7 @@ var CartPage = ({ userId, onClose }) => {
|
|
|
2117
2119
|
placeholder: "\u8BF7\u8F93\u5165\u60A8\u7684\u624B\u673A\u53F7",
|
|
2118
2120
|
disabled: isCheckingOut
|
|
2119
2121
|
}
|
|
2120
|
-
), formErrors.phoneNumber && /* @__PURE__ */
|
|
2122
|
+
), formErrors.phoneNumber && /* @__PURE__ */ React23.createElement("p", { className: "mt-1 text-sm text-red-600" }, formErrors.phoneNumber)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { htmlFor: "notes", className: "block text-sm font-medium text-gray-700 mb-2" }, "\u5907\u6CE8\u4FE1\u606F ", /* @__PURE__ */ React23.createElement("span", { className: "text-red-500" }, "*")), /* @__PURE__ */ React23.createElement(
|
|
2121
2123
|
"textarea",
|
|
2122
2124
|
{
|
|
2123
2125
|
id: "notes",
|
|
@@ -2134,7 +2136,7 @@ var CartPage = ({ userId, onClose }) => {
|
|
|
2134
2136
|
\uFF086\uFF09\u8471\u97F5\u73AF\u4EAC\xB7\u56DB\u7EF4\u7A7A\u95F4`,
|
|
2135
2137
|
disabled: isCheckingOut
|
|
2136
2138
|
}
|
|
2137
|
-
), formErrors.notes && /* @__PURE__ */
|
|
2139
|
+
), formErrors.notes && /* @__PURE__ */ React23.createElement("p", { className: "mt-1 text-sm text-red-600" }, formErrors.notes)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { htmlFor: "pickupMethod", className: "block text-sm font-medium text-gray-700 mb-2" }, "\u6536\u8D27\u4FE1\u606F ", /* @__PURE__ */ React23.createElement("span", { className: "text-red-500" }, "*")), /* @__PURE__ */ React23.createElement(
|
|
2138
2140
|
"textarea",
|
|
2139
2141
|
{
|
|
2140
2142
|
id: "pickupMethod",
|
|
@@ -2148,7 +2150,7 @@ var CartPage = ({ userId, onClose }) => {
|
|
|
2148
2150
|
\uFF083\uFF09\u6536\u4EF6\u624B\u673A\u53F7`,
|
|
2149
2151
|
disabled: isCheckingOut
|
|
2150
2152
|
}
|
|
2151
|
-
), formErrors.pickupMethod && /* @__PURE__ */
|
|
2153
|
+
), formErrors.pickupMethod && /* @__PURE__ */ React23.createElement("p", { className: "mt-1 text-sm text-red-600" }, formErrors.pickupMethod)), /* @__PURE__ */ React23.createElement("div", { className: "flex flex-col sm:flex-row gap-3 sm:gap-4 pt-4" }, /* @__PURE__ */ React23.createElement(
|
|
2152
2154
|
"button",
|
|
2153
2155
|
{
|
|
2154
2156
|
type: "button",
|
|
@@ -2157,7 +2159,7 @@ var CartPage = ({ userId, onClose }) => {
|
|
|
2157
2159
|
className: "flex-1 bg-gray-200 text-gray-800 py-3 sm:py-2 px-4 rounded-lg hover:bg-gray-300 transition-colors disabled:opacity-50 text-base"
|
|
2158
2160
|
},
|
|
2159
2161
|
"\u6E05\u7A7A\u8D2D\u7269\u8F66"
|
|
2160
|
-
), /* @__PURE__ */
|
|
2162
|
+
), /* @__PURE__ */ React23.createElement(
|
|
2161
2163
|
"button",
|
|
2162
2164
|
{
|
|
2163
2165
|
type: "submit",
|
|
@@ -2165,7 +2167,7 @@ var CartPage = ({ userId, onClose }) => {
|
|
|
2165
2167
|
className: `flex-1 py-3 sm:py-2 px-4 rounded-lg font-medium transition-colors text-base ${loading || isCheckingOut || cart.items.length === 0 ? "bg-gray-400 text-gray-600 cursor-not-allowed" : "bg-blue-600 text-white hover:bg-blue-700"}`
|
|
2166
2168
|
},
|
|
2167
2169
|
isCheckingOut ? "\u63D0\u4EA4\u4E2D..." : "\u6279\u91CF\u9884\u8BA2"
|
|
2168
|
-
))))), loading && /* @__PURE__ */
|
|
2170
|
+
))))), loading && /* @__PURE__ */ React23.createElement("div", { className: "text-center py-8 sm:py-12" }, /* @__PURE__ */ React23.createElement("div", { className: "animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600 mx-auto mb-4" }), /* @__PURE__ */ React23.createElement("p", { className: "text-sm sm:text-base text-gray-600" }, "\u52A0\u8F7D\u4E2D...")), hasPopup && /* @__PURE__ */ React23.createElement(
|
|
2169
2171
|
DeadlinePopupManager,
|
|
2170
2172
|
{
|
|
2171
2173
|
configs: popupConfigs,
|
|
@@ -2225,7 +2227,7 @@ var CartModal = ({
|
|
|
2225
2227
|
}
|
|
2226
2228
|
};
|
|
2227
2229
|
if (!isOpen || !mounted) return null;
|
|
2228
|
-
return /* @__PURE__ */
|
|
2230
|
+
return /* @__PURE__ */ React23.createElement(React23.Fragment, null, /* @__PURE__ */ React23.createElement(
|
|
2229
2231
|
"div",
|
|
2230
2232
|
{
|
|
2231
2233
|
className: "fixed top-0 left-0 right-0 bottom-0 w-screen h-screen bg-black/50 backdrop-blur-sm flex items-center justify-center z-[999] p-4",
|
|
@@ -2236,28 +2238,28 @@ var CartModal = ({
|
|
|
2236
2238
|
e.stopPropagation();
|
|
2237
2239
|
}
|
|
2238
2240
|
},
|
|
2239
|
-
/* @__PURE__ */
|
|
2241
|
+
/* @__PURE__ */ React23.createElement(
|
|
2240
2242
|
"div",
|
|
2241
2243
|
{
|
|
2242
2244
|
className: "bg-white rounded-2xl shadow-xl w-full max-w-6xl max-h-[95vh] overflow-hidden relative flex flex-col",
|
|
2243
2245
|
onClick: (e) => e.stopPropagation()
|
|
2244
2246
|
},
|
|
2245
|
-
/* @__PURE__ */
|
|
2247
|
+
/* @__PURE__ */ React23.createElement("div", { className: "flex items-center justify-between px-6 py-4 border-b border-gray-100" }, /* @__PURE__ */ React23.createElement("h2", { className: "text-xl font-semibold text-gray-800" }, title), /* @__PURE__ */ React23.createElement(
|
|
2246
2248
|
"button",
|
|
2247
2249
|
{
|
|
2248
2250
|
className: "bg-transparent border-none text-gray-500 cursor-pointer p-2 rounded-lg transition-all hover:bg-gray-100 hover:text-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 min-w-9 min-h-9 flex items-center justify-center",
|
|
2249
2251
|
onClick: onClose
|
|
2250
2252
|
},
|
|
2251
|
-
/* @__PURE__ */
|
|
2253
|
+
/* @__PURE__ */ React23.createElement(X, { size: 20 })
|
|
2252
2254
|
)),
|
|
2253
|
-
/* @__PURE__ */
|
|
2255
|
+
/* @__PURE__ */ React23.createElement(
|
|
2254
2256
|
"div",
|
|
2255
2257
|
{
|
|
2256
2258
|
className: "flex-1 overflow-auto",
|
|
2257
2259
|
onWheel: handleWheelPrevent,
|
|
2258
2260
|
onTouchMove: handleTouchPrevent
|
|
2259
2261
|
},
|
|
2260
|
-
/* @__PURE__ */
|
|
2262
|
+
/* @__PURE__ */ React23.createElement(CartPage, { userId, onClose })
|
|
2261
2263
|
)
|
|
2262
2264
|
)
|
|
2263
2265
|
));
|
|
@@ -2272,15 +2274,15 @@ var CartButton = ({
|
|
|
2272
2274
|
showBadge = true
|
|
2273
2275
|
}) => {
|
|
2274
2276
|
const { cart } = useCartContext();
|
|
2275
|
-
return /* @__PURE__ */
|
|
2277
|
+
return /* @__PURE__ */ React23.createElement(
|
|
2276
2278
|
"button",
|
|
2277
2279
|
{
|
|
2278
2280
|
onClick,
|
|
2279
2281
|
className: `relative bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700 transition-colors flex items-center gap-2 ${className}`
|
|
2280
2282
|
},
|
|
2281
|
-
/* @__PURE__ */
|
|
2282
|
-
/* @__PURE__ */
|
|
2283
|
-
showBadge && cart.totalQuantity > 0 && /* @__PURE__ */
|
|
2283
|
+
/* @__PURE__ */ React23.createElement(ShoppingCart, { size: 16 }),
|
|
2284
|
+
/* @__PURE__ */ React23.createElement("span", null, "\u8D2D\u7269\u8F66"),
|
|
2285
|
+
showBadge && cart.totalQuantity > 0 && /* @__PURE__ */ React23.createElement("span", { className: "absolute -top-2 -right-2 bg-red-500 text-white text-xs rounded-full w-5 h-5 flex items-center justify-center font-medium" }, cart.totalQuantity > 99 ? "99+" : cart.totalQuantity)
|
|
2284
2286
|
);
|
|
2285
2287
|
};
|
|
2286
2288
|
var CollectionList = ({
|
|
@@ -2305,12 +2307,12 @@ var CollectionList = ({
|
|
|
2305
2307
|
return `\xA5${price}`;
|
|
2306
2308
|
};
|
|
2307
2309
|
if (loading) {
|
|
2308
|
-
return /* @__PURE__ */
|
|
2310
|
+
return /* @__PURE__ */ React23.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4" }, Array.from({ length: 6 }).map((_, index) => /* @__PURE__ */ React23.createElement("div", { key: index, className: "bg-gray-100 rounded-lg p-4 animate-pulse" }, /* @__PURE__ */ React23.createElement("div", { className: "w-full h-48 bg-gray-200 rounded-md mb-3" }), /* @__PURE__ */ React23.createElement("div", { className: "h-4 bg-gray-200 rounded mb-2" }), /* @__PURE__ */ React23.createElement("div", { className: "h-3 bg-gray-200 rounded mb-2" }), /* @__PURE__ */ React23.createElement("div", { className: "h-3 bg-gray-200 rounded w-1/2" }))));
|
|
2309
2311
|
}
|
|
2310
2312
|
if (collections.length === 0) {
|
|
2311
|
-
return /* @__PURE__ */
|
|
2313
|
+
return /* @__PURE__ */ React23.createElement("div", { className: "text-center py-12" }, /* @__PURE__ */ React23.createElement("div", { className: "text-gray-400 text-6xl mb-4" }, "\u{1F3A8}"), /* @__PURE__ */ React23.createElement("h3", { className: "text-lg font-medium text-gray-900 mb-2" }, "\u6682\u65E0\u53EF\u7528\u753B\u96C6"), /* @__PURE__ */ React23.createElement("p", { className: "text-gray-500" }, "\u5F53\u524D\u6CA1\u6709\u53EF\u9884\u8BA2\u7684\u753B\u96C6\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5"));
|
|
2312
2314
|
}
|
|
2313
|
-
return /* @__PURE__ */
|
|
2315
|
+
return /* @__PURE__ */ React23.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4" }, collections.map((collection) => /* @__PURE__ */ React23.createElement(
|
|
2314
2316
|
"div",
|
|
2315
2317
|
{
|
|
2316
2318
|
key: collection.id,
|
|
@@ -2322,8 +2324,8 @@ var CollectionList = ({
|
|
|
2322
2324
|
`,
|
|
2323
2325
|
onClick: () => handleCollectionSelect(collection.id)
|
|
2324
2326
|
},
|
|
2325
|
-
selectedCollectionId === collection.id && /* @__PURE__ */
|
|
2326
|
-
/* @__PURE__ */
|
|
2327
|
+
selectedCollectionId === collection.id && /* @__PURE__ */ React23.createElement("div", { className: "absolute top-2 right-2 z-10" }, /* @__PURE__ */ React23.createElement("div", { className: "bg-blue-500 text-white rounded-full w-6 h-6 flex items-center justify-center" }, /* @__PURE__ */ React23.createElement("svg", { className: "w-4 h-4", fill: "currentColor", viewBox: "0 0 20 20" }, /* @__PURE__ */ React23.createElement("path", { fillRule: "evenodd", d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z", clipRule: "evenodd" })))),
|
|
2328
|
+
/* @__PURE__ */ React23.createElement("div", { className: "relative h-48 overflow-hidden" }, /* @__PURE__ */ React23.createElement(
|
|
2327
2329
|
"img",
|
|
2328
2330
|
{
|
|
2329
2331
|
src: collection.coverImage,
|
|
@@ -2334,9 +2336,9 @@ var CollectionList = ({
|
|
|
2334
2336
|
target.src = "/images/placeholder-artwork.jpg";
|
|
2335
2337
|
}
|
|
2336
2338
|
}
|
|
2337
|
-
), /* @__PURE__ */
|
|
2338
|
-
/* @__PURE__ */
|
|
2339
|
-
!disabled && /* @__PURE__ */
|
|
2339
|
+
), /* @__PURE__ */ React23.createElement("div", { className: "absolute bottom-2 left-2" }, /* @__PURE__ */ React23.createElement("span", { className: "bg-black bg-opacity-75 text-white px-2 py-1 rounded text-sm font-medium" }, formatPrice(collection.price)))),
|
|
2340
|
+
/* @__PURE__ */ React23.createElement("div", { className: "p-4" }, /* @__PURE__ */ React23.createElement("h3", { className: "font-semibold text-gray-900 mb-1 line-clamp-2" }, collection.title), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-gray-600 mb-2" }, "\u7F16\u53F7\uFF1A", collection.number), collection.description && /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-gray-500 line-clamp-2" }, collection.description)),
|
|
2341
|
+
!disabled && /* @__PURE__ */ React23.createElement("div", { className: "absolute inset-0 bg-blue-500 bg-opacity-0 hover:bg-opacity-10 transition-all duration-200 flex items-center justify-center" }, /* @__PURE__ */ React23.createElement("span", { className: "text-blue-600 font-medium opacity-0 hover:opacity-100 transition-opacity duration-200" }, "\u70B9\u51FB\u9009\u62E9"))
|
|
2340
2342
|
)));
|
|
2341
2343
|
};
|
|
2342
2344
|
|
|
@@ -2680,7 +2682,7 @@ var BookingAdminPanel = ({
|
|
|
2680
2682
|
}
|
|
2681
2683
|
await onSearch(params);
|
|
2682
2684
|
};
|
|
2683
|
-
return /* @__PURE__ */
|
|
2685
|
+
return /* @__PURE__ */ React23.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ React23.createElement("div", { className: "grid grid-cols-2 lg:grid-cols-4 gap-3 sm:gap-4" }, /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-slate-200 p-4 sm:p-6" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ React23.createElement("div", { className: "p-2 bg-blue-100 rounded-lg" }, /* @__PURE__ */ React23.createElement(Calendar, { size: 20, className: "text-blue-600 sm:w-6 sm:h-6" })), /* @__PURE__ */ React23.createElement("div", { className: "ml-3 sm:ml-4" }, /* @__PURE__ */ React23.createElement("h3", { className: "text-lg sm:text-2xl font-bold text-slate-800" }, stats.totalBookings), /* @__PURE__ */ React23.createElement("p", { className: "text-xs sm:text-sm text-slate-600" }, "\u603B\u9884\u8BA2\u6570")))), /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-slate-200 p-4 sm:p-6" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ React23.createElement("div", { className: "p-2 bg-yellow-100 rounded-lg" }, /* @__PURE__ */ React23.createElement(Clock, { size: 20, className: "text-yellow-600 sm:w-6 sm:h-6" })), /* @__PURE__ */ React23.createElement("div", { className: "ml-3 sm:ml-4" }, /* @__PURE__ */ React23.createElement("h3", { className: "text-lg sm:text-2xl font-bold text-slate-800" }, stats.pendingBookings), /* @__PURE__ */ React23.createElement("p", { className: "text-xs sm:text-sm text-slate-600" }, "\u5F85\u786E\u8BA4")))), /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-slate-200 p-4 sm:p-6" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ React23.createElement("div", { className: "p-2 bg-green-100 rounded-lg" }, /* @__PURE__ */ React23.createElement(CheckCircle, { size: 20, className: "text-green-600 sm:w-6 sm:h-6" })), /* @__PURE__ */ React23.createElement("div", { className: "ml-3 sm:ml-4" }, /* @__PURE__ */ React23.createElement("h3", { className: "text-lg sm:text-2xl font-bold text-slate-800" }, stats.completedBookings), /* @__PURE__ */ React23.createElement("p", { className: "text-xs sm:text-sm text-slate-600" }, "\u5DF2\u5B8C\u6210")))), /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-slate-200 p-4 sm:p-6" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ React23.createElement("div", { className: "p-2 bg-purple-100 rounded-lg" }, /* @__PURE__ */ React23.createElement(Package, { size: 20, className: "text-purple-600 sm:w-6 sm:h-6" })), /* @__PURE__ */ React23.createElement("div", { className: "ml-3 sm:ml-4" }, /* @__PURE__ */ React23.createElement("h3", { className: "text-lg sm:text-2xl font-bold text-slate-800" }, "\xA5", stats.totalRevenue), /* @__PURE__ */ React23.createElement("p", { className: "text-xs sm:text-sm text-slate-600" }, "\u603B\u6536\u5165"))))), /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-slate-200 p-4" }, /* @__PURE__ */ React23.createElement("form", { onSubmit: handleSearchSubmit, className: "space-y-4" }, /* @__PURE__ */ React23.createElement("div", { className: "flex flex-col sm:flex-row gap-4" }, /* @__PURE__ */ React23.createElement("div", { className: "flex-1" }, /* @__PURE__ */ React23.createElement("label", { htmlFor: "searchQqNumber", className: "block text-sm font-medium text-slate-700 mb-2" }, "QQ\u53F7\u641C\u7D22"), /* @__PURE__ */ React23.createElement(
|
|
2684
2686
|
"input",
|
|
2685
2687
|
{
|
|
2686
2688
|
type: "text",
|
|
@@ -2690,7 +2692,7 @@ var BookingAdminPanel = ({
|
|
|
2690
2692
|
className: "w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500",
|
|
2691
2693
|
placeholder: "\u8F93\u5165QQ\u53F7\u8FDB\u884C\u641C\u7D22"
|
|
2692
2694
|
}
|
|
2693
|
-
)), /* @__PURE__ */
|
|
2695
|
+
)), /* @__PURE__ */ React23.createElement("div", { className: "flex-1" }, /* @__PURE__ */ React23.createElement("label", { htmlFor: "searchPhoneNumber", className: "block text-sm font-medium text-slate-700 mb-2" }, "\u624B\u673A\u53F7\u641C\u7D22"), /* @__PURE__ */ React23.createElement(
|
|
2694
2696
|
"input",
|
|
2695
2697
|
{
|
|
2696
2698
|
type: "tel",
|
|
@@ -2700,7 +2702,7 @@ var BookingAdminPanel = ({
|
|
|
2700
2702
|
className: "w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500",
|
|
2701
2703
|
placeholder: "\u8F93\u5165\u624B\u673A\u53F7\u8FDB\u884C\u641C\u7D22"
|
|
2702
2704
|
}
|
|
2703
|
-
)), /* @__PURE__ */
|
|
2705
|
+
)), /* @__PURE__ */ React23.createElement("div", { className: "flex-1" }, /* @__PURE__ */ React23.createElement("label", { htmlFor: "searchStatus", className: "block text-sm font-medium text-slate-700 mb-2" }, "\u72B6\u6001\u8FC7\u6EE4"), /* @__PURE__ */ React23.createElement(
|
|
2704
2706
|
"select",
|
|
2705
2707
|
{
|
|
2706
2708
|
id: "searchStatus",
|
|
@@ -2708,21 +2710,21 @@ var BookingAdminPanel = ({
|
|
|
2708
2710
|
onChange: (e) => setSearchForm((prev) => ({ ...prev, status: e.target.value })),
|
|
2709
2711
|
className: "w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
2710
2712
|
},
|
|
2711
|
-
/* @__PURE__ */
|
|
2712
|
-
/* @__PURE__ */
|
|
2713
|
-
/* @__PURE__ */
|
|
2714
|
-
/* @__PURE__ */
|
|
2715
|
-
/* @__PURE__ */
|
|
2716
|
-
))), /* @__PURE__ */
|
|
2713
|
+
/* @__PURE__ */ React23.createElement("option", { value: "all" }, "\u5168\u90E8\u72B6\u6001"),
|
|
2714
|
+
/* @__PURE__ */ React23.createElement("option", { value: "pending" }, "\u5F85\u786E\u8BA4"),
|
|
2715
|
+
/* @__PURE__ */ React23.createElement("option", { value: "confirmed" }, "\u5DF2\u786E\u8BA4"),
|
|
2716
|
+
/* @__PURE__ */ React23.createElement("option", { value: "completed" }, "\u5DF2\u5B8C\u6210"),
|
|
2717
|
+
/* @__PURE__ */ React23.createElement("option", { value: "cancelled" }, "\u5DF2\u53D6\u6D88")
|
|
2718
|
+
))), /* @__PURE__ */ React23.createElement("div", { className: "flex gap-2" }, /* @__PURE__ */ React23.createElement(
|
|
2717
2719
|
"button",
|
|
2718
2720
|
{
|
|
2719
2721
|
type: "submit",
|
|
2720
2722
|
disabled: loading,
|
|
2721
2723
|
className: "flex items-center justify-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 transition-colors disabled:opacity-50"
|
|
2722
2724
|
},
|
|
2723
|
-
/* @__PURE__ */
|
|
2725
|
+
/* @__PURE__ */ React23.createElement(Search, { size: 16 }),
|
|
2724
2726
|
"\u641C\u7D22"
|
|
2725
|
-
), /* @__PURE__ */
|
|
2727
|
+
), /* @__PURE__ */ React23.createElement(
|
|
2726
2728
|
"button",
|
|
2727
2729
|
{
|
|
2728
2730
|
type: "button",
|
|
@@ -2730,53 +2732,53 @@ var BookingAdminPanel = ({
|
|
|
2730
2732
|
disabled: loading,
|
|
2731
2733
|
className: "flex items-center justify-center gap-2 px-4 py-2 bg-slate-100 text-slate-700 rounded-lg font-medium hover:bg-slate-200 transition-colors disabled:opacity-50"
|
|
2732
2734
|
},
|
|
2733
|
-
/* @__PURE__ */
|
|
2735
|
+
/* @__PURE__ */ React23.createElement(X, { size: 16 }),
|
|
2734
2736
|
"\u6E05\u9664"
|
|
2735
|
-
)))), /* @__PURE__ */
|
|
2737
|
+
)))), /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-slate-200 p-4" }, /* @__PURE__ */ React23.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4" }, /* @__PURE__ */ React23.createElement("div", { className: "flex flex-wrap gap-2" }, /* @__PURE__ */ React23.createElement(
|
|
2736
2738
|
"button",
|
|
2737
2739
|
{
|
|
2738
2740
|
className: `px-3 py-2 text-sm sm:text-base rounded-lg font-medium transition-colors ${filterStatus === "all" ? "bg-blue-600 text-white" : "bg-slate-100 text-slate-700 hover:bg-slate-200"}`,
|
|
2739
2741
|
onClick: () => handleStatusFilter("all")
|
|
2740
2742
|
},
|
|
2741
2743
|
"\u5168\u90E8"
|
|
2742
|
-
), /* @__PURE__ */
|
|
2744
|
+
), /* @__PURE__ */ React23.createElement(
|
|
2743
2745
|
"button",
|
|
2744
2746
|
{
|
|
2745
2747
|
className: `px-3 py-2 text-sm sm:text-base rounded-lg font-medium transition-colors ${filterStatus === "pending" ? "bg-blue-600 text-white" : "bg-slate-100 text-slate-700 hover:bg-slate-200"}`,
|
|
2746
2748
|
onClick: () => handleStatusFilter("pending")
|
|
2747
2749
|
},
|
|
2748
2750
|
"\u5F85\u786E\u8BA4"
|
|
2749
|
-
), /* @__PURE__ */
|
|
2751
|
+
), /* @__PURE__ */ React23.createElement(
|
|
2750
2752
|
"button",
|
|
2751
2753
|
{
|
|
2752
2754
|
className: `px-3 py-2 text-sm sm:text-base rounded-lg font-medium transition-colors ${filterStatus === "confirmed" ? "bg-blue-600 text-white" : "bg-slate-100 text-slate-700 hover:bg-slate-200"}`,
|
|
2753
2755
|
onClick: () => handleStatusFilter("confirmed")
|
|
2754
2756
|
},
|
|
2755
2757
|
"\u5DF2\u786E\u8BA4"
|
|
2756
|
-
), /* @__PURE__ */
|
|
2758
|
+
), /* @__PURE__ */ React23.createElement(
|
|
2757
2759
|
"button",
|
|
2758
2760
|
{
|
|
2759
2761
|
className: `px-3 py-2 text-sm sm:text-base rounded-lg font-medium transition-colors ${filterStatus === "completed" ? "bg-blue-600 text-white" : "bg-slate-100 text-slate-700 hover:bg-slate-200"}`,
|
|
2760
2762
|
onClick: () => handleStatusFilter("completed")
|
|
2761
2763
|
},
|
|
2762
2764
|
"\u5DF2\u5B8C\u6210"
|
|
2763
|
-
), /* @__PURE__ */
|
|
2765
|
+
), /* @__PURE__ */ React23.createElement(
|
|
2764
2766
|
"button",
|
|
2765
2767
|
{
|
|
2766
2768
|
className: `px-3 py-2 text-sm sm:text-base rounded-lg font-medium transition-colors ${filterStatus === "cancelled" ? "bg-blue-600 text-white" : "bg-slate-100 text-slate-700 hover:bg-slate-200"}`,
|
|
2767
2769
|
onClick: () => handleStatusFilter("cancelled")
|
|
2768
2770
|
},
|
|
2769
2771
|
"\u5DF2\u53D6\u6D88"
|
|
2770
|
-
)), /* @__PURE__ */
|
|
2772
|
+
)), /* @__PURE__ */ React23.createElement("div", { className: "flex flex-col sm:flex-row gap-2 w-full sm:w-auto" }, /* @__PURE__ */ React23.createElement(
|
|
2771
2773
|
"button",
|
|
2772
2774
|
{
|
|
2773
2775
|
onClick: onRefresh,
|
|
2774
2776
|
disabled: loading,
|
|
2775
2777
|
className: "flex items-center justify-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 transition-colors disabled:opacity-50"
|
|
2776
2778
|
},
|
|
2777
|
-
/* @__PURE__ */
|
|
2779
|
+
/* @__PURE__ */ React23.createElement(RefreshCw, { size: 16, className: loading ? "animate-spin" : "" }),
|
|
2778
2780
|
"\u5237\u65B0"
|
|
2779
|
-
), /* @__PURE__ */
|
|
2781
|
+
), /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-2 px-3 py-2 bg-white border border-slate-200 rounded-lg" }, /* @__PURE__ */ React23.createElement(
|
|
2780
2782
|
"input",
|
|
2781
2783
|
{
|
|
2782
2784
|
type: "checkbox",
|
|
@@ -2785,7 +2787,7 @@ var BookingAdminPanel = ({
|
|
|
2785
2787
|
onChange: (e) => setEnableUserPriceCalculation(e.target.checked),
|
|
2786
2788
|
className: "w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 focus:ring-2"
|
|
2787
2789
|
}
|
|
2788
|
-
), /* @__PURE__ */
|
|
2790
|
+
), /* @__PURE__ */ React23.createElement(
|
|
2789
2791
|
"label",
|
|
2790
2792
|
{
|
|
2791
2793
|
htmlFor: "enableUserPriceCalculation",
|
|
@@ -2793,7 +2795,7 @@ var BookingAdminPanel = ({
|
|
|
2793
2795
|
title: "\u52FE\u9009\u540E\u5BFC\u51FAExcel\u65F6\u4F1A\u6DFB\u52A0\u4E00\u5217\u7528\u6237\u603B\u4EF7\uFF08\u6839\u636EQQ\u53F7+\u624B\u673A\u53F7\u552F\u4E00\u5339\u914D\uFF09"
|
|
2794
2796
|
},
|
|
2795
2797
|
"\u5305\u542B\u7528\u6237\u603B\u4EF7"
|
|
2796
|
-
)), /* @__PURE__ */
|
|
2798
|
+
)), /* @__PURE__ */ React23.createElement(
|
|
2797
2799
|
UniversalExportButton,
|
|
2798
2800
|
{
|
|
2799
2801
|
exportService,
|
|
@@ -2847,7 +2849,7 @@ var BookingAdminPanel = ({
|
|
|
2847
2849
|
console.error("\u274C [BookingAdminPanel] UniversalExportButton \u5BFC\u51FA\u5931\u8D25:", error2);
|
|
2848
2850
|
}
|
|
2849
2851
|
}
|
|
2850
|
-
), /* @__PURE__ */
|
|
2852
|
+
), /* @__PURE__ */ React23.createElement(
|
|
2851
2853
|
"button",
|
|
2852
2854
|
{
|
|
2853
2855
|
onClick: async () => {
|
|
@@ -2862,31 +2864,31 @@ var BookingAdminPanel = ({
|
|
|
2862
2864
|
disabled: loading || bookings.length === 0,
|
|
2863
2865
|
className: "flex items-center gap-2 px-4 py-2 bg-green-600 text-white rounded-lg font-medium hover:bg-green-700 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
|
|
2864
2866
|
},
|
|
2865
|
-
/* @__PURE__ */
|
|
2867
|
+
/* @__PURE__ */ React23.createElement(Download, { size: 16 }),
|
|
2866
2868
|
"\u76F4\u63A5\u5BFC\u51FA (",
|
|
2867
2869
|
bookings.length,
|
|
2868
2870
|
"\u6761)"
|
|
2869
|
-
)))), error && /* @__PURE__ */
|
|
2871
|
+
)))), error && /* @__PURE__ */ React23.createElement("div", { className: "bg-red-50 border border-red-200 rounded-lg p-4" }, /* @__PURE__ */ React23.createElement("div", { className: "flex" }, /* @__PURE__ */ React23.createElement("div", { className: "text-red-400 mr-3 flex-shrink-0" }, /* @__PURE__ */ React23.createElement(XCircle, { size: 20 })), /* @__PURE__ */ React23.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React23.createElement("h3", { className: "text-sm font-medium text-red-800" }, "\u52A0\u8F7D\u5931\u8D25"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-red-700 mt-1 break-words" }, error)))), /* @__PURE__ */ React23.createElement("div", { className: "space-y-4" }, paginatedBookings.length === 0 ? /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-slate-200 p-8 sm:p-12 text-center" }, /* @__PURE__ */ React23.createElement(Calendar, { size: 40, className: "text-slate-400 mx-auto mb-4 sm:w-12 sm:h-12" }), /* @__PURE__ */ React23.createElement("h3", { className: "text-base sm:text-lg font-medium text-slate-800 mb-2" }, "\u6682\u65E0\u9884\u8BA2\u6570\u636E"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm sm:text-base text-slate-600" }, totalItems === 0 ? "\u5F53\u524D\u7B5B\u9009\u6761\u4EF6\u4E0B\u6CA1\u6709\u627E\u5230\u9884\u8BA2\u6570\u636E" : "\u5F53\u524D\u9875\u65E0\u6570\u636E")) : paginatedBookings.map((booking) => {
|
|
2870
2872
|
const statusInfo = getStatusInfo(booking.status);
|
|
2871
|
-
return /* @__PURE__ */
|
|
2873
|
+
return /* @__PURE__ */ React23.createElement("div", { key: booking.id, className: "bg-white rounded-lg shadow-sm border border-slate-200 overflow-hidden" }, /* @__PURE__ */ React23.createElement("div", { className: "p-4 sm:p-6" }, /* @__PURE__ */ React23.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start sm:justify-between gap-4 mb-4" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-start gap-3 sm:gap-4" }, booking.collection.coverImage ? /* @__PURE__ */ React23.createElement(
|
|
2872
2874
|
"img",
|
|
2873
2875
|
{
|
|
2874
2876
|
src: booking.collection.coverImage,
|
|
2875
2877
|
alt: booking.collection.title,
|
|
2876
2878
|
className: "w-12 h-12 sm:w-16 sm:h-16 object-cover rounded-lg flex-shrink-0"
|
|
2877
2879
|
}
|
|
2878
|
-
) : /* @__PURE__ */
|
|
2880
|
+
) : /* @__PURE__ */ React23.createElement("div", { className: "w-12 h-12 sm:w-16 sm:h-16 bg-slate-100 rounded-lg flex-shrink-0 flex items-center justify-center text-slate-400 text-xs" }, "\u6682\u65E0"), /* @__PURE__ */ React23.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React23.createElement("h3", { className: "text-base sm:text-lg font-semibold text-slate-800 truncate" }, booking.collection.title), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-600" }, "\u7F16\u53F7\uFF1A", booking.collection.number), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-600" }, "QQ\u53F7\uFF1A", booking.qqNumber), booking.phoneNumber && /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-600" }, "\u624B\u673A\u53F7\uFF1A", booking.phoneNumber))), /* @__PURE__ */ React23.createElement("div", { className: "text-left sm:text-right" }, /* @__PURE__ */ React23.createElement("span", { className: `inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${statusInfo.color}` }, statusInfo.label), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500 mt-1" }, "# ", booking.id))), /* @__PURE__ */ React23.createElement("div", { className: "grid grid-cols-2 sm:grid-cols-4 gap-4 mb-4" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-xs text-slate-500" }, "\u6570\u91CF"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm font-medium text-slate-800" }, booking.quantity)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-xs text-slate-500" }, "\u5355\u4EF7"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm font-medium text-slate-800" }, "\xA5", booking.collection.price)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-xs text-slate-500" }, "\u603B\u4EF7"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm font-medium text-slate-800" }, "\xA5", booking.totalPrice)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-xs text-slate-500" }, "\u9884\u8BA2\u65F6\u95F4"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm font-medium text-slate-800" }, formatTime(booking.createdAt)))), /* @__PURE__ */ React23.createElement("div", { className: "grid grid-cols-2 sm:grid-cols-3 gap-4 mb-4" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-xs text-slate-500" }, "QQ\u53F7"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm font-medium text-slate-800" }, booking.qqNumber)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-xs text-slate-500" }, "\u624B\u673A\u53F7"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm font-medium text-slate-800" }, booking.phoneNumber))), /* @__PURE__ */ React23.createElement("div", { className: "grid grid-cols-2 sm:grid-cols-3 gap-4 mb-4" }, booking.confirmedAt && /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-xs text-slate-500" }, "\u786E\u8BA4\u65F6\u95F4"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm font-medium text-green-800" }, formatTime(booking.confirmedAt))), booking.completedAt && /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-xs text-slate-500" }, "\u5B8C\u6210\u65F6\u95F4"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm font-medium text-blue-800" }, formatTime(booking.completedAt))), booking.cancelledAt && /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-xs text-slate-500" }, "\u53D6\u6D88\u65F6\u95F4"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm font-medium text-red-800" }, formatTime(booking.cancelledAt)))), (booking.notes || booking.adminNotes || booking.pickupMethod) && /* @__PURE__ */ React23.createElement("div", { className: "mb-4" }, booking.pickupMethod && /* @__PURE__ */ React23.createElement("div", { className: "mb-2" }, /* @__PURE__ */ React23.createElement("p", { className: "text-xs text-slate-500" }, "\u9886\u53D6\u65B9\u5F0F \u8BF7\u586B\u51992\u670810\u53F7\u4EE5\u540E\u80FD\u6536\u5230\u8D27\u7684\u5730\u5740 \uFF081\uFF09\u6536\u4EF6\u4EBA \uFF082\uFF09\u6536\u4EF6\u5730\u5740 \uFF083\uFF09\u6536\u4EF6\u624B\u673A\u53F7"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-700" }, booking.pickupMethod)), booking.notes && /* @__PURE__ */ React23.createElement("div", { className: "mb-2" }, /* @__PURE__ */ React23.createElement("p", { className: "text-xs text-slate-500" }, "\u7528\u6237\u5907\u6CE8\uFF1A \uFF081\uFF09\u8471\u97F5\u73AF\u4EACComicUniverse \uFF082\uFF09\u8471\u97F5\u73AF\u4EAC\u5916\u661F\u5F00\u62D3\u7FA4 \uFF083\uFF09\u8471\u97F5\u73AF\u4EAC\u6BD4\u90BB\u661F \uFF084\uFF09\u8471\u97F5\u73AF\u4EAC\u534E\u4E1C\u7FA4 \uFF085\uFF09\u8471\u97F5\u73AF\u4EAC\u5929\u6D25\u7FA4 \uFF086\uFF09\u8471\u97F5\u73AF\u4EAC\xB7\u56DB\u7EF4\u7A7A\u95F4"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-700" }, booking.notes)), booking.adminNotes && /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-xs text-slate-500" }, "\u7BA1\u7406\u5458\u5907\u6CE8"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-700" }, booking.adminNotes))), /* @__PURE__ */ React23.createElement("div", { className: "flex flex-col sm:flex-row gap-2" }, editingBooking === booking.id ? /* @__PURE__ */ React23.createElement(React23.Fragment, null, /* @__PURE__ */ React23.createElement(
|
|
2879
2881
|
"select",
|
|
2880
2882
|
{
|
|
2881
2883
|
value: editForm.status,
|
|
2882
2884
|
onChange: (e) => setEditForm((prev) => ({ ...prev, status: e.target.value })),
|
|
2883
2885
|
className: "flex-1 px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
2884
2886
|
},
|
|
2885
|
-
/* @__PURE__ */
|
|
2886
|
-
/* @__PURE__ */
|
|
2887
|
-
/* @__PURE__ */
|
|
2888
|
-
/* @__PURE__ */
|
|
2889
|
-
), /* @__PURE__ */
|
|
2887
|
+
/* @__PURE__ */ React23.createElement("option", { value: "pending" }, "\u5F85\u786E\u8BA4"),
|
|
2888
|
+
/* @__PURE__ */ React23.createElement("option", { value: "confirmed" }, "\u5DF2\u786E\u8BA4"),
|
|
2889
|
+
/* @__PURE__ */ React23.createElement("option", { value: "completed" }, "\u5DF2\u5B8C\u6210"),
|
|
2890
|
+
/* @__PURE__ */ React23.createElement("option", { value: "cancelled" }, "\u5DF2\u53D6\u6D88")
|
|
2891
|
+
), /* @__PURE__ */ React23.createElement(
|
|
2890
2892
|
"input",
|
|
2891
2893
|
{
|
|
2892
2894
|
type: "text",
|
|
@@ -2895,51 +2897,51 @@ var BookingAdminPanel = ({
|
|
|
2895
2897
|
placeholder: "\u7BA1\u7406\u5458\u5907\u6CE8",
|
|
2896
2898
|
className: "flex-1 px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
2897
2899
|
}
|
|
2898
|
-
), /* @__PURE__ */
|
|
2900
|
+
), /* @__PURE__ */ React23.createElement(
|
|
2899
2901
|
"button",
|
|
2900
2902
|
{
|
|
2901
2903
|
onClick: handleSaveEdit,
|
|
2902
2904
|
className: "flex items-center justify-center gap-2 px-4 py-2 bg-green-600 text-white rounded-lg font-medium hover:bg-green-700 transition-colors"
|
|
2903
2905
|
},
|
|
2904
|
-
/* @__PURE__ */
|
|
2906
|
+
/* @__PURE__ */ React23.createElement(Save, { size: 16 }),
|
|
2905
2907
|
"\u4FDD\u5B58"
|
|
2906
|
-
), /* @__PURE__ */
|
|
2908
|
+
), /* @__PURE__ */ React23.createElement(
|
|
2907
2909
|
"button",
|
|
2908
2910
|
{
|
|
2909
2911
|
onClick: handleCancelEdit,
|
|
2910
2912
|
className: "flex items-center justify-center gap-2 px-4 py-2 bg-slate-100 text-slate-700 rounded-lg font-medium hover:bg-slate-200 transition-colors"
|
|
2911
2913
|
},
|
|
2912
|
-
/* @__PURE__ */
|
|
2914
|
+
/* @__PURE__ */ React23.createElement(X, { size: 16 }),
|
|
2913
2915
|
"\u53D6\u6D88"
|
|
2914
|
-
)) : /* @__PURE__ */
|
|
2916
|
+
)) : /* @__PURE__ */ React23.createElement(React23.Fragment, null, /* @__PURE__ */ React23.createElement(
|
|
2915
2917
|
"button",
|
|
2916
2918
|
{
|
|
2917
2919
|
onClick: () => handleEditBooking(booking),
|
|
2918
2920
|
className: "flex items-center justify-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 transition-colors"
|
|
2919
2921
|
},
|
|
2920
|
-
/* @__PURE__ */
|
|
2922
|
+
/* @__PURE__ */ React23.createElement(Edit, { size: 16 }),
|
|
2921
2923
|
"\u7F16\u8F91"
|
|
2922
|
-
), /* @__PURE__ */
|
|
2924
|
+
), /* @__PURE__ */ React23.createElement(
|
|
2923
2925
|
"button",
|
|
2924
2926
|
{
|
|
2925
2927
|
onClick: () => handleDeleteBooking(booking.id),
|
|
2926
2928
|
className: "flex items-center justify-center gap-2 px-4 py-2 bg-red-600 text-white rounded-lg font-medium hover:bg-red-700 transition-colors"
|
|
2927
2929
|
},
|
|
2928
|
-
/* @__PURE__ */
|
|
2930
|
+
/* @__PURE__ */ React23.createElement(Trash2, { size: 16 }),
|
|
2929
2931
|
"\u5220\u9664"
|
|
2930
2932
|
)))));
|
|
2931
|
-
})), totalItems > 0 && /* @__PURE__ */
|
|
2933
|
+
})), totalItems > 0 && /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-slate-200 p-4 sm:p-6" }, /* @__PURE__ */ React23.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ React23.createElement("div", { className: "text-sm text-slate-600" }, "\u5171 ", totalItems, " \u6761\u8BB0\u5F55\uFF0C\u7B2C ", currentPage, " / ", totalPages, " \u9875"), /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React23.createElement("span", { className: "text-sm text-slate-600" }, "\u6BCF\u9875\u663E\u793A"), /* @__PURE__ */ React23.createElement(
|
|
2932
2934
|
"select",
|
|
2933
2935
|
{
|
|
2934
2936
|
value: pageSize,
|
|
2935
2937
|
onChange: (e) => handlePageSizeChange(Number(e.target.value)),
|
|
2936
2938
|
className: "px-2 py-1 border border-slate-300 rounded text-sm focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
2937
2939
|
},
|
|
2938
|
-
/* @__PURE__ */
|
|
2939
|
-
/* @__PURE__ */
|
|
2940
|
-
/* @__PURE__ */
|
|
2941
|
-
/* @__PURE__ */
|
|
2942
|
-
), /* @__PURE__ */
|
|
2940
|
+
/* @__PURE__ */ React23.createElement("option", { value: 5 }, "5"),
|
|
2941
|
+
/* @__PURE__ */ React23.createElement("option", { value: 10 }, "10"),
|
|
2942
|
+
/* @__PURE__ */ React23.createElement("option", { value: 20 }, "20"),
|
|
2943
|
+
/* @__PURE__ */ React23.createElement("option", { value: 50 }, "50")
|
|
2944
|
+
), /* @__PURE__ */ React23.createElement("span", { className: "text-sm text-slate-600" }, "\u6761"))), /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React23.createElement(
|
|
2943
2945
|
"button",
|
|
2944
2946
|
{
|
|
2945
2947
|
onClick: () => handlePageChange(currentPage - 1),
|
|
@@ -2947,7 +2949,7 @@ var BookingAdminPanel = ({
|
|
|
2947
2949
|
className: "px-3 py-1 text-sm border border-slate-300 rounded hover:bg-slate-50 disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-white"
|
|
2948
2950
|
},
|
|
2949
2951
|
"\u4E0A\u4E00\u9875"
|
|
2950
|
-
), /* @__PURE__ */
|
|
2952
|
+
), /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-1" }, Array.from({ length: Math.min(totalPages, 7) }, (_, index) => {
|
|
2951
2953
|
let pageNum;
|
|
2952
2954
|
if (totalPages <= 7) {
|
|
2953
2955
|
pageNum = index + 1;
|
|
@@ -2956,7 +2958,7 @@ var BookingAdminPanel = ({
|
|
|
2956
2958
|
if (index < 5) {
|
|
2957
2959
|
pageNum = index + 1;
|
|
2958
2960
|
} else if (index === 5) {
|
|
2959
|
-
return /* @__PURE__ */
|
|
2961
|
+
return /* @__PURE__ */ React23.createElement("span", { key: index, className: "px-2 text-slate-400" }, "...");
|
|
2960
2962
|
} else {
|
|
2961
2963
|
pageNum = totalPages;
|
|
2962
2964
|
}
|
|
@@ -2964,7 +2966,7 @@ var BookingAdminPanel = ({
|
|
|
2964
2966
|
if (index === 0) {
|
|
2965
2967
|
pageNum = 1;
|
|
2966
2968
|
} else if (index === 1) {
|
|
2967
|
-
return /* @__PURE__ */
|
|
2969
|
+
return /* @__PURE__ */ React23.createElement("span", { key: index, className: "px-2 text-slate-400" }, "...");
|
|
2968
2970
|
} else {
|
|
2969
2971
|
pageNum = totalPages - 5 + index;
|
|
2970
2972
|
}
|
|
@@ -2972,17 +2974,17 @@ var BookingAdminPanel = ({
|
|
|
2972
2974
|
if (index === 0) {
|
|
2973
2975
|
pageNum = 1;
|
|
2974
2976
|
} else if (index === 1) {
|
|
2975
|
-
return /* @__PURE__ */
|
|
2977
|
+
return /* @__PURE__ */ React23.createElement("span", { key: index, className: "px-2 text-slate-400" }, "...");
|
|
2976
2978
|
} else if (index >= 2 && index <= 4) {
|
|
2977
2979
|
pageNum = currentPage - 3 + index;
|
|
2978
2980
|
} else if (index === 5) {
|
|
2979
|
-
return /* @__PURE__ */
|
|
2981
|
+
return /* @__PURE__ */ React23.createElement("span", { key: index, className: "px-2 text-slate-400" }, "...");
|
|
2980
2982
|
} else {
|
|
2981
2983
|
pageNum = totalPages;
|
|
2982
2984
|
}
|
|
2983
2985
|
}
|
|
2984
2986
|
}
|
|
2985
|
-
return /* @__PURE__ */
|
|
2987
|
+
return /* @__PURE__ */ React23.createElement(
|
|
2986
2988
|
"button",
|
|
2987
2989
|
{
|
|
2988
2990
|
key: index,
|
|
@@ -2991,7 +2993,7 @@ var BookingAdminPanel = ({
|
|
|
2991
2993
|
},
|
|
2992
2994
|
pageNum
|
|
2993
2995
|
);
|
|
2994
|
-
})), /* @__PURE__ */
|
|
2996
|
+
})), /* @__PURE__ */ React23.createElement(
|
|
2995
2997
|
"button",
|
|
2996
2998
|
{
|
|
2997
2999
|
onClick: () => handlePageChange(currentPage + 1),
|
|
@@ -2999,7 +3001,7 @@ var BookingAdminPanel = ({
|
|
|
2999
3001
|
className: "px-3 py-1 text-sm border border-slate-300 rounded hover:bg-slate-50 disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-white"
|
|
3000
3002
|
},
|
|
3001
3003
|
"\u4E0B\u4E00\u9875"
|
|
3002
|
-
))), /* @__PURE__ */
|
|
3004
|
+
))), /* @__PURE__ */ React23.createElement("div", { className: "sm:hidden" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center justify-between pt-4 border-t border-slate-200" }, /* @__PURE__ */ React23.createElement(
|
|
3003
3005
|
"button",
|
|
3004
3006
|
{
|
|
3005
3007
|
onClick: () => handlePageChange(currentPage - 1),
|
|
@@ -3007,7 +3009,7 @@ var BookingAdminPanel = ({
|
|
|
3007
3009
|
className: "flex items-center gap-2 px-4 py-2 text-sm bg-slate-100 rounded hover:bg-slate-200 disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-slate-100"
|
|
3008
3010
|
},
|
|
3009
3011
|
"\u4E0A\u4E00\u9875"
|
|
3010
|
-
), /* @__PURE__ */
|
|
3012
|
+
), /* @__PURE__ */ React23.createElement("span", { className: "text-sm text-slate-600" }, currentPage, " / ", totalPages), /* @__PURE__ */ React23.createElement(
|
|
3011
3013
|
"button",
|
|
3012
3014
|
{
|
|
3013
3015
|
onClick: () => handlePageChange(currentPage + 1),
|
|
@@ -3015,21 +3017,21 @@ var BookingAdminPanel = ({
|
|
|
3015
3017
|
className: "flex items-center gap-2 px-4 py-2 text-sm bg-slate-100 rounded hover:bg-slate-200 disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-slate-100"
|
|
3016
3018
|
},
|
|
3017
3019
|
"\u4E0B\u4E00\u9875"
|
|
3018
|
-
)))), selectedBooking && /* @__PURE__ */
|
|
3020
|
+
)))), selectedBooking && /* @__PURE__ */ React23.createElement("div", { className: "fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50" }, /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-xl max-w-2xl w-full max-h-[90vh] overflow-hidden" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center justify-between p-4 sm:p-6 border-b border-slate-200" }, /* @__PURE__ */ React23.createElement("h2", { className: "text-lg sm:text-xl font-semibold text-slate-800" }, "\u9884\u8BA2\u8BE6\u60C5"), /* @__PURE__ */ React23.createElement(
|
|
3019
3021
|
"button",
|
|
3020
3022
|
{
|
|
3021
3023
|
onClick: () => setSelectedBooking(null),
|
|
3022
3024
|
className: "text-slate-400 hover:text-slate-600 text-2xl font-bold leading-none p-1"
|
|
3023
3025
|
},
|
|
3024
3026
|
"\xD7"
|
|
3025
|
-
)), /* @__PURE__ */
|
|
3027
|
+
)), /* @__PURE__ */ React23.createElement("div", { className: "p-4 sm:p-6 overflow-y-auto max-h-[calc(90vh-140px)]" }, /* @__PURE__ */ React23.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("h3", { className: "text-base sm:text-lg font-semibold text-slate-800 mb-3" }, "\u753B\u96C6\u4FE1\u606F"), /* @__PURE__ */ React23.createElement("div", { className: "flex items-start gap-3 sm:gap-4" }, selectedBooking.collection.coverImage ? /* @__PURE__ */ React23.createElement(
|
|
3026
3028
|
"img",
|
|
3027
3029
|
{
|
|
3028
3030
|
src: selectedBooking.collection.coverImage,
|
|
3029
3031
|
alt: selectedBooking.collection.title,
|
|
3030
3032
|
className: "w-16 h-16 sm:w-20 sm:h-20 object-cover rounded-lg flex-shrink-0"
|
|
3031
3033
|
}
|
|
3032
|
-
) : /* @__PURE__ */
|
|
3034
|
+
) : /* @__PURE__ */ React23.createElement("div", { className: "w-16 h-16 sm:w-20 sm:h-20 bg-slate-100 rounded-lg flex-shrink-0 flex items-center justify-center text-slate-400 text-xs" }, "\u6682\u65E0\u56FE\u7247"), /* @__PURE__ */ React23.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React23.createElement("h4", { className: "font-medium text-slate-800 truncate" }, selectedBooking.collection.title), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-600" }, "\u7F16\u53F7\uFF1A", selectedBooking.collection.number), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-600" }, "\u4EF7\u683C\uFF1A\xA5", selectedBooking.collection.price || "\u5F85\u5B9A")))), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("h3", { className: "text-base sm:text-lg font-semibold text-slate-800 mb-3" }, "\u9884\u8BA2\u4FE1\u606F"), /* @__PURE__ */ React23.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-3 sm:gap-4" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "\u9884\u8BA2ID"), /* @__PURE__ */ React23.createElement("p", { className: "font-medium text-slate-800" }, "#", selectedBooking.id)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "QQ\u53F7"), /* @__PURE__ */ React23.createElement("p", { className: "font-medium text-slate-800" }, selectedBooking.qqNumber)), selectedBooking.phoneNumber && /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "\u624B\u673A\u53F7"), /* @__PURE__ */ React23.createElement("p", { className: "font-medium text-slate-800" }, selectedBooking.phoneNumber)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "\u9884\u8BA2\u6570\u91CF"), /* @__PURE__ */ React23.createElement("p", { className: "font-medium text-slate-800" }, selectedBooking.quantity)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "\u603B\u4EF7\u683C"), /* @__PURE__ */ React23.createElement("p", { className: "font-medium text-slate-800" }, "\xA5", selectedBooking.totalPrice)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "\u72B6\u6001"), /* @__PURE__ */ React23.createElement("span", { className: `inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${getStatusInfo(selectedBooking.status).color}` }, getStatusInfo(selectedBooking.status).label)))), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("h3", { className: "text-base sm:text-lg font-semibold text-slate-800 mb-3" }, "\u65F6\u95F4\u4FE1\u606F"), /* @__PURE__ */ React23.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "\u9884\u8BA2\u65F6\u95F4"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm font-medium text-slate-800" }, formatTime(selectedBooking.createdAt))), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "\u66F4\u65B0\u65F6\u95F4"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm font-medium text-slate-800" }, formatTime(selectedBooking.updatedAt))), selectedBooking.confirmedAt && /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "\u786E\u8BA4\u65F6\u95F4"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm font-medium text-slate-800" }, formatTime(selectedBooking.confirmedAt))), selectedBooking.completedAt && /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "\u5B8C\u6210\u65F6\u95F4"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm font-medium text-slate-800" }, formatTime(selectedBooking.completedAt))), selectedBooking.cancelledAt && /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "\u53D6\u6D88\u65F6\u95F4"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm font-medium text-slate-800" }, formatTime(selectedBooking.cancelledAt))))), selectedBooking.notes && /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("h3", { className: "text-base sm:text-lg font-semibold text-slate-800 mb-3" }, "\u7528\u6237\u5907\u6CE8"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-800 bg-slate-50 p-4 rounded-lg break-words" }, selectedBooking.notes)), selectedBooking.adminNotes && /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("h3", { className: "text-base sm:text-lg font-semibold text-slate-800 mb-3" }, "\u7BA1\u7406\u5458\u5907\u6CE8"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-800 bg-slate-50 p-4 rounded-lg break-words" }, selectedBooking.adminNotes)))))));
|
|
3033
3035
|
};
|
|
3034
3036
|
var BookingModal = ({
|
|
3035
3037
|
isOpen,
|
|
@@ -3038,7 +3040,7 @@ var BookingModal = ({
|
|
|
3038
3040
|
width = "90vw",
|
|
3039
3041
|
height = "90vh"
|
|
3040
3042
|
}) => {
|
|
3041
|
-
return /* @__PURE__ */
|
|
3043
|
+
return /* @__PURE__ */ React23.createElement(
|
|
3042
3044
|
Modal,
|
|
3043
3045
|
{
|
|
3044
3046
|
isOpen,
|
|
@@ -3048,7 +3050,7 @@ var BookingModal = ({
|
|
|
3048
3050
|
maskClosable: false,
|
|
3049
3051
|
className: "max-w-6xl"
|
|
3050
3052
|
},
|
|
3051
|
-
/* @__PURE__ */
|
|
3053
|
+
/* @__PURE__ */ React23.createElement(BookingPage, { onClose })
|
|
3052
3054
|
);
|
|
3053
3055
|
};
|
|
3054
3056
|
init_hooks();
|
|
@@ -3093,14 +3095,14 @@ var BookingPage = ({ onClose }) => {
|
|
|
3093
3095
|
};
|
|
3094
3096
|
const selectedCollection = collections.find((c) => c.id === formData.collectionId);
|
|
3095
3097
|
if (submitted) {
|
|
3096
|
-
return /* @__PURE__ */
|
|
3098
|
+
return /* @__PURE__ */ React23.createElement("div", { className: "max-w-2xl mx-auto p-6" }, /* @__PURE__ */ React23.createElement("div", { className: "text-center" }, /* @__PURE__ */ React23.createElement("div", { className: "text-green-500 text-6xl mb-4" }, "\u2705"), /* @__PURE__ */ React23.createElement("h2", { className: "text-2xl font-bold text-gray-900 mb-4" }, "\u9884\u8BA2\u63D0\u4EA4\u6210\u529F\uFF01"), /* @__PURE__ */ React23.createElement("p", { className: "text-gray-600 mb-6" }, "\u60A8\u7684\u9884\u8BA2\u5DF2\u6210\u529F\u63D0\u4EA4\uFF0C\u6211\u4EEC\u4F1A\u5C3D\u5FEB\u4E0E\u60A8\u8054\u7CFB\u786E\u8BA4\u3002"), /* @__PURE__ */ React23.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React23.createElement(
|
|
3097
3099
|
"button",
|
|
3098
3100
|
{
|
|
3099
3101
|
onClick: handleNewBooking,
|
|
3100
3102
|
className: "w-full bg-blue-600 text-white py-2 px-4 rounded-lg hover:bg-blue-700 transition-colors"
|
|
3101
3103
|
},
|
|
3102
3104
|
"\u7EE7\u7EED\u9884\u8BA2\u5176\u4ED6\u753B\u96C6"
|
|
3103
|
-
), onClose && /* @__PURE__ */
|
|
3105
|
+
), onClose && /* @__PURE__ */ React23.createElement(
|
|
3104
3106
|
"button",
|
|
3105
3107
|
{
|
|
3106
3108
|
onClick: onClose,
|
|
@@ -3109,29 +3111,29 @@ var BookingPage = ({ onClose }) => {
|
|
|
3109
3111
|
"\u5173\u95ED"
|
|
3110
3112
|
))));
|
|
3111
3113
|
}
|
|
3112
|
-
return /* @__PURE__ */
|
|
3114
|
+
return /* @__PURE__ */ React23.createElement("div", { className: "max-w-4xl mx-auto p-6" }, /* @__PURE__ */ React23.createElement("div", { className: "text-center mb-8" }, /* @__PURE__ */ React23.createElement("h1", { className: "text-3xl font-bold text-gray-900 mb-2" }, "\u9884\u8BA2\u753B\u96C6"), /* @__PURE__ */ React23.createElement("p", { className: "text-gray-600" }, "\u9009\u62E9\u60A8\u559C\u6B22\u7684\u753B\u96C6\u5E76\u586B\u5199\u9884\u8BA2\u4FE1\u606F")), error && /* @__PURE__ */ React23.createElement("div", { className: "bg-red-50 border border-red-200 rounded-lg p-4 mb-6" }, /* @__PURE__ */ React23.createElement("div", { className: "flex" }, /* @__PURE__ */ React23.createElement("div", { className: "text-red-400 mr-3" }, /* @__PURE__ */ React23.createElement("svg", { className: "w-5 h-5", fill: "currentColor", viewBox: "0 0 20 20" }, /* @__PURE__ */ React23.createElement("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z", clipRule: "evenodd" }))), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("h3", { className: "text-sm font-medium text-red-800" }, "\u63D0\u4EA4\u5931\u8D25"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-red-700 mt-1" }, error)))), /* @__PURE__ */ React23.createElement("div", { className: "flex items-center justify-center mb-8" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ React23.createElement("div", { className: `w-8 h-8 rounded-full flex items-center justify-center text-sm font-medium ${step === "select" ? "bg-blue-600 text-white" : "bg-green-500 text-white"}` }, step === "select" ? "1" : "\u2713"), /* @__PURE__ */ React23.createElement("div", { className: `ml-2 ${step === "select" ? "text-blue-600" : "text-green-600"}` }, "\u9009\u62E9\u753B\u96C6")), /* @__PURE__ */ React23.createElement("div", { className: "w-16 h-0.5 bg-gray-300 mx-4" }), /* @__PURE__ */ React23.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ React23.createElement("div", { className: `w-8 h-8 rounded-full flex items-center justify-center text-sm font-medium ${step === "form" ? "bg-blue-600 text-white" : "bg-gray-300 text-gray-600"}` }, "2"), /* @__PURE__ */ React23.createElement("div", { className: `ml-2 ${step === "form" ? "text-blue-600" : "text-gray-500"}` }, "\u586B\u5199\u4FE1\u606F"))), step === "select" && /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React23.createElement("h2", { className: "text-xl font-semibold text-gray-900 mb-2" }, "\u9009\u62E9\u8981\u9884\u8BA2\u7684\u753B\u96C6"), /* @__PURE__ */ React23.createElement("p", { className: "text-gray-600" }, "\u70B9\u51FB\u4E0B\u65B9\u753B\u96C6\u5361\u7247\u8FDB\u884C\u9009\u62E9")), /* @__PURE__ */ React23.createElement(
|
|
3113
3115
|
CollectionList,
|
|
3114
3116
|
{
|
|
3115
3117
|
collections,
|
|
3116
3118
|
loading,
|
|
3117
3119
|
onSelectCollection: handleCollectionSelect
|
|
3118
3120
|
}
|
|
3119
|
-
)), step === "form" && selectedCollection && /* @__PURE__ */
|
|
3121
|
+
)), step === "form" && selectedCollection && /* @__PURE__ */ React23.createElement("div", { className: "max-w-2xl mx-auto" }, /* @__PURE__ */ React23.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React23.createElement(
|
|
3120
3122
|
"button",
|
|
3121
3123
|
{
|
|
3122
3124
|
onClick: handleBackToSelect,
|
|
3123
3125
|
className: "text-blue-600 hover:text-blue-800 flex items-center mb-4"
|
|
3124
3126
|
},
|
|
3125
|
-
/* @__PURE__ */
|
|
3127
|
+
/* @__PURE__ */ React23.createElement("svg", { className: "w-4 h-4 mr-1", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React23.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M15 19l-7-7 7-7" })),
|
|
3126
3128
|
"\u8FD4\u56DE\u9009\u62E9\u753B\u96C6"
|
|
3127
|
-
), /* @__PURE__ */
|
|
3129
|
+
), /* @__PURE__ */ React23.createElement("h2", { className: "text-xl font-semibold text-gray-900 mb-4" }, "\u586B\u5199\u9884\u8BA2\u4FE1\u606F"), /* @__PURE__ */ React23.createElement("div", { className: "bg-gray-50 rounded-lg p-4 mb-6" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center" }, selectedCollection.coverImage ? /* @__PURE__ */ React23.createElement(
|
|
3128
3130
|
"img",
|
|
3129
3131
|
{
|
|
3130
3132
|
src: selectedCollection.coverImage,
|
|
3131
3133
|
alt: selectedCollection.title,
|
|
3132
3134
|
className: "w-16 h-16 object-cover rounded-md mr-4"
|
|
3133
3135
|
}
|
|
3134
|
-
) : /* @__PURE__ */
|
|
3136
|
+
) : /* @__PURE__ */ React23.createElement("div", { className: "w-16 h-16 bg-gray-100 rounded-md mr-4 flex items-center justify-center text-gray-400 text-xs" }, "\u6682\u65E0\u56FE\u7247"), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("h3", { className: "font-semibold text-gray-900" }, selectedCollection.title), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-gray-600" }, "\u7F16\u53F7\uFF1A", selectedCollection.number), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-gray-600" }, "\u4EF7\u683C\uFF1A", selectedCollection.price ? `\xA5${selectedCollection.price}` : "\u4EF7\u683C\u5F85\u5B9A"))))), /* @__PURE__ */ React23.createElement("form", { onSubmit: handleSubmit, className: "space-y-6" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { htmlFor: "qqNumber", className: "block text-sm font-medium text-gray-700 mb-2" }, "QQ\u53F7 ", /* @__PURE__ */ React23.createElement("span", { className: "text-red-500" }, "*")), /* @__PURE__ */ React23.createElement(
|
|
3135
3137
|
"input",
|
|
3136
3138
|
{
|
|
3137
3139
|
type: "text",
|
|
@@ -3142,7 +3144,7 @@ var BookingPage = ({ onClose }) => {
|
|
|
3142
3144
|
placeholder: "\u8BF7\u8F93\u5165\u60A8\u7684QQ\u53F7",
|
|
3143
3145
|
disabled: submitting
|
|
3144
3146
|
}
|
|
3145
|
-
), errors.qqNumber && /* @__PURE__ */
|
|
3147
|
+
), errors.qqNumber && /* @__PURE__ */ React23.createElement("p", { className: "mt-1 text-sm text-red-600" }, errors.qqNumber)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { htmlFor: "phoneNumber", className: "block text-sm font-medium text-gray-700 mb-2" }, "\u624B\u673A\u53F7"), /* @__PURE__ */ React23.createElement(
|
|
3146
3148
|
"input",
|
|
3147
3149
|
{
|
|
3148
3150
|
type: "tel",
|
|
@@ -3153,7 +3155,7 @@ var BookingPage = ({ onClose }) => {
|
|
|
3153
3155
|
placeholder: "\u8BF7\u8F93\u5165\u60A8\u7684\u624B\u673A\u53F7\uFF08\u53EF\u9009\uFF09",
|
|
3154
3156
|
disabled: submitting
|
|
3155
3157
|
}
|
|
3156
|
-
), errors.phoneNumber && /* @__PURE__ */
|
|
3158
|
+
), errors.phoneNumber && /* @__PURE__ */ React23.createElement("p", { className: "mt-1 text-sm text-red-600" }, errors.phoneNumber)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { htmlFor: "quantity", className: "block text-sm font-medium text-gray-700 mb-2" }, "\u9884\u8BA2\u6570\u91CF ", /* @__PURE__ */ React23.createElement("span", { className: "text-red-500" }, "*")), /* @__PURE__ */ React23.createElement(
|
|
3157
3159
|
"input",
|
|
3158
3160
|
{
|
|
3159
3161
|
type: "number",
|
|
@@ -3165,7 +3167,7 @@ var BookingPage = ({ onClose }) => {
|
|
|
3165
3167
|
placeholder: "\u8BF7\u8F93\u5165\u9884\u8BA2\u6570\u91CF",
|
|
3166
3168
|
disabled: submitting
|
|
3167
3169
|
}
|
|
3168
|
-
), errors.quantity && /* @__PURE__ */
|
|
3170
|
+
), errors.quantity && /* @__PURE__ */ React23.createElement("p", { className: "mt-1 text-sm text-red-600" }, errors.quantity)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { htmlFor: "notes", className: "block text-sm font-medium text-gray-700 mb-2" }, "\u5907\u6CE8\u4FE1\u606F"), /* @__PURE__ */ React23.createElement(
|
|
3169
3171
|
"textarea",
|
|
3170
3172
|
{
|
|
3171
3173
|
id: "notes",
|
|
@@ -3176,7 +3178,7 @@ var BookingPage = ({ onClose }) => {
|
|
|
3176
3178
|
placeholder: "\u8BF7\u8F93\u5165\u5907\u6CE8\u4FE1\u606F\uFF08\u53EF\u9009\uFF09",
|
|
3177
3179
|
disabled: submitting
|
|
3178
3180
|
}
|
|
3179
|
-
)), /* @__PURE__ */
|
|
3181
|
+
)), /* @__PURE__ */ React23.createElement("div", { className: "pt-4" }, /* @__PURE__ */ React23.createElement(
|
|
3180
3182
|
"button",
|
|
3181
3183
|
{
|
|
3182
3184
|
type: "submit",
|
|
@@ -3251,57 +3253,57 @@ var CartHistoryPage = ({
|
|
|
3251
3253
|
return sum + price * booking.quantity;
|
|
3252
3254
|
}, 0);
|
|
3253
3255
|
const completedBookings = bookings.filter((booking) => booking.status === "completed").length;
|
|
3254
|
-
return /* @__PURE__ */
|
|
3256
|
+
return /* @__PURE__ */ React23.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-slate-200 p-6" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("h1", { className: "text-2xl font-bold text-slate-800" }, "\u6211\u7684\u9884\u8BA2\u5386\u53F2"), /* @__PURE__ */ React23.createElement("p", { className: "text-slate-600 mt-1" }, "QQ: ", qqNumber, " | \u624B\u673A: ", phoneNumber)), /* @__PURE__ */ React23.createElement("div", { className: "flex gap-2" }, /* @__PURE__ */ React23.createElement(
|
|
3255
3257
|
"button",
|
|
3256
3258
|
{
|
|
3257
3259
|
onClick: loadBookings,
|
|
3258
3260
|
disabled: loading,
|
|
3259
3261
|
className: "flex items-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 transition-colors disabled:opacity-50"
|
|
3260
3262
|
},
|
|
3261
|
-
/* @__PURE__ */
|
|
3263
|
+
/* @__PURE__ */ React23.createElement(RefreshCw, { size: 16, className: loading ? "animate-spin" : "" }),
|
|
3262
3264
|
"\u5237\u65B0"
|
|
3263
|
-
)))), totalBookings > 0 && /* @__PURE__ */
|
|
3265
|
+
)))), totalBookings > 0 && /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-slate-200 p-6" }, /* @__PURE__ */ React23.createElement("div", { className: "grid grid-cols-2 lg:grid-cols-4 gap-4" }, /* @__PURE__ */ React23.createElement("div", { className: "text-center" }, /* @__PURE__ */ React23.createElement("div", { className: "text-2xl font-bold text-slate-800" }, totalBookings), /* @__PURE__ */ React23.createElement("div", { className: "text-sm text-slate-600" }, "\u603B\u9884\u8BA2\u6B21\u6570")), /* @__PURE__ */ React23.createElement("div", { className: "text-center" }, /* @__PURE__ */ React23.createElement("div", { className: "text-2xl font-bold text-slate-800" }, totalQuantity), /* @__PURE__ */ React23.createElement("div", { className: "text-sm text-slate-600" }, "\u603B\u9884\u8BA2\u6570\u91CF")), /* @__PURE__ */ React23.createElement("div", { className: "text-center" }, /* @__PURE__ */ React23.createElement("div", { className: "text-2xl font-bold text-slate-800" }, "\xA5", totalPrice), /* @__PURE__ */ React23.createElement("div", { className: "text-sm text-slate-600" }, "\u603B\u9884\u8BA2\u91D1\u989D")), /* @__PURE__ */ React23.createElement("div", { className: "text-center" }, /* @__PURE__ */ React23.createElement("div", { className: "text-2xl font-bold text-slate-800" }, completedBookings), /* @__PURE__ */ React23.createElement("div", { className: "text-sm text-slate-600" }, "\u5DF2\u5B8C\u6210")))), error && /* @__PURE__ */ React23.createElement("div", { className: "bg-red-50 border border-red-200 rounded-lg p-4" }, /* @__PURE__ */ React23.createElement("div", { className: "flex" }, /* @__PURE__ */ React23.createElement("div", { className: "text-red-400 mr-3 flex-shrink-0" }, /* @__PURE__ */ React23.createElement(XCircle, { size: 20 })), /* @__PURE__ */ React23.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React23.createElement("h3", { className: "text-sm font-medium text-red-800" }, "\u67E5\u8BE2\u5931\u8D25"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-red-700 mt-1" }, error)))), /* @__PURE__ */ React23.createElement("div", { className: "space-y-4" }, loading ? /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-slate-200 p-8 text-center" }, /* @__PURE__ */ React23.createElement(RefreshCw, { size: 40, className: "text-slate-400 mx-auto mb-4 animate-spin" }), /* @__PURE__ */ React23.createElement("h3", { className: "text-lg font-medium text-slate-800 mb-2" }, "\u52A0\u8F7D\u4E2D..."), /* @__PURE__ */ React23.createElement("p", { className: "text-slate-600" }, "\u6B63\u5728\u83B7\u53D6\u60A8\u7684\u9884\u8BA2\u5386\u53F2\u8BB0\u5F55")) : totalBookings === 0 ? /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-slate-200 p-8 text-center" }, /* @__PURE__ */ React23.createElement(Calendar, { size: 40, className: "text-slate-400 mx-auto mb-4" }), /* @__PURE__ */ React23.createElement("h3", { className: "text-lg font-medium text-slate-800 mb-2" }, "\u6682\u65E0\u9884\u8BA2\u8BB0\u5F55"), /* @__PURE__ */ React23.createElement("p", { className: "text-slate-600" }, "\u60A8\u8FD8\u6CA1\u6709\u63D0\u4EA4\u8FC7\u4EFB\u4F55\u9884\u8BA2")) : bookings.map((booking) => {
|
|
3264
3266
|
const statusInfo = getStatusInfo(booking.status);
|
|
3265
3267
|
const totalPrice2 = (booking.collection?.price || 0) * booking.quantity;
|
|
3266
|
-
return /* @__PURE__ */
|
|
3268
|
+
return /* @__PURE__ */ React23.createElement("div", { key: booking.id, className: "bg-white rounded-lg shadow-sm border border-slate-200 overflow-hidden" }, /* @__PURE__ */ React23.createElement("div", { className: "p-6" }, /* @__PURE__ */ React23.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start sm:justify-between gap-4 mb-4" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-start gap-4" }, /* @__PURE__ */ React23.createElement(
|
|
3267
3269
|
"img",
|
|
3268
3270
|
{
|
|
3269
3271
|
src: booking.collection?.coverImage || "",
|
|
3270
3272
|
alt: booking.collection?.title || "\u672A\u77E5\u753B\u96C6",
|
|
3271
3273
|
className: "w-16 h-16 object-cover rounded-lg flex-shrink-0"
|
|
3272
3274
|
}
|
|
3273
|
-
), /* @__PURE__ */
|
|
3275
|
+
), /* @__PURE__ */ React23.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React23.createElement("h3", { className: "text-lg font-semibold text-slate-800" }, booking.collection?.title || "\u672A\u77E5\u753B\u96C6"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-600" }, "\u7F16\u53F7\uFF1A", booking.collection?.number || "\u672A\u77E5\u7F16\u53F7"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-600" }, "\u9884\u8BA2\u65F6\u95F4\uFF1A", formatTime(booking.createdAt)), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-600" }, "\u6570\u91CF\uFF1A", booking.quantity, " | \u603B\u4EF7\uFF1A\xA5", totalPrice2))), /* @__PURE__ */ React23.createElement("div", { className: "text-left sm:text-right" }, /* @__PURE__ */ React23.createElement("span", { className: `inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${statusInfo.color}` }, statusInfo.label), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500 mt-1" }, "\u9884\u8BA2ID: ", booking.id))), booking.notes && /* @__PURE__ */ React23.createElement("div", { className: "mb-4" }, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "\u5907\u6CE8"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-800 bg-slate-50 p-3 rounded-lg break-words" }, booking.notes)), booking.adminNotes && /* @__PURE__ */ React23.createElement("div", { className: "mb-4" }, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "\u7BA1\u7406\u5458\u5907\u6CE8"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-800 bg-blue-50 p-3 rounded-lg break-words" }, booking.adminNotes)), /* @__PURE__ */ React23.createElement("div", { className: "flex flex-col sm:flex-row gap-2" }, /* @__PURE__ */ React23.createElement(
|
|
3274
3276
|
"button",
|
|
3275
3277
|
{
|
|
3276
3278
|
onClick: () => setSelectedBooking(booking),
|
|
3277
3279
|
className: "flex items-center justify-center gap-2 px-4 py-2 bg-slate-100 text-slate-700 rounded-lg font-medium hover:bg-slate-200 transition-colors"
|
|
3278
3280
|
},
|
|
3279
|
-
/* @__PURE__ */
|
|
3281
|
+
/* @__PURE__ */ React23.createElement(Eye, { size: 16 }),
|
|
3280
3282
|
"\u67E5\u770B\u8BE6\u60C5"
|
|
3281
|
-
), /* @__PURE__ */
|
|
3283
|
+
), /* @__PURE__ */ React23.createElement(
|
|
3282
3284
|
"button",
|
|
3283
3285
|
{
|
|
3284
3286
|
onClick: () => handleDeleteBooking(booking.id),
|
|
3285
3287
|
className: "flex items-center justify-center gap-2 px-4 py-2 bg-red-100 text-red-700 rounded-lg font-medium hover:bg-red-200 transition-colors"
|
|
3286
3288
|
},
|
|
3287
|
-
/* @__PURE__ */
|
|
3289
|
+
/* @__PURE__ */ React23.createElement(Trash2, { size: 16 }),
|
|
3288
3290
|
"\u5220\u9664\u8BB0\u5F55"
|
|
3289
3291
|
))));
|
|
3290
|
-
})), selectedBooking && /* @__PURE__ */
|
|
3292
|
+
})), selectedBooking && /* @__PURE__ */ React23.createElement("div", { className: "fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50" }, /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-xl max-w-2xl w-full max-h-[90vh] overflow-hidden" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center justify-between p-6 border-b border-slate-200" }, /* @__PURE__ */ React23.createElement("h2", { className: "text-xl font-semibold text-slate-800" }, "\u9884\u8BA2\u8BE6\u60C5"), /* @__PURE__ */ React23.createElement(
|
|
3291
3293
|
"button",
|
|
3292
3294
|
{
|
|
3293
3295
|
onClick: () => setSelectedBooking(null),
|
|
3294
3296
|
className: "text-slate-400 hover:text-slate-600 text-2xl font-bold leading-none"
|
|
3295
3297
|
},
|
|
3296
3298
|
"\xD7"
|
|
3297
|
-
)), /* @__PURE__ */
|
|
3299
|
+
)), /* @__PURE__ */ React23.createElement("div", { className: "p-6 overflow-y-auto max-h-[calc(90vh-140px)]" }, /* @__PURE__ */ React23.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("h3", { className: "text-lg font-semibold text-slate-800 mb-3" }, "\u57FA\u672C\u4FE1\u606F"), /* @__PURE__ */ React23.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-3" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "\u9884\u8BA2ID"), /* @__PURE__ */ React23.createElement("p", { className: "font-medium text-slate-800" }, selectedBooking.id)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "\u9884\u8BA2\u65F6\u95F4"), /* @__PURE__ */ React23.createElement("p", { className: "font-medium text-slate-800" }, formatTime(selectedBooking.createdAt))), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "QQ\u53F7"), /* @__PURE__ */ React23.createElement("p", { className: "font-medium text-slate-800" }, selectedBooking.qqNumber)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "\u624B\u673A\u53F7"), /* @__PURE__ */ React23.createElement("p", { className: "font-medium text-slate-800" }, selectedBooking.phoneNumber)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "\u72B6\u6001"), /* @__PURE__ */ React23.createElement("span", { className: `inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${getStatusInfo(selectedBooking.status).color}` }, getStatusInfo(selectedBooking.status).label)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "\u6570\u91CF"), /* @__PURE__ */ React23.createElement("p", { className: "font-medium text-slate-800" }, selectedBooking.quantity)))), selectedBooking.collection && /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("h3", { className: "text-lg font-semibold text-slate-800 mb-3" }, "\u753B\u96C6\u8BE6\u60C5"), /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-4 p-4 bg-slate-50 rounded-lg" }, selectedBooking.collection.coverImage ? /* @__PURE__ */ React23.createElement(
|
|
3298
3300
|
"img",
|
|
3299
3301
|
{
|
|
3300
3302
|
src: selectedBooking.collection.coverImage,
|
|
3301
3303
|
alt: selectedBooking.collection.title,
|
|
3302
3304
|
className: "w-16 h-16 object-cover rounded-lg flex-shrink-0"
|
|
3303
3305
|
}
|
|
3304
|
-
) : /* @__PURE__ */
|
|
3306
|
+
) : /* @__PURE__ */ React23.createElement("div", { className: "w-16 h-16 bg-slate-100 rounded-lg flex-shrink-0 flex items-center justify-center text-slate-400 text-xs" }, "\u6682\u65E0\u56FE\u7247"), /* @__PURE__ */ React23.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React23.createElement("h4", { className: "font-medium text-slate-800" }, selectedBooking.collection.title), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-600" }, "\u7F16\u53F7\uFF1A", selectedBooking.collection.number), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-600" }, "\u5355\u4EF7\uFF1A\xA5", selectedBooking.collection.price || "\u5F85\u5B9A")), /* @__PURE__ */ React23.createElement("div", { className: "text-right" }, /* @__PURE__ */ React23.createElement("p", { className: "font-medium text-slate-800" }, "\u6570\u91CF\uFF1A", selectedBooking.quantity), /* @__PURE__ */ React23.createElement("p", { className: "font-medium text-slate-800" }, "\u603B\u4EF7\uFF1A\xA5", (selectedBooking.collection.price || 0) * selectedBooking.quantity)))), selectedBooking.notes && /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("h3", { className: "text-lg font-semibold text-slate-800 mb-3" }, "\u7528\u6237\u5907\u6CE8"), /* @__PURE__ */ React23.createElement("p", { className: "text-slate-800 bg-slate-50 p-4 rounded-lg break-words" }, selectedBooking.notes)), selectedBooking.adminNotes && /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("h3", { className: "text-lg font-semibold text-slate-800 mb-3" }, "\u7BA1\u7406\u5458\u5907\u6CE8"), /* @__PURE__ */ React23.createElement("p", { className: "text-slate-800 bg-blue-50 p-4 rounded-lg break-words" }, selectedBooking.adminNotes)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("h3", { className: "text-lg font-semibold text-slate-800 mb-3" }, "\u65F6\u95F4\u4FE1\u606F"), /* @__PURE__ */ React23.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-3" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "\u521B\u5EFA\u65F6\u95F4"), /* @__PURE__ */ React23.createElement("p", { className: "font-medium text-slate-800" }, formatTime(selectedBooking.createdAt))), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "\u66F4\u65B0\u65F6\u95F4"), /* @__PURE__ */ React23.createElement("p", { className: "font-medium text-slate-800" }, formatTime(selectedBooking.updatedAt))), selectedBooking.confirmedAt && /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "\u786E\u8BA4\u65F6\u95F4"), /* @__PURE__ */ React23.createElement("p", { className: "font-medium text-slate-800" }, formatTime(selectedBooking.confirmedAt))), selectedBooking.completedAt && /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "\u5B8C\u6210\u65F6\u95F4"), /* @__PURE__ */ React23.createElement("p", { className: "font-medium text-slate-800" }, formatTime(selectedBooking.completedAt))), selectedBooking.cancelledAt && /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-500" }, "\u53D6\u6D88\u65F6\u95F4"), /* @__PURE__ */ React23.createElement("p", { className: "font-medium text-slate-800" }, formatTime(selectedBooking.cancelledAt))))))))));
|
|
3305
3307
|
};
|
|
3306
3308
|
var DeadlinePopup = ({
|
|
3307
3309
|
config,
|
|
@@ -3315,15 +3317,15 @@ var DeadlinePopup = ({
|
|
|
3315
3317
|
const iconProps = { size: 24, className: "flex-shrink-0" };
|
|
3316
3318
|
switch (theme2) {
|
|
3317
3319
|
case "warning":
|
|
3318
|
-
return /* @__PURE__ */
|
|
3320
|
+
return /* @__PURE__ */ React23.createElement(AlertTriangle, { ...iconProps, className: "text-amber-500" });
|
|
3319
3321
|
case "info":
|
|
3320
|
-
return /* @__PURE__ */
|
|
3322
|
+
return /* @__PURE__ */ React23.createElement(Info, { ...iconProps, className: "text-blue-500" });
|
|
3321
3323
|
case "error":
|
|
3322
|
-
return /* @__PURE__ */
|
|
3324
|
+
return /* @__PURE__ */ React23.createElement(XCircle, { ...iconProps, className: "text-red-500" });
|
|
3323
3325
|
case "success":
|
|
3324
|
-
return /* @__PURE__ */
|
|
3326
|
+
return /* @__PURE__ */ React23.createElement(CheckCircle, { ...iconProps, className: "text-green-500" });
|
|
3325
3327
|
default:
|
|
3326
|
-
return /* @__PURE__ */
|
|
3328
|
+
return /* @__PURE__ */ React23.createElement(Clock, { ...iconProps, className: "text-slate-500" });
|
|
3327
3329
|
}
|
|
3328
3330
|
};
|
|
3329
3331
|
const getThemeStyles = (theme2 = "warning") => {
|
|
@@ -3397,7 +3399,7 @@ var DeadlinePopup = ({
|
|
|
3397
3399
|
const { contentConfig, displayConfig } = config;
|
|
3398
3400
|
const theme = contentConfig.theme || "warning";
|
|
3399
3401
|
const styles = getThemeStyles(theme);
|
|
3400
|
-
return /* @__PURE__ */
|
|
3402
|
+
return /* @__PURE__ */ React23.createElement(
|
|
3401
3403
|
Modal,
|
|
3402
3404
|
{
|
|
3403
3405
|
isOpen,
|
|
@@ -3407,14 +3409,14 @@ var DeadlinePopup = ({
|
|
|
3407
3409
|
maskClosable: displayConfig?.maskClosable ?? true,
|
|
3408
3410
|
zIndex: 9999
|
|
3409
3411
|
},
|
|
3410
|
-
/* @__PURE__ */
|
|
3412
|
+
/* @__PURE__ */ React23.createElement("div", { className: `${styles.bgColor} ${styles.borderColor} border rounded-lg p-6` }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-start gap-4 mb-4" }, getThemeIcon(theme), /* @__PURE__ */ React23.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ React23.createElement("h3", { className: `text-lg font-semibold ${styles.titleColor} mb-2` }, contentConfig.title), countdown > 0 && /* @__PURE__ */ React23.createElement("div", { className: "text-sm text-slate-500 mb-2" }, /* @__PURE__ */ React23.createElement(Clock, { size: 14, className: "inline mr-1" }), countdown, " \u79D2\u540E\u81EA\u52A8\u5173\u95ED"))), /* @__PURE__ */ React23.createElement("div", { className: `${styles.messageColor} mb-6 leading-relaxed whitespace-pre-wrap` }, contentConfig.message), /* @__PURE__ */ React23.createElement("div", { className: "flex justify-end gap-3" }, contentConfig.showCancel !== false && /* @__PURE__ */ React23.createElement(
|
|
3411
3413
|
"button",
|
|
3412
3414
|
{
|
|
3413
3415
|
onClick: handleCancel,
|
|
3414
3416
|
className: "px-4 py-2 text-slate-600 hover:text-slate-700 transition-colors"
|
|
3415
3417
|
},
|
|
3416
3418
|
contentConfig.cancelText || "\u53D6\u6D88"
|
|
3417
|
-
), /* @__PURE__ */
|
|
3419
|
+
), /* @__PURE__ */ React23.createElement(
|
|
3418
3420
|
"button",
|
|
3419
3421
|
{
|
|
3420
3422
|
onClick: handleConfirm,
|
|
@@ -3465,7 +3467,7 @@ var DeadlinePopupManager = ({
|
|
|
3465
3467
|
if (!currentConfig) {
|
|
3466
3468
|
return null;
|
|
3467
3469
|
}
|
|
3468
|
-
return /* @__PURE__ */
|
|
3470
|
+
return /* @__PURE__ */ React23.createElement(
|
|
3469
3471
|
DeadlinePopup,
|
|
3470
3472
|
{
|
|
3471
3473
|
config: currentConfig,
|
|
@@ -3720,37 +3722,37 @@ var PopupConfigManagement = () => {
|
|
|
3720
3722
|
return theme;
|
|
3721
3723
|
}
|
|
3722
3724
|
};
|
|
3723
|
-
return /* @__PURE__ */
|
|
3725
|
+
return /* @__PURE__ */ React23.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("h2", { className: "text-xl font-semibold text-slate-800" }, "\u5F39\u7A97\u914D\u7F6E\u7BA1\u7406"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-slate-600 mt-1" }, "\u7BA1\u7406\u8D2D\u7269\u8F66\u63D0\u4EA4\u65F6\u7684\u9650\u65F6\u63D0\u9192\u5F39\u7A97"), /* @__PURE__ */ React23.createElement("div", { className: "mt-2 text-xs text-slate-500" }, "\u72B6\u6001: ", loading ? "\u52A0\u8F7D\u4E2D" : "\u5DF2\u52A0\u8F7D", " | \u914D\u7F6E\u6570\u91CF: ", configs.length, " |", error ? `\u9519\u8BEF: ${error}` : "\u6B63\u5E38")), /* @__PURE__ */ React23.createElement(
|
|
3724
3726
|
"button",
|
|
3725
3727
|
{
|
|
3726
3728
|
onClick: handleCreate,
|
|
3727
3729
|
className: "flex items-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors"
|
|
3728
3730
|
},
|
|
3729
|
-
/* @__PURE__ */
|
|
3731
|
+
/* @__PURE__ */ React23.createElement(Plus, { size: 16 }),
|
|
3730
3732
|
"\u521B\u5EFA\u914D\u7F6E"
|
|
3731
|
-
)), error && /* @__PURE__ */
|
|
3733
|
+
)), error && /* @__PURE__ */ React23.createElement("div", { className: "bg-red-50 border border-red-200 rounded-lg p-4" }, /* @__PURE__ */ React23.createElement("p", { className: "text-red-700" }, error)), loading ? /* @__PURE__ */ React23.createElement("div", { className: "text-center py-8" }, /* @__PURE__ */ React23.createElement("div", { className: "animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600 mx-auto mb-4" }), /* @__PURE__ */ React23.createElement("p", { className: "text-slate-600" }, "\u52A0\u8F7D\u4E2D...")) : /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg border border-slate-200 overflow-hidden" }, configs.length === 0 ? /* @__PURE__ */ React23.createElement("div", { className: "text-center py-8" }, /* @__PURE__ */ React23.createElement(Settings, { size: 40, className: "text-slate-400 mx-auto mb-4" }), /* @__PURE__ */ React23.createElement("h3", { className: "text-lg font-medium text-slate-800 mb-2" }, "\u6682\u65E0\u914D\u7F6E"), /* @__PURE__ */ React23.createElement("p", { className: "text-slate-600 mb-4" }, '\u70B9\u51FB"\u521B\u5EFA\u914D\u7F6E"\u5F00\u59CB\u8BBE\u7F6E\u5F39\u7A97')) : /* @__PURE__ */ React23.createElement("div", { className: "overflow-x-auto" }, /* @__PURE__ */ React23.createElement("table", { className: "w-full" }, /* @__PURE__ */ React23.createElement("thead", { className: "bg-slate-50" }, /* @__PURE__ */ React23.createElement("tr", null, /* @__PURE__ */ React23.createElement("th", { className: "px-6 py-3 text-left text-xs font-medium text-slate-500 uppercase tracking-wider" }, "\u914D\u7F6E\u4FE1\u606F"), /* @__PURE__ */ React23.createElement("th", { className: "px-6 py-3 text-left text-xs font-medium text-slate-500 uppercase tracking-wider" }, "\u89E6\u53D1\u6761\u4EF6"), /* @__PURE__ */ React23.createElement("th", { className: "px-6 py-3 text-left text-xs font-medium text-slate-500 uppercase tracking-wider" }, "\u5F39\u7A97\u5185\u5BB9"), /* @__PURE__ */ React23.createElement("th", { className: "px-6 py-3 text-left text-xs font-medium text-slate-500 uppercase tracking-wider" }, "\u6D41\u7A0B\u63A7\u5236"), /* @__PURE__ */ React23.createElement("th", { className: "px-6 py-3 text-left text-xs font-medium text-slate-500 uppercase tracking-wider" }, "\u72B6\u6001"), /* @__PURE__ */ React23.createElement("th", { className: "px-6 py-3 text-left text-xs font-medium text-slate-500 uppercase tracking-wider" }, "\u64CD\u4F5C"))), /* @__PURE__ */ React23.createElement("tbody", { className: "bg-white divide-y divide-slate-200" }, configs.map((config) => /* @__PURE__ */ React23.createElement("tr", { key: config.id, className: "hover:bg-slate-50" }, /* @__PURE__ */ React23.createElement("td", { className: "px-6 py-4 whitespace-nowrap" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("div", { className: "text-sm font-medium text-slate-900" }, config.name), config.description && /* @__PURE__ */ React23.createElement("div", { className: "text-sm text-slate-500" }, config.description), /* @__PURE__ */ React23.createElement("div", { className: "text-xs text-slate-400 mt-1" }, config.businessModule, " / ", config.businessScene))), /* @__PURE__ */ React23.createElement("td", { className: "px-6 py-4 whitespace-nowrap" }, /* @__PURE__ */ React23.createElement("div", { className: "text-sm text-slate-900" }, getTriggerTypeText(config.triggerConfig.triggerType)), /* @__PURE__ */ React23.createElement("div", { className: "text-sm text-slate-500" }, formatDeadlineTime(config.triggerConfig)), (config.triggerConfig.advanceMinutes || 0) > 0 && /* @__PURE__ */ React23.createElement("div", { className: "text-xs text-slate-400" }, "\u63D0\u524D ", config.triggerConfig.advanceMinutes, " \u5206\u949F")), /* @__PURE__ */ React23.createElement("td", { className: "px-6 py-4" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("div", { className: "text-sm font-medium text-slate-900" }, config.contentConfig.title), /* @__PURE__ */ React23.createElement("div", { className: "text-sm text-slate-500 max-w-xs truncate" }, config.contentConfig.message), /* @__PURE__ */ React23.createElement("div", { className: "text-xs text-slate-400 mt-1" }, "\u4E3B\u9898: ", getThemeText(config.contentConfig.theme || "warning")))), /* @__PURE__ */ React23.createElement("td", { className: "px-6 py-4 whitespace-nowrap" }, /* @__PURE__ */ React23.createElement("div", { className: `inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs font-medium ${config.blockProcess ? "bg-red-100 text-red-800" : "bg-blue-100 text-blue-800"}` }, config.blockProcess ? /* @__PURE__ */ React23.createElement(React23.Fragment, null, /* @__PURE__ */ React23.createElement(AlertTriangle, { size: 12 }), "\u963B\u65AD\u63D0\u4EA4") : /* @__PURE__ */ React23.createElement(React23.Fragment, null, /* @__PURE__ */ React23.createElement(Clock, { size: 12 }), "\u4EC5\u63D0\u9192"))), /* @__PURE__ */ React23.createElement("td", { className: "px-6 py-4 whitespace-nowrap" }, /* @__PURE__ */ React23.createElement(
|
|
3732
3734
|
"button",
|
|
3733
3735
|
{
|
|
3734
3736
|
onClick: () => handleToggle(config),
|
|
3735
3737
|
className: `inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs font-medium ${config.enabled ? "bg-green-100 text-green-800" : "bg-gray-100 text-gray-800"}`
|
|
3736
3738
|
},
|
|
3737
|
-
config.enabled ? /* @__PURE__ */
|
|
3739
|
+
config.enabled ? /* @__PURE__ */ React23.createElement(Eye, { size: 12 }) : /* @__PURE__ */ React23.createElement(EyeOff, { size: 12 }),
|
|
3738
3740
|
config.enabled ? "\u542F\u7528" : "\u7981\u7528"
|
|
3739
|
-
)), /* @__PURE__ */
|
|
3741
|
+
)), /* @__PURE__ */ React23.createElement("td", { className: "px-6 py-4 whitespace-nowrap text-sm font-medium" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React23.createElement(
|
|
3740
3742
|
"button",
|
|
3741
3743
|
{
|
|
3742
3744
|
onClick: () => handleEdit(config),
|
|
3743
3745
|
className: "text-blue-600 hover:text-blue-700"
|
|
3744
3746
|
},
|
|
3745
|
-
/* @__PURE__ */
|
|
3746
|
-
), /* @__PURE__ */
|
|
3747
|
+
/* @__PURE__ */ React23.createElement(Edit, { size: 16 })
|
|
3748
|
+
), /* @__PURE__ */ React23.createElement(
|
|
3747
3749
|
"button",
|
|
3748
3750
|
{
|
|
3749
3751
|
onClick: () => handleDelete(config),
|
|
3750
3752
|
className: "text-red-600 hover:text-red-700"
|
|
3751
3753
|
},
|
|
3752
|
-
/* @__PURE__ */
|
|
3753
|
-
))))))))), showCreateModal && /* @__PURE__ */
|
|
3754
|
+
/* @__PURE__ */ React23.createElement(Trash2, { size: 16 })
|
|
3755
|
+
))))))))), showCreateModal && /* @__PURE__ */ React23.createElement(
|
|
3754
3756
|
Modal,
|
|
3755
3757
|
{
|
|
3756
3758
|
isOpen: showCreateModal,
|
|
@@ -3763,7 +3765,7 @@ var PopupConfigManagement = () => {
|
|
|
3763
3765
|
width: 600,
|
|
3764
3766
|
maskClosable: false
|
|
3765
3767
|
},
|
|
3766
|
-
/* @__PURE__ */
|
|
3768
|
+
/* @__PURE__ */ React23.createElement("div", { className: "space-y-6 max-h-[70vh] overflow-y-auto" }, /* @__PURE__ */ React23.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ React23.createElement("h4", { className: "font-medium text-slate-800" }, "\u57FA\u672C\u4FE1\u606F"), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-1" }, "\u914D\u7F6E\u540D\u79F0 *"), /* @__PURE__ */ React23.createElement(
|
|
3767
3769
|
"input",
|
|
3768
3770
|
{
|
|
3769
3771
|
type: "text",
|
|
@@ -3772,7 +3774,7 @@ var PopupConfigManagement = () => {
|
|
|
3772
3774
|
className: "w-full px-3 py-2 border border-slate-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500",
|
|
3773
3775
|
placeholder: "\u8BF7\u8F93\u5165\u914D\u7F6E\u540D\u79F0"
|
|
3774
3776
|
}
|
|
3775
|
-
)), /* @__PURE__ */
|
|
3777
|
+
)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-1" }, "\u914D\u7F6E\u63CF\u8FF0"), /* @__PURE__ */ React23.createElement(
|
|
3776
3778
|
"textarea",
|
|
3777
3779
|
{
|
|
3778
3780
|
value: formData.description,
|
|
@@ -3781,18 +3783,18 @@ var PopupConfigManagement = () => {
|
|
|
3781
3783
|
className: "w-full px-3 py-2 border border-slate-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500",
|
|
3782
3784
|
placeholder: "\u8BF7\u8F93\u5165\u914D\u7F6E\u63CF\u8FF0"
|
|
3783
3785
|
}
|
|
3784
|
-
)), /* @__PURE__ */
|
|
3786
|
+
)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-1" }, "\u4E1A\u52A1\u573A\u666F *"), /* @__PURE__ */ React23.createElement(
|
|
3785
3787
|
"select",
|
|
3786
3788
|
{
|
|
3787
3789
|
value: formData.businessScene,
|
|
3788
3790
|
onChange: (e) => setFormData((prev) => ({ ...prev, businessScene: e.target.value })),
|
|
3789
3791
|
className: "w-full px-3 py-2 border border-slate-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
3790
3792
|
},
|
|
3791
|
-
/* @__PURE__ */
|
|
3792
|
-
/* @__PURE__ */
|
|
3793
|
-
/* @__PURE__ */
|
|
3794
|
-
/* @__PURE__ */
|
|
3795
|
-
), /* @__PURE__ */
|
|
3793
|
+
/* @__PURE__ */ React23.createElement("option", { value: "cart_checkout" }, "\u8D2D\u7269\u8F66\u63D0\u4EA4"),
|
|
3794
|
+
/* @__PURE__ */ React23.createElement("option", { value: "homepage_visit" }, "\u4E3B\u9875\u8BBF\u95EE"),
|
|
3795
|
+
/* @__PURE__ */ React23.createElement("option", { value: "collection_view" }, "\u753B\u96C6\u6D4F\u89C8"),
|
|
3796
|
+
/* @__PURE__ */ React23.createElement("option", { value: "artwork_detail" }, "\u4F5C\u54C1\u8BE6\u60C5")
|
|
3797
|
+
), /* @__PURE__ */ React23.createElement("div", { className: "text-xs text-slate-500 mt-1" }, "\u9009\u62E9\u5F39\u7A97\u5728\u54EA\u4E2A\u573A\u666F\u4E0B\u89E6\u53D1\u663E\u793A")), /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React23.createElement(
|
|
3796
3798
|
"input",
|
|
3797
3799
|
{
|
|
3798
3800
|
type: "checkbox",
|
|
@@ -3801,7 +3803,7 @@ var PopupConfigManagement = () => {
|
|
|
3801
3803
|
onChange: (e) => setFormData((prev) => ({ ...prev, enabled: e.target.checked })),
|
|
3802
3804
|
className: "rounded border-slate-300 text-blue-600 focus:ring-blue-500"
|
|
3803
3805
|
}
|
|
3804
|
-
), /* @__PURE__ */
|
|
3806
|
+
), /* @__PURE__ */ React23.createElement("label", { htmlFor: "enabled", className: "text-sm font-medium text-slate-700" }, "\u542F\u7528\u6B64\u914D\u7F6E"))), /* @__PURE__ */ React23.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ React23.createElement("h4", { className: "font-medium text-slate-800" }, "\u89E6\u53D1\u6761\u4EF6"), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-1" }, "\u89E6\u53D1\u7C7B\u578B"), /* @__PURE__ */ React23.createElement(
|
|
3805
3807
|
"select",
|
|
3806
3808
|
{
|
|
3807
3809
|
value: formData.triggerConfig.triggerType,
|
|
@@ -3814,10 +3816,10 @@ var PopupConfigManagement = () => {
|
|
|
3814
3816
|
})),
|
|
3815
3817
|
className: "w-full px-3 py-2 border border-slate-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
3816
3818
|
},
|
|
3817
|
-
/* @__PURE__ */
|
|
3818
|
-
/* @__PURE__ */
|
|
3819
|
-
/* @__PURE__ */
|
|
3820
|
-
)), formData.triggerConfig.triggerType !== "always" && /* @__PURE__ */
|
|
3819
|
+
/* @__PURE__ */ React23.createElement("option", { value: "after_deadline" }, "\u8D85\u8FC7\u622A\u6B62\u65F6\u95F4\u540E\u663E\u793A"),
|
|
3820
|
+
/* @__PURE__ */ React23.createElement("option", { value: "before_deadline" }, "\u622A\u6B62\u65F6\u95F4\u524D\u663E\u793A"),
|
|
3821
|
+
/* @__PURE__ */ React23.createElement("option", { value: "always" }, "\u603B\u662F\u663E\u793A")
|
|
3822
|
+
)), formData.triggerConfig.triggerType !== "always" && /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-1" }, "\u622A\u6B62\u65F6\u95F4"), /* @__PURE__ */ React23.createElement(
|
|
3821
3823
|
"input",
|
|
3822
3824
|
{
|
|
3823
3825
|
type: "datetime-local",
|
|
@@ -3831,7 +3833,7 @@ var PopupConfigManagement = () => {
|
|
|
3831
3833
|
})),
|
|
3832
3834
|
className: "w-full px-3 py-2 border border-slate-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
3833
3835
|
}
|
|
3834
|
-
)), formData.triggerConfig.triggerType === "before_deadline" && /* @__PURE__ */
|
|
3836
|
+
)), formData.triggerConfig.triggerType === "before_deadline" && /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-1" }, "\u63D0\u524D\u5206\u949F\u6570"), /* @__PURE__ */ React23.createElement(
|
|
3835
3837
|
"input",
|
|
3836
3838
|
{
|
|
3837
3839
|
type: "number",
|
|
@@ -3847,7 +3849,7 @@ var PopupConfigManagement = () => {
|
|
|
3847
3849
|
className: "w-full px-3 py-2 border border-slate-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500",
|
|
3848
3850
|
placeholder: "\u5728\u622A\u6B62\u65F6\u95F4\u524D\u591A\u5C11\u5206\u949F\u663E\u793A"
|
|
3849
3851
|
}
|
|
3850
|
-
))), /* @__PURE__ */
|
|
3852
|
+
))), /* @__PURE__ */ React23.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ React23.createElement("h4", { className: "font-medium text-slate-800" }, "\u5F39\u7A97\u5185\u5BB9"), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-1" }, "\u5F39\u7A97\u6807\u9898 *"), /* @__PURE__ */ React23.createElement(
|
|
3851
3853
|
"input",
|
|
3852
3854
|
{
|
|
3853
3855
|
type: "text",
|
|
@@ -3862,7 +3864,7 @@ var PopupConfigManagement = () => {
|
|
|
3862
3864
|
className: "w-full px-3 py-2 border border-slate-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500",
|
|
3863
3865
|
placeholder: "\u8BF7\u8F93\u5165\u5F39\u7A97\u6807\u9898"
|
|
3864
3866
|
}
|
|
3865
|
-
)), /* @__PURE__ */
|
|
3867
|
+
)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-1" }, "\u5F39\u7A97\u5185\u5BB9 *"), /* @__PURE__ */ React23.createElement(
|
|
3866
3868
|
"textarea",
|
|
3867
3869
|
{
|
|
3868
3870
|
value: formData.contentConfig.message,
|
|
@@ -3877,7 +3879,7 @@ var PopupConfigManagement = () => {
|
|
|
3877
3879
|
className: "w-full px-3 py-2 border border-slate-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500",
|
|
3878
3880
|
placeholder: "\u8BF7\u8F93\u5165\u5F39\u7A97\u5185\u5BB9"
|
|
3879
3881
|
}
|
|
3880
|
-
)), /* @__PURE__ */
|
|
3882
|
+
)), /* @__PURE__ */ React23.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-1" }, "\u786E\u8BA4\u6309\u94AE\u6587\u672C"), /* @__PURE__ */ React23.createElement(
|
|
3881
3883
|
"input",
|
|
3882
3884
|
{
|
|
3883
3885
|
type: "text",
|
|
@@ -3891,7 +3893,7 @@ var PopupConfigManagement = () => {
|
|
|
3891
3893
|
})),
|
|
3892
3894
|
className: "w-full px-3 py-2 border border-slate-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
3893
3895
|
}
|
|
3894
|
-
)), /* @__PURE__ */
|
|
3896
|
+
)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-1" }, "\u53D6\u6D88\u6309\u94AE\u6587\u672C"), /* @__PURE__ */ React23.createElement(
|
|
3895
3897
|
"input",
|
|
3896
3898
|
{
|
|
3897
3899
|
type: "text",
|
|
@@ -3905,7 +3907,7 @@ var PopupConfigManagement = () => {
|
|
|
3905
3907
|
})),
|
|
3906
3908
|
className: "w-full px-3 py-2 border border-slate-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
3907
3909
|
}
|
|
3908
|
-
))), /* @__PURE__ */
|
|
3910
|
+
))), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-1" }, "\u5F39\u7A97\u4E3B\u9898"), /* @__PURE__ */ React23.createElement(
|
|
3909
3911
|
"select",
|
|
3910
3912
|
{
|
|
3911
3913
|
value: formData.contentConfig.theme,
|
|
@@ -3918,11 +3920,11 @@ var PopupConfigManagement = () => {
|
|
|
3918
3920
|
})),
|
|
3919
3921
|
className: "w-full px-3 py-2 border border-slate-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
3920
3922
|
},
|
|
3921
|
-
/* @__PURE__ */
|
|
3922
|
-
/* @__PURE__ */
|
|
3923
|
-
/* @__PURE__ */
|
|
3924
|
-
/* @__PURE__ */
|
|
3925
|
-
)), /* @__PURE__ */
|
|
3923
|
+
/* @__PURE__ */ React23.createElement("option", { value: "warning" }, "\u8B66\u544A"),
|
|
3924
|
+
/* @__PURE__ */ React23.createElement("option", { value: "info" }, "\u4FE1\u606F"),
|
|
3925
|
+
/* @__PURE__ */ React23.createElement("option", { value: "error" }, "\u9519\u8BEF"),
|
|
3926
|
+
/* @__PURE__ */ React23.createElement("option", { value: "success" }, "\u6210\u529F")
|
|
3927
|
+
)), /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React23.createElement(
|
|
3926
3928
|
"input",
|
|
3927
3929
|
{
|
|
3928
3930
|
type: "checkbox",
|
|
@@ -3937,7 +3939,7 @@ var PopupConfigManagement = () => {
|
|
|
3937
3939
|
})),
|
|
3938
3940
|
className: "rounded border-slate-300 text-blue-600 focus:ring-blue-500"
|
|
3939
3941
|
}
|
|
3940
|
-
), /* @__PURE__ */
|
|
3942
|
+
), /* @__PURE__ */ React23.createElement("label", { htmlFor: "showCancel", className: "text-sm font-medium text-slate-700" }, "\u663E\u793A\u53D6\u6D88\u6309\u94AE"))), /* @__PURE__ */ React23.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ React23.createElement("h4", { className: "font-medium text-slate-800" }, "\u663E\u793A\u8BBE\u7F6E"), /* @__PURE__ */ React23.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-1" }, "\u5F39\u7A97\u5BBD\u5EA6 (px)"), /* @__PURE__ */ React23.createElement(
|
|
3941
3943
|
"input",
|
|
3942
3944
|
{
|
|
3943
3945
|
type: "number",
|
|
@@ -3953,7 +3955,7 @@ var PopupConfigManagement = () => {
|
|
|
3953
3955
|
})),
|
|
3954
3956
|
className: "w-full px-3 py-2 border border-slate-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
3955
3957
|
}
|
|
3956
|
-
)), /* @__PURE__ */
|
|
3958
|
+
)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-1" }, "\u81EA\u52A8\u5173\u95ED (\u79D2\uFF0C0=\u4E0D\u5173\u95ED)"), /* @__PURE__ */ React23.createElement(
|
|
3957
3959
|
"input",
|
|
3958
3960
|
{
|
|
3959
3961
|
type: "number",
|
|
@@ -3969,7 +3971,7 @@ var PopupConfigManagement = () => {
|
|
|
3969
3971
|
})),
|
|
3970
3972
|
className: "w-full px-3 py-2 border border-slate-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
3971
3973
|
}
|
|
3972
|
-
))), /* @__PURE__ */
|
|
3974
|
+
))), /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React23.createElement(
|
|
3973
3975
|
"input",
|
|
3974
3976
|
{
|
|
3975
3977
|
type: "checkbox",
|
|
@@ -3984,8 +3986,8 @@ var PopupConfigManagement = () => {
|
|
|
3984
3986
|
})),
|
|
3985
3987
|
className: "rounded border-slate-300 text-blue-600 focus:ring-blue-500"
|
|
3986
3988
|
}
|
|
3987
|
-
), /* @__PURE__ */
|
|
3988
|
-
/* @__PURE__ */
|
|
3989
|
+
), /* @__PURE__ */ React23.createElement("label", { htmlFor: "maskClosable", className: "text-sm font-medium text-slate-700" }, "\u5141\u8BB8\u70B9\u51FB\u906E\u7F69\u5173\u95ED")))),
|
|
3990
|
+
/* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("h4", { className: "text-sm font-medium text-slate-800 mb-3" }, "\u6D41\u7A0B\u63A7\u5236"), /* @__PURE__ */ React23.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React23.createElement(
|
|
3989
3991
|
"input",
|
|
3990
3992
|
{
|
|
3991
3993
|
type: "checkbox",
|
|
@@ -3997,8 +3999,8 @@ var PopupConfigManagement = () => {
|
|
|
3997
3999
|
})),
|
|
3998
4000
|
className: "rounded border-slate-300 text-blue-600 focus:ring-blue-500"
|
|
3999
4001
|
}
|
|
4000
|
-
), /* @__PURE__ */
|
|
4001
|
-
/* @__PURE__ */
|
|
4002
|
+
), /* @__PURE__ */ React23.createElement("label", { htmlFor: "blockProcess", className: "text-sm font-medium text-slate-700" }, "\u963B\u65AD\u6D41\u7A0B")), /* @__PURE__ */ React23.createElement("div", { className: "text-xs text-slate-500 pl-6" }, "\u2022 \u542F\u7528\u65F6\uFF1A\u5F39\u7A97\u663E\u793A\u540E\u963B\u6B62\u7528\u6237\u7EE7\u7EED\u63D0\u4EA4\uFF0C\u53EA\u6709\u5173\u95ED\u5F39\u7A97\u624D\u80FD\u505C\u6B62\u64CD\u4F5C", /* @__PURE__ */ React23.createElement("br", null), "\u2022 \u7981\u7528\u65F6\uFF1A\u5F39\u7A97\u4EC5\u4F5C\u4E3A\u63D0\u9192\uFF0C\u7528\u6237\u53EF\u4EE5\u9009\u62E9\u7EE7\u7EED\u63D0\u4EA4\u6216\u53D6\u6D88"))),
|
|
4003
|
+
/* @__PURE__ */ React23.createElement("div", { className: "flex justify-end gap-3 mt-6 pt-4 border-t border-slate-200" }, /* @__PURE__ */ React23.createElement(
|
|
4002
4004
|
"button",
|
|
4003
4005
|
{
|
|
4004
4006
|
onClick: () => {
|
|
@@ -4009,13 +4011,13 @@ var PopupConfigManagement = () => {
|
|
|
4009
4011
|
className: "px-4 py-2 text-slate-600 hover:text-slate-700 transition-colors"
|
|
4010
4012
|
},
|
|
4011
4013
|
"\u53D6\u6D88"
|
|
4012
|
-
), /* @__PURE__ */
|
|
4014
|
+
), /* @__PURE__ */ React23.createElement(
|
|
4013
4015
|
"button",
|
|
4014
4016
|
{
|
|
4015
4017
|
onClick: handleSave,
|
|
4016
4018
|
className: "flex items-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 transition-colors"
|
|
4017
4019
|
},
|
|
4018
|
-
/* @__PURE__ */
|
|
4020
|
+
/* @__PURE__ */ React23.createElement(Save, { size: 16 }),
|
|
4019
4021
|
editingConfig ? "\u66F4\u65B0" : "\u521B\u5EFA"
|
|
4020
4022
|
))
|
|
4021
4023
|
));
|
|
@@ -4184,12 +4186,12 @@ var SystemConfigManager = () => {
|
|
|
4184
4186
|
);
|
|
4185
4187
|
const getStatusIcon = (item) => {
|
|
4186
4188
|
if (item.isRequired && !item.value) {
|
|
4187
|
-
return /* @__PURE__ */
|
|
4189
|
+
return /* @__PURE__ */ React23.createElement(AlertTriangle, { className: "text-red-500", size: 16 });
|
|
4188
4190
|
}
|
|
4189
4191
|
if (item.value) {
|
|
4190
|
-
return /* @__PURE__ */
|
|
4192
|
+
return /* @__PURE__ */ React23.createElement(CheckCircle, { className: "text-green-500", size: 16 });
|
|
4191
4193
|
}
|
|
4192
|
-
return /* @__PURE__ */
|
|
4194
|
+
return /* @__PURE__ */ React23.createElement(AlertTriangle, { className: "text-yellow-500", size: 16 });
|
|
4193
4195
|
};
|
|
4194
4196
|
const getTypeDisplay = (type) => {
|
|
4195
4197
|
switch (type) {
|
|
@@ -4210,7 +4212,7 @@ var SystemConfigManager = () => {
|
|
|
4210
4212
|
return "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022";
|
|
4211
4213
|
}
|
|
4212
4214
|
if (!item.value) {
|
|
4213
|
-
return /* @__PURE__ */
|
|
4215
|
+
return /* @__PURE__ */ React23.createElement("span", { className: "text-gray-400 italic" }, "\u672A\u8BBE\u7F6E");
|
|
4214
4216
|
}
|
|
4215
4217
|
return item.value;
|
|
4216
4218
|
};
|
|
@@ -4226,16 +4228,16 @@ var SystemConfigManager = () => {
|
|
|
4226
4228
|
}
|
|
4227
4229
|
return void 0;
|
|
4228
4230
|
}, [message]);
|
|
4229
|
-
return /* @__PURE__ */
|
|
4231
|
+
return /* @__PURE__ */ React23.createElement("div", { className: "space-y-6" }, message && /* @__PURE__ */ React23.createElement("div", { className: `p-4 rounded-lg ${message.type === "success" ? "bg-green-50 border border-green-200 text-green-800" : "bg-red-50 border border-red-200 text-red-800"}` }, message.text), /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-gray-200 p-6" }, /* @__PURE__ */ React23.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4" }, /* @__PURE__ */ React23.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center gap-4" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React23.createElement("label", { className: "text-sm font-medium text-gray-700" }, "\u73AF\u5883:"), /* @__PURE__ */ React23.createElement(
|
|
4230
4232
|
"select",
|
|
4231
4233
|
{
|
|
4232
4234
|
value: currentEnvironment,
|
|
4233
4235
|
onChange: (e) => handleEnvironmentChange(e.target.value),
|
|
4234
4236
|
className: "px-3 py-1 border border-gray-300 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
4235
4237
|
},
|
|
4236
|
-
/* @__PURE__ */
|
|
4237
|
-
/* @__PURE__ */
|
|
4238
|
-
)), /* @__PURE__ */
|
|
4238
|
+
/* @__PURE__ */ React23.createElement("option", { value: "development" }, "\u5F00\u53D1\u73AF\u5883"),
|
|
4239
|
+
/* @__PURE__ */ React23.createElement("option", { value: "production" }, "\u751F\u4EA7\u73AF\u5883")
|
|
4240
|
+
)), /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React23.createElement(
|
|
4239
4241
|
"input",
|
|
4240
4242
|
{
|
|
4241
4243
|
type: "text",
|
|
@@ -4244,24 +4246,24 @@ var SystemConfigManager = () => {
|
|
|
4244
4246
|
onChange: (e) => setSearchTerm(e.target.value),
|
|
4245
4247
|
className: "px-3 py-1 border border-gray-300 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
4246
4248
|
}
|
|
4247
|
-
))), /* @__PURE__ */
|
|
4249
|
+
))), /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React23.createElement(
|
|
4248
4250
|
"button",
|
|
4249
4251
|
{
|
|
4250
4252
|
onClick: () => setAddDialog({ isOpen: true }),
|
|
4251
4253
|
className: "flex items-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-md text-sm font-medium hover:bg-blue-700 transition-colors"
|
|
4252
4254
|
},
|
|
4253
|
-
/* @__PURE__ */
|
|
4255
|
+
/* @__PURE__ */ React23.createElement(Plus, { size: 16 }),
|
|
4254
4256
|
"\u65B0\u589E\u914D\u7F6E"
|
|
4255
|
-
), /* @__PURE__ */
|
|
4257
|
+
), /* @__PURE__ */ React23.createElement(
|
|
4256
4258
|
"button",
|
|
4257
4259
|
{
|
|
4258
4260
|
onClick: () => loadConfigItems(),
|
|
4259
4261
|
disabled: loading,
|
|
4260
4262
|
className: "flex items-center gap-2 px-4 py-2 bg-gray-100 text-gray-700 rounded-md text-sm font-medium hover:bg-gray-200 transition-colors disabled:opacity-50"
|
|
4261
4263
|
},
|
|
4262
|
-
/* @__PURE__ */
|
|
4264
|
+
/* @__PURE__ */ React23.createElement(RefreshCw, { size: 16, className: loading ? "animate-spin" : "" }),
|
|
4263
4265
|
"\u5237\u65B0"
|
|
4264
|
-
)))), /* @__PURE__ */
|
|
4266
|
+
)))), /* @__PURE__ */ React23.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-3 gap-4" }, /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-gray-200 p-4" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React23.createElement(Database, { className: "text-blue-500", size: 20 }), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-gray-600" }, "\u603B\u914D\u7F6E\u9879"), /* @__PURE__ */ React23.createElement("p", { className: "text-lg font-semibold text-gray-900" }, configItems.length)))), /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-gray-200 p-4" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React23.createElement(CheckCircle, { className: "text-green-500", size: 20 }), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-gray-600" }, "\u5DF2\u914D\u7F6E"), /* @__PURE__ */ React23.createElement("p", { className: "text-lg font-semibold text-gray-900" }, configItems.filter((item) => item.value).length)))), /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-gray-200 p-4" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React23.createElement(AlertTriangle, { className: "text-yellow-500", size: 20 }), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-gray-600" }, "\u5F85\u914D\u7F6E"), /* @__PURE__ */ React23.createElement("p", { className: "text-lg font-semibold text-gray-900" }, configItems.filter((item) => item.isRequired && !item.value).length))))), /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-gray-200" }, loading ? /* @__PURE__ */ React23.createElement("div", { className: "p-8 text-center" }, /* @__PURE__ */ React23.createElement(Loader, { className: "animate-spin mx-auto mb-4 text-blue-500", size: 32 }), /* @__PURE__ */ React23.createElement("p", { className: "text-gray-600" }, "\u52A0\u8F7D\u914D\u7F6E\u9879\u4E2D...")) : /* @__PURE__ */ React23.createElement("div", { className: "overflow-x-auto" }, /* @__PURE__ */ React23.createElement("table", { className: "w-full" }, /* @__PURE__ */ React23.createElement("thead", { className: "bg-gray-50 border-b border-gray-200" }, /* @__PURE__ */ React23.createElement("tr", null, /* @__PURE__ */ React23.createElement("th", { className: "px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider" }, "\u72B6\u6001"), /* @__PURE__ */ React23.createElement("th", { className: "px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider" }, "\u914D\u7F6E\u9879"), /* @__PURE__ */ React23.createElement("th", { className: "px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider" }, "\u7C7B\u578B"), /* @__PURE__ */ React23.createElement("th", { className: "px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider" }, "\u5F53\u524D\u503C"), /* @__PURE__ */ React23.createElement("th", { className: "px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider" }, "\u64CD\u4F5C"))), /* @__PURE__ */ React23.createElement("tbody", { className: "bg-white divide-y divide-gray-200" }, filteredItems.map((item) => /* @__PURE__ */ React23.createElement("tr", { key: item.id, className: "hover:bg-gray-50" }, /* @__PURE__ */ React23.createElement("td", { className: "px-6 py-4 whitespace-nowrap" }, getStatusIcon(item)), /* @__PURE__ */ React23.createElement("td", { className: "px-6 py-4" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("div", { className: "text-sm font-medium text-gray-900" }, item.displayName, item.isRequired && /* @__PURE__ */ React23.createElement("span", { className: "text-red-500 ml-1" }, "*")), /* @__PURE__ */ React23.createElement("div", { className: "text-sm text-gray-500" }, item.description), /* @__PURE__ */ React23.createElement("div", { className: "text-xs text-gray-400 mt-1" }, "Key: ", item.key))), /* @__PURE__ */ React23.createElement("td", { className: "px-6 py-4 whitespace-nowrap" }, /* @__PURE__ */ React23.createElement("span", { className: "inline-flex items-center px-2 py-1 rounded-full text-xs font-medium bg-gray-100 text-gray-800" }, getTypeDisplay(item.type))), /* @__PURE__ */ React23.createElement("td", { className: "px-6 py-4" }, editingItem === item.id ? /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React23.createElement(
|
|
4265
4267
|
"input",
|
|
4266
4268
|
{
|
|
4267
4269
|
type: item.type === "password" ? "password" : "text",
|
|
@@ -4273,44 +4275,44 @@ var SystemConfigManager = () => {
|
|
|
4273
4275
|
className: "px-2 py-1 border border-gray-300 rounded text-sm focus:outline-none focus:ring-1 focus:ring-blue-500",
|
|
4274
4276
|
placeholder: item.defaultValue
|
|
4275
4277
|
}
|
|
4276
|
-
), /* @__PURE__ */
|
|
4278
|
+
), /* @__PURE__ */ React23.createElement(
|
|
4277
4279
|
"button",
|
|
4278
4280
|
{
|
|
4279
4281
|
onClick: () => saveEdit(item),
|
|
4280
4282
|
disabled: saving === item.id,
|
|
4281
4283
|
className: "text-green-600 hover:text-green-700 disabled:opacity-50"
|
|
4282
4284
|
},
|
|
4283
|
-
saving === item.id ? /* @__PURE__ */
|
|
4284
|
-
), /* @__PURE__ */
|
|
4285
|
+
saving === item.id ? /* @__PURE__ */ React23.createElement(Loader, { size: 16, className: "animate-spin" }) : /* @__PURE__ */ React23.createElement(Save, { size: 16 })
|
|
4286
|
+
), /* @__PURE__ */ React23.createElement(
|
|
4285
4287
|
"button",
|
|
4286
4288
|
{
|
|
4287
4289
|
onClick: cancelEdit,
|
|
4288
4290
|
className: "text-gray-600 hover:text-gray-700"
|
|
4289
4291
|
},
|
|
4290
4292
|
"\xD7"
|
|
4291
|
-
)) : /* @__PURE__ */
|
|
4293
|
+
)) : /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React23.createElement("span", { className: "text-sm text-gray-900" }, renderValue(item)), item.isSensitive && /* @__PURE__ */ React23.createElement(
|
|
4292
4294
|
"button",
|
|
4293
4295
|
{
|
|
4294
4296
|
onClick: () => toggleSensitive(item.id),
|
|
4295
4297
|
className: "text-gray-400 hover:text-gray-600"
|
|
4296
4298
|
},
|
|
4297
|
-
showSensitive[item.id] ? /* @__PURE__ */
|
|
4298
|
-
))), /* @__PURE__ */
|
|
4299
|
+
showSensitive[item.id] ? /* @__PURE__ */ React23.createElement(EyeOff, { size: 14 }) : /* @__PURE__ */ React23.createElement(Eye, { size: 14 })
|
|
4300
|
+
))), /* @__PURE__ */ React23.createElement("td", { className: "px-6 py-4 whitespace-nowrap text-sm font-medium" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-2" }, editingItem === item.id ? null : /* @__PURE__ */ React23.createElement(React23.Fragment, null, /* @__PURE__ */ React23.createElement(
|
|
4299
4301
|
"button",
|
|
4300
4302
|
{
|
|
4301
4303
|
onClick: () => startEdit(item),
|
|
4302
4304
|
className: "text-blue-600 hover:text-blue-700"
|
|
4303
4305
|
},
|
|
4304
|
-
/* @__PURE__ */
|
|
4305
|
-
), /* @__PURE__ */
|
|
4306
|
+
/* @__PURE__ */ React23.createElement(Edit, { size: 16 })
|
|
4307
|
+
), /* @__PURE__ */ React23.createElement(
|
|
4306
4308
|
"button",
|
|
4307
4309
|
{
|
|
4308
4310
|
onClick: () => handleDeleteItem(item),
|
|
4309
4311
|
disabled: deleting === item.id,
|
|
4310
4312
|
className: "text-red-600 hover:text-red-700 disabled:opacity-50"
|
|
4311
4313
|
},
|
|
4312
|
-
deleting === item.id ? /* @__PURE__ */
|
|
4313
|
-
)))))))), filteredItems.length === 0 && /* @__PURE__ */
|
|
4314
|
+
deleting === item.id ? /* @__PURE__ */ React23.createElement(Loader, { size: 16, className: "animate-spin" }) : /* @__PURE__ */ React23.createElement(Trash2, { size: 16 })
|
|
4315
|
+
)))))))), filteredItems.length === 0 && /* @__PURE__ */ React23.createElement("div", { className: "p-8 text-center" }, /* @__PURE__ */ React23.createElement("p", { className: "text-gray-600" }, searchTerm ? "\u672A\u627E\u5230\u5339\u914D\u7684\u914D\u7F6E\u9879" : "\u6682\u65E0\u914D\u7F6E\u9879")))), /* @__PURE__ */ React23.createElement(
|
|
4314
4316
|
DeleteConfirmDialog,
|
|
4315
4317
|
{
|
|
4316
4318
|
isOpen: deleteDialog.isOpen,
|
|
@@ -4318,7 +4320,7 @@ var SystemConfigManager = () => {
|
|
|
4318
4320
|
onConfirm: confirmDelete,
|
|
4319
4321
|
onCancel: () => setDeleteDialog({ isOpen: false, item: null })
|
|
4320
4322
|
}
|
|
4321
|
-
), /* @__PURE__ */
|
|
4323
|
+
), /* @__PURE__ */ React23.createElement(
|
|
4322
4324
|
AddConfigItemDialog,
|
|
4323
4325
|
{
|
|
4324
4326
|
isOpen: addDialog.isOpen,
|
|
@@ -4444,13 +4446,13 @@ var AddConfigItemDialog = ({
|
|
|
4444
4446
|
}
|
|
4445
4447
|
};
|
|
4446
4448
|
if (!isOpen) return null;
|
|
4447
|
-
return /* @__PURE__ */
|
|
4449
|
+
return /* @__PURE__ */ React23.createElement("div", { className: "fixed inset-0 z-50 overflow-y-auto" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0" }, /* @__PURE__ */ React23.createElement(
|
|
4448
4450
|
"div",
|
|
4449
4451
|
{
|
|
4450
4452
|
className: "fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity",
|
|
4451
4453
|
onClick: onCancel
|
|
4452
4454
|
}
|
|
4453
|
-
), /* @__PURE__ */
|
|
4455
|
+
), /* @__PURE__ */ React23.createElement("div", { className: "inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-2xl sm:w-full" }, /* @__PURE__ */ React23.createElement("div", { className: "bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4" }, /* @__PURE__ */ React23.createElement("div", { className: "sm:flex sm:items-start" }, /* @__PURE__ */ React23.createElement("div", { className: "mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10" }, /* @__PURE__ */ React23.createElement(Plus, { className: "h-6 w-6 text-blue-600" })), /* @__PURE__ */ React23.createElement("div", { className: "mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left w-full" }, /* @__PURE__ */ React23.createElement("h3", { className: "text-lg leading-6 font-medium text-gray-900 mb-4" }, "\u65B0\u589E\u914D\u7F6E\u9879"), error && /* @__PURE__ */ React23.createElement("div", { className: "mb-4 p-3 bg-red-50 border border-red-200 rounded-md" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ React23.createElement(AlertTriangle, { className: "w-4 h-4 text-red-600 mr-2" }), /* @__PURE__ */ React23.createElement("span", { className: "text-sm text-red-800" }, error))), success && /* @__PURE__ */ React23.createElement("div", { className: "mb-4 p-3 bg-green-50 border border-green-200 rounded-md" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ React23.createElement("span", { className: "text-sm text-green-800" }, success))), /* @__PURE__ */ React23.createElement("form", { onSubmit: handleSubmit, className: "space-y-4" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "\u914D\u7F6E\u952E ", /* @__PURE__ */ React23.createElement("span", { className: "text-red-500" }, "*")), /* @__PURE__ */ React23.createElement(
|
|
4454
4456
|
"input",
|
|
4455
4457
|
{
|
|
4456
4458
|
type: "text",
|
|
@@ -4460,7 +4462,7 @@ var AddConfigItemDialog = ({
|
|
|
4460
4462
|
className: `w-full px-3 py-2 border rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 ${errors.key ? "border-red-300" : "border-gray-300"}`,
|
|
4461
4463
|
disabled: saving
|
|
4462
4464
|
}
|
|
4463
|
-
), errors.key && /* @__PURE__ */
|
|
4465
|
+
), errors.key && /* @__PURE__ */ React23.createElement("p", { className: "mt-1 text-sm text-red-600" }, errors.key), /* @__PURE__ */ React23.createElement("p", { className: "mt-1 text-xs text-gray-500" }, "\u53EA\u80FD\u5305\u542B\u5927\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u4E0B\u5212\u7EBF\uFF0C\u4E14\u5FC5\u987B\u4EE5\u5B57\u6BCD\u6216\u4E0B\u5212\u7EBF\u5F00\u5934")), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "\u663E\u793A\u540D\u79F0 ", /* @__PURE__ */ React23.createElement("span", { className: "text-red-500" }, "*")), /* @__PURE__ */ React23.createElement(
|
|
4464
4466
|
"input",
|
|
4465
4467
|
{
|
|
4466
4468
|
type: "text",
|
|
@@ -4470,7 +4472,7 @@ var AddConfigItemDialog = ({
|
|
|
4470
4472
|
className: `w-full px-3 py-2 border rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 ${errors.displayName ? "border-red-300" : "border-gray-300"}`,
|
|
4471
4473
|
disabled: saving
|
|
4472
4474
|
}
|
|
4473
|
-
), errors.displayName && /* @__PURE__ */
|
|
4475
|
+
), errors.displayName && /* @__PURE__ */ React23.createElement("p", { className: "mt-1 text-sm text-red-600" }, errors.displayName)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "\u63CF\u8FF0"), /* @__PURE__ */ React23.createElement(
|
|
4474
4476
|
"textarea",
|
|
4475
4477
|
{
|
|
4476
4478
|
value: formData.description,
|
|
@@ -4480,7 +4482,7 @@ var AddConfigItemDialog = ({
|
|
|
4480
4482
|
className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500",
|
|
4481
4483
|
disabled: saving
|
|
4482
4484
|
}
|
|
4483
|
-
)), /* @__PURE__ */
|
|
4485
|
+
)), /* @__PURE__ */ React23.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "\u914D\u7F6E\u7C7B\u578B ", /* @__PURE__ */ React23.createElement("span", { className: "text-red-500" }, "*")), /* @__PURE__ */ React23.createElement(
|
|
4484
4486
|
"select",
|
|
4485
4487
|
{
|
|
4486
4488
|
value: formData.type,
|
|
@@ -4488,11 +4490,11 @@ var AddConfigItemDialog = ({
|
|
|
4488
4490
|
className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500",
|
|
4489
4491
|
disabled: saving
|
|
4490
4492
|
},
|
|
4491
|
-
/* @__PURE__ */
|
|
4492
|
-
/* @__PURE__ */
|
|
4493
|
-
/* @__PURE__ */
|
|
4494
|
-
/* @__PURE__ */
|
|
4495
|
-
)), /* @__PURE__ */
|
|
4493
|
+
/* @__PURE__ */ React23.createElement("option", { value: "string" }, "\u5B57\u7B26\u4E32"),
|
|
4494
|
+
/* @__PURE__ */ React23.createElement("option", { value: "number" }, "\u6570\u5B57"),
|
|
4495
|
+
/* @__PURE__ */ React23.createElement("option", { value: "boolean" }, "\u5E03\u5C14\u503C"),
|
|
4496
|
+
/* @__PURE__ */ React23.createElement("option", { value: "password" }, "\u5BC6\u7801")
|
|
4497
|
+
)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "\u6392\u5E8F"), /* @__PURE__ */ React23.createElement(
|
|
4496
4498
|
"input",
|
|
4497
4499
|
{
|
|
4498
4500
|
type: "number",
|
|
@@ -4502,7 +4504,7 @@ var AddConfigItemDialog = ({
|
|
|
4502
4504
|
className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500",
|
|
4503
4505
|
disabled: saving
|
|
4504
4506
|
}
|
|
4505
|
-
))), /* @__PURE__ */
|
|
4507
|
+
))), /* @__PURE__ */ React23.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "\u914D\u7F6E\u503C"), formData.type === "boolean" ? /* @__PURE__ */ React23.createElement(
|
|
4506
4508
|
"select",
|
|
4507
4509
|
{
|
|
4508
4510
|
value: formData.value,
|
|
@@ -4510,10 +4512,10 @@ var AddConfigItemDialog = ({
|
|
|
4510
4512
|
className: `w-full px-3 py-2 border rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 ${errors.value ? "border-red-300" : "border-gray-300"}`,
|
|
4511
4513
|
disabled: saving
|
|
4512
4514
|
},
|
|
4513
|
-
/* @__PURE__ */
|
|
4514
|
-
/* @__PURE__ */
|
|
4515
|
-
/* @__PURE__ */
|
|
4516
|
-
) : /* @__PURE__ */
|
|
4515
|
+
/* @__PURE__ */ React23.createElement("option", { value: "" }, "\u8BF7\u9009\u62E9"),
|
|
4516
|
+
/* @__PURE__ */ React23.createElement("option", { value: "true" }, "true"),
|
|
4517
|
+
/* @__PURE__ */ React23.createElement("option", { value: "false" }, "false")
|
|
4518
|
+
) : /* @__PURE__ */ React23.createElement(
|
|
4517
4519
|
"input",
|
|
4518
4520
|
{
|
|
4519
4521
|
type: formData.type === "password" ? "password" : formData.type === "number" ? "number" : "text",
|
|
@@ -4523,7 +4525,7 @@ var AddConfigItemDialog = ({
|
|
|
4523
4525
|
className: `w-full px-3 py-2 border rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 ${errors.value ? "border-red-300" : "border-gray-300"}`,
|
|
4524
4526
|
disabled: saving
|
|
4525
4527
|
}
|
|
4526
|
-
), errors.value && /* @__PURE__ */
|
|
4528
|
+
), errors.value && /* @__PURE__ */ React23.createElement("p", { className: "mt-1 text-sm text-red-600" }, errors.value)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-gray-700 mb-1" }, "\u9ED8\u8BA4\u503C"), formData.type === "boolean" ? /* @__PURE__ */ React23.createElement(
|
|
4527
4529
|
"select",
|
|
4528
4530
|
{
|
|
4529
4531
|
value: formData.defaultValue,
|
|
@@ -4531,10 +4533,10 @@ var AddConfigItemDialog = ({
|
|
|
4531
4533
|
className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500",
|
|
4532
4534
|
disabled: saving
|
|
4533
4535
|
},
|
|
4534
|
-
/* @__PURE__ */
|
|
4535
|
-
/* @__PURE__ */
|
|
4536
|
-
/* @__PURE__ */
|
|
4537
|
-
) : /* @__PURE__ */
|
|
4536
|
+
/* @__PURE__ */ React23.createElement("option", { value: "" }, "\u8BF7\u9009\u62E9"),
|
|
4537
|
+
/* @__PURE__ */ React23.createElement("option", { value: "true" }, "true"),
|
|
4538
|
+
/* @__PURE__ */ React23.createElement("option", { value: "false" }, "false")
|
|
4539
|
+
) : /* @__PURE__ */ React23.createElement(
|
|
4538
4540
|
"input",
|
|
4539
4541
|
{
|
|
4540
4542
|
type: formData.type === "password" ? "password" : formData.type === "number" ? "number" : "text",
|
|
@@ -4544,7 +4546,7 @@ var AddConfigItemDialog = ({
|
|
|
4544
4546
|
className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500",
|
|
4545
4547
|
disabled: saving
|
|
4546
4548
|
}
|
|
4547
|
-
))), /* @__PURE__ */
|
|
4549
|
+
))), /* @__PURE__ */ React23.createElement("div", { className: "flex flex-wrap gap-6" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ React23.createElement(
|
|
4548
4550
|
"input",
|
|
4549
4551
|
{
|
|
4550
4552
|
type: "checkbox",
|
|
@@ -4554,7 +4556,7 @@ var AddConfigItemDialog = ({
|
|
|
4554
4556
|
className: "h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded",
|
|
4555
4557
|
disabled: saving
|
|
4556
4558
|
}
|
|
4557
|
-
), /* @__PURE__ */
|
|
4559
|
+
), /* @__PURE__ */ React23.createElement("label", { htmlFor: "isRequired", className: "ml-2 block text-sm text-gray-900" }, "\u5FC5\u9700\u914D\u7F6E\u9879")), /* @__PURE__ */ React23.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ React23.createElement(
|
|
4558
4560
|
"input",
|
|
4559
4561
|
{
|
|
4560
4562
|
type: "checkbox",
|
|
@@ -4564,7 +4566,7 @@ var AddConfigItemDialog = ({
|
|
|
4564
4566
|
className: "h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded",
|
|
4565
4567
|
disabled: saving
|
|
4566
4568
|
}
|
|
4567
|
-
), /* @__PURE__ */
|
|
4569
|
+
), /* @__PURE__ */ React23.createElement("label", { htmlFor: "isSensitive", className: "ml-2 block text-sm text-gray-900" }, "\u654F\u611F\u4FE1\u606F"))))))), /* @__PURE__ */ React23.createElement("div", { className: "bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse" }, /* @__PURE__ */ React23.createElement(
|
|
4568
4570
|
"button",
|
|
4569
4571
|
{
|
|
4570
4572
|
type: "button",
|
|
@@ -4572,8 +4574,8 @@ var AddConfigItemDialog = ({
|
|
|
4572
4574
|
disabled: saving,
|
|
4573
4575
|
className: "w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm disabled:opacity-50 disabled:cursor-not-allowed"
|
|
4574
4576
|
},
|
|
4575
|
-
saving ? /* @__PURE__ */
|
|
4576
|
-
), /* @__PURE__ */
|
|
4577
|
+
saving ? /* @__PURE__ */ React23.createElement(React23.Fragment, null, /* @__PURE__ */ React23.createElement(Loader, { className: "w-4 h-4 mr-2 animate-spin" }), "\u521B\u5EFA\u4E2D...") : /* @__PURE__ */ React23.createElement(React23.Fragment, null, /* @__PURE__ */ React23.createElement(Save, { className: "w-4 h-4 mr-2" }), "\u521B\u5EFA\u914D\u7F6E\u9879")
|
|
4578
|
+
), /* @__PURE__ */ React23.createElement(
|
|
4577
4579
|
"button",
|
|
4578
4580
|
{
|
|
4579
4581
|
type: "button",
|
|
@@ -4592,13 +4594,13 @@ var DeleteConfirmDialog = ({
|
|
|
4592
4594
|
loading = false
|
|
4593
4595
|
}) => {
|
|
4594
4596
|
if (!isOpen || !item) return null;
|
|
4595
|
-
return /* @__PURE__ */
|
|
4597
|
+
return /* @__PURE__ */ React23.createElement("div", { className: "fixed inset-0 z-50 overflow-y-auto" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0" }, /* @__PURE__ */ React23.createElement(
|
|
4596
4598
|
"div",
|
|
4597
4599
|
{
|
|
4598
4600
|
className: "fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity",
|
|
4599
4601
|
onClick: onCancel
|
|
4600
4602
|
}
|
|
4601
|
-
), /* @__PURE__ */
|
|
4603
|
+
), /* @__PURE__ */ React23.createElement("div", { className: "inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full" }, /* @__PURE__ */ React23.createElement("div", { className: "bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4" }, /* @__PURE__ */ React23.createElement("div", { className: "sm:flex sm:items-start" }, /* @__PURE__ */ React23.createElement("div", { className: "mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-red-100 sm:mx-0 sm:h-10 sm:w-10" }, /* @__PURE__ */ React23.createElement(AlertTriangle, { className: "h-6 w-6 text-red-600" })), /* @__PURE__ */ React23.createElement("div", { className: "mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left" }, /* @__PURE__ */ React23.createElement("h3", { className: "text-lg leading-6 font-medium text-gray-900" }, "\u5220\u9664\u914D\u7F6E\u9879"), /* @__PURE__ */ React23.createElement("div", { className: "mt-2" }, /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-gray-500" }, "\u786E\u5B9A\u8981\u5220\u9664\u8FD9\u4E2A\u914D\u7F6E\u9879\u5417\uFF1F\u6B64\u64CD\u4F5C\u4E0D\u53EF\u64A4\u9500\u3002"), /* @__PURE__ */ React23.createElement("p", { className: "mt-2 text-sm font-medium text-gray-900" }, /* @__PURE__ */ React23.createElement("span", { className: "font-mono bg-gray-100 px-2 py-1 rounded" }, item.displayName, " (", item.key, ")")))))), /* @__PURE__ */ React23.createElement("div", { className: "bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse" }, /* @__PURE__ */ React23.createElement(
|
|
4602
4604
|
"button",
|
|
4603
4605
|
{
|
|
4604
4606
|
type: "button",
|
|
@@ -4606,8 +4608,8 @@ var DeleteConfirmDialog = ({
|
|
|
4606
4608
|
disabled: loading,
|
|
4607
4609
|
className: "w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm disabled:opacity-50 disabled:cursor-not-allowed"
|
|
4608
4610
|
},
|
|
4609
|
-
loading ? /* @__PURE__ */
|
|
4610
|
-
), /* @__PURE__ */
|
|
4611
|
+
loading ? /* @__PURE__ */ React23.createElement(React23.Fragment, null, /* @__PURE__ */ React23.createElement(Loader, { className: "w-4 h-4 mr-2 animate-spin" }), "\u5220\u9664\u4E2D...") : "\u5220\u9664"
|
|
4612
|
+
), /* @__PURE__ */ React23.createElement(
|
|
4611
4613
|
"button",
|
|
4612
4614
|
{
|
|
4613
4615
|
type: "button",
|
|
@@ -4622,1042 +4624,6 @@ var DeleteConfirmDialog = ({
|
|
|
4622
4624
|
// src/showmasterpiece/ui/web/pages/ShowMasterPiecesPage.tsx
|
|
4623
4625
|
init_hooks();
|
|
4624
4626
|
init_CartContext();
|
|
4625
|
-
var AuthContext = createContext(void 0);
|
|
4626
|
-
function AuthProvider({ children }) {
|
|
4627
|
-
const [user, setUser] = useState(null);
|
|
4628
|
-
const [loading, setLoading] = useState(true);
|
|
4629
|
-
const [isAuthenticated, setIsAuthenticated] = useState(false);
|
|
4630
|
-
const isMountedRef = useRef(true);
|
|
4631
|
-
const safeSetState = useCallback((updater) => {
|
|
4632
|
-
if (isMountedRef.current) {
|
|
4633
|
-
updater();
|
|
4634
|
-
}
|
|
4635
|
-
}, []);
|
|
4636
|
-
const validateSession = useCallback(async () => {
|
|
4637
|
-
console.log("\u{1F50D} [AuthContext] \u5F00\u59CB\u9A8C\u8BC1\u4F1A\u8BDD...");
|
|
4638
|
-
try {
|
|
4639
|
-
const response = await fetch("/api/auth/validate");
|
|
4640
|
-
console.log("\u{1F4E1} [AuthContext] \u4F1A\u8BDD\u9A8C\u8BC1\u54CD\u5E94\u72B6\u6001:", response.status);
|
|
4641
|
-
const data = await response.json();
|
|
4642
|
-
console.log("\u{1F4C4} [AuthContext] \u4F1A\u8BDD\u9A8C\u8BC1\u54CD\u5E94\u6570\u636E:", data);
|
|
4643
|
-
safeSetState(() => {
|
|
4644
|
-
if (data.valid && data.user) {
|
|
4645
|
-
console.log("\u2705 [AuthContext] \u4F1A\u8BDD\u9A8C\u8BC1\u6210\u529F, \u7528\u6237:", data.user);
|
|
4646
|
-
setUser(data.user);
|
|
4647
|
-
setIsAuthenticated(true);
|
|
4648
|
-
} else {
|
|
4649
|
-
console.log("\u274C [AuthContext] \u4F1A\u8BDD\u9A8C\u8BC1\u5931\u8D25:", data.message);
|
|
4650
|
-
setUser(null);
|
|
4651
|
-
setIsAuthenticated(false);
|
|
4652
|
-
}
|
|
4653
|
-
setLoading(false);
|
|
4654
|
-
});
|
|
4655
|
-
} catch (error) {
|
|
4656
|
-
console.error("\u{1F4A5} [AuthContext] \u4F1A\u8BDD\u9A8C\u8BC1\u5F02\u5E38:", error);
|
|
4657
|
-
safeSetState(() => {
|
|
4658
|
-
setUser(null);
|
|
4659
|
-
setIsAuthenticated(false);
|
|
4660
|
-
setLoading(false);
|
|
4661
|
-
});
|
|
4662
|
-
}
|
|
4663
|
-
}, [safeSetState]);
|
|
4664
|
-
const login = useCallback(async (credentials) => {
|
|
4665
|
-
console.log("\u{1F511} [AuthContext] \u5F00\u59CB\u767B\u5F55...");
|
|
4666
|
-
console.log("\u{1F4DD} [AuthContext] \u767B\u5F55\u51ED\u636E:", { phone: credentials.phone, password: "***" });
|
|
4667
|
-
try {
|
|
4668
|
-
console.log("\u{1F4E4} [AuthContext] \u53D1\u9001\u767B\u5F55\u8BF7\u6C42\u5230 /api/auth/login");
|
|
4669
|
-
const response = await fetch("/api/auth/login", {
|
|
4670
|
-
method: "POST",
|
|
4671
|
-
headers: { "Content-Type": "application/json" },
|
|
4672
|
-
body: JSON.stringify(credentials)
|
|
4673
|
-
});
|
|
4674
|
-
console.log("\u{1F4E1} [AuthContext] \u6536\u5230\u54CD\u5E94\uFF0C\u72B6\u6001\u7801:", response.status);
|
|
4675
|
-
const data = await response.json();
|
|
4676
|
-
console.log("\u{1F4C4} [AuthContext] \u54CD\u5E94\u6570\u636E:", data);
|
|
4677
|
-
if (data.success && data.user) {
|
|
4678
|
-
console.log("\u2705 [AuthContext] \u767B\u5F55\u6210\u529F, \u5F00\u59CB\u66F4\u65B0\u5168\u5C40\u72B6\u6001");
|
|
4679
|
-
console.log("\u{1F464} [AuthContext] \u7528\u6237\u6570\u636E:", data.user);
|
|
4680
|
-
console.log("\u{1F4CA} [AuthContext] \u66F4\u65B0\u524D\u72B6\u6001:", {
|
|
4681
|
-
currentUser: user ? `${user.name || "\u672A\u8BBE\u7F6E"} (${user.phone})` : null,
|
|
4682
|
-
currentIsAuthenticated: isAuthenticated,
|
|
4683
|
-
currentLoading: loading
|
|
4684
|
-
});
|
|
4685
|
-
console.log("\u{1F504} [AuthContext] \u6267\u884C\u5168\u5C40\u72B6\u6001\u66F4\u65B0...");
|
|
4686
|
-
safeSetState(() => {
|
|
4687
|
-
console.log("\u{1F504} [AuthContext] \u6B63\u5728\u8BBE\u7F6E\u7528\u6237:", data.user);
|
|
4688
|
-
setUser(data.user);
|
|
4689
|
-
console.log("\u{1F504} [AuthContext] \u6B63\u5728\u8BBE\u7F6E\u8BA4\u8BC1\u72B6\u6001: true");
|
|
4690
|
-
setIsAuthenticated(true);
|
|
4691
|
-
console.log("\u{1F504} [AuthContext] \u6B63\u5728\u8BBE\u7F6E\u52A0\u8F7D\u72B6\u6001: false");
|
|
4692
|
-
setLoading(false);
|
|
4693
|
-
console.log("\u2705 [AuthContext] \u5168\u5C40\u72B6\u6001\u66F4\u65B0\u5B8C\u6210");
|
|
4694
|
-
});
|
|
4695
|
-
setTimeout(() => {
|
|
4696
|
-
console.log("\u{1F389} [AuthContext] \u5EF6\u8FDF\u786E\u8BA4 - \u5168\u5C40\u767B\u5F55\u72B6\u6001\u5E94\u8BE5\u5DF2\u66F4\u65B0:", {
|
|
4697
|
-
user: data.user,
|
|
4698
|
-
isAuthenticated: true
|
|
4699
|
-
});
|
|
4700
|
-
}, 0);
|
|
4701
|
-
console.log("\u{1F680} [AuthContext] \u8FD4\u56DE\u6210\u529F\u7ED3\u679C");
|
|
4702
|
-
return { success: true, user: data.user };
|
|
4703
|
-
} else {
|
|
4704
|
-
console.log("\u274C [AuthContext] \u767B\u5F55\u5931\u8D25:", data.message);
|
|
4705
|
-
return { success: false, message: data.message };
|
|
4706
|
-
}
|
|
4707
|
-
} catch (error) {
|
|
4708
|
-
console.error("\u{1F4A5} [AuthContext] \u767B\u5F55\u5F02\u5E38:", error);
|
|
4709
|
-
return { success: false, message: "\u767B\u5F55\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5" };
|
|
4710
|
-
}
|
|
4711
|
-
}, [safeSetState, user, isAuthenticated, loading]);
|
|
4712
|
-
const register = useCallback(async (userData) => {
|
|
4713
|
-
console.log("\u{1F4DD} [AuthContext] \u5F00\u59CB\u6CE8\u518C...");
|
|
4714
|
-
try {
|
|
4715
|
-
const response = await fetch("/api/auth/register", {
|
|
4716
|
-
method: "POST",
|
|
4717
|
-
headers: { "Content-Type": "application/json" },
|
|
4718
|
-
body: JSON.stringify(userData)
|
|
4719
|
-
});
|
|
4720
|
-
const data = await response.json();
|
|
4721
|
-
console.log("\u{1F4E1} [AuthContext] \u6CE8\u518C\u54CD\u5E94:", data);
|
|
4722
|
-
if (data.success && data.user) {
|
|
4723
|
-
console.log("\u2705 [AuthContext] \u6CE8\u518C\u6210\u529F, \u7ACB\u5373\u66F4\u65B0\u5168\u5C40\u72B6\u6001");
|
|
4724
|
-
safeSetState(() => {
|
|
4725
|
-
setUser(data.user);
|
|
4726
|
-
setIsAuthenticated(true);
|
|
4727
|
-
setLoading(false);
|
|
4728
|
-
});
|
|
4729
|
-
console.log("\u{1F680} [AuthContext] \u8FD4\u56DE\u6CE8\u518C\u6210\u529F\u7ED3\u679C");
|
|
4730
|
-
return { success: true, user: data.user };
|
|
4731
|
-
} else {
|
|
4732
|
-
console.log("\u274C [AuthContext] \u6CE8\u518C\u5931\u8D25:", data.message);
|
|
4733
|
-
return { success: false, message: data.message };
|
|
4734
|
-
}
|
|
4735
|
-
} catch (error) {
|
|
4736
|
-
console.error("\u{1F4A5} [AuthContext] \u6CE8\u518C\u5F02\u5E38:", error);
|
|
4737
|
-
return { success: false, message: "\u6CE8\u518C\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5" };
|
|
4738
|
-
}
|
|
4739
|
-
}, [safeSetState]);
|
|
4740
|
-
const logout = useCallback(async () => {
|
|
4741
|
-
console.log("\u{1F6AA} [AuthContext] \u5F00\u59CB\u767B\u51FA...");
|
|
4742
|
-
try {
|
|
4743
|
-
await fetch("/api/auth/logout", { method: "POST" });
|
|
4744
|
-
safeSetState(() => {
|
|
4745
|
-
setUser(null);
|
|
4746
|
-
setIsAuthenticated(false);
|
|
4747
|
-
});
|
|
4748
|
-
console.log("\u2705 [AuthContext] \u767B\u51FA\u6210\u529F, \u5168\u5C40\u72B6\u6001\u5DF2\u6E05\u9664");
|
|
4749
|
-
} catch (error) {
|
|
4750
|
-
console.error("\u{1F4A5} [AuthContext] \u767B\u51FA\u5931\u8D25:", error);
|
|
4751
|
-
}
|
|
4752
|
-
}, [safeSetState]);
|
|
4753
|
-
const refreshUser = useCallback(() => {
|
|
4754
|
-
console.log("\u{1F504} [AuthContext] \u5237\u65B0\u7528\u6237\u4FE1\u606F...");
|
|
4755
|
-
setLoading(true);
|
|
4756
|
-
validateSession();
|
|
4757
|
-
}, [validateSession]);
|
|
4758
|
-
useEffect(() => {
|
|
4759
|
-
isMountedRef.current = true;
|
|
4760
|
-
return () => {
|
|
4761
|
-
isMountedRef.current = false;
|
|
4762
|
-
};
|
|
4763
|
-
}, []);
|
|
4764
|
-
useEffect(() => {
|
|
4765
|
-
console.log("\u{1F680} [AuthContext] \u521D\u59CB\u5316, \u5F00\u59CB\u9A8C\u8BC1\u4F1A\u8BDD");
|
|
4766
|
-
validateSession();
|
|
4767
|
-
}, [validateSession]);
|
|
4768
|
-
useEffect(() => {
|
|
4769
|
-
console.log("\u{1F4CA} [AuthContext] \u5168\u5C40\u72B6\u6001\u53D8\u5316:", {
|
|
4770
|
-
isAuthenticated,
|
|
4771
|
-
user: user ? `${user.name || "\u672A\u8BBE\u7F6E"} (${user.phone})` : null,
|
|
4772
|
-
loading
|
|
4773
|
-
});
|
|
4774
|
-
}, [isAuthenticated, user, loading]);
|
|
4775
|
-
const value = {
|
|
4776
|
-
user,
|
|
4777
|
-
loading,
|
|
4778
|
-
isAuthenticated,
|
|
4779
|
-
login,
|
|
4780
|
-
register,
|
|
4781
|
-
logout,
|
|
4782
|
-
refreshUser
|
|
4783
|
-
};
|
|
4784
|
-
return /* @__PURE__ */ React29.createElement(AuthContext.Provider, { value }, children);
|
|
4785
|
-
}
|
|
4786
|
-
function useAuth() {
|
|
4787
|
-
const context = useContext(AuthContext);
|
|
4788
|
-
if (context === void 0) {
|
|
4789
|
-
throw new Error("useAuth must be used within an AuthProvider");
|
|
4790
|
-
}
|
|
4791
|
-
return context;
|
|
4792
|
-
}
|
|
4793
|
-
|
|
4794
|
-
// src/auth/legacy/utils/authUtils.ts
|
|
4795
|
-
function validatePhoneNumber(phone) {
|
|
4796
|
-
return /^1[3-9]\d{9}$/.test(phone);
|
|
4797
|
-
}
|
|
4798
|
-
function validatePassword(password) {
|
|
4799
|
-
if (!password) {
|
|
4800
|
-
return { valid: false, message: "\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A" };
|
|
4801
|
-
}
|
|
4802
|
-
if (password.length < 6) {
|
|
4803
|
-
return { valid: false, message: "\u5BC6\u7801\u957F\u5EA6\u81F3\u5C116\u4F4D" };
|
|
4804
|
-
}
|
|
4805
|
-
return { valid: true };
|
|
4806
|
-
}
|
|
4807
|
-
function ForgotPasswordModal({ isOpen, onClose, onSuccess }) {
|
|
4808
|
-
const [formData, setFormData] = useState({
|
|
4809
|
-
phone: "",
|
|
4810
|
-
newPassword: "",
|
|
4811
|
-
confirmPassword: "",
|
|
4812
|
-
verificationCode: ""
|
|
4813
|
-
});
|
|
4814
|
-
const [showPassword, setShowPassword] = useState(false);
|
|
4815
|
-
const [showConfirmPassword, setShowConfirmPassword] = useState(false);
|
|
4816
|
-
const [error, setError] = useState("");
|
|
4817
|
-
const [loading, setLoading] = useState(false);
|
|
4818
|
-
const [countdown, setCountdown] = useState(0);
|
|
4819
|
-
const [mounted, setMounted] = useState(false);
|
|
4820
|
-
useEffect(() => {
|
|
4821
|
-
setMounted(true);
|
|
4822
|
-
}, []);
|
|
4823
|
-
const handleInputChange = (e) => {
|
|
4824
|
-
const { name, value } = e.target;
|
|
4825
|
-
setFormData((prev) => ({ ...prev, [name]: value }));
|
|
4826
|
-
if (error) setError("");
|
|
4827
|
-
};
|
|
4828
|
-
const validateForm = () => {
|
|
4829
|
-
if (!formData.phone || !formData.newPassword || !formData.confirmPassword || !formData.verificationCode) {
|
|
4830
|
-
setError("\u8BF7\u586B\u5199\u5B8C\u6574\u4FE1\u606F");
|
|
4831
|
-
return false;
|
|
4832
|
-
}
|
|
4833
|
-
if (!validatePhoneNumber(formData.phone)) {
|
|
4834
|
-
setError("\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u624B\u673A\u53F7\u683C\u5F0F");
|
|
4835
|
-
return false;
|
|
4836
|
-
}
|
|
4837
|
-
const passwordValidation = validatePassword(formData.newPassword);
|
|
4838
|
-
if (!passwordValidation.valid) {
|
|
4839
|
-
setError(passwordValidation.message || "\u5BC6\u7801\u683C\u5F0F\u9519\u8BEF");
|
|
4840
|
-
return false;
|
|
4841
|
-
}
|
|
4842
|
-
if (formData.newPassword !== formData.confirmPassword) {
|
|
4843
|
-
setError("\u4E24\u6B21\u8F93\u5165\u7684\u5BC6\u7801\u4E0D\u4E00\u81F4");
|
|
4844
|
-
return false;
|
|
4845
|
-
}
|
|
4846
|
-
if (!/^\d{6}$/.test(formData.verificationCode)) {
|
|
4847
|
-
setError("\u8BF7\u8F93\u51656\u4F4D\u6570\u5B57\u9A8C\u8BC1\u7801");
|
|
4848
|
-
return false;
|
|
4849
|
-
}
|
|
4850
|
-
return true;
|
|
4851
|
-
};
|
|
4852
|
-
const handleSendCode = async () => {
|
|
4853
|
-
if (!formData.phone) {
|
|
4854
|
-
setError("\u8BF7\u8F93\u5165\u624B\u673A\u53F7");
|
|
4855
|
-
return;
|
|
4856
|
-
}
|
|
4857
|
-
if (!validatePhoneNumber(formData.phone)) {
|
|
4858
|
-
setError("\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u624B\u673A\u53F7\u683C\u5F0F");
|
|
4859
|
-
return;
|
|
4860
|
-
}
|
|
4861
|
-
try {
|
|
4862
|
-
setLoading(true);
|
|
4863
|
-
setError("");
|
|
4864
|
-
const response = await fetch("/api/auth/send-verification-code", {
|
|
4865
|
-
method: "POST",
|
|
4866
|
-
headers: { "Content-Type": "application/json" },
|
|
4867
|
-
body: JSON.stringify({ phone: formData.phone })
|
|
4868
|
-
});
|
|
4869
|
-
const data = await response.json();
|
|
4870
|
-
if (data.success) {
|
|
4871
|
-
setCountdown(60);
|
|
4872
|
-
const timer = setInterval(() => {
|
|
4873
|
-
setCountdown((prev) => {
|
|
4874
|
-
if (prev <= 1) {
|
|
4875
|
-
clearInterval(timer);
|
|
4876
|
-
return 0;
|
|
4877
|
-
}
|
|
4878
|
-
return prev - 1;
|
|
4879
|
-
});
|
|
4880
|
-
}, 1e3);
|
|
4881
|
-
console.log("\u2705 \u9A8C\u8BC1\u7801\u53D1\u9001\u6210\u529F");
|
|
4882
|
-
} else {
|
|
4883
|
-
setError(data.message || "\u53D1\u9001\u9A8C\u8BC1\u7801\u5931\u8D25");
|
|
4884
|
-
}
|
|
4885
|
-
} catch (error2) {
|
|
4886
|
-
console.error("\u53D1\u9001\u9A8C\u8BC1\u7801\u5F02\u5E38:", error2);
|
|
4887
|
-
setError("\u53D1\u9001\u9A8C\u8BC1\u7801\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");
|
|
4888
|
-
} finally {
|
|
4889
|
-
setLoading(false);
|
|
4890
|
-
}
|
|
4891
|
-
};
|
|
4892
|
-
const handleSubmit = async (e) => {
|
|
4893
|
-
e.preventDefault();
|
|
4894
|
-
setError("");
|
|
4895
|
-
setLoading(true);
|
|
4896
|
-
try {
|
|
4897
|
-
if (!validateForm()) {
|
|
4898
|
-
return;
|
|
4899
|
-
}
|
|
4900
|
-
const response = await fetch("/api/auth/reset-password", {
|
|
4901
|
-
method: "POST",
|
|
4902
|
-
headers: { "Content-Type": "application/json" },
|
|
4903
|
-
body: JSON.stringify({
|
|
4904
|
-
phone: formData.phone,
|
|
4905
|
-
newPassword: formData.newPassword,
|
|
4906
|
-
verificationCode: formData.verificationCode
|
|
4907
|
-
})
|
|
4908
|
-
});
|
|
4909
|
-
const data = await response.json();
|
|
4910
|
-
if (data.success) {
|
|
4911
|
-
onSuccess();
|
|
4912
|
-
} else {
|
|
4913
|
-
setError(data.message || "\u91CD\u7F6E\u5BC6\u7801\u5931\u8D25");
|
|
4914
|
-
}
|
|
4915
|
-
} catch (error2) {
|
|
4916
|
-
setError("\u91CD\u7F6E\u5BC6\u7801\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");
|
|
4917
|
-
} finally {
|
|
4918
|
-
setLoading(false);
|
|
4919
|
-
}
|
|
4920
|
-
};
|
|
4921
|
-
const handleOverlayClick = (e) => {
|
|
4922
|
-
if (e.target === e.currentTarget) {
|
|
4923
|
-
onClose();
|
|
4924
|
-
}
|
|
4925
|
-
};
|
|
4926
|
-
if (!isOpen || !mounted) return null;
|
|
4927
|
-
const modalContent = /* @__PURE__ */ React29.createElement(
|
|
4928
|
-
"div",
|
|
4929
|
-
{
|
|
4930
|
-
className: "fixed top-0 left-0 right-0 bottom-0 w-screen h-screen bg-black/50 backdrop-blur-sm flex items-center justify-center z-[9999] p-4",
|
|
4931
|
-
style: { margin: 0 },
|
|
4932
|
-
onClick: handleOverlayClick
|
|
4933
|
-
},
|
|
4934
|
-
/* @__PURE__ */ React29.createElement(
|
|
4935
|
-
"div",
|
|
4936
|
-
{
|
|
4937
|
-
className: "bg-white rounded-2xl shadow-xl w-full max-w-[420px] max-h-[90vh] overflow-y-auto relative",
|
|
4938
|
-
onClick: (e) => e.stopPropagation()
|
|
4939
|
-
},
|
|
4940
|
-
/* @__PURE__ */ React29.createElement(
|
|
4941
|
-
"button",
|
|
4942
|
-
{
|
|
4943
|
-
className: "absolute top-5 right-5 bg-transparent border-none text-gray-500 cursor-pointer p-2 rounded-lg transition-all hover:bg-gray-100 hover:text-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 min-w-9 min-h-9 flex items-center justify-center",
|
|
4944
|
-
onClick: onClose
|
|
4945
|
-
},
|
|
4946
|
-
/* @__PURE__ */ React29.createElement(X, { size: 20 })
|
|
4947
|
-
),
|
|
4948
|
-
/* @__PURE__ */ React29.createElement("div", { className: "px-6 pt-6 pb-4 text-center border-b border-gray-100" }, /* @__PURE__ */ React29.createElement("h2", { className: "text-2xl font-semibold text-gray-800 mb-2" }, "\u91CD\u7F6E\u5BC6\u7801"), /* @__PURE__ */ React29.createElement("p", { className: "text-gray-500 text-sm" }, "\u8BF7\u8F93\u5165\u624B\u673A\u53F7\u548C\u9A8C\u8BC1\u7801\u91CD\u7F6E\u5BC6\u7801")),
|
|
4949
|
-
/* @__PURE__ */ React29.createElement("form", { onSubmit: handleSubmit, className: "p-6" }, /* @__PURE__ */ React29.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React29.createElement("label", { htmlFor: "phone", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u624B\u673A\u53F7"), /* @__PURE__ */ React29.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React29.createElement(Phone, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React29.createElement(
|
|
4950
|
-
"input",
|
|
4951
|
-
{
|
|
4952
|
-
id: "phone",
|
|
4953
|
-
name: "phone",
|
|
4954
|
-
type: "tel",
|
|
4955
|
-
value: formData.phone,
|
|
4956
|
-
onChange: handleInputChange,
|
|
4957
|
-
placeholder: "\u8BF7\u8F93\u5165\u624B\u673A\u53F7",
|
|
4958
|
-
className: "w-full py-3 px-4 pl-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed",
|
|
4959
|
-
disabled: loading
|
|
4960
|
-
}
|
|
4961
|
-
))), /* @__PURE__ */ React29.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React29.createElement("label", { htmlFor: "verificationCode", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u9A8C\u8BC1\u7801"), /* @__PURE__ */ React29.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React29.createElement(
|
|
4962
|
-
"input",
|
|
4963
|
-
{
|
|
4964
|
-
id: "verificationCode",
|
|
4965
|
-
name: "verificationCode",
|
|
4966
|
-
type: "text",
|
|
4967
|
-
value: formData.verificationCode,
|
|
4968
|
-
onChange: handleInputChange,
|
|
4969
|
-
placeholder: "\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801",
|
|
4970
|
-
className: "w-full py-3 px-4 pr-28 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed",
|
|
4971
|
-
disabled: loading,
|
|
4972
|
-
maxLength: 6
|
|
4973
|
-
}
|
|
4974
|
-
), /* @__PURE__ */ React29.createElement(
|
|
4975
|
-
"button",
|
|
4976
|
-
{
|
|
4977
|
-
type: "button",
|
|
4978
|
-
className: "absolute right-2 top-1/2 -translate-y-1/2 bg-transparent border-none text-blue-500 text-sm font-medium cursor-pointer px-2 py-1 rounded transition-all whitespace-nowrap hover:bg-blue-50 disabled:text-gray-400 disabled:cursor-not-allowed",
|
|
4979
|
-
onClick: handleSendCode,
|
|
4980
|
-
disabled: loading || countdown > 0
|
|
4981
|
-
},
|
|
4982
|
-
countdown > 0 ? `${countdown}\u79D2\u540E\u91CD\u8BD5` : "\u53D1\u9001\u9A8C\u8BC1\u7801"
|
|
4983
|
-
))), /* @__PURE__ */ React29.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React29.createElement("label", { htmlFor: "newPassword", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u65B0\u5BC6\u7801"), /* @__PURE__ */ React29.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React29.createElement(Lock, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React29.createElement(
|
|
4984
|
-
"input",
|
|
4985
|
-
{
|
|
4986
|
-
id: "newPassword",
|
|
4987
|
-
name: "newPassword",
|
|
4988
|
-
type: showPassword ? "text" : "password",
|
|
4989
|
-
value: formData.newPassword,
|
|
4990
|
-
onChange: handleInputChange,
|
|
4991
|
-
placeholder: "\u8BF7\u8F93\u5165\u65B0\u5BC6\u7801",
|
|
4992
|
-
className: "w-full py-3 px-4 pl-12 pr-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed",
|
|
4993
|
-
disabled: loading
|
|
4994
|
-
}
|
|
4995
|
-
), /* @__PURE__ */ React29.createElement(
|
|
4996
|
-
"button",
|
|
4997
|
-
{
|
|
4998
|
-
type: "button",
|
|
4999
|
-
className: "absolute right-4 bg-transparent border-none text-gray-400 cursor-pointer p-1 rounded transition-all flex items-center justify-center min-w-6 min-h-6 hover:text-gray-600 hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50",
|
|
5000
|
-
onClick: () => setShowPassword(!showPassword),
|
|
5001
|
-
disabled: loading
|
|
5002
|
-
},
|
|
5003
|
-
showPassword ? /* @__PURE__ */ React29.createElement(EyeOff, { size: 18 }) : /* @__PURE__ */ React29.createElement(Eye, { size: 18 })
|
|
5004
|
-
))), /* @__PURE__ */ React29.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React29.createElement("label", { htmlFor: "confirmPassword", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u786E\u8BA4\u5BC6\u7801"), /* @__PURE__ */ React29.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React29.createElement(Lock, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React29.createElement(
|
|
5005
|
-
"input",
|
|
5006
|
-
{
|
|
5007
|
-
id: "confirmPassword",
|
|
5008
|
-
name: "confirmPassword",
|
|
5009
|
-
type: showConfirmPassword ? "text" : "password",
|
|
5010
|
-
value: formData.confirmPassword,
|
|
5011
|
-
onChange: handleInputChange,
|
|
5012
|
-
placeholder: "\u8BF7\u518D\u6B21\u8F93\u5165\u65B0\u5BC6\u7801",
|
|
5013
|
-
className: "w-full py-3 px-4 pl-12 pr-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed",
|
|
5014
|
-
disabled: loading
|
|
5015
|
-
}
|
|
5016
|
-
), /* @__PURE__ */ React29.createElement(
|
|
5017
|
-
"button",
|
|
5018
|
-
{
|
|
5019
|
-
type: "button",
|
|
5020
|
-
className: "absolute right-4 bg-transparent border-none text-gray-400 cursor-pointer p-1 rounded transition-all flex items-center justify-center min-w-6 min-h-6 hover:text-gray-600 hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50",
|
|
5021
|
-
onClick: () => setShowConfirmPassword(!showConfirmPassword),
|
|
5022
|
-
disabled: loading
|
|
5023
|
-
},
|
|
5024
|
-
showConfirmPassword ? /* @__PURE__ */ React29.createElement(EyeOff, { size: 18 }) : /* @__PURE__ */ React29.createElement(Eye, { size: 18 })
|
|
5025
|
-
))), error && /* @__PURE__ */ React29.createElement("div", { className: "text-red-500 text-sm my-4 p-3 bg-red-50 border border-red-200 rounded-lg leading-relaxed" }, error), /* @__PURE__ */ React29.createElement(
|
|
5026
|
-
"button",
|
|
5027
|
-
{
|
|
5028
|
-
type: "submit",
|
|
5029
|
-
className: "w-full bg-blue-500 text-white border-none py-3.5 px-6 rounded-lg text-base font-medium cursor-pointer transition-all mt-2 min-h-[52px] hover:bg-blue-600 hover:-translate-y-0.5 hover:shadow-lg hover:shadow-blue-500/30 active:translate-y-0 disabled:bg-gray-400 disabled:cursor-not-allowed disabled:transform-none disabled:shadow-none focus:outline-none focus:ring-2 focus:ring-blue-700 focus:ring-offset-2",
|
|
5030
|
-
disabled: loading
|
|
5031
|
-
},
|
|
5032
|
-
loading ? "\u63D0\u4EA4\u4E2D..." : "\u91CD\u7F6E\u5BC6\u7801"
|
|
5033
|
-
))
|
|
5034
|
-
)
|
|
5035
|
-
);
|
|
5036
|
-
return createPortal(modalContent, document.body);
|
|
5037
|
-
}
|
|
5038
|
-
|
|
5039
|
-
// src/auth/legacy/components/LoginModal.tsx
|
|
5040
|
-
function LoginModal({ isOpen, onClose, onSuccess, onSwitchToRegister }) {
|
|
5041
|
-
const { login } = useAuth();
|
|
5042
|
-
const [formData, setFormData] = useState({
|
|
5043
|
-
phone: "",
|
|
5044
|
-
password: ""
|
|
5045
|
-
});
|
|
5046
|
-
const [showPassword, setShowPassword] = useState(false);
|
|
5047
|
-
const [error, setError] = useState("");
|
|
5048
|
-
const [loading, setLoading] = useState(false);
|
|
5049
|
-
const [showForgotPassword, setShowForgotPassword] = useState(false);
|
|
5050
|
-
const [mounted, setMounted] = useState(false);
|
|
5051
|
-
useEffect(() => {
|
|
5052
|
-
setMounted(true);
|
|
5053
|
-
}, []);
|
|
5054
|
-
const fillDemoAccount = (type) => {
|
|
5055
|
-
if (process.env.NODE_ENV === "development") {
|
|
5056
|
-
const accounts = {
|
|
5057
|
-
admin: { phone: "13800138000", password: "admin123456" },
|
|
5058
|
-
user: { phone: "13900139000", password: "test123456" }
|
|
5059
|
-
};
|
|
5060
|
-
setFormData(accounts[type]);
|
|
5061
|
-
setError("");
|
|
5062
|
-
}
|
|
5063
|
-
};
|
|
5064
|
-
const handleInputChange = (e) => {
|
|
5065
|
-
const { name, value } = e.target;
|
|
5066
|
-
setFormData((prev) => ({ ...prev, [name]: value }));
|
|
5067
|
-
if (error) setError("");
|
|
5068
|
-
};
|
|
5069
|
-
const handleSubmit = async (e) => {
|
|
5070
|
-
e.preventDefault();
|
|
5071
|
-
setError("");
|
|
5072
|
-
setLoading(true);
|
|
5073
|
-
console.log("\u{1F504} [LoginModal] handleSubmit \u5F00\u59CB");
|
|
5074
|
-
try {
|
|
5075
|
-
if (!formData.phone || !formData.password) {
|
|
5076
|
-
console.log("\u274C [LoginModal] \u524D\u7AEF\u9A8C\u8BC1\u5931\u8D25: \u4FE1\u606F\u4E0D\u5B8C\u6574");
|
|
5077
|
-
setError("\u8BF7\u586B\u5199\u5B8C\u6574\u4FE1\u606F");
|
|
5078
|
-
return;
|
|
5079
|
-
}
|
|
5080
|
-
if (!validatePhoneNumber(formData.phone)) {
|
|
5081
|
-
console.log("\u274C [LoginModal] \u524D\u7AEF\u9A8C\u8BC1\u5931\u8D25: \u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF");
|
|
5082
|
-
setError("\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u624B\u673A\u53F7");
|
|
5083
|
-
return;
|
|
5084
|
-
}
|
|
5085
|
-
console.log("\u2705 [LoginModal] \u524D\u7AEF\u9A8C\u8BC1\u901A\u8FC7");
|
|
5086
|
-
console.log("\u{1F511} [LoginModal] \u63D0\u4EA4\u767B\u5F55\u8868\u5355:", {
|
|
5087
|
-
phone: formData.phone,
|
|
5088
|
-
password: "***"
|
|
5089
|
-
});
|
|
5090
|
-
console.log("\u{1F4DE} [LoginModal] \u51C6\u5907\u8C03\u7528 useAuth.login()...");
|
|
5091
|
-
const result = await login(formData);
|
|
5092
|
-
console.log("\u{1F4E1} [LoginModal] useAuth.login() \u8FD4\u56DE\u7ED3\u679C:", result);
|
|
5093
|
-
if (result.success) {
|
|
5094
|
-
console.log("\u2705 [LoginModal] \u767B\u5F55\u6210\u529F\uFF0C\u51C6\u5907\u8C03\u7528 onSuccess()");
|
|
5095
|
-
console.log("\u{1F464} [LoginModal] \u767B\u5F55\u6210\u529F\u7684\u7528\u6237\u4FE1\u606F:", result.user);
|
|
5096
|
-
setTimeout(() => {
|
|
5097
|
-
console.log("\u{1F3AF} [LoginModal] \u8C03\u7528 onSuccess \u56DE\u8C03");
|
|
5098
|
-
onSuccess();
|
|
5099
|
-
console.log("\u{1F3C1} [LoginModal] onSuccess \u8C03\u7528\u5B8C\u6210");
|
|
5100
|
-
}, 100);
|
|
5101
|
-
} else {
|
|
5102
|
-
console.log("\u274C [LoginModal] \u767B\u5F55\u5931\u8D25:", result.message);
|
|
5103
|
-
setError(result.message || "\u767B\u5F55\u5931\u8D25");
|
|
5104
|
-
}
|
|
5105
|
-
} catch (error2) {
|
|
5106
|
-
console.error("\u{1F4A5} [LoginModal] \u767B\u5F55\u5F02\u5E38:", error2);
|
|
5107
|
-
setError("\u767B\u5F55\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");
|
|
5108
|
-
} finally {
|
|
5109
|
-
console.log("\u{1F51A} [LoginModal] handleSubmit \u7ED3\u675F\uFF0C\u8BBE\u7F6E loading = false");
|
|
5110
|
-
setLoading(false);
|
|
5111
|
-
}
|
|
5112
|
-
};
|
|
5113
|
-
const handleOverlayClick = (e) => {
|
|
5114
|
-
if (e.target === e.currentTarget) {
|
|
5115
|
-
onClose();
|
|
5116
|
-
}
|
|
5117
|
-
};
|
|
5118
|
-
if (!isOpen || !mounted) return null;
|
|
5119
|
-
const modalContent = /* @__PURE__ */ React29.createElement(React29.Fragment, null, /* @__PURE__ */ React29.createElement(
|
|
5120
|
-
"div",
|
|
5121
|
-
{
|
|
5122
|
-
className: "fixed top-0 left-0 right-0 bottom-0 w-screen h-screen bg-black/50 backdrop-blur-sm flex items-center justify-center z-[9999] p-4",
|
|
5123
|
-
style: { margin: 0 },
|
|
5124
|
-
onClick: handleOverlayClick
|
|
5125
|
-
},
|
|
5126
|
-
/* @__PURE__ */ React29.createElement(
|
|
5127
|
-
"div",
|
|
5128
|
-
{
|
|
5129
|
-
className: "bg-white rounded-2xl shadow-xl w-full max-w-[420px] max-h-[90vh] overflow-y-auto relative",
|
|
5130
|
-
onClick: (e) => e.stopPropagation()
|
|
5131
|
-
},
|
|
5132
|
-
/* @__PURE__ */ React29.createElement(
|
|
5133
|
-
"button",
|
|
5134
|
-
{
|
|
5135
|
-
className: "absolute top-5 right-5 bg-transparent border-none text-gray-500 cursor-pointer p-2 rounded-lg transition-all hover:bg-gray-100 hover:text-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 min-w-9 min-h-9 flex items-center justify-center",
|
|
5136
|
-
onClick: onClose
|
|
5137
|
-
},
|
|
5138
|
-
/* @__PURE__ */ React29.createElement(X, { size: 20 })
|
|
5139
|
-
),
|
|
5140
|
-
/* @__PURE__ */ React29.createElement("div", { className: "px-6 pt-6 pb-4 text-center border-b border-gray-100" }, /* @__PURE__ */ React29.createElement("h2", { className: "text-2xl font-semibold text-gray-800 mb-2" }, "\u7528\u6237\u767B\u5F55"), /* @__PURE__ */ React29.createElement("p", { className: "text-gray-500 text-sm" }, "\u8BF7\u8F93\u5165\u60A8\u7684\u624B\u673A\u53F7\u548C\u5BC6\u7801")),
|
|
5141
|
-
process.env.NODE_ENV === "development" && /* @__PURE__ */ React29.createElement("div", { className: "px-6 py-4 bg-amber-50 border-b border-gray-100" }, /* @__PURE__ */ React29.createElement("p", { className: "text-xs text-amber-800 font-medium mb-2" }, "\u5F00\u53D1\u73AF\u5883\u5FEB\u6377\u767B\u5F55\uFF1A"), /* @__PURE__ */ React29.createElement("div", { className: "flex gap-2" }, /* @__PURE__ */ React29.createElement(
|
|
5142
|
-
"button",
|
|
5143
|
-
{
|
|
5144
|
-
type: "button",
|
|
5145
|
-
onClick: () => fillDemoAccount("admin"),
|
|
5146
|
-
className: "px-3 py-1.5 text-xs bg-amber-400 text-amber-900 border-none rounded-md cursor-pointer transition-all font-medium hover:bg-amber-500"
|
|
5147
|
-
},
|
|
5148
|
-
"\u7BA1\u7406\u5458\u8D26\u53F7"
|
|
5149
|
-
), /* @__PURE__ */ React29.createElement(
|
|
5150
|
-
"button",
|
|
5151
|
-
{
|
|
5152
|
-
type: "button",
|
|
5153
|
-
onClick: () => fillDemoAccount("user"),
|
|
5154
|
-
className: "px-3 py-1.5 text-xs bg-amber-400 text-amber-900 border-none rounded-md cursor-pointer transition-all font-medium hover:bg-amber-500"
|
|
5155
|
-
},
|
|
5156
|
-
"\u7528\u6237\u8D26\u53F7"
|
|
5157
|
-
))),
|
|
5158
|
-
/* @__PURE__ */ React29.createElement("form", { onSubmit: handleSubmit, className: "p-6" }, /* @__PURE__ */ React29.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React29.createElement("label", { htmlFor: "phone", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u624B\u673A\u53F7"), /* @__PURE__ */ React29.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React29.createElement(User, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React29.createElement(
|
|
5159
|
-
"input",
|
|
5160
|
-
{
|
|
5161
|
-
id: "phone",
|
|
5162
|
-
name: "phone",
|
|
5163
|
-
type: "tel",
|
|
5164
|
-
value: formData.phone,
|
|
5165
|
-
onChange: handleInputChange,
|
|
5166
|
-
placeholder: "\u8BF7\u8F93\u5165\u624B\u673A\u53F7",
|
|
5167
|
-
className: "w-full py-3 px-4 pl-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed",
|
|
5168
|
-
disabled: loading
|
|
5169
|
-
}
|
|
5170
|
-
))), /* @__PURE__ */ React29.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React29.createElement("label", { htmlFor: "password", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u5BC6\u7801"), /* @__PURE__ */ React29.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React29.createElement(Lock, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React29.createElement(
|
|
5171
|
-
"input",
|
|
5172
|
-
{
|
|
5173
|
-
id: "password",
|
|
5174
|
-
name: "password",
|
|
5175
|
-
type: showPassword ? "text" : "password",
|
|
5176
|
-
value: formData.password,
|
|
5177
|
-
onChange: handleInputChange,
|
|
5178
|
-
placeholder: "\u8BF7\u8F93\u5165\u5BC6\u7801",
|
|
5179
|
-
className: "w-full py-3 px-4 pl-12 pr-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed",
|
|
5180
|
-
disabled: loading
|
|
5181
|
-
}
|
|
5182
|
-
), /* @__PURE__ */ React29.createElement(
|
|
5183
|
-
"button",
|
|
5184
|
-
{
|
|
5185
|
-
type: "button",
|
|
5186
|
-
className: "absolute right-4 bg-transparent border-none text-gray-400 cursor-pointer p-1 rounded transition-all flex items-center justify-center min-w-6 min-h-6 hover:text-gray-600 hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50",
|
|
5187
|
-
onClick: () => setShowPassword(!showPassword),
|
|
5188
|
-
disabled: loading
|
|
5189
|
-
},
|
|
5190
|
-
showPassword ? /* @__PURE__ */ React29.createElement(EyeOff, { size: 18 }) : /* @__PURE__ */ React29.createElement(Eye, { size: 18 })
|
|
5191
|
-
))), /* @__PURE__ */ React29.createElement("div", { className: "text-right -mt-2 mb-4" }, /* @__PURE__ */ React29.createElement(
|
|
5192
|
-
"button",
|
|
5193
|
-
{
|
|
5194
|
-
type: "button",
|
|
5195
|
-
onClick: () => setShowForgotPassword(true),
|
|
5196
|
-
className: "bg-transparent border-none text-blue-500 cursor-pointer text-sm font-medium underline px-1 py-0.5 rounded transition-all hover:text-blue-600 hover:bg-blue-50 hover:no-underline focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2"
|
|
5197
|
-
},
|
|
5198
|
-
"\u5FD8\u8BB0\u5BC6\u7801\uFF1F"
|
|
5199
|
-
)), error && /* @__PURE__ */ React29.createElement("div", { className: "text-red-500 text-sm my-4 p-3 bg-red-50 border border-red-200 rounded-lg leading-relaxed" }, error), /* @__PURE__ */ React29.createElement(
|
|
5200
|
-
"button",
|
|
5201
|
-
{
|
|
5202
|
-
type: "submit",
|
|
5203
|
-
className: "w-full bg-blue-500 text-white border-none py-3.5 px-6 rounded-lg text-base font-medium cursor-pointer transition-all mt-2 min-h-[52px] hover:bg-blue-600 hover:-translate-y-0.5 hover:shadow-lg hover:shadow-blue-500/30 active:translate-y-0 disabled:bg-gray-400 disabled:cursor-not-allowed disabled:transform-none disabled:shadow-none focus:outline-none focus:ring-2 focus:ring-blue-700 focus:ring-offset-2",
|
|
5204
|
-
disabled: loading
|
|
5205
|
-
},
|
|
5206
|
-
loading ? "\u767B\u5F55\u4E2D..." : "\u767B\u5F55"
|
|
5207
|
-
), onSwitchToRegister && /* @__PURE__ */ React29.createElement("div", { className: "text-center mt-5 pt-4 border-t border-gray-100" }, /* @__PURE__ */ React29.createElement("span", { className: "text-gray-500 text-sm mr-1" }, "\u8FD8\u6CA1\u6709\u8D26\u53F7\uFF1F"), /* @__PURE__ */ React29.createElement(
|
|
5208
|
-
"button",
|
|
5209
|
-
{
|
|
5210
|
-
type: "button",
|
|
5211
|
-
onClick: onSwitchToRegister,
|
|
5212
|
-
className: "bg-transparent border-none text-blue-500 cursor-pointer text-sm font-medium underline px-1 py-0.5 rounded transition-all hover:text-blue-600 hover:bg-blue-50 hover:no-underline focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2"
|
|
5213
|
-
},
|
|
5214
|
-
"\u7ACB\u5373\u6CE8\u518C"
|
|
5215
|
-
)))
|
|
5216
|
-
)
|
|
5217
|
-
), /* @__PURE__ */ React29.createElement(
|
|
5218
|
-
ForgotPasswordModal,
|
|
5219
|
-
{
|
|
5220
|
-
isOpen: showForgotPassword,
|
|
5221
|
-
onClose: () => setShowForgotPassword(false),
|
|
5222
|
-
onSuccess: () => {
|
|
5223
|
-
setShowForgotPassword(false);
|
|
5224
|
-
onSuccess();
|
|
5225
|
-
}
|
|
5226
|
-
}
|
|
5227
|
-
));
|
|
5228
|
-
return createPortal(modalContent, document.body);
|
|
5229
|
-
}
|
|
5230
|
-
|
|
5231
|
-
// src/auth/legacy/components/AuthGuard.tsx
|
|
5232
|
-
function AuthGuard({
|
|
5233
|
-
children,
|
|
5234
|
-
fallback,
|
|
5235
|
-
requireAuth = true
|
|
5236
|
-
}) {
|
|
5237
|
-
const { isAuthenticated, loading, refreshUser } = useAuth();
|
|
5238
|
-
const [showLoginModal, setShowLoginModal] = useState(false);
|
|
5239
|
-
useEffect(() => {
|
|
5240
|
-
if (!loading && requireAuth && !isAuthenticated) {
|
|
5241
|
-
setShowLoginModal(true);
|
|
5242
|
-
}
|
|
5243
|
-
}, [loading, requireAuth, isAuthenticated]);
|
|
5244
|
-
const handleLoginSuccess = () => {
|
|
5245
|
-
refreshUser();
|
|
5246
|
-
setShowLoginModal(false);
|
|
5247
|
-
};
|
|
5248
|
-
if (loading) {
|
|
5249
|
-
return /* @__PURE__ */ React29.createElement("div", { style: {
|
|
5250
|
-
display: "flex",
|
|
5251
|
-
alignItems: "center",
|
|
5252
|
-
justifyContent: "center",
|
|
5253
|
-
minHeight: "200px",
|
|
5254
|
-
color: "#6b7280",
|
|
5255
|
-
flexDirection: "column",
|
|
5256
|
-
gap: "12px"
|
|
5257
|
-
} }, /* @__PURE__ */ React29.createElement("div", { style: {
|
|
5258
|
-
width: "32px",
|
|
5259
|
-
height: "32px",
|
|
5260
|
-
border: "3px solid #e5e7eb",
|
|
5261
|
-
borderTop: "3px solid #3b82f6",
|
|
5262
|
-
borderRadius: "50%",
|
|
5263
|
-
animation: "spin 1s linear infinite"
|
|
5264
|
-
} }), /* @__PURE__ */ React29.createElement("div", null, "\u9A8C\u8BC1\u767B\u5F55\u72B6\u6001..."));
|
|
5265
|
-
}
|
|
5266
|
-
if (requireAuth && !isAuthenticated) {
|
|
5267
|
-
return /* @__PURE__ */ React29.createElement(React29.Fragment, null, fallback || /* @__PURE__ */ React29.createElement("div", { style: {
|
|
5268
|
-
display: "flex",
|
|
5269
|
-
alignItems: "center",
|
|
5270
|
-
justifyContent: "center",
|
|
5271
|
-
minHeight: "200px",
|
|
5272
|
-
color: "#6b7280",
|
|
5273
|
-
flexDirection: "column",
|
|
5274
|
-
gap: "16px",
|
|
5275
|
-
padding: "24px",
|
|
5276
|
-
textAlign: "center"
|
|
5277
|
-
} }, /* @__PURE__ */ React29.createElement("div", { style: {
|
|
5278
|
-
fontSize: "48px",
|
|
5279
|
-
opacity: 0.5
|
|
5280
|
-
} }, "\u{1F512}"), /* @__PURE__ */ React29.createElement("div", { style: {
|
|
5281
|
-
fontSize: "18px",
|
|
5282
|
-
fontWeight: "500"
|
|
5283
|
-
} }, "\u8BF7\u5148\u767B\u5F55\u4EE5\u8BBF\u95EE\u6B64\u9875\u9762"), /* @__PURE__ */ React29.createElement("div", { style: {
|
|
5284
|
-
fontSize: "14px",
|
|
5285
|
-
opacity: 0.7
|
|
5286
|
-
} }, "\u767B\u5F55\u540E\u5373\u53EF\u67E5\u770B\u76F8\u5173\u5185\u5BB9")), /* @__PURE__ */ React29.createElement(
|
|
5287
|
-
LoginModal,
|
|
5288
|
-
{
|
|
5289
|
-
isOpen: showLoginModal,
|
|
5290
|
-
onClose: () => setShowLoginModal(false),
|
|
5291
|
-
onSuccess: handleLoginSuccess
|
|
5292
|
-
}
|
|
5293
|
-
));
|
|
5294
|
-
}
|
|
5295
|
-
return /* @__PURE__ */ React29.createElement(React29.Fragment, null, children);
|
|
5296
|
-
}
|
|
5297
|
-
function RegisterModal({ isOpen, onClose, onSuccess, onSwitchToLogin }) {
|
|
5298
|
-
const { register } = useAuth();
|
|
5299
|
-
const [formData, setFormData] = useState({
|
|
5300
|
-
phone: "",
|
|
5301
|
-
password: "",
|
|
5302
|
-
confirmPassword: "",
|
|
5303
|
-
name: ""
|
|
5304
|
-
});
|
|
5305
|
-
const [showPassword, setShowPassword] = useState(false);
|
|
5306
|
-
const [showConfirmPassword, setShowConfirmPassword] = useState(false);
|
|
5307
|
-
const [error, setError] = useState("");
|
|
5308
|
-
const [loading, setLoading] = useState(false);
|
|
5309
|
-
const [mounted, setMounted] = useState(false);
|
|
5310
|
-
useEffect(() => {
|
|
5311
|
-
setMounted(true);
|
|
5312
|
-
}, []);
|
|
5313
|
-
const handleInputChange = (e) => {
|
|
5314
|
-
const { name, value } = e.target;
|
|
5315
|
-
setFormData((prev) => ({ ...prev, [name]: value }));
|
|
5316
|
-
if (error) setError("");
|
|
5317
|
-
};
|
|
5318
|
-
const validateForm = () => {
|
|
5319
|
-
if (!formData.phone || !formData.password || !formData.confirmPassword) {
|
|
5320
|
-
setError("\u8BF7\u586B\u5199\u5FC5\u8981\u4FE1\u606F");
|
|
5321
|
-
return false;
|
|
5322
|
-
}
|
|
5323
|
-
if (!validatePhoneNumber(formData.phone)) {
|
|
5324
|
-
setError("\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u624B\u673A\u53F7\u683C\u5F0F");
|
|
5325
|
-
return false;
|
|
5326
|
-
}
|
|
5327
|
-
const passwordValidation = validatePassword(formData.password);
|
|
5328
|
-
if (!passwordValidation.valid) {
|
|
5329
|
-
setError(passwordValidation.message || "\u5BC6\u7801\u683C\u5F0F\u9519\u8BEF");
|
|
5330
|
-
return false;
|
|
5331
|
-
}
|
|
5332
|
-
if (formData.password !== formData.confirmPassword) {
|
|
5333
|
-
setError("\u4E24\u6B21\u8F93\u5165\u7684\u5BC6\u7801\u4E0D\u4E00\u81F4");
|
|
5334
|
-
return false;
|
|
5335
|
-
}
|
|
5336
|
-
return true;
|
|
5337
|
-
};
|
|
5338
|
-
const handleSubmit = async (e) => {
|
|
5339
|
-
e.preventDefault();
|
|
5340
|
-
setError("");
|
|
5341
|
-
setLoading(true);
|
|
5342
|
-
try {
|
|
5343
|
-
if (!validateForm()) {
|
|
5344
|
-
return;
|
|
5345
|
-
}
|
|
5346
|
-
console.log("\u{1F4DD} [RegisterModal] \u63D0\u4EA4\u6CE8\u518C\u8868\u5355:", {
|
|
5347
|
-
phone: formData.phone,
|
|
5348
|
-
name: formData.name || "\u672A\u8BBE\u7F6E",
|
|
5349
|
-
password: "***"
|
|
5350
|
-
});
|
|
5351
|
-
const result = await register({
|
|
5352
|
-
phone: formData.phone,
|
|
5353
|
-
password: formData.password,
|
|
5354
|
-
name: formData.name || void 0
|
|
5355
|
-
});
|
|
5356
|
-
if (result.success) {
|
|
5357
|
-
console.log("\u2705 [RegisterModal] \u6CE8\u518C\u6210\u529F");
|
|
5358
|
-
onSuccess();
|
|
5359
|
-
} else {
|
|
5360
|
-
console.log("\u274C [RegisterModal] \u6CE8\u518C\u5931\u8D25:", result.message);
|
|
5361
|
-
setError(result.message || "\u6CE8\u518C\u5931\u8D25");
|
|
5362
|
-
}
|
|
5363
|
-
} catch (error2) {
|
|
5364
|
-
console.error("\u{1F4A5} [RegisterModal] \u6CE8\u518C\u5F02\u5E38:", error2);
|
|
5365
|
-
setError("\u6CE8\u518C\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");
|
|
5366
|
-
} finally {
|
|
5367
|
-
setLoading(false);
|
|
5368
|
-
}
|
|
5369
|
-
};
|
|
5370
|
-
const handleOverlayClick = (e) => {
|
|
5371
|
-
if (e.target === e.currentTarget) {
|
|
5372
|
-
onClose();
|
|
5373
|
-
}
|
|
5374
|
-
};
|
|
5375
|
-
if (!isOpen || !mounted) return null;
|
|
5376
|
-
const modalContent = /* @__PURE__ */ React29.createElement(
|
|
5377
|
-
"div",
|
|
5378
|
-
{
|
|
5379
|
-
className: "fixed top-0 left-0 right-0 bottom-0 w-screen h-screen bg-black/50 backdrop-blur-sm flex items-center justify-center z-[9999] p-4",
|
|
5380
|
-
style: { margin: 0 },
|
|
5381
|
-
onClick: handleOverlayClick
|
|
5382
|
-
},
|
|
5383
|
-
/* @__PURE__ */ React29.createElement(
|
|
5384
|
-
"div",
|
|
5385
|
-
{
|
|
5386
|
-
className: "bg-white rounded-2xl shadow-xl w-full max-w-[420px] max-h-[90vh] overflow-y-auto relative",
|
|
5387
|
-
onClick: (e) => e.stopPropagation()
|
|
5388
|
-
},
|
|
5389
|
-
/* @__PURE__ */ React29.createElement(
|
|
5390
|
-
"button",
|
|
5391
|
-
{
|
|
5392
|
-
className: "absolute top-5 right-5 bg-transparent border-none text-gray-500 cursor-pointer p-2 rounded-lg transition-all hover:bg-gray-100 hover:text-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 min-w-9 min-h-9 flex items-center justify-center",
|
|
5393
|
-
onClick: onClose
|
|
5394
|
-
},
|
|
5395
|
-
/* @__PURE__ */ React29.createElement(X, { size: 20 })
|
|
5396
|
-
),
|
|
5397
|
-
/* @__PURE__ */ React29.createElement("div", { className: "px-6 pt-6 pb-4 text-center border-b border-gray-100" }, /* @__PURE__ */ React29.createElement("h2", { className: "text-2xl font-semibold text-gray-800 mb-2" }, "\u7528\u6237\u6CE8\u518C"), /* @__PURE__ */ React29.createElement("p", { className: "text-gray-500 text-sm" }, "\u8BF7\u586B\u5199\u4EE5\u4E0B\u4FE1\u606F\u521B\u5EFA\u8D26\u6237")),
|
|
5398
|
-
/* @__PURE__ */ React29.createElement("form", { onSubmit: handleSubmit, className: "p-6" }, /* @__PURE__ */ React29.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React29.createElement("label", { htmlFor: "phone", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u624B\u673A\u53F7 *"), /* @__PURE__ */ React29.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React29.createElement(Phone, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React29.createElement(
|
|
5399
|
-
"input",
|
|
5400
|
-
{
|
|
5401
|
-
id: "phone",
|
|
5402
|
-
name: "phone",
|
|
5403
|
-
type: "tel",
|
|
5404
|
-
value: formData.phone,
|
|
5405
|
-
onChange: handleInputChange,
|
|
5406
|
-
placeholder: "\u8BF7\u8F93\u5165\u624B\u673A\u53F7",
|
|
5407
|
-
className: "w-full py-3 px-4 pl-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed",
|
|
5408
|
-
disabled: loading
|
|
5409
|
-
}
|
|
5410
|
-
))), /* @__PURE__ */ React29.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React29.createElement("label", { htmlFor: "name", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u59D3\u540D"), /* @__PURE__ */ React29.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React29.createElement(User, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React29.createElement(
|
|
5411
|
-
"input",
|
|
5412
|
-
{
|
|
5413
|
-
id: "name",
|
|
5414
|
-
name: "name",
|
|
5415
|
-
type: "text",
|
|
5416
|
-
value: formData.name,
|
|
5417
|
-
onChange: handleInputChange,
|
|
5418
|
-
placeholder: "\u8BF7\u8F93\u5165\u59D3\u540D\uFF08\u53EF\u9009\uFF09",
|
|
5419
|
-
className: "w-full py-3 px-4 pl-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed",
|
|
5420
|
-
disabled: loading
|
|
5421
|
-
}
|
|
5422
|
-
))), /* @__PURE__ */ React29.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React29.createElement("label", { htmlFor: "password", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u5BC6\u7801 *"), /* @__PURE__ */ React29.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React29.createElement(Lock, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React29.createElement(
|
|
5423
|
-
"input",
|
|
5424
|
-
{
|
|
5425
|
-
id: "password",
|
|
5426
|
-
name: "password",
|
|
5427
|
-
type: showPassword ? "text" : "password",
|
|
5428
|
-
value: formData.password,
|
|
5429
|
-
onChange: handleInputChange,
|
|
5430
|
-
placeholder: "\u8BF7\u8F93\u5165\u5BC6\u7801\uFF08\u81F3\u5C116\u4F4D\uFF09",
|
|
5431
|
-
className: "w-full py-3 px-4 pl-12 pr-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed",
|
|
5432
|
-
disabled: loading
|
|
5433
|
-
}
|
|
5434
|
-
), /* @__PURE__ */ React29.createElement(
|
|
5435
|
-
"button",
|
|
5436
|
-
{
|
|
5437
|
-
type: "button",
|
|
5438
|
-
className: "absolute right-4 bg-transparent border-none text-gray-400 cursor-pointer p-1 rounded transition-all flex items-center justify-center min-w-6 min-h-6 hover:text-gray-600 hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50",
|
|
5439
|
-
onClick: () => setShowPassword(!showPassword),
|
|
5440
|
-
disabled: loading
|
|
5441
|
-
},
|
|
5442
|
-
showPassword ? /* @__PURE__ */ React29.createElement(EyeOff, { size: 18 }) : /* @__PURE__ */ React29.createElement(Eye, { size: 18 })
|
|
5443
|
-
))), /* @__PURE__ */ React29.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React29.createElement("label", { htmlFor: "confirmPassword", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u786E\u8BA4\u5BC6\u7801 *"), /* @__PURE__ */ React29.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React29.createElement(Lock, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React29.createElement(
|
|
5444
|
-
"input",
|
|
5445
|
-
{
|
|
5446
|
-
id: "confirmPassword",
|
|
5447
|
-
name: "confirmPassword",
|
|
5448
|
-
type: showConfirmPassword ? "text" : "password",
|
|
5449
|
-
value: formData.confirmPassword,
|
|
5450
|
-
onChange: handleInputChange,
|
|
5451
|
-
placeholder: "\u8BF7\u518D\u6B21\u8F93\u5165\u5BC6\u7801",
|
|
5452
|
-
className: "w-full py-3 px-4 pl-12 pr-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed",
|
|
5453
|
-
disabled: loading
|
|
5454
|
-
}
|
|
5455
|
-
), /* @__PURE__ */ React29.createElement(
|
|
5456
|
-
"button",
|
|
5457
|
-
{
|
|
5458
|
-
type: "button",
|
|
5459
|
-
className: "absolute right-4 bg-transparent border-none text-gray-400 cursor-pointer p-1 rounded transition-all flex items-center justify-center min-w-6 min-h-6 hover:text-gray-600 hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50",
|
|
5460
|
-
onClick: () => setShowConfirmPassword(!showConfirmPassword),
|
|
5461
|
-
disabled: loading
|
|
5462
|
-
},
|
|
5463
|
-
showConfirmPassword ? /* @__PURE__ */ React29.createElement(EyeOff, { size: 18 }) : /* @__PURE__ */ React29.createElement(Eye, { size: 18 })
|
|
5464
|
-
))), error && /* @__PURE__ */ React29.createElement("div", { className: "text-red-500 text-sm my-4 p-3 bg-red-50 border border-red-200 rounded-lg leading-relaxed" }, error), /* @__PURE__ */ React29.createElement(
|
|
5465
|
-
"button",
|
|
5466
|
-
{
|
|
5467
|
-
type: "submit",
|
|
5468
|
-
className: "w-full bg-blue-500 text-white border-none py-3.5 px-6 rounded-lg text-base font-medium cursor-pointer transition-all mt-2 min-h-[52px] hover:bg-blue-600 hover:-translate-y-0.5 hover:shadow-lg hover:shadow-blue-500/30 active:translate-y-0 disabled:bg-gray-400 disabled:cursor-not-allowed disabled:transform-none disabled:shadow-none focus:outline-none focus:ring-2 focus:ring-blue-700 focus:ring-offset-2",
|
|
5469
|
-
disabled: loading
|
|
5470
|
-
},
|
|
5471
|
-
loading ? "\u6CE8\u518C\u4E2D..." : "\u6CE8\u518C"
|
|
5472
|
-
), onSwitchToLogin && /* @__PURE__ */ React29.createElement("div", { className: "text-center mt-5 pt-4 border-t border-gray-100" }, /* @__PURE__ */ React29.createElement("span", { className: "text-gray-500 text-sm mr-1" }, "\u5DF2\u6709\u8D26\u53F7\uFF1F"), /* @__PURE__ */ React29.createElement(
|
|
5473
|
-
"button",
|
|
5474
|
-
{
|
|
5475
|
-
type: "button",
|
|
5476
|
-
onClick: onSwitchToLogin,
|
|
5477
|
-
className: "bg-transparent border-none text-blue-500 cursor-pointer text-sm font-medium underline px-1 py-0.5 rounded transition-all hover:text-blue-600 hover:bg-blue-50 hover:no-underline focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2"
|
|
5478
|
-
},
|
|
5479
|
-
"\u7ACB\u5373\u767B\u5F55"
|
|
5480
|
-
)))
|
|
5481
|
-
)
|
|
5482
|
-
);
|
|
5483
|
-
return createPortal(modalContent, document.body);
|
|
5484
|
-
}
|
|
5485
|
-
|
|
5486
|
-
// src/auth/legacy/components/UserMenu.tsx
|
|
5487
|
-
function UserMenu({ customMenuItems = [], className }) {
|
|
5488
|
-
const { user, isAuthenticated, logout } = useAuth();
|
|
5489
|
-
const [isOpen, setIsOpen] = useState(false);
|
|
5490
|
-
const [showLoginModal, setShowLoginModal] = useState(false);
|
|
5491
|
-
const [showRegisterModal, setShowRegisterModal] = useState(false);
|
|
5492
|
-
const toggleMenu = () => {
|
|
5493
|
-
setIsOpen(!isOpen);
|
|
5494
|
-
};
|
|
5495
|
-
const handleMenuClick = (e) => {
|
|
5496
|
-
e.stopPropagation();
|
|
5497
|
-
};
|
|
5498
|
-
const handleCustomMenuClick = (item) => {
|
|
5499
|
-
console.log(`\u{1F527} [UserMenu] \u81EA\u5B9A\u4E49\u83DC\u5355\u9879\u88AB\u70B9\u51FB: ${item.label}`);
|
|
5500
|
-
item.onClick();
|
|
5501
|
-
setIsOpen(false);
|
|
5502
|
-
};
|
|
5503
|
-
const handleLogin = () => {
|
|
5504
|
-
console.log("\u{1F511} [UserMenu] \u767B\u5F55\u6309\u94AE\u88AB\u70B9\u51FB");
|
|
5505
|
-
setShowLoginModal(true);
|
|
5506
|
-
setIsOpen(false);
|
|
5507
|
-
};
|
|
5508
|
-
const handleRegister = () => {
|
|
5509
|
-
console.log("\u{1F4DD} [UserMenu] \u6CE8\u518C\u6309\u94AE\u88AB\u70B9\u51FB");
|
|
5510
|
-
setShowRegisterModal(true);
|
|
5511
|
-
setIsOpen(false);
|
|
5512
|
-
};
|
|
5513
|
-
const handleLogout = async () => {
|
|
5514
|
-
console.log("\u{1F6AA} [UserMenu] \u9000\u51FA\u767B\u5F55\u6309\u94AE\u88AB\u70B9\u51FB");
|
|
5515
|
-
try {
|
|
5516
|
-
await logout();
|
|
5517
|
-
console.log("\u2705 [UserMenu] \u9000\u51FA\u767B\u5F55\u6210\u529F");
|
|
5518
|
-
} catch (error) {
|
|
5519
|
-
console.error("\u9000\u51FA\u767B\u5F55\u5931\u8D25:", error);
|
|
5520
|
-
}
|
|
5521
|
-
setIsOpen(false);
|
|
5522
|
-
};
|
|
5523
|
-
const handleAuthSuccess = () => {
|
|
5524
|
-
console.log("\u{1F389} [UserMenu] \u8BA4\u8BC1\u6210\u529F\u56DE\u8C03\u88AB\u8C03\u7528");
|
|
5525
|
-
console.log("\u{1F464} [UserMenu] \u5F53\u524DuseAuth\u72B6\u6001:", {
|
|
5526
|
-
user: user ? `${user.name || "\u672A\u8BBE\u7F6E"} (${user.phone})` : null,
|
|
5527
|
-
isAuthenticated
|
|
5528
|
-
});
|
|
5529
|
-
setShowLoginModal(false);
|
|
5530
|
-
setShowRegisterModal(false);
|
|
5531
|
-
console.log("\u2705 [UserMenu] \u8BA4\u8BC1\u6210\u529F\u5904\u7406\u5B8C\u6210 - \u6A21\u6001\u6846\u5DF2\u5173\u95ED");
|
|
5532
|
-
setTimeout(() => {
|
|
5533
|
-
console.log("\u{1F50D} [UserMenu] \u5EF6\u8FDF\u72B6\u6001\u68C0\u67E5:", {
|
|
5534
|
-
user: user ? `${user.name || "\u672A\u8BBE\u7F6E"} (${user.phone})` : null,
|
|
5535
|
-
isAuthenticated
|
|
5536
|
-
});
|
|
5537
|
-
}, 500);
|
|
5538
|
-
};
|
|
5539
|
-
const handleSwitchToRegister = () => {
|
|
5540
|
-
console.log("\u{1F504} [UserMenu] \u4ECE\u767B\u5F55\u5207\u6362\u5230\u6CE8\u518C");
|
|
5541
|
-
setShowLoginModal(false);
|
|
5542
|
-
setShowRegisterModal(true);
|
|
5543
|
-
};
|
|
5544
|
-
const handleSwitchToLogin = () => {
|
|
5545
|
-
console.log("\u{1F504} [UserMenu] \u4ECE\u6CE8\u518C\u5207\u6362\u5230\u767B\u5F55");
|
|
5546
|
-
setShowRegisterModal(false);
|
|
5547
|
-
setShowLoginModal(true);
|
|
5548
|
-
};
|
|
5549
|
-
const getVisibleCustomMenuItems = () => {
|
|
5550
|
-
return customMenuItems.filter((item) => {
|
|
5551
|
-
if (item.requireAuth === true) {
|
|
5552
|
-
return isAuthenticated;
|
|
5553
|
-
}
|
|
5554
|
-
if (item.requireAuth === false) {
|
|
5555
|
-
return !isAuthenticated;
|
|
5556
|
-
}
|
|
5557
|
-
return true;
|
|
5558
|
-
});
|
|
5559
|
-
};
|
|
5560
|
-
React29.useEffect(() => {
|
|
5561
|
-
const handleGlobalClick = () => {
|
|
5562
|
-
setIsOpen(false);
|
|
5563
|
-
};
|
|
5564
|
-
if (isOpen) {
|
|
5565
|
-
document.addEventListener("click", handleGlobalClick);
|
|
5566
|
-
}
|
|
5567
|
-
return () => {
|
|
5568
|
-
document.removeEventListener("click", handleGlobalClick);
|
|
5569
|
-
};
|
|
5570
|
-
}, [isOpen]);
|
|
5571
|
-
const visibleCustomMenuItems = getVisibleCustomMenuItems();
|
|
5572
|
-
return /* @__PURE__ */ React29.createElement("div", { className: `relative inline-block ${className || ""}` }, /* @__PURE__ */ React29.createElement(
|
|
5573
|
-
"button",
|
|
5574
|
-
{
|
|
5575
|
-
className: "flex items-center gap-2 px-3 py-2 bg-slate-50 text-slate-500 border border-slate-200 rounded-lg cursor-pointer transition-all min-w-11 min-h-11 text-sm font-medium hover:bg-slate-200 hover:text-slate-800 focus:outline-none focus:ring-2 focus:ring-blue-500/10",
|
|
5576
|
-
onClick: toggleMenu
|
|
5577
|
-
},
|
|
5578
|
-
/* @__PURE__ */ React29.createElement(User, { size: 24 }),
|
|
5579
|
-
isAuthenticated && user && /* @__PURE__ */ React29.createElement("span", { className: "max-w-[120px] overflow-hidden text-ellipsis whitespace-nowrap" }, user.name || user.phone)
|
|
5580
|
-
), isOpen && /* @__PURE__ */ React29.createElement(
|
|
5581
|
-
"div",
|
|
5582
|
-
{
|
|
5583
|
-
className: "absolute top-[calc(100%+0.5rem)] right-0 z-[1000] min-w-[200px] bg-white border border-slate-200 rounded-xl shadow-lg max-h-[90vh] overflow-y-auto p-2 animate-in slide-in-from-top-2 fade-in duration-200",
|
|
5584
|
-
onClick: handleMenuClick
|
|
5585
|
-
},
|
|
5586
|
-
isAuthenticated && user ? (
|
|
5587
|
-
// 已登录状态的菜单
|
|
5588
|
-
/* @__PURE__ */ React29.createElement(React29.Fragment, null, /* @__PURE__ */ React29.createElement("div", { className: "p-3 mb-2 bg-slate-50 rounded-lg" }, /* @__PURE__ */ React29.createElement("div", { className: "text-sm font-semibold text-slate-800 mb-1 overflow-hidden text-ellipsis whitespace-nowrap" }, user.name || "\u672A\u8BBE\u7F6E\u540D\u79F0"), /* @__PURE__ */ React29.createElement("div", { className: "text-xs text-slate-500 mb-1 overflow-hidden text-ellipsis whitespace-nowrap" }, user.phone), /* @__PURE__ */ React29.createElement("div", { className: "text-xs text-blue-500 font-medium" }, user.role === "admin" ? "\u7BA1\u7406\u5458" : "\u666E\u901A\u7528\u6237")), visibleCustomMenuItems.length > 0 && /* @__PURE__ */ React29.createElement(React29.Fragment, null, /* @__PURE__ */ React29.createElement("div", { className: "h-px bg-slate-200 my-2" }), visibleCustomMenuItems.map((item) => {
|
|
5589
|
-
const IconComponent = item.icon;
|
|
5590
|
-
return /* @__PURE__ */ React29.createElement(
|
|
5591
|
-
"button",
|
|
5592
|
-
{
|
|
5593
|
-
key: item.id,
|
|
5594
|
-
className: "flex items-center gap-3 w-full p-3 bg-transparent border-none rounded-lg text-gray-700 text-sm font-medium cursor-pointer transition-all text-left min-h-11 hover:bg-slate-100 hover:text-slate-800 focus:outline-none focus:bg-slate-100 focus:ring-2 focus:ring-blue-500/10",
|
|
5595
|
-
onClick: () => handleCustomMenuClick(item)
|
|
5596
|
-
},
|
|
5597
|
-
IconComponent && /* @__PURE__ */ React29.createElement(IconComponent, { size: 16 }),
|
|
5598
|
-
/* @__PURE__ */ React29.createElement("span", null, item.label)
|
|
5599
|
-
);
|
|
5600
|
-
})), /* @__PURE__ */ React29.createElement("div", { className: "h-px bg-slate-200 my-2" }), /* @__PURE__ */ React29.createElement(
|
|
5601
|
-
"button",
|
|
5602
|
-
{
|
|
5603
|
-
className: "flex items-center gap-3 w-full p-3 bg-transparent border-none rounded-lg text-gray-700 text-sm font-medium cursor-pointer transition-all text-left min-h-11 hover:bg-red-50 hover:text-red-600 focus:outline-none focus:bg-red-50 focus:text-red-600 focus:ring-2 focus:ring-red-500/10",
|
|
5604
|
-
onClick: handleLogout
|
|
5605
|
-
},
|
|
5606
|
-
/* @__PURE__ */ React29.createElement(LogOut, { size: 16 }),
|
|
5607
|
-
/* @__PURE__ */ React29.createElement("span", null, "\u9000\u51FA\u767B\u5F55")
|
|
5608
|
-
))
|
|
5609
|
-
) : (
|
|
5610
|
-
// 未登录状态的菜单
|
|
5611
|
-
/* @__PURE__ */ React29.createElement(React29.Fragment, null, /* @__PURE__ */ React29.createElement(
|
|
5612
|
-
"button",
|
|
5613
|
-
{
|
|
5614
|
-
className: "flex items-center gap-3 w-full p-3 bg-transparent border-none rounded-lg text-gray-700 text-sm font-medium cursor-pointer transition-all text-left min-h-11 hover:bg-slate-100 hover:text-slate-800 focus:outline-none focus:bg-slate-100 focus:ring-2 focus:ring-blue-500/10",
|
|
5615
|
-
onClick: handleLogin
|
|
5616
|
-
},
|
|
5617
|
-
/* @__PURE__ */ React29.createElement(LogIn, { size: 16 }),
|
|
5618
|
-
/* @__PURE__ */ React29.createElement("span", null, "\u767B\u5F55")
|
|
5619
|
-
), /* @__PURE__ */ React29.createElement(
|
|
5620
|
-
"button",
|
|
5621
|
-
{
|
|
5622
|
-
className: "flex items-center gap-3 w-full p-3 bg-transparent border-none rounded-lg text-gray-700 text-sm font-medium cursor-pointer transition-all text-left min-h-11 hover:bg-slate-100 hover:text-slate-800 focus:outline-none focus:bg-slate-100 focus:ring-2 focus:ring-blue-500/10",
|
|
5623
|
-
onClick: handleRegister
|
|
5624
|
-
},
|
|
5625
|
-
/* @__PURE__ */ React29.createElement(User, { size: 16 }),
|
|
5626
|
-
/* @__PURE__ */ React29.createElement("span", null, "\u6CE8\u518C")
|
|
5627
|
-
), visibleCustomMenuItems.length > 0 && /* @__PURE__ */ React29.createElement(React29.Fragment, null, /* @__PURE__ */ React29.createElement("div", { className: "h-px bg-slate-200 my-2" }), visibleCustomMenuItems.map((item) => {
|
|
5628
|
-
const IconComponent = item.icon;
|
|
5629
|
-
return /* @__PURE__ */ React29.createElement(
|
|
5630
|
-
"button",
|
|
5631
|
-
{
|
|
5632
|
-
key: item.id,
|
|
5633
|
-
className: "flex items-center gap-3 w-full p-3 bg-transparent border-none rounded-lg text-gray-700 text-sm font-medium cursor-pointer transition-all text-left min-h-11 hover:bg-slate-100 hover:text-slate-800 focus:outline-none focus:bg-slate-100 focus:ring-2 focus:ring-blue-500/10",
|
|
5634
|
-
onClick: () => handleCustomMenuClick(item)
|
|
5635
|
-
},
|
|
5636
|
-
IconComponent && /* @__PURE__ */ React29.createElement(IconComponent, { size: 16 }),
|
|
5637
|
-
/* @__PURE__ */ React29.createElement("span", null, item.label)
|
|
5638
|
-
);
|
|
5639
|
-
})))
|
|
5640
|
-
)
|
|
5641
|
-
), /* @__PURE__ */ React29.createElement(
|
|
5642
|
-
LoginModal,
|
|
5643
|
-
{
|
|
5644
|
-
isOpen: showLoginModal,
|
|
5645
|
-
onClose: () => setShowLoginModal(false),
|
|
5646
|
-
onSuccess: handleAuthSuccess,
|
|
5647
|
-
onSwitchToRegister: handleSwitchToRegister
|
|
5648
|
-
}
|
|
5649
|
-
), /* @__PURE__ */ React29.createElement(
|
|
5650
|
-
RegisterModal,
|
|
5651
|
-
{
|
|
5652
|
-
isOpen: showRegisterModal,
|
|
5653
|
-
onClose: () => setShowRegisterModal(false),
|
|
5654
|
-
onSuccess: handleAuthSuccess,
|
|
5655
|
-
onSwitchToLogin: handleSwitchToLogin
|
|
5656
|
-
}
|
|
5657
|
-
));
|
|
5658
|
-
}
|
|
5659
|
-
|
|
5660
|
-
// src/showmasterpiece/ui/web/pages/ShowMasterPiecesPage.tsx
|
|
5661
4627
|
function ShowMasterPiecesContent() {
|
|
5662
4628
|
const {
|
|
5663
4629
|
collections,
|
|
@@ -5765,8 +4731,8 @@ function ShowMasterPiecesContent() {
|
|
|
5765
4731
|
console.log("\u274C [ShowMasterPieces] \u7528\u6237\u53D6\u6D88\u4E3B\u9875\u5F39\u7A97:", configId);
|
|
5766
4732
|
cancelPopup(configId);
|
|
5767
4733
|
};
|
|
5768
|
-
const renderLoading = () => /* @__PURE__ */
|
|
5769
|
-
const renderError = () => /* @__PURE__ */
|
|
4734
|
+
const renderLoading = () => /* @__PURE__ */ React23.createElement("div", { className: "min-h-screen bg-gradient-to-br from-white to-prussian-blue-900/5 overflow-x-hidden" }, /* @__PURE__ */ React23.createElement("div", { className: "flex flex-col items-center justify-center min-h-[50vh] gap-4 p-4" }, /* @__PURE__ */ React23.createElement("div", { className: "w-10 h-10 border-4 border-prussian-blue-300 border-t-moonstone rounded-full animate-spin" }), /* @__PURE__ */ React23.createElement("p", { className: "text-prussian-blue-600" }, "\u52A0\u8F7D\u4E2D...")));
|
|
4735
|
+
const renderError = () => /* @__PURE__ */ React23.createElement("div", { className: "min-h-screen bg-gradient-to-br from-white to-prussian-blue-900/5 overflow-x-hidden" }, /* @__PURE__ */ React23.createElement("div", { className: "flex flex-col items-center justify-center min-h-[50vh] gap-4 p-4 text-center" }, /* @__PURE__ */ React23.createElement("p", { className: "text-destructive text-lg" }, "\u52A0\u8F7D\u5931\u8D25\uFF1A", error), /* @__PURE__ */ React23.createElement(
|
|
5770
4736
|
Button,
|
|
5771
4737
|
{
|
|
5772
4738
|
onClick: () => window.location.reload(),
|
|
@@ -5774,13 +4740,13 @@ function ShowMasterPiecesContent() {
|
|
|
5774
4740
|
},
|
|
5775
4741
|
"\u91CD\u8BD5"
|
|
5776
4742
|
)));
|
|
5777
|
-
const renderEmptyState = () => /* @__PURE__ */
|
|
4743
|
+
const renderEmptyState = () => /* @__PURE__ */ React23.createElement("div", { className: "min-h-screen bg-gradient-to-br from-white to-prussian-blue-900/5 overflow-x-hidden" }, /* @__PURE__ */ React23.createElement("div", { className: "flex flex-col items-center justify-center min-h-[50vh] gap-4 p-4 text-center" }, /* @__PURE__ */ React23.createElement("div", { className: "text-moonstone text-6xl mb-4" }, "\u{1F3A8}"), /* @__PURE__ */ React23.createElement("h3", { className: "text-xl font-semibold mb-2 text-rich-black" }, "\u6682\u65E0\u53EF\u7528\u753B\u96C6"), /* @__PURE__ */ React23.createElement("p", { className: "text-prussian-blue-600 mb-6" }, "\u5F53\u524D\u6CA1\u6709\u53EF\u9884\u8BA2\u7684\u753B\u96C6\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5"), hasAdminAccess && /* @__PURE__ */ React23.createElement(
|
|
5778
4744
|
Button,
|
|
5779
4745
|
{
|
|
5780
4746
|
asChild: true,
|
|
5781
4747
|
className: "bg-gradient-to-r from-moonstone to-cerulean hover:from-cerulean hover:to-moonstone text-white shadow-lg transition-all duration-300"
|
|
5782
4748
|
},
|
|
5783
|
-
/* @__PURE__ */
|
|
4749
|
+
/* @__PURE__ */ React23.createElement("a", { href: "/testField/ShowMasterPieces/config", className: "gap-2" }, /* @__PURE__ */ React23.createElement(Settings, { size: 20 }), "\u524D\u5F80\u914D\u7F6E\u9875\u9762")
|
|
5784
4750
|
)));
|
|
5785
4751
|
if (loading) {
|
|
5786
4752
|
return renderLoading();
|
|
@@ -5796,7 +4762,7 @@ function ShowMasterPiecesContent() {
|
|
|
5796
4762
|
category: tab.category,
|
|
5797
4763
|
displayName: tab.description || tab.name || getCategoryDisplayName(tab.category)
|
|
5798
4764
|
}));
|
|
5799
|
-
return /* @__PURE__ */
|
|
4765
|
+
return /* @__PURE__ */ React23.createElement(CartProvider, { userId }, /* @__PURE__ */ React23.createElement("div", { className: "min-h-screen bg-gradient-to-br from-white to-prussian-blue-900/5 overflow-x-hidden" }, /* @__PURE__ */ React23.createElement("div", { className: "bg-white/95 backdrop-blur supports-[backdrop-filter]:bg-white/80 border-b border-prussian-blue-200/30 sticky top-0 z-50" }, /* @__PURE__ */ React23.createElement("div", { className: "max-w-7xl mx-auto px-3 sm:px-4 py-3 sm:py-4" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center justify-between gap-2 sm:gap-4 min-h-[44px]" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-4 sm:gap-8 min-w-0 flex-1" }, selectedCollection && /* @__PURE__ */ React23.createElement(
|
|
5800
4766
|
Button,
|
|
5801
4767
|
{
|
|
5802
4768
|
variant: "ghost",
|
|
@@ -5804,25 +4770,25 @@ function ShowMasterPiecesContent() {
|
|
|
5804
4770
|
onClick: backToGallery,
|
|
5805
4771
|
className: "gap-1 sm:gap-2 min-h-[44px] min-w-[44px] flex-shrink-0"
|
|
5806
4772
|
},
|
|
5807
|
-
/* @__PURE__ */
|
|
5808
|
-
/* @__PURE__ */
|
|
5809
|
-
), /* @__PURE__ */
|
|
4773
|
+
/* @__PURE__ */ React23.createElement(ArrowLeft, { size: 18, className: "sm:w-5 sm:h-5" }),
|
|
4774
|
+
/* @__PURE__ */ React23.createElement("span", { className: "hidden sm:inline" }, "\u8FD4\u56DE")
|
|
4775
|
+
), /* @__PURE__ */ React23.createElement("div", { className: "text-center sm:text-left min-w-0 flex-1" }, /* @__PURE__ */ React23.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center gap-2" }, /* @__PURE__ */ React23.createElement("h1", { className: "text-lg sm:text-xl lg:text-2xl font-bold m-0 truncate text-rich-black" }, config?.heroTitle || "\u827A\u672F\u753B\u96C6\u5C55\u89C8")), /* @__PURE__ */ React23.createElement("p", { className: "text-xs sm:text-sm text-prussian-blue-600 m-0 hidden sm:block truncate" }, config?.heroSubtitle || "\u63A2\u7D22\u7CBE\u7F8E\u7684\u827A\u672F\u4F5C\u54C1\uFF0C\u611F\u53D7\u521B\u4F5C\u7684\u9B45\u529B"))), /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-3 sm:gap-4 flex-shrink-0" }, /* @__PURE__ */ React23.createElement(
|
|
5810
4776
|
Link,
|
|
5811
4777
|
{
|
|
5812
4778
|
href: "/testField/ShowMasterPieces/history",
|
|
5813
4779
|
className: "flex items-center gap-1 sm:gap-2 text-prussian-blue-600 hover:text-moonstone transition-colors p-1 sm:p-2 rounded-lg min-h-[44px] min-w-[44px] flex-shrink-0",
|
|
5814
4780
|
title: "\u67E5\u770B\u9884\u8BA2\u5386\u53F2"
|
|
5815
4781
|
},
|
|
5816
|
-
/* @__PURE__ */
|
|
5817
|
-
/* @__PURE__ */
|
|
5818
|
-
), /* @__PURE__ */
|
|
4782
|
+
/* @__PURE__ */ React23.createElement(History, { size: 18, className: "sm:w-5 sm:h-5" }),
|
|
4783
|
+
/* @__PURE__ */ React23.createElement("span", { className: "hidden sm:inline" }, "\u5386\u53F2\u8BB0\u5F55")
|
|
4784
|
+
), /* @__PURE__ */ React23.createElement(
|
|
5819
4785
|
CartButton,
|
|
5820
4786
|
{
|
|
5821
4787
|
onClick: handleCartClick,
|
|
5822
4788
|
className: "relative p-1 sm:p-2 text-prussian-blue-600 hover:text-moonstone transition-colors",
|
|
5823
4789
|
userId
|
|
5824
4790
|
}
|
|
5825
|
-
), /* @__PURE__ */
|
|
4791
|
+
), /* @__PURE__ */ React23.createElement(
|
|
5826
4792
|
UserMenu,
|
|
5827
4793
|
{
|
|
5828
4794
|
customMenuItems: hasAdminAccess ? [
|
|
@@ -5837,7 +4803,7 @@ function ShowMasterPiecesContent() {
|
|
|
5837
4803
|
}
|
|
5838
4804
|
))))), selectedCollection ? (
|
|
5839
4805
|
/* 手机相册风格的作品浏览视图 */
|
|
5840
|
-
/* @__PURE__ */
|
|
4806
|
+
/* @__PURE__ */ React23.createElement("div", { className: "fixed inset-0 top-[76px] z-40" }, /* @__PURE__ */ React23.createElement(
|
|
5841
4807
|
MobileAlbumViewer,
|
|
5842
4808
|
{
|
|
5843
4809
|
artworks: selectedCollection.pages,
|
|
@@ -5850,16 +4816,16 @@ function ShowMasterPiecesContent() {
|
|
|
5850
4816
|
canGoPrev
|
|
5851
4817
|
}
|
|
5852
4818
|
))
|
|
5853
|
-
) : /* @__PURE__ */
|
|
4819
|
+
) : /* @__PURE__ */ React23.createElement("div", { className: "max-w-7xl mx-auto p-3 sm:p-4 lg:p-6" }, /* @__PURE__ */ React23.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ React23.createElement(Card, null, /* @__PURE__ */ React23.createElement(CardHeader, null, /* @__PURE__ */ React23.createElement(CardTitle, null, "\u5546\u54C1\u5206\u7C7B"), /* @__PURE__ */ React23.createElement(CardDescription, null, "\u9009\u62E9\u60A8\u611F\u5174\u8DA3\u7684\u5546\u54C1\u7C7B\u578B")), /* @__PURE__ */ React23.createElement(CardContent, null, /* @__PURE__ */ React23.createElement(Tabs, { value: selectedCategory, onValueChange: (value) => setSelectedCategory(value) }, /* @__PURE__ */ React23.createElement(TabsList, { className: "grid grid-cols-3 lg:grid-cols-9 h-auto p-1 bg-moonstone-900/10" }, categoryList.map(({ category, displayName }) => /* @__PURE__ */ React23.createElement(
|
|
5854
4820
|
TabsTrigger,
|
|
5855
4821
|
{
|
|
5856
4822
|
key: category,
|
|
5857
4823
|
value: category,
|
|
5858
4824
|
className: "flex flex-col h-auto py-3 px-2 data-[state=active]:bg-gradient-to-r data-[state=active]:from-moonstone data-[state=active]:to-cerulean data-[state=active]:text-white data-[state=active]:shadow-lg transition-all duration-300"
|
|
5859
4825
|
},
|
|
5860
|
-
/* @__PURE__ */
|
|
5861
|
-
/* @__PURE__ */
|
|
5862
|
-
)))))), /* @__PURE__ */
|
|
4826
|
+
/* @__PURE__ */ React23.createElement("span", { className: "font-semibold text-xs" }, displayName),
|
|
4827
|
+
/* @__PURE__ */ React23.createElement(Badge, { variant: "outline", className: "mt-1 text-xs border-moonstone/30 text-cerulean bg-moonstone-900/5" }, collections.filter((c) => c.category === category).length)
|
|
4828
|
+
)))))), /* @__PURE__ */ React23.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4 sm:gap-6" }, filteredCollections.map((collection) => /* @__PURE__ */ React23.createElement(
|
|
5863
4829
|
CollectionCard,
|
|
5864
4830
|
{
|
|
5865
4831
|
key: collection.id,
|
|
@@ -5867,7 +4833,7 @@ function ShowMasterPiecesContent() {
|
|
|
5867
4833
|
userId,
|
|
5868
4834
|
onSelect: selectCollection
|
|
5869
4835
|
}
|
|
5870
|
-
))), filteredCollections.length === 0 && collections.length > 0 && /* @__PURE__ */
|
|
4836
|
+
))), filteredCollections.length === 0 && collections.length > 0 && /* @__PURE__ */ React23.createElement("div", { className: "text-center py-8 sm:py-12 px-4" }, /* @__PURE__ */ React23.createElement("div", { className: "text-prussian-blue-400 text-base sm:text-lg mb-2" }, "\u5F53\u524D\u5206\u7C7B\u6682\u65E0\u5185\u5BB9"), /* @__PURE__ */ React23.createElement("p", { className: "text-prussian-blue-500 text-xs sm:text-sm" }, "\u8BF7\u5C1D\u8BD5\u9009\u62E9\u5176\u4ED6\u5206\u7C7B\u67E5\u770B")))), /* @__PURE__ */ React23.createElement(
|
|
5871
4837
|
CartModal,
|
|
5872
4838
|
{
|
|
5873
4839
|
isOpen: cartModalOpen,
|
|
@@ -5875,7 +4841,7 @@ function ShowMasterPiecesContent() {
|
|
|
5875
4841
|
title: "\u8D2D\u7269\u8F66",
|
|
5876
4842
|
userId
|
|
5877
4843
|
}
|
|
5878
|
-
), hasPopup && /* @__PURE__ */
|
|
4844
|
+
), hasPopup && /* @__PURE__ */ React23.createElement(
|
|
5879
4845
|
DeadlinePopupManager,
|
|
5880
4846
|
{
|
|
5881
4847
|
configs: popupConfigs,
|
|
@@ -5886,7 +4852,7 @@ function ShowMasterPiecesContent() {
|
|
|
5886
4852
|
)));
|
|
5887
4853
|
}
|
|
5888
4854
|
function ShowMasterPieces(props = {}) {
|
|
5889
|
-
return /* @__PURE__ */
|
|
4855
|
+
return /* @__PURE__ */ React23.createElement(AuthProvider, null, /* @__PURE__ */ React23.createElement(ShowMasterPiecesContent, null));
|
|
5890
4856
|
}
|
|
5891
4857
|
|
|
5892
4858
|
// src/showmasterpiece/ui/web/pages/config/page.tsx
|
|
@@ -5991,7 +4957,7 @@ function ConfigPageContent() {
|
|
|
5991
4957
|
createdTime: "",
|
|
5992
4958
|
theme: ""
|
|
5993
4959
|
});
|
|
5994
|
-
|
|
4960
|
+
React23.useEffect(() => {
|
|
5995
4961
|
if (config) {
|
|
5996
4962
|
setConfigForm({
|
|
5997
4963
|
siteName: config.siteName,
|
|
@@ -6008,7 +4974,7 @@ function ConfigPageContent() {
|
|
|
6008
4974
|
});
|
|
6009
4975
|
}
|
|
6010
4976
|
}, [config]);
|
|
6011
|
-
|
|
4977
|
+
React23.useEffect(() => {
|
|
6012
4978
|
setCategoryOptions(categories);
|
|
6013
4979
|
}, [categories]);
|
|
6014
4980
|
const handleHomeTabMove = (index, direction) => {
|
|
@@ -6115,7 +5081,7 @@ function ConfigPageContent() {
|
|
|
6115
5081
|
return { ...prev, homeTabConfig: normalizeHomeTabConfig(updated) };
|
|
6116
5082
|
});
|
|
6117
5083
|
};
|
|
6118
|
-
|
|
5084
|
+
React23.useEffect(() => {
|
|
6119
5085
|
if (activeTab === "artworks" && collections.length > 0) {
|
|
6120
5086
|
if (selectedCollection && !collections.find((c) => c.id === selectedCollection)) {
|
|
6121
5087
|
console.log("\u26A0\uFE0F [\u914D\u7F6E\u9875\u9762] \u5F53\u524D\u9009\u62E9\u7684\u5546\u54C1\u5DF2\u4E0D\u5B58\u5728\uFF0C\u91CD\u7F6E\u9009\u62E9");
|
|
@@ -6141,7 +5107,7 @@ function ConfigPageContent() {
|
|
|
6141
5107
|
}
|
|
6142
5108
|
}
|
|
6143
5109
|
}, [activeTab, collections, selectedCollection]);
|
|
6144
|
-
|
|
5110
|
+
React23.useEffect(() => {
|
|
6145
5111
|
if (activeTab !== "artworks") {
|
|
6146
5112
|
if (showArtworkOrder || showArtworkForm || editingArtwork) {
|
|
6147
5113
|
console.log("\u{1F504} [\u914D\u7F6E\u9875\u9762] \u79BB\u5F00\u5546\u54C1\u8BE6\u60C5\u56FE\u7BA1\u7406tab\uFF0C\u91CD\u7F6EUI\u72B6\u6001\u4F46\u4FDD\u7559\u7528\u6237\u9009\u62E9");
|
|
@@ -6293,12 +5259,12 @@ function ConfigPageContent() {
|
|
|
6293
5259
|
setShowCollectionOrder(!showCollectionOrder);
|
|
6294
5260
|
};
|
|
6295
5261
|
if (loading) {
|
|
6296
|
-
return /* @__PURE__ */
|
|
5262
|
+
return /* @__PURE__ */ React23.createElement("div", { className: "min-h-screen bg-gradient-to-br from-slate-50 to-slate-200" }, /* @__PURE__ */ React23.createElement("div", { className: "flex flex-col items-center justify-center min-h-[50vh] gap-4" }, /* @__PURE__ */ React23.createElement("div", { className: "w-10 h-10 border-4 border-slate-200 border-t-blue-500 rounded-full animate-spin" }), /* @__PURE__ */ React23.createElement("p", { className: "text-slate-600" }, "\u52A0\u8F7D\u4E2D...")));
|
|
6297
5263
|
}
|
|
6298
5264
|
if (error) {
|
|
6299
|
-
return /* @__PURE__ */
|
|
5265
|
+
return /* @__PURE__ */ React23.createElement("div", { className: "min-h-screen bg-background" }, /* @__PURE__ */ React23.createElement("div", { className: "flex flex-col items-center justify-center min-h-[50vh] gap-4 p-4" }, /* @__PURE__ */ React23.createElement("p", { className: "text-destructive text-lg" }, "\u52A0\u8F7D\u5931\u8D25\uFF1A", error), /* @__PURE__ */ React23.createElement(Button, { onClick: refreshData }, "\u91CD\u8BD5")));
|
|
6300
5266
|
}
|
|
6301
|
-
return /* @__PURE__ */
|
|
5267
|
+
return /* @__PURE__ */ React23.createElement("div", { className: "min-h-screen bg-background" }, /* @__PURE__ */ React23.createElement("div", { className: "border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60" }, /* @__PURE__ */ React23.createElement("div", { className: "max-w-7xl mx-auto px-6 py-4" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-8" }, /* @__PURE__ */ React23.createElement(
|
|
6302
5268
|
Button,
|
|
6303
5269
|
{
|
|
6304
5270
|
variant: "ghost",
|
|
@@ -6306,26 +5272,26 @@ function ConfigPageContent() {
|
|
|
6306
5272
|
onClick: () => window.history.back(),
|
|
6307
5273
|
className: "gap-2"
|
|
6308
5274
|
},
|
|
6309
|
-
/* @__PURE__ */
|
|
5275
|
+
/* @__PURE__ */ React23.createElement(ArrowLeft, { size: 20 }),
|
|
6310
5276
|
"\u8FD4\u56DE"
|
|
6311
|
-
), /* @__PURE__ */
|
|
5277
|
+
), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("h1", { className: "text-2xl font-bold" }, "\u5546\u54C1\u5C55\u89C8\u914D\u7F6E\u7BA1\u7406"), /* @__PURE__ */ React23.createElement("p", { className: "text-sm text-muted-foreground" }, "\u7BA1\u7406\u5C55\u89C8\u7684\u6240\u6709\u914D\u7F6E\u3001\u5546\u54C1\u548C\u5546\u54C1\u8BE6\u60C5\u56FE"))))), /* @__PURE__ */ React23.createElement("div", { className: "max-w-7xl mx-auto p-6" }, /* @__PURE__ */ React23.createElement(Tabs, { value: activeTab, onValueChange: (value) => setActiveTab(value), className: "space-y-6" }, /* @__PURE__ */ React23.createElement(TabsList, { className: "grid w-full grid-cols-8" }, /* @__PURE__ */ React23.createElement(TabsTrigger, { value: "general", className: "flex items-center gap-2" }, /* @__PURE__ */ React23.createElement(Settings, { size: 16 }), "\u57FA\u7840\u914D\u7F6E"), /* @__PURE__ */ React23.createElement(TabsTrigger, { value: "homeTabs", className: "flex items-center gap-2" }, /* @__PURE__ */ React23.createElement(Settings, { size: 16 }), "\u9996\u9875Tab\u914D\u7F6E"), /* @__PURE__ */ React23.createElement(TabsTrigger, { value: "collections", className: "flex items-center gap-2" }, /* @__PURE__ */ React23.createElement(Database, { size: 16 }), "\u5546\u54C1\u7BA1\u7406"), /* @__PURE__ */ React23.createElement(TabsTrigger, { value: "artworks", className: "flex items-center gap-2" }, /* @__PURE__ */ React23.createElement(Image, { size: 16 }), "\u5546\u54C1\u8BE6\u60C5\u7BA1\u7406"), /* @__PURE__ */ React23.createElement(TabsTrigger, { value: "bookings", className: "flex items-center gap-2" }, /* @__PURE__ */ React23.createElement(Calendar, { size: 16 }), "\u9884\u8BA2\u7BA1\u7406"), /* @__PURE__ */ React23.createElement(TabsTrigger, { value: "popup", className: "flex items-center gap-2" }, /* @__PURE__ */ React23.createElement(Bell, { size: 16 }), "\u5F39\u7A97\u914D\u7F6E"), /* @__PURE__ */ React23.createElement(TabsTrigger, { value: "system", className: "flex items-center gap-2" }, /* @__PURE__ */ React23.createElement(Cog, { size: 16 }), "\u7CFB\u7EDF\u914D\u7F6E")), /* @__PURE__ */ React23.createElement(TabsContent, { value: "general", className: "space-y-6" }, /* @__PURE__ */ React23.createElement(Card, null, /* @__PURE__ */ React23.createElement(CardHeader, null, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement(CardTitle, null, "\u57FA\u7840\u914D\u7F6E"), /* @__PURE__ */ React23.createElement(CardDescription, null, "\u914D\u7F6E\u7F51\u7AD9\u7684\u57FA\u672C\u4FE1\u606F\u548C\u663E\u793A\u9009\u9879")), /* @__PURE__ */ React23.createElement("div", { className: "flex gap-3" }, /* @__PURE__ */ React23.createElement(
|
|
6312
5278
|
Button,
|
|
6313
5279
|
{
|
|
6314
5280
|
variant: "outline",
|
|
6315
5281
|
onClick: handleResetConfig,
|
|
6316
5282
|
className: "gap-2"
|
|
6317
5283
|
},
|
|
6318
|
-
/* @__PURE__ */
|
|
5284
|
+
/* @__PURE__ */ React23.createElement(RotateCcw, { size: 16 }),
|
|
6319
5285
|
"\u91CD\u7F6E\u9ED8\u8BA4"
|
|
6320
|
-
), /* @__PURE__ */
|
|
5286
|
+
), /* @__PURE__ */ React23.createElement(
|
|
6321
5287
|
Button,
|
|
6322
5288
|
{
|
|
6323
5289
|
onClick: handleSaveConfig,
|
|
6324
5290
|
className: "gap-2"
|
|
6325
5291
|
},
|
|
6326
|
-
/* @__PURE__ */
|
|
5292
|
+
/* @__PURE__ */ React23.createElement(Save, { size: 16 }),
|
|
6327
5293
|
"\u4FDD\u5B58\u914D\u7F6E"
|
|
6328
|
-
)))), /* @__PURE__ */
|
|
5294
|
+
)))), /* @__PURE__ */ React23.createElement(CardContent, null, /* @__PURE__ */ React23.createElement("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-6" }, /* @__PURE__ */ React23.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React23.createElement(Label, { htmlFor: "siteName" }, "\u7F51\u7AD9\u540D\u79F0"), /* @__PURE__ */ React23.createElement(
|
|
6329
5295
|
Input,
|
|
6330
5296
|
{
|
|
6331
5297
|
id: "siteName",
|
|
@@ -6334,7 +5300,7 @@ function ConfigPageContent() {
|
|
|
6334
5300
|
onChange: (e) => setConfigForm((prev) => ({ ...prev, siteName: e.target.value })),
|
|
6335
5301
|
placeholder: "\u8F93\u5165\u7F51\u7AD9\u540D\u79F0"
|
|
6336
5302
|
}
|
|
6337
|
-
)), /* @__PURE__ */
|
|
5303
|
+
)), /* @__PURE__ */ React23.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React23.createElement(Label, { htmlFor: "siteDescription" }, "\u7F51\u7AD9\u63CF\u8FF0"), /* @__PURE__ */ React23.createElement(
|
|
6338
5304
|
Textarea,
|
|
6339
5305
|
{
|
|
6340
5306
|
id: "siteDescription",
|
|
@@ -6343,7 +5309,7 @@ function ConfigPageContent() {
|
|
|
6343
5309
|
placeholder: "\u8F93\u5165\u7F51\u7AD9\u63CF\u8FF0",
|
|
6344
5310
|
rows: 2
|
|
6345
5311
|
}
|
|
6346
|
-
)), /* @__PURE__ */
|
|
5312
|
+
)), /* @__PURE__ */ React23.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React23.createElement(Label, { htmlFor: "heroTitle" }, "\u4E3B\u6807\u9898"), /* @__PURE__ */ React23.createElement(
|
|
6347
5313
|
Input,
|
|
6348
5314
|
{
|
|
6349
5315
|
id: "heroTitle",
|
|
@@ -6352,7 +5318,7 @@ function ConfigPageContent() {
|
|
|
6352
5318
|
onChange: (e) => setConfigForm((prev) => ({ ...prev, heroTitle: e.target.value })),
|
|
6353
5319
|
placeholder: "\u8F93\u5165\u4E3B\u6807\u9898"
|
|
6354
5320
|
}
|
|
6355
|
-
)), /* @__PURE__ */
|
|
5321
|
+
)), /* @__PURE__ */ React23.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React23.createElement(Label, { htmlFor: "heroSubtitle" }, "\u526F\u6807\u9898"), /* @__PURE__ */ React23.createElement(
|
|
6356
5322
|
Textarea,
|
|
6357
5323
|
{
|
|
6358
5324
|
id: "heroSubtitle",
|
|
@@ -6361,7 +5327,7 @@ function ConfigPageContent() {
|
|
|
6361
5327
|
placeholder: "\u8F93\u5165\u526F\u6807\u9898",
|
|
6362
5328
|
rows: 2
|
|
6363
5329
|
}
|
|
6364
|
-
)), /* @__PURE__ */
|
|
5330
|
+
)), /* @__PURE__ */ React23.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React23.createElement(Label, { htmlFor: "maxCollections" }, "\u6BCF\u9875\u663E\u793A\u5546\u54C1\u6570\u91CF"), /* @__PURE__ */ React23.createElement(
|
|
6365
5331
|
Input,
|
|
6366
5332
|
{
|
|
6367
5333
|
id: "maxCollections",
|
|
@@ -6371,23 +5337,23 @@ function ConfigPageContent() {
|
|
|
6371
5337
|
min: "1",
|
|
6372
5338
|
max: "50"
|
|
6373
5339
|
}
|
|
6374
|
-
)), /* @__PURE__ */
|
|
5340
|
+
)), /* @__PURE__ */ React23.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React23.createElement(Label, { htmlFor: "theme" }, "\u4E3B\u9898"), /* @__PURE__ */ React23.createElement(
|
|
6375
5341
|
Select,
|
|
6376
5342
|
{
|
|
6377
5343
|
value: configForm.theme,
|
|
6378
5344
|
onValueChange: (value) => setConfigForm((prev) => ({ ...prev, theme: value }))
|
|
6379
5345
|
},
|
|
6380
|
-
/* @__PURE__ */
|
|
6381
|
-
/* @__PURE__ */
|
|
6382
|
-
)), /* @__PURE__ */
|
|
5346
|
+
/* @__PURE__ */ React23.createElement(SelectTrigger, null, /* @__PURE__ */ React23.createElement(SelectValue, { placeholder: "\u9009\u62E9\u4E3B\u9898" })),
|
|
5347
|
+
/* @__PURE__ */ React23.createElement(SelectContent, null, /* @__PURE__ */ React23.createElement(SelectItem, { value: "light" }, "\u6D45\u8272"), /* @__PURE__ */ React23.createElement(SelectItem, { value: "dark" }, "\u6DF1\u8272"), /* @__PURE__ */ React23.createElement(SelectItem, { value: "auto" }, "\u81EA\u52A8"))
|
|
5348
|
+
)), /* @__PURE__ */ React23.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React23.createElement(Label, { htmlFor: "language" }, "\u8BED\u8A00"), /* @__PURE__ */ React23.createElement(
|
|
6383
5349
|
Select,
|
|
6384
5350
|
{
|
|
6385
5351
|
value: configForm.language,
|
|
6386
5352
|
onValueChange: (value) => setConfigForm((prev) => ({ ...prev, language: value }))
|
|
6387
5353
|
},
|
|
6388
|
-
/* @__PURE__ */
|
|
6389
|
-
/* @__PURE__ */
|
|
6390
|
-
)), /* @__PURE__ */
|
|
5354
|
+
/* @__PURE__ */ React23.createElement(SelectTrigger, null, /* @__PURE__ */ React23.createElement(SelectValue, { placeholder: "\u9009\u62E9\u8BED\u8A00" })),
|
|
5355
|
+
/* @__PURE__ */ React23.createElement(SelectContent, null, /* @__PURE__ */ React23.createElement(SelectItem, { value: "zh" }, "\u4E2D\u6587"), /* @__PURE__ */ React23.createElement(SelectItem, { value: "en" }, "English"))
|
|
5356
|
+
)), /* @__PURE__ */ React23.createElement("div", { className: "flex items-center space-x-2" }, /* @__PURE__ */ React23.createElement(
|
|
6391
5357
|
"input",
|
|
6392
5358
|
{
|
|
6393
5359
|
id: "enableSearch",
|
|
@@ -6396,7 +5362,7 @@ function ConfigPageContent() {
|
|
|
6396
5362
|
onChange: (e) => setConfigForm((prev) => ({ ...prev, enableSearch: e.target.checked })),
|
|
6397
5363
|
className: "h-4 w-4 rounded border-gray-300"
|
|
6398
5364
|
}
|
|
6399
|
-
), /* @__PURE__ */
|
|
5365
|
+
), /* @__PURE__ */ React23.createElement(Label, { htmlFor: "enableSearch", className: "text-sm font-medium" }, "\u542F\u7528\u641C\u7D22\u529F\u80FD")), /* @__PURE__ */ React23.createElement("div", { className: "flex items-center space-x-2" }, /* @__PURE__ */ React23.createElement(
|
|
6400
5366
|
"input",
|
|
6401
5367
|
{
|
|
6402
5368
|
id: "enableCategories",
|
|
@@ -6405,28 +5371,28 @@ function ConfigPageContent() {
|
|
|
6405
5371
|
onChange: (e) => setConfigForm((prev) => ({ ...prev, enableCategories: e.target.checked })),
|
|
6406
5372
|
className: "h-4 w-4 rounded border-gray-300"
|
|
6407
5373
|
}
|
|
6408
|
-
), /* @__PURE__ */
|
|
5374
|
+
), /* @__PURE__ */ React23.createElement(Label, { htmlFor: "enableCategories", className: "text-sm font-medium" }, "\u542F\u7528\u5206\u7C7B\u529F\u80FD")))))), /* @__PURE__ */ React23.createElement(TabsContent, { value: "homeTabs", className: "space-y-6" }, /* @__PURE__ */ React23.createElement(Card, null, /* @__PURE__ */ React23.createElement(CardHeader, null, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement(CardTitle, null, "\u9996\u9875\u5206\u7C7BTab\u914D\u7F6E"), /* @__PURE__ */ React23.createElement(CardDescription, null, "\u7BA1\u7406\u9996\u9875\u5206\u7C7BTab\u7684\u663E\u793A\u987A\u5E8F\u4E0E\u663E\u793A/\u9690\u85CF")), /* @__PURE__ */ React23.createElement("div", { className: "flex gap-3" }, /* @__PURE__ */ React23.createElement(Button, { variant: "outline", onClick: () => handleSetAllHomeTabsVisible(true) }, "\u5168\u90E8\u663E\u793A"), /* @__PURE__ */ React23.createElement(Button, { variant: "outline", onClick: () => handleSetAllHomeTabsVisible(false) }, "\u5168\u90E8\u9690\u85CF"), /* @__PURE__ */ React23.createElement(Button, { variant: "outline", onClick: handleResetHomeTabs, className: "gap-2" }, /* @__PURE__ */ React23.createElement(RotateCcw, { size: 16 }), "\u91CD\u7F6E\u987A\u5E8F"), /* @__PURE__ */ React23.createElement(Button, { onClick: handleSaveConfig, className: "gap-2" }, /* @__PURE__ */ React23.createElement(Save, { size: 16 }), "\u4FDD\u5B58\u914D\u7F6E")))), /* @__PURE__ */ React23.createElement(CardContent, null, /* @__PURE__ */ React23.createElement("div", { className: "flex flex-col lg:flex-row lg:items-end gap-3 mb-4" }, /* @__PURE__ */ React23.createElement("div", { className: "flex-1 space-y-2" }, /* @__PURE__ */ React23.createElement(Label, null, "\u5206\u7C7B\u540D\u79F0"), /* @__PURE__ */ React23.createElement(
|
|
6409
5375
|
Input,
|
|
6410
5376
|
{
|
|
6411
5377
|
value: newHomeTabCategory,
|
|
6412
5378
|
onChange: (e) => setNewHomeTabCategory(e.target.value),
|
|
6413
5379
|
placeholder: "\u8F93\u5165\u5206\u7C7B\u540D\u79F0"
|
|
6414
5380
|
}
|
|
6415
|
-
), /* @__PURE__ */
|
|
5381
|
+
), /* @__PURE__ */ React23.createElement(Label, null, "\u5C55\u793A\u6587\u6848"), /* @__PURE__ */ React23.createElement(
|
|
6416
5382
|
Input,
|
|
6417
5383
|
{
|
|
6418
5384
|
value: newHomeTabDescription,
|
|
6419
5385
|
onChange: (e) => setNewHomeTabDescription(e.target.value),
|
|
6420
5386
|
placeholder: "\u8F93\u5165\u5C55\u793A\u6587\u6848"
|
|
6421
5387
|
}
|
|
6422
|
-
)), /* @__PURE__ */
|
|
5388
|
+
)), /* @__PURE__ */ React23.createElement(Button, { onClick: handleAddHomeTab, className: "gap-2" }, /* @__PURE__ */ React23.createElement(Plus, { size: 16 }), "\u65B0\u589ETab")), /* @__PURE__ */ React23.createElement("div", { className: "space-y-2" }, configForm.homeTabConfig.map((item, index) => /* @__PURE__ */ React23.createElement(
|
|
6423
5389
|
"div",
|
|
6424
5390
|
{
|
|
6425
5391
|
key: item.category,
|
|
6426
5392
|
className: "flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 p-3 border border-slate-200 rounded-lg bg-white"
|
|
6427
5393
|
},
|
|
6428
|
-
/* @__PURE__ */
|
|
6429
|
-
/* @__PURE__ */
|
|
5394
|
+
/* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React23.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ React23.createElement("span", { className: "text-sm font-semibold text-slate-800" }, item.description || item.name || getCategoryDisplayName(item.category)), item.description ? /* @__PURE__ */ React23.createElement("span", { className: "text-xs text-slate-500" }, item.name || item.category) : null), !item.visible && /* @__PURE__ */ React23.createElement(Badge, { variant: "secondary", className: "text-xs" }, "\u5DF2\u9690\u85CF")),
|
|
5395
|
+
/* @__PURE__ */ React23.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React23.createElement(
|
|
6430
5396
|
Button,
|
|
6431
5397
|
{
|
|
6432
5398
|
variant: "outline",
|
|
@@ -6435,7 +5401,7 @@ function ConfigPageContent() {
|
|
|
6435
5401
|
disabled: index === 0
|
|
6436
5402
|
},
|
|
6437
5403
|
"\u4E0A\u79FB"
|
|
6438
|
-
), /* @__PURE__ */
|
|
5404
|
+
), /* @__PURE__ */ React23.createElement(
|
|
6439
5405
|
Button,
|
|
6440
5406
|
{
|
|
6441
5407
|
variant: "outline",
|
|
@@ -6444,7 +5410,7 @@ function ConfigPageContent() {
|
|
|
6444
5410
|
disabled: index === configForm.homeTabConfig.length - 1
|
|
6445
5411
|
},
|
|
6446
5412
|
"\u4E0B\u79FB"
|
|
6447
|
-
), /* @__PURE__ */
|
|
5413
|
+
), /* @__PURE__ */ React23.createElement(
|
|
6448
5414
|
Button,
|
|
6449
5415
|
{
|
|
6450
5416
|
variant: item.visible ? "secondary" : "default",
|
|
@@ -6452,7 +5418,7 @@ function ConfigPageContent() {
|
|
|
6452
5418
|
onClick: () => handleHomeTabToggle(item.category)
|
|
6453
5419
|
},
|
|
6454
5420
|
item.visible ? "\u9690\u85CF" : "\u663E\u793A"
|
|
6455
|
-
), /* @__PURE__ */
|
|
5421
|
+
), /* @__PURE__ */ React23.createElement(
|
|
6456
5422
|
Button,
|
|
6457
5423
|
{
|
|
6458
5424
|
variant: "outline",
|
|
@@ -6462,7 +5428,7 @@ function ConfigPageContent() {
|
|
|
6462
5428
|
},
|
|
6463
5429
|
"\u5220\u9664"
|
|
6464
5430
|
))
|
|
6465
|
-
)))))), /* @__PURE__ */
|
|
5431
|
+
)))))), /* @__PURE__ */ React23.createElement(TabsContent, { value: "collections", className: "space-y-6" }, /* @__PURE__ */ React23.createElement(Card, null, /* @__PURE__ */ React23.createElement(CardHeader, null, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center justify-between" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement(CardTitle, null, "\u5546\u54C1\u7BA1\u7406"), /* @__PURE__ */ React23.createElement(CardDescription, null, "\u7BA1\u7406\u5546\u54C1")), /* @__PURE__ */ React23.createElement("div", { className: "flex gap-3" }, /* @__PURE__ */ React23.createElement(
|
|
6466
5432
|
Button,
|
|
6467
5433
|
{
|
|
6468
5434
|
onClick: () => {
|
|
@@ -6481,18 +5447,18 @@ function ConfigPageContent() {
|
|
|
6481
5447
|
},
|
|
6482
5448
|
className: "gap-2"
|
|
6483
5449
|
},
|
|
6484
|
-
/* @__PURE__ */
|
|
5450
|
+
/* @__PURE__ */ React23.createElement(Plus, { size: 16 }),
|
|
6485
5451
|
"\u6DFB\u52A0\u5546\u54C1"
|
|
6486
|
-
), /* @__PURE__ */
|
|
5452
|
+
), /* @__PURE__ */ React23.createElement(
|
|
6487
5453
|
Button,
|
|
6488
5454
|
{
|
|
6489
5455
|
variant: "outline",
|
|
6490
5456
|
onClick: () => handleToggleCollectionOrder(),
|
|
6491
5457
|
className: "gap-2"
|
|
6492
5458
|
},
|
|
6493
|
-
/* @__PURE__ */
|
|
5459
|
+
/* @__PURE__ */ React23.createElement(ArrowUpDown, { size: 16 }),
|
|
6494
5460
|
showCollectionOrder ? "\u5173\u95ED\u6392\u5E8F" : "\u5546\u54C1\u6392\u5E8F"
|
|
6495
|
-
)))), /* @__PURE__ */
|
|
5461
|
+
)))), /* @__PURE__ */ React23.createElement(CardContent, null, showCollectionOrder && /* @__PURE__ */ React23.createElement("div", { className: "mb-6 p-6 bg-white rounded-lg shadow-sm border border-slate-200" }, /* @__PURE__ */ React23.createElement("div", { className: "mb-4" }, /* @__PURE__ */ React23.createElement("h3", { className: "text-xl font-semibold text-slate-800 mb-2" }, "\u5546\u54C1\u6392\u5E8F\u7BA1\u7406"), /* @__PURE__ */ React23.createElement("p", { className: "text-slate-600" }, "\u62D6\u62FD\u6216\u4F7F\u7528\u6309\u94AE\u8C03\u6574\u5546\u54C1\u5728\u524D\u53F0\u7684\u663E\u793A\u987A\u5E8F")), /* @__PURE__ */ React23.createElement(
|
|
6496
5462
|
CollectionOrderManagerV2,
|
|
6497
5463
|
{
|
|
6498
5464
|
moveCollectionUp: moveCollectionUp2,
|
|
@@ -6502,22 +5468,22 @@ function ConfigPageContent() {
|
|
|
6502
5468
|
console.log("\u{1F504} [\u914D\u7F6E\u9875\u9762] \u5546\u54C1\u987A\u5E8F\u5DF2\u66F4\u65B0\uFF08\u6392\u5E8F\u7EC4\u4EF6\u5185\u90E8\u5DF2\u5904\u7406\u6570\u636E\u66F4\u65B0\uFF09");
|
|
6503
5469
|
}
|
|
6504
5470
|
}
|
|
6505
|
-
)), !showCollectionOrder && /* @__PURE__ */
|
|
5471
|
+
)), !showCollectionOrder && /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6" }, collections.map((collection) => /* @__PURE__ */ React23.createElement("div", { key: collection.id, className: "bg-white rounded-lg shadow-sm border border-slate-200 overflow-hidden hover:shadow-md transition-shadow" }, /* @__PURE__ */ React23.createElement("div", { className: "h-48 bg-slate-100 overflow-hidden flex items-center justify-center" }, collection.coverImage ? /* @__PURE__ */ React23.createElement(
|
|
6506
5472
|
"img",
|
|
6507
5473
|
{
|
|
6508
5474
|
src: collection.coverImage,
|
|
6509
5475
|
alt: collection.title,
|
|
6510
5476
|
className: "w-full h-full object-cover"
|
|
6511
5477
|
}
|
|
6512
|
-
) : /* @__PURE__ */
|
|
5478
|
+
) : /* @__PURE__ */ React23.createElement("div", { className: "text-slate-400 text-sm" }, "\u6682\u65E0\u5C01\u9762")), /* @__PURE__ */ React23.createElement("div", { className: "p-4" }, /* @__PURE__ */ React23.createElement("h3", { className: "text-lg font-semibold text-slate-800 mb-2" }, collection.title), /* @__PURE__ */ React23.createElement("p", { className: "text-slate-600 text-sm mb-1" }, "\u7F16\u53F7\uFF1A", collection.number), /* @__PURE__ */ React23.createElement("p", { className: "text-slate-600 text-sm mb-1" }, "\u5206\u7C7B\uFF1A", collection.category.displayName), /* @__PURE__ */ React23.createElement("p", { className: "text-slate-600 text-sm mb-1" }, "\u4EF7\u683C\uFF1A", collection.price ? `\xA5${collection.price}` : "\u514D\u8D39"), /* @__PURE__ */ React23.createElement("p", { className: "text-slate-600 text-sm mb-1" }, "\u5546\u54C1\u8BE6\u60C5\u56FE\u6570\u91CF\uFF1A", collection.pages.length), /* @__PURE__ */ React23.createElement("p", { className: "text-slate-600 text-sm mb-3" }, "\u72B6\u6001\uFF1A", collection.isPublished ? "\u5DF2\u53D1\u5E03" : "\u8349\u7A3F"), /* @__PURE__ */ React23.createElement("div", { className: "flex gap-2" }, /* @__PURE__ */ React23.createElement(
|
|
6513
5479
|
"button",
|
|
6514
5480
|
{
|
|
6515
5481
|
onClick: () => handleEditCollection(collection),
|
|
6516
5482
|
className: "flex items-center gap-1 px-3 py-1 bg-blue-100 text-blue-700 border border-blue-200 rounded text-sm hover:bg-blue-200 transition-colors"
|
|
6517
5483
|
},
|
|
6518
|
-
/* @__PURE__ */
|
|
5484
|
+
/* @__PURE__ */ React23.createElement(Edit, { size: 14 }),
|
|
6519
5485
|
"\u7F16\u8F91"
|
|
6520
|
-
), /* @__PURE__ */
|
|
5486
|
+
), /* @__PURE__ */ React23.createElement(
|
|
6521
5487
|
"button",
|
|
6522
5488
|
{
|
|
6523
5489
|
onClick: async () => {
|
|
@@ -6527,18 +5493,18 @@ function ConfigPageContent() {
|
|
|
6527
5493
|
},
|
|
6528
5494
|
className: "flex items-center gap-1 px-3 py-1 bg-red-100 text-red-700 border border-red-200 rounded text-sm hover:bg-red-200 transition-colors"
|
|
6529
5495
|
},
|
|
6530
|
-
/* @__PURE__ */
|
|
5496
|
+
/* @__PURE__ */ React23.createElement(Trash2, { size: 14 }),
|
|
6531
5497
|
"\u5220\u9664"
|
|
6532
|
-
)))))))))), /* @__PURE__ */
|
|
5498
|
+
)))))))))), /* @__PURE__ */ React23.createElement(TabsContent, { value: "artworks", className: "space-y-6" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center justify-between mb-6" }, /* @__PURE__ */ React23.createElement("h2", { className: "text-2xl font-bold text-slate-800" }, "\u5546\u54C1\u8BE6\u60C5\u56FE\u7BA1\u7406"), /* @__PURE__ */ React23.createElement("div", { className: "flex gap-3" }, /* @__PURE__ */ React23.createElement(
|
|
6533
5499
|
"select",
|
|
6534
5500
|
{
|
|
6535
5501
|
value: selectedCollection || "",
|
|
6536
5502
|
onChange: (e) => setSelectedCollection(e.target.value ? parseInt(e.target.value) : null),
|
|
6537
5503
|
className: "px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
6538
5504
|
},
|
|
6539
|
-
/* @__PURE__ */
|
|
6540
|
-
collections.map((collection) => /* @__PURE__ */
|
|
6541
|
-
), selectedCollection && /* @__PURE__ */
|
|
5505
|
+
/* @__PURE__ */ React23.createElement("option", { value: "" }, "\u9009\u62E9\u5546\u54C1"),
|
|
5506
|
+
collections.map((collection) => /* @__PURE__ */ React23.createElement("option", { key: collection.id, value: collection.id }, collection.title))
|
|
5507
|
+
), selectedCollection && /* @__PURE__ */ React23.createElement(React23.Fragment, null, /* @__PURE__ */ React23.createElement(
|
|
6542
5508
|
"button",
|
|
6543
5509
|
{
|
|
6544
5510
|
onClick: () => {
|
|
@@ -6555,17 +5521,17 @@ function ConfigPageContent() {
|
|
|
6555
5521
|
},
|
|
6556
5522
|
className: "flex items-center gap-2 px-4 py-2 bg-blue-600 text-white border border-blue-600 rounded-lg font-medium hover:bg-blue-700 transition-colors"
|
|
6557
5523
|
},
|
|
6558
|
-
/* @__PURE__ */
|
|
5524
|
+
/* @__PURE__ */ React23.createElement(Plus, { size: 16 }),
|
|
6559
5525
|
"\u6DFB\u52A0\u5546\u54C1\u8BE6\u60C5\u56FE"
|
|
6560
|
-
), /* @__PURE__ */
|
|
5526
|
+
), /* @__PURE__ */ React23.createElement(
|
|
6561
5527
|
"button",
|
|
6562
5528
|
{
|
|
6563
5529
|
onClick: handleToggleArtworkOrder,
|
|
6564
5530
|
className: "flex items-center gap-2 px-4 py-2 bg-slate-100 text-slate-700 border border-slate-300 rounded-lg font-medium hover:bg-slate-200 transition-colors"
|
|
6565
5531
|
},
|
|
6566
|
-
/* @__PURE__ */
|
|
5532
|
+
/* @__PURE__ */ React23.createElement(ArrowUpDown, { size: 16 }),
|
|
6567
5533
|
showArtworkOrder ? "\u5173\u95ED\u6392\u5E8F" : "\u5546\u54C1\u8BE6\u60C5\u56FE\u6392\u5E8F"
|
|
6568
|
-
)))), selectedCollection && showArtworkOrder && /* @__PURE__ */
|
|
5534
|
+
)))), selectedCollection && showArtworkOrder && /* @__PURE__ */ React23.createElement("div", { className: "mb-6 p-6 bg-white rounded-lg shadow-sm border border-slate-200" }, /* @__PURE__ */ React23.createElement("div", { className: "mb-4" }, /* @__PURE__ */ React23.createElement("h3", { className: "text-xl font-semibold text-slate-800 mb-2" }, "\u5546\u54C1\u8BE6\u60C5\u56FE\u6392\u5E8F\u7BA1\u7406"), /* @__PURE__ */ React23.createElement("p", { className: "text-slate-600" }, "\u62D6\u62FD\u6216\u4F7F\u7528\u6309\u94AE\u8C03\u6574\u5546\u54C1\u8BE6\u60C5\u56FE\u5728\u5546\u54C1\u4E2D\u7684\u663E\u793A\u987A\u5E8F")), /* @__PURE__ */ React23.createElement(
|
|
6569
5535
|
ArtworkOrderManagerV2,
|
|
6570
5536
|
{
|
|
6571
5537
|
collectionId: selectedCollection,
|
|
@@ -6576,22 +5542,22 @@ function ConfigPageContent() {
|
|
|
6576
5542
|
console.log("\u{1F504} [\u914D\u7F6E\u9875\u9762] \u5546\u54C1\u8BE6\u60C5\u56FE\u987A\u5E8F\u5DF2\u66F4\u65B0\uFF08\u6392\u5E8F\u7EC4\u4EF6\u5185\u90E8\u5DF2\u5904\u7406\u6570\u636E\u66F4\u65B0\uFF09");
|
|
6577
5543
|
}
|
|
6578
5544
|
}
|
|
6579
|
-
)), selectedCollection && !showArtworkOrder && /* @__PURE__ */
|
|
5545
|
+
)), selectedCollection && !showArtworkOrder && /* @__PURE__ */ React23.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6" }, collections.find((c) => c.id === selectedCollection)?.pages.map((artwork) => /* @__PURE__ */ React23.createElement("div", { key: artwork.id, className: "bg-white rounded-lg shadow-sm border border-slate-200 overflow-hidden hover:shadow-md transition-shadow" }, /* @__PURE__ */ React23.createElement("div", { className: "h-48 bg-slate-100 overflow-hidden" }, artwork.image && /* @__PURE__ */ React23.createElement(
|
|
6580
5546
|
"img",
|
|
6581
5547
|
{
|
|
6582
5548
|
src: artwork.image,
|
|
6583
5549
|
alt: artwork.title,
|
|
6584
5550
|
className: "w-full h-full object-cover"
|
|
6585
5551
|
}
|
|
6586
|
-
)), /* @__PURE__ */
|
|
5552
|
+
)), /* @__PURE__ */ React23.createElement("div", { className: "p-4" }, /* @__PURE__ */ React23.createElement("h4", { className: "text-lg font-semibold text-slate-800 mb-2" }, artwork.title), /* @__PURE__ */ React23.createElement("p", { className: "text-slate-600 text-sm mb-1" }, "\u7F16\u53F7\uFF1A", artwork.number), /* @__PURE__ */ React23.createElement("p", { className: "text-slate-600 text-sm mb-1" }, "\u521B\u4F5C\u65F6\u95F4\uFF1A", artwork.createdTime), /* @__PURE__ */ React23.createElement("p", { className: "text-slate-600 text-sm mb-1" }, "\u4E3B\u9898\uFF1A", artwork.theme), /* @__PURE__ */ React23.createElement("p", { className: "text-slate-600 text-sm mb-3 line-clamp-2" }, artwork.description), /* @__PURE__ */ React23.createElement("div", { className: "flex gap-2" }, /* @__PURE__ */ React23.createElement(
|
|
6587
5553
|
"button",
|
|
6588
5554
|
{
|
|
6589
5555
|
onClick: () => handleEditArtwork(selectedCollection, artwork),
|
|
6590
5556
|
className: "flex items-center gap-1 px-3 py-1 bg-blue-100 text-blue-700 border border-blue-200 rounded text-sm hover:bg-blue-200 transition-colors"
|
|
6591
5557
|
},
|
|
6592
|
-
/* @__PURE__ */
|
|
5558
|
+
/* @__PURE__ */ React23.createElement(Edit, { size: 14 }),
|
|
6593
5559
|
"\u7F16\u8F91"
|
|
6594
|
-
), /* @__PURE__ */
|
|
5560
|
+
), /* @__PURE__ */ React23.createElement(
|
|
6595
5561
|
"button",
|
|
6596
5562
|
{
|
|
6597
5563
|
onClick: () => {
|
|
@@ -6601,18 +5567,18 @@ function ConfigPageContent() {
|
|
|
6601
5567
|
},
|
|
6602
5568
|
className: "flex items-center gap-1 px-3 py-1 bg-red-100 text-red-700 border border-red-200 rounded text-sm hover:bg-red-200 transition-colors"
|
|
6603
5569
|
},
|
|
6604
|
-
/* @__PURE__ */
|
|
5570
|
+
/* @__PURE__ */ React23.createElement(Trash2, { size: 14 }),
|
|
6605
5571
|
"\u5220\u9664"
|
|
6606
|
-
))))))), /* @__PURE__ */
|
|
5572
|
+
))))))), /* @__PURE__ */ React23.createElement(TabsContent, { value: "bookings", className: "space-y-6" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center justify-between mb-6" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("h2", { className: "text-2xl font-bold text-slate-800" }, "\u9884\u8BA2\u7BA1\u7406"), /* @__PURE__ */ React23.createElement("p", { className: "text-slate-600" }, "\u67E5\u770B\u6240\u6709\u7528\u6237\u7684\u9884\u8BA2\u4FE1\u606F")), /* @__PURE__ */ React23.createElement("div", { className: "flex gap-2" }, /* @__PURE__ */ React23.createElement(
|
|
6607
5573
|
"button",
|
|
6608
5574
|
{
|
|
6609
5575
|
onClick: refreshBookingData,
|
|
6610
5576
|
disabled: bookingLoading,
|
|
6611
5577
|
className: "flex items-center gap-2 px-4 py-2 bg-blue-100 text-blue-700 rounded-lg font-medium hover:bg-blue-200 transition-colors disabled:opacity-50"
|
|
6612
5578
|
},
|
|
6613
|
-
/* @__PURE__ */
|
|
5579
|
+
/* @__PURE__ */ React23.createElement(RefreshCw, { size: 16, className: bookingLoading ? "animate-spin" : "" }),
|
|
6614
5580
|
"\u5237\u65B0\u6570\u636E"
|
|
6615
|
-
))), /* @__PURE__ */
|
|
5581
|
+
))), /* @__PURE__ */ React23.createElement(
|
|
6616
5582
|
BookingAdminPanel,
|
|
6617
5583
|
{
|
|
6618
5584
|
bookings,
|
|
@@ -6627,14 +5593,14 @@ function ConfigPageContent() {
|
|
|
6627
5593
|
onDeleteBooking: deleteBooking3,
|
|
6628
5594
|
onExportBookings: exportBookings2
|
|
6629
5595
|
}
|
|
6630
|
-
)), /* @__PURE__ */
|
|
5596
|
+
)), /* @__PURE__ */ React23.createElement(TabsContent, { value: "popup", className: "space-y-6" }, /* @__PURE__ */ React23.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React23.createElement("h2", { className: "text-2xl font-bold text-slate-800 mb-2" }, "\u5F39\u7A97\u914D\u7F6E"), /* @__PURE__ */ React23.createElement("p", { className: "text-slate-600" }, "\u7BA1\u7406\u8D2D\u7269\u8F66\u63D0\u4EA4\u65F6\u7684\u9650\u65F6\u63D0\u9192\u5F39\u7A97\u8BBE\u7F6E")), /* @__PURE__ */ React23.createElement(PopupConfigManagement, null)), /* @__PURE__ */ React23.createElement(TabsContent, { value: "system", className: "space-y-6" }, /* @__PURE__ */ React23.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React23.createElement("h2", { className: "text-2xl font-bold text-slate-800 mb-2" }, "\u7CFB\u7EDF\u914D\u7F6E"), /* @__PURE__ */ React23.createElement("p", { className: "text-slate-600" }, "\u7BA1\u7406ShowMasterPieces\u6A21\u5757\u7684\u7CFB\u7EDF\u7EA7\u914D\u7F6E\u9879\uFF0C\u4E3A\u6A21\u5757\u72EC\u7ACB\u5316\u505A\u51C6\u5907"), /* @__PURE__ */ React23.createElement("div", { className: "mt-4 p-4 bg-blue-50 border border-blue-200 rounded-lg" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-start gap-3" }, /* @__PURE__ */ React23.createElement(Cog, { className: "text-blue-600 mt-0.5", size: 20 }), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("h3", { className: "font-semibold text-blue-900" }, "\u914D\u7F6E\u8BF4\u660E"), /* @__PURE__ */ React23.createElement("p", { className: "text-blue-800 text-sm mt-1" }, "\u8FD9\u91CC\u7684\u914D\u7F6E\u9879\u5C06\u7528\u4E8EShowMasterPieces\u6A21\u5757\u7684\u72EC\u7ACB\u8FD0\u884C\u3002 \u65B0\u521B\u5EFA\u7684\u914D\u7F6E\u9879\u4F1A\u81EA\u52A8\u6DFB\u52A0", /* @__PURE__ */ React23.createElement("code", { className: "bg-blue-100 px-1 rounded" }, "SHOWMASTER_"), "\u524D\u7F00\u3002"), /* @__PURE__ */ React23.createElement("p", { className: "text-blue-700 text-xs mt-2" }, "\u{1F4A1} \u63D0\u793A\uFF1A\u8FD9\u4E9B\u914D\u7F6E\u72EC\u7ACB\u4E8E\u5168\u5C40\u914D\u7F6E\uFF0C\u4FBF\u4E8E\u6A21\u5757\u6253\u5305\u548C\u90E8\u7F72\u3002"))))), /* @__PURE__ */ React23.createElement(SystemConfigManager, null)))), showCollectionForm && /* @__PURE__ */ React23.createElement("div", { className: "fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50" }, /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-xl max-w-2xl w-full max-h-[90vh] overflow-hidden" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center justify-between p-6 border-b border-slate-200" }, /* @__PURE__ */ React23.createElement("h3", { className: "text-xl font-semibold text-slate-800" }, editingCollection ? "\u7F16\u8F91\u5546\u54C1" : "\u6DFB\u52A0\u5546\u54C1"), /* @__PURE__ */ React23.createElement(
|
|
6631
5597
|
"button",
|
|
6632
5598
|
{
|
|
6633
5599
|
onClick: () => setShowCollectionForm(false),
|
|
6634
5600
|
className: "text-slate-400 hover:text-slate-600 text-2xl font-bold leading-none"
|
|
6635
5601
|
},
|
|
6636
5602
|
"\xD7"
|
|
6637
|
-
)), /* @__PURE__ */
|
|
5603
|
+
)), /* @__PURE__ */ React23.createElement("div", { className: "p-6 overflow-y-auto max-h-[calc(90vh-140px)]" }, /* @__PURE__ */ React23.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-2" }, "\u6807\u9898"), /* @__PURE__ */ React23.createElement(
|
|
6638
5604
|
"input",
|
|
6639
5605
|
{
|
|
6640
5606
|
type: "text",
|
|
@@ -6643,7 +5609,7 @@ function ConfigPageContent() {
|
|
|
6643
5609
|
placeholder: "\u8F93\u5165\u5546\u54C1\u6807\u9898",
|
|
6644
5610
|
className: "w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
6645
5611
|
}
|
|
6646
|
-
)), /* @__PURE__ */
|
|
5612
|
+
)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-2" }, "\u7F16\u53F7"), /* @__PURE__ */ React23.createElement(
|
|
6647
5613
|
"input",
|
|
6648
5614
|
{
|
|
6649
5615
|
type: "text",
|
|
@@ -6652,7 +5618,7 @@ function ConfigPageContent() {
|
|
|
6652
5618
|
placeholder: "\u8F93\u5165\u7F16\u53F7",
|
|
6653
5619
|
className: "w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
6654
5620
|
}
|
|
6655
|
-
)), /* @__PURE__ */
|
|
5621
|
+
)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement(
|
|
6656
5622
|
UniversalImageUpload,
|
|
6657
5623
|
{
|
|
6658
5624
|
label: "\u5C01\u9762\u56FE\u7247",
|
|
@@ -6666,7 +5632,7 @@ function ConfigPageContent() {
|
|
|
6666
5632
|
placeholder: "\u4E0A\u4F20\u5C01\u9762\u56FE\u7247",
|
|
6667
5633
|
businessType: "cover"
|
|
6668
5634
|
}
|
|
6669
|
-
)), /* @__PURE__ */
|
|
5635
|
+
)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-2" }, "\u63CF\u8FF0"), /* @__PURE__ */ React23.createElement(
|
|
6670
5636
|
"textarea",
|
|
6671
5637
|
{
|
|
6672
5638
|
value: collectionForm.description,
|
|
@@ -6675,15 +5641,15 @@ function ConfigPageContent() {
|
|
|
6675
5641
|
rows: 3,
|
|
6676
5642
|
className: "w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
6677
5643
|
}
|
|
6678
|
-
)), /* @__PURE__ */
|
|
5644
|
+
)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-2" }, "\u5206\u7C7B"), /* @__PURE__ */ React23.createElement(
|
|
6679
5645
|
"select",
|
|
6680
5646
|
{
|
|
6681
5647
|
value: collectionForm.category,
|
|
6682
5648
|
onChange: (e) => setCollectionForm((prev) => ({ ...prev, category: e.target.value })),
|
|
6683
5649
|
className: "w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
6684
5650
|
},
|
|
6685
|
-
categoryOptions.map((category) => /* @__PURE__ */
|
|
6686
|
-
)), /* @__PURE__ */
|
|
5651
|
+
categoryOptions.map((category) => /* @__PURE__ */ React23.createElement("option", { key: category.name, value: category.name }, category.description || getCategoryDisplayName(category.name)))
|
|
5652
|
+
)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-2" }, "\u4EF7\u683C\uFF08\u5143\uFF09"), /* @__PURE__ */ React23.createElement(
|
|
6687
5653
|
"input",
|
|
6688
5654
|
{
|
|
6689
5655
|
type: "number",
|
|
@@ -6697,7 +5663,7 @@ function ConfigPageContent() {
|
|
|
6697
5663
|
step: "1",
|
|
6698
5664
|
className: "w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
6699
5665
|
}
|
|
6700
|
-
)), /* @__PURE__ */
|
|
5666
|
+
)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "flex items-center gap-2 cursor-pointer" }, /* @__PURE__ */ React23.createElement(
|
|
6701
5667
|
"input",
|
|
6702
5668
|
{
|
|
6703
5669
|
type: "checkbox",
|
|
@@ -6705,28 +5671,28 @@ function ConfigPageContent() {
|
|
|
6705
5671
|
onChange: (e) => setCollectionForm((prev) => ({ ...prev, isPublished: e.target.checked })),
|
|
6706
5672
|
className: "w-4 h-4 text-blue-600 border-slate-300 rounded focus:ring-blue-500"
|
|
6707
5673
|
}
|
|
6708
|
-
), /* @__PURE__ */
|
|
5674
|
+
), /* @__PURE__ */ React23.createElement("span", { className: "text-sm font-medium text-slate-700" }, "\u53D1\u5E03\u5546\u54C1"))))), /* @__PURE__ */ React23.createElement("div", { className: "flex justify-end gap-3 p-6 border-t border-slate-200" }, /* @__PURE__ */ React23.createElement(
|
|
6709
5675
|
"button",
|
|
6710
5676
|
{
|
|
6711
5677
|
onClick: () => setShowCollectionForm(false),
|
|
6712
5678
|
className: "px-4 py-2 bg-slate-100 text-slate-700 border border-slate-300 rounded-lg font-medium hover:bg-slate-200 transition-colors"
|
|
6713
5679
|
},
|
|
6714
5680
|
"\u53D6\u6D88"
|
|
6715
|
-
), /* @__PURE__ */
|
|
5681
|
+
), /* @__PURE__ */ React23.createElement(
|
|
6716
5682
|
"button",
|
|
6717
5683
|
{
|
|
6718
5684
|
onClick: handleSaveCollection,
|
|
6719
5685
|
className: "px-4 py-2 bg-blue-600 text-white border border-blue-600 rounded-lg font-medium hover:bg-blue-700 transition-colors"
|
|
6720
5686
|
},
|
|
6721
5687
|
"\u4FDD\u5B58"
|
|
6722
|
-
)))), showArtworkForm && /* @__PURE__ */
|
|
5688
|
+
)))), showArtworkForm && /* @__PURE__ */ React23.createElement("div", { className: "fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50" }, /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-xl max-w-2xl w-full max-h-[90vh] overflow-hidden" }, /* @__PURE__ */ React23.createElement("div", { className: "flex items-center justify-between p-6 border-b border-slate-200" }, /* @__PURE__ */ React23.createElement("h3", { className: "text-xl font-semibold text-slate-800" }, editingArtwork ? "\u7F16\u8F91\u5546\u54C1\u8BE6\u60C5\u56FE" : "\u6DFB\u52A0\u5546\u54C1\u8BE6\u60C5\u56FE"), /* @__PURE__ */ React23.createElement(
|
|
6723
5689
|
"button",
|
|
6724
5690
|
{
|
|
6725
5691
|
onClick: () => setShowArtworkForm(false),
|
|
6726
5692
|
className: "text-slate-400 hover:text-slate-600 text-2xl font-bold leading-none"
|
|
6727
5693
|
},
|
|
6728
5694
|
"\xD7"
|
|
6729
|
-
)), /* @__PURE__ */
|
|
5695
|
+
)), /* @__PURE__ */ React23.createElement("div", { className: "p-6 overflow-y-auto max-h-[calc(90vh-140px)]" }, /* @__PURE__ */ React23.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-2" }, "\u6807\u9898"), /* @__PURE__ */ React23.createElement(
|
|
6730
5696
|
"input",
|
|
6731
5697
|
{
|
|
6732
5698
|
type: "text",
|
|
@@ -6735,7 +5701,7 @@ function ConfigPageContent() {
|
|
|
6735
5701
|
placeholder: "\u8F93\u5165\u5546\u54C1\u8BE6\u60C5\u56FE\u6807\u9898",
|
|
6736
5702
|
className: "w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
6737
5703
|
}
|
|
6738
|
-
)), /* @__PURE__ */
|
|
5704
|
+
)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-2" }, "\u7F16\u53F7"), /* @__PURE__ */ React23.createElement(
|
|
6739
5705
|
"input",
|
|
6740
5706
|
{
|
|
6741
5707
|
type: "text",
|
|
@@ -6744,7 +5710,7 @@ function ConfigPageContent() {
|
|
|
6744
5710
|
placeholder: "\u8F93\u5165\u7F16\u53F7",
|
|
6745
5711
|
className: "w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
6746
5712
|
}
|
|
6747
|
-
)), /* @__PURE__ */
|
|
5713
|
+
)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement(
|
|
6748
5714
|
UniversalImageUpload,
|
|
6749
5715
|
{
|
|
6750
5716
|
label: "\u5546\u54C1\u8BE6\u60C5\u56FE\u56FE\u7247",
|
|
@@ -6758,7 +5724,7 @@ function ConfigPageContent() {
|
|
|
6758
5724
|
placeholder: "\u4E0A\u4F20\u5546\u54C1\u8BE6\u60C5\u56FE\u56FE\u7247",
|
|
6759
5725
|
businessType: "artwork"
|
|
6760
5726
|
}
|
|
6761
|
-
)), /* @__PURE__ */
|
|
5727
|
+
)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-2" }, "\u63CF\u8FF0"), /* @__PURE__ */ React23.createElement(
|
|
6762
5728
|
"textarea",
|
|
6763
5729
|
{
|
|
6764
5730
|
value: artworkForm.description,
|
|
@@ -6767,7 +5733,7 @@ function ConfigPageContent() {
|
|
|
6767
5733
|
rows: 3,
|
|
6768
5734
|
className: "w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
6769
5735
|
}
|
|
6770
|
-
)), /* @__PURE__ */
|
|
5736
|
+
)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-2" }, "\u521B\u4F5C\u65F6\u95F4"), /* @__PURE__ */ React23.createElement(
|
|
6771
5737
|
"input",
|
|
6772
5738
|
{
|
|
6773
5739
|
type: "text",
|
|
@@ -6776,7 +5742,7 @@ function ConfigPageContent() {
|
|
|
6776
5742
|
placeholder: "\u8F93\u5165\u521B\u4F5C\u65F6\u95F4",
|
|
6777
5743
|
className: "w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
6778
5744
|
}
|
|
6779
|
-
)), /* @__PURE__ */
|
|
5745
|
+
)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { className: "block text-sm font-medium text-slate-700 mb-2" }, "\u4E3B\u9898"), /* @__PURE__ */ React23.createElement(
|
|
6780
5746
|
"input",
|
|
6781
5747
|
{
|
|
6782
5748
|
type: "text",
|
|
@@ -6785,14 +5751,14 @@ function ConfigPageContent() {
|
|
|
6785
5751
|
placeholder: "\u8F93\u5165\u5546\u54C1\u8BE6\u60C5\u56FE\u4E3B\u9898",
|
|
6786
5752
|
className: "w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
|
6787
5753
|
}
|
|
6788
|
-
)))), /* @__PURE__ */
|
|
5754
|
+
)))), /* @__PURE__ */ React23.createElement("div", { className: "flex justify-end gap-3 p-6 border-t border-slate-200" }, /* @__PURE__ */ React23.createElement(
|
|
6789
5755
|
"button",
|
|
6790
5756
|
{
|
|
6791
5757
|
onClick: () => setShowArtworkForm(false),
|
|
6792
5758
|
className: "px-4 py-2 bg-slate-100 text-slate-700 border border-slate-300 rounded-lg font-medium hover:bg-slate-200 transition-colors"
|
|
6793
5759
|
},
|
|
6794
5760
|
"\u53D6\u6D88"
|
|
6795
|
-
), /* @__PURE__ */
|
|
5761
|
+
), /* @__PURE__ */ React23.createElement(
|
|
6796
5762
|
"button",
|
|
6797
5763
|
{
|
|
6798
5764
|
onClick: handleSaveArtwork,
|
|
@@ -6802,7 +5768,7 @@ function ConfigPageContent() {
|
|
|
6802
5768
|
)))));
|
|
6803
5769
|
}
|
|
6804
5770
|
function ConfigPage() {
|
|
6805
|
-
return /* @__PURE__ */
|
|
5771
|
+
return /* @__PURE__ */ React23.createElement(AuthProvider, null, /* @__PURE__ */ React23.createElement(AuthGuard, null, /* @__PURE__ */ React23.createElement(ConfigPageContent, null)));
|
|
6806
5772
|
}
|
|
6807
5773
|
function UserHistoryPage() {
|
|
6808
5774
|
const [formData, setFormData] = useState({
|
|
@@ -6846,15 +5812,15 @@ function UserHistoryPage() {
|
|
|
6846
5812
|
setFormData({ qqNumber: "", phoneNumber: "" });
|
|
6847
5813
|
setFormErrors({});
|
|
6848
5814
|
};
|
|
6849
|
-
return /* @__PURE__ */
|
|
5815
|
+
return /* @__PURE__ */ React23.createElement("div", { className: "min-h-screen bg-slate-50" }, /* @__PURE__ */ React23.createElement("div", { className: "max-w-6xl mx-auto p-4 sm:p-6" }, /* @__PURE__ */ React23.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React23.createElement(
|
|
6850
5816
|
Link,
|
|
6851
5817
|
{
|
|
6852
5818
|
href: "/testField/ShowMasterPieces",
|
|
6853
5819
|
className: "inline-flex items-center gap-2 text-slate-600 hover:text-slate-800 transition-colors"
|
|
6854
5820
|
},
|
|
6855
|
-
/* @__PURE__ */
|
|
5821
|
+
/* @__PURE__ */ React23.createElement(ArrowLeft, { size: 20 }),
|
|
6856
5822
|
"\u8FD4\u56DE\u753B\u96C6\u5C55\u793A"
|
|
6857
|
-
)), !isSubmitted ? /* @__PURE__ */
|
|
5823
|
+
)), !isSubmitted ? /* @__PURE__ */ React23.createElement("div", { className: "max-w-md mx-auto" }, /* @__PURE__ */ React23.createElement("div", { className: "text-center mb-8" }, /* @__PURE__ */ React23.createElement("div", { className: "inline-flex items-center justify-center w-16 h-16 bg-blue-100 rounded-full mb-4" }, /* @__PURE__ */ React23.createElement(User, { size: 32, className: "text-blue-600" })), /* @__PURE__ */ React23.createElement("h1", { className: "text-2xl font-bold text-slate-800 mb-2" }, "\u67E5\u770B\u9884\u8BA2\u5386\u53F2"), /* @__PURE__ */ React23.createElement("p", { className: "text-slate-600" }, "\u8BF7\u8F93\u5165\u60A8\u7684QQ\u53F7\u548C\u624B\u673A\u53F7\u67E5\u770B\u9884\u8BA2\u5386\u53F2\u8BB0\u5F55")), /* @__PURE__ */ React23.createElement("div", { className: "bg-white rounded-lg shadow-sm border border-slate-200 p-6" }, /* @__PURE__ */ React23.createElement("form", { onSubmit: handleSubmit, className: "space-y-4" }, /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { htmlFor: "qqNumber", className: "block text-sm font-medium text-slate-700 mb-2" }, "QQ\u53F7"), /* @__PURE__ */ React23.createElement(
|
|
6858
5824
|
"input",
|
|
6859
5825
|
{
|
|
6860
5826
|
type: "text",
|
|
@@ -6864,7 +5830,7 @@ function UserHistoryPage() {
|
|
|
6864
5830
|
className: `w-full px-3 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 ${formErrors.qqNumber ? "border-red-300" : "border-slate-300"}`,
|
|
6865
5831
|
placeholder: "\u8BF7\u8F93\u5165QQ\u53F7"
|
|
6866
5832
|
}
|
|
6867
|
-
), formErrors.qqNumber && /* @__PURE__ */
|
|
5833
|
+
), formErrors.qqNumber && /* @__PURE__ */ React23.createElement("p", { className: "mt-1 text-sm text-red-600" }, formErrors.qqNumber)), /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("label", { htmlFor: "phoneNumber", className: "block text-sm font-medium text-slate-700 mb-2" }, "\u624B\u673A\u53F7"), /* @__PURE__ */ React23.createElement(
|
|
6868
5834
|
"input",
|
|
6869
5835
|
{
|
|
6870
5836
|
type: "tel",
|
|
@@ -6874,23 +5840,23 @@ function UserHistoryPage() {
|
|
|
6874
5840
|
className: `w-full px-3 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 ${formErrors.phoneNumber ? "border-red-300" : "border-slate-300"}`,
|
|
6875
5841
|
placeholder: "\u8BF7\u8F93\u5165\u624B\u673A\u53F7"
|
|
6876
5842
|
}
|
|
6877
|
-
), formErrors.phoneNumber && /* @__PURE__ */
|
|
5843
|
+
), formErrors.phoneNumber && /* @__PURE__ */ React23.createElement("p", { className: "mt-1 text-sm text-red-600" }, formErrors.phoneNumber)), /* @__PURE__ */ React23.createElement(
|
|
6878
5844
|
"button",
|
|
6879
5845
|
{
|
|
6880
5846
|
type: "submit",
|
|
6881
5847
|
className: "w-full flex items-center justify-center gap-2 bg-blue-600 text-white py-2 px-4 rounded-lg font-medium hover:bg-blue-700 transition-colors"
|
|
6882
5848
|
},
|
|
6883
|
-
/* @__PURE__ */
|
|
5849
|
+
/* @__PURE__ */ React23.createElement(Search, { size: 16 }),
|
|
6884
5850
|
"\u67E5\u8BE2\u5386\u53F2\u8BB0\u5F55"
|
|
6885
|
-
)), /* @__PURE__ */
|
|
5851
|
+
)), /* @__PURE__ */ React23.createElement("div", { className: "mt-6 p-4 bg-blue-50 rounded-lg" }, /* @__PURE__ */ React23.createElement("h3", { className: "text-sm font-medium text-blue-800 mb-2" }, "\u67E5\u8BE2\u8BF4\u660E"), /* @__PURE__ */ React23.createElement("ul", { className: "text-sm text-blue-700 space-y-1" }, /* @__PURE__ */ React23.createElement("li", null, "\u2022 \u8BF7\u8F93\u5165\u60A8\u9884\u8BA2\u65F6\u4F7F\u7528\u7684QQ\u53F7\u548C\u624B\u673A\u53F7"), /* @__PURE__ */ React23.createElement("li", null, "\u2022 \u7CFB\u7EDF\u5C06\u663E\u793A\u60A8\u6240\u6709\u7684\u9884\u8BA2\u5386\u53F2\u8BB0\u5F55"), /* @__PURE__ */ React23.createElement("li", null, "\u2022 \u60A8\u53EF\u4EE5\u67E5\u770B\u9884\u8BA2\u72B6\u6001\u3001\u5546\u54C1\u8BE6\u60C5\u7B49\u4FE1\u606F"), /* @__PURE__ */ React23.createElement("li", null, "\u2022 \u652F\u6301\u5220\u9664\u5355\u6761\u8BB0\u5F55\u6216\u6E05\u7A7A\u6240\u6709\u8BB0\u5F55"))))) : /* @__PURE__ */ React23.createElement("div", null, /* @__PURE__ */ React23.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React23.createElement(
|
|
6886
5852
|
"button",
|
|
6887
5853
|
{
|
|
6888
5854
|
onClick: handleBack,
|
|
6889
5855
|
className: "inline-flex items-center gap-2 text-slate-600 hover:text-slate-800 transition-colors"
|
|
6890
5856
|
},
|
|
6891
|
-
/* @__PURE__ */
|
|
5857
|
+
/* @__PURE__ */ React23.createElement(ArrowLeft, { size: 20 }),
|
|
6892
5858
|
"\u8FD4\u56DE\u67E5\u8BE2"
|
|
6893
|
-
)), /* @__PURE__ */
|
|
5859
|
+
)), /* @__PURE__ */ React23.createElement(
|
|
6894
5860
|
CartHistoryPage,
|
|
6895
5861
|
{
|
|
6896
5862
|
qqNumber: formData.qqNumber,
|
|
@@ -6900,5 +5866,5 @@ function UserHistoryPage() {
|
|
|
6900
5866
|
}
|
|
6901
5867
|
|
|
6902
5868
|
export { AddConfigItemDialog, AddToCartButton, ArtworkOrderManagerV2, ArtworkViewer, BOOKING_EXPORT_FIELDS, BookingAdminPanel, BookingModal, BookingPage, CartButton, CartHistoryPage, CartModal, CartPage, CollectionCard, CollectionList, CollectionOrderManagerV2, ConfigPage, DEFAULT_BOOKING_EXPORT_CONFIG, DeadlinePopup, DeadlinePopupManager, DeleteConfirmDialog, MobileAlbumViewer, PopupConfigManagement, ShowMasterPieces, SystemConfigManager, ThumbnailSidebar, UniversalImageUpload, UserHistoryPage, clearConfigCache, getArtworkImageUrl, getShowMasterpieceFileConfig, getStorageModeDisplayName, refreshFileServiceConfig, shouldUseUniversalFileService, uploadArtworkImage };
|
|
6903
|
-
//# sourceMappingURL=chunk-
|
|
6904
|
-
//# sourceMappingURL=chunk-
|
|
5869
|
+
//# sourceMappingURL=chunk-UTB72ZJ7.mjs.map
|
|
5870
|
+
//# sourceMappingURL=chunk-UTB72ZJ7.mjs.map
|