From 016a4f266b3275ff2e66c7cf9fdf8da3d7a04c11 Mon Sep 17 00:00:00 2001
From: Pinapelz
Date: Sun, 26 Oct 2025 15:19:05 -0700
Subject: reduce amount of modal useStates + add Flower import modals (RB +
nostop)
---
.../components/modals/FlowerUserscriptModal.tsx | 169 +++++++++++++++++++++
frontend/src/pages/Import.tsx | 101 ++++++++----
2 files changed, 243 insertions(+), 27 deletions(-)
create mode 100644 frontend/src/components/modals/FlowerUserscriptModal.tsx
(limited to 'frontend/src')
diff --git a/frontend/src/components/modals/FlowerUserscriptModal.tsx b/frontend/src/components/modals/FlowerUserscriptModal.tsx
new file mode 100644
index 0000000..7e0b3ce
--- /dev/null
+++ b/frontend/src/components/modals/FlowerUserscriptModal.tsx
@@ -0,0 +1,169 @@
+interface UserScript {
+ name: string;
+ url: string;
+}
+
+interface FlowerUserscriptModalProps {
+ isOpen: boolean;
+ onClose: () => void;
+ mainGameName: string;
+ userPage: string;
+ importPage: string;
+ scripts: UserScript[];
+}
+
+interface FlowerUserscriptCardProps {
+ mainGameName: string;
+ onClick: () => void;
+}
+
+export const FlowerUserscriptCard = ({ mainGameName, onClick }: FlowerUserscriptCardProps) => {
+ return (
+
+
+
+ {mainGameName} Flower Play History (Userscript)
+
+
+ Import playdata from cabinets on the Flower network
+
+
+
+ )
+}
+
+const FlowerUserscriptModal = ({
+ isOpen,
+ onClose,
+ mainGameName,
+ userPage,
+ importPage,
+ scripts,
+}: FlowerUserscriptModalProps) => {
+ if (!isOpen) return null;
+
+ const handleClose = () => {
+ onClose();
+ };
+ if(mainGameName === undefined){
+ return "Sorry, due to some extreme error the game you're looking for doesn't seem to exist..."
+ }
+ return (
+
+ {/* Backdrop */}
+
+
+ {/* Modal */}
+
+
+ {/* Header */}
+
+
+ Import {mainGameName} Flower Play Data
+
+
+ Follow the instructions below to import your data
+
+
+
+ {/* Warning */}
+
+
+ You will need your ACCESS CODE to register on Flower for the first time!
+ Do this by tapping your Amusement IC card at any machine on the Flower network and copying
+ down the code displayed on the screen.
+
+ This is likely not the same code as the one on the back of your card.
+
+
+
+ {/* Instructions */}
+
+
+ Instructions:
+
+
+ -
+ Log into the{" "}
+
+ {mainGameName} Project Flower page
+
+
+ -
+ Navigate to the{" "}
+
+ {mainGameName} Play History Page
+ {" "}
+
+ -
+ Install the relevant userscript (use a browser extension such as{" "}
+ Tampermonkey)
+
+ {/* Additional Info */}
+
+ -
+ A button will appear on the page that you can click to start the scraping process.
+
+ -
+ Upload the resulting JSON file into Mirage using the
+ Batch-Manual Upload functionality
+
+ - Verify that all data has been imported correctly
+
+
+
+ {/* Actions */}
+
+
+
+
+
+
+ );
+};
+
+export default FlowerUserscriptModal;
diff --git a/frontend/src/pages/Import.tsx b/frontend/src/pages/Import.tsx
index f798b51..2af4a0e 100644
--- a/frontend/src/pages/Import.tsx
+++ b/frontend/src/pages/Import.tsx
@@ -6,21 +6,22 @@ import type { SupportedGame } from "../types/game";
import { uploadScore } from "../utils/scoreUpload";
import { NavBar } from "../components/NavBar";
import { EamusementUserscriptCard } from "../components/modals/EamusementUserscriptModal";
+import { FlowerUserscriptCard } from "../components/modals/FlowerUserscriptModal";
const JsonUploadModal = lazy(() => import("../components/modals/JsonUploadModal"));
const EamusementUserscriptModal = lazy(() => import("../components/modals/EamusementUserscriptModal"));
const DivaNetModal = lazy(() => import("../components/modals/DivaNetModal"));
const MusicDiverModal = lazy(() => import("../components/modals/MusicDiverModal"));
+const FlowerUserscriptModal = lazy(() => import("../components/modals/FlowerUserscriptModal"));
+
+type ModalType = 'json' | 'dancerush' | 'dancearound' | 'divanet' | 'musicdiver' | 'nostalgia' | 'reflecbeat';
const Import = () => {
const { user, isLoading, logout } = useAuth();
const navigate = useNavigate();
const [selectedGame, setSelectedGame] = useState("");
- const [isJsonModalOpen, setIsJsonModalOpen] = useState(false);
- const [isDancerushModalOpen, setIsDancerushModalOpen] = useState(false);
- const [isDanceAroundModalOpen, setIsDanceAroundModalOpen] = useState(false);
- const [isDivaNetModalOpen, setIsDivaNetModalOpen] = useState(false);
- const [isMusicDiverModalOpen, setIsMusicDiverModalOpen] = useState(false);
+ const [openModal, setOpenModal] = useState(null);
+
const [supportedGames, setSupportedGames] = useState([]);
const [gamesLoading, setGamesLoading] = useState(true);
const [uploadStatus, setUploadStatus] = useState<{
@@ -120,7 +121,7 @@ const Import = () => {
Upload your game data from a Mirage compatible JSON file