import { nip19 } from 'nostr-tools' import { useMemo, useState } from 'react' import { useNavigate } from 'react-router-dom' import { A11y, Autoplay, Navigation, Pagination } from 'swiper/modules' import { Swiper, SwiperSlide } from 'swiper/react' import { BlogCard } from '../components/BlogCard' import { GameCard } from '../components/GameCard' import { ModCard } from '../components/ModCard' import { LANDING_PAGE_DATA } from '../constants' import { useDidMount, useGames, useMuteLists, useNDKContext, useNSFWList } from '../hooks' import { appRoutes, getModPageRoute } from '../routes' import { ModDetails } from '../types' import { extractModData, handleModImageError, log, LogType } from '../utils' import '../styles/cardLists.css' import '../styles/SimpleSlider.css' import '../styles/styles.css' // Import Swiper styles import { NDKFilter } from '@nostr-dev-kit/ndk' import 'swiper/css' import 'swiper/css/navigation' import 'swiper/css/pagination' export const HomePage = () => { const navigate = useNavigate() const games = useGames() const featuredGames = useMemo(() => { return games.filter((game) => LANDING_PAGE_DATA.featuredGames.includes(game['Game Name']) ) }, [games]) return (
{LANDING_PAGE_DATA.featuredSlider.map((naddr) => ( ))}

Cool Games

{featuredGames.map((game) => ( ))}
navigate(appRoutes.games)} > View All

Awesome Mods

{LANDING_PAGE_DATA.awesomeMods.map((naddr) => ( ))}
navigate(appRoutes.mods)} > View All

Blog Posts (WIP)

) } type SlideContentProps = { naddr: string } const SlideContent = ({ naddr }: SlideContentProps) => { const navigate = useNavigate() const { fetchEvent } = useNDKContext() const [mod, setMod] = useState() useDidMount(() => { const decoded = nip19.decode<'naddr'>(naddr as `naddr1${string}`) const { identifier, kind, pubkey, relays = [] } = decoded.data const ndkFilter: NDKFilter = { '#a': [identifier], authors: [pubkey], kinds: [kind] } fetchEvent(ndkFilter, relays) .then((ndkEvent) => { if (ndkEvent) { const extracted = extractModData(ndkEvent) setMod(extracted) } }) .catch((err) => { log( true, LogType.Error, 'An error occurred in fetching mod details from relays', err ) }) }) if (!mod) return return ( <>

{mod.title}

{mod.summary}

{mod.game}

navigate(getModPageRoute(naddr))} > Check it out
) } type DisplayModProps = { naddr: string } const DisplayMod = ({ naddr }: DisplayModProps) => { const [mod, setMod] = useState() const { fetchEvent } = useNDKContext() useDidMount(() => { const decoded = nip19.decode<'naddr'>(naddr as `naddr1${string}`) const { identifier, kind, pubkey, relays = [] } = decoded.data const ndkFilter: NDKFilter = { '#a': [identifier], authors: [pubkey], kinds: [kind] } fetchEvent(ndkFilter, relays) .then((ndkEvent) => { if (ndkEvent) { const extracted = extractModData(ndkEvent) setMod(extracted) } }) .catch((err) => { log( true, LogType.Error, 'An error occurred in fetching mod details from relays', err ) }) }) if (!mod) return return } const DisplayLatestMods = () => { const navigate = useNavigate() const { fetchMods } = useNDKContext() const [isFetchingLatestMods, setIsFetchingLatestMods] = useState(true) const [latestMods, setLatestMods] = useState([]) const muteLists = useMuteLists() const nsfwList = useNSFWList() useDidMount(() => { fetchMods({ source: window.location.host }) .then((mods) => { setLatestMods(mods) }) .finally(() => { setIsFetchingLatestMods(false) }) }) const filteredMods = useMemo(() => { const mutedAuthors = [...muteLists.admin.authors, ...muteLists.user.authors] const mutedEvents = [ ...muteLists.admin.replaceableEvents, ...muteLists.user.replaceableEvents ] const filtered = latestMods.filter( (mod) => !mutedAuthors.includes(mod.author) && !mutedEvents.includes(mod.aTag) && !nsfwList.includes(mod.aTag) && !mod.nsfw ) return filtered.slice(0, 4) }, [muteLists, nsfwList, latestMods]) return (

Latest Mods

{isFetchingLatestMods ? ( ) : ( filteredMods.map((mod) => { return }) )}
) } const Spinner = () => { return (
) }