Commit ce5ef1d7 authored by it19048642@my.sllit.lk's avatar it19048642@my.sllit.lk

Merge branch 'master' into IT19048642

parents a5d7afb4 2ed19674
API_KEY_SECRET = 'AIzaSyDzvpMhG1TmXhpoCfPCq-G4snf-R0vSWF4'
JWT_SECRET = cb6969137082baf1baeeed271a270ae29dde0c6f5775e9508e808965405c99b5
BASE_URL = http://localhost:3000/
HOST=smtp.gmail.com
SERVICE= gmail
EMAIL_PORT= 587
SECURE= true
USER = expectralk@gmail.com
PASS = ysmkwpcqfpogzunt
......@@ -3,11 +3,12 @@ const express = require("express");
const cors = require('cors');
const bodyParser = require("body-parser");
// const fileUpload = require('express-fileupload')
// const connectDB = require("./src/config/database");
const connectDB = require("./src/config/database");
const HotelAPI = require("./src/api/hotel.api");
const RestaurantAPI = require("./src/api/restaurant.api");
const Pharmacy = require("./src/api/pharmacy.api");
const GroceryAPI = require("./src/api/grocery.api")
const UserAPI = require("./src/api/user.api")
const port = process.env.PORT || 5000;
......@@ -19,7 +20,7 @@ app.use(express.json());
// app.use(fileUpload({
// useTempFiles: true
// }))
// connectDB();
connectDB();
app.get("/", (req, res) => {
res.send("Hello Node!");
......@@ -29,6 +30,7 @@ app.use("/hotel", HotelAPI());
app.use("/restaurant", RestaurantAPI());
app.use("/pharmacy",Pharmacy());
app.use("/grocery", GroceryAPI());
app.use("/user", UserAPI());
app.listen(port, () => {
......
This diff is collapsed.
......@@ -12,6 +12,7 @@
"license": "ISC",
"dependencies": {
"axios": "^0.27.2",
"bcryptjs": "^2.4.3",
"body-parser": "^1.20.0",
"cors": "^2.8.5",
"csv-parser": "^3.0.0",
......@@ -19,7 +20,9 @@
"express": "^4.18.1",
"express-fileupload": "^1.3.1",
"fs": "0.0.1-security",
"mongoose": "^6.3.2",
"jsonwebtoken": "^8.5.1",
"mongoose": "^5.13.9",
"nodemailer": "^6.8.0",
"nodemon": "^2.0.16"
}
}
const express = require('express');
const router = express.Router();
const UserController = require('../controller/user.controller');
module.exports = function () {
router.get('/', UserController.getAllUser);
router.post('/create', UserController.createUser);
router.post('/validate', UserController.validateUser);
router.post('/:id/verify/:token', UserController.verifyUser);
router.get('/verify-email', UserController.verifyEmail);
router.post('/getUser', UserController.getUserByEmail);
router.post('/createGoogleUser', UserController.createGoogleUser);
return router;
}
const mongoose = require("mongoose");
const URI = "mongodb+srv://admin:admin123@cluster0.qh5xs.mongodb.net/bussifinderDB?retryWrites=true&w=majority";
const connectDB = async () => {
await mongoose.connect(URI, { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false });
console.log("Database Connected");
}
module.exports = connectDB;
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
const mongoose = require("mongoose");
const TokenSchema = new mongoose.Schema({
userId: { type: mongoose.SchemaTypes.ObjectId, required: true, ref: "user", unique: true },
token: { type: String, required: true },
createdAt: { type: Date, default: Date.now(), expires: 3600 },
});
const Token = mongoose.model('token', TokenSchema);
module.exports = Token;
\ No newline at end of file
const mongoose = require("mongoose");
const UserSchema = new mongoose.Schema({
fullName: { type: String, required: true },
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
role: { type: String, required: true },
isVerified: { type: Boolean, required: false },
emailToken: { type: String, required: false }
});
const User = mongoose.model('user', UserSchema);
module.exports = User;
\ No newline at end of file
const nodemailer = require('nodemailer');
const sendVerificationMail = async (email, subject, text) => {
try {
const transporter = nodemailer.createTransport({
host: process.env.HOST,
service: process.env.SERVICE,
port: Number(process.env.EMAIL_PORT),
secure: Boolean(process.env.SECURE),
auth: {
user: 'ruvinadechithra@gmail.com',
pass: 'ruvina123'
}
})
await transporter.sendMail({
from: process.env.USER,
to: email,
subject: subject,
text: text
})
console.log("Email sent successfully")
} catch (error) {
console.log("Email sent error: " , error)
}
}
module.exports = {
sendVerificationMail
}
\ No newline at end of file
GOOGLE_CLIENT_ID=380810221970-6p2h323ibdoknuaddgrb432skkdm157o.apps.googleusercontent.com
\ No newline at end of file
GOOGLE_CLIENT_ID='380810221970-6p2h323ibdoknuaddgrb432skkdm157o.apps.googleusercontent.com'
\ No newline at end of file
......@@ -2992,6 +2992,12 @@
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
"integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
},
"@types/raf": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.0.tgz",
"integrity": "sha512-taW5/WYqo36N7V39oYyHP9Ipfd5pNFvGTIQsNGj86xV88YQ7GnI30/yMfKDF7Zgin0m3e+ikX88FvImnK4RjGw==",
"optional": true
},
"@types/range-parser": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
......@@ -3969,6 +3975,12 @@
}
}
},
"base64-arraybuffer": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
"integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==",
"optional": true
},
"batch": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
......@@ -4154,6 +4166,11 @@
"node-int64": "^0.4.0"
}
},
"btoa": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz",
"integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g=="
},
"buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
......@@ -4223,6 +4240,22 @@
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001335.tgz",
"integrity": "sha512-ddP1Tgm7z2iIxu6QTtbZUv6HJxSaV/PZeSrWFZtbY4JZ69tOeNhBCl3HyRQgeNZKE5AOn1kpV7fhljigy0Ty3w=="
},
"canvg": {
"version": "3.0.10",
"resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.10.tgz",
"integrity": "sha512-qwR2FRNO9NlzTeKIPIKpnTY6fqwuYSequ8Ru8c0YkYU7U0oW+hLUvWadLvAu1Rl72OMNiFhoLu4f8eUjQ7l/+Q==",
"optional": true,
"requires": {
"@babel/runtime": "^7.12.5",
"@types/raf": "^3.4.0",
"core-js": "^3.8.3",
"raf": "^3.4.1",
"regenerator-runtime": "^0.13.7",
"rgbcolor": "^1.0.1",
"stackblur-canvas": "^2.0.0",
"svg-pathdata": "^6.0.3"
}
},
"case-sensitive-paths-webpack-plugin": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz",
......@@ -4638,6 +4671,15 @@
"postcss-selector-parser": "^6.0.9"
}
},
"css-line-break": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz",
"integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==",
"optional": true,
"requires": {
"utrie": "^1.0.2"
}
},
"css-loader": {
"version": "6.7.1",
"resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz",
......@@ -5412,6 +5454,12 @@
"domelementtype": "^2.2.0"
}
},
"dompurify": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.0.tgz",
"integrity": "sha512-Be9tbQMZds4a3C6xTmz68NlMfeONA//4dOavl/1rNw50E+/QO0KVpbcU0PcaW0nsQxurXls9ZocqFxk8R2mWEA==",
"optional": true
},
"domutils": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
......@@ -6352,6 +6400,11 @@
"pend": "~1.2.0"
}
},
"fflate": {
"version": "0.4.8",
"resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz",
"integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA=="
},
"file-entry-cache": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
......@@ -7085,6 +7138,16 @@
"tapable": "^2.0.0"
}
},
"html2canvas": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz",
"integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==",
"optional": true,
"requires": {
"css-line-break": "^2.1.0",
"text-segmentation": "^1.0.3"
}
},
"htmlparser2": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
......@@ -9142,6 +9205,21 @@
"resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.0.tgz",
"integrity": "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg=="
},
"jspdf": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.5.1.tgz",
"integrity": "sha512-hXObxz7ZqoyhxET78+XR34Xu2qFGrJJ2I2bE5w4SM8eFaFEkW2xcGRVUss360fYelwRSid/jT078kbNvmoW0QA==",
"requires": {
"@babel/runtime": "^7.14.0",
"atob": "^2.1.2",
"btoa": "^1.2.1",
"canvg": "^3.0.6",
"core-js": "^3.6.0",
"dompurify": "^2.2.0",
"fflate": "^0.4.8",
"html2canvas": "^1.0.0-rc.5"
}
},
"jsprim": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
......@@ -9247,6 +9325,11 @@
"object.assign": "^4.1.2"
}
},
"jwt-decode": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz",
"integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A=="
},
"kdbush": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz",
......@@ -11639,6 +11722,12 @@
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
},
"rgbcolor": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz",
"integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==",
"optional": true
},
"rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
......@@ -12113,6 +12202,12 @@
}
}
},
"stackblur-canvas": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.5.0.tgz",
"integrity": "sha512-EeNzTVfj+1In7aSLPKDD03F/ly4RxEuF/EX0YcOG0cKoPXs+SLZxDawQbexQDBzwROs4VKLWTOaZQlZkGBFEIQ==",
"optional": true
},
"stackframe": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.1.tgz",
......@@ -12322,6 +12417,12 @@
"resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
"integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ=="
},
"svg-pathdata": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz",
"integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==",
"optional": true
},
"svgo": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
......@@ -12553,6 +12654,15 @@
"minimatch": "^3.0.4"
}
},
"text-segmentation": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz",
"integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==",
"optional": true,
"requires": {
"utrie": "^1.0.2"
}
},
"text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
......@@ -13217,6 +13327,15 @@
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
},
"utrie": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz",
"integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==",
"optional": true,
"requires": {
"base64-arraybuffer": "^1.0.2"
}
},
"uuid": {
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
......
......@@ -22,6 +22,8 @@
"chart.js": "^3.9.1",
"export-to-csv-file": "^0.2.2",
"gapi-script": "^1.2.0",
"jspdf": "^2.5.1",
"jwt-decode": "^3.1.2",
"mdb-react-ui-kit": "^4.2.0",
"react": "^18.1.0",
"react-animated-3d-card": "^1.0.2",
......
......@@ -10,11 +10,12 @@ import CreateHotelDataset from './CreateHotelDataset';
import ResponsiveAppBar from './components/ResponsiveAppBar';
import NavBar from './components/NavBar';
import Map from './components/Map';
import AA from './components/AA';
import Loader from './components/Loader'
import Footer from './components/Footer';
import themeReducer from "./features/theme";
import businessReducer from "./features/business";
import headerReducer from "./features/header";
import userReducer from "./features/user";
import InputHotelDetails from './components/InputHotelDetails';
import Results from './components/Results';
import Pricing from './components/Pricing';
......@@ -22,14 +23,18 @@ import SignUp from './components/Auth/SignUp';
import SignIn from './components/Auth/SignIn';
import BusinessTypePage from './components/BusinessTypePage';
import InputGroceryDetails from './components/InputGroceryDetails';
import MultipleResult from './components/MultipleResult';
import ResultsWOTypes from './components/ResultsWOTypes';
const store = configureStore({
reducer: {
theme: themeReducer,
business: businessReducer,
header: headerReducer
header: headerReducer,
user: userReducer
},
});
function App() {
return (
......@@ -38,7 +43,8 @@ function App() {
<ResponsiveAppBar />
<Routes>
<Route >
<Route index element={<Home />} />
<Route index element={<Home/>} />
<Route path="/Home" element={<Home/>} />
<Route path="/createRes" element={<CreateRestaurantDataset />} />
<Route path="/createHotel" element={<CreateHotelDataset />} />
<Route path="/result" element={<Results />} />
......@@ -48,6 +54,9 @@ function App() {
<Route path="/signIn" element={<SignIn />} />
<Route path="/Service" element={<BusinessTypePage/>} />
<Route path="/inputGrocery" element={<InputGroceryDetails />} />
<Route path="/multipleResult" element={<MultipleResult/>} />
<Route path="/resultWOTypes" element={<ResultsWOTypes/>} />
<Route path="/Service" element={<BusinessTypePage />} />
</Route>
</Routes>
<Footer />
......
import logo from './logo.svg';
import './App.css';
import { useState } from 'react';
import { useState,useEffect } from 'react';
import axios from 'axios';
import { GoogleMap, LoadScript } from '@react-google-maps/api';
import API from './api';
......@@ -18,6 +18,7 @@ import HomePageHeader from './components/HomePageHeader';
import { useSelector } from "react-redux";
import Particles from './components/Particle';
import ContactUs from './components/ContactUs';
import Loader from './components/Loader';
//import API from '../../Backend/src/api';
const containerStyle = {
......@@ -232,76 +233,25 @@ function Home() {
return r1;
};
useEffect(() => {
setTimeout(() => {
setIsLoading(false);
}, 1000);
}, []);
return (
<div style={{
background : themeColor.status == 'light' ? '#F7F7F9':'#1c1c1c',
width: '100%',
height: '100%',
}}>
{isLoading && <Loader/> }
<HomePageHeader/>
{/* <div>
<Backdrop
sx={{ color: '#fff', zIndex: (theme) => theme.zIndex.drawer + 1 }}
open={open}
onClick={handleClose}
>
<CircularProgress color="inherit" />
</Backdrop>
</div>
<div style={{
backgroundImage: `url(${Background})`,
backgroundPosition: 'center',
backgroundSize: 'cover',
backgroundRepeat: 'no-repeat',
width: '100vw',
height: '100vh'
}}
className="App">
<div>
<div>
<Map/>
</div>
<form style={{ marginTop: '30px', marginBottom: '30px' }} onSubmit={(e) => onSubmit(e)}>
<Grid container spacing={2} columns={16}>
<Grid item xs={4}>
</Grid>
<Grid item xs={4}>
<div>
<TextField id="outlined-basic" label="Latitude" variant="outlined" color="success" type="text" value={latitude} style={{ backgroundColor: 'rgba(97, 129, 55, 0.59)' }}
InputLabelProps={{
style: { color: '#fff' },
}}
onChange={e => setLatitude(e.target.value)} />
</div>
</Grid>
<Grid item xs={4}>
<div>
<TextField id="outlined-basic" label="Longitude" variant="outlined" color="success" type="text" value={longitude} style={{ backgroundColor: 'rgba(97, 129, 55, 0.59)' }}
InputLabelProps={{
style: { color: '#fff' },
}}
onChange={e => setLongitude(e.target.value)} />
</div>
</Grid>
<Grid item xs={4}>
</Grid>
</Grid>
<div style={{ marginTop: '30px' }} >
<Button style={{ maxWidth: '150px', maxHeight: '50px', minWidth: '150px', minHeight: '50px', fontSize: '20px' }} onClick={(e) => onSubmit(e)} variant="contained" color="success">
Submit
</Button>
</div>
</form>
</div>
</div> */}
<DetailsBox/>
<PropertyType/>
<ContactUs/>
</div>
);
......
import React, { useState, Fragment,useEffect } from "react";
import ReactDOM from "react-dom";
// We will use these things from the lib
// https://react-google-maps-api-docs.netlify.com/
import {
useLoadScript,
GoogleMap,
MarkerF,
InfoWindow
} from "@react-google-maps/api";
function AA() {
const [mapRef, setMapRef] = useState(null);
const [selectedPlace, setSelectedPlace] = useState(null);
const [markerMap, setMarkerMap] = useState({});
const [center, setCenter] = useState({ lat: 5.944219535479003, lng: 80.53908400191395 });
const [position, setPosition] = useState({});
const [zoom, setZoom] = useState(8);
const [clickedLatLng, setClickedLatLng] = useState(null);
const [infoOpen, setInfoOpen] = useState(false);
// const center = {
// lat: 5.944219535479003,
// lng: 80.53908400191395
// };
// Load the Google maps scripts
const { isLoaded } = useLoadScript({
// Enter your own Google Maps API key
googleMapsApiKey: "AIzaSyDzvpMhG1TmXhpoCfPCq-G4snf-R0vSWF4"
});
// The places I want to create markers for.
// This could be a data-driven prop.
// const myPlaces = [
// { id: "place1", pos: { lat: 5.944219535479003, lng: 80.53908400191395} },
// // { id: "place2", pos: { lat: 39.10894664788252, lng: -94.57926449532226 } },
// // { id: "place3", pos: { lat: 39.07602397235644, lng: -94.5184089401211 } }
// ];
// Iterate myPlaces to size, center, and zoom map to contain all markers
// const fitBounds = map => {
// const bounds = new window.google.maps.LatLngBounds();
// myPlaces.map(place => {
// bounds.extend(place.pos);
// return place.id;
// });
// map.fitBounds(bounds);
// };
// const loadHandler = map => {
// // Store a reference to the google map instance in state
// setMapRef(map);
// // Fit map bounds to contain all markers
// fitBounds(map);
// };
// We have to create a mapping of our places to actual Marker objects
const markerLoadHandler = (marker, place) => {
return setMarkerMap(prevState => {
return { ...prevState, [place.id]: marker };
});
};
const markerClickHandler = (event, place) => {
// Remember which place was clicked
// setSelectedPlace(place);
// Required so clicking a 2nd marker works as expected
if (infoOpen) {
setInfoOpen(false);
}
setInfoOpen(true);
// If you want to zoom in a little on marker click
if (zoom < 9) {
setZoom(15);
}
// if you want to center the selected Marker
setCenter(place)
};
// const position = {
// lat: 5.944219535479003,
// lng: 80.53908400191395
// }
const onLoad = marker => {
console.log('marker: ', marker)
}
useEffect(() => {
if(clickedLatLng){
setPosition(clickedLatLng)
console.log(clickedLatLng)
}
} , [clickedLatLng]);
return (
<div>
{isLoaded ?
<div>
<GoogleMap
// Do stuff on map initial laod
// Save the current center position in state
// onCenterChanged={() => setCenter(mapRef.getCenter().toJSON())}
// Save the user's map click position
onClick={e => setClickedLatLng(e.latLng.toJSON())}
center={center}
zoom={zoom}
mapContainerStyle={{
height: "70vh",
width: "100%"
}}
>
{/* {myPlaces.map(place => (
<MarkerF
key={place.id}
position={place.pos}
onLoad={marker => markerLoadHandler(marker, place)}
onClick={event => markerClickHandler(event, place)}
// Not required, but if you want a custom icon:
/>
))} */}
{position &&
<MarkerF
position={position}
onLoad={marker => markerLoadHandler(marker, position)}
onClick={event => markerClickHandler(event, position)}
// Not required, but if you want a custom icon:
/>}
{/*
<MarkerF
onLoad={onLoad}
position={position}
/> */}
{infoOpen && selectedPlace && (
<InfoWindow
anchor={markerMap[selectedPlace.id]}
onCloseClick={() => setInfoOpen(false)}
>
<div>
<h3>{selectedPlace.id}</h3>
<div>This is your info window content</div>
</div>
</InfoWindow>
)}
</GoogleMap>
{/* Our center position always in state */}
<h3>
Center {center.lat}, {center.lng}
</h3>
{/* Position of the user's map click */}
{clickedLatLng && (
<h3>
You clicked: {clickedLatLng.lat}, {clickedLatLng.lng}
</h3>
)}
{/* Position of the user's map click */}
{selectedPlace && <h3>Selected Marker: {selectedPlace.id}</h3>}
</div>: <div>Loading...</div>}
</div>
)
}
export default AA
\ No newline at end of file
This diff is collapsed.
......@@ -14,7 +14,6 @@ import Container from '@mui/material/Container';
import { createTheme, ThemeProvider } from '@mui/material/styles';
import BgImage from './../../images/signupBg.png'
import Rectangle from './../../images/Rectangle.png'
import { useSelector, useDispatch } from 'react-redux';
import { addHeader } from '../../features/header';
import Social from './../../images/social.gif'
import Businessman from './../../images/businessman.png'
......@@ -27,6 +26,19 @@ import { gapi } from 'gapi-script'
import { styled } from '@mui/material/styles';
import { useNavigate } from "react-router-dom";
import Logo from './../../images/logo.png'
import API from '../../api';
import jwt_decode from "jwt-decode";
import { useSelector, useDispatch } from 'react-redux';
import { login } from '../../features/user';
import Snackbar from '@mui/material/Snackbar';
import MuiAlert, { AlertProps } from '@mui/material/Alert';
const Alert = React.forwardRef(function Alert(
props,
ref,
) {
return <MuiAlert elevation={6} ref={ref} variant="filled" {...props} />;
});
const FacebookButton = styled(Button)(() => ({
transitionProperty: "box-shadow",
......@@ -127,9 +139,18 @@ const useStyles = makeStyles({
export default function SignIn() {
let navigate = useNavigate();
const dispatch = useDispatch();
const headerVisibility = useSelector((state) => state.header)
const classes = useStyles();
const dispatch = useDispatch();
const userDetails = useSelector((state) => state.user)
const clientId = '380810221970-6p2h323ibdoknuaddgrb432skkdm157o.apps.googleusercontent.com'
const [error, setError] = React.useState(false);
const [errorMsg, setErrorMsg] = React.useState("Error");
useEffect(() => {
console.log("userDetails", userDetails);
}, [userDetails]);
useEffect(() => {
function start() {
......@@ -146,13 +167,88 @@ export default function SignIn() {
console.log("FB", response);
}
const handleError = () => {
setError(true);
};
const handleCloseError = (event, reason) => {
if (reason === 'clickaway') {
return;
}
setError(false);
}
const onSuccess = (res) => {
console.log("LOGIN SUCCESS!", res.profileObj)
if (res.profileObj) {
let body = {
fullName: res.profileObj.name,
email: res.profileObj.email,
password: res.profileObj.googleId,
role: 'user',
emailToken: null,
isVerified: true
}
API.post('/user/getUser', body)
.then(function (response) {
console.log(response)
if (response.data.length === 0) {
API.post('user/createGoogleUser', body)
.then(function (response) {
API.post('user/validate', body).then(function (result) {
console.log("result", result)
let decodedToken = jwt_decode(result.data.user)
console.log("decodedToken", decodedToken)
localStorage.setItem('token', result.data.user)
dispatch(login({ 'fullName': decodedToken.fullName, 'email': decodedToken.email }))
dispatch(addHeader({ 'header': true, 'footer': true }))
navigate('/')
})
.catch(function (error) {
console.log(error);
setErrorMsg(error.response.data.message)
handleError()
});
})
.catch(function (error) {
console.log(error);
setErrorMsg(error.response.data.message)
handleError()
});
} else {
API.post('user/validate', body).then(function (result) {
console.log("result", result)
let decodedToken = jwt_decode(result.data.user)
console.log("decodedToken", decodedToken)
localStorage.setItem('token', result.data.user)
dispatch(login({ 'fullName': decodedToken.fullName, 'email': decodedToken.email }))
dispatch(addHeader({ 'header': true, 'footer': true }))
navigate('/')
})
.catch(function (error) {
console.log(error);
setErrorMsg(error.response.data.message)
handleError()
});
}
})
.catch(function (error) {
console.log(error);
setErrorMsg(error.response.data.message)
handleError()
});
}
}
const onFailure = (res) => {
console.log("LOGIN FAILED!", res)
setErrorMsg("Google Login Failed")
handleError()
}
useEffect(() => {
......@@ -160,17 +256,39 @@ export default function SignIn() {
}, []);
useEffect(() => {
console.log("headerVisibilityeee", headerVisibility.value)
}, [headerVisibility]);
const handleSubmit = (event) => {
const handleSubmit = async (event) => {
event.preventDefault();
const data = new FormData(event.currentTarget);
console.log({
email: data.get('email'),
password: data.get('password'),
});
let body = {
email: data.get('email'),
password: data.get('password')
}
try {
const result = await API.post('user/validate', body)
console.log("result", result)
let decodedToken = jwt_decode(result.data.user)
console.log("decodedToken", decodedToken)
localStorage.setItem('token', result.data.user)
dispatch(login({ 'fullName': decodedToken.fullName, 'email': decodedToken.email }))
dispatch(addHeader({ 'header': true, 'footer': true }))
navigate('/')
} catch (error) {
console.log("errrrr",error)
setErrorMsg(error.response.data.message)
handleError()
}
};
return (
......@@ -185,6 +303,9 @@ export default function SignIn() {
justifyContent: 'center',
alignItems: 'center'
}}>
<Snackbar open={error} autoHideDuration={6000} onClose={handleCloseError}>
<Alert onClose={handleCloseError} severity="error">{errorMsg}</Alert>
</Snackbar>
<ThemeProvider theme={theme}>
<div style={{
paddingTop: '50px',
......@@ -273,7 +394,7 @@ export default function SignIn() {
/>
<GoogleLogin
clientId={process.env.GOOGLE_CLIENT_ID}
clientId={clientId}
render={renderProps => (
<GoogleButton onClick={renderProps.onClick} disabled={renderProps.disabled} variant="contained" startIcon={<FcGoogle />}>Continue With Google</GoogleButton>
)}
......
import React, { useEffect, useState } from 'react';
import React, { useEffect, useState, useRef } from 'react';
import Avatar from '@mui/material/Avatar';
import Button from '@mui/material/Button';
import CssBaseline from '@mui/material/CssBaseline';
......@@ -21,6 +21,16 @@ import Woman from './../../images/woman.png'
import { makeStyles } from '@mui/styles';
import { useNavigate } from "react-router-dom";
import Logo from './../../images/logo.png'
import API from '../../api';
import Snackbar from '@mui/material/Snackbar';
import MuiAlert, { AlertProps } from '@mui/material/Alert';
const Alert = React.forwardRef(function Alert(
props,
ref,
) {
return <MuiAlert elevation={6} ref={ref} variant="filled" {...props} />;
});
function Copyright(props) {
return (
......@@ -57,11 +67,41 @@ const useStyles = makeStyles({
})
export default function SignUp() {
const [open, setOpen] = React.useState(false);
const [error, setError] = React.useState(false);
const [errorMsg, setErrorMsg] = React.useState("Error");
const [successMsg, setSuccessMsg] = React.useState("Successful");
let navigate = useNavigate();
const dispatch = useDispatch();
const headerVisibility = useSelector((state) => state.header)
const classes = useStyles();
const inputFNameRef = useRef()
const inputLNameRef = useRef()
const inputEmailRef = useRef()
const inputPasswordRef = useRef()
const handleClick = () => {
setOpen(true);
};
const handleClose = (event, reason) => {
if (reason === 'clickaway') {
return;
}
setOpen(false);
};
const handleError = () => {
setError(true);
};
const handleCloseError = (event, reason) => {
if (reason === 'clickaway') {
return;
}
setError(false);
}
useEffect(() => {
dispatch(addHeader({ 'header': false, 'footer': false }))
}, []);
......@@ -71,13 +111,45 @@ export default function SignUp() {
console.log("headerVisibilityeee", headerVisibility.value)
}, [headerVisibility]);
const handleSubmit = (event) => {
const handleSubmit = async (event) => {
event.preventDefault();
const data = new FormData(event.currentTarget);
console.log({
firstName: data.get('firstName'),
lastName: data.get('lastName'),
email: data.get('email'),
password: data.get('password'),
});
let body = {
fullName: data.get('firstName') + ' ' + data.get('lastName'),
email: data.get('email'),
password: data.get('password'),
role: 'user'
}
try {
const result = await API.post('user/create', body)
console.log("hh", result)
setSuccessMsg(result.data.message)
handleClick()
// navigate('/signIn')
console.log("result", result)
if (inputFNameRef.current || inputLNameRef.current || inputEmailRef.current || inputPasswordRef.current) {
inputFNameRef.current.value = "";
inputLNameRef.current.value = "";
inputEmailRef.current.value = "";
inputPasswordRef.current.value = "";
}
} catch (error) {
setErrorMsg(error.response.data.message)
handleError()
console.log("error", error.response.data.message)
if (inputFNameRef.current || inputLNameRef.current || inputEmailRef.current || inputPasswordRef.current) {
inputFNameRef.current.value = "";
inputLNameRef.current.value = "";
inputEmailRef.current.value = "";
inputPasswordRef.current.value = "";
}
}
};
return (
......@@ -92,7 +164,14 @@ export default function SignUp() {
justifyContent: 'center',
alignItems: 'center'
}}>
<Snackbar open={open} autoHideDuration={10000} onClose={handleClose}>
<Alert onClose={handleClose} severity="success" sx={{ width: '100%' }}>
{successMsg}
</Alert>
</Snackbar>
<Snackbar open={error} autoHideDuration={6000} onClose={handleCloseError}>
<Alert onClose={handleCloseError} severity="error">{errorMsg}</Alert>
</Snackbar>
<img src={Logo} onClick={() => { navigate(`/`); dispatch(addHeader({ 'header': true, 'footer': true })) }} style={{ cursor: 'pointer', position: 'absolute', left: '0', top: '0', width: '180px' }} />
<ThemeProvider theme={theme}>
<div style={{
......@@ -148,6 +227,7 @@ export default function SignUp() {
id="firstName"
label="First Name"
autoFocus
inputRef={inputFNameRef}
/>
</Grid>
<Grid item xs={12} sm={6}>
......@@ -158,6 +238,7 @@ export default function SignUp() {
label="Last Name"
name="lastName"
autoComplete="family-name"
inputRef={inputLNameRef}
/>
</Grid>
<Grid item xs={12}>
......@@ -168,6 +249,7 @@ export default function SignUp() {
label="Email Address"
name="email"
autoComplete="email"
inputRef={inputEmailRef}
/>
</Grid>
<Grid item xs={12}>
......@@ -179,6 +261,7 @@ export default function SignUp() {
type="password"
id="password"
autoComplete="new-password"
inputRef={inputPasswordRef}
/>
</Grid>
<Grid item xs={12}>
......
......@@ -12,7 +12,23 @@ import ContactUsBg from '../images/contactUsBg.svg'
import ContactUsEclipse from '../images/contactEclipse.svg'
const ContactUsButton = styled(Button)(({ theme }) => ({
width:"160px",
marginTop:"20px",
// backgroundColor:'#fff5fb',
color:'#fff5fb',
borderRadius:'30px',
textTransform:'none',
fontSize:'15px',
boxSizing:'border-box',
alignSelf:'flex-end',
paddingBlock:'10px',
background: 'linear-gradient(to left, #ca3b3b 50%, #d34747 50%) right',
backgroundSize: '200%',
transition: '.5s ease-out',
'&:hover': {
// backgroundColor: "#4c69ba",
backgroundPosition: 'left',
},
}));
const useStyles = makeStyles((theme) => ({
......@@ -24,10 +40,13 @@ const useStyles = makeStyles((theme) => ({
lineHeight: '24px',
padding: '12px 16px',
border: '1px solid #e8ebeb',
borderRadius: '4px',
borderRadius: '8px',
boxShadow: 'inset 0 2px 4px rgb(0 0 0 / 5 %)',
width: '400px',
margin: '0px 1px 15px'
},
inputTxt:{
color:'#616161',
}
}));
......
......@@ -11,18 +11,46 @@ import { useDispatch } from "react-redux";
import { useSelector } from "react-redux";
import { darkMode,lightMode } from "../features/theme";
import Button from '@mui/material/Button';
import ArrowForwardIosIcon from '@mui/icons-material/ArrowForwardIos';
import { useNavigate } from "react-router-dom";
const GetStarted = styled(Button)(() => ({
height: "45px",
width: "160px",
fontSize: "16px",
padding: "15px",
borderRadius: "20px",
color: "#ffffff",
display: "flex",
alignItems: "center",
justifyContent: "center",
textAlign: "center",
fontFamily: "plex-sans, sans-serif",
outline: "none",
cursor: "pointer",
textTransform: "none",
elevation: "2",
marginBlock: "16px",
/* "to left" / "to right" - affects initial color */
background: 'linear-gradient(to left, #302954 50%, #252744 50%) right',
backgroundSize: '200%',
transition: '.5s ease-out',
'&:hover': {
// backgroundColor: "#4c69ba",
backgroundPosition: 'left',
},
}));
const useStyles = makeStyles ({
descriptionBoxBackImg:{
height:"650px",
height:"650px",
},
descriptionBoxFrontImg:{
height:"450px",
'@media only screen and (max-width: 760px)': {
// width:"fit-content",
height:"300px",
height:"300px",
},
},
titleTopBar:{
......@@ -39,6 +67,7 @@ const useStyles = makeStyles ({
const DetailsBox =() => {
const themeColor = useSelector((state) => state.theme.value);
const classes = useStyles(themeColor);
const navigate = useNavigate();
return (
<Box sx={{
......@@ -91,13 +120,9 @@ const DetailsBox =() => {
<div className={classes.bodyText}>
We make sure your website looks the way you want it to where ever it is viewed. In this day and age there smart devices populate our entire life, We strive to ensure that the websites we create are always up to standard with the new devices releasing all the time. We develop dynamic websites based on our client requests such as Content Management System (CMS), E-commerce websites (Shopping carts), Online Bookings, Web Portals, Payment Gateways etc. There are many uses of having a dynamic site.
</div>
<Button variant="contained"
sx={{
width:"fit-content",
marginTop:"30px",
}}>
<GetStarted variant="contained" onClick={() => navigate('/Service')} endIcon={<ArrowForwardIosIcon />}>
Get Started
</Button>
</GetStarted>
</Box>
<div >
<img className={classes.descriptionBoxFrontImg} src={require('../images/about2.svg').default} alt="about" />
......
This diff is collapsed.
......@@ -7,6 +7,7 @@ import { makeStyles } from '@mui/styles';
import Logo from '../images/logo.png'
import Particle from './Particle';
const useStyles = makeStyles ({
logoImg:{
width:"100px",
......@@ -104,9 +105,9 @@ const HomePageHeader = () => {
}}>
<img className={classes.vectorImg} src={require('../images/HomeVector.svg').default} alt="HomeVector"/>
<img className={classes.vectorImgSvg} src={require('../images/mentalhealth.svg').default} alt="HomeVector"/>
</Box>
{/* <div className={classes.particle}><Particle/></div> */}
<div className={classes.particle}><Particle/></div>
</Box>
......
......@@ -17,6 +17,8 @@ import {RiParkingBoxLine} from 'react-icons/ri';
import {BsWind} from 'react-icons/bs';
import { useSelector, useDispatch } from 'react-redux';
import { addBusiness } from './../../features/business';
import {MdOutlineDeliveryDining} from 'react-icons/md';
import {AiOutlineClockCircle} from 'react-icons/ai';
export default function Review() {
const businessDetails = useSelector((state) => state.business)
......@@ -83,18 +85,19 @@ export default function Review() {
businessDetails && businessDetails.value[0].type == 'restaurant' ?
<List disablePadding>
<ListItem sx={{ py: 1, px: 0 }}>
<ListItemText primary="Opening Hours" />
<AiOutlineClockCircle style={{ color: '#1d7e20',fontSize:'20px',marginRight:'8px'}}/> <ListItemText primary="Opening Hours" />
<Typography variant="subtitle1" sx={{ fontWeight: 500 }}>{businessDetails.value[0].serviceDetails.opening }</Typography>
</ListItem>
<ListItem sx={{ py: 1, px: 0 }}>
<ListItemText primary="Closing Hours" />
<AiOutlineClockCircle style={{ color: '#ff462f',fontSize:'20px',marginRight:'8px'}}/> <ListItemText primary="Closing Hours" />
<Typography variant="subtitle1" sx={{ fontWeight: 500 }}>{businessDetails.value[0].serviceDetails.closing }</Typography>
</ListItem>
<ListItem sx={{ py: 1, px: 0 }}>
<ListItemText primary="Delivery" />
<Typography variant="subtitle1" sx={{ fontWeight: 500 }}>{businessDetails.value[0].serviceDetails.delivery == 'Delivery' ? `Available` : businessDetails.value[0].serviceDetails.delivery}</Typography>
<MdOutlineDeliveryDining style={{ color: '#2f8eff',fontSize:'20px',marginRight:'8px'}}/> <ListItemText primary="Delivery" />
<Typography variant="subtitle1" sx={{ fontWeight: 500 }}>{businessDetails.value[0].serviceDetails.delivery == 'Delivery' ? `Available` : businessDetails.value[0].serviceDetails.delivery}</Typography>
</ListItem>
......@@ -103,7 +106,7 @@ export default function Review() {
<Grid container spacing={2}>
<Grid item xs={12} >
<Typography variant="h6" gutterBottom sx={{ mt: 2,display:'flex',alignItems:'center',gap:'5px'}}>
Location {position && (
Location : {position && (
<div style={{fontSize:"12px",marginTop:'5px',color:'#c4c2c0',fontStyle:'italic'}}>
({position.lat}, {position.lng})
</div>
......
import React from 'react'
import InputDetails from './Hotel Input/InputDetails'
import { Box } from '@mui/system'
import { useSelector } from 'react-redux'
const InputHotelDetails = () => {
const themeColor = useSelector((state) => state.theme.value);
return (
<Box
sx={{
width:"100%",
height:"100%",
backgroundColor:'#E4E6F1',
background : themeColor.status == 'light' ? '#F7F7F9':'#1c1c1c',
boxSizing:"border-box",
backgroundImage: `url(${require('../images/about-shape-2.svg').default})`,
padding:"0px",
backgroundRepeat: 'repeat',
backgroundSize: 'contain',
// backgroundImage: `url(${require('../images/about-shape-2.svg').default})`,
backgroundImage:'url(https://images.unsplash.com/photo-1478860409698-8707f313ee8b?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1170&q=80)',
padding:"10px",
backgroundRepeat: 'no-repeat',
backgroundSize: 'cover',
backgroundAttachment:'fixed',
}}
>
......
import React from 'react'
const Loader = () => {
return (
<div class="loader">
<div class="loader-inner">
<div class="loader-line-wrap">
<div class="loader-line"></div>
</div>
<div class="loader-line-wrap">
<div class="loader-line"></div>
</div>
<div class="loader-line-wrap">
<div class="loader-line"></div>
</div>
<div class="loader-line-wrap">
<div class="loader-line"></div>
</div>
<div class="loader-line-wrap">
<div class="loader-line"></div>
</div>
</div>
</div>
)
}
export default Loader
\ No newline at end of file
This diff is collapsed.
......@@ -23,7 +23,7 @@ const Particle = () => {
options={{
background: {
color: {
value: "#0d47a1",
value: "#4782de",
},
},
fpsLimit: 120,
......@@ -70,7 +70,7 @@ const Particle = () => {
default: "bounce",
},
random: false,
speed: 3,
speed: 2,
straight: false,
},
number: {
......@@ -81,7 +81,7 @@ const Particle = () => {
value: 80,
},
opacity: {
value: 0.5,
value: 0.3,
},
shape: {
type: "circle",
......
......@@ -19,7 +19,7 @@ import TabPanel from '@mui/lab/TabPanel';
const PlanButton = styled(Button)(({ theme }) => ({
width:"170px",
marginTop:"20px",
backgroundColor:'#fff5fb',
// backgroundColor:'#fff5fb',
color:'#F496D1',
borderRadius:'30px',
textTransform:'none',
......@@ -27,15 +27,19 @@ const PlanButton = styled(Button)(({ theme }) => ({
boxSizing:'border-box',
alignSelf:'center',
paddingBlock:'8px',
background: 'linear-gradient(to left, #fff5fb 50%, #ffd7ef 50%) right',
backgroundSize: '200%',
transition: '.5s ease-out',
'&:hover': {
backgroundColor: '#ffd7ef',
// backgroundColor: "#4c69ba",
backgroundPosition: 'left',
},
}));
const MostPlanButton = styled(Button)(({ theme }) => ({
width:"170px",
marginTop:"20px",
backgroundColor:'#be9d607d',
// backgroundColor:'#be9d607d',
color:'#edcd2b',
borderRadius:'30px',
textTransform:'none',
......@@ -43,8 +47,13 @@ const MostPlanButton = styled(Button)(({ theme }) => ({
boxSizing:'border-box',
alignSelf:'center',
paddingBlock:'8px',
/* "to left" / "to right" - affects initial color */
background: 'linear-gradient(to left, #be9d607d 50%, #fbc1547c 50%) right',
backgroundSize: '200%',
transition: '.5s ease-out',
'&:hover': {
backgroundColor: '#fbc1547d',
// backgroundColor: '#fbc1547d',
backgroundPosition: 'left',
},
}));
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -6,6 +6,10 @@ export const userSlice = createSlice({
value: []
},
reducers: {
login: (state, action) => {
console.log("action.payload", action.payload)
state.value.push(action.payload)
},
register: (state, action) => {
state.value.push(action.payload)
},
......@@ -14,5 +18,5 @@ export const userSlice = createSlice({
},
}
});
export const { register: register, logout:logout } = userSlice.actions;
export const { login: login, register: register, logout:logout } = userSlice.actions;
export default userSlice.reducer;
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment