mirror of
https://github.com/stronk-dev/RandomChad.git
synced 2025-07-05 10:35:08 +02:00
Frontend selector without signing
This commit is contained in:
parent
66b2598cb9
commit
1f1aeadf46
@ -64,11 +64,12 @@ export default function ComponentName( ) {
|
|||||||
// Actions menu
|
// Actions menu
|
||||||
if( address ) return <Container>
|
if( address ) return <Container>
|
||||||
|
|
||||||
<h1>Rocketeer Interface</h1>
|
<h1>Rocketeer Tools</h1>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<Link className='button' to='/mint'>Mint Rocketeer</Link>
|
<Link className='button' to='/mint'>Mint Rocketeer</Link>
|
||||||
<Link className='button' to='/portfolio'>View Rocketeer Portfolio</Link>
|
<Link className='button' to='/portfolio'>View Rocketeer Portfolio</Link>
|
||||||
|
<Link className='button' to='/outfits'>Use Changing Room</Link>
|
||||||
<Link className='button' to='/verify'>Discord verify</Link>
|
<Link className='button' to='/verify'>Discord verify</Link>
|
||||||
<Link className='button' to='/avatar'>Set address avatar</Link>
|
<Link className='button' to='/avatar'>Set address avatar</Link>
|
||||||
</div>
|
</div>
|
||||||
|
90
minter/src/components/outfits.js
Normal file
90
minter/src/components/outfits.js
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
import { Container, Loading } from './generic'
|
||||||
|
import '../App.css'
|
||||||
|
|
||||||
|
import { useState, useEffect } from 'react'
|
||||||
|
import { useRocketeers } from '../modules/api'
|
||||||
|
import { log } from '../modules/helpers'
|
||||||
|
import { useAddress } from '../modules/web3'
|
||||||
|
|
||||||
|
|
||||||
|
export default function Verifier() {
|
||||||
|
|
||||||
|
// ///////////////////////////////
|
||||||
|
// State management
|
||||||
|
// ///////////////////////////////
|
||||||
|
const address = useAddress()
|
||||||
|
const metamaskAddress = useAddress()
|
||||||
|
const [ validatorAddress, setValidatorAddress ] = useState( )
|
||||||
|
const rocketeers = useRocketeers()
|
||||||
|
const [ selectedId, setSelectedId ] = useState( )
|
||||||
|
const [ rocketeer, setRocketeer ] = useState( )
|
||||||
|
|
||||||
|
|
||||||
|
// ///////////////////////////////
|
||||||
|
// Lifecycle
|
||||||
|
// ///////////////////////////////
|
||||||
|
useEffect( f => {
|
||||||
|
if( !validatorAddress && metamaskAddress ) setValidatorAddress( metamaskAddress )
|
||||||
|
}, [ metamaskAddress, validatorAddress ] )
|
||||||
|
|
||||||
|
useEffect( f => {
|
||||||
|
|
||||||
|
const selected = rocketeers.find( ( { id } ) => id === selectedId )
|
||||||
|
|
||||||
|
if( selected ) {
|
||||||
|
const { value: outfits } = selected.attributes.find( ( { trait_type } ) => trait_type === 'available outfits' ) || 0
|
||||||
|
selected.outfits = outfits
|
||||||
|
}
|
||||||
|
|
||||||
|
log( "Selecting rocketeer ", selected )
|
||||||
|
|
||||||
|
if( selected ) setRocketeer( selected )
|
||||||
|
|
||||||
|
}, [ selectedId, rocketeers ] )
|
||||||
|
|
||||||
|
// ///////////////////////////////
|
||||||
|
// Rendering
|
||||||
|
// ///////////////////////////////
|
||||||
|
|
||||||
|
if( !rocketeers.length ) return <Loading message="Loading Rocketeers, please make sure you selected the right wallet" />
|
||||||
|
|
||||||
|
// Rocketeer selector
|
||||||
|
if(!rocketeer ) return <Container id="avatar" className={ rocketeers.length > 1 ? 'wide' : '' }>
|
||||||
|
|
||||||
|
<h1>Rocketeers</h1>
|
||||||
|
<p>Click on a Rocketeer to manage it's outfits</p>
|
||||||
|
<div className="row">
|
||||||
|
|
||||||
|
{ rocketeers.map( ( { id, image } ) => {
|
||||||
|
|
||||||
|
return <img id={ `rocketeer=${ id }` } onClick={ f => setSelectedId( id ) } key={ id } className='rocketeer' src={ image } alt={ `Rocketeer number ${ id }` } />
|
||||||
|
|
||||||
|
} ) }
|
||||||
|
|
||||||
|
<p className="row">Rocketeers owned by: { address }.</p>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</Container>
|
||||||
|
|
||||||
|
// Changing room
|
||||||
|
if( rocketeer ) return <Container id="avatar" className={ rocketeers.length > 1 ? 'wide' : '' }>
|
||||||
|
|
||||||
|
<h1>Changing room for Rocketeer { selectedId }</h1>
|
||||||
|
<img onClick={ f => window.location.href =`https://viewer.rocketeer.fans/?rocketeer=${ rocketeer.id }` } key={ rocketeer.id } className='rocketeer' src={ rocketeer.image } alt={ `Rocketeer number ${ rocketeer.id }` } />
|
||||||
|
<p>This Rocketeer has { rocketeer.outfits } alternative outfits. { rocketeer.outfits > 0 && 'Click any outfit to select it as primary.' }</p>
|
||||||
|
|
||||||
|
<div className="row">
|
||||||
|
|
||||||
|
{ Array.from( Array( rocketeer.outfits ) ).map( ( val, i ) => {
|
||||||
|
return <img onClick={ f => f } key={ rocketeer.id } className='rocketeer' src={ rocketeer.image.replace( '.jpg', `-${ i + 1 }.jpg` ) } alt={ `Rocketeer number ${ rocketeer.id }` } />
|
||||||
|
} ) }
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p className="row">Rocketeers owned by: { address }.</p>
|
||||||
|
|
||||||
|
</Container>
|
||||||
|
|
||||||
|
}
|
@ -3,6 +3,7 @@ import Metamask from './metamask'
|
|||||||
import Verifier from './verifier'
|
import Verifier from './verifier'
|
||||||
import Avatar from './avatar'
|
import Avatar from './avatar'
|
||||||
import Portfolio from './portfolio'
|
import Portfolio from './portfolio'
|
||||||
|
import Outfits from './outfits'
|
||||||
import { useState, useEffect } from 'react'
|
import { useState, useEffect } from 'react'
|
||||||
import { log } from '../modules/helpers'
|
import { log } from '../modules/helpers'
|
||||||
import { useAddress } from '../modules/web3'
|
import { useAddress } from '../modules/web3'
|
||||||
@ -25,8 +26,6 @@ function Router() {
|
|||||||
// Redirect if metamask not connected
|
// Redirect if metamask not connected
|
||||||
useEffect( f => {
|
useEffect( f => {
|
||||||
|
|
||||||
log( 'Address change' )
|
|
||||||
|
|
||||||
if( timer ) {
|
if( timer ) {
|
||||||
log( `cancelling old timer ${ timer }, address: ${ !!address }` )
|
log( `cancelling old timer ${ timer }, address: ${ !!address }` )
|
||||||
clearTimeout( timer )
|
clearTimeout( timer )
|
||||||
@ -40,7 +39,7 @@ function Router() {
|
|||||||
setTimer( timeoutNumber )
|
setTimer( timeoutNumber )
|
||||||
}
|
}
|
||||||
|
|
||||||
}, [ address, navigate, timer ] )
|
}, [ address, navigate ] ) // Not adding timer on purpose, causes loop
|
||||||
|
|
||||||
// ///////////////////////////////
|
// ///////////////////////////////
|
||||||
// Rendering
|
// Rendering
|
||||||
@ -54,6 +53,7 @@ function Router() {
|
|||||||
</Route>
|
</Route>
|
||||||
<Route exact path='/avatar' element={ <Avatar /> } />
|
<Route exact path='/avatar' element={ <Avatar /> } />
|
||||||
<Route exact path='/portfolio' element={ <Portfolio /> } />
|
<Route exact path='/portfolio' element={ <Portfolio /> } />
|
||||||
|
<Route exact path='/outfits' element={ <Outfits /> } />
|
||||||
|
|
||||||
</Routes>
|
</Routes>
|
||||||
|
|
||||||
|
@ -45,7 +45,10 @@ export function useRocketeers() {
|
|||||||
|
|
||||||
( async function() {
|
( async function() {
|
||||||
|
|
||||||
const rocketeerMetas = await Promise.all( ids.map( id => callApi( `/rocketeer/${ id }` ) ) )
|
const rocketeerMetas = await Promise.all( ids.map( async id => ( {
|
||||||
|
...await callApi( `/rocketeer/${ id }` ),
|
||||||
|
id: id
|
||||||
|
} ) ) )
|
||||||
log( 'Received rocketeers: ', rocketeerMetas )
|
log( 'Received rocketeers: ', rocketeerMetas )
|
||||||
setRocketeers( rocketeerMetas )
|
setRocketeers( rocketeerMetas )
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user