import React, { useState, useEffect, useRef } from "react"; import { Link, useLocation, useNavigate } from "react-router-dom"; import Modal from "react-modal"; import { deleteCaches, exportAccount, importAccount, setAccount, setActiveAccount, useAccount, useAccounts } from "@plebbit/plebbit-react-hooks"; import { StyledModal } from "./styled/SettingsModal.styled"; import useGeneralStore from "../hooks/stores/useGeneralStore"; import useError from "../hooks/useError"; import useSuccess from "../hooks/useSuccess"; import packageJson from '../../package.json' const {version} = packageJson const SettingsModal = ({ isOpen, closeModal }) => { const selectedStyle = useGeneralStore(state => state.selectedStyle); const navigate = useNavigate(); const location = useLocation(); const [expanded, setExpanded] = useState([]); const [accountJson, setAccountJson] = useState(null); const [errorMessage, setErrorMessage] = useState(null); const [successMessage, setSuccessMessage] = useState(null); useError(errorMessage, [errorMessage]); useSuccess(successMessage, [successMessage]); const account = useAccount(); const { accounts } = useAccounts(); const gatewayRef = useRef(); const ipfsRef = useRef(); const pubsubRef = useRef(); const dataPathRef = useRef(); const importRef = useRef(); const isValidURL = (url) => { try { new URL(url); return true; } catch { return false; } }; const handleSavePlebbitOptions = async () => { const gatewayUrls = gatewayRef.current.value.split('\n').filter(url => url.trim()); const ipfsClientsOptions = ipfsRef.current.value.split('\n').filter(url => url.trim()) || undefined; const pubsubClientsOptions = pubsubRef.current.value.split('\n').filter(url => url.trim()); const invalidUrls = [ ...gatewayUrls, ...(ipfsClientsOptions || []), ...pubsubClientsOptions, ].filter((url) => !isValidURL(url)); if (invalidUrls.length > 0) { setErrorMessage(`Invalid URL(s): ${invalidUrls.join(', ')}`); return; } const plebbitOptions = { ipfsGatewayUrls: gatewayUrls, ipfsHttpClientsOptions: ipfsClientsOptions, pubsubHttpClientsOptions: pubsubClientsOptions, }; try { await setAccount({ ...account, plebbitOptions }); localStorage.setItem("toastMessage", "Settings Saved"); window.location.reload(); } catch (error) { setErrorMessage(error.message); } }; const handleResetPlebbitOptions = async () => { setErrorMessage(null); setSuccessMessage(null); const defaultGatewayUrls = [ 'https://ipfs.io', 'https://ipfsgateway.xyz', 'https://cloudflare-ipfs.com' ]; const defaultPubsubHttpClientsOptions = ['https://pubsubprovider.xyz/api/v0']; gatewayRef.current.value = defaultGatewayUrls.join('\n'); ipfsRef.current.value = ""; pubsubRef.current.value = defaultPubsubHttpClientsOptions.join('\n'); dataPathRef.current.value = ""; try { await setAccount({ ...account, plebbitOptions: { ipfsGatewayUrls: defaultGatewayUrls, ipfsHttpClientsOptions: undefined, pubsubHttpClientsOptions: defaultPubsubHttpClientsOptions, }, }); localStorage.setItem("toastMessage", "Settings Reset"); window.location.reload(); } catch (error) { setErrorMessage(error.message); } }; const handleCloseModal = () => { setAccountJson(null); if (location.pathname.endsWith("/settings")) { const newPath = location.pathname.slice(0, -9); closeModal(); navigate(newPath, { replace: true }); } else { closeModal(); } }; const toggleExpanded = (index) => { setExpanded((prevExpanded) => { const newExpanded = [...prevExpanded]; if (newExpanded.includes(index)) { newExpanded.splice(newExpanded.indexOf(index), 1); } else { newExpanded.push(index); } return newExpanded; }); }; const expandAll = () => { if (expanded.length === 3) { setExpanded([]); } else { setExpanded([0, 1, 2]); } }; useEffect(() => { if (localStorage.getItem("cacheCleared") === "true") { setSuccessMessage("Cache Cleared"); localStorage.removeItem("cacheCleared"); } }, []); const handleExport = async () => { const activeAccountJson = await exportAccount(); setAccountJson(activeAccountJson); }; const handleImport = async () => { const accountJson = importRef.current.value; try { await importAccount(accountJson); localStorage.setItem("toastMessage", "Account Imported"); window.location.reload(); } catch (error) { setErrorMessage(error.message); } }; const handleAccountChange = (e) => { setActiveAccount(e.target.value); }; return (
v{version} Settings
[ ]
{/* */}