blob: 655f0f445308f5cf5e8be34053cdcb408affc225 [file] [log] [blame]
simond47ef9e2022-09-28 22:24:28 -04001import { QuestionMark } from '@mui/icons-material';
simon35378692022-10-02 23:25:57 -04002import { Box, ClickAwayListener, IconButton, IconButtonProps, Popper, SvgIconProps } from '@mui/material';
simond47ef9e2022-09-28 22:24:28 -04003import { styled } from '@mui/material/styles';
simon35378692022-10-02 23:25:57 -04004import EmojiPicker, { IEmojiData } from 'emoji-picker-react';
5import React, { ComponentType, MouseEvent, useCallback, useState } from 'react';
simon07b4eb02022-09-29 17:50:26 -04006
simond47ef9e2022-09-28 22:24:28 -04007import {
8 Arrow2Icon,
9 Arrow3Icon,
10 ArrowIcon,
11 CameraIcon,
12 CameraInBubbleIcon,
13 CancelIcon,
14 CrossedEyeIcon,
15 CrossIcon,
16 EmojiIcon,
17 EyeIcon,
18 FolderIcon,
19 InfoIcon,
20 MicroInBubbleIcon,
21 PaperClipIcon,
22 PenIcon,
23 SaltireIcon,
simon35378692022-10-02 23:25:57 -040024} from './SvgIcon';
idillon-sfl44b05342022-08-24 15:46:42 -040025
simon35378692022-10-02 23:25:57 -040026type ShapedButtonProps = IconButtonProps & {
27 Icon: ComponentType<SvgIconProps>;
28};
29
30const RoundButton = styled(({ Icon, ...props }: ShapedButtonProps) => (
simond47ef9e2022-09-28 22:24:28 -040031 <IconButton {...props} disableRipple={true}>
32 <Icon fontSize="inherit" />
33 </IconButton>
34))(({ theme }) => ({
35 border: `1px solid ${theme.palette.primary.dark}`,
36 color: theme.palette.primary.dark,
37 fontSize: '15px',
38 '&:hover': {
39 background: theme.palette.primary.light,
40 },
41 '&:active': {
42 color: '#FFF',
43 background: theme.palette.primary.dark,
44 },
45 '&.MuiIconButton-sizeSmall': {
46 height: '15px',
47 width: '15px',
48 },
49 '&.MuiIconButton-sizeMedium': {
50 height: '30px',
51 width: '30px',
52 },
53 '&.MuiIconButton-sizeLarge': {
54 height: '53px',
55 width: '53px',
56 },
idillon-sfld5cc7862022-08-25 11:11:34 -040057}));
idillon-sfl44b05342022-08-24 15:46:42 -040058
simon35378692022-10-02 23:25:57 -040059export const CancelPictureButton = (props: IconButtonProps) => {
simond47ef9e2022-09-28 22:24:28 -040060 return <RoundButton {...props} aria-label="remove picture" Icon={CancelIcon} size="large" />;
61};
idillon-sfl44b05342022-08-24 15:46:42 -040062
simon35378692022-10-02 23:25:57 -040063export const EditPictureButton = (props: IconButtonProps) => {
simond47ef9e2022-09-28 22:24:28 -040064 return <RoundButton {...props} aria-label="edit picture" Icon={PenIcon} size="large" />;
65};
idillon-sfl44b05342022-08-24 15:46:42 -040066
simon35378692022-10-02 23:25:57 -040067export const UploadPictureButton = (props: IconButtonProps) => {
simond47ef9e2022-09-28 22:24:28 -040068 return <RoundButton {...props} aria-label="upload picture" Icon={FolderIcon} size="large" />;
69};
idillon-sfl44b05342022-08-24 15:46:42 -040070
simon35378692022-10-02 23:25:57 -040071export const TakePictureButton = (props: IconButtonProps) => {
simond47ef9e2022-09-28 22:24:28 -040072 return <RoundButton {...props} aria-label="take picture" Icon={CameraIcon} size="large" />;
73};
idillon-sfl37c18df2022-08-26 18:44:27 -040074
simon35378692022-10-02 23:25:57 -040075export const InfoButton = (props: IconButtonProps) => {
simond47ef9e2022-09-28 22:24:28 -040076 return <RoundButton {...props} aria-label="informations" Icon={InfoIcon} size="small" />;
77};
idillon-sfl37c18df2022-08-26 18:44:27 -040078
simon35378692022-10-02 23:25:57 -040079export const TipButton = (props: IconButtonProps) => {
simond47ef9e2022-09-28 22:24:28 -040080 return <RoundButton {...props} aria-label="tip" Icon={QuestionMark} size="medium" />;
81};
idillon-sfl37c18df2022-08-26 18:44:27 -040082
simon35378692022-10-02 23:25:57 -040083export const MoreButton = styled((props: IconButtonProps) => {
simond47ef9e2022-09-28 22:24:28 -040084 return (
85 <IconButton {...props} disableRipple={true} aria-label="more">
86 <CrossIcon fontSize="inherit" />
87 </IconButton>
88 );
89})(({ theme }) => ({
90 border: `1px solid ${theme.palette.primary.dark}`,
91 color: theme.palette.primary.dark,
92 fontSize: '10px',
93 height: '20px',
94 width: '20px',
95 '&:hover': {
96 background: theme.palette.primary.light,
97 },
98 '&:active': {
99 color: '#FFF',
100 background: theme.palette.primary.dark,
101 },
102}));
idillon927b7592022-09-15 12:56:45 -0400103
simon35378692022-10-02 23:25:57 -0400104export const BackButton = styled((props: IconButtonProps) => {
simond47ef9e2022-09-28 22:24:28 -0400105 return (
106 <IconButton {...props} disableRipple={true} aria-label="back">
107 <ArrowIcon fontSize="inherit" />
108 </IconButton>
109 );
110})(({ theme }) => ({
111 color: theme.palette.primary.dark,
112 fontSize: '15px',
113 height: '30px',
114 width: '51px',
115 borderRadius: '5px',
116 '&:hover': {
117 background: theme.palette.primary.light,
118 },
119}));
idillonb3788bf2022-08-29 15:57:57 -0400120
simon35378692022-10-02 23:25:57 -0400121export const CloseButton = styled((props: IconButtonProps) => {
simond47ef9e2022-09-28 22:24:28 -0400122 return (
123 <IconButton {...props} disableRipple={true} aria-label="close">
124 <SaltireIcon fontSize="inherit" />
125 </IconButton>
126 );
127})(({ theme }) => ({
128 color: theme.palette.primary.dark,
129 fontSize: '15px',
130 height: '30px',
131 width: '30px',
132 borderRadius: '5px',
133 '&:hover': {
134 background: theme.palette.primary.light,
135 },
136}));
idillonb3788bf2022-08-29 15:57:57 -0400137
simon35378692022-10-02 23:25:57 -0400138type ToggleVisibilityButtonProps = IconButtonProps & {
139 visible: boolean;
140};
141export const ToggleVisibilityButton = styled(({ visible, ...props }: ToggleVisibilityButtonProps) => {
simond47ef9e2022-09-28 22:24:28 -0400142 const Icon = visible ? CrossedEyeIcon : EyeIcon;
143 return (
144 <IconButton {...props} disableRipple={true}>
145 <Icon fontSize="inherit" />
146 </IconButton>
147 );
148})(({ theme }) => ({
149 color: theme.palette.primary.dark,
150 fontSize: '15px',
151 height: '15px',
152 width: '15px',
153 '&:hover': {
154 background: theme.palette.primary.light,
155 },
156}));
idillonaedab942022-09-01 14:29:43 -0400157
simon35378692022-10-02 23:25:57 -0400158const SquareButton = styled(({ Icon, ...props }: ShapedButtonProps) => (
simond47ef9e2022-09-28 22:24:28 -0400159 <IconButton {...props} disableRipple={true}>
160 <Icon fontSize="inherit" />
161 </IconButton>
162))(({ theme }) => ({
163 color: '#7E7E7E',
164 fontSize: '25px',
165 height: '36px',
166 width: '36px',
167 borderRadius: '5px',
168 '&:hover': {
169 background: '#E5E5E5',
170 },
idillonaedab942022-09-01 14:29:43 -0400171}));
172
simon35378692022-10-02 23:25:57 -0400173export const RecordVideoMessageButton = (props: IconButtonProps) => {
simond47ef9e2022-09-28 22:24:28 -0400174 return <SquareButton {...props} aria-label="record video message" Icon={CameraInBubbleIcon} />;
175};
idillonaedab942022-09-01 14:29:43 -0400176
simon35378692022-10-02 23:25:57 -0400177export const RecordVoiceMessageButton = (props: IconButtonProps) => {
simond47ef9e2022-09-28 22:24:28 -0400178 return <SquareButton {...props} aria-label="record voice message" Icon={MicroInBubbleIcon} />;
179};
idillonaedab942022-09-01 14:29:43 -0400180
simon35378692022-10-02 23:25:57 -0400181export const UploadFileButton = (props: IconButtonProps) => {
simond47ef9e2022-09-28 22:24:28 -0400182 return <SquareButton {...props} aria-label="upload file" Icon={PaperClipIcon} />;
183};
idillonaedab942022-09-01 14:29:43 -0400184
simon35378692022-10-02 23:25:57 -0400185export const SendMessageButton = (props: IconButtonProps) => {
simond47ef9e2022-09-28 22:24:28 -0400186 return <SquareButton {...props} aria-label="send message" Icon={Arrow2Icon} />;
187};
idillonaedab942022-09-01 14:29:43 -0400188
simon35378692022-10-02 23:25:57 -0400189export const ReplyMessageButton = styled((props: IconButtonProps) => (
simond47ef9e2022-09-28 22:24:28 -0400190 <IconButton {...props} disableRipple={true} aria-label="send message">
191 <Arrow3Icon fontSize="inherit" />
192 </IconButton>
193))(({ theme }) => ({
194 color: theme.palette.primary.dark,
195 fontSize: '20px',
196 height: '20px',
197 width: '20px',
198 borderRadius: '5px',
199 '&:hover': {
200 background: '#E5E5E5',
201 },
idillon927b7592022-09-15 12:56:45 -0400202}));
203
simon35378692022-10-02 23:25:57 -0400204type EmojiButtonProps = IconButtonProps & {
205 emoji: string;
206};
207export const EmojiButton = styled(({ emoji, ...props }: EmojiButtonProps) => (
simond47ef9e2022-09-28 22:24:28 -0400208 <IconButton {...props} disableRipple={true}>
209 {emoji}
210 </IconButton>
211))(({ theme }) => ({
212 color: 'white',
213 fontSize: '20px',
214 height: '20px',
215 width: '20px',
idillon927b7592022-09-15 12:56:45 -0400216}));
217
simon35378692022-10-02 23:25:57 -0400218type SelectEmojiButtonProps = {
219 onEmojiSelected: (emoji: string) => void;
220};
221export const SelectEmojiButton = ({ onEmojiSelected, ...props }: SelectEmojiButtonProps) => {
222 const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);
idillon1664bb22022-09-14 17:18:15 -0400223
simon35378692022-10-02 23:25:57 -0400224 const handleOpenEmojiPicker = useCallback(
225 (e: MouseEvent<HTMLButtonElement>) => setAnchorEl(anchorEl ? null : e.currentTarget),
226 [anchorEl]
227 );
simond47ef9e2022-09-28 22:24:28 -0400228
229 const handleClose = useCallback(() => setAnchorEl(null), [setAnchorEl]);
230
231 const onEmojiClick = useCallback(
simon35378692022-10-02 23:25:57 -0400232 (e: MouseEvent, emojiObject: IEmojiData) => {
simon80b7b3b2022-09-28 17:50:10 -0400233 onEmojiSelected(emojiObject.emoji);
simond47ef9e2022-09-28 22:24:28 -0400234 handleClose();
235 },
simon80b7b3b2022-09-28 17:50:10 -0400236 [handleClose, onEmojiSelected]
simond47ef9e2022-09-28 22:24:28 -0400237 );
238
239 const open = Boolean(anchorEl);
240 const id = open ? 'simple-popover' : undefined;
241
242 return (
243 <ClickAwayListener onClickAway={handleClose}>
244 <Box>
simon35378692022-10-02 23:25:57 -0400245 <SquareButton aria-describedby={id} aria-label="select emoji" Icon={EmojiIcon} onClick={(e) => {}} />
246 <Popper id={id} open={open} anchorEl={anchorEl}>
247 <EmojiPicker onEmojiClick={onEmojiClick} disableAutoFocus={true} disableSkinTonePicker={true} native />
simond47ef9e2022-09-28 22:24:28 -0400248 </Popper>
249 </Box>
250 </ClickAwayListener>
251 );
252};