add catalog popups to description and rules

This commit is contained in:
plebeius.eth
2023-09-08 15:29:40 +02:00
parent 876b866348
commit 854a05e4fd
2 changed files with 160 additions and 119 deletions
@@ -150,7 +150,7 @@ export const PostPreview = styled.div`
font-size: 90%; font-size: 90%;
} }
.post-authorAdmin { .post-author-admin {
color: purple; color: purple;
font-weight: 700; font-weight: 700;
} }
+85 -44
View File
@@ -110,6 +110,7 @@ const CatalogPost = ({post}) => {
useLayoutEffect(() => { useLayoutEffect(() => {
const executeLayoutEffectLogic = () => { const executeLayoutEffectLogic = () => {
let ref; let ref;
if (isMediaShowed) { if (isMediaShowed) {
ref = imageRef.current; ref = imageRef.current;
} else { } else {
@@ -348,18 +349,37 @@ const CatalogPost = ({post}) => {
if (post.type === 'rules') { if (post.type === 'rules') {
return ( return (
<div className='thread' <>
onMouseLeave={()=>{handleMouseOnLeaveThread()}}>
{isHoveringOnThread === 'rules' ? {isHoveringOnThread === 'rules' ?
<div style={{left:"100%"}} createPortal(
onMouseOver={() => setIsHoveringOnThread("")} <PostPreview selectedStyle={selectedStyle}>
className={"thread_popup"}> <div ref={popupRef}
<p className="thread_popup_content" style={{color:"white"}}> className="post-preview"
<span className="thread_popup_title">Rules </span> onMouseOver={() => handleMouseOnLeaveThread()}
by style={{
<span className="thread_popup_authorAdmin"> ## Board Admins </span> visibility: isCalculationDone ? 'visible' : 'hidden',
{getFormattedTime(subplebbit.createdAt)}</p> left:
</div> : null } isCalculationDone && spaceOnRight > 250 ? textRect.right + 5 :
isCalculationDone && spaceOnRight < 250 ? textRect.left - popupRect.width - 5
: 'auto',
top: popupPosition.top + 5,
}}>
<span className="post-subject" >
Rules 
</span> by 
<span className="post-author-admin"> ## Board Admins </span>
<span className='post-ago'>
{thread.timestamp ? getFormattedTime(thread.timestamp) : null}
</span>
</div>
</PostPreview>, document.body
)
: null }
<div className='thread'
ref={el => {
threadRefs.current['rules'] = el;
}}
onMouseLeave={()=>{handleMouseOnLeaveThread()}}>
<BoardForm selectedStyle={selectedStyle} style={{all: 'unset'}} <BoardForm selectedStyle={selectedStyle} style={{all: 'unset'}}
onMouseOver={() => { onMouseOver={() => {
setIsHoveringForMenu('rules'); setIsHoveringForMenu('rules');
@@ -424,50 +444,69 @@ const CatalogPost = ({post}) => {
</PostMenuCatalog>, document.body </PostMenuCatalog>, document.body
)} )}
</BoardForm> </BoardForm>
<Link style={{all: "unset", cursor: "pointer"}} to={`/p/${selectedAddress}/rules`} <Link style={{all: "unset", cursor: "pointer"}} to={`/p/${selectedAddress}/rules`}>
<div className="teaser" style={{maxHeight: '312px'}}>
<div style={{cursor: 'text'}}>
<span ref={textRef}
onMouseOver={() => { onMouseOver={() => {
setIsHoveringOnThread('rules');
setIsHoveringForMenu('rules'); setIsHoveringForMenu('rules');
if (!hoverTimeoutId) { const rect = threadRefs.current['rules'].getBoundingClientRect();
const timeoutId = setTimeout(() => { setPopupPosition({top: rect.top + window.scrollY, left: rect.left});
setIsHoveringOnThread("rules");
}, 250);
setHoverTimeoutId(timeoutId);
}
}} }}
onMouseLeave={() => setIsHoveringForMenu(false)}> onMouseLeave={() => setIsHoveringForMenu(false)}>
<div className="teaser" style={{maxHeight: '312px'}}>
<b>Rules</b> <b>Rules</b>
{": " + subplebbit.rules?.map((rule, index) => `${index + 1}. ${rule}`).join(' ')} {": " + subplebbit.rules?.map((rule, index) => `${index + 1}. ${rule}`).join(' ')}
</span>
</div>
</div> </div>
</Link> </Link>
</div> </div>
</>
) )
} else if (post.type === 'description') { } else if (post.type === 'description') {
return ( return (
<> <>
<div className='thread'
onMouseLeave={()=>{handleMouseOnLeaveThread()}}>
{isHoveringOnThread === 'description' ? {isHoveringOnThread === 'description' ?
<div style={{left:"100%"}} createPortal(
onMouseOver={() => setIsHoveringOnThread("")} <PostPreview selectedStyle={selectedStyle}>
className={"thread_popup"}> <div ref={popupRef}
<p className="thread_popup_content" style={{color:"white"}}> className="post-preview"
<span className="thread_popup_title">Welcome to {subplebbit.title || subplebbit.address} </span> onMouseOver={() => handleMouseOnLeaveThread()}
by style={{
<span className="thread_popup_authorAdmin"> ## Board Admins </span> visibility: isCalculationDone ? 'visible' : 'hidden',
{getFormattedTime(subplebbit.createdAt)}</p> left:
</div> : null } isCalculationDone && spaceOnRight > 250
? subplebbit.suggestedAvatarUrl ? imageRect.right + 5 : textRect.right + 5 :
isCalculationDone && spaceOnRight < 250
? subplebbit.suggestedAvatarUrl ? imageRect.left - popupRect.width - 5 : textRect.left - popupRect.width - 5
: 'auto',
top: popupPosition.top + 5,
}}>
<span className="post-subject" >
Welcome to {subplebbit.title || subplebbit.address}
</span> by 
<span className="post-author-admin"> ## Board Admins </span>
<span className='post-ago'>
{thread.timestamp ? getFormattedTime(thread.timestamp) : null}
</span>
</div>
</PostPreview>, document.body
)
: null }
<div className='thread'
ref={el => {
threadRefs.current['description'] = el;
}}
onMouseLeave={()=>{handleMouseOnLeaveThread()}}>
<Link style={{all: 'unset', cursor: 'pointer'}} to={`/p/${selectedAddress}/description`}> <Link style={{all: 'unset', cursor: 'pointer'}} to={`/p/${selectedAddress}/description`}>
{subplebbit.suggested?.avatarUrl ? ( {subplebbit.suggested?.avatarUrl ? (
<img className='card' <img className='card'
onMouseOver={() => { onMouseOver={() => {
setIsHoveringOnThread('description');
setIsHoveringForMenu('description'); setIsHoveringForMenu('description');
if (!hoverTimeoutId) { const rect = threadRefs.current['description'].getBoundingClientRect();
const timeoutId = setTimeout(() => { setPopupPosition({top: rect.top + window.scrollY, left: rect.left});
setIsHoveringOnThread("description");
}, 250);
setHoverTimeoutId(timeoutId);
}
}} }}
onMouseLeave={() => setIsHoveringForMenu(false)} onMouseLeave={() => setIsHoveringForMenu(false)}
src={subplebbit.suggested.avatarUrl} alt="board avatar" /> src={subplebbit.suggested.avatarUrl} alt="board avatar" />
@@ -578,19 +617,21 @@ const CatalogPost = ({post}) => {
)} )}
</BoardForm> </BoardForm>
<Link style={{all: "unset", cursor: "pointer"}} to={`/p/${selectedAddress}/description`} <Link style={{all: "unset", cursor: "pointer"}} to={`/p/${selectedAddress}/description`}
onClick={() => setSelectedThread("description")} onMouseOver={() => { onClick={() => setSelectedThread("description")}>
<div className="teaser" style={{maxHeight: '170px'}}>
<div style={{cursor: 'text'}}>
<span ref={textRef}
onMouseOver={() => {
setIsHoveringOnThread('description');
setIsHoveringForMenu('description'); setIsHoveringForMenu('description');
if (!hoverTimeoutId) { const rect = threadRefs.current['description'].getBoundingClientRect();
const timeoutId = setTimeout(() => { setPopupPosition({top: rect.top + window.scrollY, left: rect.left});
setIsHoveringOnThread("description");
}, 250);
setHoverTimeoutId(timeoutId);
}
}} }}
onMouseLeave={() => setIsHoveringForMenu(false)}> onMouseLeave={() => setIsHoveringForMenu(false)}>
<div className="teaser" style={{maxHeight: '170px'}}>
<b>Welcome to {subplebbit.title || subplebbit.address}!</b> <b>Welcome to {subplebbit.title || subplebbit.address}!</b>
{": " + subplebbit.description} {": " + subplebbit.description}
</span>
</div>
</div> </div>
</Link> </Link>
</div> </div>