136 lines
6.0 KiB
TypeScript
136 lines
6.0 KiB
TypeScript
import React, { useState } from 'react';
|
||
import Layout from "../components/layout";
|
||
import fs from 'fs';
|
||
import path from 'path';
|
||
import { url } from 'inspector';
|
||
import ProtectedRoute, { serverSideAuth } from "/components/protectedRoute";
|
||
import axiosInstance from '../src/axiosSecure';
|
||
import { UserRole } from "@prisma/client";
|
||
|
||
|
||
const PDFViewerPage = ({ pdfFiles }) => {
|
||
const [files, setFiles] = useState(pdfFiles);
|
||
|
||
const handleFileDelete = async (fileName) => {
|
||
const subfolder = 'permits'; // Change this as needed based on your subfolder structure
|
||
try {
|
||
await axiosInstance.delete(`/api/content/${subfolder}?file=${fileName}`);
|
||
setFiles(files.filter(file => file.name !== fileName));
|
||
} catch (error) {
|
||
console.error('Error deleting file:', error);
|
||
}
|
||
};
|
||
|
||
const handleFileUpload = async (event) => {
|
||
const file = event.target.files[0];
|
||
//utf-8 encoding
|
||
// const formData = new FormData();
|
||
const formData = new FormData();
|
||
// formData.append('file', file);
|
||
const newFile = new File([file], encodeURI(file.name), { type: file.type });
|
||
formData.append('file', newFile);
|
||
|
||
const subfolder = 'permits'; // Change this as needed based on your subfolder structure
|
||
try {
|
||
const response = await axiosInstance.post(`/api/content/${subfolder}`, formData, {
|
||
headers: {
|
||
'Content-Type': 'multipart/form-data',
|
||
// 'Content-Encoding': 'utf-8'
|
||
}
|
||
});
|
||
const newFiles = response.data.files.map(file => ({ name: decodeURIComponent(file.originalname), url: file.path }));
|
||
setFiles([...files, ...newFiles]);
|
||
} catch (error) {
|
||
console.error('Error uploading file:', error);
|
||
}
|
||
};
|
||
|
||
|
||
return (
|
||
<Layout>
|
||
<h1 className="text-3xl font-bold p-4 pt-8">Разрешителни</h1>
|
||
<ProtectedRoute allowedRoles={[UserRole.ADMIN]} deniedMessage="">
|
||
<div className="border border-blue-500 p-4 rounded shadow-md">
|
||
<div className="mb-6">
|
||
<p className="text-lg mb-2">За да качите файл кликнете на бутона по-долу и изберете файл от вашия компютър.</p>
|
||
<input type="file" onChange={handleFileUpload} className="block w-full text-sm text-gray-600
|
||
file:mr-4 file:py-2 file:px-4
|
||
file:border-0
|
||
file:text-sm file:font-semibold
|
||
file:bg-blue-500 file:text-white
|
||
hover:file:bg-blue-600"/>
|
||
</div>
|
||
<div>
|
||
<h3 className="text-lg font-semibold mb-2">Съществуващи файлове:</h3>
|
||
{files.length > 0 ? (
|
||
files.map((file, index) => (
|
||
<div key={index} className="flex items-center justify-between mb-2 p-2 hover:bg-blue-50 rounded">
|
||
<a href={file.url} className="text-blue-600 hover:text-blue-800 visited:text-purple-600 underline" target="_blank" rel="noopener noreferrer">
|
||
{file.name}
|
||
</a>
|
||
<button onClick={() => handleFileDelete(file.name)} className="ml-4 bg-red-500 hover:bg-red-700 text-white font-bold py-1 px-2 rounded focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-opacity-50">
|
||
изтрий
|
||
</button>
|
||
</div>
|
||
))
|
||
) : (
|
||
<p className="text-gray-500">Няма качени файлове.</p>
|
||
)}
|
||
</div>
|
||
</div>
|
||
|
||
</ProtectedRoute>
|
||
|
||
<div style={{ width: '100%', height: 'calc(100vh - 100px)' }}> {/* Adjust the 100px based on your header/footer size */}
|
||
{pdfFiles.map((file, index) => (
|
||
<> <p className="pt-2">
|
||
<a href={file.url} className="text-blue-600 hover:text-blue-800 visited:text-purple-600 underline" target='_blank'>
|
||
Свали: {file.name}
|
||
</a>
|
||
</p>
|
||
<div style={{ width: 'calc(100% - 1rem)', height: '100%' }} className='py-2'>
|
||
< object data={file.url} type="application/pdf" style={{ width: '100%', height: '100%' }}>
|
||
<p>Вашият браузър не поддържа PDFs файлове. Моля свалете файла за да го разгледате: <a href={file.url}>Свали {file.name}</a>.</p>
|
||
<p>Your browser does not support PDFs. Please download the PDF to view it: <a href={file.url}> {file.name}</a>.</p>
|
||
</object>
|
||
</div>
|
||
</>
|
||
))}
|
||
</div>
|
||
</Layout >
|
||
);
|
||
};
|
||
|
||
export default PDFViewerPage;
|
||
|
||
|
||
export const getServerSideProps = async (context) => {
|
||
const permitsFolder = path.join('public', 'content', 'permits');
|
||
|
||
// Create folders if they do not exist
|
||
if (!fs.existsSync(permitsFolder)) {
|
||
fs.mkdirSync(permitsFolder, { recursive: true });
|
||
}
|
||
//get all the files in the permits folder order them by date desc and display them
|
||
const pdfFiles = fs.readdirSync(path.join(process.cwd(), permitsFolder)).map(file => {
|
||
return {
|
||
name: file,
|
||
date: fs.statSync(path.join(process.cwd(), permitsFolder, file)).mtime,
|
||
url: `/content/permits/${file}`
|
||
};
|
||
}).sort((a, b) => b.date - a.date)
|
||
.map(file => {
|
||
return {
|
||
name: file.name,
|
||
url: file.url
|
||
};
|
||
}
|
||
);
|
||
return {
|
||
props: {
|
||
pdfFiles
|
||
}
|
||
};
|
||
}
|
||
|