Spaces:
Paused
Paused
import Button from './Button'; | |
import { toast } from 'react-toastify'; | |
import interactImg from '../../../assets/interact.svg'; | |
import { useConvex, useMutation, useQuery } from 'convex/react'; | |
import { api } from '../../../convex/_generated/api'; | |
// import { SignInButton } from '@clerk/clerk-react'; | |
import { ConvexError } from 'convex/values'; | |
import { Id } from '../../../convex/_generated/dataModel'; | |
import { useCallback } from 'react'; | |
import { waitForInput } from '../../hooks/sendInput'; | |
import { useServerGame } from '../../hooks/serverGame'; | |
export default function InteractButton() { | |
// const { isAuthenticated } = useConvexAuth(); | |
const worldStatus = useQuery(api.world.defaultWorldStatus); | |
const worldId = worldStatus?.worldId; | |
const game = useServerGame(worldId); | |
const oauth = JSON.parse(localStorage.getItem('oauth')); | |
const oauthToken = oauth ? oauth.userInfo.fullname : undefined; | |
const humanTokenIdentifier = useQuery(api.world.userStatus, worldId ? { worldId, oauthToken } : 'skip'); | |
const userPlayerId = | |
game && [...game.world.players.values()].find((p) => p.human === humanTokenIdentifier)?.id; | |
const join = useMutation(api.world.joinWorld); | |
const leave = useMutation(api.world.leaveWorld); | |
const isPlaying = !!userPlayerId; | |
const convex = useConvex(); | |
const joinInput = useCallback( | |
async (worldId: Id<'worlds'>) => { | |
let inputId; | |
try { | |
inputId = await join({ worldId, oauthToken }); | |
} catch (e: any) { | |
if (e instanceof ConvexError) { | |
toast.error(e.data); | |
return; | |
} | |
throw e; | |
} | |
try { | |
await waitForInput(convex, inputId); | |
} catch (e: any) { | |
toast.error(e.message); | |
} | |
}, | |
[convex, join, oauthToken], | |
); | |
const joinOrLeaveGame = () => { | |
if ( | |
!worldId || | |
// || !isAuthenticated | |
game === undefined | |
) { | |
return; | |
} | |
if (isPlaying) { | |
console.log(`Leaving game for player ${userPlayerId}`); | |
void leave({ worldId , oauthToken}); | |
} else { | |
console.log(`Joining game`); | |
void joinInput(worldId); | |
} | |
}; | |
// if (!isAuthenticated || game === undefined) { | |
// return ( | |
// <SignInButton> | |
// <button className="button text-white shadow-solid text-2xl pointer-events-auto"> | |
// <div className="inline-block bg-clay-700"> | |
// <span> | |
// <div className="inline-flex h-full items-center gap-4"> | |
// <img className="w-4 h-4 sm:w-[30px] sm:h-[30px]" src={interactImg} /> | |
// Interact | |
// </div> | |
// </span> | |
// </div> | |
// </button> | |
// </SignInButton> | |
// ); | |
// } | |
return ( | |
<Button imgUrl={interactImg} onClick={joinOrLeaveGame}> | |
{isPlaying ? 'Leave' : 'Interact'} | |
</Button> | |
); | |
} | |