Files
HKSingleParty/03_source/frontend/src/sections/user/profile-home.tsx
louiscklaw 834f58bde1 update,
2025-05-30 01:14:10 +08:00

212 lines
6.2 KiB
TypeScript

import type { IUserProfile, IUserProfilePost } from 'src/types/user';
import { useRef } from 'react';
import { varAlpha } from 'minimal-shared/utils';
import Fab from '@mui/material/Fab';
import Box from '@mui/material/Box';
import Link from '@mui/material/Link';
import Card from '@mui/material/Card';
import Grid from '@mui/material/Grid';
import Stack from '@mui/material/Stack';
import Button from '@mui/material/Button';
import Divider from '@mui/material/Divider';
import InputBase from '@mui/material/InputBase';
import CardHeader from '@mui/material/CardHeader';
import { fNumber } from 'src/utils/format-number';
import { _socials } from 'src/_mock';
import { Iconify } from 'src/components/iconify';
import { ProfilePostItem } from './profile-post-item';
import { useTranslation } from 'react-i18next';
// ----------------------------------------------------------------------
type Props = {
info: IUserProfile;
posts: IUserProfilePost[];
};
export function ProfileHome({ info, posts }: Props) {
const fileRef = useRef<HTMLInputElement>(null);
const { t } = useTranslation();
const handleAttach = () => {
if (fileRef.current) {
fileRef.current.click();
}
};
const renderFollows = () => (
<Card sx={{ py: 3, textAlign: 'center', typography: 'h4' }}>
<Stack divider={<Divider orientation="vertical" flexItem sx={{ borderStyle: 'dashed' }} />} sx={{ flexDirection: 'row' }}>
<Stack sx={{ width: 1 }}>
{fNumber(info.totalFollowers)}
<Box component="span" sx={{ color: 'text.secondary', typography: 'body2' }}>
{t('Follower')}
</Box>
</Stack>
<Stack sx={{ width: 1 }}>
{fNumber(info.totalFollowing)}
<Box component="span" sx={{ color: 'text.secondary', typography: 'body2' }}>
{t('Following')}
</Box>
</Stack>
</Stack>
</Card>
);
const renderAbout = () => (
<Card>
<CardHeader title={t('About')} />
<Box
sx={{
p: 3,
gap: 2,
display: 'flex',
typography: 'body2',
flexDirection: 'column',
}}
>
<div>{info.quote}</div>
<Box sx={{ gap: 2, display: 'flex', lineHeight: '24px' }}>
<Iconify width={24} icon="mingcute:location-fill" />
<span>
Live at
<Link variant="subtitle2" color="inherit">
&nbsp;{info.country}
</Link>
</span>
</Box>
<Box sx={{ gap: 2, display: 'flex', lineHeight: '24px' }}>
<Iconify width={24} icon="solar:letter-bold" />
{info.email}
</Box>
<Box sx={{ gap: 2, display: 'flex', lineHeight: '24px' }}>
<Iconify width={24} icon="solar:case-minimalistic-bold" />
<span>
{info.role} at
<Link variant="subtitle2" color="inherit">
&nbsp;{info.company}
</Link>
</span>
</Box>
<Box sx={{ gap: 2, display: 'flex', lineHeight: '24px' }}>
<Iconify width={24} icon="solar:case-minimalistic-bold" />
<span>
Studied at
<Link variant="subtitle2" color="inherit">
&nbsp;{info.school}
</Link>
</span>
</Box>
</Box>
</Card>
);
const renderPostInput = () => (
<Card sx={{ p: 3 }}>
<InputBase
multiline
fullWidth
rows={4}
placeholder="Share what you are thinking here..."
inputProps={{ id: 'post-input' }}
sx={[
(theme) => ({
p: 2,
mb: 3,
borderRadius: 1,
border: `solid 1px ${varAlpha(theme.vars.palette.grey['500Channel'], 0.2)}`,
}),
]}
/>
<Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<Box
sx={{
gap: 1,
display: 'flex',
alignItems: 'center',
color: 'text.secondary',
}}
>
<Fab size="small" color="inherit" variant="softExtended" onClick={handleAttach}>
<Iconify icon="solar:gallery-wide-bold" width={24} sx={{ color: 'success.main' }} />
{t('Image/Video')}
</Fab>
<Fab size="small" color="inherit" variant="softExtended">
<Iconify icon="solar:videocamera-record-bold" width={24} sx={{ color: 'error.main' }} />
{t('Streaming')}
</Fab>
</Box>
<Button variant="contained">{t('Post')}</Button>
</Box>
<input ref={fileRef} type="file" style={{ display: 'none' }} />
</Card>
);
const renderSocials = () => (
<Card>
<CardHeader title={t('Social')} />
<Box sx={{ p: 3, gap: 2, display: 'flex', flexDirection: 'column', typography: 'body2' }}>
{_socials.map((social) => (
<Box
key={social.label}
sx={{
gap: 2,
display: 'flex',
lineHeight: '20px',
wordBreak: 'break-all',
alignItems: 'flex-start',
}}
>
{social.value === 'twitter' && <Iconify icon="socials:twitter" />}
{social.value === 'facebook' && <Iconify icon="socials:facebook" />}
{social.value === 'instagram' && <Iconify icon="socials:instagram" />}
{social.value === 'linkedin' && <Iconify icon="socials:linkedin" />}
<Link color="inherit">
{social.value === 'facebook' && info.socialLinks.facebook}
{social.value === 'instagram' && info.socialLinks.instagram}
{social.value === 'linkedin' && info.socialLinks.linkedin}
{social.value === 'twitter' && info.socialLinks.twitter}
</Link>
</Box>
))}
</Box>
</Card>
);
return (
<Grid container spacing={3}>
<Grid size={{ xs: 12, md: 4 }} sx={{ gap: 3, display: 'flex', flexDirection: 'column' }}>
{renderFollows()}
{renderAbout()}
{renderSocials()}
</Grid>
<Grid size={{ xs: 12, md: 8 }} sx={{ gap: 3, display: 'flex', flexDirection: 'column' }}>
{renderPostInput()}
{posts.map((post) => (
<ProfilePostItem key={post.id} post={post} />
))}
</Grid>
</Grid>
);
}