diff --git a/apps/cube.json b/apps/cube.json index 4e75a5e..7eed856 100644 --- a/apps/cube.json +++ b/apps/cube.json @@ -3,8 +3,7 @@ "oneliner": "3D FPS with classic deathmatch games", "dev": "Caleb Foust and others", "art": { - "background": "/gameassets/cube/background.png", - "logo": "http://sauerbraten.org/cube2logo_wide.png" + "background": "/gameassets/cube/poster.jpeg" }, "frame": "https://sourga.me", "tags": ["shooter"], diff --git a/pages/_app.tsx b/pages/_app.tsx index f616fa0..b38215f 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -10,9 +10,12 @@ import { AnimatePresence, motion } from 'framer-motion' import 'react-responsive-carousel/lib/styles/carousel.min.css' import { useRouter } from 'next/router' import Script from 'next/script' +import { GoogleAuthProvider, getAuth, onAuthStateChanged, signInAnonymously, signInWithPopup, signOut, updateProfile } from 'firebase/auth' +import { AvatarCreator } from '@readyplayerme/rpm-react-sdk' +import { Avatar } from '@readyplayerme/visage' import 'atropos/css' import { initializeApp } from 'firebase/app' -import { getAuth, onAuthStateChanged, signInAnonymously } from 'firebase/auth' +import Link from 'next/link' export default function App({ Component, pageProps }: AppProps) { let { asPath } = useRouter() @@ -35,7 +38,19 @@ export default function App({ Component, pageProps }: AppProps) { }, []) let router = useRouter() - let [gameID, setGameID] = useState('wizards') + let [avatarCreated, setAvatarCreated] = useState('https://readyplayerme.github.io/visage/male.glb') + let [user, setUser] = useState() + + useMemo(async () => { + onAuthStateChanged(getAuth(), (user) => { + if (user) { + setUser(user) + if (user.photoURL) { + setAvatarCreated(user.photoURL) + } + } + }) + }, []) return ( <> @@ -67,14 +82,123 @@ export default function App({ Component, pageProps }: AppProps) { + + { + let settingsModal = document.querySelector('.settingsModal') as HTMLDialogElement + settingsModal.close() + }}>close + {!user && ( +

Loading...

+ )} + {user && ( + <> + +

{user.displayName || user.email || user.phoneNumber || 'Anonymous Parakeet'}

+ {user.isAnonymous && { + e.preventDefault(); + let user = await signInWithPopup( + getAuth(), + new GoogleAuthProvider() + ); + setUser(user.user); + }} + > + + Sign in with Google + + } + {!user.isAnonymous && <> + { + e.preventDefault(); + updateProfile(user, { + displayName: prompt("Enter your new display name:"), + }); + }} + > + + Change Name + + + { + e.preventDefault(); + let settingsModal = document.querySelector('.settingsModal') as HTMLDialogElement + settingsModal.close() + let avatarModal = document.querySelector('.avatarModal') as HTMLDialogElement + avatarModal.showModal() + }} + > + + Change Avatar + + + { + e.preventDefault(); + signOut(getAuth()) + setUser(null) + }} + > + + Log Out + + + } + + )} +
+ + {!user && ( +

Loading...

+ )} + {user &&
{ + setAvatarCreated(url) + updateProfile(user, { + photoURL: url, + }) + let avatarModal = document.querySelector('.avatarModal') as HTMLDialogElement + avatarModal.close() + let settingsModal = document.querySelector('.settingsModal') as HTMLDialogElement + settingsModal.showModal() + }} />
} +
-
- -
+ { + let settingsModal = document.querySelector('.settingsModal') as HTMLDialogElement + settingsModal.showModal() + }}> + menu +
- ) } diff --git a/pages/index.tsx b/pages/index.tsx index 12d3769..f4d4368 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -6,29 +6,11 @@ import Link from 'next/link' import Head from 'next/head' import Atropos from 'atropos/react' import { readdirSync } from 'fs' -import { useMemo, useState } from 'react' -import { Carousel } from 'react-responsive-carousel' -import { GoogleAuthProvider, getAuth, onAuthStateChanged, signInWithPopup, signOut, updateProfile } from 'firebase/auth' -import { AvatarCreator } from '@readyplayerme/rpm-react-sdk' -import { Avatar } from '@readyplayerme/visage' -export default function Home(props: any) { - let [searchTerm, setSearchTerm] = useState('') - let [searchTags, setSearchTags] = useState([]) - let [avatarCreated, setAvatarCreated] = useState('https://readyplayerme.github.io/visage/male.glb') - let [user, setUser] = useState() +import { Carousel } from 'react-responsive-carousel' - useMemo(async () => { - onAuthStateChanged(getAuth(), (user) => { - if (user) { - setUser(user) - if (user.photoURL) { - setAvatarCreated(user.photoURL) - } - } - }) - }, []) +export default function Home(props: any) { return ( <>
@@ -36,143 +18,10 @@ export default function Home(props: any) { Parakeet - - { - let accountModal = document.querySelector('.accountModal') as HTMLDialogElement - accountModal.close() - }}>close - {!user && ( -

Loading...

- )} - {user && ( - <> - -

{user.displayName || user.email || user.phoneNumber || 'Anonymous Parakeet'}

- {user.isAnonymous && { - e.preventDefault(); - let user = await signInWithPopup( - getAuth(), - new GoogleAuthProvider() - ); - setUser(user.user); - }} - > - - Sign in with Google - -

- By signing in, you agree to our Privacy Policy and Terms of Service. - } - {!user.isAnonymous && <> - { - e.preventDefault(); - updateProfile(user, { - displayName: prompt("Enter your new display name:"), - }); - }} - > - - Change Name - - - { - e.preventDefault(); - let accountModal = document.querySelector('.accountModal') as HTMLDialogElement - accountModal.close() - let avatarModal = document.querySelector('.avatarModal') as HTMLDialogElement - avatarModal.showModal() - }} - > - - Change Avatar - - - { - e.preventDefault(); - signOut(getAuth()) - setUser(null) - }} - > - - Log Out - - - } - - )} -
- - {!user && ( -

Loading...

- )} - {user &&
{ - setAvatarCreated(url) - updateProfile(user, { - photoURL: url, - }) - let avatarModal = document.querySelector('.avatarModal') as HTMLDialogElement - avatarModal.close() - let accountModal = document.querySelector('.accountModal') as HTMLDialogElement - accountModal.showModal() - }} />
} -
{props.games.map((game: any) => { if ( - (game.name.replace(/\s+/g, '').toLowerCase().includes(searchTerm) || - searchTerm == '') && - (searchTags.some((tag) => game.tags.includes(tag)) || - searchTags.length === 0) + // (game.name.replace(/\s+/g, '').toLowerCase().includes(searchTerm) || + // searchTerm == '') && + // (searchTags.some((tag) => game.tags.includes(tag)) || + // searchTags.length === 0) + true ) return ( )} {game.art.logo && ( {game.name} diff --git a/pages/play/[id].tsx b/pages/play/[id].tsx index ad761d1..f476cdc 100644 --- a/pages/play/[id].tsx +++ b/pages/play/[id].tsx @@ -8,7 +8,6 @@ import { User, getAuth, onAuthStateChanged } from 'firebase/auth' import { useRouter } from 'next/router' import { RWebShare } from 'react-web-share' import { readdirSync } from 'fs' -import $ from 'jquery' function GamePage(props: any) { let [user, setUser] = useState() @@ -16,11 +15,7 @@ function GamePage(props: any) { useEffect(() => { window.addEventListener('message', (event) => { - if (event.data === 'open-guide') { - $('.guideBox').fadeIn(500) - } else if (event.data === 'close-guide') { - $('.guideBox').fadeOut(500) - } else if (typeof event.data == 'object') { + if (typeof event.data == 'object') { if (event.data.title && event.data.description && event.data.parakeetMessageType == 'achievement') { $('.popupTitle').text(event.data.title) $('.popupDescription').text(event.data.description) @@ -81,52 +76,6 @@ function GamePage(props: any) { >
-
- -
- {user &&
{ }}> -
- face - {user.displayName || 'Anonymous'} -
-
} - {/*
{ }}> -
- social_leaderboard - Achievements -
-
*/} - -
-
- share - Share -
-
-
-
router.push('/')}> -
- logout - Exit game -
-
- {/*
{ - ((document.querySelector(`#frame-${props.game.id}`) as HTMLIFrameElement).contentWindow as any).focus() - setGuideOpened(false) - }}> -
- keyboard_return - Return to game -
-
*/} -
-
- { - $('.guideBox').fadeToggle(300) - }} />
social_leaderboard @@ -146,7 +95,7 @@ function GamePage(props: any) { position: 'fixed', bottom: '0', border: 'none', - zIndex: 1, + zIndex: 100, }} > diff --git a/public/gameassets/cube/background.png b/public/gameassets/cube/background.png deleted file mode 100644 index 94d9e61..0000000 Binary files a/public/gameassets/cube/background.png and /dev/null differ diff --git a/public/gameassets/cube/poster.jpeg b/public/gameassets/cube/poster.jpeg new file mode 100644 index 0000000..48ee878 Binary files /dev/null and b/public/gameassets/cube/poster.jpeg differ diff --git a/styles/globals.css b/styles/globals.css index b710310..c9f0393 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -64,12 +64,31 @@ a { } .modal { - padding: 30px; text-align: center; - box-shadow: 0 0 16px var(--secondary); - border: 5px solid var(--secondary); background: var(--primary); border-radius: var(--radius); + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; +} + +.modal::backdrop { + background: transparent; +} + +.modal[open] { + animation: show 0.3s ease normal; +} + +@keyframes show { + from { + opacity: 0; + } + to { + opacity: 1; + } } .modal h1 { @@ -261,10 +280,23 @@ control-arrow { margin-right: 20px; } -.navLinks a span { +.navSettings span { padding: 10px; - font-size: 35px; + font-size: 30px; + margin: 30px; color: var(--text); + background-color: var(--primary); + border: 3px solid var(--secondary); + box-shadow: 0 0 20px var(--secondary); + border-radius: 50%; +} + +.navSettings { + position: fixed; + top: 0; + right: 0; + z-index: 9999; + height: min-content; } nav { @@ -273,7 +305,8 @@ nav { justify-content: space-between; position: absolute; top: 0; - z-index: 9999; + z-index: 99; + width: 100vw; } nav h2 { @@ -281,62 +314,6 @@ nav h2 { } /* Play page */ -.guideBox { - display: none; - z-index: 2; - position: fixed; - top: 0; - left: 0; - width: 100vw; - height: 100vh; - background: rgba(0, 0, 0, 0.7); - backdrop-filter: blur(50px); -} - -.guideTrigger { - cursor: pointer; - height: 80px; - position: fixed; - top: 20px; - left: 20px; - z-index: 3; -} - -.guideGameLogo { - position: absolute; - top: 20px; - right: 20px; - height: 60px; -} - -.guideMainContent { - position: absolute; - top: 100px; - width: 90%; - padding: 5%; - display: flex; - flex-wrap: wrap; - justify-content: center; - align-items: center; -} - -.guideMainButton { - cursor: pointer; - border: 5px solid var(--secondary); - display: flex; - align-items: center; - justify-content: center; - padding: 15px; - min-width: 200px; - min-height: 100px; - aspect-ratio: 1 / 1; - background-color: var(--primary); - backdrop-filter: blur(100px); - color: var(--text); - margin: 20px; - transition: all 0.3s ease; - border-radius: var(--radius); -} .rws-header { display: none; @@ -356,23 +333,6 @@ nav h2 { color: var(--text) !important; } -.guideMainButton:hover { - transition: all 0.1s ease; - transform: scale(1.1); - box-shadow: 0 0 20px var(--secondary); -} - -.guideButtonContent { - text-align: center; - font-size: 1.2rem; -} - -.guideButtonContent span { - display: block; - font-size: 3rem; - padding-bottom: 20px; -} - .popup { z-index: 9999; display: none; @@ -394,64 +354,31 @@ nav h2 { font-size: 1.4rem; } -.heroVideo { - filter: url(#blur); -} - -.bigButton { - background: var(--secondary); - padding: 15px; - color: var(--text); - border: 5px solid var(--text); - box-shadow: 0 0 20px var(--text); - font-size: 1.5rem; - z-index: 9999; - position: relative; +.carousel .control-arrow, .carousel.carousel-slider .control-arrow { + background: transparent !important; } /* Responsive */ @media screen and (max-width: 700px) { - nav { - /* display: block; */ - /* text-align: center; */ - } - - .navTitleText { - display: none; - /* padding-left: 0; */ - /* padding-right: 0; */ - } - .hideMeOnMobile { display: none !important; } - .bigButton { - background: transparent; - border: unset; - text-decoration: underline; + .navTitleText { + display: block; + margin-top: 2vh; } .gameList { flex-direction: column; - margin-top: 6vh; + margin-top: 23vh; } .game { - width: 100vw; + width: 90vw; padding: 0; margin-top: 3vh; - } - - .game .atropos-inner { - box-shadow: unset; - } - - .modal { - width: 86vw; - border-radius: 0; - border-left: none; - border-right: none; + margin-left: 5vw; } }