Skip to content

Commit

Permalink
AAAA
Browse files Browse the repository at this point in the history
  • Loading branch information
axiinyaa committed Oct 14, 2024
1 parent 8f351f0 commit 9194468
Show file tree
Hide file tree
Showing 8 changed files with 2,480 additions and 1,037 deletions.
192 changes: 192 additions & 0 deletions app/blog/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@
'use client'
import { useEffect, useState } from "react";
import Desktop from "../components/desktop";
import Window from "../components/window"
import { FetchBlogPosts, UploadBlogPost } from "../database";
import { ParseText } from "../text-parser"
import parse from 'html-react-parser';
import { BlogPost } from "../components/database-parse-type";
import axios from "axios";
import { useSession } from "next-auth/react";
import { redirect } from 'next/navigation'
import { useRouter, usePathname, useSearchParams } from 'next/navigation'
import Head from "next/head";

function formatDate(date: Date): string {
const options: Intl.DateTimeFormatOptions = {
year: 'numeric',
month: 'long', // 'short' for abbreviated month names
day: 'numeric',
hour12: true // Set to false for 24-hour format
};

return date.toLocaleString('en-US', options);
}

export default function Page() {

const [blogPosts, setBlogPosts] = useState<BlogPost[]>([]);
const [userID, setUserID] = useState<null | string>(null);
const [uploadedBlogPost, uploadBlogPost] = useState<BlogPost>();

const { data: discordData, status } = useSession()
const searchParams = useSearchParams();
const router = useRouter()

useEffect(() => {
async function grabBlogPosts() {
setBlogPosts((await FetchBlogPosts()).reverse());
}

grabBlogPosts();
}, []);

useEffect(() => {
async function ubp() {
await UploadBlogPost(uploadedBlogPost as BlogPost);
}

ubp();

}, [uploadedBlogPost])

useEffect(() => {
const login = async () => {

try {

if (!discordData) { // If discordData is null, then user has not signed in to the website.
return;
}

if (!discordData?.access_token) { return } // If there's no access token then we don't need to do anything yet.

const response = await axios.get('https://discord.com/api/users/@me', { headers: { Authorization: `Bearer ${discordData.access_token}` } })

setUserID(response.data.id)
}
catch (error) {
console.error('Error fetching data from discord:', error);
}
}

login();

}, [discordData]);

function ButtonPane({post, id} : {post: BlogPost, id: number}) {

const handleClick = () => {
redirect(`/blog?id=${id}`);
};

return (
<div className="window text-black min-w-[5px] mb-5" onClick={() => router.push(`/blog?id=${id}`)}>
<p className="text-lg mx-3">{post.title}</p>
<p className="text-sm mx-3">{post.description}</p>
<p className="text-gray-500 text-right text-xs mx-3">{formatDate(post.datetime)}</p>
</div>
);
}

function DisplayBlogPost({id} : {id: number}) {

const post = blogPosts.filter((p) => p.post_id == id)[0];

if (post == undefined) {
return(
<div className=" text-black min-w-[5px]">
<p className="text-2xl">...</p><br/>
<div className='window mb-5'>
<div className="text-sm mx-5 my-2">...</div><br/>
<p className="text-xs text-right m-2 my-[-10px]">...</p><br/>
</div>
<button onClick={() => router.push('/blog')}>Back To Posts</button>
</div>
)
}

return (
<div className=" text-black min-w-[5px]">
<Head>
<title>The World Machine</title>
<meta name="description" content={post.description} />
<meta property="og:title" content={post.title} />
<meta property="og:description" content={post.description} />
<meta property="og:url" content="https://www.theworldmachine.xyz/" />
</Head>
<div className='window mb-5'>
<div className="text-sm mx-5 my-2">
<p className="text-2xl mt-5 text-center">{post.title}</p><br/>
<ParseText>{post.content}</ParseText>
</div><br/>
<p className="text-xs text-right m-2 my-[-10px]">Posted: {formatDate(post.datetime)}</p><br/>
</div>
<button onClick={() => router.push('/blog')}>Back To Posts</button>
</div>
)
}

function CreateBlogPost() {

const blog: BlogPost = {
title: '',
content: '',
description: '',
datetime: new Date(Date.now()),
post_id: 0
}

function Upload() {

blog.datetime = new Date(Date.now());
blog.post_id = blogPosts.length;

uploadBlogPost(blog);
}

return(
<div className=" text-black min-w-[5px]">
<textarea placeholder="Blog title" onChange={(title) => (blog.title = title.target.value)}></textarea><br/>
<textarea className="w-1/2" placeholder="Small description goes here" onChange={(description) => (blog.description = description.target.value)}></textarea><br/>
<textarea className="w-full" placeholder="Blog content goes here" onChange={(content) => (blog.content = content.target.value)}></textarea>
<button className="mb-5" onClick={Upload}>Post</button>
</div>
)
}

// -----------------------------------

if (blogPosts.length == 0) {
return(
<Desktop>
<Window title='Blog Posts' className="max-w-[800px]">
{userID !== null && userID == "302883948424462346" && <CreateBlogPost/>}
<div className='text-black'>Loading...</div>
</Window>
</Desktop>
)
}

if (searchParams.size > 0) {

return(
<Desktop>
<Window title='Blog Posts' className="max-w-[800px]">
<DisplayBlogPost id={Number(searchParams.get('id') || '0')} />
</Window>
</Desktop>
)
}

return(
<Desktop>
<Window title='Blog Posts' className="max-w-[800px]">
{userID !== null && userID == "302883948424462346" && <CreateBlogPost/>}
{blogPosts.map((post) => (
<ButtonPane post={post} id={post.post_id}/>
))}
</Window>
</Desktop>
)
}
8 changes: 8 additions & 0 deletions app/components/database-parse-type.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -129,4 +129,12 @@ export interface ItemData {
};
badges: Badges;
nikogotchi: NikogotchiInformation[];
}

