✨ Other user profile page
This commit is contained in:
parent
c42e15cff0
commit
82f4c4e4e2
@ -1,6 +1,6 @@
|
|||||||
import { SnCheckInRecord } from '@/services/checkIn'
|
import { SnCheckInRecord } from '@/services/checkIn'
|
||||||
import { getAttachmentUrl, sni } from '@/services/network'
|
import { getAttachmentUrl, sni } from '@/services/network'
|
||||||
import { SnAccount } from '@/services/user'
|
import { SnAccount, SnAccountBadgeMapping } from '@/services/user'
|
||||||
import { Avatar, Box, Card, CardContent, Container, Grid2 as Grid, Typography } from '@mui/material'
|
import { Avatar, Box, Card, CardContent, Container, Grid2 as Grid, Typography } from '@mui/material'
|
||||||
import { LineChart } from '@mui/x-charts'
|
import { LineChart } from '@mui/x-charts'
|
||||||
import type { InferGetServerSidePropsType, GetServerSideProps } from 'next'
|
import type { InferGetServerSidePropsType, GetServerSideProps } from 'next'
|
||||||
@ -44,7 +44,7 @@ export default function UserProfile({ user, checkIn }: InferGetServerSidePropsTy
|
|||||||
</Box>
|
</Box>
|
||||||
|
|
||||||
<Grid container spacing={2} sx={{ mt: 3 }}>
|
<Grid container spacing={2} sx={{ mt: 3 }}>
|
||||||
<Grid size={8}>
|
<Grid size={{ sm: 12, md: 8 }}>
|
||||||
<Card>
|
<Card>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<Typography variant="h6" gutterBottom>
|
<Typography variant="h6" gutterBottom>
|
||||||
@ -64,7 +64,7 @@ export default function UserProfile({ user, checkIn }: InferGetServerSidePropsTy
|
|||||||
]}
|
]}
|
||||||
xAxis={[
|
xAxis={[
|
||||||
{
|
{
|
||||||
scaleType: 'time',
|
scaleType: 'band',
|
||||||
data: checkIn.map((c) => {
|
data: checkIn.map((c) => {
|
||||||
const og = new Date(c.createdAt)
|
const og = new Date(c.createdAt)
|
||||||
og.setHours(0, 0, 0, 0)
|
og.setHours(0, 0, 0, 0)
|
||||||
@ -93,17 +93,53 @@ export default function UserProfile({ user, checkIn }: InferGetServerSidePropsTy
|
|||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid size={4}>
|
<Grid
|
||||||
|
size={{ sm: 12, md: 4 }}
|
||||||
|
order={{ sm: -1, md: 1 }}
|
||||||
|
sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}
|
||||||
|
>
|
||||||
|
<Card>
|
||||||
|
<CardContent>
|
||||||
|
<Typography variant="h6" gutterBottom>
|
||||||
|
Badges
|
||||||
|
</Typography>
|
||||||
|
|
||||||
|
<Box display="flex" flexDirection="column" gap={0.5}>
|
||||||
|
{user.badges.map((b) => (
|
||||||
|
<Box sx={{ display: 'flex', gap: 2, alignItems: 'start' }}>
|
||||||
|
{SnAccountBadgeMapping[b.type].icon}
|
||||||
|
<Box>
|
||||||
|
<Typography variant="body2">{SnAccountBadgeMapping[b.type].name}</Typography>
|
||||||
|
{b.metadata.title && <Typography variant="subtitle2">{b.metadata.title}</Typography>}
|
||||||
|
</Box>
|
||||||
|
</Box>
|
||||||
|
))}
|
||||||
|
</Box>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
|
||||||
<Card>
|
<Card>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<Typography variant="h6" gutterBottom>
|
<Typography variant="h6" gutterBottom>
|
||||||
Information
|
Information
|
||||||
</Typography>
|
</Typography>
|
||||||
|
|
||||||
|
{user.description && (
|
||||||
|
<Typography variant="body1" gutterBottom>
|
||||||
|
{user.description}
|
||||||
|
</Typography>
|
||||||
|
)}
|
||||||
|
|
||||||
<Typography variant="body2">
|
<Typography variant="body2">
|
||||||
Born on {new Date(user.profile!.birthday!).toLocaleDateString()}
|
Born on {new Date(user.profile!.birthday!).toLocaleDateString()}
|
||||||
</Typography>
|
</Typography>
|
||||||
<Typography variant="body2">Joined at {new Date(user.createdAt).toLocaleDateString()}</Typography>
|
<Typography variant="body2" gutterBottom>
|
||||||
|
Joined at {new Date(user.createdAt).toLocaleDateString()}
|
||||||
|
</Typography>
|
||||||
|
|
||||||
|
<Typography variant="overline" lineHeight={1} fontFamily="monospace">
|
||||||
|
#{user.id.toString().padStart(8, '0')}
|
||||||
|
</Typography>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
import { create } from 'zustand'
|
import { create } from 'zustand'
|
||||||
import { sni } from './network'
|
import { sni } from './network'
|
||||||
import { hasCookie } from 'cookies-next/client'
|
import { hasCookie } from 'cookies-next/client'
|
||||||
|
import { JSX } from 'react'
|
||||||
|
|
||||||
|
import ConstructionIcon from '@mui/icons-material/Construction'
|
||||||
|
import FlagIcon from '@mui/icons-material/Flag'
|
||||||
|
|
||||||
export interface SnAccount {
|
export interface SnAccount {
|
||||||
id: number
|
id: number
|
||||||
@ -60,6 +64,17 @@ export interface SnAccountBadge {
|
|||||||
metadata: Record<string, any>
|
metadata: Record<string, any>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const SnAccountBadgeMapping: Record<string, { icon: JSX.Element; name: string }> = {
|
||||||
|
'company.staff': {
|
||||||
|
icon: <ConstructionIcon />,
|
||||||
|
name: 'Solsynth Staff',
|
||||||
|
},
|
||||||
|
'site.migration': {
|
||||||
|
icon: <FlagIcon />,
|
||||||
|
name: 'Solar Network Natives',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
export interface UserStore {
|
export interface UserStore {
|
||||||
account: SnAccount | undefined
|
account: SnAccount | undefined
|
||||||
fetchUser: () => Promise<SnAccount | undefined>
|
fetchUser: () => Promise<SnAccount | undefined>
|
Loading…
Reference in New Issue
Block a user