feat: fetching blog data

This commit is contained in:
enes 2024-10-31 20:14:29 +01:00
parent c2413e1bd8
commit 3717c3bfb9
7 changed files with 332 additions and 6 deletions

View File

@ -212,7 +212,7 @@ export const Header = () => {
About
</Link>
<Link
to={appRoutes.blog}
to={appRoutes.blogs}
className={navStyles.NavMainBottomInsideLink}
>
Blog

View File

@ -1 +0,0 @@
export const BlogPage = () => <>WIP</>

227
src/pages/blog/index.tsx Normal file
View File

@ -0,0 +1,227 @@
import { LoadingSpinner } from 'components/LoadingSpinner'
import { ProfileSection } from 'components/ProfileSection'
import { useLoaderData } from 'react-router-dom'
import { BlogDetails } from 'types'
export const BlogPage = () => {
const data = useLoaderData() as Partial<BlogDetails>
if (!data) return <LoadingSpinner desc={'Loading...'} />
return (
<div className='InnerBodyMain'>
<div className='ContainerMain'>
<div className='IBMSecMainGroup IBMSecMainGroupAlt'>
<div className='IBMSMSplitMain'>
<div className='IBMSMSplitMainBigSide'>
<div className='IBMSMSplitMainBigSideSec'>
{/* <div className="IBMSMSMBSSModFor">
<p className="IBMSMSMBSSModForPara">Post for:&nbsp;<a className="IBMSMSMBSSModForLink" href="mods-inner.html">Mod Name</a></p>
<div className="dropdown dropdownMain" style="flex-grow: unset;"><button className="btn btnMain btnMainDropdown" aria-expanded="false" data-bs-toggle="dropdown" type="button" style="border-radius: 5px;background: unset;padding: 5px;"><svg xmlns="http://www.w3.org/2000/svg" viewBox="-192 0 512 512" width="1em" height="1em" fill="currentColor">
<path d="M64 360C94.93 360 120 385.1 120 416C120 446.9 94.93 472 64 472C33.07 472 8 446.9 8 416C8 385.1 33.07 360 64 360zM64 200C94.93 200 120 225.1 120 256C120 286.9 94.93 312 64 312C33.07 312 8 286.9 8 256C8 225.1 33.07 200 64 200zM64 152C33.07 152 8 126.9 8 96C8 65.07 33.07 40 64 40C94.93 40 120 65.07 120 96C120 126.9 94.93 152 64 152z"></path>
</svg></button>
<div className="dropdown-menu dropdown-menu-end dropdownMainMenu"><a className="dropdown-item dropdownMainMenuItem" href="submit-mod.html"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="1em" height="1em" fill="currentColor" className="IBMSMSMSSS_Author_Top_Icon">
<path d="M362.7 19.32C387.7-5.678 428.3-5.678 453.3 19.32L492.7 58.75C517.7 83.74 517.7 124.3 492.7 149.3L444.3 197.7L314.3 67.72L362.7 19.32zM421.7 220.3L188.5 453.4C178.1 463.8 165.2 471.5 151.1 475.6L30.77 511C22.35 513.5 13.24 511.2 7.03 504.1C.8198 498.8-1.502 489.7 .976 481.2L36.37 360.9C40.53 346.8 48.16 333.9 58.57 323.5L291.7 90.34L421.7 220.3z"></path>
</svg>Edit</a><a className="dropdown-item dropdownMainMenuItem" href="#"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="1em" height="1em" fill="currentColor" className="IBMSMSMSSS_Author_Top_Icon">
<path d="M384 96L384 0h-112c-26.51 0-48 21.49-48 48v288c0 26.51 21.49 48 48 48H464c26.51 0 48-21.49 48-48V128h-95.1C398.4 128 384 113.6 384 96zM416 0v96h96L416 0zM192 352V128h-144c-26.51 0-48 21.49-48 48v288c0 26.51 21.49 48 48 48h192c26.51 0 48-21.49 48-48L288 416h-32C220.7 416 192 387.3 192 352z"></path>
</svg>Copy URL</a><a className="dropdown-item dropdownMainMenuItem" href="#"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="1em" height="1em" fill="currentColor" className="IBMSMSMSSS_Author_Top_Icon">
<path d="M503.7 226.2l-176 151.1c-15.38 13.3-39.69 2.545-39.69-18.16V272.1C132.9 274.3 66.06 312.8 111.4 457.8c5.031 16.09-14.41 28.56-28.06 18.62C39.59 444.6 0 383.8 0 322.3c0-152.2 127.4-184.4 288-186.3V56.02c0-20.67 24.28-31.46 39.69-18.16l176 151.1C514.8 199.4 514.8 216.6 503.7 226.2z"></path>
</svg>Share</a><a className="dropdown-item dropdownMainMenuItem" id="reportPost" href="#"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="1em" height="1em" fill="currentColor" className="IBMSMSMSSS_Author_Top_Icon">
<path d="M506.3 417l-213.3-364c-16.33-28-57.54-28-73.98 0l-213.2 364C-10.59 444.9 9.849 480 42.74 480h426.6C502.1 480 522.6 445 506.3 417zM232 168c0-13.25 10.75-24 24-24S280 154.8 280 168v128c0 13.25-10.75 24-23.1 24S232 309.3 232 296V168zM256 416c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 401.9 273.4 416 256 416z"></path>
</svg>Report</a><a className="dropdown-item dropdownMainMenuItem" href="#"><svg xmlns="http://www.w3.org/2000/svg" viewBox="-32 0 512 512" width="1em" height="1em" fill="currentColor" className="IBMSMSMSSS_Author_Top_Icon">
<path d="M323.5 51.25C302.8 70.5 284 90.75 267.4 111.1C240.1 73.62 206.2 35.5 168 0C69.75 91.12 0 210 0 281.6C0 408.9 100.2 512 224 512s224-103.1 224-230.4C448 228.4 396 118.5 323.5 51.25zM304.1 391.9C282.4 407 255.8 416 226.9 416c-72.13 0-130.9-47.73-130.9-125.2c0-38.63 24.24-72.64 72.74-130.8c7 8 98.88 125.4 98.88 125.4l58.63-66.88c4.125 6.75 7.867 13.52 11.24 19.9C364.9 290.6 353.4 357.4 304.1 391.9z"></path>
</svg>Block Post</a></div>
</div>
</div> */}
<div className='IBMSMSMBSSPost'>
<div
className='IBMSMSMBSSPostPicture'
style={{
background: `url("https://image.nostr.build/d6af39fb1d47feaf09831ddf9d447ccc435ba10fcbb9b6d6e800390f6bbac851.png") center / cover no-repeat`
}}
></div>
<div className='IBMSMSMBSSPostInside'>
<div className='IBMSMSMBSSPostTitle'>
<h1 className='IBMSMSMBSSPostTitleHeading'>Heading</h1>
</div>
<div className='IBMSMSMBSSPostBody'></div>
<div className='IBMSMSMBSSTags'>
<div className='IBMSMSMBSSTagsTag IBMSMSMBSSTagsTagNSFW'>
<p>NSFW</p>
</div>
<a className='IBMSMSMBSSTagsTag'>Tag 1</a>
<a className='IBMSMSMBSSTagsTag'>Tag 2</a>
<a className='IBMSMSMBSSTagsTag'>Tag 3</a>
</div>
</div>
</div>
{/* <div className="IBMSMSplitMainBigSideSec">
<div className="IBMSMSMBSS_Details">
<a href="#commentsArea" style="text-decoration: unset;color: unset;">
<div className="IBMSMSMBSS_Details_Card IBMSMSMBSS_D_CComments">
<div className="IBMSMSMBSS_Details_CardVisual"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="1em" height="1em" fill="currentColor" className="IBMSMSMBSS_Details_CardVisualIcon">
<path d="M256 31.1c-141.4 0-255.1 93.12-255.1 208c0 49.62 21.35 94.98 56.97 130.7c-12.5 50.37-54.27 95.27-54.77 95.77c-2.25 2.25-2.875 5.734-1.5 8.734c1.249 3 4.021 4.766 7.271 4.766c66.25 0 115.1-31.76 140.6-51.39c32.63 12.25 69.02 19.39 107.4 19.39c141.4 0 255.1-93.13 255.1-207.1S397.4 31.1 256 31.1zM127.1 271.1c-17.75 0-32-14.25-32-31.1s14.25-32 32-32s32 14.25 32 32S145.7 271.1 127.1 271.1zM256 271.1c-17.75 0-31.1-14.25-31.1-31.1s14.25-32 31.1-32s31.1 14.25 31.1 32S273.8 271.1 256 271.1zM383.1 271.1c-17.75 0-32-14.25-32-31.1s14.25-32 32-32s32 14.25 32 32S401.7 271.1 383.1 271.1z"></path>
</svg></div>
<p className="IBMSMSMBSS_Details_CardText">420</p>
</div>
</a>
<div id="reactBolt" className="IBMSMSMBSS_Details_Card IBMSMSMBSS_D_CBolt">
<div className="IBMSMSMBSS_Details_CardVisual"><svg xmlns="http://www.w3.org/2000/svg" viewBox="-64 0 512 512" width="1em" height="1em" fill="currentColor" className="IBMSMSMBSS_Details_CardVisualIcon">
<path d="M240.5 224H352C365.3 224 377.3 232.3 381.1 244.7C386.6 257.2 383.1 271.3 373.1 280.1L117.1 504.1C105.8 513.9 89.27 514.7 77.19 505.9C65.1 497.1 60.7 481.1 66.59 467.4L143.5 288H31.1C18.67 288 6.733 279.7 2.044 267.3C-2.645 254.8 .8944 240.7 10.93 231.9L266.9 7.918C278.2-1.92 294.7-2.669 306.8 6.114C318.9 14.9 323.3 30.87 317.4 44.61L240.5 224z"></path>
</svg></div>
<p className="IBMSMSMBSS_Details_CardText">69k</p>
<div className="IBMSMSMBSSCL_CAElementLoadWrapper">
<div className="IBMSMSMBSSCL_CAElementLoad"></div>
</div>
</div>
<div id="reactUp" className="IBMSMSMBSS_Details_Card IBMSMSMBSS_D_CReactUp IBMSMSMBSS_D_CRUActive">
<div className="IBMSMSMBSS_Details_CardVisual"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="1em" height="1em" fill="currentColor" className="IBMSMSMBSS_Details_CardVisualIcon">
<path d="M0 190.9V185.1C0 115.2 50.52 55.58 119.4 44.1C164.1 36.51 211.4 51.37 244 84.02L256 96L267.1 84.02C300.6 51.37 347 36.51 392.6 44.1C461.5 55.58 512 115.2 512 185.1V190.9C512 232.4 494.8 272.1 464.4 300.4L283.7 469.1C276.2 476.1 266.3 480 256 480C245.7 480 235.8 476.1 228.3 469.1L47.59 300.4C17.23 272.1 .0003 232.4 .0003 190.9L0 190.9z"></path>
</svg></div>
<p className="IBMSMSMBSS_Details_CardText">4.2k</p>
<div className="IBMSMSMBSSCL_CAElementLoadWrapper">
<div className="IBMSMSMBSSCL_CAElementLoad"></div>
</div>
</div>
<div id="reactDown" className="IBMSMSMBSS_Details_Card IBMSMSMBSS_D_CReactDown">
<div className="IBMSMSMBSS_Details_CardVisual"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="1em" height="1em" fill="currentColor" className="IBMSMSMBSS_Details_CardVisualIcon">
<path d="M512 440.1C512 479.9 479.7 512 439.1 512H71.92C32.17 512 0 479.8 0 440c0-35.88 26.19-65.35 60.56-70.85C43.31 356 32 335.4 32 312C32 272.2 64.25 240 104 240h13.99C104.5 228.2 96 211.2 96 192c0-35.38 28.56-64 63.94-64h16C220.1 128 256 92.12 256 48c0-17.38-5.784-33.35-15.16-46.47C245.8 .7754 250.9 0 256 0c53 0 96 43 96 96c0 11.25-2.288 22-5.913 32h5.879C387.3 128 416 156.6 416 192c0 19.25-8.59 36.25-22.09 48H408C447.8 240 480 272.2 480 312c0 23.38-11.38 44.01-28.63 57.14C485.7 374.6 512 404.3 512 440.1z"></path>
</svg></div>
<p className="IBMSMSMBSS_Details_CardText">69</p>
<div className="IBMSMSMBSSCL_CAElementLoadWrapper">
<div className="IBMSMSMBSSCL_CAElementLoad"></div>
</div>
</div>
</div>
</div>
<div className="IBMSMSplitMainBigSideSec">
<div className="IBMSMSMBSSPost_PostDetails">
<div data-bs-toggle="tooltip" data-bss-tooltip="" data-bs-placement="left" className="IBMSMSMBSSPost_PDElement" title="Publish date"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="1em" height="1em" fill="currentColor" className="IBMSMSMBSSPost_PDElementIcon" title="Publish date">
<path d="M480 32H128C110.3 32 96 46.33 96 64v336C96 408.8 88.84 416 80 416S64 408.8 64 400V96H32C14.33 96 0 110.3 0 128v288c0 35.35 28.65 64 64 64h384c35.35 0 64-28.65 64-64V64C512 46.33 497.7 32 480 32zM272 416h-96C167.2 416 160 408.8 160 400C160 391.2 167.2 384 176 384h96c8.836 0 16 7.162 16 16C288 408.8 280.8 416 272 416zM272 320h-96C167.2 320 160 312.8 160 304C160 295.2 167.2 288 176 288h96C280.8 288 288 295.2 288 304C288 312.8 280.8 320 272 320zM432 416h-96c-8.836 0-16-7.164-16-16c0-8.838 7.164-16 16-16h96c8.836 0 16 7.162 16 16C448 408.8 440.8 416 432 416zM432 320h-96C327.2 320 320 312.8 320 304C320 295.2 327.2 288 336 288h96C440.8 288 448 295.2 448 304C448 312.8 440.8 320 432 320zM448 208C448 216.8 440.8 224 432 224h-256C167.2 224 160 216.8 160 208v-96C160 103.2 167.2 96 176 96h256C440.8 96 448 103.2 448 112V208z"></path>
</svg>
<p className="IBMSMSMBSSPost_PDElementText">01/11/2024</p>
</div>
<div data-bs-toggle="tooltip" data-bss-tooltip="" data-bs-placement="left" className="IBMSMSMBSSPost_PDElement" title="Last modified"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="1em" height="1em" fill="currentColor" className="IBMSMSMBSSPost_PDElementIcon">
<path d="M362.7 19.32C387.7-5.678 428.3-5.678 453.3 19.32L492.7 58.75C517.7 83.74 517.7 124.3 492.7 149.3L444.3 197.7L314.3 67.72L362.7 19.32zM421.7 220.3L188.5 453.4C178.1 463.8 165.2 471.5 151.1 475.6L30.77 511C22.35 513.5 13.24 511.2 7.03 504.1C.8198 498.8-1.502 489.7 .976 481.2L36.37 360.9C40.53 346.8 48.16 333.9 58.57 323.5L291.7 90.34L421.7 220.3z"></path>
</svg>
<p className="IBMSMSMBSSPost_PDElementText">24/11/2024</p>
</div><a data-bs-toggle="tooltip" data-bss-tooltip="" data-bs-placement="left" className="IBMSMSMBSSPost_PDElement IBMSMSMBSSPost_PDElementLink" href="#" title="Published on" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -64 640 640" width="1em" height="1em" fill="currentColor" className="IBMSMSMBSSPost_PDElementIcon">
<path d="M172.5 131.1C228.1 75.51 320.5 75.51 376.1 131.1C426.1 181.1 433.5 260.8 392.4 318.3L391.3 319.9C381 334.2 361 337.6 346.7 327.3C332.3 317 328.9 297 339.2 282.7L340.3 281.1C363.2 249 359.6 205.1 331.7 177.2C300.3 145.8 249.2 145.8 217.7 177.2L105.5 289.5C73.99 320.1 73.99 372 105.5 403.5C133.3 431.4 177.3 435 209.3 412.1L210.9 410.1C225.3 400.7 245.3 404 255.5 418.4C265.8 432.8 262.5 452.8 248.1 463.1L246.5 464.2C188.1 505.3 110.2 498.7 60.21 448.8C3.741 392.3 3.741 300.7 60.21 244.3L172.5 131.1zM467.5 380C411 436.5 319.5 436.5 263 380C213 330 206.5 251.2 247.6 193.7L248.7 192.1C258.1 177.8 278.1 174.4 293.3 184.7C307.7 194.1 311.1 214.1 300.8 229.3L299.7 230.9C276.8 262.1 280.4 306.9 308.3 334.8C339.7 366.2 390.8 366.2 422.3 334.8L534.5 222.5C566 191 566 139.1 534.5 108.5C506.7 80.63 462.7 76.99 430.7 99.9L429.1 101C414.7 111.3 394.7 107.1 384.5 93.58C374.2 79.2 377.5 59.21 391.9 48.94L393.5 47.82C451 6.731 529.8 13.25 579.8 63.24C636.3 119.7 636.3 211.3 579.8 267.7L467.5 380z"></path>
</svg>
<p className="IBMSMSMBSSPost_PDElementText">degmods.com</p>
</a>
</div>
</div>
</div> */}
{/* <div className="IBMSMSplitMainBigSideSec">
<div className="IBMSMSMBSSPostsWrapper">
<h4 className="IBMSMSMBSSPostsTitle">Latest POSTER-NAME Posts</h4>
<div className="IBMSMList IBMSMListAlt"><a className="cardBlogMainWrapperLink" href="blog-inner.html">
<div className="cardBlogMain" style="background: url(&quot;https://nichegamer.com/wp-content/uploads/2023/01/onimai-01-07-2023.jpg&quot;) center / cover no-repeat;">
<div className="cardBlogMainInside" style="background: linear-gradient(rgba(255,255,255,0) 0%, #232323 100%);">
<h3 style="display: -webkit-box;-webkit-box-orient: vertical;overflow: hidden;-webkit-line-clamp: 2;font-size: 20px;line-height: 1.5;color: rgba(255,255,255,0.75);text-shadow: 0 0 8px rgba(0,0,0,0.25);">This is a blog title, the best blog title in the world!</h3>
</div>
</div>
</a><a className="cardBlogMainWrapperLink" href="blog-inner.html">
<div className="cardBlogMain" style="background: url(&quot;https://pbs.twimg.com/media/GDrRJOOXYAAeysT.jpg:large&quot;) center / cover no-repeat;">
<div className="cardBlogMainInside" style="background: linear-gradient(rgba(255,255,255,0) 0%, #232323 100%);">
<h3 style="display: -webkit-box;-webkit-box-orient: vertical;overflow: hidden;-webkit-line-clamp: 2;font-size: 20px;line-height: 1.5;color: rgba(255,255,255,0.75);text-shadow: 0 0 8px rgba(0,0,0,0.25);">This is a blog title, the best blog title in the world!</h3>
</div>
</div>
</a><a className="cardBlogMainWrapperLink" href="blog-inner.html">
<div className="cardBlogMain" style="background: url(&quot;assets/img/DEGMods%20Placeholder%20Img.png&quot;) center / cover no-repeat;">
<div className="cardBlogMainInside" style="background: linear-gradient(rgba(255,255,255,0) 0%, #232323 100%);">
<h3 style="display: -webkit-box;-webkit-box-orient: vertical;overflow: hidden;-webkit-line-clamp: 2;font-size: 20px;line-height: 1.5;color: rgba(255,255,255,0.75);text-shadow: 0 0 8px rgba(0,0,0,0.25);">This is a blog title, the best blog title in the world!</h3>
</div>
</div>
</a></div>
</div>
</div> */}
{/* <div className="IBMSMSplitMainBigSideSec">
<div className="IBMSMSMBSSCommentsWrapper">
<h4 className="IBMSMSMBSSTitle">Comments</h4>
<div id="ArticleComments-1" className="IBMSMSMBSSComments">
<div className="IBMSMSMBSSCommentsCreation">
<div className="IBMSMSMBSSCC_Top"><textarea id="commentBox-1" className="IBMSMSMBSSCC_Top_Box"></textarea></div>
<div className="IBMSMSMBSSCC_Bottom"><a className="IBMSMSMBSSCC_BottomButton">Comment<div className="IBMSMSMBSSCL_CAElementLoadWrapper">
<div className="IBMSMSMBSSCL_CAElementLoad"></div>
</div></a></div>
</div>
<div className="CommentsToggle"><button className="btn btnMain CommentsToggleBtn CommentsToggleActive" type="button">All Comments</button><button className="btn btnMain CommentsToggleBtn" type="button">Creator Comments</button></div>
<div className="IBMSMSMBSSCommentsList">
<div className="IBMSMSMBSSCL_Comment">
<div className="IBMSMSMBSSCL_CommentTop">
<div className="IBMSMSMBSSCL_CommentTopPPWrapper"><a className="IBMSMSMBSSCL_CommentTopPP" href="profile.html" style="background: url(&quot;assets/img/media-cache%20(4).png&quot;) center / cover no-repeat;"></a></div>
<div className="IBMSMSMBSSCL_CommentTopDetailsWrapper">
<div className="IBMSMSMBSSCL_CommentTopDetails"><a className="IBMSMSMBSSCL_CTD_Name" href="profile.html">FreakoverseFreakoverseFreakoverse</a><a className="IBMSMSMBSSCL_CTD_Address" href="profile.html">npub18n4ysp43ux5c98fs6h9c57qpr4p8r3j8f6e32v0vj8egzy878aqqyzzk9r</a></div>
<div className="IBMSMSMBSSCL_CommentActionsDetails"><a className="IBMSMSMBSSCL_CADTime" href="feed-note.html">8:45 PM</a><a className="IBMSMSMBSSCL_CADDate" href="feed-note.html">02/05/2024</a></div>
</div>
</div>
<div className="IBMSMSMBSSCL_CommentBottom">
<p className="IBMSMSMBSSCL_CBText">Yo this article was insane to read!</p>
</div>
<div className="IBMSMSMBSSCL_CommentActions">
<div className="IBMSMSMBSSCL_CommentActionsInside">
<div className="IBMSMSMBSSCL_CAElement IBMSMSMBSSCL_CAEUp IBMSMSMBSSCL_CAEUpActive"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="1em" height="1em" fill="currentColor" className="IBMSMSMBSSCL_CAElementIcon">
<!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. -->
<path d="M0 190.9V185.1C0 115.2 50.52 55.58 119.4 44.1C164.1 36.51 211.4 51.37 244 84.02L256 96L267.1 84.02C300.6 51.37 347 36.51 392.6 44.1C461.5 55.58 512 115.2 512 185.1V190.9C512 232.4 494.8 272.1 464.4 300.4L283.7 469.1C276.2 476.1 266.3 480 256 480C245.7 480 235.8 476.1 228.3 469.1L47.59 300.4C17.23 272.1 .0003 232.4 .0003 190.9L0 190.9z"></path>
</svg>
<p className="IBMSMSMBSSCL_CAElementText">52</p>
<div className="IBMSMSMBSSCL_CAElementLoadWrapper">
<div className="IBMSMSMBSSCL_CAElementLoad"></div>
</div>
</div>
<div className="IBMSMSMBSSCL_CAElement IBMSMSMBSSCL_CAEDown"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="1em" height="1em" fill="currentColor" className="IBMSMSMBSSCL_CAElementIcon">
<!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. -->
<path d="M512 440.1C512 479.9 479.7 512 439.1 512H71.92C32.17 512 0 479.8 0 440c0-35.88 26.19-65.35 60.56-70.85C43.31 356 32 335.4 32 312C32 272.2 64.25 240 104 240h13.99C104.5 228.2 96 211.2 96 192c0-35.38 28.56-64 63.94-64h16C220.1 128 256 92.12 256 48c0-17.38-5.784-33.35-15.16-46.47C245.8 .7754 250.9 0 256 0c53 0 96 43 96 96c0 11.25-2.288 22-5.913 32h5.879C387.3 128 416 156.6 416 192c0 19.25-8.59 36.25-22.09 48H408C447.8 240 480 272.2 480 312c0 23.38-11.38 44.01-28.63 57.14C485.7 374.6 512 404.3 512 440.1z"></path>
</svg>
<p className="IBMSMSMBSSCL_CAElementText">4</p>
<div className="IBMSMSMBSSCL_CAElementLoadWrapper">
<div className="IBMSMSMBSSCL_CAElementLoad"></div>
</div>
</div>
<div className="IBMSMSMBSSCL_CAElement IBMSMSMBSSCL_CAERepost IBMSMSMBSSCL_CAERepostActive"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -64 640 640" width="1em" height="1em" fill="currentColor" className="IBMSMSMBSSCL_CAElementIcon">
<!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. -->
<path d="M614.2 334.8C610.5 325.8 601.7 319.1 592 319.1H544V176C544 131.9 508.1 96 464 96h-128c-17.67 0-32 14.31-32 32s14.33 32 32 32h128C472.8 160 480 167.2 480 176v143.1h-48c-9.703 0-18.45 5.844-22.17 14.82s-1.656 19.29 5.203 26.16l80 80.02C499.7 445.7 505.9 448 512 448s12.28-2.344 16.97-7.031l80-80.02C615.8 354.1 617.9 343.8 614.2 334.8zM304 352h-128C167.2 352 160 344.8 160 336V192h48c9.703 0 18.45-5.844 22.17-14.82s1.656-19.29-5.203-26.16l-80-80.02C140.3 66.34 134.1 64 128 64S115.7 66.34 111 71.03l-80 80.02C24.17 157.9 22.11 168.2 25.83 177.2S38.3 192 48 192H96V336C96 380.1 131.9 416 176 416h128c17.67 0 32-14.31 32-32S321.7 352 304 352z"></path>
</svg>
<p className="IBMSMSMBSSCL_CAElementText">6</p>
<div className="IBMSMSMBSSCL_CAElementLoadWrapper">
<div className="IBMSMSMBSSCL_CAElementLoad"></div>
</div>
</div>
<div className="IBMSMSMBSSCL_CAElement IBMSMSMBSSCL_CAEBolt IBMSMSMBSSCL_CAEBoltActive"><svg xmlns="http://www.w3.org/2000/svg" viewBox="-64 0 512 512" width="1em" height="1em" fill="currentColor" className="IBMSMSMBSSCL_CAElementIcon">
<!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. -->
<path d="M240.5 224H352C365.3 224 377.3 232.3 381.1 244.7C386.6 257.2 383.1 271.3 373.1 280.1L117.1 504.1C105.8 513.9 89.27 514.7 77.19 505.9C65.1 497.1 60.7 481.1 66.59 467.4L143.5 288H31.1C18.67 288 6.733 279.7 2.044 267.3C-2.645 254.8 .8944 240.7 10.93 231.9L266.9 7.918C278.2-1.92 294.7-2.669 306.8 6.114C318.9 14.9 323.3 30.87 317.4 44.61L240.5 224z"></path>
</svg>
<p className="IBMSMSMBSSCL_CAElementText">500K</p>
<div className="IBMSMSMBSSCL_CAElementLoadWrapper">
<div className="IBMSMSMBSSCL_CAElementLoad"></div>
</div>
</div>
<div className="IBMSMSMBSSCL_CAElement IBMSMSMBSSCL_CAEReplies"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="1em" height="1em" fill="currentColor" className="IBMSMSMBSSCL_CAElementIcon">
<!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. -->
<path d="M256 32C114.6 32 .0272 125.1 .0272 240c0 49.63 21.35 94.98 56.97 130.7c-12.5 50.37-54.27 95.27-54.77 95.77c-2.25 2.25-2.875 5.734-1.5 8.734C1.979 478.2 4.75 480 8 480c66.25 0 115.1-31.76 140.6-51.39C181.2 440.9 217.6 448 256 448c141.4 0 255.1-93.13 255.1-208S397.4 32 256 32z"></path>
</svg>
<p className="IBMSMSMBSSCL_CAElementText">12</p>
<p className="IBMSMSMBSSCL_CAElementText">Replies</p>
</div>
<div className="IBMSMSMBSSCL_CAElement IBMSMSMBSSCL_CAEReply">
<p className="IBMSMSMBSSCL_CAElementText">Reply</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div> */}
</div>
</div>
{!!data.author && <ProfileSection pubkey={data.author} />}
</div>
</div>
</div>
</div>
)
}

70
src/pages/blog/loader.ts Normal file
View File

@ -0,0 +1,70 @@
import { filterForEventsTaggingId, NDKEvent } from '@nostr-dev-kit/ndk'
import { NDKContextType } from 'contexts/NDKContext'
import { LoaderFunctionArgs, redirect } from 'react-router-dom'
import { toast } from 'react-toastify'
import { appRoutes } from 'routes'
import { BlogDetails } from 'types'
import {
getFirstTagValue,
getFirstTagValueAsInt,
getTagValue,
log,
LogType
} from 'utils'
export const blogRouteLoader =
(ndkContext: NDKContextType) =>
async ({ params }: LoaderFunctionArgs) => {
const { naddr } = params
if (!naddr) {
log(true, LogType.Error, 'Required naddr.')
return redirect(appRoutes.blogs)
}
try {
const filter = filterForEventsTaggingId(naddr)
if (!filter) {
log(true, LogType.Error, 'Unable to create filter from blog naddr.')
return redirect(appRoutes.blogs)
}
const event = await ndkContext.fetchEvent(filter)
console.log(event)
if (event) {
const blogDetails = extractBlogDetails(event)
console.log(blogDetails)
return blogDetails
}
return null
} catch (error) {
log(
true,
LogType.Error,
'An error occurred in fetching blog details from relays',
error
)
toast.error('An error occurred in fetching mod details from relays')
return redirect(appRoutes.blogs)
}
}
function extractBlogDetails(event: NDKEvent): Partial<BlogDetails> {
return {
title: getFirstTagValue(event, 'title'),
content: event.content,
summary: getFirstTagValue(event, 'summary'),
image: getFirstTagValue(event, 'image'),
nsfw: getFirstTagValue(event, 'nsfw') === 'true',
id: event.id,
author: event.pubkey,
published_at: getFirstTagValueAsInt(event, 'published_at'),
edited_at: event.created_at,
rTag: getFirstTagValue(event, 'r') || 'N/A',
dTag: getFirstTagValue(event, 'd'),
aTag: getFirstTagValue(event, 'a'),
tTags: getTagValue(event, 't') || []
}
}

View File

@ -3,7 +3,6 @@ import { NDKContextType } from 'contexts/NDKContext'
import { Layout } from 'layout'
import { SearchPage } from '../pages/search'
import { AboutPage } from '../pages/about'
import { BlogsPage } from '../pages/blogs'
import { GamesPage } from '../pages/games'
import { HomePage } from '../pages/home'
import { ModPage } from '../pages/mod'
@ -18,7 +17,9 @@ import { FeedPage } from '../pages/feed'
import { NotificationsPage } from '../pages/notifications'
import { WritePage } from '../pages/write'
import { writeRouteAction } from '../pages/write/action'
import { BlogsPage } from 'pages/blogs'
import { BlogPage } from 'pages/blog'
import { blogRouteLoader } from 'pages/blog/loader'
export const appRoutes = {
index: '/',
@ -29,7 +30,7 @@ export const appRoutes = {
mod: '/mod/:naddr',
about: '/about',
blogs: '/blogs',
blog: '/blog/:naddr',
blog: '/blogs/:naddr',
submitMod: '/submit-mod',
editMod: '/edit-mod/:naddr',
write: '/write',
@ -93,7 +94,8 @@ export const routerWithNdkContext = (context: NDKContextType) =>
},
{
path: appRoutes.blog,
element: <BlogPage />
element: <BlogPage />,
loader: blogRouteLoader(context)
},
{
path: appRoutes.submitMod,

View File

@ -10,12 +10,24 @@ export interface BlogDetails {
author: string
published_at: number
edited_at: number
rTag: string
dTag: string
aTag: string
tTags: string[]
}
export interface BlogFormSubmit
extends Omit<
BlogDetails,
'nsfw' | 'id' | 'author' | 'published_at' | 'edited_at'
| 'nsfw'
| 'id'
| 'author'
| 'published_at'
| 'edited_at'
| 'rTag'
| 'dTag'
| 'aTag'
| 'tTag'
> {
nsfw: string
}

View File

@ -65,6 +65,22 @@ export const getTagValue = (
return null
}
export const getFirstTagValue = (
event: Event | NDKEvent,
tagIdentifier: string
) => {
const tags = getTagValue(event, tagIdentifier)
return tags && tags.length ? tags[0] : undefined
}
export const getFirstTagValueAsInt = (
event: Event | NDKEvent,
tagIdentifier: string
) => {
const value = getFirstTagValue(event, tagIdentifier)
return value ? parseInt(value, 10) : undefined
}
/**
* @param hexKey hex private or public key
* @returns whether or not is key valid