From 9deec9d23e960b0a48cfa68d608f35d9e2974edd Mon Sep 17 00:00:00 2001 From: SlavaVlad Date: Mon, 15 Jun 2026 00:04:15 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=B0=D0=BD=20=D0=B4=D0=B8=D0=B7=D0=B0=D0=B9=D0=BD?= =?UTF-8?q?,=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=84=D0=B8=D1=87=D0=B0=20SoundLibrary?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.pdf | Bin 0 -> 51562 bytes app/api/sounds/route.ts | 39 ++++++++ app/layout.tsx | 2 +- components/BingoCard.tsx | 191 +++++++++++++------------------------- components/BingoCell.tsx | 17 ++-- components/ItemEditor.tsx | 158 ++++++++++++++++++++++++------- 6 files changed, 240 insertions(+), 167 deletions(-) create mode 100644 README.pdf create mode 100644 app/api/sounds/route.ts diff --git a/README.pdf b/README.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c8a02acf928f7b44d5aa6743bd12a5c7c1f074e8 GIT binary patch literal 51562 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 f.endsWith(".ogg")) + .map(f => ({ filename: f, url: `/uploads/sounds/${f}` })) + .sort((a, b) => a.filename.localeCompare(b.filename)); + return NextResponse.json({ sounds }); + } catch { + return NextResponse.json({ sounds: [] }); + } +} + +export async function DELETE(req: NextRequest) { + const session = await getServerSession(); + if (!session || !session.isAdmin) { + return NextResponse.json({ error: "Forbidden" }, { status: 403 }); + } + const filename = req.nextUrl.searchParams.get("filename"); + if (!filename) return NextResponse.json({ error: "No filename" }, { status: 400 }); + try { + const filepath = path.join(SOUNDS_DIR, filename); + await unlink(filepath); + return NextResponse.json({ success: true }); + } catch { + return NextResponse.json({ error: "Delete failed" }, { status: 500 }); + } +} diff --git a/app/layout.tsx b/app/layout.tsx index 745c57b..6e9c860 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -18,7 +18,7 @@ export default function RootLayout({ children }: { children: React.ReactNode }) -
+
{children}
{/* Floating bubbles */} diff --git a/components/BingoCard.tsx b/components/BingoCard.tsx index ffd78e1..2b7c394 100644 --- a/components/BingoCard.tsx +++ b/components/BingoCard.tsx @@ -151,125 +151,92 @@ export function BingoCard({ campaign, initialGrid, currentUserNickname, isAdmin "from-red-600 to-red-500"; return ( -
+
{/* Header */}
-

+

{campaign.name}

-

+

{markedCount}/{totalItems} cells marked

- {/* Chaos Meter */} -
-
- {stageLabel} - {Math.round(chaosLevel * 100)}% chaos + {/* Chaos + Subs compact row */} +
+
+
+ {stageLabel} + {Math.round(chaosLevel * 100)}% chaos +
+
+
= 0.6 && "animate-pulse" + )} + style={{ width: `${chaosLevel * 100}%` }} + /> +
-
-
= 0.6 && "animate-pulse" - )} - style={{ width: `${chaosLevel * 100}%` }} - /> +
+
+ Hull {Math.round(hullHealth)}% +
+
120 ? "border-orange-800/50 text-orange-400" : "border-slate-700/30 text-slate-500")}> + R{Math.round(reactorTemp)}° +
+
+ O₂ {Math.round(o2Level)}% +
- {/* Sub Status + Grid Row */} -
- {/* Sub Status Panel */} -
-
-

Sub Status

-
-
-
- Hull - {Math.round(hullHealth)}% -
-
-
-
-
-
-
- Reactor - 120 ? "text-orange-400" : "text-slate-400")}>{Math.round(reactorTemp)}°C -
-
-
120 ? "bg-orange-500 animate-pulse" : "bg-cyan-500")} style={{ width: `${Math.min(reactorTemp / 2, 100)}%` }} /> -
-
-
-
- O₂ - {Math.round(o2Level)}% -
-
-
-
-
-
-
- {chaosLevel < 0.25 && "All systems nominal"} - {chaosLevel >= 0.25 && chaosLevel < 0.5 && "⚠️ Minor breaches detected"} - {chaosLevel >= 0.5 && chaosLevel < 0.75 && "🚨 EVACUATE! SUB COMPROMISED"} - {chaosLevel >= 0.75 && "☢️ MELTDOWN IN PROGRESS"} -
-
- - {/* Activity Log */} -
-

Crew Log

-
- {activityLog.length === 0 && ( -

Awaiting chaos...

- )} - {activityLog.map((entry, i) => ( -

{entry}

- ))} -
-
-
- - {/* Bingo Grid */} -
-
- {grid.map((cell) => ( - - ))} -
+ {/* Bingo Grid */} +
+
+ {grid.map((cell) => ( + + ))}
{/* Bingo Lines */} {bingoLines.length > 0 && ( -
- - 🏆 BINGO! {bingoLines.length} line(s) - -
+ + 🏆 BINGO! {bingoLines.length} line(s) + )} + {/* Activity Log */} +
+

Crew Log

