Merge pull request #30 from ArcticHawk1/listings2

Listings2
This commit is contained in:
Arctichawk1 2021-04-07 13:51:20 -04:00 committed by GitHub
commit b4a3d1a0e1
26 changed files with 21799 additions and 77 deletions

21110
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -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",

View 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"
}

View 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"
}

View file

@ -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>
<!-- <!--

View file

@ -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;

View file

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 KiB

BIN
src/images/house1-3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

BIN
src/images/house2-2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

BIN
src/images/house2-3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 KiB

BIN
src/images/house3-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 714 KiB

BIN
src/images/house3-3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 KiB

BIN
src/images/house4-2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 KiB

BIN
src/images/house4-3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View file

@ -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")
); );

View file

@ -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"
} }
] ]

View file

@ -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;
}

View file

@ -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
View 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
View 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);

View 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;
}

View 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);

View file

@ -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>

View file

@ -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>