Merge pull request #189 from plebbit/development

Development
This commit is contained in:
plebeius.eth
2023-08-14 16:59:20 +02:00
committed by GitHub
21 changed files with 384 additions and 232 deletions
+2 -4
View File
@@ -11,12 +11,10 @@ const StateLabel = ({ commentIndex, className }) => {
useEffect(() => { useEffect(() => {
const timer = setTimeout(() => setIsLoading(false), 2000); const timer = setTimeout(() => setIsLoading(false), 2000);
return () => clearTimeout(timer); return () => clearTimeout(timer);
}, []); }, [commentIndex]);
if (commentIndex === undefined) return null;
return ( return (
commentIndex && stateString !== "Succeeded" ? ( commentIndex !== undefined && stateString !== "Succeeded" ? (
(comment.state === "failed") ? ( (comment.state === "failed") ? (
null null
) : ( ) : (
+10 -3
View File
@@ -20,6 +20,7 @@ const CaptchaModal = () => {
} = useGeneralStore(state => state); } = useGeneralStore(state => state);
const [imageSources, setImageSources] = useState([]); const [imageSources, setImageSources] = useState([]);
const [isLoading, setIsLoading] = useState(true);
const [currentChallengeIndex, setCurrentChallengeIndex] = useState(0); const [currentChallengeIndex, setCurrentChallengeIndex] = useState(0);
const [totalChallenges, setTotalChallenges] = useState(0); const [totalChallenges, setTotalChallenges] = useState(0);
const [isMobile, setIsMobile] = useState(window.innerWidth <= 480); const [isMobile, setIsMobile] = useState(window.innerWidth <= 480);
@@ -49,7 +50,8 @@ const CaptchaModal = () => {
useEffect(() => { useEffect(() => {
if (challengesArray) { if (isCaptchaOpen && challengesArray) {
setIsLoading(true);
const challenges = challengesArray.challenges; const challenges = challengesArray.challenges;
const decryptedChallenges = []; const decryptedChallenges = [];
@@ -61,8 +63,9 @@ const CaptchaModal = () => {
setImageSources(decryptedChallenges); setImageSources(decryptedChallenges);
setTotalChallenges(decryptedChallenges.length); setTotalChallenges(decryptedChallenges.length);
setIsLoading(false);
} }
}, [challengesArray]); }, [challengesArray, isCaptchaOpen]);
const handleKeyDown = (event) => { const handleKeyDown = (event) => {
@@ -157,7 +160,11 @@ const CaptchaModal = () => {
ref={responseRef} ref={responseRef}
onKeyDown={handleKeyDown} onKeyDown={handleKeyDown}
autoFocus /> autoFocus />
<img src={imageSources[currentChallengeIndex]} alt="captcha" /> {isLoading ? (
<img src="" alt="loading..." style={{ visibility: "hidden" }} />
) : (
imageSources[currentChallengeIndex] && <img src={imageSources[currentChallengeIndex]} alt="captcha" />
)}
</div> </div>
<div> <div>
<span style={{lineHeight: '1.7'}}> <span style={{lineHeight: '1.7'}}>
+81 -28
View File
@@ -1,14 +1,15 @@
import React, { useState, useEffect, useRef } from "react"; import React, { useState, useEffect, useRef } from "react";
import { Link, useLocation, useNavigate } from "react-router-dom"; import { Link, useLocation, useNavigate } from "react-router-dom";
import Modal from "react-modal"; import Modal from "react-modal";
import { deleteCaches, exportAccount, importAccount, setAccount, setActiveAccount, useAccount, useAccounts, useResolvedAuthorAddress } from "@plebbit/plebbit-react-hooks"; import { confirmAlert } from "react-confirm-alert";
import { deleteAccount, deleteCaches, exportAccount, importAccount, setAccount, setActiveAccount, useAccount, useAccounts, useResolvedAuthorAddress } from "@plebbit/plebbit-react-hooks";
import { StyledModal } from "../styled/modals/SettingsModal.styled"; import { StyledModal } from "../styled/modals/SettingsModal.styled";
import useError from "../../hooks/useError"; import useError from "../../hooks/useError";
import useSuccess from "../../hooks/useSuccess"; import useSuccess from "../../hooks/useSuccess";
import useAnonModeStore from '../../hooks/stores/useAnonModeStore'; import useAnonModeStore from '../../hooks/stores/useAnonModeStore';
import useGeneralStore from '../../hooks/stores/useGeneralStore'; import useGeneralStore from '../../hooks/stores/useGeneralStore';
import packageJson from '../../../package.json' import packageJson from '../../../package.json';
const {version} = packageJson const {version} = packageJson;
const SettingsModal = ({ isOpen, closeModal }) => { const SettingsModal = ({ isOpen, closeModal }) => {
@@ -21,7 +22,7 @@ const SettingsModal = ({ isOpen, closeModal }) => {
const navigate = useNavigate(); const navigate = useNavigate();
const location = useLocation(); const location = useLocation();
const [expanded, setExpanded] = useState([]); const [expanded, setExpanded] = useState([]);
const [accountJson, setAccountJson] = useState(null); const [accountJson, setAccountJson] = useState("");
const [copyStatus, setCopyStatus] = useState(false); const [copyStatus, setCopyStatus] = useState(false);
const [ensName, setEnsName] = useState(''); const [ensName, setEnsName] = useState('');
const [checkedENS, setCheckedENS] = useState(false); const [checkedENS, setCheckedENS] = useState(false);
@@ -42,10 +43,10 @@ const SettingsModal = ({ isOpen, closeModal }) => {
const nameRef = useRef(); const nameRef = useRef();
const ensRef = useRef(); const ensRef = useRef();
const isElectron = window.electron && window.electron.isElectron;
const author = {...account?.author, address: ensName}; const author = {...account?.author, address: ensName};
const { resolvedAddress, state } = useResolvedAuthorAddress({ author, cache: false }); const { resolvedAddress, state } = useResolvedAuthorAddress({ author, cache: false });
const isElectron = window.electron && window.electron.isElectron;
const defaultGatewayUrls = isElectron ? undefined : [ const defaultGatewayUrls = isElectron ? undefined : [
'https://ipfs.io', 'https://ipfs.io',
@@ -70,6 +71,23 @@ const SettingsModal = ({ isOpen, closeModal }) => {
]; ];
useEffect(() => {
if (account) {
const fetchAccountData = async () => {
const data = await exportAccount();
setAccountJson(data);
};
fetchAccountData();
}
}, [account]);
const handleAccountJsonChange = (e) => {
setAccountJson(e.target.value);
};
useEffect(() => { useEffect(() => {
if (checkedENS && resolvedAddress && state === 'succeeded') { if (checkedENS && resolvedAddress && state === 'succeeded') {
setCheckedENS(false); setCheckedENS(false);
@@ -302,8 +320,6 @@ const SettingsModal = ({ isOpen, closeModal }) => {
const handleCloseModal = () => { const handleCloseModal = () => {
setAccountJson(null);
if (location.pathname.endsWith("/settings")) { if (location.pathname.endsWith("/settings")) {
const newPath = location.pathname.slice(0, -9); const newPath = location.pathname.slice(0, -9);
closeModal(); closeModal();
@@ -344,13 +360,31 @@ const SettingsModal = ({ isOpen, closeModal }) => {
}, [setNewSuccessMessage]); }, [setNewSuccessMessage]);
const handleExport = async () => { const handleSaveAccount = async () => {
const activeAccountJson = await exportAccount(); try {
setAccountJson(activeAccountJson); const parsedJson = JSON.parse(accountJson);
await setAccount(parsedJson);
setNewSuccessMessage("Account Data Saved Successfully");
} catch (error) {
setNewErrorMessage("Error saving account data: " + error.message);
console.error(error);
}
}; };
const handleImport = async () => { const handleResetAccount = async () => {
try {
const data = await exportAccount();
setAccountJson(data);
setNewSuccessMessage("Account Data Reset Successfully");
} catch (error) {
setNewErrorMessage("Error resetting account data: " + error.message);
console.error(error);
}
};
const handleImportAccount = async () => {
const accountJson = importRef.current.value; const accountJson = importRef.current.value;
try { try {
@@ -364,6 +398,21 @@ const SettingsModal = ({ isOpen, closeModal }) => {
} }
}; };
const handleDeleteAccount = async () => {
if (window.confirm("Are you sure you want to delete this account?")) {
try {
await deleteAccount(account?.name);
localStorage.setItem("successToast", "Account Deleted Successfully");
window.location.reload();
} catch (error) {
setNewErrorMessage("Error deleting account: " + error.message);
console.error(error);
}
}
};
const handleAccountChange = (e) => { const handleAccountChange = (e) => {
setActiveAccount(e.target.value); setActiveAccount(e.target.value);
}; };
@@ -427,15 +476,6 @@ const SettingsModal = ({ isOpen, closeModal }) => {
<span className="settings-pointer" style={{cursor: "pointer"}} <span className="settings-pointer" style={{cursor: "pointer"}}
onClick={() => toggleExpanded(1)} onClick={() => toggleExpanded(1)}
>Account</span> >Account</span>
<div className="plebbit-options-buttons"
style={{ display: expanded.includes(1) ? 'block' : 'none' }}
>
<button className="save-button"
onClick={handleExport}>Export</button>
<button className="reset-button"
onClick={handleImport}
>Import</button>
</div>
</li> </li>
<ul className="settings-cat" style={{ display: expanded.includes(1) ? 'block' : 'none' }}> <ul className="settings-cat" style={{ display: expanded.includes(1) ? 'block' : 'none' }}>
<li className="anon-off"> <li className="anon-off">
@@ -458,14 +498,27 @@ const SettingsModal = ({ isOpen, closeModal }) => {
Account Data Account Data
</li> </li>
<li className="settings-tip"> <li className="settings-tip">
To export, click "Export", then save your account data displayed below in a safe place. To import, paste your account data into the box below, then click "Import". To save manual changes, click "Save". To undo changes, click "Reset". To delete the account and create a new one, click "Delete". To add another account, paste its data and click "Import".
</li> </li>
<div className="settings-input"> <div className="settings-input">
{accountJson ? ( <textarea id="account-data-text"
<textarea value={accountJson} readOnly /> value={accountJson}
): ( ref={importRef}
<textarea ref={importRef} /> onChange={handleAccountJsonChange} />
)} <div className="account-buttons">
<button onClick={handleSaveAccount}>
Save
</button>
<button onClick={handleResetAccount}>
Reset
</button>
<button onClick={handleImportAccount}>
Import
</button>
<button onClick={handleDeleteAccount}>
Delete
</button>
</div>
</div> </div>
<li className="settings-option disc"> <li className="settings-option disc">
Account Address: u/{account?.author.shortAddress} Account Address: u/{account?.author.shortAddress}
@@ -634,14 +687,14 @@ const SettingsModal = ({ isOpen, closeModal }) => {
ref={ethereumRpcRef} ref={ethereumRpcRef}
/> />
</div> </div>
{/* <li className="settings-option disc">Polygon RPC</li> <li className="settings-option disc">Polygon RPC</li>
<li className="settings-tip">Needed for XPLEB NFTs.</li> <li className="settings-tip">Needed for XPLEB NFTs.</li>
<div className="settings-input"> <div className="settings-input">
<textarea placeholder="Polygon RPC URLs" <textarea placeholder="Polygon RPC URLs"
defaultValue={account?.plebbitOptions?.chainProviders?.['matic']?.urls.join("\n")} defaultValue={account?.plebbitOptions?.chainProviders?.['matic']?.urls.join("\n")}
ref={polygonRpcRef} ref={polygonRpcRef}
/> />
</div> */} </div>
</ul> </ul>
</ul> </ul>
<div> <div>
@@ -0,0 +1,77 @@
import styled from 'styled-components';
export const AlertModal = styled.div`
.author-delete-alert {
padding: 20px;
border: 1px solid #ccc;
position: fixed;
top: 40%;
left: 50%;
transform: translate(-50%, -50%);
.author-delete-buttons {
display: flex;
justify-content: center;
& > button {
margin-top: 10px;
}
& > button:first-child {
margin-right: 20px;
}
}
}
${({ selectedStyle }) => {
switch (selectedStyle) {
case 'Yotsuba':
return `
.author-delete-alert {
background-color: #f0e0d6;
border: 1px solid #d9bfb7;
}`;
case 'Yotsuba-B':
return `
.author-delete-alert {
background-color: #d6daf0;
border: 1px solid #b7c5d9;
}`;
case 'Futaba':
return `
.author-delete-alert {
background-color: #f0e0d6;
border: 1px solid #d9bfb7;
}`;
case 'Burichan':
return `
.author-delete-alert {
background-color: #d6daf0;
border: 1px solid #b7c5d9;
}`;
case 'Tomorrow':
return `
.author-delete-alert {
background-color: #282a2e;
border: 1px solid #111;
}`;
case 'Photon':
return `
.author-delete-alert {
background-color: #ddd;
border: 1px solid #ccc;
}`;
default:
return '';
}
}}
`;
@@ -58,6 +58,7 @@ export const StyledModal = styled(Modal)`
position: relative; position: relative;
clear: both; clear: both;
width: 302px; width: 302px;
height: 100px;
overflow: hidden; overflow: hidden;
margin-bottom: 3px; margin-bottom: 3px;
} }
@@ -87,9 +87,24 @@ export const StyledModal = styled(Modal)`
} }
textarea { textarea {
width: 80%; min-width: 80%;
margin-left: 7%;
min-height: 50px; min-height: 50px;
margin-left: 7%;
}
#account-data-text {
min-width: 70%;
min-height: 105px;
}
.account-buttons {
display: inline-block;
position: absolute;
margin: 5px 5px 5px 10px;
button {
margin-bottom: 5px;
}
} }
.all-div { .all-div {
@@ -23,6 +23,11 @@ export const Threads = styled.div`
max-height: 150px; max-height: 150px;
} }
.file-thumb {
background-color: rgba(0, 0, 0, 0.05);
display: inline-block;
}
.card { .card {
display: inline; display: inline;
margin: auto; margin: auto;
@@ -87,6 +92,19 @@ export const Threads = styled.div`
display: block; display: block;
padding: 0 15px; padding: 0 15px;
} }
${({ selectedStyle }) => {
switch (selectedStyle) {
case 'Tomorrow':
return `
.file-thumb {
background-color: rgba(255, 255, 255, 0.01) !important;
}
`;
default:
return '';
}
}}
`; `;
export const PostMenuCatalog = styled.div` export const PostMenuCatalog = styled.div`
@@ -3240,79 +3240,3 @@ export const Footer = styled.div`
} }
}} }}
`; `;
export const AuthorDeleteAlert = styled.div`
.author-delete-alert {
padding: 20px;
border: 1px solid #ccc;
position: fixed;
top: 40%;
left: 50%;
transform: translate(-50%, -50%);
.author-delete-buttons {
display: flex;
justify-content: center;
& > button {
margin-top: 10px;
}
& > button:first-child {
margin-right: 20px;
}
}
}
${({ selectedStyle }) => {
switch (selectedStyle) {
case 'Yotsuba':
return `
.author-delete-alert {
background-color: #f0e0d6;
border: 1px solid #d9bfb7;
}`;
case 'Yotsuba-B':
return `
.author-delete-alert {
background-color: #d6daf0;
border: 1px solid #b7c5d9;
}`;
case 'Futaba':
return `
.author-delete-alert {
background-color: #f0e0d6;
border: 1px solid #d9bfb7;
}`;
case 'Burichan':
return `
.author-delete-alert {
background-color: #d6daf0;
border: 1px solid #b7c5d9;
}`;
case 'Tomorrow':
return `
.author-delete-alert {
background-color: #282a2e;
border: 1px solid #111;
}`;
case 'Photon':
return `
.author-delete-alert {
background-color: #ddd;
border: 1px solid #ccc;
}`;
default:
return '';
}
}}
`;
+6 -5
View File
@@ -9,8 +9,9 @@ import { useAccount, useAccountComments, useFeed, usePublishCommentEdit, useSubp
import { flattenCommentsPages } from '@plebbit/plebbit-react-hooks/dist/lib/utils' import { flattenCommentsPages } from '@plebbit/plebbit-react-hooks/dist/lib/utils'
import { debounce } from 'lodash'; import { debounce } from 'lodash';
import { Container, NavBar, Header, Break, TopBar, BoardForm, PostMenu } from '../styled/views/Board.styled'; import { Container, NavBar, Header, Break, TopBar, BoardForm, PostMenu } from '../styled/views/Board.styled';
import { AuthorDeleteAlert, Footer } from '../styled/views/Thread.styled'; import { Footer } from '../styled/views/Thread.styled';
import { PostMenuCatalog } from '../styled/views/Catalog.styled'; import { PostMenuCatalog } from '../styled/views/Catalog.styled';
import { AlertModal } from '../styled/modals/AlertModal.styled';
import EditModal from '../modals/EditModal'; import EditModal from '../modals/EditModal';
import EditLabel from '../EditLabel'; import EditLabel from '../EditLabel';
import ImageBanner from '../ImageBanner'; import ImageBanner from '../ImageBanner';
@@ -40,8 +41,8 @@ import useFeedStateString from '../../hooks/useFeedStateString';
import useSuccess from '../../hooks/useSuccess'; import useSuccess from '../../hooks/useSuccess';
import useAnonModeStore from '../../hooks/stores/useAnonModeStore'; import useAnonModeStore from '../../hooks/stores/useAnonModeStore';
import useGeneralStore from '../../hooks/stores/useGeneralStore'; import useGeneralStore from '../../hooks/stores/useGeneralStore';
import packageJson from '../../../package.json' import packageJson from '../../../package.json';
const {version} = packageJson const {version} = packageJson;
let lastVirtuosoStates = {}; let lastVirtuosoStates = {};
@@ -419,7 +420,7 @@ const All = () => {
confirmAlert({ confirmAlert({
customUI: ({ onClose }) => { customUI: ({ onClose }) => {
return ( return (
<AuthorDeleteAlert selectedStyle={selectedStyle}> <AlertModal selectedStyle={selectedStyle}>
<div className='author-delete-alert'> <div className='author-delete-alert'>
<p>Are you sure you want to delete this post?</p> <p>Are you sure you want to delete this post?</p>
<div className="author-delete-buttons"> <div className="author-delete-buttons">
@@ -442,7 +443,7 @@ const All = () => {
</button> </button>
</div> </div>
</div> </div>
</AuthorDeleteAlert> </AlertModal>
); );
} }
}); });
+35 -17
View File
@@ -9,7 +9,8 @@ import { useAccount, useFeed, usePublishCommentEdit, useSubplebbit, useSubplebbi
import { debounce } from 'lodash'; import { debounce } from 'lodash';
import { Container, NavBar, Header, Break, PostMenu, BoardForm } from '../styled/views/Board.styled'; import { Container, NavBar, Header, Break, PostMenu, BoardForm } from '../styled/views/Board.styled';
import { Threads, PostMenuCatalog } from '../styled/views/Catalog.styled'; import { Threads, PostMenuCatalog } from '../styled/views/Catalog.styled';
import { TopBar, Footer, AuthorDeleteAlert } from '../styled/views/Thread.styled'; import { TopBar, Footer } from '../styled/views/Thread.styled';
import { AlertModal } from '../styled/modals/AlertModal.styled';
import CatalogLoader from '../CatalogLoader'; import CatalogLoader from '../CatalogLoader';
import EditModal from '../modals/EditModal'; import EditModal from '../modals/EditModal';
import ImageBanner from '../ImageBanner'; import ImageBanner from '../ImageBanner';
@@ -27,9 +28,9 @@ import useFeedStateString from '../../hooks/useFeedStateString';
import useSuccess from '../../hooks/useSuccess'; import useSuccess from '../../hooks/useSuccess';
import useWindowWidth from '../../hooks/useWindowWidth'; import useWindowWidth from '../../hooks/useWindowWidth';
import useGeneralStore from '../../hooks/stores/useGeneralStore'; import useGeneralStore from '../../hooks/stores/useGeneralStore';
import packageJson from '../../../package.json' import packageJson from '../../../package.json';
const {version} = packageJson const {version} = packageJson;
let lastVirtuosoStates = {} let lastVirtuosoStates = {};
const CatalogPost = ({post}) => { const CatalogPost = ({post}) => {
@@ -116,7 +117,7 @@ const CatalogPost = ({post}) => {
confirmAlert({ confirmAlert({
customUI: ({ onClose }) => { customUI: ({ onClose }) => {
return ( return (
<AuthorDeleteAlert selectedStyle={selectedStyle}> <AlertModal selectedStyle={selectedStyle}>
<div className='author-delete-alert'> <div className='author-delete-alert'>
<p>Are you sure you want to delete this post?</p> <p>Are you sure you want to delete this post?</p>
<div className="author-delete-buttons"> <div className="author-delete-buttons">
@@ -139,7 +140,7 @@ const CatalogPost = ({post}) => {
</button> </button>
</div> </div>
</div> </div>
</AuthorDeleteAlert> </AlertModal>
); );
} }
}); });
@@ -265,6 +266,17 @@ const CatalogPost = ({post}) => {
}, [triggerPublishCommentEdit, publishCommentEdit, publishCommentEditOptions]); }, [triggerPublishCommentEdit, publishCommentEdit, publishCommentEditOptions]);
let displayWidth, displayHeight;
if (thread.linkWidth && thread.linkHeight) {
let scale = Math.min(1, 150 / Math.max(thread.linkWidth, thread.linkHeight));
displayWidth = `${thread.linkWidth * scale}px`;
displayHeight = `${thread.linkHeight * scale}px`;
} else {
displayWidth = '150px';
displayHeight = '150px';
}
return ( return (
<div key={`thread-`} className="thread" <div key={`thread-`} className="thread"
onMouseOver={() => {setIsHoveringOnThread(thread.cid)}} onMouseOver={() => {setIsHoveringOnThread(thread.cid)}}
@@ -274,26 +286,32 @@ const CatalogPost = ({post}) => {
onClick={() => setSelectedThread(thread.cid)}> onClick={() => setSelectedThread(thread.cid)}>
{commentMediaInfo?.type === "webpage" ? ( {commentMediaInfo?.type === "webpage" ? (
thread.thumbnailUrl ? ( thread.thumbnailUrl ? (
<img className="card" key={`img-`} <span className="file-thumb" style={{width: displayWidth, height: displayHeight}}>
src={commentMediaInfo.thumbnail} alt={commentMediaInfo.type} <img className="card" key={`img-`}
onError={(e) => { src={commentMediaInfo.thumbnail} alt={commentMediaInfo.type}
e.target.src = fallbackImgUrl onError={(e) => {
e.target.onerror = null; e.target.src = fallbackImgUrl
}} /> e.target.onerror = null;
}} />
</span>
) : null ) : null
) : null} ) : null}
{commentMediaInfo?.type === "image" ? ( {commentMediaInfo?.type === "image" ? (
<img className="card" key={`img-`} <span className="file-thumb" style={{width: displayWidth, height: displayHeight}}>
src={commentMediaInfo.url} alt={commentMediaInfo.type} <img className="card" key={`img-`}
onError={(e) => { src={commentMediaInfo.url} alt={commentMediaInfo.type}
e.target.src = fallbackImgUrl onError={(e) => {
e.target.onerror = null;}} /> e.target.src = fallbackImgUrl
e.target.onerror = null;}} />
</span>
) : null} ) : null}
{commentMediaInfo?.type === "video" ? ( {commentMediaInfo?.type === "video" ? (
<span className="file-thumb" style={{width: displayWidth, height: displayHeight}}>
<video className="card" key={`fti-`} <video className="card" key={`fti-`}
src={commentMediaInfo.url} src={commentMediaInfo.url}
alt={commentMediaInfo.type} alt={commentMediaInfo.type}
onError={(e) => e.target.src = fallbackImgUrl} /> onError={(e) => e.target.src = fallbackImgUrl} />
</span>
) : null} ) : null}
{commentMediaInfo?.type === "audio" ? ( {commentMediaInfo?.type === "audio" ? (
<audio className="card" controls <audio className="card" controls
+6 -5
View File
@@ -9,7 +9,8 @@ import { useAccount, useAccountComments, useFeed, usePublishComment, usePublishC
import { flattenCommentsPages } from '@plebbit/plebbit-react-hooks/dist/lib/utils' import { flattenCommentsPages } from '@plebbit/plebbit-react-hooks/dist/lib/utils'
import { debounce } from 'lodash'; import { debounce } from 'lodash';
import { Container, NavBar, Header, Break, PostFormLink, PostFormTable, PostForm, TopBar, BoardForm, PostMenu } from '../styled/views/Board.styled'; import { Container, NavBar, Header, Break, PostFormLink, PostFormTable, PostForm, TopBar, BoardForm, PostMenu } from '../styled/views/Board.styled';
import { Footer, AuthorDeleteAlert } from '../styled/views/Thread.styled'; import { Footer } from '../styled/views/Thread.styled';
import { AlertModal } from '../styled/modals/AlertModal.styled';
import { PostMenuCatalog } from '../styled/views/Catalog.styled'; import { PostMenuCatalog } from '../styled/views/Catalog.styled';
import EditModal from '../modals/EditModal'; import EditModal from '../modals/EditModal';
import EditLabel from '../EditLabel'; import EditLabel from '../EditLabel';
@@ -42,8 +43,8 @@ import useStateString from '../../hooks/useStateString';
import useSuccess from '../../hooks/useSuccess'; import useSuccess from '../../hooks/useSuccess';
import useAnonModeStore from '../../hooks/stores/useAnonModeStore'; import useAnonModeStore from '../../hooks/stores/useAnonModeStore';
import useGeneralStore from '../../hooks/stores/useGeneralStore'; import useGeneralStore from '../../hooks/stores/useGeneralStore';
import packageJson from '../../../package.json' import packageJson from '../../../package.json';
const {version} = packageJson const {version} = packageJson;
let lastVirtuosoStates = {}; let lastVirtuosoStates = {};
@@ -573,7 +574,7 @@ const Board = () => {
confirmAlert({ confirmAlert({
customUI: ({ onClose }) => { customUI: ({ onClose }) => {
return ( return (
<AuthorDeleteAlert selectedStyle={selectedStyle}> <AlertModal selectedStyle={selectedStyle}>
<div className='author-delete-alert'> <div className='author-delete-alert'>
<p>Are you sure you want to delete this post?</p> <p>Are you sure you want to delete this post?</p>
<div className="author-delete-buttons"> <div className="author-delete-buttons">
@@ -596,7 +597,7 @@ const Board = () => {
</button> </button>
</div> </div>
</div> </div>
</AuthorDeleteAlert> </AlertModal>
); );
} }
}); });
+38 -21
View File
@@ -9,7 +9,8 @@ import { useAccount, useFeed, usePublishComment, usePublishCommentEdit, useSubpl
import { debounce } from 'lodash'; import { debounce } from 'lodash';
import { Container, NavBar, Header, Break, PostForm, PostFormLink, PostFormTable, PostMenu, BoardForm } from '../styled/views/Board.styled'; import { Container, NavBar, Header, Break, PostForm, PostFormLink, PostFormTable, PostMenu, BoardForm } from '../styled/views/Board.styled';
import { Threads, PostMenuCatalog } from '../styled/views/Catalog.styled'; import { Threads, PostMenuCatalog } from '../styled/views/Catalog.styled';
import { TopBar, Footer, AuthorDeleteAlert } from '../styled/views/Thread.styled'; import { TopBar, Footer } from '../styled/views/Thread.styled';
import { AlertModal } from '../styled/modals/AlertModal.styled';
import CatalogLoader from '../CatalogLoader'; import CatalogLoader from '../CatalogLoader';
import EditModal from '../modals/EditModal'; import EditModal from '../modals/EditModal';
import ImageBanner from '../ImageBanner'; import ImageBanner from '../ImageBanner';
@@ -30,9 +31,9 @@ import useAnonModeStore from '../../hooks/stores/useAnonModeStore';
import useFeedRows from '../../hooks/useFeedRows'; import useFeedRows from '../../hooks/useFeedRows';
import useGeneralStore from '../../hooks/stores/useGeneralStore'; import useGeneralStore from '../../hooks/stores/useGeneralStore';
import useWindowWidth from '../../hooks/useWindowWidth'; import useWindowWidth from '../../hooks/useWindowWidth';
import packageJson from '../../../package.json' import packageJson from '../../../package.json';
const {version} = packageJson const {version} = packageJson;
let lastVirtuosoStates = {} let lastVirtuosoStates = {};
const CatalogPost = ({post}) => { const CatalogPost = ({post}) => {
@@ -111,7 +112,7 @@ const CatalogPost = ({post}) => {
confirmAlert({ confirmAlert({
customUI: ({ onClose }) => { customUI: ({ onClose }) => {
return ( return (
<AuthorDeleteAlert selectedStyle={selectedStyle}> <AlertModal selectedStyle={selectedStyle}>
<div className='author-delete-alert'> <div className='author-delete-alert'>
<p>Are you sure you want to delete this post?</p> <p>Are you sure you want to delete this post?</p>
<div className="author-delete-buttons"> <div className="author-delete-buttons">
@@ -134,7 +135,7 @@ const CatalogPost = ({post}) => {
</button> </button>
</div> </div>
</div> </div>
</AuthorDeleteAlert> </AlertModal>
); );
} }
}); });
@@ -254,6 +255,16 @@ const CatalogPost = ({post}) => {
}; };
let displayWidth, displayHeight;
if (thread.linkWidth && thread.linkHeight) {
let scale = Math.min(1, 150 / Math.max(thread.linkWidth, thread.linkHeight));
displayWidth = `${thread.linkWidth * scale}px`;
displayHeight = `${thread.linkHeight * scale}px`;
} else {
displayWidth = '150px';
displayHeight = '150px';
}
if (post.type === 'rules') { if (post.type === 'rules') {
return ( return (
@@ -452,26 +463,32 @@ const CatalogPost = ({post}) => {
onClick={() => setSelectedThread(thread.cid)}> onClick={() => setSelectedThread(thread.cid)}>
{commentMediaInfo?.type === "webpage" ? ( {commentMediaInfo?.type === "webpage" ? (
thread.thumbnailUrl ? ( thread.thumbnailUrl ? (
<img className="card" key={`img-`} <span className="file-thumb" style={{width: displayWidth, height: displayHeight}}>
src={commentMediaInfo.thumbnail} alt={commentMediaInfo.type} <img className="card" key={`img-`}
onError={(e) => { src={commentMediaInfo.thumbnail} alt={commentMediaInfo.type}
e.target.src = fallbackImgUrl onError={(e) => {
e.target.onerror = null; e.target.src = fallbackImgUrl
}} /> e.target.onerror = null;
}} />
</span>
) : null ) : null
) : null} ) : null}
{commentMediaInfo?.type === "image" ? ( {commentMediaInfo?.type === "image" ? (
<img className="card" key={`img-`} <span className="file-thumb" style={{width: displayWidth, height: displayHeight}}>
src={commentMediaInfo.url} alt={commentMediaInfo.type} <img className="card" key={`img-`}
onError={(e) => { src={commentMediaInfo.url} alt={commentMediaInfo.type}
e.target.src = fallbackImgUrl onError={(e) => {
e.target.onerror = null;}} /> e.target.src = fallbackImgUrl
e.target.onerror = null;}} />
</span>
) : null} ) : null}
{commentMediaInfo?.type === "video" ? ( {commentMediaInfo?.type === "video" ? (
<video className="card" key={`fti-`} <span className="file-thumb" style={{width: displayWidth, height: displayHeight}}>
src={commentMediaInfo.url} <video className="card" key={`fti-`}
alt={commentMediaInfo.type} src={commentMediaInfo.url}
onError={(e) => e.target.src = fallbackImgUrl} /> alt={commentMediaInfo.type}
onError={(e) => e.target.src = fallbackImgUrl} />
</span>
) : null} ) : null}
{commentMediaInfo?.type === "audio" ? ( {commentMediaInfo?.type === "audio" ? (
<audio className="card" controls <audio className="card" controls
+2 -2
View File
@@ -18,8 +18,8 @@ import getDate from '../../utils/getDate';
import handleImageClick from '../../utils/handleImageClick'; import handleImageClick from '../../utils/handleImageClick';
import handleStyleChange from '../../utils/handleStyleChange'; import handleStyleChange from '../../utils/handleStyleChange';
import useGeneralStore from '../../hooks/stores/useGeneralStore'; import useGeneralStore from '../../hooks/stores/useGeneralStore';
import packageJson from '../../../package.json' import packageJson from '../../../package.json';
const {version} = packageJson const {version} = packageJson;
const Description = () => { const Description = () => {
+4 -4
View File
@@ -7,9 +7,9 @@ import BoardAvatar from '../BoardAvatar';
import OfflineIndicator from '../OfflineIndicator'; import OfflineIndicator from '../OfflineIndicator';
import CreateBoardModal from '../modals/CreateBoardModal'; import CreateBoardModal from '../modals/CreateBoardModal';
import useGeneralStore from '../../hooks/stores/useGeneralStore'; import useGeneralStore from '../../hooks/stores/useGeneralStore';
import packageJson from '../../../package.json' import packageJson from '../../../package.json';
import { Tooltip } from 'react-tooltip'; import { Tooltip } from 'react-tooltip';
const {version} = packageJson const {version} = packageJson;
// show commit ref on netlify to know which commit is being served for debugging // show commit ref on netlify to know which commit is being served for debugging
const commitRef = process?.env?.REACT_APP_COMMIT_REF ? ` ${process.env.REACT_APP_COMMIT_REF.slice(0, 7)}` : '' const commitRef = process?.env?.REACT_APP_COMMIT_REF ? ` ${process.env.REACT_APP_COMMIT_REF.slice(0, 7)}` : ''
@@ -85,7 +85,7 @@ const Home = () => {
(event) => { (event) => {
if (event.key === "Enter") { if (event.key === "Enter") {
event.preventDefault(); event.preventDefault();
const address = inputRef.current.value; const address = inputRef.current.value.toLowerCase();;
if (address) { if (address) {
setSelectedAddress(address); setSelectedAddress(address);
navigate(`/p/${address}`) navigate(`/p/${address}`)
@@ -94,7 +94,7 @@ const Home = () => {
}} /> }} />
<input type="submit" value="Search" onClick={ <input type="submit" value="Search" onClick={
() => { () => {
const address = inputRef.current.value; const address = inputRef.current.value.toLowerCase();;
if (address) { if (address) {
setSelectedAddress(address); setSelectedAddress(address);
navigate(`/p/${address}`) navigate(`/p/${address}`)
+2 -2
View File
@@ -2,8 +2,8 @@ import React, { useEffect } from 'react';
import { Helmet } from 'react-helmet-async'; import { Helmet } from 'react-helmet-async';
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
import { Container, Header, Logo, Page, Boards, BoardsTitle } from '../styled/views/Home.styled'; import { Container, Header, Logo, Page, Boards, BoardsTitle } from '../styled/views/Home.styled';
import packageJson from '../../../package.json' import packageJson from '../../../package.json';
const {version} = packageJson const {version} = packageJson;
const NotFound = () => { const NotFound = () => {
+2 -2
View File
@@ -18,8 +18,8 @@ import handleQuoteClick from '../../utils/handleQuoteClick';
import handleStyleChange from '../../utils/handleStyleChange'; import handleStyleChange from '../../utils/handleStyleChange';
import useError from '../../hooks/useError'; import useError from '../../hooks/useError';
import useStateString from '../../hooks/useStateString'; import useStateString from '../../hooks/useStateString';
import packageJson from '../../../package.json' import packageJson from '../../../package.json';
const {version} = packageJson const {version} = packageJson;
const Pending = () => { const Pending = () => {
+2 -2
View File
@@ -16,8 +16,8 @@ import SettingsModal from '../modals/SettingsModal';
import getDate from '../../utils/getDate'; import getDate from '../../utils/getDate';
import handleStyleChange from '../../utils/handleStyleChange'; import handleStyleChange from '../../utils/handleStyleChange';
import useGeneralStore from '../../hooks/stores/useGeneralStore'; import useGeneralStore from '../../hooks/stores/useGeneralStore';
import packageJson from '../../../package.json' import packageJson from '../../../package.json';
const {version} = packageJson const {version} = packageJson;
const Rules = () => { const Rules = () => {
+6 -5
View File
@@ -10,7 +10,8 @@ import { flattenCommentsPages } from '@plebbit/plebbit-react-hooks/dist/lib/util
import { debounce } from 'lodash'; import { debounce } from 'lodash';
import useGeneralStore from '../../hooks/stores/useGeneralStore'; import useGeneralStore from '../../hooks/stores/useGeneralStore';
import { Container, NavBar, Header, Break, TopBar, BoardForm, PostMenu } from '../styled/views/Board.styled'; import { Container, NavBar, Header, Break, TopBar, BoardForm, PostMenu } from '../styled/views/Board.styled';
import { AuthorDeleteAlert, Footer } from '../styled/views/Thread.styled'; import { Footer } from '../styled/views/Thread.styled';
import { AlertModal } from '../styled/modals/AlertModal.styled';
import { PostMenuCatalog } from '../styled/views/Catalog.styled'; import { PostMenuCatalog } from '../styled/views/Catalog.styled';
import EditModal from '../modals/EditModal'; import EditModal from '../modals/EditModal';
import EditLabel from '../EditLabel'; import EditLabel from '../EditLabel';
@@ -40,8 +41,8 @@ import useError from '../../hooks/useError';
import useFeedStateString from '../../hooks/useFeedStateString'; import useFeedStateString from '../../hooks/useFeedStateString';
import useSuccess from '../../hooks/useSuccess'; import useSuccess from '../../hooks/useSuccess';
import useAnonModeStore from '../../hooks/stores/useAnonModeStore'; import useAnonModeStore from '../../hooks/stores/useAnonModeStore';
import packageJson from '../../../package.json' import packageJson from '../../../package.json';
const {version} = packageJson const {version} = packageJson;
let lastVirtuosoStates = {}; let lastVirtuosoStates = {};
@@ -421,7 +422,7 @@ const Subscriptions = () => {
confirmAlert({ confirmAlert({
customUI: ({ onClose }) => { customUI: ({ onClose }) => {
return ( return (
<AuthorDeleteAlert selectedStyle={selectedStyle}> <AlertModal selectedStyle={selectedStyle}>
<div className='author-delete-alert'> <div className='author-delete-alert'>
<p>Are you sure you want to delete this post?</p> <p>Are you sure you want to delete this post?</p>
<div className="author-delete-buttons"> <div className="author-delete-buttons">
@@ -444,7 +445,7 @@ const Subscriptions = () => {
</button> </button>
</div> </div>
</div> </div>
</AuthorDeleteAlert> </AlertModal>
); );
} }
}); });
+38 -18
View File
@@ -9,7 +9,8 @@ import { useAccount, useFeed, usePublishCommentEdit, useSubplebbit, useSubplebbi
import { debounce } from 'lodash'; import { debounce } from 'lodash';
import { Container, NavBar, Header, Break, PostMenu, BoardForm } from '../styled/views/Board.styled'; import { Container, NavBar, Header, Break, PostMenu, BoardForm } from '../styled/views/Board.styled';
import { Threads, PostMenuCatalog } from '../styled/views/Catalog.styled'; import { Threads, PostMenuCatalog } from '../styled/views/Catalog.styled';
import { TopBar, Footer, AuthorDeleteAlert } from '../styled/views/Thread.styled'; import { TopBar, Footer } from '../styled/views/Thread.styled';
import { AlertModal } from '../styled/modals/AlertModal.styled';
import CatalogLoader from '../CatalogLoader'; import CatalogLoader from '../CatalogLoader';
import EditModal from '../modals/EditModal'; import EditModal from '../modals/EditModal';
import ImageBanner from '../ImageBanner'; import ImageBanner from '../ImageBanner';
@@ -28,8 +29,8 @@ import useGeneralStore from '../../hooks/stores/useGeneralStore';
import useSuccess from '../../hooks/useSuccess'; import useSuccess from '../../hooks/useSuccess';
import useWindowWidth from '../../hooks/useWindowWidth'; import useWindowWidth from '../../hooks/useWindowWidth';
import packageJson from '../../../package.json'; import packageJson from '../../../package.json';
const {version} = packageJson const {version} = packageJson;
let lastVirtuosoStates = {} let lastVirtuosoStates = {};
const CatalogPost = ({post}) => { const CatalogPost = ({post}) => {
@@ -116,7 +117,7 @@ const CatalogPost = ({post}) => {
confirmAlert({ confirmAlert({
customUI: ({ onClose }) => { customUI: ({ onClose }) => {
return ( return (
<AuthorDeleteAlert selectedStyle={selectedStyle}> <AlertModal selectedStyle={selectedStyle}>
<div className='author-delete-alert'> <div className='author-delete-alert'>
<p>Are you sure you want to delete this post?</p> <p>Are you sure you want to delete this post?</p>
<div className="author-delete-buttons"> <div className="author-delete-buttons">
@@ -139,7 +140,7 @@ const CatalogPost = ({post}) => {
</button> </button>
</div> </div>
</div> </div>
</AuthorDeleteAlert> </AlertModal>
); );
} }
}); });
@@ -265,6 +266,17 @@ const CatalogPost = ({post}) => {
}, [triggerPublishCommentEdit, publishCommentEdit, publishCommentEditOptions]); }, [triggerPublishCommentEdit, publishCommentEdit, publishCommentEditOptions]);
let displayWidth, displayHeight;
if (thread.linkWidth && thread.linkHeight) {
let scale = Math.min(1, 150 / Math.max(thread.linkWidth, thread.linkHeight));
displayWidth = `${thread.linkWidth * scale}px`;
displayHeight = `${thread.linkHeight * scale}px`;
} else {
displayWidth = '150px';
displayHeight = '150px';
}
return ( return (
<div key={`thread-`} className="thread" <div key={`thread-`} className="thread"
onMouseOver={() => {setIsHoveringOnThread(thread.cid)}} onMouseOver={() => {setIsHoveringOnThread(thread.cid)}}
@@ -274,26 +286,32 @@ const CatalogPost = ({post}) => {
onClick={() => setSelectedThread(thread.cid)}> onClick={() => setSelectedThread(thread.cid)}>
{commentMediaInfo?.type === "webpage" ? ( {commentMediaInfo?.type === "webpage" ? (
thread.thumbnailUrl ? ( thread.thumbnailUrl ? (
<img className="card" key={`img-`} <span className="file-thumb" style={{width: displayWidth, height: displayHeight}}>
src={commentMediaInfo.thumbnail} alt={commentMediaInfo.type} <img className="card" key={`img-`}
onError={(e) => { src={commentMediaInfo.thumbnail} alt={commentMediaInfo.type}
e.target.src = fallbackImgUrl onError={(e) => {
e.target.onerror = null; e.target.src = fallbackImgUrl
}} /> e.target.onerror = null;
}} />
</span>
) : null ) : null
) : null} ) : null}
{commentMediaInfo?.type === "image" ? ( {commentMediaInfo?.type === "image" ? (
<img className="card" key={`img-`} <span className="file-thumb" style={{width: displayWidth, height: displayHeight}}>
src={commentMediaInfo.url} alt={commentMediaInfo.type} <img className="card" key={`img-`}
onError={(e) => { src={commentMediaInfo.url} alt={commentMediaInfo.type}
e.target.src = fallbackImgUrl onError={(e) => {
e.target.onerror = null;}} /> e.target.src = fallbackImgUrl
e.target.onerror = null;}} />
</span>
) : null} ) : null}
{commentMediaInfo?.type === "video" ? ( {commentMediaInfo?.type === "video" ? (
<span className="file-thumb" style={{width: displayWidth, height: displayHeight}}>
<video className="card" key={`fti-`} <video className="card" key={`fti-`}
src={commentMediaInfo.url} src={commentMediaInfo.url}
alt={commentMediaInfo.type} alt={commentMediaInfo.type}
onError={(e) => e.target.src = fallbackImgUrl} /> onError={(e) => e.target.src = fallbackImgUrl} />
</span>
) : null} ) : null}
{commentMediaInfo?.type === "audio" ? ( {commentMediaInfo?.type === "audio" ? (
<audio className="card" controls <audio className="card" controls
@@ -729,7 +747,7 @@ const SubscriptionsCatalog = () => {
</TopBar> </TopBar>
<Tooltip id="tooltip" className="tooltip" /> <Tooltip id="tooltip" className="tooltip" />
<Threads selectedStyle={selectedStyle}> <Threads selectedStyle={selectedStyle}>
{feed.length > 1 ? ( {account.subscriptions.length > 0 ? (
<Virtuoso <Virtuoso
increaseViewportBy={{bottom: 600, top: 600}} increaseViewportBy={{bottom: 600, top: 600}}
totalCount={rows?.length || 0} totalCount={rows?.length || 0}
@@ -743,7 +761,9 @@ const SubscriptionsCatalog = () => {
restoreStateFrom={lastVirtuosoState} restoreStateFrom={lastVirtuosoState}
initialScrollTop={lastVirtuosoState?.scrollTop} initialScrollTop={lastVirtuosoState?.scrollTop}
/> />
) : (<CatalogLoader />)} ) : (
account.subscriptions.length !== 0 ?
<CatalogLoader /> : null)}
</Threads> </Threads>
<Footer selectedStyle={selectedStyle}> <Footer selectedStyle={selectedStyle}>
<Break id="break" selectedStyle={selectedStyle} style={{ <Break id="break" selectedStyle={selectedStyle} style={{
+6 -5
View File
@@ -8,7 +8,8 @@ import { useAccount, useAccountComments, useComment, usePublishComment, usePubli
import { flattenCommentsPages } from '@plebbit/plebbit-react-hooks/dist/lib/utils' import { flattenCommentsPages } from '@plebbit/plebbit-react-hooks/dist/lib/utils'
import { debounce } from 'lodash'; import { debounce } from 'lodash';
import { Container, NavBar, Header, Break, PostForm, PostFormTable, PostMenu } from '../styled/views/Board.styled'; import { Container, NavBar, Header, Break, PostForm, PostFormTable, PostMenu } from '../styled/views/Board.styled';
import { ReplyFormLink, TopBar, BottomBar, BoardForm, Footer, AuthorDeleteAlert } from '../styled/views/Thread.styled'; import { ReplyFormLink, TopBar, BottomBar, BoardForm, Footer } from '../styled/views/Thread.styled';
import { AlertModal } from '../styled/modals/AlertModal.styled';
import { PostMenuCatalog } from '../styled/views/Catalog.styled'; import { PostMenuCatalog } from '../styled/views/Catalog.styled';
import EditModal from '../modals/EditModal'; import EditModal from '../modals/EditModal';
import EditLabel from '../EditLabel'; import EditLabel from '../EditLabel';
@@ -40,8 +41,8 @@ import useStateString from '../../hooks/useStateString';
import useSuccess from '../../hooks/useSuccess'; import useSuccess from '../../hooks/useSuccess';
import useAnonModeStore from '../../hooks/stores/useAnonModeStore'; import useAnonModeStore from '../../hooks/stores/useAnonModeStore';
import useGeneralStore from '../../hooks/stores/useGeneralStore'; import useGeneralStore from '../../hooks/stores/useGeneralStore';
import packageJson from '../../../package.json' import packageJson from '../../../package.json';
const {version} = packageJson const {version} = packageJson;
const Thread = () => { const Thread = () => {
@@ -513,7 +514,7 @@ const Thread = () => {
confirmAlert({ confirmAlert({
customUI: ({ onClose }) => { customUI: ({ onClose }) => {
return ( return (
<AuthorDeleteAlert selectedStyle={selectedStyle}> <AlertModal selectedStyle={selectedStyle}>
<div className='author-delete-alert'> <div className='author-delete-alert'>
<p>Are you sure you want to delete this post?</p> <p>Are you sure you want to delete this post?</p>
<div className="author-delete-buttons"> <div className="author-delete-buttons">
@@ -536,7 +537,7 @@ const Thread = () => {
</button> </button>
</div> </div>
</div> </div>
</AuthorDeleteAlert> </AlertModal>
); );
} }
}); });
+30 -30
View File
@@ -1445,10 +1445,10 @@
resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.6.2.tgz#1816b5f6948029c5eaacb0703b850ee0cb37d8f8" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.6.2.tgz#1816b5f6948029c5eaacb0703b850ee0cb37d8f8"
integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw== integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==
"@eslint/eslintrc@^2.0.1", "@eslint/eslintrc@^2.1.1": "@eslint/eslintrc@^2.0.1", "@eslint/eslintrc@^2.1.2":
version "2.1.1" version "2.1.2"
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.1.tgz#18d635e24ad35f7276e8a49d135c7d3ca6a46f93" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396"
integrity sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA== integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==
dependencies: dependencies:
ajv "^6.12.4" ajv "^6.12.4"
debug "^4.3.2" debug "^4.3.2"
@@ -1465,10 +1465,10 @@
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.36.0.tgz#9837f768c03a1e4a30bd304a64fb8844f0e72efe" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.36.0.tgz#9837f768c03a1e4a30bd304a64fb8844f0e72efe"
integrity sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg== integrity sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==
"@eslint/js@^8.46.0": "@eslint/js@^8.47.0":
version "8.46.0" version "8.47.0"
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.46.0.tgz#3f7802972e8b6fe3f88ed1aabc74ec596c456db6" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.47.0.tgz#5478fdf443ff8158f9de171c704ae45308696c7d"
integrity sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA== integrity sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==
"@ethersproject/abi@5.6.4": "@ethersproject/abi@5.6.4":
version "5.6.4" version "5.6.4"
@@ -3391,9 +3391,9 @@
form-data "^3.0.0" form-data "^3.0.0"
"@types/node@*", "@types/node@>=13.7.0": "@types/node@*", "@types/node@>=13.7.0":
version "20.4.9" version "20.4.10"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.9.tgz#c7164e0f8d3f12dfae336af0b1f7fdec8c6b204f" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.10.tgz#73c9480791e3ddeb4887a660fc93a7f59353ad45"
integrity sha512-8e2HYcg7ohnTUbHk8focoklEQYvemQmu9M/f43DZVx43kHn0tE3BY/6gSDxS7k0SprtS0NHvj+L80cGLnoOUcQ== integrity sha512-vwzFiiy8Rn6E0MtA13/Cxxgpan/N6UeNYR9oUu6kuJWxu6zCk98trcDp8CBhbtaeuq9SykCmXkFr2lWLoPcvLg==
"@types/node@18.15.13": "@types/node@18.15.13":
version "18.15.13" version "18.15.13"
@@ -4963,9 +4963,9 @@ caniuse-api@^3.0.0:
lodash.uniq "^4.5.0" lodash.uniq "^4.5.0"
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001517: caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001517:
version "1.0.30001519" version "1.0.30001520"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz#3e7b8b8a7077e78b0eb054d69e6edf5c7df35601" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001520.tgz#62e2b7a1c7b35269594cf296a80bdf8cb9565006"
integrity sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg== integrity sha512-tahF5O9EiiTzwTUqAeFjIZbn4Dnqxzz7ktrgGlMYNLH43Ul26IgTMH/zvL3DG0lZxBYnlT04axvInszUsZULdA==
captcha-canvas@3.2.1: captcha-canvas@3.2.1:
version "3.2.1" version "3.2.1"
@@ -6854,10 +6854,10 @@ eslint-visitor-keys@^2.1.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.2: eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
version "3.4.2" version "3.4.3"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz#8c2095440eca8c933bedcadf16fefa44dbe9ba5f" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
integrity sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw== integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
eslint-webpack-plugin@^3.1.1: eslint-webpack-plugin@^3.1.1:
version "3.2.0" version "3.2.0"
@@ -6917,14 +6917,14 @@ eslint@8.36.0:
text-table "^0.2.0" text-table "^0.2.0"
eslint@^8.3.0: eslint@^8.3.0:
version "8.46.0" version "8.47.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.46.0.tgz#a06a0ff6974e53e643acc42d1dcf2e7f797b3552" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.47.0.tgz#c95f9b935463fb4fad7005e626c7621052e90806"
integrity sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg== integrity sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==
dependencies: dependencies:
"@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/eslint-utils" "^4.2.0"
"@eslint-community/regexpp" "^4.6.1" "@eslint-community/regexpp" "^4.6.1"
"@eslint/eslintrc" "^2.1.1" "@eslint/eslintrc" "^2.1.2"
"@eslint/js" "^8.46.0" "@eslint/js" "^8.47.0"
"@humanwhocodes/config-array" "^0.11.10" "@humanwhocodes/config-array" "^0.11.10"
"@humanwhocodes/module-importer" "^1.0.1" "@humanwhocodes/module-importer" "^1.0.1"
"@nodelib/fs.walk" "^1.2.8" "@nodelib/fs.walk" "^1.2.8"
@@ -6935,7 +6935,7 @@ eslint@^8.3.0:
doctrine "^3.0.0" doctrine "^3.0.0"
escape-string-regexp "^4.0.0" escape-string-regexp "^4.0.0"
eslint-scope "^7.2.2" eslint-scope "^7.2.2"
eslint-visitor-keys "^3.4.2" eslint-visitor-keys "^3.4.3"
espree "^9.6.1" espree "^9.6.1"
esquery "^1.4.2" esquery "^1.4.2"
esutils "^2.0.2" esutils "^2.0.2"
@@ -7753,9 +7753,9 @@ globals@^11.1.0:
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
globals@^13.19.0: globals@^13.19.0:
version "13.20.0" version "13.21.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571"
integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==
dependencies: dependencies:
type-fest "^0.20.2" type-fest "^0.20.2"
@@ -12118,9 +12118,9 @@ proto-list@~1.2.1:
integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==
protobufjs@^6.10.2, protobufjs@^6.11.2: protobufjs@^6.10.2, protobufjs@^6.11.2:
version "6.11.3" version "6.11.4"
resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.3.tgz#637a527205a35caa4f3e2a9a4a13ddffe0e7af74" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa"
integrity sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg== integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==
dependencies: dependencies:
"@protobufjs/aspromise" "^1.1.2" "@protobufjs/aspromise" "^1.1.2"
"@protobufjs/base64" "^1.1.2" "@protobufjs/base64" "^1.1.2"