import React, { useEffect, useState } from "react"; import { Box, Label, Flex, Button, Text, Checkbox, Divider } from "theme-ui"; import SimpleBar from "simplebar-react"; import Modal from "../components/Modal"; import LoadingOverlay from "../components/LoadingOverlay"; import { getDatabase } from "../database"; function DataSelectorModal({ isOpen, onRequestClose, onConfirm, confirmText, label, databaseName, filter, }) { const [maps, setMaps] = useState({}); const [tokens, setTokens] = useState({}); const [isLoading, setIsLoading] = useState(false); const hasMaps = Object.values(maps).length > 0; const hasTokens = Object.values(tokens).length > 0; useEffect(() => { async function loadData() { if (isOpen && databaseName) { setIsLoading(true); const db = getDatabase({}, databaseName); let loadedMaps = {}; let loadedTokens = {}; await db .table("maps") .filter((map) => filter("maps", map, map.id)) .each((map) => { loadedMaps[map.id] = { name: map.name, id: map.id, checked: true }; }); await db .table("tokens") .filter((token) => filter("tokens", token, token.id)) .each((token) => { loadedTokens[token.id] = { name: token.name, id: token.id, checked: true, }; }); db.close(); setMaps(loadedMaps); setTokens(loadedTokens); setIsLoading(false); } else { setMaps({}); setTokens({}); } } loadData(); }, [isOpen, databaseName, filter]); function handleConfirm() { let checkedMaps = Object.values(maps).filter((map) => map.checked); let checkedTokens = Object.values(tokens).filter((token) => token.checked); onConfirm(checkedMaps, checkedTokens); } return ( {!hasMaps && !hasTokens && ( No custom maps or tokens found. )} {hasMaps && ( <> {Object.values(maps).map((map) => ( ))} )} {hasMaps && hasTokens && } {hasTokens && ( <> {Object.values(tokens).map((token) => ( ))} )} {isLoading && } ); } DataSelectorModal.defaultProps = { label: "Select data", confirmText: "Yes", filter: () => true, databaseName: "OwlbearRodeoDB", }; export default DataSelectorModal;