diff --git a/Backend/package-lock.json b/Backend/package-lock.json index bc172c9..3b16a3e 100644 --- a/Backend/package-lock.json +++ b/Backend/package-lock.json @@ -19,7 +19,7 @@ "moment": "^2.30.1", "mongoose": "^8.0.2", "multer": "^1.4.5-lts.1", - "nodemailer": "^6.9.13" + "nodemailer": "^6.9.14" }, "devDependencies": { "nodemon": "^3.0.2" @@ -1482,9 +1482,9 @@ } }, "node_modules/nodemailer": { - "version": "6.9.13", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.13.tgz", - "integrity": "sha512-7o38Yogx6krdoBf3jCAqnIN4oSQFx+fMa0I7dK1D+me9kBxx12D+/33wSb+fhOCtIxvYJ+4x4IMEhmhCKfAiOA==", + "version": "6.9.14", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.14.tgz", + "integrity": "sha512-Dobp/ebDKBvz91sbtRKhcznLThrKxKt97GI2FAlAyy+fk19j73Uz3sBXolVtmcXjaorivqsbbbjDY+Jkt4/bQA==", "engines": { "node": ">=6.0.0" } diff --git a/Backend/package.json b/Backend/package.json index 8d4fc54..808440c 100644 --- a/Backend/package.json +++ b/Backend/package.json @@ -22,7 +22,7 @@ "moment": "^2.30.1", "mongoose": "^8.0.2", "multer": "^1.4.5-lts.1", - "nodemailer": "^6.9.13" + "nodemailer": "^6.9.14" }, "devDependencies": { "nodemon": "^3.0.2" diff --git a/Backend/src/config/database.config.js b/Backend/src/config/database.config.js index e63e76a..704d230 100644 --- a/Backend/src/config/database.config.js +++ b/Backend/src/config/database.config.js @@ -24,7 +24,7 @@ export const dbconnect = async () => { console.log('Connected successfully!'); // Watch for changes only after seeding is done - await watchUsers(); + //await watchUsers(); } catch (error) { console.log(error); } diff --git a/Backend/src/models/disasterRequest.model.js b/Backend/src/models/disasterRequest.model.js index c4b116d..5e69159 100644 --- a/Backend/src/models/disasterRequest.model.js +++ b/Backend/src/models/disasterRequest.model.js @@ -13,7 +13,8 @@ export const DisasterRequestSchema = new Schema( } ], default: []}, - affectedCount: {type: Number, required: true}, + image: {type:[{type:String}], required:false}, + affectedCount: {type: String, required: true}, medicalNeed: {type: Boolean, default: false}, otherNeeds: {type: String, required: false}, requestTime: {type: String, required: true}, diff --git a/Backend/src/models/news.model.js b/Backend/src/models/news.model.js index f1ff120..c236cc7 100644 --- a/Backend/src/models/news.model.js +++ b/Backend/src/models/news.model.js @@ -7,7 +7,7 @@ export const NewsSchema = new Schema( author: {type: String, required: true}, createdDate: {type: String, required: true}, createdTime: {type: String, required: true}, - image: {data: Buffer , contentType: String}, + image: {type:String , default:false}, newsBody: {type: String, required: true}, show: {type: Boolean, default:false} //if and only if show is true news are displayed in the user's side }, diff --git a/Backend/src/models/user.model.js b/Backend/src/models/user.model.js index 974d9d7..80d600c 100644 --- a/Backend/src/models/user.model.js +++ b/Backend/src/models/user.model.js @@ -9,7 +9,7 @@ export const UserSchema = new Schema( address: {type: String, default: "none"}, accessLevel: {type: Number, default: 1}, department: {type: String, default: "None"}, - telephoneNumber: {type: String, required: true}, + telephoneNumber: {type: String, required: false}, lastLogged: {type: Date, default: "2023/10/12"} }, { diff --git a/Backend/src/routers/maps.router.js b/Backend/src/routers/maps.router.js index ac3c6d9..ccb43b0 100644 --- a/Backend/src/routers/maps.router.js +++ b/Backend/src/routers/maps.router.js @@ -23,7 +23,7 @@ router.post('/getGeoCode', handler(async(req,res) => { router.post ('/getProvince',handler( async(req,res) => { const {location} = req.body; - const apiKey = 'AIzaSyCqnhZFna6jPPizSKO88sNgdYLc3SHAGhk'; + const apiKey = process.env.GOOGLEMAP_API; const url = `https://maps.googleapis.com/maps/api/geocode/json?address=${encodeURIComponent(location)},Sri%20Lanka&key=${apiKey}`; try { diff --git a/Backend/src/routers/news.router.js b/Backend/src/routers/news.router.js index 6db7a80..26c5546 100644 --- a/Backend/src/routers/news.router.js +++ b/Backend/src/routers/news.router.js @@ -11,9 +11,9 @@ const router = Router(); const storage = multer.memoryStorage(); const upload = multer({ storage: storage }); -router.post('/createNews', upload.single('image'), handler(async (req, res) => { +router.post('/createNews', handler(async (req, res) => { - const {heading, author, newsBody} = req.body; + const {heading, author, newsBody, image} = req.body; const currentDateTime = new Date(); //real time const createdDate = currentDateTime.toDateString(); const createdTime = currentDateTime.toTimeString(); @@ -24,22 +24,13 @@ router.post('/createNews', upload.single('image'), handler(async (req, res) => { return res.status(BAD_REQUEST).send("Missing required fields"); } const newID = await generateNewsId(heading); - - let imageData; - let contentType; - if (req.file) { - imageData = req.file.buffer; // Convert image buffer to base64 string - contentType = req.file.mimetype; - } try { const newNews = await NewsModel.create({ newsId: newID, heading, author, - - image : { data: imageData, contentType: contentType }, - + image, newsBody, createdDate, createdTime, @@ -54,9 +45,9 @@ router.post('/createNews', upload.single('image'), handler(async (req, res) => { })); -router.patch('/updateNews/:newsId', upload.single('image'), handler(async (req, res) => { +router.patch('/updateNews/:newsId', handler(async (req, res) => { const { newsId } = req.params; - const {heading, author, newsBody, show} = req.body; + const {heading, author, newsBody, show, image} = req.body; const currentDateTime = new Date(); //real time const createdDate = currentDateTime.toDateString(); const createdTime = currentDateTime.toTimeString(); @@ -64,14 +55,7 @@ router.patch('/updateNews/:newsId', upload.single('image'), handler(async (req, if (!heading || !author || !newsBody ) { return res.status(BAD_REQUEST).send("Missing required fields"); } - let updateData = { heading, author, newsBody, show, createdDate, createdTime}; - - if (req.file) { - updateData.image = { - data: req.file.buffer, - contentType: req.file.mimetype - }; - } + let updateData = { heading, author, newsBody, show, createdDate, createdTime, image}; try{ const updatedNews = await NewsModel.findOneAndUpdate( { newsId: newsId }, diff --git a/Backend/src/routers/report.router.js b/Backend/src/routers/report.router.js index 327d750..03d6468 100644 --- a/Backend/src/routers/report.router.js +++ b/Backend/src/routers/report.router.js @@ -12,6 +12,7 @@ router.post('/addReport', handler(async (req,res) => { const {disasterType, severity, disasterLocation, + disasterRequests, affectedCount, affectedLocations, finished @@ -28,6 +29,7 @@ router.post('/addReport', handler(async (req,res) => { disasterLocation, affectedCount, affectedLocations, + disasterRequests, createdDate: currentDate, updatedDate: currentDate, finished: isFinished diff --git a/Backend/src/routers/request.router.js b/Backend/src/routers/request.router.js index 83c5c56..faa3e62 100644 --- a/Backend/src/routers/request.router.js +++ b/Backend/src/routers/request.router.js @@ -2,10 +2,11 @@ import { Router } from "express"; import { BAD_REQUEST, INTERNAL_SERVER_ERROR } from "../constants/httpStatus.js"; import handler from 'express-async-handler'; import { DisasterRequestModel } from "../models/disasterRequest.model.js"; +import { DisasterReportModel } from "../models/disasterReport.model.js"; const router = Router(); -router.get('/request',handler(async (req,res) => { +router.post('/request',handler(async (req,res) => { const { disasterType, @@ -16,13 +17,14 @@ router.get('/request',handler(async (req,res) => { otherNeeds, disasterLocationLatLan, read, - requestProvince} = req.body; + image} = req.body; const currentDateTime = new Date(); const requestDate = currentDateTime.toDateString(); const requestTime = currentDateTime.toTimeString(); const newID = await generateRequestID(disasterType); + const requestProvince = await getRequestProvince(disasterLocationLatLan); const newRequest = { requestID: newID, @@ -36,7 +38,8 @@ router.get('/request',handler(async (req,res) => { requestTime, requestDate, read, - requestProvince + image, + requestProvince: requestProvince }; const result = await DisasterRequestModel.create(newRequest); @@ -88,9 +91,9 @@ router.put('/updateRequest/:requestID', handler(async (req, res) => { { read: true }, { new: true } // Return the updated document ); - return res.status(INTERNAL_SERVER_ERROR).send(request); + res.status(200).send(request); + } catch (error) { - console.error(error); return res.status(INTERNAL_SERVER_ERROR).send("Internal server error"); } })); @@ -132,7 +135,6 @@ router.post('/showUnverify', handler(async (req, res) =>{ //not finished const sendingResponds = async(requests) =>{ - try{ const sendTo = "engerrev897@gmail.com"; const sendFrom = process.env.Email_USER; @@ -161,26 +163,36 @@ const generateRequestID = async(disasterType) => { const disasterCode = disasterType.substring(0, 2); const min = 0; - const max = 100; - const requestNumber = Math.floor(Math.random() * (max - min + 1)) + min; + const max = 1000; + let requestNumber = Math.floor(Math.random() * (max - min + 1)) + min; - const newID = disasterCode + requestNumber.toString(); - console.log("ID",newID); + let newID = disasterCode + requestNumber.toString(); + + try{ + while(await DisasterRequestModel.findOne({requestID: newID})){ + requestNumber++; + newID = disasterCode + requestNumber.toString(); + } + console.log("ID",newID); + return newID; + }catch(error){ + console.log("ID generate error"); + } return newID; }; -const getRequestProvince = async (lat, lng) => { +const getRequestProvince = async (locationLat) => { try{ - const url = `https://maps.googleapis.com/maps/api/geocode/json?latlng=${lat},${lng}&key=${process.env.GOOGLEMAP_API}`; + const url = `https://maps.googleapis.com/maps/api/geocode/json?latlng=${locationLat[0]},${locationLat[1]}&key=${process.env.GOOGLEMAP_API}`; - const response = await axios.get(url); - const results = response.data.results; + const response = await fetch(url); + const data = await response.json(); - if (results.length > 0) { + if (data.results.length > 0) { // Loop through the address components to find the province - for (const component of results[0].address_components) { + for (const component of data.results[0].address_components) { if (component.types.includes("administrative_area_level_1")) { return component.long_name; // Return the province name } @@ -191,4 +203,5 @@ const getRequestProvince = async (lat, lng) => { } } -export default router \ No newline at end of file +export default router + diff --git a/Backend/src/server.js b/Backend/src/server.js index e6f37ae..e688741 100644 --- a/Backend/src/server.js +++ b/Backend/src/server.js @@ -20,7 +20,6 @@ dbconnect(); const app = express(); - app.use(express.json()); app.use(cors({ diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e20dff7..6cb9744 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -22,12 +22,14 @@ "chart.js": "^4.4.2", "date-fns": "^3.4.0", "dotenv": "^16.4.5", + "firebase": "^10.12.2", "flowbite-react": "^0.7.2", "google-map-react": "^2.2.1", "leven": "^4.0.0", "pluralize": "^8.0.0", "react": "^18.2.0", "react-chartjs-2": "^5.2.0", + "react-circular-progressbar": "^2.1.0", "react-cool-onclickoutside": "^1.7.0", "react-dom": "^18.2.0", "react-dropzone": "^14.2.3", @@ -1744,6 +1746,518 @@ "resolved": "https://registry.npmjs.org/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz", "integrity": "sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==" }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@firebase/analytics": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.4.tgz", + "integrity": "sha512-OJEl/8Oye/k+vJ1zV/1L6eGpc1XzAj+WG2TPznJ7PszL7sOFLBXkL9IjHfOCGDGpXeO3btozy/cYUqv4zgNeHg==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/installations": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/analytics-compat": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.10.tgz", + "integrity": "sha512-ia68RcLQLLMFWrM10JfmFod7eJGwqr4/uyrtzHpTDnxGX/6gNCBTOuxdAbyWIqXI5XmcMQdz9hDijGKOHgDfPw==", + "dependencies": { + "@firebase/analytics": "0.10.4", + "@firebase/analytics-types": "0.8.2", + "@firebase/component": "0.6.7", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/analytics-types": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.2.tgz", + "integrity": "sha512-EnzNNLh+9/sJsimsA/FGqzakmrAUKLeJvjRHlg8df1f97NLUlFidk9600y0ZgWOp3CAxn6Hjtk+08tixlUOWyw==" + }, + "node_modules/@firebase/app": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.10.5.tgz", + "integrity": "sha512-iY/fNot+hWPk9sTX8aHMqlcX9ynRvpGkskWAdUZ2eQQdLo8d1hSFYcYNwPv0Q/frGMasw8udKWMcFOEpC9fG8g==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "idb": "7.1.1", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-check": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.4.tgz", + "integrity": "sha512-2tjRDaxcM5G7BEpytiDcIl+NovV99q8yEqRMKDbn4J4i/XjjuThuB4S+4PkmTnZiCbdLXQiBhkVxNlUDcfog5Q==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/app-check-compat": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.11.tgz", + "integrity": "sha512-t01zaH3RJpKEey0nGduz3Is+uSz7Sj4U5nwOV6lWb+86s5xtxpIvBJzu/lKxJfYyfZ29eJwpdjEgT1/lm4iQyA==", + "dependencies": { + "@firebase/app-check": "0.8.4", + "@firebase/app-check-types": "0.5.2", + "@firebase/component": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/app-check-interop-types": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.2.tgz", + "integrity": "sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ==" + }, + "node_modules/@firebase/app-check-types": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.2.tgz", + "integrity": "sha512-FSOEzTzL5bLUbD2co3Zut46iyPWML6xc4x+78TeaXMSuJap5QObfb+rVvZJtla3asN4RwU7elaQaduP+HFizDA==" + }, + "node_modules/@firebase/app-compat": { + "version": "0.2.35", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.35.tgz", + "integrity": "sha512-vgay/WRjeH0r97/Q6L6df2CMx7oyNFDsE5yPQ9oR1G+zx2eT0s8vNNh0WlKqQxUEWaOLRnXhQ8gy7uu0cBgTRg==", + "dependencies": { + "@firebase/app": "0.10.5", + "@firebase/component": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-types": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.2.tgz", + "integrity": "sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==" + }, + "node_modules/@firebase/auth": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.7.4.tgz", + "integrity": "sha512-d2Fw17s5QesojwebrA903el20Li9/YGgkoOGJjagM4I1qAT36APa/FcZ+OX86KxbYKCtQKTMqraU8pxG7C2JWA==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0", + "undici": "5.28.4" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@react-native-async-storage/async-storage": "^1.18.1" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, + "node_modules/@firebase/auth-compat": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.9.tgz", + "integrity": "sha512-RX8Zh/3zz2CsVbmYfgHkfUm4fAEPCl+KHVIImNygV5jTGDF6oKOhBIpf4Yigclyu8ESQKZ4elyN0MBYm9/7zGw==", + "dependencies": { + "@firebase/auth": "1.7.4", + "@firebase/auth-types": "0.12.2", + "@firebase/component": "0.6.7", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0", + "undici": "5.28.4" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/auth-interop-types": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.3.tgz", + "integrity": "sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ==" + }, + "node_modules/@firebase/auth-types": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.2.tgz", + "integrity": "sha512-qsEBaRMoGvHO10unlDJhaKSuPn4pyoTtlQuP1ghZfzB6rNQPuhp/N/DcFZxm9i4v0SogjCbf9reWupwIvfmH6w==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/component": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.7.tgz", + "integrity": "sha512-baH1AA5zxfaz4O8w0vDwETByrKTQqB5CDjRls79Sa4eAGAoERw4Tnung7XbMl3jbJ4B/dmmtsMrdki0KikwDYA==", + "dependencies": { + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.5.tgz", + "integrity": "sha512-cAfwBqMQuW6HbhwI3Cb/gDqZg7aR0OmaJ85WUxlnoYW2Tm4eR0hFl5FEijI3/gYPUiUcUPQvTkGV222VkT7KPw==", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.2", + "@firebase/auth-interop-types": "0.2.3", + "@firebase/component": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-compat": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.5.tgz", + "integrity": "sha512-NDSMaDjQ+TZEMDMmzJwlTL05kh1+0Y84C+kVMaOmNOzRGRM7VHi29I6YUhCetXH+/b1Wh4ZZRyp1CuWkd8s6hg==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/database": "1.0.5", + "@firebase/database-types": "1.0.3", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.3.tgz", + "integrity": "sha512-39V/Riv2R3O/aUjYKh0xypj7NTNXNAK1bcgY5Kx+hdQPRS/aPTS8/5c0CGFYKgVuFbYlnlnhrCTYsh2uNhGwzA==", + "dependencies": { + "@firebase/app-types": "0.9.2", + "@firebase/util": "1.9.6" + } + }, + "node_modules/@firebase/firestore": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.6.3.tgz", + "integrity": "sha512-d/+N2iUsiJ/Dc7fApdpdmmTXzwuTCromsdA1lKwYfZtMIOd1fI881NSLwK2wV4I38wkLnvfKJUV6WpU1f3/ONg==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "@firebase/webchannel-wrapper": "1.0.0", + "@grpc/grpc-js": "~1.9.0", + "@grpc/proto-loader": "^0.7.8", + "tslib": "^2.1.0", + "undici": "5.28.4" + }, + "engines": { + "node": ">=10.10.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/firestore-compat": { + "version": "0.3.32", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.32.tgz", + "integrity": "sha512-at71mwK7a/mUXH0OgyY0+gUzedm/EUydDFYSFsBoO8DYowZ23Mgd6P4Rzq/Ll3zI/3xJN7LGe7Qp4iE/V/3Arg==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/firestore": "4.6.3", + "@firebase/firestore-types": "3.0.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/firestore-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.2.tgz", + "integrity": "sha512-wp1A+t5rI2Qc/2q7r2ZpjUXkRVPtGMd6zCLsiWurjsQpqPgFin3AhNibKcIzoF2rnToNa/XYtyWXuifjOOwDgg==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/functions": { + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.5.tgz", + "integrity": "sha512-qrHJ+l62mZiU5UZiVi84t/iLXZlhRuSvBQsa2qvNLgPsEWR7wdpWhRmVdB7AU8ndkSHJjGlMICqrVnz47sgU7Q==", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.2", + "@firebase/auth-interop-types": "0.2.3", + "@firebase/component": "0.6.7", + "@firebase/messaging-interop-types": "0.2.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0", + "undici": "5.28.4" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/functions-compat": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.11.tgz", + "integrity": "sha512-Qn+ts/M6Lj2/6i1cp5V5TRR+Hi9kyXyHbo+w9GguINJ87zxrCe6ulx3TI5AGQkoQa8YFHUhT3DMGmLFiJjWTSQ==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/functions": "0.11.5", + "@firebase/functions-types": "0.6.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/functions-types": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.2.tgz", + "integrity": "sha512-0KiJ9lZ28nS2iJJvimpY4nNccV21rkQyor5Iheu/nq8aKXJqtJdeSlZDspjPSBBiHRzo7/GMUttegnsEITqR+w==" + }, + "node_modules/@firebase/installations": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.7.tgz", + "integrity": "sha512-i6iGoXRu5mX4rTsiMSSKrgh9pSEzD4hwBEzRh5kEhOTr8xN/wvQcCPZDSMVYKwM2XyCPBLVq0JzjyerwL0Rihg==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/util": "1.9.6", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/installations-compat": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.7.tgz", + "integrity": "sha512-RPcbD+3nqHbnhVjIOpWK2H5qzZ8pAAAScceiWph0VNTqpKyPQ5tDcp4V5fS0ELpfgsHYvroMLDKfeHxpfvm8cw==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/installations": "0.6.7", + "@firebase/installations-types": "0.5.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/installations-types": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.2.tgz", + "integrity": "sha512-que84TqGRZJpJKHBlF2pkvc1YcXrtEDOVGiDjovP/a3s6W4nlbohGXEsBJo0JCeeg/UG9A+DEZVDUV9GpklUzA==", + "peerDependencies": { + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/logger": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz", + "integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/messaging": { + "version": "0.12.9", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.9.tgz", + "integrity": "sha512-IH+JJmzbFGZXV3+TDyKdqqKPVfKRqBBg2BfYYOy7cm7J+SwV+uJMe8EnDKYeQLEQhtpwciPfJ3qQXJs2lbxDTw==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/installations": "0.6.7", + "@firebase/messaging-interop-types": "0.2.2", + "@firebase/util": "1.9.6", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/messaging-compat": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.9.tgz", + "integrity": "sha512-5jN6wyhwPgBH02zOtmmoOeyfsmoD7ty48D1m0vVPsFg55RqN2Z3Q9gkZ5GmPklFPjTPLcxB1ObcHOZvThTkm7g==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/messaging": "0.12.9", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/messaging-interop-types": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.2.tgz", + "integrity": "sha512-l68HXbuD2PPzDUOFb3aG+nZj5KA3INcPwlocwLZOzPp9rFM9yeuI9YLl6DQfguTX5eAGxO0doTR+rDLDvQb5tA==" + }, + "node_modules/@firebase/performance": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.7.tgz", + "integrity": "sha512-d+Q4ltjdJZqjzcdms5i0UC9KLYX7vKGcygZ+7zHA/Xk+bAbMD2CPU0nWTnlNFWifZWIcXZ/2mAMvaGMW3lypUA==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/installations": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/performance-compat": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.7.tgz", + "integrity": "sha512-cb8ge/5iTstxfIGW+iiY+7l3FtN8gobNh9JSQNZgLC9xmcfBYWEs8IeEWMI6S8T+At0oHc3lv+b2kpRMUWr8zQ==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/performance": "0.6.7", + "@firebase/performance-types": "0.2.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/performance-types": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.2.tgz", + "integrity": "sha512-gVq0/lAClVH5STrIdKnHnCo2UcPLjJlDUoEB/tB4KM+hAeHUxWKnpT0nemUPvxZ5nbdY/pybeyMe8Cs29gEcHA==" + }, + "node_modules/@firebase/remote-config": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.7.tgz", + "integrity": "sha512-5oPNrPFLsbsjpq0lUEIXoDF2eJK7vAbyXe/DEuZQxnwJlfR7aQbtUlEkRgQWcicXpyDmAmDLo7q7lDbCYa6CpA==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/installations": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/remote-config-compat": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.7.tgz", + "integrity": "sha512-Fq0oneQ4SluLnfr5/HfzRS1TZf1ANj1rWbCCW3+oC98An3nE+sCdp+FSuHsEVNwgMg4Tkwx9Oom2lkKeU+Vn+w==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/remote-config": "0.4.7", + "@firebase/remote-config-types": "0.3.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/remote-config-types": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.2.tgz", + "integrity": "sha512-0BC4+Ud7y2aPTyhXJTMTFfrGGLqdYXrUB9sJVAB8NiqJswDTc4/2qrE/yfUbnQJhbSi6ZaTTBKyG3n1nplssaA==" + }, + "node_modules/@firebase/storage": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.12.5.tgz", + "integrity": "sha512-nGWBOGFNr10j0LA4NJ3/Yh3us/lb0Q1xSIKZ38N6FcS+vY54nqJ7k3zE3PENregHC8+8txRow++A568G3v8hOA==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0", + "undici": "5.28.4" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/storage-compat": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.8.tgz", + "integrity": "sha512-qDfY9kMb6Ch2hZb40sBjDQ8YPxbjGOxuT+gU1Z0iIVSSpSX0f4YpGJCypUXiA0T11n6InCXB+T/Dknh2yxVTkg==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/storage": "0.12.5", + "@firebase/storage-types": "0.8.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/storage-types": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.2.tgz", + "integrity": "sha512-0vWu99rdey0g53lA7IShoA2Lol1jfnPovzLDUBuon65K7uKG9G+L5uO05brD9pMw+l4HRFw23ah3GwTGpEav6g==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/util": { + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.6.tgz", + "integrity": "sha512-IBr1MZbp4d5MjBCXL3TW1dK/PDXX4yOGbiwRNh1oAbE/+ci5Uuvy9KIrsFYY80as1I0iOaD5oOMA9Q8j4TJWcw==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/vertexai-preview": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@firebase/vertexai-preview/-/vertexai-preview-0.0.2.tgz", + "integrity": "sha512-NOOL63kFQRq45ioi5P+hlqj/4LNmvn1URhGjQdvyV54c1Irvoq26aW861PRRLjrSMIeNeiLtCLD5pe+ediepAg==", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.2", + "@firebase/component": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/webchannel-wrapper": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.0.tgz", + "integrity": "sha512-zuWxyfXNbsKbm96HhXzainONPFqRcoZblQ++e9cAIGUuHfl2cFSBzW01jtesqWG/lqaUyX3H8O1y9oWboGNQBA==" + }, "node_modules/@floating-ui/core": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", @@ -6013,6 +6527,17 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/fetch-blob": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", @@ -6090,6 +6615,40 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/firebase": { + "version": "10.12.2", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.12.2.tgz", + "integrity": "sha512-ZxEdtSvP1I9su1yf32D8TIdgxtPgxwr6z3jYAR1TXS/t+fVfpoPc/N1/N2bxOco9mNjUoc+od34v5Fn4GeKs6Q==", + "dependencies": { + "@firebase/analytics": "0.10.4", + "@firebase/analytics-compat": "0.2.10", + "@firebase/app": "0.10.5", + "@firebase/app-check": "0.8.4", + "@firebase/app-check-compat": "0.3.11", + "@firebase/app-compat": "0.2.35", + "@firebase/app-types": "0.9.2", + "@firebase/auth": "1.7.4", + "@firebase/auth-compat": "0.5.9", + "@firebase/database": "1.0.5", + "@firebase/database-compat": "1.0.5", + "@firebase/firestore": "4.6.3", + "@firebase/firestore-compat": "0.3.32", + "@firebase/functions": "0.11.5", + "@firebase/functions-compat": "0.3.11", + "@firebase/installations": "0.6.7", + "@firebase/installations-compat": "0.2.7", + "@firebase/messaging": "0.12.9", + "@firebase/messaging-compat": "0.2.9", + "@firebase/performance": "0.6.7", + "@firebase/performance-compat": "0.2.7", + "@firebase/remote-config": "0.4.7", + "@firebase/remote-config-compat": "0.2.7", + "@firebase/storage": "0.12.5", + "@firebase/storage-compat": "0.3.8", + "@firebase/util": "1.9.6", + "@firebase/vertexai-preview": "0.0.2" + } + }, "node_modules/flat-cache": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", @@ -7445,6 +8004,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -11727,6 +12296,14 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-circular-progressbar": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/react-circular-progressbar/-/react-circular-progressbar-2.1.0.tgz", + "integrity": "sha512-xp4THTrod4aLpGy68FX/k1Q3nzrfHUjUe5v6FsdwXBl3YVMwgeXYQKDrku7n/D6qsJA9CuunarAboC2xCiKs1g==", + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-cool-onclickoutside": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/react-cool-onclickoutside/-/react-cool-onclickoutside-1.7.0.tgz", @@ -13935,6 +14512,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -14385,6 +14973,27 @@ "node": ">= 8" } }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index f409b5f..e2b6694 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -24,12 +24,14 @@ "chart.js": "^4.4.2", "date-fns": "^3.4.0", "dotenv": "^16.4.5", + "firebase": "^10.12.2", "flowbite-react": "^0.7.2", "google-map-react": "^2.2.1", "leven": "^4.0.0", "pluralize": "^8.0.0", "react": "^18.2.0", "react-chartjs-2": "^5.2.0", + "react-circular-progressbar": "^2.1.0", "react-cool-onclickoutside": "^1.7.0", "react-dom": "^18.2.0", "react-dropzone": "^14.2.3", diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 523fc95..6b9f6ea 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -13,6 +13,7 @@ import { EditReport } from './components/Controller/DisasterStatus/DisasterEditR import ContactInfoAdder from './pages/controller/ContactInfoAdder'; import { ShelterLocationPage } from './pages/controller/ShelterLocations'; import { VolunteeringPage } from './pages/controller/VolunteeringPage'; +import { DisasterInformationAdder } from './pages/controller/DisasterInformationAdder'; import { DisasterMap } from './pages/controller/DisasterMap'; import SearchResults from './components/Controller/SearchResult'; import PrivateRoute from './authanticate/PrivateRoutes'; diff --git a/frontend/src/Forms/Controller/NewsCreatorForm.jsx b/frontend/src/Forms/Controller/NewsCreatorForm.jsx index f3c2f56..dfeb3d5 100644 --- a/frontend/src/Forms/Controller/NewsCreatorForm.jsx +++ b/frontend/src/Forms/Controller/NewsCreatorForm.jsx @@ -3,6 +3,24 @@ import React, { useEffect, useState } from "react"; import axios from "axios"; import {message} from "antd"; import PropTypes from 'prop-types'; +import { CircularProgressbar } from "react-circular-progressbar"; +import { + Label, + TextInput, + Select, + Checkbox, + FileInput, + Textarea, + Alert, + Button, +} from "flowbite-react"; +import { + getDownloadURL, + getStorage, + ref, + uploadBytesResumable, +} from "firebase/storage"; +import app from "../../firebase"; const NewsCreatorForm = ({selection}) => { @@ -14,18 +32,26 @@ const NewsCreatorForm = ({selection}) => { newsBody:'', show: '' }); + const [imageFile, setImageFiles] = useState(null); + // const [imageFileUrl, setImageFileUrl] = useState(null); + const [imageUploadProgress, setImageUploadProgress] = useState(null); + const [imageUploadError, setImageUploadError] = useState(null); + const buttonStyle = { + background: 'linear-gradient(to right, #124E70, #5CDB95)', + } useEffect(() =>{ if (selection){ setFormData({ newsId: selection.newsId || '', heading: selection.heading || '', author: selection.author || '', - image: selection.author || null, + image: selection.image || '', newsBody: selection.newsBody || '', show: selection.show || '' }); } - console.log("selectionData:",selection) + console.log("selection Author:", formData.author) + console.log("selection Image:", formData.image) },[selection]); const handleChange = (e) => { @@ -45,25 +71,14 @@ const NewsCreatorForm = ({selection}) => { const handleSubmit = async(e) => { e.preventDefault(); - if (!formData.heading || !formData.author || !formData.newsBody || !formData.newsBody) { + if (!formData.heading || !formData.author || !formData.newsBody ) { message.error('Missing required fields'); return; } else{ - const formDataObj = new FormData(); - formDataObj.append('heading', formData.heading); - formDataObj.append('author', formData.author); - formDataObj.append('newsBody', formData.newsBody); - if (formData.image) { - formDataObj.append('image', formData.image); - } try{ - const response = await axios.post('http://localhost:5000/api/news/createNews', formDataObj, { - headers: { - 'Content-Type': 'multipart/form-data' - } - }); + const response = await axios.post('http://localhost:5000/api/news/createNews', {...formData}); console.log('Form submitted succedded: ', response.data); message.success('News is created!') setFormData({ @@ -90,16 +105,15 @@ const NewsCreatorForm = ({selection}) => { } else{ try{ - const formDataObj = new FormData(); - formDataObj.append('newsId', formData.newsId); - formDataObj.append('heading', formData.heading); - formDataObj.append('author', formData.author); - formDataObj.append('newsBody', formData.newsBody); - if (formData.image) { - formDataObj.append('image', formData.image); - } + const currentImageURL = selection.image; + const imageURL = formData.image? formData.image : currentImageURL; - const response = await axios.patch('http://localhost:5000/api/news/updateNews/' + formData.newsId, formDataObj); + const response = await axios.patch('http://localhost:5000/api/news/updateNews/' + formData.newsId, { + heading:formData.heading, + newsBody:formData.newsBody, + author:formData.author, + image: imageURL, + }); console.log('Form update succeeded: ', response.data); setFormData({ ...formData, @@ -117,6 +131,43 @@ const NewsCreatorForm = ({selection}) => { } } + const uploadImage = async () => { + try { + if (!imageFile) { + setImageUploadError("Please select an image file"); + return; + } + setImageUploadError(null); + const storage = getStorage(app); + const fileName = new Date().getTime() + imageFile.name; + const storageRef = ref(storage, fileName); + const uploadTask = uploadBytesResumable(storageRef, imageFile); + uploadTask.on( + "state_changed", + (snapshot) => { + const progress = + (snapshot.bytesTransferred / snapshot.totalBytes) * 100; + setImageUploadProgress(progress.toFixed(0)); + }, + (error) => { + setImageUploadError( + "Could not upload the image file must be less than 10MB" + ); + }, + () => { + getDownloadURL(uploadTask.snapshot.ref).then((downloadURL) => { + setImageUploadProgress(null); + setImageUploadError(null); + setFormData({...formData, image: downloadURL}); + }); + } + ); + } catch (err) { + setImageUploadError("An error occurred while uploading the image"); + setImageUploadProgress(null); + } + }; + return (
- Click to view -
-- Watch uploaded images or videos -
+ {clickButton?( + (image && image.length > 0 && ( ++ Watch uploaded images or videos +
++ +
+{selectedNews.author}
+{selectedNews.createdTime.split(' ')[0]}
+{selectedNews.createdDate}
++ Select a news item to view details. +
+ ) + } +{news.author}
+{news.createdDate}
+Display :{(news.show).toString()}
+
+ {/*
*/}
+
+
*/}
+