feat: 화면 설정 반영
parent
ca4c0e46af
commit
d4050acdab
@ -1,43 +0,0 @@
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
// material-ui
|
||||
import { useTheme } from '@mui/material/styles';
|
||||
import { Box } from '@mui/material';
|
||||
|
||||
// assets
|
||||
import AuthPattern from 'assets/images/auth/auth-pattern.svg';
|
||||
import AuthPatternDark from 'assets/images/auth/auth-pattern-dark.svg';
|
||||
|
||||
// ===========================|| BACKGROUND GRID PATTERN 1 ||=========================== //
|
||||
|
||||
const BackgroundPattern1 = ({ children }) => {
|
||||
const theme = useTheme();
|
||||
return (
|
||||
<Box
|
||||
component="span"
|
||||
sx={{
|
||||
display: 'flex',
|
||||
minHeight: '100vh',
|
||||
bgcolor: theme.palette.mode === 'dark' ? theme.palette.dark.dark : '#fff',
|
||||
backgroundImage: theme.palette.mode === 'dark' ? `url(${AuthPatternDark})` : `url(${AuthPattern})`,
|
||||
position: 'absolute',
|
||||
backgroundPosition: '0 0',
|
||||
overflow: 'hidden',
|
||||
m: '0 0 0 auto',
|
||||
top: 0,
|
||||
left: 0,
|
||||
right: 0,
|
||||
bottom: 0,
|
||||
opacity: theme.palette.mode === 'dark' ? 0.85 : 0.9
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
||||
BackgroundPattern1.propTypes = {
|
||||
children: PropTypes.node
|
||||
};
|
||||
|
||||
export default BackgroundPattern1;
|
@ -1,61 +0,0 @@
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
// material-ui
|
||||
import { useTheme } from '@mui/material/styles';
|
||||
import { Box } from '@mui/material';
|
||||
|
||||
// assets
|
||||
import AuthPattern from 'assets/images/auth/img-a2-grid.svg';
|
||||
import AuthPatternDark from 'assets/images/auth/img-a2-grid-dark.svg';
|
||||
|
||||
// ===========================|| BACKGROUND GRID PATTERN 2 ||=========================== //
|
||||
|
||||
const BackgroundPattern2 = ({ children }) => {
|
||||
const theme = useTheme();
|
||||
return (
|
||||
<Box
|
||||
component="span"
|
||||
sx={{
|
||||
display: 'flex',
|
||||
minHeight: '100%',
|
||||
height: '100vh',
|
||||
bgcolor: theme.palette.mode === 'dark' ? theme.palette.dark.dark : '#fff',
|
||||
backgroundImage: theme.palette.mode === 'dark' ? `url(${AuthPatternDark})` : `url(${AuthPattern})`,
|
||||
position: 'absolute',
|
||||
backgroundPosition: 'bottom left',
|
||||
backgroundRepeat: 'no-repeat',
|
||||
// backgroundSize: 'cover',
|
||||
overflow: 'hidden',
|
||||
m: '0 0 0 auto',
|
||||
p: '100px 0',
|
||||
top: 0,
|
||||
left: 0,
|
||||
right: 0,
|
||||
bottom: 0,
|
||||
'& > *': {
|
||||
position: 'relative',
|
||||
zIndex: 5
|
||||
},
|
||||
'&:after': {
|
||||
content: '""',
|
||||
position: 'absolute',
|
||||
top: 0,
|
||||
left: 0,
|
||||
right: 0,
|
||||
zIndex: 1,
|
||||
bottom: 0,
|
||||
bgcolor: theme.palette.mode === 'dark' ? theme.palette.dark.dark : theme.palette.primary.light,
|
||||
opacity: theme.palette.mode === 'dark' ? 0.85 : 0.9
|
||||
}
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
||||
BackgroundPattern2.propTypes = {
|
||||
children: PropTypes.node
|
||||
};
|
||||
|
||||
export default BackgroundPattern2;
|
@ -1,60 +0,0 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
// material-ui
|
||||
import { useTheme } from '@mui/material/styles';
|
||||
import { Button, Card, CardContent, Grid, Typography } from '@mui/material';
|
||||
|
||||
// assets
|
||||
import ArrowRightAltRoundedIcon from '@mui/icons-material/ArrowRightAltRounded';
|
||||
|
||||
// ==============================|| BILL CARD ||============================== //
|
||||
|
||||
const BillCard = ({ primary, secondary, link, color, bg }) => {
|
||||
const theme = useTheme();
|
||||
return (
|
||||
<Card sx={{ borderLeft: '10px solid', borderColor: color, background: bg }}>
|
||||
<CardContent>
|
||||
<Grid container spacing={0}>
|
||||
<Grid item xs={12}>
|
||||
<Typography variant="body1" sx={{ color: theme.palette.grey[700] }}>
|
||||
{primary}
|
||||
</Typography>
|
||||
</Grid>
|
||||
<Grid item xs={12}>
|
||||
<Typography variant="h2" sx={{ fontWeight: 500, mb: 1.5, color: theme.palette.grey[800] }}>
|
||||
{secondary}
|
||||
</Typography>
|
||||
</Grid>
|
||||
<Grid item xs={12}>
|
||||
<Button
|
||||
variant="text"
|
||||
disableElevation
|
||||
disableRipple
|
||||
component={Link}
|
||||
to="#"
|
||||
sx={{
|
||||
color,
|
||||
p: 0,
|
||||
'&:hover': { bgcolor: 'transparent' }
|
||||
}}
|
||||
endIcon={<ArrowRightAltRoundedIcon />}
|
||||
>
|
||||
{link}
|
||||
</Button>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</CardContent>
|
||||
</Card>
|
||||
);
|
||||
};
|
||||
|
||||
BillCard.propTypes = {
|
||||
primary: PropTypes.string,
|
||||
secondary: PropTypes.string,
|
||||
link: PropTypes.string,
|
||||
color: PropTypes.string,
|
||||
bg: PropTypes.string
|
||||
};
|
||||
|
||||
export default BillCard;
|
@ -1,156 +0,0 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import { useState } from 'react';
|
||||
|
||||
// material-ui
|
||||
import { useTheme } from '@mui/material/styles';
|
||||
import { Box, Button, ButtonBase, Card, Grid, Menu, MenuItem, Stack, Typography } from '@mui/material';
|
||||
|
||||
// project imports
|
||||
import Avatar from 'ui-component/extended/Avatar';
|
||||
|
||||
// assets
|
||||
import FiberManualRecordIcon from '@mui/icons-material/FiberManualRecord';
|
||||
import MoreVertTwoToneIcon from '@mui/icons-material/MoreVertTwoTone';
|
||||
import ThumbUpAltTwoToneIcon from '@mui/icons-material/ThumbUpAltTwoTone';
|
||||
import ReplyTwoToneIcon from '@mui/icons-material/ReplyTwoTone';
|
||||
|
||||
const avatarImage = require.context('assets/images/profile', true);
|
||||
|
||||
// ==============================|| POST & COMMENT - REPLAY ||============================== //
|
||||
|
||||
const Reply = ({ commentId, handleReplayLikes, onReply, postId, reply }) => {
|
||||
const theme = useTheme();
|
||||
const { id } = reply;
|
||||
|
||||
const [anchorEl, setAnchorEl] = useState(null);
|
||||
const handleClick = (event) => {
|
||||
setAnchorEl(event?.currentTarget);
|
||||
};
|
||||
|
||||
const handleClose = () => {
|
||||
setAnchorEl(null);
|
||||
};
|
||||
|
||||
const replies = reply;
|
||||
|
||||
return (
|
||||
<>
|
||||
{Object.keys(replies).length > 0 && (
|
||||
<Grid item xs={12}>
|
||||
<Box sx={{ pl: 6.25 }}>
|
||||
<Card
|
||||
sx={{
|
||||
background: theme.palette.mode === 'dark' ? theme.palette.dark.main : theme.palette.grey[50],
|
||||
padding: '16px 16px 8px',
|
||||
mt: 1.25
|
||||
}}
|
||||
>
|
||||
<Grid container spacing={1}>
|
||||
<Grid item xs={12}>
|
||||
<Grid container wrap="nowrap" alignItems="center" spacing={1}>
|
||||
<Grid item>
|
||||
<Avatar
|
||||
sx={{ width: 24, height: 24 }}
|
||||
size="sm"
|
||||
alt="User 1"
|
||||
src={replies.profile && replies.profile.avatar && avatarImage(`./${replies.profile.avatar}`).default}
|
||||
/>
|
||||
</Grid>
|
||||
<Grid item xs zeroMinWidth>
|
||||
<Grid container alignItems="center" spacing={1}>
|
||||
<Grid item>
|
||||
<Typography align="left" variant="h5" component="div">
|
||||
{replies.profile.name}
|
||||
</Typography>
|
||||
</Grid>
|
||||
<Grid item>
|
||||
<Typography align="left" variant="caption">
|
||||
<FiberManualRecordIcon sx={{ width: '10px', height: '10px', opacity: 0.5, m: '0 5px' }} />{' '}
|
||||
{replies.profile.time}
|
||||
</Typography>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
<Grid item>
|
||||
<ButtonBase sx={{ borderRadius: '12px' }} onClick={handleClick}>
|
||||
<Avatar
|
||||
variant="rounded"
|
||||
sx={{
|
||||
...theme.typography.commonAvatar,
|
||||
...theme.typography.smallAvatar,
|
||||
background: theme.palette.mode === 'dark' ? theme.palette.dark.main : theme.palette.secondary.light,
|
||||
color: theme.palette.mode === 'dark' ? theme.palette.dark.light : theme.palette.secondary.dark,
|
||||
zIndex: 1,
|
||||
transition: 'all .2s ease-in-out',
|
||||
'&[aria-controls="menu-list-grow"],&:hover': {
|
||||
background: theme.palette.secondary.main,
|
||||
color: theme.palette.secondary.light
|
||||
}
|
||||
}}
|
||||
aria-controls="menu-comment-reply"
|
||||
aria-haspopup="true"
|
||||
>
|
||||
<MoreVertTwoToneIcon fontSize="inherit" />
|
||||
</Avatar>
|
||||
</ButtonBase>
|
||||
<Menu
|
||||
id="menu-comment-reply"
|
||||
anchorEl={anchorEl}
|
||||
keepMounted
|
||||
open={Boolean(anchorEl)}
|
||||
onClose={handleClose}
|
||||
variant="selectedMenu"
|
||||
anchorOrigin={{
|
||||
vertical: 'bottom',
|
||||
horizontal: 'right'
|
||||
}}
|
||||
transformOrigin={{
|
||||
vertical: 'top',
|
||||
horizontal: 'right'
|
||||
}}
|
||||
>
|
||||
<MenuItem onClick={handleClose}>Edit</MenuItem>
|
||||
<MenuItem onClick={handleClose}>Delete</MenuItem>
|
||||
</Menu>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
<Grid item xs={12}>
|
||||
<Typography align="left" variant="body2">
|
||||
{replies.data.comment}
|
||||
</Typography>
|
||||
</Grid>
|
||||
<Grid item xs={12}>
|
||||
<Stack direction="row" spacing={2} sx={{ color: theme.palette.mode === 'dark' ? 'grey.700' : 'grey.800' }}>
|
||||
<Button
|
||||
onClick={() => handleReplayLikes(postId, commentId, id)}
|
||||
variant="text"
|
||||
color="inherit"
|
||||
size="small"
|
||||
startIcon={<ThumbUpAltTwoToneIcon color={replies.data.likes && replies.data.likes.like ? 'secondary' : 'inherit'} />}
|
||||
>
|
||||
{replies.data.likes && replies.data.likes.value ? replies.data.likes.value : 0} likes
|
||||
</Button>
|
||||
<Button variant="text" onClick={onReply} size="small" color="inherit" startIcon={<ReplyTwoToneIcon color="primary" />}>
|
||||
reply
|
||||
</Button>
|
||||
</Stack>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Card>
|
||||
</Box>
|
||||
</Grid>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
Reply.propTypes = {
|
||||
commentId: PropTypes.string,
|
||||
handleReplayLikes: PropTypes.func,
|
||||
onReply: PropTypes.func,
|
||||
postId: PropTypes.string,
|
||||
reply: PropTypes.object
|
||||
};
|
||||
|
||||
export default Reply;
|
@ -1,340 +0,0 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import { useState } from 'react';
|
||||
|
||||
// material-ui
|
||||
import { useTheme } from '@mui/material/styles';
|
||||
import {
|
||||
Box,
|
||||
Button,
|
||||
ButtonBase,
|
||||
Card,
|
||||
Collapse,
|
||||
FormHelperText,
|
||||
Grid,
|
||||
InputAdornment,
|
||||
Menu,
|
||||
MenuItem,
|
||||
Stack,
|
||||
TextField,
|
||||
Typography,
|
||||
useMediaQuery
|
||||
} from '@mui/material';
|
||||
|
||||
// third-party
|
||||
import * as yup from 'yup';
|
||||
import uniqueId from 'lodash/uniqueId';
|
||||
import { Controller, FormProvider, useForm, useFormContext } from 'react-hook-form';
|
||||
import { yupResolver } from '@hookform/resolvers/yup';
|
||||
|
||||
// project imports
|
||||
import Reply from './Reply';
|
||||
import Avatar from 'ui-component/extended/Avatar';
|
||||
import AnimateButton from 'ui-component/extended/AnimateButton';
|
||||
|
||||
// assets
|
||||
import FiberManualRecordIcon from '@mui/icons-material/FiberManualRecord';
|
||||
import MoreVertTwoToneIcon from '@mui/icons-material/MoreVertTwoTone';
|
||||
import ThumbUpAltTwoToneIcon from '@mui/icons-material/ThumbUpAltTwoTone';
|
||||
import ReplyTwoToneIcon from '@mui/icons-material/ReplyTwoTone';
|
||||
import AttachmentRoundedIcon from '@mui/icons-material/AttachmentRounded';
|
||||
|
||||
const avatarImage = require.context('assets/images/profile', true);
|
||||
|
||||
const validationSchema = yup.object().shape({
|
||||
name: yup.string().required('Reply Field is Required')
|
||||
});
|
||||
|
||||
// ==============================|| COMMENT TEXTFIELD ||============================== //
|
||||
|
||||
const FormInput = ({ bug, label, name, required, ...others }) => {
|
||||
const { control } = useFormContext();
|
||||
|
||||
let isError = false;
|
||||
let errorMessage = '';
|
||||
if (bug && Object.prototype.hasOwnProperty.call(bug, name)) {
|
||||
isError = true;
|
||||
errorMessage = bug[name].message;
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<Controller
|
||||
name={name}
|
||||
control={control}
|
||||
defaultValue=""
|
||||
render={({ field }) => (
|
||||
<TextField
|
||||
fullWidth
|
||||
label={label}
|
||||
InputLabelProps={{
|
||||
className: required ? 'required-label' : '',
|
||||
required: required || false
|
||||
}}
|
||||
error={isError}
|
||||
{...field}
|
||||
/>
|
||||
)}
|
||||
{...others}
|
||||
/>
|
||||
{errorMessage && (
|
||||
<Grid item xs={12}>
|
||||
<FormHelperText error>{errorMessage}</FormHelperText>
|
||||
</Grid>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
FormInput.propTypes = {
|
||||
bug: PropTypes.object,
|
||||
label: PropTypes.string,
|
||||
name: PropTypes.string,
|
||||
required: PropTypes.bool
|
||||
};
|
||||
|
||||
// ==============================|| SOCIAL PROFILE - COMMENT ||============================== //
|
||||
|
||||
const Comment = ({ comment, handleCommentLikes, handleReplayLikes, postId, replyAdd, user }) => {
|
||||
const theme = useTheme();
|
||||
const matchesXS = useMediaQuery(theme.breakpoints.down('md'));
|
||||
|
||||
const [anchorEl, setAnchorEl] = useState(null);
|
||||
const handleClick = (event) => {
|
||||
setAnchorEl(event.currentTarget);
|
||||
};
|
||||
|
||||
const handleClose = () => {
|
||||
setAnchorEl(null);
|
||||
};
|
||||
|
||||
const [openReply, setOpenReply] = useState(false);
|
||||
const handleChangeReply = () => {
|
||||
setOpenReply((prev) => !prev);
|
||||
};
|
||||
|
||||
let repliesResult = <></>;
|
||||
if (Object.keys(comment).length > 0 && comment.data?.replies && comment.data?.replies.length) {
|
||||
repliesResult = comment.data?.replies.map((reply, index) => (
|
||||
<Reply
|
||||
postId={postId}
|
||||
commentId={comment.id}
|
||||
key={index}
|
||||
onReply={handleChangeReply}
|
||||
reply={reply}
|
||||
handleReplayLikes={handleReplayLikes}
|
||||
/>
|
||||
));
|
||||
}
|
||||
|
||||
const methods = useForm({
|
||||
resolver: yupResolver(validationSchema)
|
||||
});
|
||||
|
||||
const {
|
||||
handleSubmit,
|
||||
formState: { errors },
|
||||
reset
|
||||
} = methods;
|
||||
const onSubmit = async (reply) => {
|
||||
handleChangeReply();
|
||||
const replyId = uniqueId('#REPLY_');
|
||||
const newReply = {
|
||||
id: replyId,
|
||||
profile: user,
|
||||
data: {
|
||||
comment: reply.name,
|
||||
likes: {
|
||||
like: false,
|
||||
value: 0
|
||||
},
|
||||
replies: []
|
||||
}
|
||||
};
|
||||
|
||||
replyAdd(postId, comment.id, newReply);
|
||||
reset({ name: '' });
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
{Object.keys(comment).length > 0 && (
|
||||
<Grid item xs={12}>
|
||||
<Card
|
||||
sx={{
|
||||
background: theme.palette.mode === 'dark' ? theme.palette.dark.main : theme.palette.grey[50],
|
||||
padding: '16px 16px 8px',
|
||||
mt: 1.25
|
||||
}}
|
||||
>
|
||||
<Grid container spacing={1}>
|
||||
<Grid item xs={12}>
|
||||
<Grid container wrap="nowrap" alignItems="center" spacing={1}>
|
||||
<Grid item>
|
||||
<Avatar
|
||||
sx={{ width: 24, height: 24 }}
|
||||
size="sm"
|
||||
alt="User 1"
|
||||
src={comment.profile && comment.profile.avatar && avatarImage(`./${comment.profile.avatar}`).default}
|
||||
/>
|
||||
</Grid>
|
||||
<Grid item xs zeroMinWidth>
|
||||
<Grid container alignItems="center" spacing={1}>
|
||||
<Grid item>
|
||||
<Typography align="left" variant="h5" component="div">
|
||||
{comment.profile.name}
|
||||
</Typography>
|
||||
</Grid>
|
||||
<Grid item>
|
||||
<Typography align="left" variant="caption">
|
||||
<FiberManualRecordIcon sx={{ width: '10px', height: '10px', opacity: 0.5, m: '0 5px' }} /> {comment.profile.time}
|
||||
</Typography>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
<Grid item>
|
||||
<ButtonBase sx={{ borderRadius: '12px' }}>
|
||||
<Avatar
|
||||
variant="rounded"
|
||||
sx={{
|
||||
...theme.typography.commonAvatar,
|
||||
...theme.typography.smallAvatar,
|
||||
background: theme.palette.mode === 'dark' ? theme.palette.dark.main : theme.palette.secondary.light,
|
||||
color: theme.palette.mode === 'dark' ? theme.palette.dark.light : theme.palette.secondary.dark,
|
||||
zIndex: 1,
|
||||
transition: 'all .2s ease-in-out',
|
||||
'&[aria-controls="menu-list-grow"],&:hover': {
|
||||
background: theme.palette.secondary.main,
|
||||
color: theme.palette.secondary.light
|
||||
}
|
||||
}}
|
||||
aria-controls="menu-comment"
|
||||
aria-haspopup="true"
|
||||
onClick={handleClick}
|
||||
>
|
||||
<MoreVertTwoToneIcon fontSize="inherit" />
|
||||
</Avatar>
|
||||
</ButtonBase>
|
||||
<Menu
|
||||
id="menu-comment"
|
||||
anchorEl={anchorEl}
|
||||
keepMounted
|
||||
open={Boolean(anchorEl)}
|
||||
onClose={handleClose}
|
||||
variant="selectedMenu"
|
||||
anchorOrigin={{
|
||||
vertical: 'bottom',
|
||||
horizontal: 'right'
|
||||
}}
|
||||
transformOrigin={{
|
||||
vertical: 'top',
|
||||
horizontal: 'right'
|
||||
}}
|
||||
>
|
||||
<MenuItem onClick={handleClose}>Edit</MenuItem>
|
||||
<MenuItem onClick={handleClose}>Delete</MenuItem>
|
||||
</Menu>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
<Grid item xs={12} sx={{ '&.MuiGrid-root': { pt: 1.5 } }}>
|
||||
<Typography align="left" variant="body2">
|
||||
{comment.data?.comment}
|
||||
</Typography>
|
||||
</Grid>
|
||||
<Grid item xs={12}>
|
||||
<Stack direction="row" spacing={2} sx={{ color: theme.palette.mode === 'dark' ? 'grey.700' : 'grey.800' }}>
|
||||
<Button
|
||||
onClick={() => handleCommentLikes(postId, comment.id)}
|
||||
variant="text"
|
||||
color="inherit"
|
||||
size="small"
|
||||
startIcon={<ThumbUpAltTwoToneIcon color={comment.data?.likes && comment.data?.likes.like ? 'secondary' : 'inherit'} />}
|
||||
>
|
||||
{comment.data?.likes && comment.data?.likes.value ? comment.data?.likes.value : 0} likes
|
||||
</Button>
|
||||
<Button
|
||||
variant="text"
|
||||
onClick={handleChangeReply}
|
||||
color="inherit"
|
||||
size="small"
|
||||
startIcon={<ReplyTwoToneIcon color="primary" />}
|
||||
>
|
||||
{comment.data?.replies ? comment.data?.replies.length : 0} reply
|
||||
</Button>
|
||||
</Stack>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Card>
|
||||
</Grid>
|
||||
)}
|
||||
{repliesResult}
|
||||
{/* comment - add new replay */}
|
||||
<Collapse in={openReply} sx={{ width: '100%' }}>
|
||||
{openReply && (
|
||||
<Grid item xs={12} sx={{ pl: { xs: 1, sm: 3 }, pt: 3 }}>
|
||||
<Box
|
||||
sx={{
|
||||
ml: 4.25,
|
||||
[theme.breakpoints.down('md')]: {
|
||||
ml: 0
|
||||
}
|
||||
}}
|
||||
>
|
||||
<form onSubmit={handleSubmit(onSubmit)}>
|
||||
<Grid container spacing={2} alignItems="flex-start">
|
||||
<Grid item sx={{ display: { xs: 'none', sm: 'block' } }}>
|
||||
<Avatar
|
||||
sx={{ mt: 1.5 }}
|
||||
alt="User 1"
|
||||
src={comment.profile && comment.profile.avatar && avatarImage(`./${comment.profile.avatar}`).default}
|
||||
/>
|
||||
</Grid>
|
||||
<Grid item xs zeroMinWidth sx={{ mt: 1 }}>
|
||||
<FormProvider {...methods}>
|
||||
<FormInput
|
||||
fullWidth
|
||||
name="name"
|
||||
label="Write a reply..."
|
||||
size={matchesXS ? 'small' : 'medium'}
|
||||
bug={errors}
|
||||
InputProps={{
|
||||
label: 'Write a reply...',
|
||||
startAdornment: (
|
||||
<InputAdornment position="start">
|
||||
<AttachmentRoundedIcon fontSize="small" />
|
||||
</InputAdornment>
|
||||
)
|
||||
}}
|
||||
/>
|
||||
</FormProvider>
|
||||
</Grid>
|
||||
<Grid item>
|
||||
<AnimateButton>
|
||||
<Button type="submit" variant="contained" color="secondary" size={matchesXS ? 'small' : 'large'} sx={{ mt: 1.5 }}>
|
||||
Reply
|
||||
</Button>
|
||||
</AnimateButton>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</form>
|
||||
</Box>
|
||||
</Grid>
|
||||
)}
|
||||
</Collapse>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
Comment.propTypes = {
|
||||
comment: PropTypes.object,
|
||||
postId: PropTypes.string,
|
||||
user: PropTypes.object,
|
||||
commentAdd: PropTypes.func,
|
||||
handleCommentLikes: PropTypes.func,
|
||||
handlePostLikes: PropTypes.func,
|
||||
handleReplayLikes: PropTypes.func,
|
||||
post: PropTypes.object,
|
||||
replyAdd: PropTypes.func
|
||||
};
|
||||
|
||||
export default Comment;
|
@ -1,406 +0,0 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import * as React from 'react';
|
||||
|
||||
// material-ui
|
||||
import { useTheme } from '@mui/material/styles';
|
||||
import {
|
||||
Button,
|
||||
ButtonBase,
|
||||
CardMedia,
|
||||
Collapse,
|
||||
FormHelperText,
|
||||
Grid,
|
||||
IconButton,
|
||||
Menu,
|
||||
MenuItem,
|
||||
Stack,
|
||||
TextField,
|
||||
Typography,
|
||||
useMediaQuery
|
||||
} from '@mui/material';
|
||||
|
||||
// third-party
|
||||
import * as yup from 'yup';
|
||||
import uniqueId from 'lodash/uniqueId';
|
||||
import { Controller, FormProvider, useForm } from 'react-hook-form';
|
||||
import { yupResolver } from '@hookform/resolvers/yup';
|
||||
import ReactMarkdown from 'react-markdown';
|
||||
import gfm from 'remark-gfm';
|
||||
|
||||
// project imports
|
||||
import Comment from './Comment';
|
||||
import MainCard from '../MainCard';
|
||||
import useAuth from 'hooks/useAuth';
|
||||
import AnimateButton from 'ui-component/extended/AnimateButton';
|
||||
import ImageList from 'ui-component/extended/ImageList';
|
||||
import Avatar from 'ui-component/extended/Avatar';
|
||||
|
||||
// assets
|
||||
import ShareTwoToneIcon from '@mui/icons-material/ShareTwoTone';
|
||||
import FiberManualRecordIcon from '@mui/icons-material/FiberManualRecord';
|
||||
import PeopleAltTwoToneIcon from '@mui/icons-material/PeopleAltTwoTone';
|
||||
import ChatTwoToneIcon from '@mui/icons-material/ChatTwoTone';
|
||||
import ContentCopyTwoToneIcon from '@mui/icons-material/ContentCopyTwoTone';
|
||||
import MoreVertTwoToneIcon from '@mui/icons-material/MoreVertTwoTone';
|
||||
import ThumbUpAltTwoToneIcon from '@mui/icons-material/ThumbUpAltTwoTone';
|
||||
import ChatBubbleTwoToneIcon from '@mui/icons-material/ChatBubbleTwoTone';
|
||||
import useConfig from 'hooks/useConfig';
|
||||
|
||||
const avatarImage = require.context('assets/images/profile', true);
|
||||
|
||||
const validationSchema = yup.object().shape({
|
||||
name: yup.string().required('Comment Field is Required')
|
||||
});
|
||||
|
||||
// ==============================|| COMMENT TEXTFIELD ||============================== //
|
||||
|
||||
const FormInput = ({ bug, label, size, fullWidth = true, name, required, ...others }) => {
|
||||
let isError = false;
|
||||
let errorMessage = '';
|
||||
if (bug && Object.prototype.hasOwnProperty.call(bug, name)) {
|
||||
isError = true;
|
||||
errorMessage = bug[name].message;
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<Controller
|
||||
name={name}
|
||||
defaultValue=""
|
||||
render={({ field }) => (
|
||||
<TextField
|
||||
fullWidth={fullWidth}
|
||||
size={size}
|
||||
label={label}
|
||||
InputLabelProps={{
|
||||
className: required ? 'required-label' : '',
|
||||
required: required || false
|
||||
}}
|
||||
error={isError}
|
||||
{...field}
|
||||
/>
|
||||
)}
|
||||
{...others}
|
||||
/>
|
||||
{errorMessage && (
|
||||
<Grid item xs={12}>
|
||||
<FormHelperText error>{errorMessage}</FormHelperText>
|
||||
</Grid>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
FormInput.propTypes = {
|
||||
bug: PropTypes.object,
|
||||
size: PropTypes.string,
|
||||
label: PropTypes.string,
|
||||
name: PropTypes.string,
|
||||
required: PropTypes.bool,
|
||||
fullWidth: PropTypes.bool
|
||||
};
|
||||
|
||||
// ==============================|| SOCIAL PROFILE - POST ||============================== //
|
||||
|
||||
const Post = ({ commentAdd, handleCommentLikes, handlePostLikes, handleReplayLikes, post, replyAdd }) => {
|
||||
const theme = useTheme();
|
||||
|
||||
const { user } = useAuth();
|
||||
const { id, data } = post;
|
||||
let { profile } = post;
|
||||
|
||||
profile = { ...profile, name: user?.name || profile.name };
|
||||
|
||||
const { borderRadius } = useConfig();
|
||||
const matchesXS = useMediaQuery(theme.breakpoints.down('md'));
|
||||
|
||||
const [anchorEl, setAnchorEl] = React.useState(null);
|
||||
const handleClick = (event) => {
|
||||
setAnchorEl(event.currentTarget);
|
||||
};
|
||||
|
||||
const handleClose = () => {
|
||||
setAnchorEl(null);
|
||||
};
|
||||
|
||||
const [anchorSharedEl, setAnchorSharedEl] = React.useState(null);
|
||||
const handleSharedClick = (event) => {
|
||||
setAnchorSharedEl(event.currentTarget);
|
||||
};
|
||||
|
||||
const handleSharedClose = () => {
|
||||
setAnchorSharedEl(null);
|
||||
};
|
||||
|
||||
const [openComment, setOpenComment] = React.useState(!(data.comments && data.comments.length > 0));
|
||||
const handleChangeComment = () => {
|
||||
setOpenComment((prev) => !prev);
|
||||
};
|
||||
|
||||
let commentsResult = <></>;
|
||||
|
||||
if (data && data.comments) {
|
||||
commentsResult = data.comments.map((comment) => (
|
||||
<Comment
|
||||
postId={id}
|
||||
comment={comment}
|
||||
key={comment.id}
|
||||
user={profile}
|
||||
replyAdd={replyAdd}
|
||||
handleCommentLikes={handleCommentLikes}
|
||||
handleReplayLikes={handleReplayLikes}
|
||||
/>
|
||||
));
|
||||
}
|
||||
|
||||
const methods = useForm({
|
||||
resolver: yupResolver(validationSchema)
|
||||
});
|
||||
|
||||
const {
|
||||
handleSubmit,
|
||||
formState: { errors },
|
||||
reset
|
||||
} = methods;
|
||||
const onSubmit = async (comment) => {
|
||||
handleChangeComment();
|
||||
const commentId = uniqueId('#COMMENT_');
|
||||
const newComment = {
|
||||
id: commentId,
|
||||
profile,
|
||||
data: {
|
||||
comment: comment.name,
|
||||
likes: {
|
||||
like: false,
|
||||
value: 0
|
||||
},
|
||||
replies: []
|
||||
}
|
||||
};
|
||||
commentAdd(id, newComment);
|
||||
reset({ name: '' });
|
||||
};
|
||||
|
||||
return (
|
||||
<MainCard>
|
||||
<Grid container spacing={1}>
|
||||
<Grid item xs={12}>
|
||||
<Grid container wrap="nowrap" alignItems="center" spacing={1}>
|
||||
<Grid item>
|
||||
<Avatar alt="User 1" src={profile.avatar && avatarImage(`./${profile.avatar}`).default} />
|
||||
</Grid>
|
||||
<Grid item xs zeroMinWidth>
|
||||
<Grid container alignItems="center" spacing={1}>
|
||||
<Grid item>
|
||||
<Typography align="left" variant="h5" component="div">
|
||||
{profile.name}
|
||||
</Typography>
|
||||
</Grid>
|
||||
<Grid item>
|
||||
<Typography align="left" variant="caption">
|
||||
<FiberManualRecordIcon sx={{ width: '10px', height: '10px', opacity: 0.5, m: '0 5px' }} /> {profile.time}
|
||||
</Typography>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
<Grid item>
|
||||
<ButtonBase sx={{ borderRadius: '12px' }} onClick={handleClick}>
|
||||
<Avatar
|
||||
variant="rounded"
|
||||
sx={{
|
||||
...theme.typography.commonAvatar,
|
||||
...theme.typography.smallAvatar,
|
||||
background: theme.palette.mode === 'dark' ? theme.palette.dark.main : theme.palette.secondary.light,
|
||||
color: theme.palette.mode === 'dark' ? theme.palette.dark.light : theme.palette.secondary.dark,
|
||||
zIndex: 1,
|
||||
transition: 'all .2s ease-in-out',
|
||||
'&[aria-controls="menu-list-grow"],&:hover': {
|
||||
background: theme.palette.secondary.main,
|
||||
color: theme.palette.secondary.light
|
||||
}
|
||||
}}
|
||||
aria-controls="menu-post"
|
||||
aria-haspopup="true"
|
||||
>
|
||||
<MoreVertTwoToneIcon fontSize="inherit" />
|
||||
</Avatar>
|
||||
</ButtonBase>
|
||||
<Menu
|
||||
id="menu-post"
|
||||
anchorEl={anchorEl}
|
||||
keepMounted
|
||||
open={Boolean(anchorEl)}
|
||||
onClose={handleClose}
|
||||
variant="selectedMenu"
|
||||
anchorOrigin={{
|
||||
vertical: 'bottom',
|
||||
horizontal: 'right'
|
||||
}}
|
||||
transformOrigin={{
|
||||
vertical: 'top',
|
||||
horizontal: 'right'
|
||||
}}
|
||||
>
|
||||
<MenuItem onClick={handleClose}>Edit</MenuItem>
|
||||
<MenuItem onClick={handleClose}>Delete</MenuItem>
|
||||
</Menu>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
|
||||
{/* post - content */}
|
||||
<Grid
|
||||
item
|
||||
xs={12}
|
||||
sx={{
|
||||
'& > p': {
|
||||
...theme.typography.body1,
|
||||
mb: 0
|
||||
}
|
||||
}}
|
||||
>
|
||||
<ReactMarkdown remarkPlugins={[gfm]}>{data.content}</ReactMarkdown>
|
||||
</Grid>
|
||||
|
||||
{/* post - photo grid */}
|
||||
{data && data.images && data.images.length > 0 && (
|
||||
<Grid item xs={12}>
|
||||
<ImageList itemData={data.images} />
|
||||
</Grid>
|
||||
)}
|
||||
|
||||
{/* post - video */}
|
||||
{data.video && (
|
||||
<Grid item xs={12} sx={{ '&.MuiGrid-root': { pt: 2 } }}>
|
||||
<CardMedia
|
||||
sx={{
|
||||
borderRadius: `${borderRadius}px`,
|
||||
height: 330,
|
||||
[theme.breakpoints.down('xl')]: {
|
||||
height: 220
|
||||
}
|
||||
}}
|
||||
component="iframe"
|
||||
src={`https://www.youtube.com/embed/${data.video}`}
|
||||
/>
|
||||
</Grid>
|
||||
)}
|
||||
|
||||
{/* post - comment, likes and replay history */}
|
||||
<Grid item xs={12}>
|
||||
<Grid
|
||||
container
|
||||
alignItems="center"
|
||||
justifyContent="space-between"
|
||||
spacing={2}
|
||||
sx={{ mt: 0, color: theme.palette.mode === 'dark' ? 'grey.700' : 'grey.800' }}
|
||||
>
|
||||
<Grid item>
|
||||
<Stack direction="row" spacing={2}>
|
||||
<Button
|
||||
variant="text"
|
||||
onClick={() => handlePostLikes(id)}
|
||||
color="inherit"
|
||||
size="small"
|
||||
startIcon={<ThumbUpAltTwoToneIcon color={data && data.likes && data.likes.like ? 'primary' : 'inherit'} />}
|
||||
>
|
||||
{data && data.likes && data.likes.value ? data.likes.value : 0}
|
||||
<Typography color="inherit" sx={{ fontWeight: 500, ml: 0.5, display: { xs: 'none', sm: 'block' } }}>
|
||||
likes
|
||||
</Typography>
|
||||
</Button>
|
||||
<Button
|
||||
onClick={handleChangeComment}
|
||||
size="small"
|
||||
variant="text"
|
||||
color="inherit"
|
||||
startIcon={<ChatBubbleTwoToneIcon color="secondary" />}
|
||||
>
|
||||
{data.comments ? data.comments.length : 0} comments
|
||||
</Button>
|
||||
</Stack>
|
||||
</Grid>
|
||||
<Grid item>
|
||||
<IconButton onClick={handleSharedClick} size="large">
|
||||
<ShareTwoToneIcon sx={{ width: '1rem', height: '1rem' }} />
|
||||
</IconButton>
|
||||
<Menu
|
||||
id="menu-post"
|
||||
anchorEl={anchorSharedEl}
|
||||
keepMounted
|
||||
open={Boolean(anchorSharedEl)}
|
||||
onClose={handleSharedClose}
|
||||
variant="selectedMenu"
|
||||
anchorOrigin={{
|
||||
vertical: 'bottom',
|
||||
horizontal: 'right'
|
||||
}}
|
||||
transformOrigin={{
|
||||
vertical: 'top',
|
||||
horizontal: 'right'
|
||||
}}
|
||||
sx={{
|
||||
'& .MuiSvgIcon-root': {
|
||||
marginRight: '14px',
|
||||
fontSize: '1.25rem'
|
||||
}
|
||||
}}
|
||||
>
|
||||
<MenuItem onClick={handleSharedClose}>
|
||||
<ShareTwoToneIcon fontSize="inherit" /> Share Now
|
||||
</MenuItem>
|
||||
<MenuItem onClick={handleSharedClose}>
|
||||
<PeopleAltTwoToneIcon fontSize="inherit" /> Share to Friends
|
||||
</MenuItem>
|
||||
<MenuItem onClick={handleSharedClose}>
|
||||
<ChatTwoToneIcon fontSize="inherit" /> Send in Messanger
|
||||
</MenuItem>
|
||||
<MenuItem onClick={handleSharedClose}>
|
||||
<ContentCopyTwoToneIcon fontSize="inherit" /> Copy Link
|
||||
</MenuItem>
|
||||
</Menu>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
{/* add new comment */}
|
||||
<Collapse in={openComment} sx={{ width: '100%' }}>
|
||||
{openComment && (
|
||||
<Grid item xs={12} sx={{ pt: 2 }}>
|
||||
<form onSubmit={handleSubmit(onSubmit)}>
|
||||
<Grid container spacing={2} alignItems="flex-start">
|
||||
<Grid item sx={{ display: { xs: 'none', sm: 'block' } }}>
|
||||
<Avatar sx={{ mt: 0.75 }} alt="User 1" src={profile.avatar && avatarImage(`./${profile.avatar}`).default} size="xs" />
|
||||
</Grid>
|
||||
<Grid item xs zeroMinWidth>
|
||||
<FormProvider {...methods}>
|
||||
<FormInput fullWidth name="name" label="Write a comment..." size={matchesXS ? 'small' : 'medium'} bug={errors} />
|
||||
</FormProvider>
|
||||
</Grid>
|
||||
<Grid item>
|
||||
<AnimateButton>
|
||||
<Button type="submit" variant="contained" color="secondary" size={matchesXS ? 'small' : 'large'} sx={{ mt: 0.5 }}>
|
||||
Comment
|
||||
</Button>
|
||||
</AnimateButton>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</form>
|
||||
</Grid>
|
||||
)}
|
||||
</Collapse>
|
||||
{commentsResult}
|
||||
</Grid>
|
||||
</MainCard>
|
||||
);
|
||||
};
|
||||
|
||||
Post.propTypes = {
|
||||
commentAdd: PropTypes.func,
|
||||
handleCommentLikes: PropTypes.func,
|
||||
handlePostLikes: PropTypes.func,
|
||||
handleReplayLikes: PropTypes.func,
|
||||
post: PropTypes.object,
|
||||
replyAdd: PropTypes.func
|
||||
};
|
||||
|
||||
export default Post;
|
@ -1,48 +0,0 @@
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
// material-ui
|
||||
import { Grid, IconButton, Stack, Typography } from '@mui/material';
|
||||
|
||||
// project imports
|
||||
import MainCard from './MainCard';
|
||||
|
||||
// ============================|| ROUND ICON CARD ||============================ //
|
||||
|
||||
const RoundIconCard = ({ primary, secondary, content, iconPrimary, color, bgcolor }) => {
|
||||
const IconPrimary = iconPrimary;
|
||||
const primaryIcon = iconPrimary ? <IconPrimary fontSize="large" /> : null;
|
||||
|
||||
return (
|
||||
<MainCard>
|
||||
<Grid container alignItems="center" spacing={0} justifyContent="space-between">
|
||||
<Grid item>
|
||||
<Stack spacing={1}>
|
||||
<Typography variant="h5" color="inherit">
|
||||
{primary}
|
||||
</Typography>
|
||||
<Typography variant="h3">{secondary}</Typography>
|
||||
<Typography variant="subtitle2" color="inherit">
|
||||
{content}
|
||||
</Typography>
|
||||
</Stack>
|
||||
</Grid>
|
||||
<Grid item>
|
||||
<IconButton sx={{ bgcolor, color, '& .MuiSvgIcon-root': { fontSize: '1.5rem' } }} size="large">
|
||||
{primaryIcon}
|
||||
</IconButton>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</MainCard>
|
||||
);
|
||||
};
|
||||
|
||||
RoundIconCard.propTypes = {
|
||||
primary: PropTypes.string,
|
||||
secondary: PropTypes.string,
|
||||
content: PropTypes.string,
|
||||
iconPrimary: PropTypes.object,
|
||||
color: PropTypes.string,
|
||||
bgcolor: PropTypes.string
|
||||
};
|
||||
|
||||
export default RoundIconCard;
|
@ -1,157 +0,0 @@
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
// material-ui
|
||||
import { useTheme, styled } from '@mui/material/styles';
|
||||
import { Button, Card, CardContent, CardMedia, Chip, Grid, Typography } from '@mui/material';
|
||||
|
||||
// project imports
|
||||
import Avatar from '../extended/Avatar';
|
||||
import { gridSpacing } from 'store/constant';
|
||||
|
||||
// assets
|
||||
import FacebookIcon from '@mui/icons-material/Facebook';
|
||||
import TwitterIcon from '@mui/icons-material/Twitter';
|
||||
import LinkedInIcon from '@mui/icons-material/LinkedIn';
|
||||
import ChatBubbleTwoToneIcon from '@mui/icons-material/ChatBubbleTwoTone';
|
||||
|
||||
const avatarImage = require.context('assets/images/profile', true);
|
||||
|
||||
// styles
|
||||
const FacebookWrapper = styled(Button)({
|
||||
padding: 8,
|
||||
background: 'rgba(66, 103, 178, 0.2)',
|
||||
'& svg': {
|
||||
color: '#4267B2'
|
||||
},
|
||||
'&:hover': {
|
||||
background: '#4267B2',
|
||||
'& svg': {
|
||||
color: '#fff'
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
const TwitterWrapper = styled(Button)({
|
||||
padding: 8,
|
||||
background: 'rgba(29, 161, 242, 0.2)',
|
||||
'& svg': {
|
||||
color: '#1DA1F2'
|
||||
},
|
||||
'&:hover': {
|
||||
background: '#1DA1F2',
|
||||
'& svg': {
|
||||
color: '#fff'
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
const LinkedInWrapper = styled(Button)({
|
||||
padding: 8,
|
||||
background: 'rgba(14, 118, 168, 0.12)',
|
||||
'& svg': {
|
||||
color: '#0E76A8'
|
||||
},
|
||||
'&:hover': {
|
||||
background: '#0E76A8',
|
||||
'& svg': {
|
||||
color: '#fff'
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// ==============================|| USER PROFILE CARD ||============================== //
|
||||
|
||||
const UserProfileCard = ({ avatar, name, profile, role, status }) => {
|
||||
const theme = useTheme();
|
||||
const avatarProfile = avatar && avatarImage(`./${avatar}`).default;
|
||||
const imageProfile = profile && avatarImage(`./${profile}`).default;
|
||||
|
||||
return (
|
||||
<Card
|
||||
sx={{
|
||||
background: theme.palette.mode === 'dark' ? theme.palette.dark.main : theme.palette.grey[50],
|
||||
border: theme.palette.mode === 'dark' ? 'none' : '1px solid',
|
||||
borderColor: theme.palette.grey[100],
|
||||
textAlign: 'center'
|
||||
}}
|
||||
>
|
||||
<CardMedia component="img" image={imageProfile} title="Slider5 image" sx={{ height: '125px' }} />
|
||||
<CardContent sx={{ p: 2, pb: '16px !important' }}>
|
||||
<Grid container spacing={gridSpacing}>
|
||||
<Grid item xs={12}>
|
||||
<Grid container spacing={gridSpacing}>
|
||||
<Grid item xs={12}>
|
||||
<Avatar alt={name} src={avatarProfile} sx={{ width: 72, height: 72, m: '-50px auto 0' }} />
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
<Grid item xs={12} alignItems="center">
|
||||
<Grid container spacing={1}>
|
||||
<Grid item xs={12}>
|
||||
<Typography variant="h4">{name}</Typography>
|
||||
</Grid>
|
||||
<Grid item xs={12}>
|
||||
<Typography variant="body2">{role}</Typography>
|
||||
</Grid>
|
||||
<Grid item xs={12}>
|
||||
{status === 'Active' ? (
|
||||
<Chip
|
||||
label="Active"
|
||||
size="small"
|
||||
sx={{
|
||||
bgcolor: theme.palette.mode === 'dark' ? theme.palette.dark.dark : 'success.light',
|
||||
color: 'success.dark'
|
||||
}}
|
||||
/>
|
||||
) : (
|
||||
<Chip
|
||||
label="Rejected"
|
||||
size="small"
|
||||
sx={{
|
||||
bgcolor: theme.palette.mode === 'dark' ? theme.palette.dark.dark : 'error.light',
|
||||
color: 'error.dark'
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
<Grid item xs={12}>
|
||||
<Grid container spacing={2}>
|
||||
<Grid item xs={4}>
|
||||
<FacebookWrapper fullWidth>
|
||||
<FacebookIcon />
|
||||
</FacebookWrapper>
|
||||
</Grid>
|
||||
<Grid item xs={4}>
|
||||
<TwitterWrapper fullWidth>
|
||||
<TwitterIcon />
|
||||
</TwitterWrapper>
|
||||
</Grid>
|
||||
<Grid item xs={4}>
|
||||
<LinkedInWrapper fullWidth>
|
||||
<LinkedInIcon />
|
||||
</LinkedInWrapper>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
<Grid item xs={12}>
|
||||
<Button variant="outlined" fullWidth startIcon={<ChatBubbleTwoToneIcon />}>
|
||||
Message
|
||||
</Button>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</CardContent>
|
||||
</Card>
|
||||
);
|
||||
};
|
||||
|
||||
UserProfileCard.propTypes = {
|
||||
avatar: PropTypes.string,
|
||||
name: PropTypes.string,
|
||||
profile: PropTypes.string,
|
||||
role: PropTypes.string,
|
||||
status: PropTypes.string
|
||||
};
|
||||
|
||||
export default UserProfileCard;
|
@ -1,185 +0,0 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import { useState } from 'react';
|
||||
|
||||
// material-ui
|
||||
import { useTheme, styled } from '@mui/material/styles';
|
||||
import { Button, Card, Chip, Grid, IconButton, Menu, MenuItem, Typography } from '@mui/material';
|
||||
|
||||
// project imports
|
||||
import Avatar from '../extended/Avatar';
|
||||
import { gridSpacing } from 'store/constant';
|
||||
|
||||
// assets
|
||||
import MoreHorizOutlinedIcon from '@mui/icons-material/MoreHorizOutlined';
|
||||
import FacebookIcon from '@mui/icons-material/Facebook';
|
||||
import TwitterIcon from '@mui/icons-material/Twitter';
|
||||
import LinkedInIcon from '@mui/icons-material/LinkedIn';
|
||||
|
||||
const avatarImage = require.context('assets/images/profile', true);
|
||||
|
||||
// styles
|
||||
const FacebookWrapper = styled(Button)({
|
||||
padding: 8,
|
||||
background: 'rgba(66, 103, 178, 0.2)',
|
||||
'& svg': {
|
||||
color: '#4267B2'
|
||||
},
|
||||
'&:hover': {
|
||||
background: '#4267B2',
|
||||
'& svg': {
|
||||
color: '#fff'
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
const TwitterWrapper = styled(Button)({
|
||||
padding: 8,
|
||||
background: 'rgba(29, 161, 242, 0.2)',
|
||||
'& svg': {
|
||||
color: '#1DA1F2'
|
||||
},
|
||||
'&:hover': {
|
||||
background: '#1DA1F2',
|
||||
'& svg': {
|
||||
color: '#fff'
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
const LinkedInWrapper = styled(Button)({
|
||||
padding: 8,
|
||||
background: 'rgba(14, 118, 168, 0.12)',
|
||||
'& svg': {
|
||||
color: '#0E76A8'
|
||||
},
|
||||
'&:hover': {
|
||||
background: '#0E76A8',
|
||||
'& svg': {
|
||||
color: '#fff'
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// ==============================|| USER SIMPLE CARD ||============================== //
|
||||
|
||||
const UserSimpleCard = ({ avatar, name, status }) => {
|
||||
const theme = useTheme();
|
||||
const avatarProfile = avatar && avatarImage(`./${avatar}`).default;
|
||||
|
||||
const [anchorEl, setAnchorEl] = useState(null);
|
||||
const handleClick = (event) => {
|
||||
setAnchorEl(event.currentTarget);
|
||||
};
|
||||
const handleClose = () => {
|
||||
setAnchorEl(null);
|
||||
};
|
||||
|
||||
return (
|
||||
<Card
|
||||
sx={{
|
||||
p: 2,
|
||||
background: theme.palette.mode === 'dark' ? theme.palette.dark.main : theme.palette.grey[50],
|
||||
border: '1px solid',
|
||||
borderColor: theme.palette.mode === 'dark' ? 'transparent' : theme.palette.grey[100],
|
||||
'&:hover': {
|
||||
border: `1px solid${theme.palette.primary.main}`
|
||||
}
|
||||
}}
|
||||
>
|
||||
<Grid container spacing={gridSpacing}>
|
||||
<Grid item xs={12}>
|
||||
<Grid container spacing={gridSpacing}>
|
||||
<Grid item xs zeroMinWidth>
|
||||
<Avatar alt={name} src={avatarProfile} sx={{ width: 72, height: 72 }} />
|
||||
</Grid>
|
||||
<Grid item>
|
||||
<IconButton size="small" sx={{ mt: -0.75, mr: -0.75 }} onClick={handleClick}>
|
||||
<MoreHorizOutlinedIcon
|
||||
fontSize="small"
|
||||
color="inherit"
|
||||
aria-controls="menu-friend-card"
|
||||
aria-haspopup="true"
|
||||
sx={{ opacity: 0.6 }}
|
||||
/>
|
||||
</IconButton>
|
||||
<Menu
|
||||
id="menu-simple-card"
|
||||
anchorEl={anchorEl}
|
||||
keepMounted
|
||||
open={Boolean(anchorEl)}
|
||||
onClose={handleClose}
|
||||
variant="selectedMenu"
|
||||
anchorOrigin={{
|
||||
vertical: 'bottom',
|
||||
horizontal: 'right'
|
||||
}}
|
||||
transformOrigin={{
|
||||
vertical: 'top',
|
||||
horizontal: 'right'
|
||||
}}
|
||||
>
|
||||
<MenuItem onClick={handleClose}>Edit</MenuItem>
|
||||
<MenuItem onClick={handleClose}>Delete</MenuItem>
|
||||
</Menu>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
<Grid item xs={12} alignItems="center">
|
||||
<Grid container spacing={gridSpacing}>
|
||||
<Grid item xs zeroMinWidth>
|
||||
<Typography variant="h4">{name}</Typography>
|
||||
</Grid>
|
||||
<Grid item>
|
||||
{status === 'Active' ? (
|
||||
<Chip
|
||||
label="Active"
|
||||
size="small"
|
||||
sx={{
|
||||
bgcolor: theme.palette.mode === 'dark' ? theme.palette.dark.dark : 'success.light',
|
||||
color: 'success.dark'
|
||||
}}
|
||||
/>
|
||||
) : (
|
||||
<Chip
|
||||
label="Rejected"
|
||||
size="small"
|
||||
sx={{
|
||||
bgcolor: theme.palette.mode === 'dark' ? theme.palette.dark.dark : 'error.light',
|
||||
color: 'error.dark'
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
<Grid item xs={12}>
|
||||
<Grid container spacing={2}>
|
||||
<Grid item xs={4}>
|
||||
<FacebookWrapper fullWidth>
|
||||
<FacebookIcon fontSize="small" />
|
||||
</FacebookWrapper>
|
||||
</Grid>
|
||||
<Grid item xs={4}>
|
||||
<TwitterWrapper fullWidth>
|
||||
<TwitterIcon fontSize="small" />
|
||||
</TwitterWrapper>
|
||||
</Grid>
|
||||
<Grid item xs={4}>
|
||||
<LinkedInWrapper fullWidth>
|
||||
<LinkedInIcon fontSize="small" />
|
||||
</LinkedInWrapper>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Card>
|
||||
);
|
||||
};
|
||||
|
||||
UserSimpleCard.propTypes = {
|
||||
avatar: PropTypes.string,
|
||||
name: PropTypes.string,
|
||||
status: PropTypes.string
|
||||
};
|
||||
|
||||
export default UserSimpleCard;
|
Loading…
Reference in New Issue