21110
package-lock.json
generated
10
package.json
|
@ -9,8 +9,14 @@
|
||||||
"axios": "^0.21.1",
|
"axios": "^0.21.1",
|
||||||
"bootstrap": "^4.6.0",
|
"bootstrap": "^4.6.0",
|
||||||
"cors": "^2.8.5",
|
"cors": "^2.8.5",
|
||||||
|
"email-validator": "^2.0.4",
|
||||||
"express": "^4.17.1",
|
"express": "^4.17.1",
|
||||||
|
"flag-icon-css": "^3.5.0",
|
||||||
|
"formik": "^2.2.6",
|
||||||
|
"i18next-browser-languagedetector": "^6.1.0",
|
||||||
|
"i18next-http-backend": "^1.2.1",
|
||||||
"joi-browser": "^13.4.0",
|
"joi-browser": "^13.4.0",
|
||||||
|
"js-cookie": "^2.2.1",
|
||||||
"nodemailer": "^6.5.0",
|
"nodemailer": "^6.5.0",
|
||||||
"react": "^17.0.2",
|
"react": "^17.0.2",
|
||||||
"react-alert": "^7.0.2",
|
"react-alert": "^7.0.2",
|
||||||
|
@ -23,12 +29,14 @@
|
||||||
"react-form-with-constraints-bootstrap4": "^0.16.0",
|
"react-form-with-constraints-bootstrap4": "^0.16.0",
|
||||||
"react-google-maps": "^9.4.5",
|
"react-google-maps": "^9.4.5",
|
||||||
"react-hook-form": "^7.0.0",
|
"react-hook-form": "^7.0.0",
|
||||||
|
"react-i18next": "^11.8.12",
|
||||||
"react-router-dom": "^5.2.0",
|
"react-router-dom": "^5.2.0",
|
||||||
"react-scripts": "4.0.3",
|
"react-scripts": "4.0.3",
|
||||||
"react-select": "^4.3.0",
|
"react-select": "^4.3.0",
|
||||||
"reactstrap": "^8.9.0",
|
"reactstrap": "^8.9.0",
|
||||||
"spectre.css": "^0.5.9",
|
"spectre.css": "^0.5.9",
|
||||||
"web-vitals": "^1.1.1"
|
"web-vitals": "^1.1.1",
|
||||||
|
"yup": "^0.32.9"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "react-scripts start",
|
"start": "react-scripts start",
|
||||||
|
|
27
public/assets/locales/en/translations.json
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"Welcome_to_React": "Welcome to React and react-i18next",
|
||||||
|
"Login_header": "Kene's Cribs",
|
||||||
|
"Login_message": "Welcome please back, please sign in!",
|
||||||
|
"Login_email": "Email address",
|
||||||
|
"Login_password": "Password",
|
||||||
|
"Login_remember_me": "remember me",
|
||||||
|
"Login_submit_button": "Submit",
|
||||||
|
"Account_header": "Personal Information",
|
||||||
|
"Account_message": "You can update/edit your account information here",
|
||||||
|
"Account_first_name": "First Name",
|
||||||
|
"Account_last_name": "Last Name",
|
||||||
|
"Account_email": "Email",
|
||||||
|
"Account_phone_number": "Phone Number",
|
||||||
|
"Account_current_password": "Current Password",
|
||||||
|
"Account_new_password": "New password",
|
||||||
|
"Account_update_button": "Update",
|
||||||
|
"Footer_message": "Copyright SEG3125 - Group 3",
|
||||||
|
"Nav_brand": "Kene's Cribs",
|
||||||
|
"Nav_Home": "Home",
|
||||||
|
"Nav_Listings": "Listings",
|
||||||
|
"Nav_Agents": "Agents",
|
||||||
|
"Nav_Contact_Us": "Contact Us",
|
||||||
|
"Nav_listing_page": "listing-page",
|
||||||
|
"Nav_Login": "Login"
|
||||||
|
|
||||||
|
}
|
26
public/assets/locales/fr/translations.json
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
{
|
||||||
|
"Welcome_to_React": "Bienvenue a react et react-i18next",
|
||||||
|
"Login_header": "Berceaux de Kene",
|
||||||
|
"Login_message": "Bienvenue, merci de vous connecter!",
|
||||||
|
"Login_email": "Adresse e-mail",
|
||||||
|
"Login_password": "Mot de passe",
|
||||||
|
"Login_remember_me": "souviens-toi de moi",
|
||||||
|
"Login_submit_button": "Nous faire parvenir",
|
||||||
|
"Account_header": "Informations personnelles",
|
||||||
|
"Account_message": "Vous pouvez mettre à jour / modifier les informations de votre compte ici",
|
||||||
|
"Account_first_name": "Prénom",
|
||||||
|
"Account_last_name": "Nom de famille",
|
||||||
|
"Account_email": "E-mail",
|
||||||
|
"Account_phone_number": "Numéro de téléphone",
|
||||||
|
"Account_current_password": "Mot de passe actuel",
|
||||||
|
"Account_new_password": "Nouveau mot de passe",
|
||||||
|
"Account_update_button": "Mettre à jour",
|
||||||
|
"Footer_message": "Copyright SEG3125 - Groupe 3",
|
||||||
|
"Nav_brand": "Berceaux de Kene",
|
||||||
|
"Nav_Home": "Accueil",
|
||||||
|
"Nav_Listings": "Annonces",
|
||||||
|
"Nav_Agents": "Agents",
|
||||||
|
"Nav_Contact_Us": "Nous contacter",
|
||||||
|
"Nav_listing_page": "page de liste",
|
||||||
|
"Nav_Login": "Connexion"
|
||||||
|
}
|
|
@ -57,7 +57,7 @@
|
||||||
|
|
||||||
<title>Kene's Cribs</title>
|
<title>Kene's Cribs</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body dir="ltr">
|
||||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||||
<div id="root"></div>
|
<div id="root"></div>
|
||||||
<!--
|
<!--
|
||||||
|
|
76
src/App.js
|
@ -1,27 +1,93 @@
|
||||||
import { Component } from "react";
|
import React, { useEffect } from "react";
|
||||||
import Footer from "./shared-components/footer-component/Footer";
|
import Footer from "./shared-components/footer-component/Footer";
|
||||||
import Navbar from "./shared-components/navbar-component/Navbar";
|
import Navbar from "./shared-components/navbar-component/Navbar";
|
||||||
import { BrowserRouter, Route } from "react-router-dom";
|
import { BrowserRouter, Route, Switch } from "react-router-dom";
|
||||||
|
import i18next from "i18next";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import Cookies from "js-cookie";
|
||||||
import HomePage from "./homePage/Homepage";
|
import HomePage from "./homePage/Homepage";
|
||||||
import ListingsPage from "./listings-page/ListingsPage";
|
import ListingsPage from "./listings-page/ListingsPage";
|
||||||
import AgentPage from "./agent-page/AgentPage";
|
import AgentPage from "./agent-page/AgentPage";
|
||||||
|
import ListingPage from "./listings-page/single-listing/listing-page";
|
||||||
|
import Login from "./login-page/Login";
|
||||||
|
import Account from "./login-page/account/Account";
|
||||||
import ContactUs from "./shared-components/contact-us/contact-us";
|
import ContactUs from "./shared-components/contact-us/contact-us";
|
||||||
|
|
||||||
class App extends Component {
|
const langauges = [
|
||||||
render() {
|
{
|
||||||
|
code: "fr",
|
||||||
|
name: "Français",
|
||||||
|
country_code: "fr",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
code: "en",
|
||||||
|
name: "English",
|
||||||
|
country_code: "gb",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
function App() {
|
||||||
|
const currentLanguageCode = Cookies.get("i18next") || "en";
|
||||||
|
const currentLanguage = langauges.find(
|
||||||
|
(lang) => lang.code === currentLanguageCode
|
||||||
|
);
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
document.body.dir = currentLanguage.dir || "ltr";
|
||||||
|
}, [currentLanguage]);
|
||||||
return (
|
return (
|
||||||
<div className="App">
|
<div className="App">
|
||||||
|
{/* create the translations button */}
|
||||||
|
<div className="container">
|
||||||
|
<div className="d-flex justify-content-end">
|
||||||
|
{/* <!-- Example single danger button --> */}
|
||||||
|
<div class="btn-group">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="btn btn-link dropdown-toggle"
|
||||||
|
data-toggle="dropdown"
|
||||||
|
aria-haspopup="true"
|
||||||
|
aria-expanded="false"
|
||||||
|
>
|
||||||
|
<i class="fas fa-globe"></i>
|
||||||
|
</button>
|
||||||
|
<div class="dropdown-menu">
|
||||||
|
{langauges.map(({ code, name, country_code }) => (
|
||||||
|
<button
|
||||||
|
class="dropdown-item"
|
||||||
|
key={code}
|
||||||
|
onClick={() => i18next.changeLanguage(code)}
|
||||||
|
disabled={code === currentLanguageCode}
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
className={`flag-icon flag-icon-${country_code} mx-2`}
|
||||||
|
></span>
|
||||||
|
{name}
|
||||||
|
</button>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="d-flex flex-column align-items-start">
|
||||||
|
{t("Welcome_to_React")}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<BrowserRouter>
|
<BrowserRouter>
|
||||||
<Navbar></Navbar>
|
<Navbar></Navbar>
|
||||||
|
<Switch>
|
||||||
<Route exact path="/" component={HomePage}></Route>
|
<Route exact path="/" component={HomePage}></Route>
|
||||||
<Route path="/listings" component={ListingsPage}></Route>
|
<Route path="/listings" component={ListingsPage}></Route>
|
||||||
<Route path="/agents" component={AgentPage}></Route>
|
<Route path="/agents" component={AgentPage}></Route>
|
||||||
|
<Route path="/listing-page" component={ListingPage}></Route>
|
||||||
|
<Route path="/login" component={Login}></Route>
|
||||||
<Route path="/contact-us" component={ContactUs}></Route>
|
<Route path="/contact-us" component={ContactUs}></Route>
|
||||||
|
<Route path="/account" component={Account}></Route>
|
||||||
|
</Switch>
|
||||||
</BrowserRouter>
|
</BrowserRouter>
|
||||||
<Footer></Footer>
|
<Footer></Footer>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default App;
|
export default App;
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
import React from "react";
|
|
||||||
import { shallow } from "enzyme";
|
|
||||||
import HomePage from "./homePage";
|
|
||||||
|
|
||||||
describe("HomePage", () => {
|
|
||||||
test("matches snapshot", () => {
|
|
||||||
const wrapper = shallow(<HomePage />);
|
|
||||||
expect(wrapper).toMatchSnapshot();
|
|
||||||
});
|
|
||||||
});
|
|
BIN
src/images/house1-2.jpg
Normal file
After Width: | Height: | Size: 247 KiB |
BIN
src/images/house1-3.jpg
Normal file
After Width: | Height: | Size: 134 KiB |
BIN
src/images/house2-2.jpg
Normal file
After Width: | Height: | Size: 199 KiB |
BIN
src/images/house2-3.jpg
Normal file
After Width: | Height: | Size: 284 KiB |
BIN
src/images/house3-2.png
Normal file
After Width: | Height: | Size: 714 KiB |
BIN
src/images/house3-3.jpg
Normal file
After Width: | Height: | Size: 229 KiB |
BIN
src/images/house4-2.jpg
Normal file
After Width: | Height: | Size: 254 KiB |
BIN
src/images/house4-3.jpg
Normal file
After Width: | Height: | Size: 361 KiB |
BIN
src/images/profile-picture.png
Normal file
After Width: | Height: | Size: 19 KiB |
43
src/index.js
|
@ -1,14 +1,49 @@
|
||||||
import React from "react";
|
import React, { Suspense } from "react";
|
||||||
import ReactDOM from "react-dom";
|
import ReactDOM from "react-dom";
|
||||||
import "./index.css";
|
|
||||||
import App from "./App";
|
|
||||||
import reportWebVitals from "./reportWebVitals";
|
import reportWebVitals from "./reportWebVitals";
|
||||||
import "bootstrap/dist/css/bootstrap.min.css";
|
import "bootstrap/dist/css/bootstrap.min.css";
|
||||||
|
import "flag-icon-css/css/flag-icon.min.css";
|
||||||
|
import i18n from "i18next";
|
||||||
|
import { initReactI18next } from "react-i18next";
|
||||||
|
import LanguageDetector from "i18next-browser-languagedetector";
|
||||||
|
import HttpApi from "i18next-http-backend";
|
||||||
|
|
||||||
|
import "./index.css";
|
||||||
|
import App from "./App";
|
||||||
|
|
||||||
|
i18n
|
||||||
|
.use(initReactI18next) // passes i18n down to react-i18next
|
||||||
|
.use(LanguageDetector)
|
||||||
|
.use(HttpApi)
|
||||||
|
.init({
|
||||||
|
// lng: "en",
|
||||||
|
supportedLngs: ["en", "fr"],
|
||||||
|
fallbackLng: "en",
|
||||||
|
detection: {
|
||||||
|
// "querystring",
|
||||||
|
order: ["cookie", "htmlTag", "localStorage", "path", "subdomain"],
|
||||||
|
caches: ["cookie"],
|
||||||
|
},
|
||||||
|
backend: {
|
||||||
|
loadPath: "/assets/locales/{{lng}}/translations.json",
|
||||||
|
},
|
||||||
|
|
||||||
|
react: {
|
||||||
|
useSuspense: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const loadingMsg = (
|
||||||
|
<div className="py-4 text-center">
|
||||||
|
<h2>Loading......</h2>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
ReactDOM.render(
|
ReactDOM.render(
|
||||||
|
<Suspense fallback={loadingMsg}>
|
||||||
<React.StrictMode>
|
<React.StrictMode>
|
||||||
<App />
|
<App />
|
||||||
</React.StrictMode>,
|
</React.StrictMode>
|
||||||
|
</Suspense>,
|
||||||
document.getElementById("root")
|
document.getElementById("root")
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -13,9 +13,11 @@
|
||||||
|
|
||||||
],
|
],
|
||||||
"DESC":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui.",
|
"DESC":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui.",
|
||||||
|
"FULL_DESCRIPTION": "RUN DON'T WALK to this beautiful former Jayman show home. This home has every feature and convenience you could want in a home. When you enter you will be greeted with a large entry way, open concept main floor with a very spacious chef-like kitchen, the big eat in dinning area is an entertainers dream and plenty of room in the living room as to cozy up to the fireplace. When you head upstairs the owner 's suite will impress with a gorgeous ensuite consisting of a large soaker tub, oversized shower, separate vanities, in-floor heating and 2 separate closest. You will also find a nice sized flex room, spacious laundry room up stairs, 4 piece main bathroom and 2 more bedrooms. Then head downstairs where you will find another bedroom, bathroom and Theatre room with wet bar and beverage station that is perfect for any movie lover. Must not forget that this home is air conditioned, has front and back irrigation outside and speakers throughout the house. All of this can be yours in the lake community of Auburn Bay close to all amenities and year round lake access just a short distance away",
|
||||||
"FOR_SALE": true,
|
"FOR_SALE": true,
|
||||||
"coordinates": [-75.3372987731628, 45.383321536272049]
|
"coordinates": [-75.3372987731628, 45.383321536272049],
|
||||||
|
"BEDROOM": "2",
|
||||||
|
"BATHROOM": "4"
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -32,8 +34,11 @@
|
||||||
|
|
||||||
],
|
],
|
||||||
"DESC":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui.",
|
"DESC":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui.",
|
||||||
|
"FULL_DESCRIPTION": "Nature at its Finest The Shores of Toney Bay are located at the mouth of River Phillip where it meets the Northumberland Straight with direct access to the incredible recreational waterways of River Phillip and nature rich Toney Bay. This nature lovers paradise boasts a plethora of migratory bird life and the rich fish stock of River Philip. The warm waters of the Northumberland Straight are swimmable from your shorefront, easy access to year-around activities and close proximity to the quaint community of Pugwash make this an ideal spot for a permeant residence or cottage. There are also ocean view / deeded access lots available. Large lots with unobstructed views and well away from highway noise. Swim in the warm waters at beautiful Heather's Beach just 4km away, fly fishing in the spring on River Phillip, book at tee time at Northumberland links, 16km away or enjoy a day at the Luxury Fox Harb'r Resort and Spa less then 30 mins away, and in winter enjoy skiing at Ski Wentworth a short 30 minutes drive. Lots are flat, cleared and ready for your dream home. All septic and building lot approvals are in place, good roads, and power to the lot line are included. Please take a few minutes to watch the video of the stunning Shores at Toney Bay",
|
||||||
"FOR_SALE": true,
|
"FOR_SALE": true,
|
||||||
"coordinates": [-75.546518086577947, 45.467134581917357]
|
"coordinates": [-75.546518086577947, 45.467134581917357],
|
||||||
|
"BEDROOM": "7",
|
||||||
|
"BATHROOM": "4"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -52,9 +57,11 @@
|
||||||
|
|
||||||
],
|
],
|
||||||
"DESC":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui.",
|
"DESC":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui.",
|
||||||
|
"FULL_DESCRIPTION": "Custom, Hi-Ranch home located in sought after neighborhood in the Heart of Petawawa. This home features 2+1 bedrooms and 4 bathrooms. Main level features spacious foyer, hardwood staircase, gleaming hardwood floors and open concept living. Large windows provide lots of natural light, vaulted ceilings in living room, a spectacular spacious kitchen with stainless steel appliances and large island. Master bedroom with walk through closet and 3 piece en-suite with custom tile shower and heated tile floor. Lower level features a finished rec room with cozy gas fireplace, bedroom and 3 piece bathroom. Patio door in foyer leads to large private backyard with no rear neighbours, spacious wood deck and hot tub. Double attached garage completes the package. Pack your backs and move right in! No Conveyances of offers until Friday April 9th at 3PM however the seller has the right to view and may accept pre-emptive offers",
|
||||||
"FOR_SALE": true,
|
"FOR_SALE": true,
|
||||||
"coordinates": [-75.898610599532319, 45.295014379864874]
|
"coordinates": [-75.898610599532319, 45.295014379864874],
|
||||||
|
"BEDROOM": "2",
|
||||||
|
"BATHROOM": "4"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -73,9 +80,12 @@
|
||||||
|
|
||||||
],
|
],
|
||||||
"DESC":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui.",
|
"DESC":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui.",
|
||||||
|
"FULL_DESCRIPTION": "Nestled in a quiet cul-de-sac in the family-friendly Ski Club/Widdifield neighbourhood, is 62 Riddle Court, a hidden gem that has everything you've been searching for - inside and out! Look up and take in the picturesque views of the escarpment, take a short walk or drive to the Laurentian Ski Hill with the family, or simply savour your very own property by having dinner on the patio, a glass of wine on the deck/balcony, and admire the breathtaking landscape (designed by an award-winning landscape artist) that wraps around your home. Lush perennials, tall grasses, interlocking brick pathways, in-ground sprinkler system and outdoor lighting make this property standout from the rest! Step inside to relish in all of the updated features this home has to offer - gleaming maple hardwood floors & stairs, updated maple kitchen cabinets, ceramic tile with in-floor radiant heat in bathrooms and office, built-in entertainment units, finished laundry room, low-maintenance composite deck off dining area, recessed lighting, updated windows, doors, insulation... the list goes on! Working from home these days? Enter the private & professional home office right off the recreation room through french doors. Enjoy the under-cabinet lighting, as well as the natural light beaming through the window with views of the backyard. Pride of ownership is obvious. Nothing left to do, but move-in! Pre-inspected for your peace of mind.",
|
||||||
"FOR_SALE": true,
|
"FOR_SALE": true,
|
||||||
"coordinates": [-75.468561642270757, 45.23032561834377]
|
"coordinates": [-75.468561642270757, 45.23032561834377],
|
||||||
|
"BEDROOM": "4",
|
||||||
|
"BATHROOM": "3"
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
.single-listing{
|
||||||
|
padding: 7% 15%;
|
||||||
|
/* background-color: darksalmon; */
|
||||||
|
}
|
||||||
|
|
||||||
|
.listing-header{
|
||||||
|
border: 1px solid black;
|
||||||
|
text-align: left;
|
||||||
|
padding: 1%;
|
||||||
|
}
|
||||||
|
.listing-title{
|
||||||
|
font-size: 2.5rem;
|
||||||
|
/* font-style: italic; */
|
||||||
|
}
|
||||||
|
|
||||||
|
.title-icon{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.listing-carousel{
|
||||||
|
margin: 5% 15%;
|
||||||
|
width: 70%;
|
||||||
|
/* padding-right: 10; */
|
||||||
|
}
|
||||||
|
|
||||||
|
.carousel-img{
|
||||||
|
/* width: 70%; */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.amentities{
|
||||||
|
border: 1px solid black;
|
||||||
|
/* padding: 5% 0; */
|
||||||
|
margin: 3% 40%;
|
||||||
|
padding: 1% 0%;
|
||||||
|
}
|
||||||
|
.amentities-text{
|
||||||
|
|
||||||
|
}
|
||||||
|
.amentities-icon{
|
||||||
|
margin: 0% 5%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.description-box{
|
||||||
|
border: 1px solid black;
|
||||||
|
padding: 5%;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.description-title{
|
||||||
|
padding: 2% 0%;
|
||||||
|
}
|
||||||
|
.listing-description{
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.booking-btn{
|
||||||
|
padding: 2% 0%;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
|
@ -1,9 +1,139 @@
|
||||||
import React, { Component } from "react";
|
import React from "react";
|
||||||
|
import "./listing-page.css";
|
||||||
|
import { Link } from "react-router-dom";
|
||||||
|
|
||||||
class ListingPage extends Component {
|
// import house images
|
||||||
render() {
|
import house_img1 from "../../images/house1-2.jpg";
|
||||||
return <div>ListingPage</div>;
|
const ListingPage = () => {
|
||||||
}
|
return (
|
||||||
}
|
<div className="single-listing">
|
||||||
|
{/* Listing header */}
|
||||||
|
<div className="row listing-header">
|
||||||
|
<div className="col-12">
|
||||||
|
<h2 className="listing-title">
|
||||||
|
<i class="fas fa-home title-icon"></i> My title
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Carousel for images of the listings */}
|
||||||
|
<div className="listing-carousel">
|
||||||
|
<div
|
||||||
|
id="carouselExampleControls"
|
||||||
|
class="carousel slide"
|
||||||
|
data-ride="carousel"
|
||||||
|
>
|
||||||
|
<div class="carousel-inner">
|
||||||
|
<div class="carousel-item active carousel-img">
|
||||||
|
<img
|
||||||
|
src={house_img1}
|
||||||
|
class="d-block w-100"
|
||||||
|
alt="listing-img"
|
||||||
|
></img>
|
||||||
|
</div>
|
||||||
|
<div class="carousel-item carousel-img">
|
||||||
|
<img
|
||||||
|
src={house_img1}
|
||||||
|
class="d-block w-100"
|
||||||
|
alt="listing-img"
|
||||||
|
></img>
|
||||||
|
</div>
|
||||||
|
<div class="carousel-item">
|
||||||
|
<img
|
||||||
|
src={house_img1}
|
||||||
|
class="d-block w-100"
|
||||||
|
alt="listing-img"
|
||||||
|
></img>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a
|
||||||
|
class="carousel-control-prev"
|
||||||
|
href="#carouselExampleControls"
|
||||||
|
role="button"
|
||||||
|
data-slide="prev"
|
||||||
|
>
|
||||||
|
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
|
||||||
|
<span class="sr-only">Previous</span>
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
class="carousel-control-next"
|
||||||
|
href="#carouselExampleControls"
|
||||||
|
role="button"
|
||||||
|
data-slide="next"
|
||||||
|
>
|
||||||
|
<span class="carousel-control-next-icon" aria-hidden="true"></span>
|
||||||
|
<span class="sr-only">Next</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Text box for listing amenities */}
|
||||||
|
<div className="amentities">
|
||||||
|
<span className="amentities-text">1</span>
|
||||||
|
<i class="fas fa-bed fa-2x amentities-icon"></i>
|
||||||
|
<span className="amentities-text">2</span>
|
||||||
|
<i class="fas fa-bath fa-2x amentities-icon"></i>
|
||||||
|
<span className="amentities-text">3</span>
|
||||||
|
<i class="fas fa-wifi fa-2x amentities-icon"></i>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Description for the listing */}
|
||||||
|
<div className="description-box">
|
||||||
|
<h2 className="description-title">Description</h2>
|
||||||
|
<p className="listing-description">
|
||||||
|
MOVE IN READY I WALKING DISTANCE TO SHOPPING, SCHOOLS AND TRANSIT I
|
||||||
|
Conveniently located in Haysboro, you have Restaurants, Groceries,
|
||||||
|
Coffee shops, Schools and a Library all within walking distance. This
|
||||||
|
Updated Bungalow offers over 2000 square feet of developed living
|
||||||
|
space, 3 Bedrooms upstairs to accommodate almost any family and 2 down
|
||||||
|
stairs in the fully developed basement. Having a separate entrance
|
||||||
|
downstairs through the backyard makes it much easier if you ever want
|
||||||
|
to convert the basement into a suite. The double garage is even heated
|
||||||
|
with 220v plus 2 additional spaces that could be used for RV parking
|
||||||
|
or for any additional vehicles in the house. You will notice the home
|
||||||
|
has been tastefully updated over the years including a soaker tub in
|
||||||
|
the bathroom, in the kitchen your cabinetry goes right to the ceiling
|
||||||
|
for a nice finished look, granite counters and Kitchenaid appliances
|
||||||
|
and a new garburator. The entire property has a fresh coat of paint
|
||||||
|
inside and out, Newer windows and roof along with the Plumbing,
|
||||||
|
Electrical (Cat 5 connection throughout and 200amp service) has been
|
||||||
|
updated. Last but not least, the back deck already has gas and ready
|
||||||
|
for the BBQ season. With the BIG updates being done, all that is left
|
||||||
|
to do is enjoy Summer on the deck or enjoy a bonfire in your sunny
|
||||||
|
West facing backyard!
|
||||||
|
</p>
|
||||||
|
<div className="booking-btn">
|
||||||
|
<Link to="/contact-us">
|
||||||
|
<button type="button" class="btn btn-lg btn-info">
|
||||||
|
Book Showing
|
||||||
|
</button>
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
// sources for the images used
|
||||||
|
//images.adsttc.com/media/images/524c/2511/e8e4/4e67/bf00/03c3/large_jpg/Tetris_House_03.jpg?1380721927
|
||||||
|
|
||||||
|
//House description
|
||||||
|
// ->Link 1 -https://www.realtor.ca/real-estate/23018057/9811-elbow-drive-calgary-haysboro
|
||||||
|
// images
|
||||||
|
// 1 ->house1.jpg
|
||||||
|
// 2 ->//images.adsttc.com/media/images/524c/2511/e8e4/4e67/bf00/03c3/large_jpg/Tetris_House_03.jpg?1380721927
|
||||||
|
// 3 ->https://s3.amazonaws.com/on1-wp/wp-content/uploads/2018/08/3191-NW-Jenna-22-of-49v2-1024x683.jpg
|
||||||
|
//-> Link2 -> https://www.realtor.ca/real-estate/23020015/lot-14-67-seastone-drive-port-howe-port-howe
|
||||||
|
// 1 ->house2.jpg
|
||||||
|
// 2 ->https://static.photocdn.pt/images/articles/2019/12/24/How_to_Take_Gorgeous_Interior_Real_Estate_Photos.jpg
|
||||||
|
// 3 ->https://i.pinimg.com/originals/f3/72/87/f372870f4f99d3278193a3970aa394ce.jpg
|
||||||
|
//->Link3 -> https://www.realtor.ca/real-estate/23020040/1035-butler-boulevard-petawawa-laurentian-highlands
|
||||||
|
// 1 ->house3.jpg
|
||||||
|
// 2 ->https://miro.medium.com/max/1200/1*EyGqOwy0wQwKHUgi3xpQZA.png
|
||||||
|
// 3 ->https://i.pinimg.com/originals/9b/fe/76/9bfe76b23f7ed9dcb35f7553b8255f48.jpg
|
||||||
|
//->Link4 -> https://www.realtor.ca/real-estate/23020103/62-riddle-court-north-bay
|
||||||
|
// 1 ->house4.jpg
|
||||||
|
// 2 ->https://pictureitsoldfl.com/wp-content/uploads/2016/07/305-Rudder-Cay-Way-Jupiter-FL-print-014-28-Family-Room-4200x2800-300dpi-1170x780.jpg
|
||||||
|
// 3 ->https://www.tlcinteriors.com.au/wp-content/uploads/2018/06/hamptons-style-kitchen-from-metricon-bayville-display-home.jpg
|
||||||
|
|
||||||
export default ListingPage;
|
export default ListingPage;
|
||||||
|
|
26
src/login-page/Login.css
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
.login-page{
|
||||||
|
padding: 10% 30%;
|
||||||
|
text-align: center;
|
||||||
|
background-color: pink;
|
||||||
|
|
||||||
|
}
|
||||||
|
.signin-Form{
|
||||||
|
border: 1px solid blanchedalmond;
|
||||||
|
border-radius: 2%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hr{
|
||||||
|
border-top: 2px dashed beige;
|
||||||
|
width: 30%;
|
||||||
|
}
|
||||||
|
.app-logo{
|
||||||
|
width: 15%;
|
||||||
|
}
|
||||||
|
.login-box{
|
||||||
|
padding: 0% 30%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-btn{
|
||||||
|
margin: 10% 2%;
|
||||||
|
text-align: center;
|
||||||
|
}
|
77
src/login-page/Login.js
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
import React, { Component } from "react";
|
||||||
|
import Logo from "../images/logo1.png";
|
||||||
|
import "./Login.css";
|
||||||
|
import { Link } from "react-router-dom";
|
||||||
|
// import { useTranslation } from "react-i18next";
|
||||||
|
import { withTranslation } from "react-i18next";
|
||||||
|
class Login extends Component {
|
||||||
|
state = {
|
||||||
|
Account: {
|
||||||
|
firstName: "Kevon",
|
||||||
|
lastName: "Green",
|
||||||
|
email: "kevon.green@kcribs.com",
|
||||||
|
password: "Kcribs123",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
handleLogin = (e) => {
|
||||||
|
console.log(e);
|
||||||
|
};
|
||||||
|
render() {
|
||||||
|
const { t } = this.props;
|
||||||
|
return (
|
||||||
|
<div className="login-page">
|
||||||
|
<form action="" className="signin-Form" onClick={this.handleLogin}>
|
||||||
|
<img className="app-logo" src={Logo} alt="app-logo" />
|
||||||
|
<h1 className="form-title">{t("Login_header")} </h1>
|
||||||
|
<p>{t("Login_message")}</p>
|
||||||
|
<hr className="hr" />
|
||||||
|
<div className="login-box">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="email">{t("Login_email")}</label>
|
||||||
|
<input
|
||||||
|
type="email"
|
||||||
|
class="form-control"
|
||||||
|
id="login-email"
|
||||||
|
// value={email}
|
||||||
|
aria-describedby="emailHelp"
|
||||||
|
placeholder="Enter your email"
|
||||||
|
required
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="password">{t("Login_password")}</label>
|
||||||
|
<input
|
||||||
|
type="password"
|
||||||
|
class="form-control"
|
||||||
|
id="login-password"
|
||||||
|
// value={password}
|
||||||
|
placeholder="Enter your password"
|
||||||
|
required
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="form-group form-check">
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
class="form-check-input"
|
||||||
|
id="exampleCheck1"
|
||||||
|
/>
|
||||||
|
<label class="form-check-label" for="exampleCheck1">
|
||||||
|
{t("Login_remember_me")}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div className="login-btn">
|
||||||
|
<Link to="/account">
|
||||||
|
<button type="submit" class="btn btn-lg btn-primary">
|
||||||
|
{t("Login_submit_button")}
|
||||||
|
</button>
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default withTranslation()(Login);
|
37
src/login-page/account/Account.css
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
.account-info{
|
||||||
|
padding: 7%;
|
||||||
|
text-align: center;
|
||||||
|
background-color: #e7dec8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.account-header{
|
||||||
|
/* margin: 0% 2%; */
|
||||||
|
padding: 0% 2%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.account-img{
|
||||||
|
width: 90%;
|
||||||
|
margin: 10% 12%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.update-account{
|
||||||
|
text-align: left;
|
||||||
|
padding: 4% 7%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-group{
|
||||||
|
padding: 1%;
|
||||||
|
}
|
||||||
|
.label-text{
|
||||||
|
font-weight: bold;
|
||||||
|
margin: 2%;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.update-input{
|
||||||
|
padding: 0% 10%;
|
||||||
|
}
|
||||||
|
.update-btn{
|
||||||
|
padding: 4% 2%;
|
||||||
|
text-align: left;
|
||||||
|
}
|
154
src/login-page/account/Account.js
Normal file
|
@ -0,0 +1,154 @@
|
||||||
|
import React, { Component } from "react";
|
||||||
|
import "./Account.css";
|
||||||
|
import Profile from "../../images/profile-picture.png";
|
||||||
|
import { withTranslation } from "react-i18next";
|
||||||
|
// import { useTranslation } from "react-i18next";
|
||||||
|
|
||||||
|
class Account extends Component {
|
||||||
|
state = {
|
||||||
|
Account: {
|
||||||
|
firstName: "Kevon",
|
||||||
|
lastName: "Green",
|
||||||
|
email: "kevon.green@kcribs.com",
|
||||||
|
password: "Kcribs123",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
render() {
|
||||||
|
const { t } = this.props;
|
||||||
|
return (
|
||||||
|
<div className="account-info">
|
||||||
|
{/* // send information to my login component */}
|
||||||
|
<div className="account-header">
|
||||||
|
<h2 className="account-title">{t("Account_header")}</h2>
|
||||||
|
<p className="account-text">{t("Account_message")}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="row account-box">
|
||||||
|
<div className="col-4">
|
||||||
|
<img src={Profile} alt="profile-img" className="account-img" />
|
||||||
|
</div>
|
||||||
|
<div className="col-8">
|
||||||
|
<form action="" className="update-account">
|
||||||
|
<div class="row form-group info-group">
|
||||||
|
<div className="col-4">
|
||||||
|
<label class="label-text" for="email">
|
||||||
|
{t("Account_first_name")}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div className="col-8 update-input">
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
class="form-control"
|
||||||
|
id="account-fname"
|
||||||
|
placeholder={this.state.Account.firstName}
|
||||||
|
required
|
||||||
|
disabled={true}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row form-group info-group">
|
||||||
|
<div className="col-4">
|
||||||
|
<label class="label-text" for="email">
|
||||||
|
{t("Account_last_name")}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div className="col-8 update-input">
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
class="form-control"
|
||||||
|
id="account-lname"
|
||||||
|
placeholder={this.state.Account.lastName}
|
||||||
|
required
|
||||||
|
disabled={true}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row form-group info-group">
|
||||||
|
<div className="col-4">
|
||||||
|
<label class="label-text" for="email">
|
||||||
|
{t("Account_email")}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div className="col-8 update-input">
|
||||||
|
<input
|
||||||
|
type="email"
|
||||||
|
class="form-control"
|
||||||
|
id="account-email"
|
||||||
|
aria-describedby="emailHelp"
|
||||||
|
placeholder={this.state.Account.email}
|
||||||
|
required
|
||||||
|
disabled={true}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row form-group info-group">
|
||||||
|
<div className="col-4">
|
||||||
|
<label class="label-text" for="email">
|
||||||
|
{t("Account_phone_number")}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div className="col-8 update-input">
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
class="form-control"
|
||||||
|
id="account-phoneNumber"
|
||||||
|
placeholder={this.state.Account.email}
|
||||||
|
required
|
||||||
|
disabled={true}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row form-group info-group">
|
||||||
|
<div className="col-4">
|
||||||
|
<label class="label-text" for="email">
|
||||||
|
{t("Account_current_password")}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div className="col-8 update-input">
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
class="form-control"
|
||||||
|
id="account-existPassword"
|
||||||
|
placeholder={"**************"}
|
||||||
|
required
|
||||||
|
disabled={true}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/* <div class="row form-group info-group">
|
||||||
|
<div className="col-4">
|
||||||
|
<label class="label-text" for="email">
|
||||||
|
{t("Account_new_password")}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div className="col-8 update-input">
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
class="form-control"
|
||||||
|
id="account-newPassword"
|
||||||
|
required
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div> */}
|
||||||
|
<div className="update-btn">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="btn btn-lg btn-danger"
|
||||||
|
disabled={true}
|
||||||
|
>
|
||||||
|
{t("Account_update_button")}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//links
|
||||||
|
// https://www.pngitem.com/pimgs/m/146-1468479_my-profile-icon-blank-profile-picture-circle-hd.png
|
||||||
|
|
||||||
|
export default withTranslation()(Account);
|
|
@ -1,6 +1,9 @@
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import "./Footer.css";
|
import "./Footer.css";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
|
||||||
const Footer = () => {
|
const Footer = () => {
|
||||||
|
const { t } = useTranslation();
|
||||||
return (
|
return (
|
||||||
<footer>
|
<footer>
|
||||||
<section id="footer">
|
<section id="footer">
|
||||||
|
@ -9,7 +12,7 @@ const Footer = () => {
|
||||||
<i class="fab fa-facebook social-icon"></i>
|
<i class="fab fa-facebook social-icon"></i>
|
||||||
<i class="fab fa-instagram social-icon"></i>
|
<i class="fab fa-instagram social-icon"></i>
|
||||||
<i class="fas fa-envelope social-icon"></i>
|
<i class="fas fa-envelope social-icon"></i>
|
||||||
<p class="">© Copyright SEG3125 - Group 3</p>
|
<p class="">© {t("Footer_message")}</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
@ -3,14 +3,16 @@ import { Link, withRouter } from "react-router-dom";
|
||||||
import "./Navbar.css";
|
import "./Navbar.css";
|
||||||
import logo from "./logo2.png";
|
import logo from "./logo2.png";
|
||||||
/* eslint-disable jsx-a11y/anchor-is-valid */
|
/* eslint-disable jsx-a11y/anchor-is-valid */
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
const Navbar = () => {
|
const Navbar = () => {
|
||||||
|
const { t } = useTranslation();
|
||||||
return (
|
return (
|
||||||
/* Nav Bar */
|
/* Nav Bar */
|
||||||
<div className="Navbar">
|
<div className="Navbar">
|
||||||
<nav class="navbar navbar-expand-lg navbar-dark">
|
<nav class="navbar navbar-expand-lg navbar-dark">
|
||||||
<img src={logo} alt="" width="40" height="40"></img>
|
<img src={logo} alt="" width="40" height="40"></img>
|
||||||
<a href="/" class="navbar-brand">
|
<a href="/" class="navbar-brand">
|
||||||
Kene's Cribs
|
{t("Nav_brand")}
|
||||||
</a>
|
</a>
|
||||||
<button
|
<button
|
||||||
className="navbar-toggler"
|
className="navbar-toggler"
|
||||||
|
@ -27,29 +29,36 @@ const Navbar = () => {
|
||||||
<ul className="navbar-nav ml-auto">
|
<ul className="navbar-nav ml-auto">
|
||||||
<li className="nav-item">
|
<li className="nav-item">
|
||||||
<Link className="nav-link" exact to="/">
|
<Link className="nav-link" exact to="/">
|
||||||
Home
|
{t("Nav_Home")}
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
<li className="nav-item">
|
<li className="nav-item">
|
||||||
<Link className="nav-link" to="/listings">
|
<Link className="nav-link" to="/listings">
|
||||||
Listings
|
{t("Nav_Listings")}
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li className="nav-item">
|
<li className="nav-item">
|
||||||
<Link className="nav-link" to="/agents">
|
<Link className="nav-link" to="/agents">
|
||||||
Agents
|
{t("Nav_Agents")}
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li className="nav-item">
|
<li className="nav-item">
|
||||||
<Link className="nav-link" to="/contact-us">
|
<Link className="nav-link" to="/contact-us">
|
||||||
Contact Us
|
{t("Nav_Contact_Us")}
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li className="nav-item">
|
<li className="nav-item">
|
||||||
<Link className="nav-link" to="/">
|
<Link className="nav-link" to="/listing-page">
|
||||||
Login
|
{t("Nav_listing_page")}
|
||||||
|
</Link>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li className="nav-item">
|
||||||
|
<Link className="nav-link" to="/login">
|
||||||
|
{t("Nav_Login")}
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|