mirror of
https://github.com/MetaFam/TheGame.git
synced 2026-04-24 03:00:09 -04:00
fixed LinkOverlay issues
This commit is contained in:
@@ -33,7 +33,7 @@
|
||||
"body-parser": "1.19.0",
|
||||
"bottleneck": "2.19.5",
|
||||
"discord.js": "12.5.3",
|
||||
"ethers": "5.4.1",
|
||||
"ethers": "5.4.3",
|
||||
"express": "4.17.1",
|
||||
"express-graphql": "0.12.0",
|
||||
"graphql": "15.5.0",
|
||||
|
||||
@@ -24,9 +24,9 @@
|
||||
"react": ">=16"
|
||||
},
|
||||
"dependencies": {
|
||||
"@chakra-ui/icons": "1.0.13",
|
||||
"@chakra-ui/react": "1.6.3",
|
||||
"@chakra-ui/theme-tools": "1.1.7",
|
||||
"@chakra-ui/icons": "1.0.14",
|
||||
"@chakra-ui/react": "1.6.5",
|
||||
"@chakra-ui/theme-tools": "1.1.8",
|
||||
"@emotion/react": "11.4.0",
|
||||
"@emotion/styled": "11.3.0",
|
||||
"@types/react": "17.0.6",
|
||||
|
||||
@@ -15,6 +15,7 @@ export const MetaButton: React.FC<
|
||||
size="lg"
|
||||
fontSize="sm"
|
||||
bg="purple.400"
|
||||
color="white"
|
||||
ref={ref}
|
||||
{...props}
|
||||
>
|
||||
|
||||
@@ -32,6 +32,7 @@ export const MetaTile: React.FC<FlexProps> = ({ children, ...props }) => (
|
||||
p={6}
|
||||
maxW="25rem" // (2 / 3.5) = ~0.571 aspect ratio desired
|
||||
w="100%"
|
||||
h="100%"
|
||||
align="stretch"
|
||||
position="relative"
|
||||
overflow="hidden"
|
||||
|
||||
@@ -19,13 +19,13 @@
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@types/express": "4.17.11",
|
||||
"@types/node-fetch": "2.5.10",
|
||||
"@metafam/utils": "1.0.0",
|
||||
"@typeit/discord": "4.0.10",
|
||||
"@types/express": "4.17.11",
|
||||
"@types/node-fetch": "2.5.10",
|
||||
"discord.js": "12.5.3",
|
||||
"dotenv": "9.0.2",
|
||||
"ethers": "5.4.1",
|
||||
"ethers": "5.4.3",
|
||||
"express": "4.17.1",
|
||||
"graphql": "15.5.0",
|
||||
"graphql-request": "3.4.0",
|
||||
|
||||
@@ -15,9 +15,9 @@
|
||||
"dependencies": {
|
||||
"@types/uuid": "8.3.0",
|
||||
"bignumber.js": "9.0.1",
|
||||
"ethers": "5.4.1",
|
||||
"ethers": "5.4.3",
|
||||
"js-base64": "3.6.1",
|
||||
"uuid": "8.3.2",
|
||||
"sourcecred": "0.9.0"
|
||||
"sourcecred": "0.9.0",
|
||||
"uuid": "8.3.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,8 @@ import {
|
||||
Avatar,
|
||||
Box,
|
||||
Heading,
|
||||
LinkBox,
|
||||
LinkOverlay,
|
||||
MetaButton,
|
||||
MetaTag,
|
||||
MetaTile,
|
||||
@@ -10,8 +12,8 @@ import {
|
||||
Text,
|
||||
VStack,
|
||||
} from '@metafam/ds';
|
||||
import { MetaLink } from 'components/Link';
|
||||
import { GuildFragmentFragment } from 'graphql/autogen/types';
|
||||
import NextLink from 'next/link';
|
||||
import React from 'react';
|
||||
|
||||
type Props = {
|
||||
@@ -19,51 +21,53 @@ type Props = {
|
||||
};
|
||||
|
||||
export const GuildTile: React.FC<Props> = ({ guild }) => (
|
||||
<MetaTile>
|
||||
<MetaTileHeader>
|
||||
<MetaLink
|
||||
<LinkBox>
|
||||
<MetaTile>
|
||||
<NextLink
|
||||
as={`/guild/${guild.guildname}`}
|
||||
href="/guild/[guildname]"
|
||||
key={guild.id}
|
||||
passHref
|
||||
>
|
||||
<VStack>
|
||||
{guild.logo ? (
|
||||
<Avatar size="xl" src={guild.logo} name={guild.name} />
|
||||
) : null}
|
||||
<LinkOverlay>
|
||||
<MetaTileHeader>
|
||||
<VStack>
|
||||
{guild.logo ? (
|
||||
<Avatar size="xl" src={guild.logo} name={guild.name} />
|
||||
) : null}
|
||||
|
||||
<Heading size="sm" color="white">
|
||||
{guild.name}
|
||||
</Heading>
|
||||
</VStack>
|
||||
</MetaLink>
|
||||
{guild.type ? (
|
||||
<Box align="center" mt={0}>
|
||||
<MetaTag size="md">{guild.type} GUILD</MetaTag>
|
||||
</Box>
|
||||
) : null}
|
||||
{guild.position ? (
|
||||
<Box align="center" mt={0}>
|
||||
<MetaTag size="md">{guild.position} GUILD</MetaTag>
|
||||
</Box>
|
||||
) : null}
|
||||
{guild.description ? (
|
||||
<VStack spacing={2} align="stretch">
|
||||
<Text textStyle="caption">ABOUT</Text>
|
||||
<Text fontSize="sm">{guild.description}</Text>
|
||||
</VStack>
|
||||
) : null}
|
||||
</MetaTileHeader>
|
||||
<MetaTileBody>
|
||||
{guild.join_button_url ? (
|
||||
<MetaButton
|
||||
as="a"
|
||||
href={guild.join_button_url}
|
||||
target="_blank"
|
||||
fontFamily="mono"
|
||||
>
|
||||
Join
|
||||
</MetaButton>
|
||||
) : null}
|
||||
</MetaTileBody>
|
||||
</MetaTile>
|
||||
<Heading size="sm" color="white">
|
||||
{guild.name}
|
||||
</Heading>
|
||||
</VStack>
|
||||
{guild.type ? (
|
||||
<Box align="center">
|
||||
<MetaTag size="md">
|
||||
{guild.type}
|
||||
GUILD
|
||||
</MetaTag>
|
||||
</Box>
|
||||
) : null}
|
||||
{guild.description ? (
|
||||
<VStack spacing={2} align="stretch">
|
||||
<Text textStyle="caption">ABOUT</Text>
|
||||
<Text fontSize="sm">{guild.description}</Text>
|
||||
</VStack>
|
||||
) : null}
|
||||
</MetaTileHeader>
|
||||
</LinkOverlay>
|
||||
</NextLink>
|
||||
<MetaTileBody>
|
||||
{guild.join_button_url ? (
|
||||
<MetaButton
|
||||
as="a"
|
||||
href={guild.join_button_url}
|
||||
target="_blank"
|
||||
fontFamily="mono"
|
||||
>
|
||||
Join
|
||||
</MetaButton>
|
||||
) : null}
|
||||
</MetaTileBody>
|
||||
</MetaTile>
|
||||
</LinkBox>
|
||||
);
|
||||
|
||||
@@ -2,6 +2,8 @@ import {
|
||||
Box,
|
||||
Heading,
|
||||
HStack,
|
||||
LinkBox,
|
||||
LinkOverlay,
|
||||
MetaTag,
|
||||
MetaTile,
|
||||
MetaTileBody,
|
||||
@@ -12,7 +14,6 @@ import {
|
||||
WrapItem,
|
||||
} from '@metafam/ds';
|
||||
import { computeRank } from '@metafam/utils';
|
||||
import { MetaLink } from 'components/Link';
|
||||
import { PlayerAvatar } from 'components/Player/PlayerAvatar';
|
||||
import { PlayerContacts } from 'components/Player/PlayerContacts';
|
||||
import { PlayerTileMemberships } from 'components/Player/PlayerTileMemberships';
|
||||
@@ -24,6 +25,7 @@ import {
|
||||
Skill,
|
||||
} from 'graphql/autogen/types';
|
||||
import { Patron } from 'graphql/types';
|
||||
import NextLink from 'next/link';
|
||||
import React, { useMemo } from 'react';
|
||||
import { FaGlobe } from 'react-icons/fa';
|
||||
import { getPlayerTimeZoneDisplay } from 'utils/dateHelpers';
|
||||
@@ -62,98 +64,104 @@ export const PatronTile: React.FC<Props> = ({ index, patron }) => {
|
||||
? `${description.substring(0, MAX_BIO_LENGTH - 9)}…`
|
||||
: description;
|
||||
return (
|
||||
<MetaTile>
|
||||
<Box
|
||||
bgImage={`url(${getPlayerCoverImage(player)})`}
|
||||
bgSize="cover"
|
||||
bgPosition="center"
|
||||
position="absolute"
|
||||
top="0"
|
||||
left="0"
|
||||
w="100%"
|
||||
h="4.5rem"
|
||||
/>
|
||||
<MetaTileHeader>
|
||||
<MetaLink
|
||||
<LinkBox>
|
||||
<MetaTile>
|
||||
<Box
|
||||
bgImage={`url(${getPlayerCoverImage(player)})`}
|
||||
bgSize="cover"
|
||||
bgPosition="center"
|
||||
position="absolute"
|
||||
top="0"
|
||||
left="0"
|
||||
w="100%"
|
||||
h="4.5rem"
|
||||
/>
|
||||
<NextLink
|
||||
as={`/player/${player.username}`}
|
||||
href="/player/[username]"
|
||||
key={player.id}
|
||||
passHref
|
||||
>
|
||||
<VStack>
|
||||
<PlayerAvatar player={player} size="xl" />
|
||||
<Heading size="xs" color="white">
|
||||
{getPlayerName(player)}
|
||||
</Heading>
|
||||
</VStack>
|
||||
</MetaLink>
|
||||
<Wrap w="100%" justify="center">
|
||||
{patron.pSeedBalance ? (
|
||||
<WrapItem>
|
||||
<MetaTag size="md">
|
||||
{`pSEED: ${Math.floor(
|
||||
Number(utils.formatEther(patron.pSeedBalance)),
|
||||
)}`}
|
||||
</MetaTag>
|
||||
</WrapItem>
|
||||
<LinkOverlay>
|
||||
<MetaTileHeader>
|
||||
<VStack>
|
||||
<PlayerAvatar player={player} size="xl" />
|
||||
<Heading size="xs" color="white">
|
||||
{getPlayerName(player)}
|
||||
</Heading>
|
||||
</VStack>
|
||||
<Wrap w="100%" justify="center">
|
||||
{patron.pSeedBalance ? (
|
||||
<WrapItem>
|
||||
<MetaTag size="md">
|
||||
{`pSEED: ${Math.floor(
|
||||
Number(utils.formatEther(patron.pSeedBalance)),
|
||||
)}`}
|
||||
</MetaTag>
|
||||
</WrapItem>
|
||||
) : null}
|
||||
{patronRank ? (
|
||||
<WrapItem>
|
||||
<MetaTag
|
||||
backgroundColor={patronRank?.toLowerCase()}
|
||||
size="md"
|
||||
color="blackAlpha.600"
|
||||
>
|
||||
{patronRank}
|
||||
</MetaTag>
|
||||
</WrapItem>
|
||||
) : null}
|
||||
<WrapItem>
|
||||
<MetaTag size="md">{`XP: ${Math.floor(
|
||||
player.total_xp,
|
||||
)}`}</MetaTag>
|
||||
</WrapItem>
|
||||
</Wrap>
|
||||
{tzDisplay?.timeZone ? (
|
||||
<HStack alignItems="baseline" w="auto" justify="center">
|
||||
<FaGlobe color="blueLight" fontSize="0.875rem" />
|
||||
<Text fontSize="lg">{tzDisplay?.timeZone || '-'}</Text>
|
||||
{tzDisplay?.offset ? (
|
||||
<Text fontSize="sm">{tzDisplay?.offset}</Text>
|
||||
) : (
|
||||
''
|
||||
)}
|
||||
</HStack>
|
||||
) : null}
|
||||
{displayDescription ? (
|
||||
<VStack spacing={2} align="stretch" pt="0.5rem">
|
||||
<Text textStyle="caption">ABOUT</Text>
|
||||
<Text fontSize="sm">{displayDescription}</Text>
|
||||
</VStack>
|
||||
) : null}
|
||||
</MetaTileHeader>
|
||||
</LinkOverlay>
|
||||
</NextLink>
|
||||
<MetaTileBody>
|
||||
{player.Player_Skills.length ? (
|
||||
<VStack spacing={2} align="stretch">
|
||||
<Text textStyle="caption">SKILLS</Text>
|
||||
<SkillsTags
|
||||
skills={player.Player_Skills.map((s) => s.Skill) as Skill[]}
|
||||
/>
|
||||
</VStack>
|
||||
) : null}
|
||||
{patronRank ? (
|
||||
<WrapItem>
|
||||
<MetaTag
|
||||
backgroundColor={patronRank?.toLowerCase()}
|
||||
size="md"
|
||||
color="blackAlpha.600"
|
||||
>
|
||||
{patronRank}
|
||||
</MetaTag>
|
||||
</WrapItem>
|
||||
) : null}
|
||||
<WrapItem>
|
||||
<MetaTag size="md">{`XP: ${Math.floor(player.total_xp)}`}</MetaTag>
|
||||
</WrapItem>
|
||||
</Wrap>
|
||||
{tzDisplay?.timeZone ? (
|
||||
<HStack alignItems="baseline" w="auto" justify="center">
|
||||
<FaGlobe color="blueLight" fontSize="0.875rem" />
|
||||
<Text fontSize="lg">{tzDisplay?.timeZone || '-'}</Text>
|
||||
{tzDisplay?.offset ? (
|
||||
<Text fontSize="sm">{tzDisplay?.offset}</Text>
|
||||
) : (
|
||||
''
|
||||
)}
|
||||
</HStack>
|
||||
) : null}
|
||||
{displayDescription ? (
|
||||
<VStack spacing={2} align="stretch" pt="0.5rem">
|
||||
<Text textStyle="caption">ABOUT</Text>
|
||||
<Text fontSize="sm">{displayDescription}</Text>
|
||||
</VStack>
|
||||
) : null}
|
||||
</MetaTileHeader>
|
||||
<MetaTileBody>
|
||||
{player.Player_Skills.length ? (
|
||||
<VStack spacing={2} align="stretch">
|
||||
<Text textStyle="caption">SKILLS</Text>
|
||||
<SkillsTags
|
||||
skills={player.Player_Skills.map((s) => s.Skill) as Skill[]}
|
||||
/>
|
||||
</VStack>
|
||||
) : null}
|
||||
|
||||
{player.daohausMemberships.length ? (
|
||||
<VStack spacing={2} align="stretch">
|
||||
<Text textStyle="caption">MEMBER OF</Text>
|
||||
<PlayerTileMemberships player={player} />
|
||||
</VStack>
|
||||
) : null}
|
||||
{player.Accounts.length ? (
|
||||
<VStack spacing={2} align="stretch">
|
||||
<Text textStyle="caption">CONTACT</Text>
|
||||
<HStack mt="2">
|
||||
<PlayerContacts player={player} />
|
||||
</HStack>
|
||||
</VStack>
|
||||
) : null}
|
||||
</MetaTileBody>
|
||||
</MetaTile>
|
||||
{player.daohausMemberships.length ? (
|
||||
<VStack spacing={2} align="stretch">
|
||||
<Text textStyle="caption">MEMBER OF</Text>
|
||||
<PlayerTileMemberships player={player} />
|
||||
</VStack>
|
||||
) : null}
|
||||
{player.Accounts.length ? (
|
||||
<VStack spacing={2} align="stretch">
|
||||
<Text textStyle="caption">CONTACT</Text>
|
||||
<HStack mt="2">
|
||||
<PlayerContacts player={player} />
|
||||
</HStack>
|
||||
</VStack>
|
||||
) : null}
|
||||
</MetaTileBody>
|
||||
</MetaTile>
|
||||
</LinkBox>
|
||||
);
|
||||
};
|
||||
|
||||
167
packages/web/components/Patron/PatronTile.tsx.bak
Normal file
167
packages/web/components/Patron/PatronTile.tsx.bak
Normal file
@@ -0,0 +1,167 @@
|
||||
import {
|
||||
Box,
|
||||
Heading,
|
||||
HStack,
|
||||
MetaTag,
|
||||
MetaTile,
|
||||
MetaTileBody,
|
||||
MetaTileHeader,
|
||||
LinkBox,
|
||||
LinkOverlay,
|
||||
Text,
|
||||
VStack,
|
||||
Wrap,
|
||||
WrapItem,
|
||||
} from '@metafam/ds';
|
||||
import { computeRank } from '@metafam/utils';
|
||||
import { MetaLink } from 'components/Link';
|
||||
import { PlayerAvatar } from 'components/Player/PlayerAvatar';
|
||||
import { PlayerContacts } from 'components/Player/PlayerContacts';
|
||||
import { PlayerTileMemberships } from 'components/Player/PlayerTileMemberships';
|
||||
import { SkillsTags } from 'components/Skills';
|
||||
import { utils } from 'ethers';
|
||||
import {
|
||||
PlayerFragmentFragment,
|
||||
PlayerRank_Enum,
|
||||
Skill,
|
||||
} from 'graphql/autogen/types';
|
||||
import { Patron } from 'graphql/types';
|
||||
import React, { useMemo } from 'react';
|
||||
import { FaGlobe } from 'react-icons/fa';
|
||||
import { getPlayerTimeZoneDisplay } from 'utils/dateHelpers';
|
||||
import {
|
||||
getPlayerCoverImage,
|
||||
getPlayerDescription,
|
||||
getPlayerName,
|
||||
} from 'utils/playerHelpers';
|
||||
|
||||
const PATRON_RANKS = [
|
||||
PlayerRank_Enum.Diamond,
|
||||
PlayerRank_Enum.Platinum,
|
||||
PlayerRank_Enum.Gold,
|
||||
PlayerRank_Enum.Silver,
|
||||
PlayerRank_Enum.Bronze,
|
||||
];
|
||||
|
||||
const PATRONS_PER_RANK = [7, 7, 7, 14, 21];
|
||||
|
||||
type Props = {
|
||||
patron: Patron;
|
||||
index: number;
|
||||
};
|
||||
|
||||
const MAX_BIO_LENGTH = 240;
|
||||
|
||||
export const PatronTile: React.FC<Props> = ({ index, patron }) => {
|
||||
const player = patron as PlayerFragmentFragment;
|
||||
const patronRank = computeRank(index, PATRONS_PER_RANK, PATRON_RANKS);
|
||||
const tzDisplay = useMemo(() => getPlayerTimeZoneDisplay(player.timezone), [
|
||||
player.timezone,
|
||||
]);
|
||||
const description = getPlayerDescription(player);
|
||||
const displayDescription =
|
||||
description && description.length > MAX_BIO_LENGTH
|
||||
? `${description.substring(0, MAX_BIO_LENGTH - 9)}…`
|
||||
: description;
|
||||
return (
|
||||
<LinkBox>
|
||||
<LinkOverlay href={`/player/${player.username}`}>
|
||||
<MetaTile>
|
||||
<Box
|
||||
bgImage={`url(${getPlayerCoverImage(player)})`}
|
||||
bgSize="cover"
|
||||
bgPosition="center"
|
||||
position="absolute"
|
||||
top="0"
|
||||
left="0"
|
||||
w="100%"
|
||||
h="4.5rem"
|
||||
/>
|
||||
<MetaTileHeader>
|
||||
<MetaLink
|
||||
as={`/player/${player.username}`}
|
||||
href="/player/[username]"
|
||||
key={player.id}
|
||||
>
|
||||
<VStack>
|
||||
<PlayerAvatar player={player} size="xl" />
|
||||
<Heading size="xs" color="white">
|
||||
{getPlayerName(player)}
|
||||
</Heading>
|
||||
</VStack>
|
||||
</MetaLink>
|
||||
<Wrap w="100%" justify="center">
|
||||
{patron.pSeedBalance ? (
|
||||
<WrapItem>
|
||||
<MetaTag size="md">
|
||||
{`pSEED: ${Math.floor(
|
||||
Number(utils.formatEther(patron.pSeedBalance)),
|
||||
)}`}
|
||||
</MetaTag>
|
||||
</WrapItem>
|
||||
) : null}
|
||||
{patronRank ? (
|
||||
<WrapItem>
|
||||
<MetaTag
|
||||
backgroundColor={patronRank?.toLowerCase()}
|
||||
size="md"
|
||||
color="blackAlpha.600"
|
||||
>
|
||||
{patronRank}
|
||||
</MetaTag>
|
||||
</WrapItem>
|
||||
) : null}
|
||||
<WrapItem>
|
||||
<MetaTag size="md">{`XP: ${Math.floor(
|
||||
player.total_xp,
|
||||
)}`}</MetaTag>
|
||||
</WrapItem>
|
||||
</Wrap>
|
||||
{tzDisplay?.timeZone ? (
|
||||
<HStack alignItems="baseline" w="auto" justify="center">
|
||||
<FaGlobe color="blueLight" fontSize="0.875rem" />
|
||||
<Text fontSize="lg">{tzDisplay?.timeZone || '-'}</Text>
|
||||
{tzDisplay?.offset ? (
|
||||
<Text fontSize="sm">{tzDisplay?.offset}</Text>
|
||||
) : (
|
||||
''
|
||||
)}
|
||||
</HStack>
|
||||
) : null}
|
||||
{displayDescription ? (
|
||||
<VStack spacing={2} align="stretch" pt="0.5rem">
|
||||
<Text textStyle="caption">ABOUT</Text>
|
||||
<Text fontSize="sm">{displayDescription}</Text>
|
||||
</VStack>
|
||||
) : null}
|
||||
</MetaTileHeader>
|
||||
<MetaTileBody>
|
||||
{player.Player_Skills.length ? (
|
||||
<VStack spacing={2} align="stretch">
|
||||
<Text textStyle="caption">SKILLS</Text>
|
||||
<SkillsTags
|
||||
skills={player.Player_Skills.map((s) => s.Skill) as Skill[]}
|
||||
/>
|
||||
</VStack>
|
||||
) : null}
|
||||
|
||||
{player.daohausMemberships.length ? (
|
||||
<VStack spacing={2} align="stretch">
|
||||
<Text textStyle="caption">MEMBER OF</Text>
|
||||
<PlayerTileMemberships player={player} />
|
||||
</VStack>
|
||||
) : null}
|
||||
{player.Accounts.length ? (
|
||||
<VStack spacing={2} align="stretch">
|
||||
<Text textStyle="caption">CONTACT</Text>
|
||||
<HStack mt="2">
|
||||
<PlayerContacts player={player} />
|
||||
</HStack>
|
||||
</VStack>
|
||||
) : null}
|
||||
</MetaTileBody>
|
||||
</MetaTile>
|
||||
</LinkOverlay>
|
||||
</LinkBox>
|
||||
);
|
||||
};
|
||||
@@ -31,6 +31,7 @@ export const PlayerContacts: React.FC<Props> = ({
|
||||
rel="noreferrer noopener"
|
||||
size="xs"
|
||||
colorScheme="twitter"
|
||||
color="white"
|
||||
leftIcon={<FaTwitter />}
|
||||
>
|
||||
{acc.identifier}
|
||||
@@ -51,6 +52,7 @@ export const PlayerContacts: React.FC<Props> = ({
|
||||
colorScheme="blackAlpha"
|
||||
backgroundColor="black"
|
||||
leftIcon={<FaGithub />}
|
||||
color="white"
|
||||
>
|
||||
{acc.identifier}
|
||||
</Button>
|
||||
@@ -76,6 +78,7 @@ export const PlayerContacts: React.FC<Props> = ({
|
||||
size="xs"
|
||||
colorScheme="blackAlpha"
|
||||
leftIcon={<FaEthereum />}
|
||||
color="white"
|
||||
>
|
||||
{formatAddress(player.ethereum_address)}
|
||||
</Button>
|
||||
@@ -89,6 +92,7 @@ export const PlayerContacts: React.FC<Props> = ({
|
||||
size="xs"
|
||||
colorScheme="brightIdOrange"
|
||||
leftIcon={<BrightIdIcon />}
|
||||
color="white"
|
||||
>
|
||||
Verified
|
||||
</Button>
|
||||
|
||||
@@ -21,6 +21,7 @@ import {
|
||||
PlayerFragmentFragment,
|
||||
/* Player_Update_Column, */ Skill,
|
||||
} from 'graphql/autogen/types';
|
||||
import NextLink from 'next/link';
|
||||
import React, { useMemo } from 'react';
|
||||
import { FaGlobe } from 'react-icons/fa';
|
||||
import { getPlayerTimeZoneDisplay } from 'utils/dateHelpers';
|
||||
@@ -62,56 +63,73 @@ export const PlayerTile: React.FC<Props> = ({
|
||||
w="100%"
|
||||
h="4.5rem"
|
||||
/>
|
||||
<LinkOverlay href={`/player/${player.username}`}>
|
||||
<MetaTileHeader>
|
||||
<VStack>
|
||||
<PlayerAvatar player={player} size="xl" />
|
||||
<Heading size="xs" color="white">
|
||||
{getPlayerName(player)}
|
||||
</Heading>
|
||||
</VStack>
|
||||
<Wrap w="100%" justify="center">
|
||||
{player.playerType?.title ? (
|
||||
<WrapItem>
|
||||
<MetaTag size="md">
|
||||
{player.playerType?.title.toUpperCase()}
|
||||
</MetaTag>
|
||||
</WrapItem>
|
||||
) : null}
|
||||
{player.rank && (
|
||||
<WrapItem>
|
||||
<MetaTag
|
||||
backgroundColor={player.rank?.toLowerCase()}
|
||||
size="md"
|
||||
color="blackAlpha.600"
|
||||
>
|
||||
{player.rank}
|
||||
</MetaTag>
|
||||
</WrapItem>
|
||||
)}
|
||||
<WrapItem>
|
||||
<MetaTag size="md">XP: {Math.floor(player.total_xp)}</MetaTag>
|
||||
</WrapItem>
|
||||
</Wrap>
|
||||
{tzDisplay?.timeZone ? (
|
||||
<HStack alignItems="baseline" w="auto" justify="center">
|
||||
<FaGlobe color="blueLight" fontSize="0.875rem" />
|
||||
<Text fontSize="lg">{tzDisplay?.timeZone || '-'}</Text>
|
||||
{tzDisplay?.offset ? (
|
||||
<Text fontSize="sm">{tzDisplay?.offset}</Text>
|
||||
) : (
|
||||
''
|
||||
)}
|
||||
</HStack>
|
||||
) : null}
|
||||
{displayDescription ? (
|
||||
<VStack spacing={2} align="stretch" pt="0.5rem">
|
||||
<Text textStyle="caption">ABOUT</Text>
|
||||
<Text fontSize="sm">{displayDescription}</Text>
|
||||
<NextLink
|
||||
as={`/player/${player.username}`}
|
||||
href="/player/[username]"
|
||||
passHref
|
||||
>
|
||||
<LinkOverlay>
|
||||
<MetaTileHeader>
|
||||
<VStack>
|
||||
<PlayerAvatar player={player} size="xl" />
|
||||
<Heading size="xs" color="white">
|
||||
{getPlayerName(player)}
|
||||
</Heading>
|
||||
</VStack>
|
||||
) : null}
|
||||
</MetaTileHeader>
|
||||
</LinkOverlay>
|
||||
<Wrap w="100%" justify="center">
|
||||
{player.playerType?.title ? (
|
||||
<WrapItem>
|
||||
<MetaTag size="md">
|
||||
{player.playerType?.title.toUpperCase()}
|
||||
</MetaTag>
|
||||
</WrapItem>
|
||||
) : null}
|
||||
{player.rank && (
|
||||
<WrapItem>
|
||||
<MetaTag
|
||||
backgroundColor={player.rank?.toLowerCase()}
|
||||
size="md"
|
||||
color="blackAlpha.600"
|
||||
>
|
||||
{player.rank}
|
||||
</MetaTag>
|
||||
</WrapItem>
|
||||
)}
|
||||
{player.rank && (
|
||||
<WrapItem>
|
||||
<MetaTag
|
||||
backgroundColor={player.rank?.toLowerCase()}
|
||||
size="md"
|
||||
color="blackAlpha.600"
|
||||
>
|
||||
{player.rank}
|
||||
</MetaTag>
|
||||
</WrapItem>
|
||||
)}
|
||||
<WrapItem>
|
||||
<MetaTag size="md">XP: {Math.floor(player.total_xp)}</MetaTag>
|
||||
</WrapItem>
|
||||
</Wrap>
|
||||
{tzDisplay?.timeZone ? (
|
||||
<HStack alignItems="baseline" w="auto" justify="center">
|
||||
<FaGlobe color="blueLight" fontSize="0.875rem" />
|
||||
<Text fontSize="lg">{tzDisplay?.timeZone || '-'}</Text>
|
||||
{tzDisplay?.offset ? (
|
||||
<Text fontSize="sm">{tzDisplay?.offset}</Text>
|
||||
) : (
|
||||
''
|
||||
)}
|
||||
</HStack>
|
||||
) : null}
|
||||
{displayDescription ? (
|
||||
<VStack spacing={2} align="stretch" pt="0.5rem">
|
||||
<Text textStyle="caption">ABOUT</Text>
|
||||
<Text fontSize="sm">{displayDescription}</Text>
|
||||
</VStack>
|
||||
) : null}
|
||||
</MetaTileHeader>
|
||||
</LinkOverlay>
|
||||
</NextLink>
|
||||
<MetaTileBody>
|
||||
{player.Player_Skills.length ? (
|
||||
<VStack spacing={2} align="stretch">
|
||||
|
||||
@@ -96,6 +96,7 @@ export const QuestFilter: React.FC<Props> = ({
|
||||
variant="outline"
|
||||
borderWidth="2px"
|
||||
borderRadius="4px"
|
||||
color="cyan.500"
|
||||
px={4}
|
||||
onClick={() =>
|
||||
setQueryVariable(
|
||||
|
||||
@@ -4,6 +4,8 @@ import {
|
||||
Flex,
|
||||
Heading,
|
||||
HStack,
|
||||
LinkBox,
|
||||
LinkOverlay,
|
||||
MetaTile,
|
||||
MetaTileBody,
|
||||
MetaTileHeader,
|
||||
@@ -11,9 +13,9 @@ import {
|
||||
VStack,
|
||||
} from '@metafam/ds';
|
||||
import BackgroundImage from 'assets/main-background.jpg';
|
||||
import { MetaLink } from 'components/Link';
|
||||
import { QuestFragmentFragment, Skill } from 'graphql/autogen/types';
|
||||
import moment from 'moment';
|
||||
import NextLink from 'next/link';
|
||||
import React from 'react';
|
||||
|
||||
import { SkillsTags } from '../Skills';
|
||||
@@ -24,55 +26,59 @@ type Props = {
|
||||
};
|
||||
|
||||
export const QuestTile: React.FC<Props> = ({ quest }) => (
|
||||
<MetaTile>
|
||||
<Box
|
||||
bgImage={`url(${BackgroundImage})`}
|
||||
bgSize="cover"
|
||||
bgPosition="center"
|
||||
position="absolute"
|
||||
top="0"
|
||||
left="0"
|
||||
w="100%"
|
||||
h="3.5rem"
|
||||
/>
|
||||
<Flex justify="center" mb={4}>
|
||||
<Avatar
|
||||
size="lg"
|
||||
src={quest.guild.logo || undefined}
|
||||
name={quest.guild.name}
|
||||
<LinkBox>
|
||||
<MetaTile>
|
||||
<Box
|
||||
bgImage={`url(${BackgroundImage})`}
|
||||
bgSize="cover"
|
||||
bgPosition="center"
|
||||
position="absolute"
|
||||
top="0"
|
||||
left="0"
|
||||
w="100%"
|
||||
h="3.5rem"
|
||||
/>
|
||||
</Flex>
|
||||
|
||||
<MetaTileHeader>
|
||||
<VStack>
|
||||
<MetaLink as={`/quest/${quest.id}`} href="/quest/[id]">
|
||||
<Heading size="sm" color="white" align="center">
|
||||
{quest.title}
|
||||
</Heading>
|
||||
</MetaLink>
|
||||
<HStack mt={2}>
|
||||
<RepetitionTag
|
||||
repetition={quest.repetition}
|
||||
cooldown={quest.cooldown}
|
||||
/>
|
||||
<StatusTag status={quest.status} />
|
||||
<Text>
|
||||
<i>{moment(quest.created_at).fromNow()}</i>
|
||||
</Text>
|
||||
</HStack>
|
||||
</VStack>
|
||||
</MetaTileHeader>
|
||||
<MetaTileBody flex={1}>
|
||||
<VStack spacing={2} align="stretch">
|
||||
<Text textStyle="caption">DESCRIPTION</Text>
|
||||
<Text noOfLines={4}>{quest.description}</Text>
|
||||
|
||||
<Text textStyle="caption">SKILLS</Text>
|
||||
<SkillsTags
|
||||
skills={quest.quest_skills.map((s) => s.skill) as Skill[]}
|
||||
maxSkills={4}
|
||||
<Flex justify="center" mb={4}>
|
||||
<Avatar
|
||||
size="lg"
|
||||
src={quest.guild.logo || undefined}
|
||||
name={quest.guild.name}
|
||||
/>
|
||||
</VStack>
|
||||
</MetaTileBody>
|
||||
</MetaTile>
|
||||
</Flex>
|
||||
|
||||
<NextLink as={`/quest/${quest.id}`} href="/quest/[id]" passHref>
|
||||
<LinkOverlay>
|
||||
<MetaTileHeader>
|
||||
<VStack>
|
||||
<Heading size="sm" color="white" align="center">
|
||||
{quest.title}
|
||||
</Heading>
|
||||
<HStack mt={2}>
|
||||
<RepetitionTag
|
||||
repetition={quest.repetition}
|
||||
cooldown={quest.cooldown}
|
||||
/>
|
||||
<StatusTag status={quest.status} />
|
||||
<Text>
|
||||
<i>{moment(quest.created_at).fromNow()}</i>
|
||||
</Text>
|
||||
</HStack>
|
||||
</VStack>
|
||||
</MetaTileHeader>
|
||||
</LinkOverlay>
|
||||
</NextLink>
|
||||
<MetaTileBody flex={1}>
|
||||
<VStack spacing={2} align="stretch">
|
||||
<Text textStyle="caption">DESCRIPTION</Text>
|
||||
<Text noOfLines={4}>{quest.description}</Text>
|
||||
|
||||
<Text textStyle="caption">SKILLS</Text>
|
||||
<SkillsTags
|
||||
skills={quest.quest_skills.map((s) => s.skill) as Skill[]}
|
||||
maxSkills={4}
|
||||
/>
|
||||
</VStack>
|
||||
</MetaTileBody>
|
||||
</MetaTile>
|
||||
</LinkBox>
|
||||
);
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
"@urql/exchange-retry": "0.2.1",
|
||||
"@walletconnect/web3-provider": "1.5.2",
|
||||
"copy-to-clipboard": "3.3.1",
|
||||
"ethers": "5.4.1",
|
||||
"ethers": "5.4.3",
|
||||
"fake-tag": "3.0.0",
|
||||
"graphql": "15.5.0",
|
||||
"isomorphic-unfetch": "3.1.0",
|
||||
@@ -35,6 +35,6 @@
|
||||
"react-icons": "4.2.0",
|
||||
"react-qr-svg": "2.3.0",
|
||||
"urql": "2.0.2",
|
||||
"web3modal": "1.9.3"
|
||||
"web3modal": "1.9.4"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user