mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-25 03:29:51 +01:00
feat: some stats
This commit is contained in:
1 parent
865c8991b2
commit
73289d7ff8
3 files changed
+104
-59
No files matched your search
@@ -0,0 +1,11 @@
|
|||||||
|
import { style } from '@vanilla-extract/css';
|
||||||
|
|
||||||
|
export const bkniIndicator = style({
|
||||||
|
scale: 0.8,
|
||||||
|
|
||||||
|
'@media': {
|
||||||
|
'screen and (min-width: 1024px)': {
|
||||||
|
scale: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -22,19 +22,30 @@ import { parseBkni } from '../../../../core/blitzkit/parseBkni';
|
|||||||
import { useAwait } from '../../../../hooks/useAwait';
|
import { useAwait } from '../../../../hooks/useAwait';
|
||||||
import strings from '../../../../lang/en-US.json';
|
import strings from '../../../../lang/en-US.json';
|
||||||
import { FlippedTrigger } from './components/FlippedTrigger';
|
import { FlippedTrigger } from './components/FlippedTrigger';
|
||||||
|
import * as styles from './page.css';
|
||||||
|
|
||||||
export default function Page({ params }: { params: { id: string } }) {
|
export default function Page({ params }: { params: { id: string } }) {
|
||||||
const id = parseInt(params.id);
|
const id = parseInt(params.id);
|
||||||
const region = idToRegion(id);
|
const region = idToRegion(id);
|
||||||
const accountInfo = useAwait(getAccountInfo(region, id));
|
const accountInfo = useAwait(getAccountInfo(region, id));
|
||||||
const clanAccountInfo = useAwait(getClanAccountInfo(region, id, ['clan']));
|
const clanAccountInfo = useAwait(getClanAccountInfo(region, id, ['clan']));
|
||||||
const bkni = ((Math.round(Date.now() / 1000 / 60) / 100) % 2) - 1;
|
// const bkni = ((Math.round(Date.now() / 1000 / 60) / 100) % 2) - 1;
|
||||||
|
const bkni = 2 * Math.random() - 1;
|
||||||
const [period, setPeriod] = useState<'custom' | number>(30);
|
const [period, setPeriod] = useState<'custom' | number>(30);
|
||||||
const { bkniColor } = parseBkni(bkni);
|
const { bkniColor } = parseBkni(bkni);
|
||||||
const isTracking = false;
|
const isTracking = false;
|
||||||
const [customFrom, setCustomFrom] = useState<Date>(
|
const [customFrom, setCustomFrom] = useState<Date>(
|
||||||
new Date(Date.now() - 29 * 24 * 60 * 60 * 1000),
|
new Date(Date.now() - 29 * 24 * 60 * 60 * 1000),
|
||||||
);
|
);
|
||||||
|
const stats = [
|
||||||
|
['Winrate', '70%'],
|
||||||
|
['Damage', '3,203'],
|
||||||
|
['Damage ratio', '2.45'],
|
||||||
|
['Tier', '9.83'],
|
||||||
|
['Survival', '70%'],
|
||||||
|
['Accuracy', '91%'],
|
||||||
|
['Kills', '1.54'],
|
||||||
|
];
|
||||||
const [customTo, setCustomTo] = useState<Date>(new Date());
|
const [customTo, setCustomTo] = useState<Date>(new Date());
|
||||||
const [fromSelectorOpen, setFromSelectorOpen] = useState(false);
|
const [fromSelectorOpen, setFromSelectorOpen] = useState(false);
|
||||||
const [toSelectorOpen, setToSelectorOpen] = useState(false);
|
const [toSelectorOpen, setToSelectorOpen] = useState(false);
|
||||||
@@ -46,8 +57,13 @@ export default function Page({ params }: { params: { id: string } }) {
|
|||||||
initial: '6',
|
initial: '6',
|
||||||
md: '8',
|
md: '8',
|
||||||
}}
|
}}
|
||||||
|
pt={{
|
||||||
|
initial: '9',
|
||||||
|
md: '8',
|
||||||
|
}}
|
||||||
size={1024}
|
size={1024}
|
||||||
noFlex1
|
noFlex1
|
||||||
|
position="relative"
|
||||||
color={bkniColor}
|
color={bkniColor}
|
||||||
containerProps={{
|
containerProps={{
|
||||||
style: {
|
style: {
|
||||||
@@ -55,48 +71,12 @@ export default function Page({ params }: { params: { id: string } }) {
|
|||||||
},
|
},
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Flex
|
|
||||||
justify="between"
|
|
||||||
align="center"
|
|
||||||
direction={{
|
|
||||||
initial: 'column-reverse',
|
|
||||||
md: 'row',
|
|
||||||
}}
|
|
||||||
gap={{
|
|
||||||
initial: '8',
|
|
||||||
md: '4',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Flex
|
|
||||||
direction="column"
|
|
||||||
align={{
|
|
||||||
initial: 'center',
|
|
||||||
md: 'start',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Heading
|
|
||||||
size={{
|
|
||||||
initial: '7',
|
|
||||||
xs: '8',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{accountInfo.nickname}
|
|
||||||
</Heading>
|
|
||||||
|
|
||||||
<Text color="gray">
|
|
||||||
{clanAccountInfo?.clan && `[${clanAccountInfo.clan.tag}] • `}
|
|
||||||
{strings.common.regions.short[region]}
|
|
||||||
</Text>
|
|
||||||
</Flex>
|
|
||||||
|
|
||||||
<BkniIndicator bkni={bkni} />
|
|
||||||
</Flex>
|
|
||||||
</PageWrapper>
|
|
||||||
|
|
||||||
<PageWrapper color={bkniColor} noFlex1 pt="0" align="center">
|
|
||||||
<Tabs.Root
|
<Tabs.Root
|
||||||
style={{
|
style={{
|
||||||
transform: 'scaleY(-1)',
|
position: 'absolute',
|
||||||
|
top: 0,
|
||||||
|
left: '50%',
|
||||||
|
transform: 'scaleY(-1) translateX(-50%)',
|
||||||
}}
|
}}
|
||||||
value={`${period}`}
|
value={`${period}`}
|
||||||
onValueChange={(value) => {
|
onValueChange={(value) => {
|
||||||
@@ -111,6 +91,39 @@ export default function Page({ params }: { params: { id: string } }) {
|
|||||||
</Tabs.List>
|
</Tabs.List>
|
||||||
</Tabs.Root>
|
</Tabs.Root>
|
||||||
|
|
||||||
|
<Flex
|
||||||
|
justify="between"
|
||||||
|
align="center"
|
||||||
|
direction={{
|
||||||
|
initial: 'column',
|
||||||
|
md: 'row',
|
||||||
|
}}
|
||||||
|
gap="4"
|
||||||
|
>
|
||||||
|
<Flex
|
||||||
|
direction="column"
|
||||||
|
align={{
|
||||||
|
initial: 'center',
|
||||||
|
md: 'start',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Heading size="8">{accountInfo.nickname}</Heading>
|
||||||
|
|
||||||
|
<Text color="gray">
|
||||||
|
{clanAccountInfo?.clan && `[${clanAccountInfo.clan.tag}] • `}
|
||||||
|
{
|
||||||
|
(clanAccountInfo?.clan
|
||||||
|
? strings.common.regions.short
|
||||||
|
: strings.common.regions.normal)[region]
|
||||||
|
}
|
||||||
|
</Text>
|
||||||
|
</Flex>
|
||||||
|
|
||||||
|
<BkniIndicator bkni={bkni} className={styles.bkniIndicator} />
|
||||||
|
</Flex>
|
||||||
|
</PageWrapper>
|
||||||
|
|
||||||
|
<PageWrapper color={bkniColor} noFlex1 align="center">
|
||||||
{period === 'custom' && (
|
{period === 'custom' && (
|
||||||
<Text>
|
<Text>
|
||||||
From{' '}
|
From{' '}
|
||||||
@@ -165,21 +178,35 @@ export default function Page({ params }: { params: { id: string } }) {
|
|||||||
</Popover.Root>
|
</Popover.Root>
|
||||||
</Text>
|
</Text>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
<Flex direction="column" align="center">
|
||||||
|
<Heading size="9">72%</Heading>
|
||||||
|
<Text color="gray">Winrate</Text>
|
||||||
|
</Flex>
|
||||||
|
|
||||||
|
<Flex wrap="wrap" gap="2" justify="center" maxWidth="416px">
|
||||||
|
{stats.map((stat) => (
|
||||||
|
<Flex minWidth="96px" direction="column" align="center">
|
||||||
|
<Text size="7">{stat[1]}</Text>
|
||||||
|
<Text color="gray" size="2">
|
||||||
|
{stat[0]}
|
||||||
|
</Text>
|
||||||
|
</Flex>
|
||||||
|
))}
|
||||||
|
</Flex>
|
||||||
</PageWrapper>
|
</PageWrapper>
|
||||||
|
|
||||||
{!isTracking && (
|
<Flex flexGrow="1" justify="center" align="center" p="4">
|
||||||
<Flex flexGrow="1" justify="center" align="center" p="4">
|
<Callout.Root color="red" mt="4">
|
||||||
<Callout.Root color="red" mt="4">
|
<Callout.Icon>
|
||||||
<Callout.Icon>
|
<ExclamationTriangleIcon />
|
||||||
<ExclamationTriangleIcon />
|
</Callout.Icon>
|
||||||
</Callout.Icon>
|
<Callout.Text>
|
||||||
<Callout.Text>
|
We haven't tracked long enough to provide statistics. Please check
|
||||||
We haven't tracked long enough to provide statistics. Please check
|
back after a few days.
|
||||||
back after a few days.
|
</Callout.Text>
|
||||||
</Callout.Text>
|
</Callout.Root>
|
||||||
</Callout.Root>
|
</Flex>
|
||||||
</Flex>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{isTracking && <Box flexGrow="1" />}
|
{isTracking && <Box flexGrow="1" />}
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -1,5 +1,12 @@
|
|||||||
import { TimerIcon } from '@radix-ui/react-icons';
|
import { TimerIcon } from '@radix-ui/react-icons';
|
||||||
import { Button, Flex, Heading, Popover, Text } from '@radix-ui/themes';
|
import {
|
||||||
|
Button,
|
||||||
|
Flex,
|
||||||
|
FlexProps,
|
||||||
|
Heading,
|
||||||
|
Popover,
|
||||||
|
Text,
|
||||||
|
} from '@radix-ui/themes';
|
||||||
import { parseBkni } from '../core/blitzkit/parseBkni';
|
import { parseBkni } from '../core/blitzkit/parseBkni';
|
||||||
import {
|
import {
|
||||||
BKNI_COLORS,
|
BKNI_COLORS,
|
||||||
@@ -7,16 +14,16 @@ import {
|
|||||||
} from '../core/statistics/getBkniPercentile';
|
} from '../core/statistics/getBkniPercentile';
|
||||||
import strings from '../lang/en-US.json';
|
import strings from '../lang/en-US.json';
|
||||||
|
|
||||||
interface BkniIndicatorProps {
|
type BkniIndicatorProps = FlexProps & {
|
||||||
bkni: number;
|
bkni: number;
|
||||||
}
|
};
|
||||||
|
|
||||||
export function BkniIndicator({ bkni }: BkniIndicatorProps) {
|
export function BkniIndicator({ bkni, ...props }: BkniIndicatorProps) {
|
||||||
const { bkniColor, bkniFraction, bkniMetric, bkniPercentile } =
|
const { bkniColor, bkniFraction, bkniMetric, bkniPercentile } =
|
||||||
parseBkni(bkni);
|
parseBkni(bkni);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Flex direction="column" align="center">
|
<Flex direction="column" align="center" {...props}>
|
||||||
<svg
|
<svg
|
||||||
width={180}
|
width={180}
|
||||||
height={100}
|
height={100}
|
||||||
|
|||||||
Reference in new issue
Block a user