1
0
Fork 0
mirror of https://github.com/muerwre/vault-frontend.git synced 2025-04-25 04:46:40 +07:00

message editing form works properly

This commit is contained in:
Fedor Katurov 2020-09-07 18:00:49 +07:00
parent c8ecb9085a
commit 47cd66496b
7 changed files with 47 additions and 23 deletions

View file

@ -13,10 +13,11 @@ interface IProps {
incoming: boolean;
onEdit: (id: number) => void;
onDelete: (id: number) => void;
onCancelEdit: () => void;
isEditing: boolean;
}
const Message: FC<IProps> = ({ message, incoming, onEdit, onDelete, isEditing }) => {
const Message: FC<IProps> = ({ message, incoming, onEdit, onDelete, isEditing, onCancelEdit }) => {
const onEditClicked = useCallback(() => onEdit(message.id), [message.id]);
const onDeleteClicked = useCallback(() => onDelete(message.id), [message.id]);
@ -24,7 +25,7 @@ const Message: FC<IProps> = ({ message, incoming, onEdit, onDelete, isEditing })
<div className={classNames(styles.message, { [styles.incoming]: incoming })}>
{isEditing ? (
<div className={styles.form}>
<MessageForm id={message.id} text={message.text} />
<MessageForm id={message.id} text={message.text} onCancel={onCancelEdit} />
</div>
) : (
<div className={styles.text}>

View file

@ -1,4 +1,4 @@
import React, { FC, useState, useCallback, KeyboardEventHandler } from 'react';
import React, { FC, useState, useCallback, KeyboardEventHandler, useMemo } from 'react';
import styles from './styles.scss';
import { Textarea } from '~/components/input/Textarea';
import { Filler } from '~/components/containers/Filler';
@ -22,19 +22,27 @@ type IProps = ReturnType<typeof mapStateToProps> &
typeof mapDispatchToProps & {
id?: number;
text?: string;
onCancel?: () => void;
};
const MessageFormUnconnected: FC<IProps> = ({
id = 0,
text: initialText = '',
profile: { is_sending_messages, is_loading_messages, messages_error },
authSendMessage,
id = 0,
text: initialText = '',
onCancel,
}) => {
const isEditing = useMemo(() => id > 0, [id]);
const [text, setText] = useState(initialText);
const onSuccess = useCallback(() => {
setText('');
}, [setText]);
if (isEditing) {
onCancel();
}
}, [setText, isEditing, onCancel]);
const onSubmit = useCallback(() => {
authSendMessage({ text, id }, onSuccess);
@ -61,7 +69,7 @@ const MessageFormUnconnected: FC<IProps> = ({
value={text}
handler={setText}
minRows={1}
maxRows={4}
maxRows={isEditing ? 15 : 5}
seamless
onKeyDown={onKeyDown}
disabled={is_sending_messages}
@ -73,6 +81,12 @@ const MessageFormUnconnected: FC<IProps> = ({
{is_sending_messages && <LoaderCircle size={20} />}
{isEditing && (
<Button size="small" color="link" onClick={onCancel}>
Отмена
</Button>
)}
<Button
size="small"
color="gray"
@ -80,7 +94,7 @@ const MessageFormUnconnected: FC<IProps> = ({
disabled={is_sending_messages}
onClick={onSubmit}
>
Сказать
{isEditing ? 'Схоронить' : 'Сказать'}
</Button>
</Group>
</Group>

View file

@ -20,6 +20,7 @@
justify-content: center;
flex-direction: row;
padding: 0 $gap / 2 $gap / 2 $gap / 2;
border-radius: 0 0 $radius $radius;
:global(.loader-circle) {
svg {

View file

@ -23,6 +23,7 @@ const ProfileMessagesUnconnected: FC<IProps> = ({ profile, user: { id }, authGet
const [editingMessageId, setEditingMessageId] = useState(0);
const onEditMessage = useCallback((id: number) => setEditingMessageId(id), [setEditingMessageId]);
const onCancelEdit = useCallback(() => setEditingMessageId(0), [setEditingMessageId]);
const onDeleteMessage = useCallback((id: number) => console.log({ id }), []);
useEffect(() => {
@ -57,6 +58,7 @@ const ProfileMessagesUnconnected: FC<IProps> = ({ profile, user: { id }, authGet
onEdit={onEditMessage}
onDelete={onDeleteMessage}
isEditing={editingMessageId === message.id}
onCancelEdit={onCancelEdit}
/>
))}

View file

@ -31,7 +31,7 @@
padding: 0;
textarea {
padding: $gap;
padding: $gap / 2 $gap;
}
}
}
@ -77,20 +77,20 @@
color: white;
position: relative;
&::before {
content: ' ';
background: linear-gradient(270deg, $input_bg_color $gap, transparentize($input_bg_color, 1));
position: absolute;
width: $gap * 2;
height: $input_height;
top: 1px;
right: 1px;
transform: translateX(0);
transition: transform 0.25s;
border-radius: 0 $input_radius $input_radius 0;
pointer-events: none;
touch-action: none;
}
//&::before {
// content: ' ';
// background: linear-gradient(270deg, $input_bg_color $gap, transparentize($input_bg_color, 1));
// position: absolute;
// width: $gap * 2;
// height: $input_height;
// top: 1px;
// right: 1px;
// transform: translateX(0);
// transition: transform 0.25s;
// border-radius: 0 $input_radius $input_radius 0;
// pointer-events: none;
// touch-action: none;
//}
}
&.required {