Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,9 @@ export const TaskButtonsRecipient = ({
userRole={userRole}
taskId={taskId}
type={
isTaskExpired || volunteer
isTaskUrgent
? modalContentType.cancel
: volunteer
? modalContentType.responded
: modalContentType.close
}
Expand All @@ -128,7 +130,7 @@ export const TaskButtonsRecipient = ({
>
<SquareButton
buttonType={taskButtonType.close}
disabledColor={isTaskUrgent}
disabledColor={isTaskUrgent || !!volunteer}
/>
</ButtonWithModal>
)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,13 +75,11 @@ export const TaskButtonsVolunteer = ({
modalContent={
<ModalContent
type={
isTaskExpired || !date
? modalContentType.responded
: isTaskUrgent
? modalContentType.cancel
: modalContentType.close
isTaskUrgent ? modalContentType.cancel : modalContentType.close
}
date={date}
taskId={taskId}
userRole={userRole}
/>
}
>
Expand Down
46 changes: 42 additions & 4 deletions src/widgets/button-with-modal/index.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
import type { Dispatch, ReactNode, SetStateAction } from 'react';
import { useRef, useState } from 'react';
import * as React from 'react';
import {
Dispatch,
ReactNode,
SetStateAction,
useEffect,
useRef,
useState,
} from 'react';

import { Icon } from 'shared/ui';
import { Tooltip } from 'shared/ui/tooltip';
import styles from './styles.module.css';
import { PopupChat, infoAdmin } from 'entities';
import { useControlModal } from 'shared/hooks';

let tooltipModalRefCount = 0;

Expand Down Expand Up @@ -32,10 +42,22 @@ export const ButtonWithModal = ({
}: ModalProps) => {
const [visible, setVisible] = useState<boolean>(false);
const [coords, setCoords] = useState<Coords | null>(null);

const { isOpen, handleOpen, handleClose } = useControlModal();
const [isTooltipBlocked, setIsTooltipBlocked] = useState(false);
const handleOpenChat = () => {
setIsTooltipBlocked(true);
handleOpen();
hideModal();
};
const handleCloseChat = () => {
handleClose();
setTimeout(() => setIsTooltipBlocked(false), 300);
};
const buttonRef = useRef<HTMLDivElement>(null);

const getCoords = () => {
if (isTooltipBlocked) return;

if (!visible) {
setVisible(true);

Expand Down Expand Up @@ -68,6 +90,10 @@ export const ButtonWithModal = ({
}
};

useEffect(() => {
setVisible(false);
}, [modalContent]);

return (
<div ref={buttonRef} onClick={getCoords} className={extClassName}>
{children}
Expand All @@ -91,9 +117,21 @@ export const ButtonWithModal = ({
className={`${styles.closeButton} close`}
/>
)}
{modalContent}
{modalContent &&
React.cloneElement(modalContent as React.ReactElement, {
openChat: handleOpenChat,
})}
</Tooltip>
)}
{isOpen && (
<PopupChat
isOpen={isOpen}
onClick={handleCloseChat}
messages={[]}
chatmateInfo={infoAdmin}
onAttachFileClick={() => {}}
/>
)}
</div>
);
};
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
import { useControlModal } from 'shared/hooks';
import { Button, Typography } from 'shared/ui';
import { infoAdmin, PopupChat } from 'entities';

import styles from './styles.module.css';
import { ModalContentProps } from 'widgets/task-buttons-content/index';

export const AdminModalContent = () => {
const { isOpen, handleOpen, handleClose } = useControlModal();
export const AdminModalContent = ({ openChat }: ModalContentProps) => {
return (
<div className={styles.modalTooltip}>
<Typography
Expand All @@ -18,17 +16,8 @@ export const AdminModalContent = () => {
<Button
buttonType="secondary"
label={'Написать администратору'}
onClick={handleOpen}
onClick={openChat}
/>
{isOpen && (
<PopupChat
isOpen={isOpen}
onClick={handleClose}
messages={[]}
chatmateInfo={infoAdmin}
onAttachFileClick={() => {}}
/>
)}
</div>
</div>
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,60 +1,31 @@
import { differenceInHours, parseISO } from 'date-fns';

import { ModalContentProps } from 'widgets/task-buttons-content';
import { Button, Typography } from 'shared/ui';

import { infoAdmin, PopupChat } from 'entities';
import { useControlModal } from 'shared/hooks';

import styles from './styles.module.css';

export const CancelModalContent = ({ date }: ModalContentProps) => {
const { isOpen, handleOpen, handleClose } = useControlModal();

const isRemainLessThanDay = (taskDeadline: string | null | undefined) => {
if (!taskDeadline) return false;

const now = new Date();
const parsedDate = parseISO(taskDeadline);
const hoursToDeadline = differenceInHours(parsedDate, now);
return hoursToDeadline < 24;
};

if (isRemainLessThanDay(date)) {
return (
<div className={styles.modalTooltip}>
<Typography
tag={'h3'}
variant={'paragraph-bold'}
content={'До начала заявки менее 24 часа'}
extraClass={styles.modalTitle}
import { ModalContentProps } from 'widgets/task-buttons-content/index';

export const CancelModalContent = ({ openChat }: ModalContentProps) => {
return (
<div className={styles.modalTooltip}>
<Typography
tag={'h3'}
variant={'paragraph-bold'}
content={'До начала заявки менее 24 часа'}
extraClass={styles.modalTitle}
/>
<Typography
fontFamily={'secondaryFont'}
content={'Вы не можете отменить заявку самостоятельно.'}
extraClass={styles.modalContent}
/>
<div className={styles.modalButtons}>
<Button
buttonType="primary"
label="Написать администратору"
onClick={openChat}
/>
<Typography
fontFamily={'secondaryFont'}
content={'Вы не можете отменить заявку самостоятельно.'}
extraClass={styles.modalContent}
/>
<div className={styles.modalButtons}>
<Button
buttonType="primary"
label="Написать администратору"
onClick={() => handleOpen()}
/>
{isOpen && (
<PopupChat
isOpen={isOpen}
onClick={handleClose}
messages={[]}
chatmateInfo={infoAdmin}
onAttachFileClick={() => {}}
/>
)}
</div>
</div>
);
}

return null;
</div>
);
};

export default CancelModalContent;
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,8 @@ import classNames from 'classnames';
import { useState } from 'react';

import { Typography, Checkbox, Button } from 'shared/ui';
import { useControlModal } from 'shared/hooks';
import { useCancelTaskMutation, useRejectTaskMutation } from 'services';
import { userRole as userRoles } from 'shared/types/common.types';
import { PopupChat, infoAdmin } from 'entities';
import { useCancelTaskMutation } from 'services';

import { ModalContentProps } from 'widgets/task-buttons-content';
import {
reasonType as reasonTypes,
Expand All @@ -15,10 +12,17 @@ import {

import styles from './styles.module.css';

const CloseModalContent = ({ userRole, taskId }: ModalContentProps) => {
const { isOpen, handleOpen, handleClose } = useControlModal();
const [reason, setReason] = useState<ReasonType | null>(null);
const CloseModalContent = ({
userRole,
taskId,
openChat,
}: ModalContentProps) => {
const [cancelTask] = useCancelTaskMutation();
const [rejectTask] = useRejectTaskMutation();
const [reason, setReason] = useState<ReasonType | null>(null);
const isReasonUnselected = () => {
return !reason;
};

const handleSetReason = (reasonType: ReasonType) => {
if (reason === reasonType) {
Expand All @@ -29,8 +33,12 @@ const CloseModalContent = ({ userRole, taskId }: ModalContentProps) => {
};

const handleCancelClick = () => {
if (userRole === userRoles.RECIPIENT && taskId) {
if (!taskId) return;

if (userRole === userRoles.RECIPIENT) {
cancelTask({ id: taskId });
} else if (userRole === userRoles.VOLUNTEER) {
rejectTask({ role: userRole.toLocaleLowerCase(), id: taskId });
}
};

Expand Down Expand Up @@ -67,21 +75,12 @@ const CloseModalContent = ({ userRole, taskId }: ModalContentProps) => {
buttonType="secondary"
extClassName={styles.fitWidth}
label="Помощь администратора"
onClick={() => handleOpen()}
onClick={openChat}
/>
{isOpen && (
<PopupChat
isOpen={isOpen}
onClick={handleClose}
messages={[]}
chatmateInfo={infoAdmin}
onAttachFileClick={() => {}}
/>
)}
<Button
buttonType="primary"
label="Отменить заявку"
disabled={!reason}
disabled={isReasonUnselected()}
onClick={handleCancelClick}
/>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ import { userRole as userRoles } from 'shared/types/common.types';
import { Button, Typography } from 'shared/ui';
import { useRejectTaskMutation } from 'services';
import { taskReport } from 'entities/task/types';
import { useControlModal } from 'shared/hooks';
import { PopupChat, infoAdmin } from 'entities';

import styles from './styles.module.css';

Expand All @@ -19,8 +17,8 @@ export const ConflictModalContent = ({
volunteerReport,
recipientReport,
setConflictModalVisible,
openChat,
}: ModalContentProps) => {
const { isOpen, handleOpen, handleClose } = useControlModal();
const [rejectTask] = useRejectTaskMutation();
const handleRejectClick = () => {
if (userRole && taskId) {
Expand Down Expand Up @@ -91,17 +89,8 @@ export const ConflictModalContent = ({
label={
active ? 'Помощь администратора' : 'Написать администратору'
}
onClick={() => handleOpen()}
onClick={openChat}
/>
{isOpen && (
<PopupChat
isOpen={isOpen}
onClick={handleClose}
messages={[]}
chatmateInfo={infoAdmin}
onAttachFileClick={() => {}}
/>
)}
</div>
)}
</>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
import { infoAdmin, PopupChat } from 'entities';
import { useControlModal } from 'shared/hooks';
import { Button, Typography } from 'shared/ui';

import styles from './styles.module.css';
import { ModalContentProps } from 'widgets/task-buttons-content';

export const RespondedModalContent = () => {
const { isOpen, handleOpen, handleClose } = useControlModal();
export const RespondedModalContent = ({ openChat }: ModalContentProps) => {
return (
<div className={styles.modalTooltip}>
<Typography
Expand All @@ -25,17 +23,8 @@ export const RespondedModalContent = () => {
<Button
buttonType="primary"
label="Написать администратору"
onClick={handleOpen}
onClick={openChat}
/>
{isOpen && (
<PopupChat
isOpen={isOpen}
onClick={handleClose}
messages={[]}
chatmateInfo={infoAdmin}
onAttachFileClick={() => {}}
/>
)}
</div>
</div>
);
Expand Down
Loading