react-os-shell 0.1.48 → 0.1.49
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/{Browser-B3XVP6HC.js → Browser-34KKFXNU.js} +3 -3
- package/dist/{Browser-B3XVP6HC.js.map → Browser-34KKFXNU.js.map} +1 -1
- package/dist/{Calculator-HJKPXY2B.js → Calculator-LJMNOIS6.js} +4 -4
- package/dist/{Calculator-HJKPXY2B.js.map → Calculator-LJMNOIS6.js.map} +1 -1
- package/dist/{Calendar-GCQIWTU3.js → Calendar-UIF62GMX.js} +3 -3
- package/dist/{Calendar-GCQIWTU3.js.map → Calendar-UIF62GMX.js.map} +1 -1
- package/dist/{CurrencyConverter-FYF4JLKZ.js → CurrencyConverter-HFPJAIPX.js} +4 -4
- package/dist/{CurrencyConverter-FYF4JLKZ.js.map → CurrencyConverter-HFPJAIPX.js.map} +1 -1
- package/dist/{Documents-NTWVLYXJ.js → Documents-3UPQ5QTF.js} +3 -3
- package/dist/{Documents-NTWVLYXJ.js.map → Documents-3UPQ5QTF.js.map} +1 -1
- package/dist/{Email-3B63P7ML.js → Email-YPLU6HJL.js} +3 -3
- package/dist/{Email-3B63P7ML.js.map → Email-YPLU6HJL.js.map} +1 -1
- package/dist/{Files-JYXO4AXI.js → Files-IT4B7PP4.js} +174 -40
- package/dist/Files-IT4B7PP4.js.map +1 -0
- package/dist/{Minesweeper-MAA4NIV4.js → Minesweeper-UUHQCDAC.js} +3 -3
- package/dist/{Minesweeper-MAA4NIV4.js.map → Minesweeper-UUHQCDAC.js.map} +1 -1
- package/dist/{Notepad-2K6HQ2WA.js → Notepad-MSHSUSMG.js} +3 -3
- package/dist/{Notepad-2K6HQ2WA.js.map → Notepad-MSHSUSMG.js.map} +1 -1
- package/dist/{PomodoroTimer-IJUONN6I.js → PomodoroTimer-4ZYITLNH.js} +4 -4
- package/dist/{PomodoroTimer-IJUONN6I.js.map → PomodoroTimer-4ZYITLNH.js.map} +1 -1
- package/dist/Preview-IEPHQIJE.js +6 -0
- package/dist/{Preview-SEQ5NHLQ.js.map → Preview-IEPHQIJE.js.map} +1 -1
- package/dist/{Spreadsheet-W7F6IMTJ.js → Spreadsheet-QIBLYKVF.js} +3 -3
- package/dist/{Spreadsheet-W7F6IMTJ.js.map → Spreadsheet-QIBLYKVF.js.map} +1 -1
- package/dist/{Weather-MDTM6OEL.js → Weather-ZJE7DNKB.js} +4 -4
- package/dist/{Weather-MDTM6OEL.js.map → Weather-ZJE7DNKB.js.map} +1 -1
- package/dist/apps/index.js +15 -15
- package/dist/{chunk-UD2TKHR2.js → chunk-53CE7OVT.js} +129 -6
- package/dist/chunk-53CE7OVT.js.map +1 -0
- package/dist/{chunk-VEEO4U4E.js → chunk-K6COBRQA.js} +3 -3
- package/dist/{chunk-VEEO4U4E.js.map → chunk-K6COBRQA.js.map} +1 -1
- package/dist/{chunk-IMHD23FR.js → chunk-OZFHOQYG.js} +3 -3
- package/dist/{chunk-IMHD23FR.js.map → chunk-OZFHOQYG.js.map} +1 -1
- package/dist/index.js +4 -4
- package/package.json +1 -1
- package/dist/Files-JYXO4AXI.js.map +0 -1
- package/dist/Preview-SEQ5NHLQ.js +0 -6
- package/dist/chunk-UD2TKHR2.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { setPdfPreview } from './chunk-
|
|
1
|
+
import { setPdfPreview } from './chunk-K6COBRQA.js';
|
|
2
2
|
import { toast_default } from './chunk-WIJ45SYD.js';
|
|
3
|
-
import { useWindowManager, WindowTitle } from './chunk-
|
|
4
|
-
import {
|
|
3
|
+
import { useWindowManager, WindowTitle } from './chunk-53CE7OVT.js';
|
|
4
|
+
import { confirm, prompt } from './chunk-PLGHQ7QW.js';
|
|
5
5
|
import { useState, useRef, useCallback, useEffect } from 'react';
|
|
6
6
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
7
7
|
|
|
@@ -66,6 +66,8 @@ function Files() {
|
|
|
66
66
|
const [unreachable, setUnreachable] = useState(false);
|
|
67
67
|
const [quota, setQuota] = useState(null);
|
|
68
68
|
const [isDragging, setIsDragging] = useState(false);
|
|
69
|
+
const [view, setView] = useState("files");
|
|
70
|
+
const [trash, setTrash] = useState([]);
|
|
69
71
|
const dragDepthRef = useRef(0);
|
|
70
72
|
const fileRef = useRef(null);
|
|
71
73
|
const { openPage } = useWindowManager();
|
|
@@ -111,9 +113,79 @@ function Files() {
|
|
|
111
113
|
}
|
|
112
114
|
refreshQuota();
|
|
113
115
|
}, [authedFetch, server, refreshQuota]);
|
|
116
|
+
const loadTrash = useCallback(async () => {
|
|
117
|
+
setLoading(true);
|
|
118
|
+
setSelected(null);
|
|
119
|
+
try {
|
|
120
|
+
const res = await authedFetch(`${server}/api/trash`);
|
|
121
|
+
if (!res.ok) {
|
|
122
|
+
const msg = await res.json().catch(() => ({}));
|
|
123
|
+
toast_default.error(msg.error || `Failed to list trash (${res.status})`);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const data = await res.json();
|
|
127
|
+
setTrash(data.entries || []);
|
|
128
|
+
setUnreachable(false);
|
|
129
|
+
} catch {
|
|
130
|
+
setUnreachable(true);
|
|
131
|
+
} finally {
|
|
132
|
+
setLoading(false);
|
|
133
|
+
}
|
|
134
|
+
refreshQuota();
|
|
135
|
+
}, [authedFetch, server, refreshQuota]);
|
|
114
136
|
useEffect(() => {
|
|
115
|
-
loadDir(path);
|
|
116
|
-
|
|
137
|
+
if (view === "files") loadDir(path);
|
|
138
|
+
else loadTrash();
|
|
139
|
+
}, [path, view]);
|
|
140
|
+
const handleRestore = async (entry) => {
|
|
141
|
+
const res = await authedFetch(`${server}/api/trash/restore`, {
|
|
142
|
+
method: "POST",
|
|
143
|
+
headers: { "Content-Type": "application/json" },
|
|
144
|
+
body: JSON.stringify({ id: entry.id })
|
|
145
|
+
});
|
|
146
|
+
if (!res.ok) {
|
|
147
|
+
const msg = await res.json().catch(() => ({}));
|
|
148
|
+
toast_default.error(msg.error || `Restore failed (${res.status})`);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
toast_default.success(`Restored "${entry.name}"`);
|
|
152
|
+
loadTrash();
|
|
153
|
+
};
|
|
154
|
+
const handleTrashPermanentDelete = async (entry) => {
|
|
155
|
+
const ok = await confirm({
|
|
156
|
+
title: "Permanently delete",
|
|
157
|
+
message: `"${entry.name}" will be permanently removed. This can't be undone.`,
|
|
158
|
+
confirmLabel: "Delete forever",
|
|
159
|
+
variant: "danger"
|
|
160
|
+
});
|
|
161
|
+
if (!ok) return;
|
|
162
|
+
const res = await authedFetch(`${server}/api/trash/${encodeURIComponent(entry.id)}`, {
|
|
163
|
+
method: "DELETE"
|
|
164
|
+
});
|
|
165
|
+
if (!res.ok) {
|
|
166
|
+
const msg = await res.json().catch(() => ({}));
|
|
167
|
+
toast_default.error(msg.error || `Delete failed (${res.status})`);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
loadTrash();
|
|
171
|
+
};
|
|
172
|
+
const handleEmptyTrash = async () => {
|
|
173
|
+
if (trash.length === 0) return;
|
|
174
|
+
const ok = await confirm({
|
|
175
|
+
title: "Empty trash",
|
|
176
|
+
message: `${trash.length} item${trash.length === 1 ? "" : "s"} will be permanently removed. This can't be undone.`,
|
|
177
|
+
confirmLabel: "Empty trash",
|
|
178
|
+
variant: "danger"
|
|
179
|
+
});
|
|
180
|
+
if (!ok) return;
|
|
181
|
+
const res = await authedFetch(`${server}/api/trash`, { method: "DELETE" });
|
|
182
|
+
if (!res.ok) {
|
|
183
|
+
const msg = await res.json().catch(() => ({}));
|
|
184
|
+
toast_default.error(msg.error || `Empty trash failed (${res.status})`);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
loadTrash();
|
|
188
|
+
};
|
|
117
189
|
const openFile = async (entry) => {
|
|
118
190
|
const fullPath = joinPath(path, entry.name);
|
|
119
191
|
const ext = (entry.name.split(".").pop() || "").toLowerCase();
|
|
@@ -331,38 +403,65 @@ function Files() {
|
|
|
331
403
|
}
|
|
332
404
|
),
|
|
333
405
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 px-2 py-1.5 border-b border-gray-200 bg-gray-50 shrink-0 text-xs", children: [
|
|
334
|
-
/* @__PURE__ */
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
/* @__PURE__ */
|
|
346
|
-
|
|
347
|
-
/* @__PURE__ */
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
/* @__PURE__ */
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
/* @__PURE__ */
|
|
365
|
-
|
|
406
|
+
view === "files" ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
407
|
+
/* @__PURE__ */ jsx(
|
|
408
|
+
"button",
|
|
409
|
+
{
|
|
410
|
+
onClick: () => setPath(parentOf(path)),
|
|
411
|
+
disabled: path === "/",
|
|
412
|
+
className: "px-2 py-1 rounded hover:bg-gray-200 disabled:opacity-30 text-gray-600",
|
|
413
|
+
title: "Parent folder",
|
|
414
|
+
children: /* @__PURE__ */ jsx("svg", { className: "h-3.5 w-3.5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M10.5 19.5L3 12m0 0l7.5-7.5M3 12h18" }) })
|
|
415
|
+
}
|
|
416
|
+
),
|
|
417
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1 flex items-center gap-0.5 text-gray-700 truncate min-w-0", children: [
|
|
418
|
+
/* @__PURE__ */ jsx("button", { onClick: () => setPath("/"), className: "px-1.5 py-0.5 rounded hover:bg-gray-200 font-medium", children: "My files" }),
|
|
419
|
+
segments.map((seg, i) => /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-0.5", children: [
|
|
420
|
+
/* @__PURE__ */ jsx("span", { className: "text-gray-400", children: "/" }),
|
|
421
|
+
/* @__PURE__ */ jsx(
|
|
422
|
+
"button",
|
|
423
|
+
{
|
|
424
|
+
onClick: () => setPath("/" + segments.slice(0, i + 1).join("/")),
|
|
425
|
+
className: "px-1.5 py-0.5 rounded hover:bg-gray-200",
|
|
426
|
+
children: seg
|
|
427
|
+
}
|
|
428
|
+
)
|
|
429
|
+
] }, i))
|
|
430
|
+
] }),
|
|
431
|
+
/* @__PURE__ */ jsx("button", { onClick: () => loadDir(path), className: "px-2 py-1 rounded hover:bg-gray-200 text-gray-600", title: "Refresh", children: /* @__PURE__ */ jsx("svg", { className: "h-3.5 w-3.5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M16.023 9.348h4.992V4.356M2.985 19.644v-4.992h4.992M3.05 9.348a9 9 0 0114.85-3.36L21.015 9.348m0 5.304a9 9 0 01-14.85 3.36l-3.115-3.36" }) }) }),
|
|
432
|
+
/* @__PURE__ */ jsxs("button", { onClick: () => setView("trash"), className: "px-2 py-1 rounded hover:bg-gray-200 text-gray-600 flex items-center gap-1", title: "Open trash", children: [
|
|
433
|
+
/* @__PURE__ */ jsx("svg", { className: "h-3.5 w-3.5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0" }) }),
|
|
434
|
+
"Trash"
|
|
435
|
+
] }),
|
|
436
|
+
/* @__PURE__ */ jsxs("button", { onClick: handleNewFolder, className: "px-2 py-1 rounded hover:bg-gray-200 text-gray-600 flex items-center gap-1", children: [
|
|
437
|
+
/* @__PURE__ */ jsx("svg", { className: "h-3.5 w-3.5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 10.5v6m3-3H9m4.06-7.19l-2.12-2.12a1.5 1.5 0 00-1.061-.44H4.5A2.25 2.25 0 002.25 6v12a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9a2.25 2.25 0 00-2.25-2.25h-5.379a1.5 1.5 0 01-1.06-.44z" }) }),
|
|
438
|
+
"New Folder"
|
|
439
|
+
] }),
|
|
440
|
+
/* @__PURE__ */ jsxs("button", { onClick: handlePick, className: "px-2 py-1 rounded bg-blue-500 text-white hover:bg-blue-600 flex items-center gap-1", children: [
|
|
441
|
+
/* @__PURE__ */ jsx("svg", { className: "h-3.5 w-3.5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M7.5 7.5L12 3m0 0l4.5 4.5M12 3v13.5" }) }),
|
|
442
|
+
"Upload"
|
|
443
|
+
] })
|
|
444
|
+
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
445
|
+
/* @__PURE__ */ jsx(
|
|
446
|
+
"button",
|
|
447
|
+
{
|
|
448
|
+
onClick: () => setView("files"),
|
|
449
|
+
className: "px-2 py-1 rounded hover:bg-gray-200 text-gray-600",
|
|
450
|
+
title: "Back to files",
|
|
451
|
+
children: /* @__PURE__ */ jsx("svg", { className: "h-3.5 w-3.5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M10.5 19.5L3 12m0 0l7.5-7.5M3 12h18" }) })
|
|
452
|
+
}
|
|
453
|
+
),
|
|
454
|
+
/* @__PURE__ */ jsx("span", { className: "flex-1 text-gray-700 font-medium px-2", children: "Trash" }),
|
|
455
|
+
/* @__PURE__ */ jsx("button", { onClick: loadTrash, className: "px-2 py-1 rounded hover:bg-gray-200 text-gray-600", title: "Refresh", children: /* @__PURE__ */ jsx("svg", { className: "h-3.5 w-3.5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.8, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M16.023 9.348h4.992V4.356M2.985 19.644v-4.992h4.992M3.05 9.348a9 9 0 0114.85-3.36L21.015 9.348m0 5.304a9 9 0 01-14.85 3.36l-3.115-3.36" }) }) }),
|
|
456
|
+
/* @__PURE__ */ jsx(
|
|
457
|
+
"button",
|
|
458
|
+
{
|
|
459
|
+
onClick: handleEmptyTrash,
|
|
460
|
+
disabled: trash.length === 0,
|
|
461
|
+
className: "px-2 py-1 rounded text-red-600 hover:bg-red-50 disabled:opacity-30 flex items-center gap-1",
|
|
462
|
+
children: "Empty trash"
|
|
463
|
+
}
|
|
464
|
+
)
|
|
366
465
|
] }),
|
|
367
466
|
quota && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
368
467
|
/* @__PURE__ */ jsx("div", { className: "h-4 w-px bg-gray-300 mx-1" }),
|
|
@@ -382,7 +481,42 @@ function Files() {
|
|
|
382
481
|
] })
|
|
383
482
|
] })
|
|
384
483
|
] }),
|
|
385
|
-
/* @__PURE__ */ jsx("div", { className: "flex-1 overflow-auto", children: loading &&
|
|
484
|
+
/* @__PURE__ */ jsx("div", { className: "flex-1 overflow-auto", children: view === "trash" ? loading && trash.length === 0 ? /* @__PURE__ */ jsx("div", { className: "p-6 text-center text-sm text-gray-400", children: "Loading\u2026" }) : trash.length === 0 ? /* @__PURE__ */ jsx("div", { className: "p-10 text-center text-sm text-gray-400", children: "Trash is empty." }) : /* @__PURE__ */ jsxs("table", { className: "w-full text-sm", children: [
|
|
485
|
+
/* @__PURE__ */ jsx("thead", { className: "bg-gray-50 text-[11px] uppercase tracking-wide text-gray-500", children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
486
|
+
/* @__PURE__ */ jsx("th", { className: "text-left font-medium px-3 py-1.5", children: "Name" }),
|
|
487
|
+
/* @__PURE__ */ jsx("th", { className: "text-left font-medium px-3 py-1.5", children: "Original location" }),
|
|
488
|
+
/* @__PURE__ */ jsx("th", { className: "text-right font-medium px-3 py-1.5 w-24", children: "Size" }),
|
|
489
|
+
/* @__PURE__ */ jsx("th", { className: "text-right font-medium px-3 py-1.5 w-40", children: "Deleted" }),
|
|
490
|
+
/* @__PURE__ */ jsx("th", { className: "w-44" })
|
|
491
|
+
] }) }),
|
|
492
|
+
/* @__PURE__ */ jsx("tbody", { children: trash.map((e) => /* @__PURE__ */ jsxs("tr", { className: "border-b border-gray-100 hover:bg-gray-50", children: [
|
|
493
|
+
/* @__PURE__ */ jsxs("td", { className: "px-3 py-1.5 flex items-center gap-2", children: [
|
|
494
|
+
e.kind === "folder" ? /* @__PURE__ */ jsx("svg", { className: "h-4 w-4 text-amber-500 shrink-0", fill: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { d: "M2.25 7.125A2.25 2.25 0 014.5 4.875h4.504c.61 0 1.193.243 1.624.673l1.494 1.494a.75.75 0 00.53.22h7.098A2.25 2.25 0 0122 9.51v8.366A2.25 2.25 0 0119.75 20.125H4.25A2.25 2.25 0 012 17.875V7.125z" }) }) : /* @__PURE__ */ jsx("svg", { className: "h-4 w-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z" }) }),
|
|
495
|
+
/* @__PURE__ */ jsx("span", { className: "truncate", title: e.name, children: e.name })
|
|
496
|
+
] }),
|
|
497
|
+
/* @__PURE__ */ jsx("td", { className: "px-3 py-1.5 text-gray-500 text-xs font-mono truncate", title: e.originalPath, children: e.originalPath || "\u2014" }),
|
|
498
|
+
/* @__PURE__ */ jsx("td", { className: "px-3 py-1.5 text-right tabular-nums text-gray-500", children: formatSize(e.size) }),
|
|
499
|
+
/* @__PURE__ */ jsx("td", { className: "px-3 py-1.5 text-right text-gray-500 tabular-nums", children: e.deletedAt ? formatTime(e.deletedAt) : "\u2014" }),
|
|
500
|
+
/* @__PURE__ */ jsxs("td", { className: "px-3 py-1.5 text-right whitespace-nowrap", children: [
|
|
501
|
+
/* @__PURE__ */ jsx(
|
|
502
|
+
"button",
|
|
503
|
+
{
|
|
504
|
+
onClick: () => handleRestore(e),
|
|
505
|
+
className: "px-1.5 py-0.5 rounded hover:bg-gray-200 text-blue-600 text-[11px]",
|
|
506
|
+
children: "Restore"
|
|
507
|
+
}
|
|
508
|
+
),
|
|
509
|
+
/* @__PURE__ */ jsx(
|
|
510
|
+
"button",
|
|
511
|
+
{
|
|
512
|
+
onClick: () => handleTrashPermanentDelete(e),
|
|
513
|
+
className: "px-1.5 py-0.5 rounded hover:bg-red-100 text-red-600 text-[11px] ml-1",
|
|
514
|
+
children: "Delete forever"
|
|
515
|
+
}
|
|
516
|
+
)
|
|
517
|
+
] })
|
|
518
|
+
] }, e.id)) })
|
|
519
|
+
] }) : loading && entries.length === 0 ? /* @__PURE__ */ jsx("div", { className: "p-6 text-center text-sm text-gray-400", children: "Loading\u2026" }) : entries.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "p-10 text-center text-sm text-gray-400", children: [
|
|
386
520
|
"Empty folder. Drop files here or click ",
|
|
387
521
|
/* @__PURE__ */ jsx("span", { className: "font-medium", children: "Upload" }),
|
|
388
522
|
"."
|
|
@@ -456,5 +590,5 @@ function Files() {
|
|
|
456
590
|
}
|
|
457
591
|
|
|
458
592
|
export { Files as default };
|
|
459
|
-
//# sourceMappingURL=Files-
|
|
460
|
-
//# sourceMappingURL=Files-
|
|
593
|
+
//# sourceMappingURL=Files-IT4B7PP4.js.map
|
|
594
|
+
//# sourceMappingURL=Files-IT4B7PP4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/apps/Files.tsx"],"names":[],"mappings":"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","file":"Files-IT4B7PP4.js","sourcesContent":["/**\n * Files — browser for the per-user file-server (see examples/file-server).\n *\n * Identity is a cookie the server sets on first visit; no login screen.\n * Every fetch carries `credentials: 'include'` so the cookie travels with\n * cross-origin requests. Toolbar shows a live \"X.X / Y MB used\" indicator\n * driven by `/api/quota`. Supported file types open straight into Preview;\n * everything else downloads.\n *\n * Server URL defaults to `http://localhost:4000`. Override at runtime via\n * `window.__REACT_OS_SHELL_FILE_SERVER__ = 'https://files.example.com'`.\n */\nimport { useState, useEffect, useRef, useCallback } from 'react';\nimport { WindowTitle } from '../shell/Modal';\nimport { useWindowManager } from '../shell/WindowManager';\nimport toast from '../shell/toast';\nimport { confirm, prompt } from '../shell/ConfirmDialog';\nimport { setPdfPreview } from './Preview';\n\nconst DEFAULT_SERVER =\n (typeof window !== 'undefined' && (window as any).__REACT_OS_SHELL_FILE_SERVER__) ||\n 'http://localhost:4000';\n\nconst PREVIEW_EXTS: Record<string, 'pdf' | 'image' | 'dxf' | '3d'> = {\n pdf: 'pdf',\n dxf: 'dxf',\n jpg: 'image', jpeg: 'image', png: 'image', gif: 'image',\n webp: 'image', svg: 'image', avif: 'image', bmp: 'image',\n stp: '3d', step: '3d', stl: '3d', obj: '3d',\n gltf: '3d', glb: '3d', '3mf': '3d', iges: '3d', igs: '3d', ply: '3d', fbx: '3d',\n};\n\ninterface FileEntry {\n name: string;\n kind: 'file' | 'folder';\n size: number;\n modifiedAt: string;\n}\n\ninterface TrashEntry {\n id: string;\n name: string;\n originalPath: string;\n deletedAt: string | null;\n kind: 'file' | 'folder';\n size: number;\n}\n\nfunction joinPath(parent: string, name: string) {\n if (parent === '/' || parent === '') return '/' + name;\n return parent.replace(/\\/$/, '') + '/' + name;\n}\n\nfunction parentOf(p: string) {\n if (p === '/' || p === '') return '/';\n const trimmed = p.replace(/\\/$/, '');\n const idx = trimmed.lastIndexOf('/');\n return idx <= 0 ? '/' : trimmed.slice(0, idx);\n}\n\nfunction formatSize(bytes: number) {\n if (!bytes) return '—';\n const units = ['B', 'KB', 'MB', 'GB'];\n let v = bytes, i = 0;\n while (v >= 1024 && i < units.length - 1) { v /= 1024; i++; }\n return `${v < 10 ? v.toFixed(1) : Math.round(v)} ${units[i]}`;\n}\n\nfunction formatTime(iso: string) {\n try {\n const d = new Date(iso);\n return d.toLocaleString(undefined, { dateStyle: 'short', timeStyle: 'short' });\n } catch { return iso; }\n}\n\nexport default function Files() {\n const server = DEFAULT_SERVER.replace(/\\/$/, '');\n const [path, setPath] = useState('/');\n const [entries, setEntries] = useState<FileEntry[]>([]);\n const [selected, setSelected] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [unreachable, setUnreachable] = useState(false);\n const [quota, setQuota] = useState<{ used: number; limit: number } | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [view, setView] = useState<'files' | 'trash'>('files');\n const [trash, setTrash] = useState<TrashEntry[]>([]);\n const dragDepthRef = useRef(0);\n const fileRef = useRef<HTMLInputElement>(null);\n\n const { openPage } = useWindowManager();\n\n const authedFetch = useCallback(\n (url: string, init: RequestInit = {}) =>\n // `credentials: 'include'` makes the browser send the identity\n // cookie with every cross-origin request, and accept any\n // Set-Cookie response (e.g. the first-visit assignment).\n fetch(url, { ...init, credentials: 'include' }),\n [],\n );\n\n const refreshQuota = useCallback(async () => {\n try {\n const res = await authedFetch(`${server}/api/quota`);\n if (res.ok) {\n const q = await res.json();\n setQuota({ used: q.used, limit: q.limit });\n }\n } catch {}\n }, [authedFetch, server]);\n\n const loadDir = useCallback(async (dir: string) => {\n setLoading(true);\n setSelected(null);\n try {\n const res = await authedFetch(\n `${server}/api/files?path=${encodeURIComponent(dir)}`,\n );\n if (!res.ok) {\n const msg = await res.json().catch(() => ({} as any));\n toast.error(msg.error || `Failed to list (${res.status})`);\n return;\n }\n const data = await res.json();\n setEntries(data.entries || []);\n setPath(data.path || dir);\n setUnreachable(false);\n } catch (e: any) {\n setUnreachable(true);\n } finally {\n setLoading(false);\n }\n refreshQuota();\n }, [authedFetch, server, refreshQuota]);\n\n const loadTrash = useCallback(async () => {\n setLoading(true);\n setSelected(null);\n try {\n const res = await authedFetch(`${server}/api/trash`);\n if (!res.ok) {\n const msg = await res.json().catch(() => ({} as any));\n toast.error(msg.error || `Failed to list trash (${res.status})`);\n return;\n }\n const data = await res.json();\n setTrash(data.entries || []);\n setUnreachable(false);\n } catch {\n setUnreachable(true);\n } finally {\n setLoading(false);\n }\n refreshQuota();\n }, [authedFetch, server, refreshQuota]);\n\n useEffect(() => {\n if (view === 'files') loadDir(path);\n else loadTrash();\n /* eslint-disable-next-line */\n }, [path, view]);\n\n const handleRestore = async (entry: TrashEntry) => {\n const res = await authedFetch(`${server}/api/trash/restore`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ id: entry.id }),\n });\n if (!res.ok) {\n const msg = await res.json().catch(() => ({} as any));\n toast.error(msg.error || `Restore failed (${res.status})`);\n return;\n }\n toast.success(`Restored \"${entry.name}\"`);\n loadTrash();\n };\n\n const handleTrashPermanentDelete = async (entry: TrashEntry) => {\n const ok = await confirm({\n title: 'Permanently delete',\n message: `\"${entry.name}\" will be permanently removed. This can't be undone.`,\n confirmLabel: 'Delete forever',\n variant: 'danger',\n });\n if (!ok) return;\n const res = await authedFetch(`${server}/api/trash/${encodeURIComponent(entry.id)}`, {\n method: 'DELETE',\n });\n if (!res.ok) {\n const msg = await res.json().catch(() => ({} as any));\n toast.error(msg.error || `Delete failed (${res.status})`);\n return;\n }\n loadTrash();\n };\n\n const handleEmptyTrash = async () => {\n if (trash.length === 0) return;\n const ok = await confirm({\n title: 'Empty trash',\n message: `${trash.length} item${trash.length === 1 ? '' : 's'} will be permanently removed. This can't be undone.`,\n confirmLabel: 'Empty trash',\n variant: 'danger',\n });\n if (!ok) return;\n const res = await authedFetch(`${server}/api/trash`, { method: 'DELETE' });\n if (!res.ok) {\n const msg = await res.json().catch(() => ({} as any));\n toast.error(msg.error || `Empty trash failed (${res.status})`);\n return;\n }\n loadTrash();\n };\n\n // Open a file: fetch as Blob, route to Preview if extension is supported.\n const openFile = async (entry: FileEntry) => {\n const fullPath = joinPath(path, entry.name);\n const ext = (entry.name.split('.').pop() || '').toLowerCase();\n const kind = PREVIEW_EXTS[ext];\n if (!kind) {\n downloadFile(entry);\n return;\n }\n try {\n const res = await authedFetch(\n `${server}/api/file?path=${encodeURIComponent(fullPath)}`,\n );\n if (!res.ok) { toast.error(`Download failed (${res.status})`); return; }\n const blob = await res.blob();\n const url = URL.createObjectURL(blob);\n setPdfPreview({ url, filename: entry.name, kind });\n openPage('/preview');\n } catch (e: any) {\n toast.error(e?.message || 'Open failed');\n }\n };\n\n const downloadFile = async (entry: FileEntry) => {\n const fullPath = joinPath(path, entry.name);\n try {\n const res = await authedFetch(\n `${server}/api/file?path=${encodeURIComponent(fullPath)}`,\n );\n if (!res.ok) { toast.error(`Download failed (${res.status})`); return; }\n const blob = await res.blob();\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = entry.name;\n a.click();\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n } catch (e: any) {\n toast.error(e?.message || 'Download failed');\n }\n };\n\n const handlePick = () => fileRef.current?.click();\n\n const uploadFiles = async (files: FileList | File[]) => {\n const arr = Array.from(files);\n for (const file of arr) {\n const form = new FormData();\n form.append('file', file);\n try {\n const res = await authedFetch(\n `${server}/api/upload?path=${encodeURIComponent(path)}`,\n { method: 'POST', body: form },\n );\n if (!res.ok) {\n const msg = await res.json().catch(() => ({} as any));\n if (res.status === 413) {\n const remaining = Math.max(0, (msg.limit || 0) - (msg.used || 0));\n toast.error(\n `Quota exceeded — ${formatSize(remaining)} free, ${file.name} is ${formatSize(msg.attempted || file.size)}`,\n );\n } else {\n toast.error(`Upload ${file.name}: ${msg.error || res.status}`);\n }\n }\n } catch (e: any) {\n toast.error(`Upload ${file.name}: ${e?.message || 'failed'}`);\n }\n }\n loadDir(path);\n };\n\n const handleNewFolder = async () => {\n const name = await prompt({\n title: 'New folder',\n placeholder: 'Folder name',\n confirmLabel: 'Create',\n });\n if (!name) return;\n if (/[\\\\/]/.test(name)) { toast.error('Folder names cannot contain slashes'); return; }\n const target = joinPath(path, name);\n const res = await authedFetch(`${server}/api/folder`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path: target }),\n });\n if (!res.ok) {\n const msg = await res.json().catch(() => ({} as any));\n toast.error(msg.error || `Create folder failed (${res.status})`);\n return;\n }\n loadDir(path);\n };\n\n const handleRename = async (entry: FileEntry) => {\n const next = await prompt({\n title: `Rename ${entry.kind}`,\n defaultValue: entry.name,\n confirmLabel: 'Rename',\n });\n if (!next || next === entry.name) return;\n if (/[\\\\/]/.test(next)) { toast.error('Names cannot contain slashes'); return; }\n const from = joinPath(path, entry.name);\n const to = joinPath(path, next);\n const res = await authedFetch(`${server}/api/rename`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ from, to }),\n });\n if (!res.ok) {\n const msg = await res.json().catch(() => ({} as any));\n toast.error(msg.error || `Rename failed (${res.status})`);\n return;\n }\n loadDir(path);\n };\n\n const handleDelete = async (entry: FileEntry) => {\n const ok = await confirm({\n title: `Delete ${entry.kind}`,\n message: `\"${entry.name}\"${entry.kind === 'folder' ? ' and everything inside' : ''} will be permanently removed.`,\n confirmLabel: 'Delete',\n variant: 'danger',\n });\n if (!ok) return;\n const target = joinPath(path, entry.name);\n const res = await authedFetch(\n `${server}/api/files?path=${encodeURIComponent(target)}`,\n { method: 'DELETE' },\n );\n if (!res.ok) {\n const msg = await res.json().catch(() => ({} as any));\n toast.error(msg.error || `Delete failed (${res.status})`);\n return;\n }\n loadDir(path);\n };\n\n const resetDrag = () => { dragDepthRef.current = 0; setIsDragging(false); };\n useEffect(() => {\n const reset = () => resetDrag();\n window.addEventListener('dragend', reset);\n window.addEventListener('drop', reset);\n return () => {\n window.removeEventListener('dragend', reset);\n window.removeEventListener('drop', reset);\n };\n }, []);\n\n // ── render ─────────────────────────────────────────────────────────────\n if (unreachable) {\n return (\n <div className=\"flex flex-col h-full bg-white\">\n <WindowTitle title=\"Files - offline\" />\n <div className=\"flex-1 flex items-center justify-center p-8 text-center\">\n <div className=\"max-w-md\">\n <svg className=\"h-12 w-12 mx-auto text-gray-300 mb-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.4}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M18.364 5.636l-12.728 12.728M5.636 5.636l12.728 12.728\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 21a9 9 0 100-18 9 9 0 000 18z\" />\n </svg>\n <h3 className=\"text-base font-semibold text-gray-800 mb-1\">Can't reach the file server</h3>\n <p className=\"text-sm text-gray-500 mb-3\">\n No response from <span className=\"font-mono\">{server}</span>. Make sure the\n server is running — see <span className=\"font-mono\">examples/file-server/README.md</span>.\n </p>\n <button onClick={() => loadDir(path)} className=\"px-3 py-1.5 text-sm bg-blue-500 text-white rounded hover:bg-blue-600\">\n Retry\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n const segments = path === '/' ? [] : path.split('/').filter(Boolean);\n const usagePct = quota && quota.limit > 0\n ? Math.min(100, Math.round((quota.used / quota.limit) * 100))\n : 0;\n const usageColor = usagePct > 90 ? 'bg-red-500' : usagePct > 75 ? 'bg-amber-500' : 'bg-blue-500';\n\n return (\n <div\n className=\"relative flex flex-col h-full bg-white\"\n onDragEnter={(e) => {\n if (!e.dataTransfer?.types?.includes?.('Files')) return;\n e.preventDefault();\n dragDepthRef.current++;\n if (!isDragging) setIsDragging(true);\n }}\n onDragOver={(e) => {\n if (!e.dataTransfer?.types?.includes?.('Files')) return;\n e.preventDefault();\n }}\n onDragLeave={() => {\n if (dragDepthRef.current > 0) dragDepthRef.current--;\n if (dragDepthRef.current === 0) setIsDragging(false);\n }}\n onDrop={(e) => {\n e.preventDefault();\n resetDrag();\n if (e.dataTransfer.files?.length) uploadFiles(e.dataTransfer.files);\n }}\n >\n <WindowTitle title={`Files${path === '/' ? '' : ' - ' + path}`} />\n <input\n ref={fileRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n onChange={(e) => {\n if (e.target.files?.length) uploadFiles(e.target.files);\n if (fileRef.current) fileRef.current.value = '';\n }}\n />\n\n {/* Toolbar */}\n <div className=\"flex items-center gap-1 px-2 py-1.5 border-b border-gray-200 bg-gray-50 shrink-0 text-xs\">\n {view === 'files' ? (\n <>\n <button\n onClick={() => setPath(parentOf(path))}\n disabled={path === '/'}\n className=\"px-2 py-1 rounded hover:bg-gray-200 disabled:opacity-30 text-gray-600\"\n title=\"Parent folder\"\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10.5 19.5L3 12m0 0l7.5-7.5M3 12h18\" />\n </svg>\n </button>\n\n <div className=\"flex-1 flex items-center gap-0.5 text-gray-700 truncate min-w-0\">\n <button onClick={() => setPath('/')} className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 font-medium\">My files</button>\n {segments.map((seg, i) => (\n <span key={i} className=\"flex items-center gap-0.5\">\n <span className=\"text-gray-400\">/</span>\n <button\n onClick={() => setPath('/' + segments.slice(0, i + 1).join('/'))}\n className=\"px-1.5 py-0.5 rounded hover:bg-gray-200\"\n >\n {seg}\n </button>\n </span>\n ))}\n </div>\n\n <button onClick={() => loadDir(path)} className=\"px-2 py-1 rounded hover:bg-gray-200 text-gray-600\" title=\"Refresh\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.023 9.348h4.992V4.356M2.985 19.644v-4.992h4.992M3.05 9.348a9 9 0 0114.85-3.36L21.015 9.348m0 5.304a9 9 0 01-14.85 3.36l-3.115-3.36\" />\n </svg>\n </button>\n <button onClick={() => setView('trash')} className=\"px-2 py-1 rounded hover:bg-gray-200 text-gray-600 flex items-center gap-1\" title=\"Open trash\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0\" />\n </svg>\n Trash\n </button>\n <button onClick={handleNewFolder} className=\"px-2 py-1 rounded hover:bg-gray-200 text-gray-600 flex items-center gap-1\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 10.5v6m3-3H9m4.06-7.19l-2.12-2.12a1.5 1.5 0 00-1.061-.44H4.5A2.25 2.25 0 002.25 6v12a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9a2.25 2.25 0 00-2.25-2.25h-5.379a1.5 1.5 0 01-1.06-.44z\" />\n </svg>\n New Folder\n </button>\n <button onClick={handlePick} className=\"px-2 py-1 rounded bg-blue-500 text-white hover:bg-blue-600 flex items-center gap-1\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M7.5 7.5L12 3m0 0l4.5 4.5M12 3v13.5\" />\n </svg>\n Upload\n </button>\n </>\n ) : (\n <>\n <button\n onClick={() => setView('files')}\n className=\"px-2 py-1 rounded hover:bg-gray-200 text-gray-600\"\n title=\"Back to files\"\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10.5 19.5L3 12m0 0l7.5-7.5M3 12h18\" />\n </svg>\n </button>\n <span className=\"flex-1 text-gray-700 font-medium px-2\">Trash</span>\n <button onClick={loadTrash} className=\"px-2 py-1 rounded hover:bg-gray-200 text-gray-600\" title=\"Refresh\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.023 9.348h4.992V4.356M2.985 19.644v-4.992h4.992M3.05 9.348a9 9 0 0114.85-3.36L21.015 9.348m0 5.304a9 9 0 01-14.85 3.36l-3.115-3.36\" />\n </svg>\n </button>\n <button\n onClick={handleEmptyTrash}\n disabled={trash.length === 0}\n className=\"px-2 py-1 rounded text-red-600 hover:bg-red-50 disabled:opacity-30 flex items-center gap-1\"\n >\n Empty trash\n </button>\n </>\n )}\n\n {/* Quota indicator */}\n {quota && (\n <>\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <div className=\"flex items-center gap-1.5\" title={`${formatSize(quota.used)} of ${formatSize(quota.limit)} used`}>\n <div className=\"w-20 h-1.5 rounded-full bg-gray-200 overflow-hidden\">\n <div\n className={`h-full ${usageColor} transition-all`}\n style={{ width: `${usagePct}%` }}\n />\n </div>\n <span className=\"text-[10px] text-gray-500 tabular-nums whitespace-nowrap\">\n {formatSize(quota.used)} / {formatSize(quota.limit)}\n </span>\n </div>\n </>\n )}\n </div>\n\n {/* List — file or trash view */}\n <div className=\"flex-1 overflow-auto\">\n {view === 'trash' ? (\n loading && trash.length === 0 ? (\n <div className=\"p-6 text-center text-sm text-gray-400\">Loading…</div>\n ) : trash.length === 0 ? (\n <div className=\"p-10 text-center text-sm text-gray-400\">\n Trash is empty.\n </div>\n ) : (\n <table className=\"w-full text-sm\">\n <thead className=\"bg-gray-50 text-[11px] uppercase tracking-wide text-gray-500\">\n <tr>\n <th className=\"text-left font-medium px-3 py-1.5\">Name</th>\n <th className=\"text-left font-medium px-3 py-1.5\">Original location</th>\n <th className=\"text-right font-medium px-3 py-1.5 w-24\">Size</th>\n <th className=\"text-right font-medium px-3 py-1.5 w-40\">Deleted</th>\n <th className=\"w-44\" />\n </tr>\n </thead>\n <tbody>\n {trash.map((e) => (\n <tr key={e.id} className=\"border-b border-gray-100 hover:bg-gray-50\">\n <td className=\"px-3 py-1.5 flex items-center gap-2\">\n {e.kind === 'folder' ? (\n <svg className=\"h-4 w-4 text-amber-500 shrink-0\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M2.25 7.125A2.25 2.25 0 014.5 4.875h4.504c.61 0 1.193.243 1.624.673l1.494 1.494a.75.75 0 00.53.22h7.098A2.25 2.25 0 0122 9.51v8.366A2.25 2.25 0 0119.75 20.125H4.25A2.25 2.25 0 012 17.875V7.125z\" /></svg>\n ) : (\n <svg className=\"h-4 w-4 text-gray-400 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\" /></svg>\n )}\n <span className=\"truncate\" title={e.name}>{e.name}</span>\n </td>\n <td className=\"px-3 py-1.5 text-gray-500 text-xs font-mono truncate\" title={e.originalPath}>\n {e.originalPath || '—'}\n </td>\n <td className=\"px-3 py-1.5 text-right tabular-nums text-gray-500\">{formatSize(e.size)}</td>\n <td className=\"px-3 py-1.5 text-right text-gray-500 tabular-nums\">\n {e.deletedAt ? formatTime(e.deletedAt) : '—'}\n </td>\n <td className=\"px-3 py-1.5 text-right whitespace-nowrap\">\n <button\n onClick={() => handleRestore(e)}\n className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-blue-600 text-[11px]\"\n >Restore</button>\n <button\n onClick={() => handleTrashPermanentDelete(e)}\n className=\"px-1.5 py-0.5 rounded hover:bg-red-100 text-red-600 text-[11px] ml-1\"\n >Delete forever</button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n ) : loading && entries.length === 0 ? (\n <div className=\"p-6 text-center text-sm text-gray-400\">Loading…</div>\n ) : entries.length === 0 ? (\n <div className=\"p-10 text-center text-sm text-gray-400\">\n Empty folder. Drop files here or click <span className=\"font-medium\">Upload</span>.\n </div>\n ) : (\n <table className=\"w-full text-sm\">\n <thead className=\"bg-gray-50 text-[11px] uppercase tracking-wide text-gray-500\">\n <tr>\n <th className=\"text-left font-medium px-3 py-1.5\">Name</th>\n <th className=\"text-right font-medium px-3 py-1.5 w-24\">Size</th>\n <th className=\"text-right font-medium px-3 py-1.5 w-40\">Modified</th>\n <th className=\"w-32\" />\n </tr>\n </thead>\n <tbody>\n {entries.map((e) => (\n <tr\n key={e.name}\n onClick={() => setSelected(e.name)}\n onDoubleClick={() => {\n if (e.kind === 'folder') setPath(joinPath(path, e.name));\n else openFile(e);\n }}\n className={`cursor-default border-b border-gray-100 ${selected === e.name ? 'bg-blue-50' : 'hover:bg-gray-50'}`}\n >\n <td className=\"px-3 py-1.5 flex items-center gap-2\">\n {e.kind === 'folder' ? (\n <svg className=\"h-4 w-4 text-amber-500 shrink-0\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M2.25 7.125A2.25 2.25 0 014.5 4.875h4.504c.61 0 1.193.243 1.624.673l1.494 1.494a.75.75 0 00.53.22h7.098A2.25 2.25 0 0122 9.51v8.366A2.25 2.25 0 0119.75 20.125H4.25A2.25 2.25 0 012 17.875V7.125z\" /></svg>\n ) : (\n <svg className=\"h-4 w-4 text-gray-400 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\" /></svg>\n )}\n <span className=\"truncate\" title={e.name}>{e.name}</span>\n </td>\n <td className=\"px-3 py-1.5 text-right tabular-nums text-gray-500\">\n {e.kind === 'folder' ? '—' : formatSize(e.size)}\n </td>\n <td className=\"px-3 py-1.5 text-right text-gray-500 tabular-nums\">\n {formatTime(e.modifiedAt)}\n </td>\n <td className=\"px-3 py-1.5 text-right whitespace-nowrap\">\n {e.kind === 'file' && (\n <button\n onClick={(ev) => { ev.stopPropagation(); downloadFile(e); }}\n className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-500 text-[11px]\"\n >Download</button>\n )}\n <button\n onClick={(ev) => { ev.stopPropagation(); handleRename(e); }}\n className=\"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-500 text-[11px] ml-1\"\n >Rename</button>\n <button\n onClick={(ev) => { ev.stopPropagation(); handleDelete(e); }}\n className=\"px-1.5 py-0.5 rounded hover:bg-red-100 text-red-600 text-[11px] ml-1\"\n >Delete</button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </div>\n\n {isDragging && (\n <div className=\"absolute inset-0 bg-blue-500/15 border-4 border-dashed border-blue-500 pointer-events-none flex items-center justify-center z-20\">\n <div className=\"px-4 py-2 rounded-md bg-blue-600 text-white text-sm font-medium shadow-lg\">\n Drop to upload\n </div>\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { formatDate } from './chunk-NSU7OHPC.js';
|
|
2
2
|
import { toast_default } from './chunk-WIJ45SYD.js';
|
|
3
|
-
import { useWindowMenuItem, Modal, client_default } from './chunk-
|
|
3
|
+
import { useWindowMenuItem, Modal, client_default } from './chunk-53CE7OVT.js';
|
|
4
4
|
import './chunk-PLGHQ7QW.js';
|
|
5
5
|
import { useState, useRef, useEffect, useCallback } from 'react';
|
|
6
6
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
@@ -266,5 +266,5 @@ function Minesweeper() {
|
|
|
266
266
|
}
|
|
267
267
|
|
|
268
268
|
export { Minesweeper as default };
|
|
269
|
-
//# sourceMappingURL=Minesweeper-
|
|
270
|
-
//# sourceMappingURL=Minesweeper-
|
|
269
|
+
//# sourceMappingURL=Minesweeper-UUHQCDAC.js.map
|
|
270
|
+
//# sourceMappingURL=Minesweeper-UUHQCDAC.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/analytics.ts","../src/apps/Minesweeper.tsx"],"names":["c"],"mappings":"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","file":"Minesweeper-MAA4NIV4.js","sourcesContent":["/** Game analytics — Minesweeper leaderboard routes through the\n * consumer-supplied apiClient (see setShellApiClient). */\nimport apiClient from './client';\nexport const submitGameScore = (data: { game: string; won: boolean; time_seconds: number; clicks: number }) =>\n apiClient.post(`/analytics/games/${data.game}/scores/`, data).then((r: any) => r.data);\nexport const getGameLeaderboard = (game: string) =>\n apiClient.get(`/analytics/games/${game}/leaderboard/`).then((r: any) => r.data);\n","import { useState, useCallback, useEffect, useRef } from 'react';\nimport { submitGameScore, getGameLeaderboard } from '../api/analytics';\nimport Modal, { useWindowMenuItem } from '../shell/Modal';\nimport toast from '../shell/toast';\nimport { formatDate } from '../utils/date';\n\nconst ROWS = 9, COLS = 9, MINES = 10;\nconst DIRS = [[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]];\nconst NUM_COLORS: Record<number,string> = {1:'text-blue-700',2:'text-green-700',3:'text-red-600',4:'text-purple-700',5:'text-red-900',6:'text-teal-600',7:'text-black',8:'text-gray-500'};\n\ntype Cell = { mine: boolean; revealed: boolean; flagged: boolean; adjacent: number };\ntype Status = 'playing' | 'won' | 'lost';\n\nfunction createBoard(): Cell[][] {\n return Array.from({length:ROWS},()=>Array.from({length:COLS},()=>({mine:false,revealed:false,flagged:false,adjacent:0})));\n}\n\nfunction placeMines(board: Cell[][], safeR: number, safeC: number) {\n const b = board.map(r=>r.map(c=>({...c})));\n let placed = 0;\n while (placed < MINES) {\n const r = Math.floor(Math.random()*ROWS), c = Math.floor(Math.random()*COLS);\n if (b[r][c].mine || (Math.abs(r-safeR)<=1 && Math.abs(c-safeC)<=1)) continue;\n b[r][c].mine = true;\n placed++;\n }\n for (let r=0;r<ROWS;r++) for (let c=0;c<COLS;c++) {\n if (b[r][c].mine) continue;\n b[r][c].adjacent = DIRS.reduce((s,[dr,dc])=>{\n const nr=r+dr,nc=c+dc;\n return s+(nr>=0&&nr<ROWS&&nc>=0&&nc<COLS&&b[nr][nc].mine?1:0);\n },0);\n }\n return b;\n}\n\nfunction floodFill(board: Cell[][], r: number, c: number) {\n const b = board.map(row=>row.map(cell=>({...cell})));\n const stack: [number,number][] = [[r,c]];\n while (stack.length) {\n const [cr,cc] = stack.pop()!;\n if (cr<0||cr>=ROWS||cc<0||cc>=COLS||b[cr][cc].revealed||b[cr][cc].flagged||b[cr][cc].mine) continue;\n b[cr][cc].revealed = true;\n if (b[cr][cc].adjacent === 0) DIRS.forEach(([dr,dc])=>stack.push([cr+dr,cc+dc]));\n }\n return b;\n}\n\nfunction checkWin(board: Cell[][]): boolean {\n return board.every(row=>row.every(c=>c.mine||c.revealed));\n}\n\nexport default function Minesweeper() {\n const [board, setBoard] = useState(createBoard);\n const [status, setStatus] = useState<Status>('playing');\n const [started, setStarted] = useState(false);\n const [time, setTime] = useState(0); // in centiseconds (hundredths)\n const timerRef = useRef<ReturnType<typeof setInterval>|null>(null);\n const startTimeRef = useRef(0);\n const [clicks, setClicks] = useState(0);\n const [showLeaderboard, setShowLeaderboard] = useState(false);\n const [leaderboard, setLeaderboard] = useState<{ rank: number; player_name: string; time_seconds: number; clicks: number; played_at: string }[]>([]);\n const [loadingLb, setLoadingLb] = useState(false);\n const scoreSubmitted = useRef(false);\n\n const flagCount = board.reduce((s,r)=>s+r.reduce((s2,c)=>s2+(c.flagged?1:0),0),0);\n\n const timeSeconds = time / 100; // convert centiseconds to seconds with 2 decimals\n\n useEffect(()=>{\n if (started && status==='playing') {\n startTimeRef.current = performance.now() - time * 10;\n timerRef.current = setInterval(()=>{\n const elapsed = Math.floor((performance.now() - startTimeRef.current) / 10);\n setTime(Math.min(elapsed, 99999));\n }, 10);\n } else if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n return ()=>{if(timerRef.current)clearInterval(timerRef.current)};\n },[started,status]);\n\n const restart = useCallback(()=>{\n setBoard(createBoard());\n setStatus('playing');\n setStarted(false);\n setTime(0);\n startTimeRef.current = 0;\n setClicks(0);\n scoreSubmitted.current = false;\n },[]);\n\n const handleClick = useCallback((r:number,c:number)=>{\n if (status!=='playing') return;\n setBoard(prev=>{\n let b = prev;\n if (!started) {\n b = placeMines(prev,r,c);\n setStarted(true);\n }\n const cell = b[r][c];\n if (cell.revealed||cell.flagged) return b;\n if (cell.mine) {\n const lost = b.map(row=>row.map(c=>({...c,revealed:c.mine?true:c.revealed})));\n lost[r][c] = {...lost[r][c], revealed:true};\n setStatus('lost');\n return lost;\n }\n const next = floodFill(b,r,c);\n if (checkWin(next)) setStatus('won');\n return next;\n });\n },[status,started]);\n\n const handleContext = useCallback((e:React.MouseEvent,r:number,c:number)=>{\n e.preventDefault();\n if (status!=='playing') return;\n setBoard(prev=>{\n if (prev[r][c].revealed) return prev;\n const b = prev.map(row=>row.map(cell=>({...cell})));\n b[r][c].flagged = !b[r][c].flagged;\n return b;\n });\n },[status]);\n\n // Chord click: both buttons on a revealed number — auto-reveal adjacent if flags match\n const handleChord = useCallback((r:number,c:number)=>{\n if (status!=='playing') return;\n setBoard(prev=>{\n const cell = prev[r][c];\n if (!cell.revealed || cell.adjacent === 0) return prev;\n // Count adjacent flags\n const adjFlags = DIRS.reduce((s,[dr,dc])=>{\n const nr=r+dr,nc=c+dc;\n return s+(nr>=0&&nr<ROWS&&nc>=0&&nc<COLS&&prev[nr][nc].flagged?1:0);\n },0);\n if (adjFlags !== cell.adjacent) return prev;\n // Reveal all unflagged adjacent cells\n let b = prev.map(row=>row.map(c=>({...c})));\n let hitMine = false;\n for (const [dr,dc] of DIRS) {\n const nr=r+dr,nc=c+dc;\n if (nr<0||nr>=ROWS||nc<0||nc>=COLS||b[nr][nc].revealed||b[nr][nc].flagged) continue;\n if (b[nr][nc].mine) { hitMine = true; b[nr][nc].revealed = true; }\n else b = floodFill(b,nr,nc);\n }\n if (hitMine) {\n b = b.map(row=>row.map(c=>({...c,revealed:c.mine?true:c.revealed})));\n setStatus('lost');\n } else if (checkWin(b)) setStatus('won');\n return b;\n });\n },[status]);\n\n const buttonsDown = useRef(0);\n\n // Capture precise time on win/loss\n const finalTimeRef = useRef(0);\n useEffect(() => {\n if (status === 'won' || status === 'lost') {\n // Capture the exact elapsed time when game ends\n if (startTimeRef.current > 0) {\n finalTimeRef.current = Math.round((performance.now() - startTimeRef.current) / 10) / 100; // seconds with 2 decimals\n } else {\n finalTimeRef.current = timeSeconds;\n }\n }\n }, [status]);\n\n // Submit score on win\n useEffect(() => {\n if (status === 'won' && !scoreSubmitted.current) {\n scoreSubmitted.current = true;\n const t = finalTimeRef.current || timeSeconds;\n const tFixed = parseFloat(t.toFixed(2));\n submitGameScore({ game: 'minesweeper', won: true, time_seconds: tFixed, clicks })\n .then(res => { toast.success(`You won! Rank #${res.rank} with ${tFixed}s and ${clicks} clicks`); })\n .catch(() => { toast.success(`You won! ${tFixed}s and ${clicks} clicks`); });\n }\n }, [status, clicks]);\n\n // Fetch leaderboard (no-op when apiClient isn't wired)\n const fetchLeaderboard = useCallback(() => {\n setLoadingLb(true);\n getGameLeaderboard('minesweeper')\n .then(res => setLeaderboard(res.results || []))\n .catch(() => setLeaderboard([]))\n .finally(() => setLoadingLb(false));\n }, []);\n\n // Register \"Leaderboard\" in the window title menu\n const openLb = useCallback(() => { fetchLeaderboard(); setShowLeaderboard(true); }, [fetchLeaderboard]);\n useWindowMenuItem('Leaderboard', openLb, <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.5 18.75h-9m9 0a3 3 0 013 3h-15a3 3 0 013-3m9 0v-3.375c0-.621-.503-1.125-1.125-1.125h-.871M7.5 18.75v-3.375c0-.621.504-1.125 1.125-1.125h.872m5.007 0H9.497m5.007 0a7.454 7.454 0 01-.982-3.172M9.497 14.25a7.454 7.454 0 00.981-3.172M5.25 4.236c-.982.143-1.954.317-2.916.52A6.003 6.003 0 007.73 9.728M5.25 4.236V4.5c0 2.108.966 3.99 2.48 5.228M5.25 4.236V2.721C7.456 2.41 9.71 2.25 12 2.25c2.291 0 4.545.16 6.75.47v1.516M18.75 4.236c.982.143 1.954.317 2.916.52A6.003 6.003 0 0016.27 9.728M18.75 4.236V4.5c0 2.108-.966 3.99-2.48 5.228m0 0a6.003 6.003 0 01-2.27.853m0 0h.008v.008h-.008v-.008z\" /></svg>);\n\n const face = status==='lost'?'😵':status==='won'?'😎':'🙂';\n\n return (\n <div className=\"flex flex-col items-center select-none\" onContextMenu={e => e.preventDefault()}>\n <div className=\"bg-gray-300 border-4 border-t-white border-l-white border-r-gray-500 border-b-gray-500 p-2\">\n {/* Header */}\n <div className=\"flex items-center justify-between bg-gray-300 border-2 border-t-gray-500 border-l-gray-500 border-r-white border-b-white p-1 mb-2\">\n <div className=\"bg-black text-red-500 font-mono font-bold text-xl px-1 w-14 text-center tracking-wider\">\n {String(Math.max(MINES-flagCount,0)).padStart(3,'0')}\n </div>\n <button onClick={restart} className=\"text-xl w-8 h-8 flex items-center justify-center bg-gray-300 border-2 border-t-white border-l-white border-r-gray-500 border-b-gray-500 active:border-t-gray-500 active:border-l-gray-500 active:border-r-white active:border-b-white cursor-pointer\">\n {face}\n </button>\n <div className=\"bg-black text-red-500 font-mono font-bold text-base px-1 w-[70px] text-center tracking-wider\">\n {timeSeconds.toFixed(2)}\n </div>\n </div>\n {/* Grid */}\n <div className=\"border-2 border-t-gray-500 border-l-gray-500 border-r-white border-b-white\">\n {board.map((row,r)=>(\n <div key={r} className=\"flex\">\n {row.map((cell,c)=>{\n const revealed = cell.revealed;\n const base = revealed\n ? 'w-[35px] h-[35px] flex items-center justify-center text-sm font-bold border border-gray-400'\n : 'w-[35px] h-[35px] flex items-center justify-center text-sm font-bold border-2 border-t-white border-l-white border-r-gray-500 border-b-gray-500 cursor-pointer active:border active:border-gray-400';\n const bg = revealed && cell.mine && status==='lost' ? 'bg-red-500' : revealed ? 'bg-gray-300' : 'bg-gray-300';\n let content: React.ReactNode = null;\n let color = '';\n if (revealed && cell.mine) { content = '💣'; }\n else if (revealed && cell.adjacent > 0) { content = cell.adjacent; color = NUM_COLORS[cell.adjacent]||''; }\n else if (!revealed && cell.flagged) { content = '🚩'; }\n return (\n <div key={c} className={`${base} ${bg} ${color}`}\n onClick={()=>{setClicks(n=>n+1);handleClick(r,c);}}\n onContextMenu={e=>{setClicks(n=>n+1);handleContext(e,r,c);}}\n onMouseDown={e=>{buttonsDown.current|=(1<<e.button);if((buttonsDown.current&0b101)===0b101||(buttonsDown.current&0b011)===0b011)handleChord(r,c);}}\n onMouseUp={e=>{buttonsDown.current&=~(1<<e.button)}}\n onMouseLeave={()=>{buttonsDown.current=0}}>\n {content}\n </div>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n\n {/* Stats + Leaderboard button */}\n <div className=\"flex items-center justify-between w-full mt-1 px-1\">\n <span className=\"text-[10px] text-gray-400 font-mono\">{clicks} clicks</span>\n <button onClick={() => { fetchLeaderboard(); setShowLeaderboard(true); }}\n className=\"text-[10px] text-blue-600 hover:text-blue-800 font-medium\">\n Leaderboard\n </button>\n </div>\n\n {/* Leaderboard Modal */}\n {showLeaderboard && (\n <Modal open onClose={() => setShowLeaderboard(false)} title=\"Minesweeper Leaderboard\" size=\"md\">\n {loadingLb ? (\n <div className=\"text-center py-8 text-sm text-gray-400\">Loading...</div>\n ) : leaderboard.length === 0 ? (\n <div className=\"text-center py-8 text-sm text-gray-400\">No wins recorded yet. Be the first!</div>\n ) : (\n <div className=\"overflow-y-auto max-h-[60vh]\">\n <table className=\"w-full text-sm\">\n <thead className=\"sticky top-0 bg-white\">\n <tr className=\"border-b border-gray-200\">\n <th className=\"text-left py-2 px-2 text-xs font-medium text-gray-500 w-12\">#</th>\n <th className=\"text-left py-2 px-2 text-xs font-medium text-gray-500\">Player</th>\n <th className=\"text-right py-2 px-2 text-xs font-medium text-gray-500 w-16\">Time</th>\n <th className=\"text-right py-2 px-2 text-xs font-medium text-gray-500 w-16\">Clicks</th>\n <th className=\"text-right py-2 px-2 text-xs font-medium text-gray-500 w-24\">Date</th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-100\">\n {leaderboard.map((s, i) => (\n <tr key={i} className={i < 3 ? 'bg-yellow-50/50' : ''}>\n <td className=\"py-1.5 px-2 font-mono text-gray-400\">\n {s.rank === 1 ? '🥇' : s.rank === 2 ? '🥈' : s.rank === 3 ? '🥉' : s.rank}\n </td>\n <td className=\"py-1.5 px-2 font-medium text-gray-900\">{s.player_name}</td>\n <td className=\"py-1.5 px-2 text-right font-mono text-gray-700\">{Number(s.time_seconds).toFixed(2)}s</td>\n <td className=\"py-1.5 px-2 text-right font-mono text-gray-500\">{s.clicks}</td>\n <td className=\"py-1.5 px-2 text-right text-xs text-gray-400\">\n {formatDate(s.played_at)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </Modal>\n )}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/api/analytics.ts","../src/apps/Minesweeper.tsx"],"names":["c"],"mappings":"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","file":"Minesweeper-UUHQCDAC.js","sourcesContent":["/** Game analytics — Minesweeper leaderboard routes through the\n * consumer-supplied apiClient (see setShellApiClient). */\nimport apiClient from './client';\nexport const submitGameScore = (data: { game: string; won: boolean; time_seconds: number; clicks: number }) =>\n apiClient.post(`/analytics/games/${data.game}/scores/`, data).then((r: any) => r.data);\nexport const getGameLeaderboard = (game: string) =>\n apiClient.get(`/analytics/games/${game}/leaderboard/`).then((r: any) => r.data);\n","import { useState, useCallback, useEffect, useRef } from 'react';\nimport { submitGameScore, getGameLeaderboard } from '../api/analytics';\nimport Modal, { useWindowMenuItem } from '../shell/Modal';\nimport toast from '../shell/toast';\nimport { formatDate } from '../utils/date';\n\nconst ROWS = 9, COLS = 9, MINES = 10;\nconst DIRS = [[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]];\nconst NUM_COLORS: Record<number,string> = {1:'text-blue-700',2:'text-green-700',3:'text-red-600',4:'text-purple-700',5:'text-red-900',6:'text-teal-600',7:'text-black',8:'text-gray-500'};\n\ntype Cell = { mine: boolean; revealed: boolean; flagged: boolean; adjacent: number };\ntype Status = 'playing' | 'won' | 'lost';\n\nfunction createBoard(): Cell[][] {\n return Array.from({length:ROWS},()=>Array.from({length:COLS},()=>({mine:false,revealed:false,flagged:false,adjacent:0})));\n}\n\nfunction placeMines(board: Cell[][], safeR: number, safeC: number) {\n const b = board.map(r=>r.map(c=>({...c})));\n let placed = 0;\n while (placed < MINES) {\n const r = Math.floor(Math.random()*ROWS), c = Math.floor(Math.random()*COLS);\n if (b[r][c].mine || (Math.abs(r-safeR)<=1 && Math.abs(c-safeC)<=1)) continue;\n b[r][c].mine = true;\n placed++;\n }\n for (let r=0;r<ROWS;r++) for (let c=0;c<COLS;c++) {\n if (b[r][c].mine) continue;\n b[r][c].adjacent = DIRS.reduce((s,[dr,dc])=>{\n const nr=r+dr,nc=c+dc;\n return s+(nr>=0&&nr<ROWS&&nc>=0&&nc<COLS&&b[nr][nc].mine?1:0);\n },0);\n }\n return b;\n}\n\nfunction floodFill(board: Cell[][], r: number, c: number) {\n const b = board.map(row=>row.map(cell=>({...cell})));\n const stack: [number,number][] = [[r,c]];\n while (stack.length) {\n const [cr,cc] = stack.pop()!;\n if (cr<0||cr>=ROWS||cc<0||cc>=COLS||b[cr][cc].revealed||b[cr][cc].flagged||b[cr][cc].mine) continue;\n b[cr][cc].revealed = true;\n if (b[cr][cc].adjacent === 0) DIRS.forEach(([dr,dc])=>stack.push([cr+dr,cc+dc]));\n }\n return b;\n}\n\nfunction checkWin(board: Cell[][]): boolean {\n return board.every(row=>row.every(c=>c.mine||c.revealed));\n}\n\nexport default function Minesweeper() {\n const [board, setBoard] = useState(createBoard);\n const [status, setStatus] = useState<Status>('playing');\n const [started, setStarted] = useState(false);\n const [time, setTime] = useState(0); // in centiseconds (hundredths)\n const timerRef = useRef<ReturnType<typeof setInterval>|null>(null);\n const startTimeRef = useRef(0);\n const [clicks, setClicks] = useState(0);\n const [showLeaderboard, setShowLeaderboard] = useState(false);\n const [leaderboard, setLeaderboard] = useState<{ rank: number; player_name: string; time_seconds: number; clicks: number; played_at: string }[]>([]);\n const [loadingLb, setLoadingLb] = useState(false);\n const scoreSubmitted = useRef(false);\n\n const flagCount = board.reduce((s,r)=>s+r.reduce((s2,c)=>s2+(c.flagged?1:0),0),0);\n\n const timeSeconds = time / 100; // convert centiseconds to seconds with 2 decimals\n\n useEffect(()=>{\n if (started && status==='playing') {\n startTimeRef.current = performance.now() - time * 10;\n timerRef.current = setInterval(()=>{\n const elapsed = Math.floor((performance.now() - startTimeRef.current) / 10);\n setTime(Math.min(elapsed, 99999));\n }, 10);\n } else if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n return ()=>{if(timerRef.current)clearInterval(timerRef.current)};\n },[started,status]);\n\n const restart = useCallback(()=>{\n setBoard(createBoard());\n setStatus('playing');\n setStarted(false);\n setTime(0);\n startTimeRef.current = 0;\n setClicks(0);\n scoreSubmitted.current = false;\n },[]);\n\n const handleClick = useCallback((r:number,c:number)=>{\n if (status!=='playing') return;\n setBoard(prev=>{\n let b = prev;\n if (!started) {\n b = placeMines(prev,r,c);\n setStarted(true);\n }\n const cell = b[r][c];\n if (cell.revealed||cell.flagged) return b;\n if (cell.mine) {\n const lost = b.map(row=>row.map(c=>({...c,revealed:c.mine?true:c.revealed})));\n lost[r][c] = {...lost[r][c], revealed:true};\n setStatus('lost');\n return lost;\n }\n const next = floodFill(b,r,c);\n if (checkWin(next)) setStatus('won');\n return next;\n });\n },[status,started]);\n\n const handleContext = useCallback((e:React.MouseEvent,r:number,c:number)=>{\n e.preventDefault();\n if (status!=='playing') return;\n setBoard(prev=>{\n if (prev[r][c].revealed) return prev;\n const b = prev.map(row=>row.map(cell=>({...cell})));\n b[r][c].flagged = !b[r][c].flagged;\n return b;\n });\n },[status]);\n\n // Chord click: both buttons on a revealed number — auto-reveal adjacent if flags match\n const handleChord = useCallback((r:number,c:number)=>{\n if (status!=='playing') return;\n setBoard(prev=>{\n const cell = prev[r][c];\n if (!cell.revealed || cell.adjacent === 0) return prev;\n // Count adjacent flags\n const adjFlags = DIRS.reduce((s,[dr,dc])=>{\n const nr=r+dr,nc=c+dc;\n return s+(nr>=0&&nr<ROWS&&nc>=0&&nc<COLS&&prev[nr][nc].flagged?1:0);\n },0);\n if (adjFlags !== cell.adjacent) return prev;\n // Reveal all unflagged adjacent cells\n let b = prev.map(row=>row.map(c=>({...c})));\n let hitMine = false;\n for (const [dr,dc] of DIRS) {\n const nr=r+dr,nc=c+dc;\n if (nr<0||nr>=ROWS||nc<0||nc>=COLS||b[nr][nc].revealed||b[nr][nc].flagged) continue;\n if (b[nr][nc].mine) { hitMine = true; b[nr][nc].revealed = true; }\n else b = floodFill(b,nr,nc);\n }\n if (hitMine) {\n b = b.map(row=>row.map(c=>({...c,revealed:c.mine?true:c.revealed})));\n setStatus('lost');\n } else if (checkWin(b)) setStatus('won');\n return b;\n });\n },[status]);\n\n const buttonsDown = useRef(0);\n\n // Capture precise time on win/loss\n const finalTimeRef = useRef(0);\n useEffect(() => {\n if (status === 'won' || status === 'lost') {\n // Capture the exact elapsed time when game ends\n if (startTimeRef.current > 0) {\n finalTimeRef.current = Math.round((performance.now() - startTimeRef.current) / 10) / 100; // seconds with 2 decimals\n } else {\n finalTimeRef.current = timeSeconds;\n }\n }\n }, [status]);\n\n // Submit score on win\n useEffect(() => {\n if (status === 'won' && !scoreSubmitted.current) {\n scoreSubmitted.current = true;\n const t = finalTimeRef.current || timeSeconds;\n const tFixed = parseFloat(t.toFixed(2));\n submitGameScore({ game: 'minesweeper', won: true, time_seconds: tFixed, clicks })\n .then(res => { toast.success(`You won! Rank #${res.rank} with ${tFixed}s and ${clicks} clicks`); })\n .catch(() => { toast.success(`You won! ${tFixed}s and ${clicks} clicks`); });\n }\n }, [status, clicks]);\n\n // Fetch leaderboard (no-op when apiClient isn't wired)\n const fetchLeaderboard = useCallback(() => {\n setLoadingLb(true);\n getGameLeaderboard('minesweeper')\n .then(res => setLeaderboard(res.results || []))\n .catch(() => setLeaderboard([]))\n .finally(() => setLoadingLb(false));\n }, []);\n\n // Register \"Leaderboard\" in the window title menu\n const openLb = useCallback(() => { fetchLeaderboard(); setShowLeaderboard(true); }, [fetchLeaderboard]);\n useWindowMenuItem('Leaderboard', openLb, <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.5 18.75h-9m9 0a3 3 0 013 3h-15a3 3 0 013-3m9 0v-3.375c0-.621-.503-1.125-1.125-1.125h-.871M7.5 18.75v-3.375c0-.621.504-1.125 1.125-1.125h.872m5.007 0H9.497m5.007 0a7.454 7.454 0 01-.982-3.172M9.497 14.25a7.454 7.454 0 00.981-3.172M5.25 4.236c-.982.143-1.954.317-2.916.52A6.003 6.003 0 007.73 9.728M5.25 4.236V4.5c0 2.108.966 3.99 2.48 5.228M5.25 4.236V2.721C7.456 2.41 9.71 2.25 12 2.25c2.291 0 4.545.16 6.75.47v1.516M18.75 4.236c.982.143 1.954.317 2.916.52A6.003 6.003 0 0016.27 9.728M18.75 4.236V4.5c0 2.108-.966 3.99-2.48 5.228m0 0a6.003 6.003 0 01-2.27.853m0 0h.008v.008h-.008v-.008z\" /></svg>);\n\n const face = status==='lost'?'😵':status==='won'?'😎':'🙂';\n\n return (\n <div className=\"flex flex-col items-center select-none\" onContextMenu={e => e.preventDefault()}>\n <div className=\"bg-gray-300 border-4 border-t-white border-l-white border-r-gray-500 border-b-gray-500 p-2\">\n {/* Header */}\n <div className=\"flex items-center justify-between bg-gray-300 border-2 border-t-gray-500 border-l-gray-500 border-r-white border-b-white p-1 mb-2\">\n <div className=\"bg-black text-red-500 font-mono font-bold text-xl px-1 w-14 text-center tracking-wider\">\n {String(Math.max(MINES-flagCount,0)).padStart(3,'0')}\n </div>\n <button onClick={restart} className=\"text-xl w-8 h-8 flex items-center justify-center bg-gray-300 border-2 border-t-white border-l-white border-r-gray-500 border-b-gray-500 active:border-t-gray-500 active:border-l-gray-500 active:border-r-white active:border-b-white cursor-pointer\">\n {face}\n </button>\n <div className=\"bg-black text-red-500 font-mono font-bold text-base px-1 w-[70px] text-center tracking-wider\">\n {timeSeconds.toFixed(2)}\n </div>\n </div>\n {/* Grid */}\n <div className=\"border-2 border-t-gray-500 border-l-gray-500 border-r-white border-b-white\">\n {board.map((row,r)=>(\n <div key={r} className=\"flex\">\n {row.map((cell,c)=>{\n const revealed = cell.revealed;\n const base = revealed\n ? 'w-[35px] h-[35px] flex items-center justify-center text-sm font-bold border border-gray-400'\n : 'w-[35px] h-[35px] flex items-center justify-center text-sm font-bold border-2 border-t-white border-l-white border-r-gray-500 border-b-gray-500 cursor-pointer active:border active:border-gray-400';\n const bg = revealed && cell.mine && status==='lost' ? 'bg-red-500' : revealed ? 'bg-gray-300' : 'bg-gray-300';\n let content: React.ReactNode = null;\n let color = '';\n if (revealed && cell.mine) { content = '💣'; }\n else if (revealed && cell.adjacent > 0) { content = cell.adjacent; color = NUM_COLORS[cell.adjacent]||''; }\n else if (!revealed && cell.flagged) { content = '🚩'; }\n return (\n <div key={c} className={`${base} ${bg} ${color}`}\n onClick={()=>{setClicks(n=>n+1);handleClick(r,c);}}\n onContextMenu={e=>{setClicks(n=>n+1);handleContext(e,r,c);}}\n onMouseDown={e=>{buttonsDown.current|=(1<<e.button);if((buttonsDown.current&0b101)===0b101||(buttonsDown.current&0b011)===0b011)handleChord(r,c);}}\n onMouseUp={e=>{buttonsDown.current&=~(1<<e.button)}}\n onMouseLeave={()=>{buttonsDown.current=0}}>\n {content}\n </div>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n\n {/* Stats + Leaderboard button */}\n <div className=\"flex items-center justify-between w-full mt-1 px-1\">\n <span className=\"text-[10px] text-gray-400 font-mono\">{clicks} clicks</span>\n <button onClick={() => { fetchLeaderboard(); setShowLeaderboard(true); }}\n className=\"text-[10px] text-blue-600 hover:text-blue-800 font-medium\">\n Leaderboard\n </button>\n </div>\n\n {/* Leaderboard Modal */}\n {showLeaderboard && (\n <Modal open onClose={() => setShowLeaderboard(false)} title=\"Minesweeper Leaderboard\" size=\"md\">\n {loadingLb ? (\n <div className=\"text-center py-8 text-sm text-gray-400\">Loading...</div>\n ) : leaderboard.length === 0 ? (\n <div className=\"text-center py-8 text-sm text-gray-400\">No wins recorded yet. Be the first!</div>\n ) : (\n <div className=\"overflow-y-auto max-h-[60vh]\">\n <table className=\"w-full text-sm\">\n <thead className=\"sticky top-0 bg-white\">\n <tr className=\"border-b border-gray-200\">\n <th className=\"text-left py-2 px-2 text-xs font-medium text-gray-500 w-12\">#</th>\n <th className=\"text-left py-2 px-2 text-xs font-medium text-gray-500\">Player</th>\n <th className=\"text-right py-2 px-2 text-xs font-medium text-gray-500 w-16\">Time</th>\n <th className=\"text-right py-2 px-2 text-xs font-medium text-gray-500 w-16\">Clicks</th>\n <th className=\"text-right py-2 px-2 text-xs font-medium text-gray-500 w-24\">Date</th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-100\">\n {leaderboard.map((s, i) => (\n <tr key={i} className={i < 3 ? 'bg-yellow-50/50' : ''}>\n <td className=\"py-1.5 px-2 font-mono text-gray-400\">\n {s.rank === 1 ? '🥇' : s.rank === 2 ? '🥈' : s.rank === 3 ? '🥉' : s.rank}\n </td>\n <td className=\"py-1.5 px-2 font-medium text-gray-900\">{s.player_name}</td>\n <td className=\"py-1.5 px-2 text-right font-mono text-gray-700\">{Number(s.time_seconds).toFixed(2)}s</td>\n <td className=\"py-1.5 px-2 text-right font-mono text-gray-500\">{s.clicks}</td>\n <td className=\"py-1.5 px-2 text-right text-xs text-gray-400\">\n {formatDate(s.played_at)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </Modal>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { toast_default } from './chunk-WIJ45SYD.js';
|
|
2
2
|
import { useShellPrefs } from './chunk-36VM54SC.js';
|
|
3
|
-
import { useWindowManager, client_default } from './chunk-
|
|
3
|
+
import { useWindowManager, client_default } from './chunk-53CE7OVT.js';
|
|
4
4
|
import './chunk-PLGHQ7QW.js';
|
|
5
5
|
import { useRef, useEffect, useState, useCallback } from 'react';
|
|
6
6
|
import { useQuery } from '@tanstack/react-query';
|
|
@@ -385,5 +385,5 @@ Tips:
|
|
|
385
385
|
}
|
|
386
386
|
|
|
387
387
|
export { Notepad as default };
|
|
388
|
-
//# sourceMappingURL=Notepad-
|
|
389
|
-
//# sourceMappingURL=Notepad-
|
|
388
|
+
//# sourceMappingURL=Notepad-MSHSUSMG.js.map
|
|
389
|
+
//# sourceMappingURL=Notepad-MSHSUSMG.js.map
|