From 1c908987225bb504da3af9b90b70fbbe1c9e9b81 Mon Sep 17 00:00:00 2001 From: Alex Frantz Date: Sat, 17 Aug 2024 22:02:42 -0400 Subject: [PATCH] redesign list, add a few more cards --- src/components/Footer.tsx | 2 +- src/components/ProjectComponent.tsx | 28 +++++--- .../ProjectComponents/RecentClip.tsx | 70 +++++++++++++++++++ .../ProjectComponents/RecentGame.tsx | 63 +++++++++++++++++ .../ProjectComponents/RecentListens.tsx | 8 ++- .../ProjectComponents/RecentPhoto.tsx | 11 +-- .../ProjectComponents/RecentWatch.tsx | 9 +-- src/index.tsx | 51 ++++++-------- 8 files changed, 190 insertions(+), 52 deletions(-) create mode 100644 src/components/ProjectComponents/RecentClip.tsx create mode 100644 src/components/ProjectComponents/RecentGame.tsx diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index 12d2e39..6aa04f1 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -35,7 +35,7 @@ export default function Footer() { } return ( -
+

© {new Date().getFullYear()}, Alex Frantz. All Rights Reserved

All logos & images on this page belong to their respective owners.

{quote}

diff --git a/src/components/ProjectComponent.tsx b/src/components/ProjectComponent.tsx index c4bc9f0..e7dbc2a 100644 --- a/src/components/ProjectComponent.tsx +++ b/src/components/ProjectComponent.tsx @@ -1,25 +1,31 @@ export default function ProjectComponent({ url, header, - subheader, - image, - imageSize = "100" + projectHeader, + projectSubheader, + projectImage, + projectImageSize = "100" }: { url: string, header: string, - subheader: string, - image: string, - imageSize?: string + projectHeader: string, + projectSubheader: string, + projectImage: string, + projectImageSize?: string }) { return ( - -
+ +
+
+

{header}

+
+
- +
-

{header}

-

{subheader}

+

{projectHeader}

+

{projectSubheader}

diff --git a/src/components/ProjectComponents/RecentClip.tsx b/src/components/ProjectComponents/RecentClip.tsx new file mode 100644 index 0000000..5f00a39 --- /dev/null +++ b/src/components/ProjectComponents/RecentClip.tsx @@ -0,0 +1,70 @@ +import { useState, useEffect } from 'react'; +import ProjectComponent from '../ProjectComponent'; + +type MedalAPIResponse = { + data: MedalClip[] +} +type MedalClip = { + contentId: string, + contentTitle: string, + contentViews: number, + contentLikes: number, + contentThumbnail: string, + directClipUrl: string +} + +export default function RecentClip() { + const [ data, setData ] = useState(); + const [ errorState, setErrorState ] = useState(""); + const [ loading, setLoading ] = useState(true); + + const translateToWebsiteUrl = (url: string) => { + return url.replace('/clip/', "/clips/") + } + + // i'm a neat man what can i say + const likeOrLikes = (likes: number) => { + return (likes > 1 && likes !== 0) ? "likes" : "like" + } + const viewOrViews = (views: number) => { + return (views > 1 && views !== 0) ? "views" : "view" + } + + useEffect(() => { + fetch("https://api.alexav.gg/v4/social/medal", { + method: "get" + }) + .then(async (res) => { + if (res.ok) { + const data = await res.json() as MedalAPIResponse + setData(data.data); + } else { + setErrorState("Failed to load! :(") + } + }) + .catch((e: Error) => { + setErrorState(e.message) + }) + + setLoading(false); + }, []); + + if (!loading && data) { + return ( + + ) + } else { + <> +

No data :(

+

Check out medal.tv/u/alexav if this isn't working.

+

{errorState}

+ + } +} \ No newline at end of file diff --git a/src/components/ProjectComponents/RecentGame.tsx b/src/components/ProjectComponents/RecentGame.tsx new file mode 100644 index 0000000..c39ce3d --- /dev/null +++ b/src/components/ProjectComponents/RecentGame.tsx @@ -0,0 +1,63 @@ +import { useState, useEffect } from 'react'; +import ProjectComponent from '../ProjectComponent'; + +type SteamAPIResponse = { + data: GameItem[] +} +type GameItem = { + appid: number, + name: string, + playtime_forever: number, + img_icon_url: string, +} + +export default function RecentGame() { + const [ data, setData ] = useState(); + const [ errorState, setErrorState ] = useState(""); + const [ loading, setLoading ] = useState(true); + + const translateToAppStorePage = (appId: number) => { + return "https://store.steampowered.com/app/" + appId + } + const buildMediaUrl = (appId: number, hash: string) => { + return "https://media.steampowered.com/steamcommunity/public/images/apps/" + appId + "/" + hash + ".jpg" + } + + useEffect(() => { + fetch("https://api.alexav.gg/v4/social/steam", { + method: "get" + }) + .then(async (res) => { + if (res.ok) { + const data = await res.json() as SteamAPIResponse + setData(data.data); + } else { + setErrorState("Failed to load! :(") + } + }) + .catch((e: Error) => { + setErrorState(e.message) + }) + + setLoading(false); + }, []); + + if (!loading && data) { + return ( + + ) + } else { + <> +

No data :(

+

Check out steamcommunity.com/id/luvxavierr if this isn't working.

+

{errorState}

+ + } +} \ No newline at end of file diff --git a/src/components/ProjectComponents/RecentListens.tsx b/src/components/ProjectComponents/RecentListens.tsx index b658178..ca07001 100644 --- a/src/components/ProjectComponents/RecentListens.tsx +++ b/src/components/ProjectComponents/RecentListens.tsx @@ -55,9 +55,11 @@ export default function RecentListens() { return ( v.size === "large")[0]["#text"]} + header={"Music I'm listening to"} + projectHeader={data[0].name} + projectSubheader={data[0].artist["#text"]} + projectImage={data[0].image.filter((v) => v.size === "medium")[0]["#text"]} + projectImageSize={"50"} /> ) } else { diff --git a/src/components/ProjectComponents/RecentPhoto.tsx b/src/components/ProjectComponents/RecentPhoto.tsx index f43dbd2..d3bfe89 100644 --- a/src/components/ProjectComponents/RecentPhoto.tsx +++ b/src/components/ProjectComponents/RecentPhoto.tsx @@ -49,11 +49,12 @@ export default function RecentPhoto() { if (data && !loading) { return ( ) } else { diff --git a/src/components/ProjectComponents/RecentWatch.tsx b/src/components/ProjectComponents/RecentWatch.tsx index d4f8b44..0a7c52f 100644 --- a/src/components/ProjectComponents/RecentWatch.tsx +++ b/src/components/ProjectComponents/RecentWatch.tsx @@ -52,11 +52,12 @@ export default function RecentWatch() { if (data && !loading) { return ( ) } else { diff --git a/src/index.tsx b/src/index.tsx index 21e2179..16497de 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -6,6 +6,8 @@ import ContactForm from "./components/ContactForm"; import RecentWatch from "./components/ProjectComponents/RecentWatch"; import RecentPhoto from "./components/ProjectComponents/RecentPhoto"; import RecentListens from "./components/ProjectComponents/RecentListens"; +import RecentClip from './components/ProjectComponents/RecentClip'; +import RecentGame from "./components/ProjectComponents/RecentGame"; import Layout from "./components/Layout"; export default function Home() { @@ -45,36 +47,29 @@ export default function Home() { />
-
-
-
-

What I'm watching

-
+
+
+

Data

+

Cool data from some of my accounts/projects

-
- -
-
-
-
-
-
-

Photos I've captured

-
+
-
- -
-
-
-
-
-
-

Music I'm listening to

-
- -
- +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +