add appeal modal window, add file status
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
'use client';
|
||||
|
||||
import { convertBytes } from '@/app/lib/convertBytes';
|
||||
import { formatDate, formatDateTime } from '@/app/lib/formatDate';
|
||||
import { useTranslations } from 'next-intl';
|
||||
import { FileDetails } from '@/app/[locale]/pages/file/[id]/page';
|
||||
import { FileAnAppeal } from '@/app/actions/fileEntity';
|
||||
import { useState } from 'react';
|
||||
import { toast } from 'sonner';
|
||||
|
||||
export function FileAppealModalWindow({ fileId, setWindowClose, setWindowChildren }: {
|
||||
fileId: string,
|
||||
setWindowClose: any,
|
||||
setWindowChildren: any
|
||||
}) {
|
||||
const t = useTranslations('Global');
|
||||
const [appealReason, setAppealReason] = useState('');
|
||||
const [additionalInfo, setAdditionalInfo] = useState('');
|
||||
const [isSubmitting, setIsSubmitting] = useState(false);
|
||||
|
||||
const handleSubmitAppeal = async () => {
|
||||
if (!appealReason.trim()) {
|
||||
toast.error(t('please-enter-appeal-reason'));
|
||||
return;
|
||||
}
|
||||
|
||||
setIsSubmitting(true);
|
||||
|
||||
try {
|
||||
const result = await FileAnAppeal(fileId, appealReason, additionalInfo);
|
||||
|
||||
if (result && result.status === 'success') {
|
||||
toast.success(t('appeal-submitted-successfully'));
|
||||
setWindowClose(false);
|
||||
} else {
|
||||
toast.error(result?.message || t('appeal-submission-failed'));
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Appeal submission error:', error);
|
||||
toast.error(t('appeal-submission-failed'));
|
||||
} finally {
|
||||
setIsSubmitting(false);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="modal-window-view-file">
|
||||
<div className="modal-window-view-file-content">
|
||||
{/* Форма подачи апелляции */}
|
||||
<div className="file-info-card appeal-form">
|
||||
<div className="info-header">
|
||||
<h4>{t('file-an-appeal')}</h4>
|
||||
</div>
|
||||
|
||||
<div className="info-item">
|
||||
<div className="info-label">
|
||||
{t('appeal-reason')} <span className="required">*</span>
|
||||
</div>
|
||||
<div className="info-value">
|
||||
<textarea
|
||||
className="appeal-textarea"
|
||||
value={appealReason}
|
||||
onChange={(e) => setAppealReason(e.target.value)}
|
||||
placeholder={t('enter-appeal-reason')}
|
||||
rows={4}
|
||||
disabled={isSubmitting}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="info-item">
|
||||
<div className="info-label">{t('additional-info')}</div>
|
||||
<div className="info-value">
|
||||
<textarea
|
||||
className="appeal-textarea"
|
||||
value={additionalInfo}
|
||||
onChange={(e) => setAdditionalInfo(e.target.value)}
|
||||
placeholder={t('enter-additional-info')}
|
||||
rows={3}
|
||||
disabled={isSubmitting}
|
||||
/>
|
||||
</div>
|
||||
<div className="appeal-actions">
|
||||
<button
|
||||
className="btn btn-cancel"
|
||||
onClick={() => setWindowClose(false)}
|
||||
disabled={isSubmitting}
|
||||
>
|
||||
{t('cancel')}
|
||||
</button>
|
||||
<button
|
||||
className="btn btn-primary"
|
||||
onClick={handleSubmitAppeal}
|
||||
disabled={isSubmitting}
|
||||
>
|
||||
{isSubmitting ? t('submitting') : t('submit-appeal')}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user