+ {activityLog.length === 0 ? ( +

Awaiting chaos...

+ ) : ( +
+ {activityLog.map((entry, i) => ( +

{entry}

+ ))} +
+ )} +
+ {/* Bingo Celebration Modal */} {showBingo && (
setShowBingo(false)}> @@ -284,30 +251,6 @@ export function BingoCard({ campaign, initialGrid, currentUserNickname, isAdmin
)} - - {/* Mobile Activity Log */} -
-

Crew Log

-
- {activityLog.length === 0 && ( -

Awaiting chaos...

- )} - {activityLog.map((entry, i) => ( -

{entry}

- ))} -
-
- - {/* Legend */} -
- 🎺 horn - 🚨 alarm - 🌊 flood - 💥 boom - 👹 monster - 💀 death - 🔥 chaos -
); } diff --git a/components/BingoCell.tsx b/components/BingoCell.tsx index f50f6ef..a2651ff 100644 --- a/components/BingoCell.tsx +++ b/components/BingoCell.tsx @@ -56,8 +56,8 @@ export function BingoCell({ item, index, marked, markCount, markedBy, gridSize, return (
5 ? "p-1" : "p-2" + "text-slate-600", + gridSize > 5 ? "text-[10px] p-1" : "text-sm p-2" )}> ✖
@@ -76,7 +76,8 @@ export function BingoCell({ item, index, marked, markCount, markedBy, gridSize, className={cn( "relative flex flex-col items-center justify-center rounded-lg border transition-all duration-200 overflow-hidden", "select-none", - gridSize > 5 ? "p-1 gap-0" : "p-2 gap-1", + "aspect-square", + gridSize > 5 ? "p-1 gap-0" : "p-2 gap-0.5", marked ? "border-cyan-500/60 bg-cyan-900/40 hover:bg-cyan-800/40 cursor-pointer" : "border-slate-700/40 bg-slate-800/40 hover:bg-slate-700/40 hover:border-cyan-600/40 hover:shadow-lg hover:shadow-cyan-900/20 cursor-pointer active:scale-95", @@ -87,12 +88,12 @@ export function BingoCell({ item, index, marked, markCount, markedBy, gridSize, )} title={markedBy.length > 0 ? `Marked by: ${markedBy.join(", ")}` : item.text} > - 5 ? "text-lg" : "text-2xl", "leading-none")}> + 5 ? "text-2xl" : "text-3xl")}> {item.emoji || "💀"} 5 ? "text-[10px]" : "text-xs", + gridSize > 5 ? "text-xs" : "text-sm", "line-clamp-2" )}> {item.text} @@ -106,13 +107,13 @@ export function BingoCell({ item, index, marked, markCount, markedBy, gridSize, )} {marked && ( - + )} {!marked && !isFree && ( - {getSoundEmoji(item.soundCategory)} + {getSoundEmoji(item.soundCategory)} )} {isFree && !marked && ( - 5 ? "hidden" : "")}> + 🎯 mark me )} diff --git a/components/ItemEditor.tsx b/components/ItemEditor.tsx index d4e56d2..01f61ca 100644 --- a/components/ItemEditor.tsx +++ b/components/ItemEditor.tsx @@ -23,6 +23,11 @@ type Campaign = { gridSize: number; }; +type LibrarySound = { + filename: string; + url: string; +}; + function EmojiPicker({ value, onChange }: { value: string; onChange: (v: string) => void }) { const [open, setOpen] = useState(false); const ref = useRef(null); @@ -73,6 +78,8 @@ export function ItemEditor({ campaign }: { campaign: Campaign }) { const [editSound, setEditSound] = useState("horn"); const [editSoundUrl, setEditSoundUrl] = useState(null); const [uploading, setUploading] = useState(false); + const [librarySounds, setLibrarySounds] = useState([]); + const [showLibrary, setShowLibrary] = useState(false); const fileInputRef = useRef(null); const formRef = useRef(null); @@ -86,6 +93,16 @@ export function ItemEditor({ campaign }: { campaign: Campaign }) { useEffect(() => { fetchItems(); }, [campaign.id]); + const fetchLibrary = async () => { + const res = await fetch("/api/sounds"); + const data = await res.json(); + setLibrarySounds(data.sounds || []); + }; + + useEffect(() => { + if (editSound === "custom") fetchLibrary(); + }, [editSound]); + const updateItem = async (item: Item) => { await fetch(`/api/campaigns/${campaign.id}/items`, { method: "PUT", @@ -176,6 +193,15 @@ export function ItemEditor({ campaign }: { campaign: Campaign }) { const data = await res.json(); if (data.url) setEditSoundUrl(data.url); setUploading(false); + fetchLibrary(); + }; + + const deleteSound = async (filename: string) => { + await fetch(`/api/sounds?filename=${encodeURIComponent(filename)}`, { method: "DELETE" }); + if (librarySounds.find(s => s.filename === filename)?.url === editSoundUrl) { + setEditSoundUrl(null); + } + fetchLibrary(); }; const playSoundOnce = (url: string) => { @@ -233,42 +259,108 @@ export function ItemEditor({ campaign }: { campaign: Campaign }) {
- {editSound === "custom" && ( -
- -
- { const f = e.target.files?.[0]; if (f) uploadSound(f); }} - /> - - {editSoundUrl && ( - - )} -
-
- )}
+ + {editSound === "custom" && ( +
+
+ { const f = e.target.files?.[0]; if (f) uploadSound(f); }} + /> + + {editSoundUrl && ( +
+ ✓ sound loaded + + +
+ )} +
+ +
+ +
+ + {showLibrary && librarySounds.length > 0 && ( +
+ {librarySounds.map(s => { + const isSelected = editSoundUrl === s.url; + return ( +
+ {s.filename} + + + +
+ ); + })} +
+ )} + + {showLibrary && librarySounds.length === 0 && ( +

No uploaded sounds yet. Upload an OGG file above.

+ )} +
+ )}
@@ -369,5 +461,3 @@ export function ItemEditor({ campaign }: { campaign: Campaign }) {
); } - -