export interface BlogPost {
title: string;
content: string;
description: string;
datetime: Date;
post_id: number;
}
3 changes: 2 additions & 1 deletion app/components/navigation.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ import DesktopIcon from './desktop-icon'

export default function Navigation() {
return (
<div className='absolute max-h-[700px] font-main pt-10 bottom-5 grid gap-5 scale-90 grid-cols-6 sm:grid-cols-2 sm:grid-rows-6 sm:top-1 sm:grid-flow-col sm:left-10 sm:mx-auto sm:gap-1'>
<div className='absolute max-h-[700px] font-main bottom-2 grid gap-5 scale-90 grid-cols-6 sm:grid-cols-2 sm:grid-rows-6 sm:top-1 sm:grid-flow-col sm:left-10 sm:mx-auto sm:gap-1'>
<DesktopIcon filename="invite" icon_name="Invite Bot" redirect='/invite'/>
<DesktopIcon filename="person" icon_name="Edit Profile" redirect='/profile'/>
<DesktopIcon filename="leaderboard" icon_name="Leader boards" redirect='/leaderboards'/>
<DesktopIcon filename="blog" icon_name="Blog" redirect='/blog'/>
<DesktopIcon filename="credits" icon_name="Credits" redirect='/credits'/>
<DesktopIcon filename="../discord-icon" icon_name="Support Server" redirect='https://discord.gg/gtfeHfka5h'/>
<DesktopIcon filename="sun" icon_name="Buy OneShot" redirect='https://store.steampowered.com/app/420530/OneShot/'/>
Expand Down
44 changes: 40 additions & 4 deletions app/database.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
'use server'
import axios from 'axios';
import axios, { all } from 'axios';
import { Collection, MongoClient, ObjectId } from 'mongodb';
import { UserData, LeaderboardUser, ItemData, NikogotchiInformation, NikogotchiData } from './components/database-parse-type'
import { UserData, LeaderboardUser, ItemData, NikogotchiInformation, NikogotchiData, BlogPost } from './components/database-parse-type'

let collection: null | Collection<UserData> = null
let collection: null | Collection<any> = null

async function connectToDatabase(collection_to_use: string = 'UserData') {

Expand All @@ -17,7 +17,7 @@ async function connectToDatabase(collection_to_use: string = 'UserData') {

const db = mongoDBClient.db('TheWorldMachine')

return db.collection<UserData>(collection_to_use)
return db.collection<any>(collection_to_use)
}

export async function Fetch(user: string): Promise<UserData | null> {
Expand Down Expand Up @@ -117,4 +117,40 @@ export async function GetBackgrounds() {

const responseBackgrounds = await fetch(end_point);
return await responseBackgrounds.json();
}

export async function FetchBlogPosts() {

const blogPosts: BlogPost[] = []

const blogData = await connectToDatabase('Blog');

const blogPostList = await blogData.find({}).toArray();

const blogPostPromises = blogPostList.map(async (blogDocs) => {
return { ...blogDocs } as BlogPost
});

const allBlogPosts = await Promise.all(blogPostPromises);

blogPosts.push(...allBlogPosts);

return blogPosts
}

export async function UploadBlogPost(post: BlogPost) {

if (post == undefined) {
return;
}

const blogData = await connectToDatabase('Blog');

const result = await blogData.insertOne(post);

if (result && result.insertedId) {
console.log(`New post created with the following id: ${result.insertedId}`);
} else {
console.error('Failed to insert the blog post.');
}
}
Loading

0 comments on commit 9194468

Please sign in to comment.