Merge branch 'main' of github.com:actuallymentor/rocketeer

This commit is contained in:
Mentor 2021-12-28 12:04:45 +01:00
commit 11e408ea19
7 changed files with 39 additions and 30 deletions

View File

@ -24,7 +24,8 @@ exports.notifyDiscordWebhook = async function( username, content, avatar_url, im
}
// Make webhook request
await fetch( discord.webhookurl, options )
const data = await fetch( discord.webhookurl, options ).then( res => res.json() )
if( data.code ) throw new Error ( `Discord webhook failed with ${ data.code }: ${ data.message }` )
} catch( e ) {
console.error( 'Discord error ', e )

View File

@ -92,13 +92,13 @@ async function generateNewOutfitFromId( id, network='mainnet' ) {
// Notify discord
const [ firstname ] = rocketeer.name.split( ' ' )
await notifyDiscordWebhook(
await notifyDiscordWebhook(
rocketeer.name,
`${ firstname } obtained a new outfit on ${ network }!`,
`${ firstname } obtained a new outfit on ${ network }! \n\nView this Rocketeer on Opensea: https://opensea.io/assets/0xb3767b2033cf24334095dc82029dbf0e9528039d/${ id }.\n\nView all outfits on the Rocketeer toolkit: https://tools.rocketeer.fans/#/outfits/${ id }`,
rocketeer.image,
`Outfit #${ available_outfits + 1 }`,
newOutfitSvg.replace( '.svg','.jpg' )
)
)
return newOutfitSvg

View File

@ -6,6 +6,7 @@ export default styled.img`
width: 150px;
margin: 1rem;
cursor: ${ ( { onClick } ) => onClick ? 'pointer' : 'none' };
border: ${ ( { highlight } ) => highlight ? '5px solid orange' : 'none' };
&:hover {
box-shadow: ${ ( { onClick } ) => onClick ? '0 0 20px 2px rgb(0 0 0 / 20%)' : 'none' };
}

View File

@ -3,7 +3,6 @@ import CircleImage from '../atoms/CircleImage'
import { Text } from '../atoms/Text'
const Wrapper = styled.div`
`
export default ( { title, ...props } ) => <Wrapper>

View File

@ -177,24 +177,6 @@ export default function Verifier() {
// Find the data for the clicked Rocketeer
const selected = rocketeers.find( ( { id } ) => id === rocketeerId )
// If the selected rocketeer is available, compute it's available outfits to an easy to access property
if( selected ) {
const newOutfitAllowedInterval = 1000 * 60 * 60 * 24 * 30
const { value: outfits } = selected.attributes.find( ( { trait_type } ) => trait_type === 'available outfits' ) || { value: 0 }
const { value: last_outfit_change } = selected.attributes.find( ( { trait_type } ) => trait_type === 'last outfit change' ) || { value: 0 }
const timeUntilAllowedToChange = newOutfitAllowedInterval - ( Date.now() - last_outfit_change )
selected.outfits = outfits
selected.last_outfit_change = last_outfit_change
selected.new_outfit_available = timeUntilAllowedToChange < 0
selected.when_new_outfit = new Date( Date.now() + timeUntilAllowedToChange )
const [ full, outfitnumber ] = selected.image.match( /(?:-)(\d*)(?:\.jpg)/ ) || []
log( `Current outfit of ${ full } is ${ outfitnumber }` )
selected.current_outfit = outfitnumber || 0
}
log( "Selecting rocketeer ", selected )
// Set the selected rocketeer to state
@ -215,9 +197,9 @@ export default function Verifier() {
<Text>Click on a Rocketeer to manage it's outfits</Text>
<Section direction="row">
{ rocketeers.map( ( { id, image } ) => {
{ rocketeers.map( ( { id, image, new_outfit_available } ) => {
return <Avatar id={ `rocketeer-${ id }` } onClick={ f => navigate( `/outfits/${ id }` ) } key={ id } src={ image } alt={ `Rocketeer number ${ id }` } />
return <Avatar highlight={ new_outfit_available } id={ `rocketeer-${ id }` } onClick={ f => navigate( `/outfits/${ id }` ) } key={ id } src={ image } alt={ `Rocketeer number ${ id }` } />
} ) }

View File

@ -5,7 +5,7 @@ import Avatar from '../molecules/Avatar'
import Loading from '../molecules/Loading'
import { useState, useEffect } from 'react'
import { useRocketeerImages } from '../../modules/api'
import { useRocketeers } from '../../modules/api'
import { useAddress } from '../../modules/web3'
@ -17,7 +17,7 @@ export default function Verifier() {
const address = useAddress()
const metamaskAddress = useAddress()
const [ validatorAddress, setValidatorAddress ] = useState( )
const rocketeers = useRocketeerImages()
const rocketeers = useRocketeers()
// ///////////////////////////////
@ -37,9 +37,9 @@ export default function Verifier() {
<Text>Click a Rocketeer to view it's details.</Text>
<Section direction="row">
{ rocketeers.map( ( { id, src } ) => {
{ rocketeers.map( ( { id, image } ) => {
return <Avatar onClick={ f => window.location.href =`https://viewer.rocketeer.fans/?rocketeer=${ id }` } key={ id } src={ src } alt={ `Rocketeer number ${ id }` } />
return <Avatar onClick={ f => window.location.href =`https://viewer.rocketeer.fans/?rocketeer=${ id }` } key={ id } src={ image } alt={ `Rocketeer number ${ id }` } />
} ) }

View File

@ -72,9 +72,35 @@ export function useRocketeers( onlyGrabThisId ) {
}
if( !ids.length || cancelled ) return
// Grab Rocketeer metadata
const rocketeerMetas = await callApi( `/rocketeers/?ids=${ ids.join( ',' ) }` )
log( 'Received rocketeers: ', rocketeerMetas )
if( !cancelled ) setRocketeers( rocketeerMetas )
// Annotate Rocketeers
const annotatedRocketeers = rocketeerMetas.map( rocketeer => {
// This is a dev environment issue where the token ids do not correspond to date
if( !rocketeer.attributes ) return rocketeer
const newOutfitAllowedInterval = 1000 * 60 * 60 * 24 * 30
const { value: outfits } = rocketeer.attributes.find( ( { trait_type } ) => trait_type === 'available outfits' ) || { value: 0 }
const { value: last_outfit_change } = rocketeer.attributes.find( ( { trait_type } ) => trait_type === 'last outfit change' ) || { value: 0 }
const timeUntilAllowedToChange = newOutfitAllowedInterval - ( Date.now() - last_outfit_change )
rocketeer.outfits = outfits
rocketeer.last_outfit_change = last_outfit_change
rocketeer.new_outfit_available = timeUntilAllowedToChange < 0
rocketeer.when_new_outfit = new Date( Date.now() + timeUntilAllowedToChange )
const [ full, outfitnumber ] = rocketeer.image.match( /(?:-)(\d*)(?:\.jpg)/ ) || []
rocketeer.current_outfit = outfitnumber || 0
return rocketeer
} )
if( !cancelled ) setRocketeers( annotatedRocketeers )
} catch( e ) {
log( 'Error getting Rocketeers: ', e )