import React, { useState, useEffect, useRef } from "react"; import { Link, useLocation, useNavigate } from "react-router-dom"; import Modal from "react-modal"; import { deleteCaches, setAccount, useAccount } 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"; const customOverlayStyles = { overlay: { backgroundColor: 'rgba(0,0,0,.25)' } }; const SettingsModal = ({ isOpen, closeModal }) => { const selectedStyle = useGeneralStore(state => state.selectedStyle); const navigate = useNavigate(); const location = useLocation(); const [expanded, setExpanded] = useState([]); const [errorMessage, setErrorMessage] = useState(null); const [successMessage, setSuccessMessage] = useState(null); useError(errorMessage, [errorMessage]); useSuccess(successMessage, [successMessage]); const account = useAccount(); const gatewayRef = useRef(); const ipfsRef = useRef(); const pubsubRef = useRef(); const dataPathRef = 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 = () => { closeModal(); if (location.pathname === "/settings") { navigate(-1, { replace: true }); } else { navigate("/settings", { state: { from: location } }); } }; 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"); } }, []); useEffect(() => { const toastFromStorage = localStorage.getItem("toastMessage"); if (toastFromStorage) { setSuccessMessage(toastFromStorage); localStorage.removeItem("toastMessage"); } }, []); return (
v0.1.0 Settings
[ ]
{/* */}