-
Notifications
You must be signed in to change notification settings - Fork 12
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Connect to Weather API #28
base: main
Are you sure you want to change the base?
Changes from 6 commits
08fa292
dac08f8
87d8e92
a18dd57
be36012
85d523f
ebb724f
accfe59
544ee29
2cbd25e
8b2d947
fa398df
dc4e844
f47a206
925f7de
7c3b35c
050e635
4a6f098
b458d4b
42f58a9
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
{} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,61 @@ | ||
@use "theme/utilities.scss"; | ||
@use "theme/global.scss"; | ||
|
||
|
||
.App{ | ||
background-color: #8ecae6; | ||
} | ||
|
||
.c-site-header{ | ||
padding: 20px; | ||
} | ||
|
||
.heading{ | ||
background-color: #219ebc; | ||
padding: 10px; | ||
} | ||
|
||
.c-site-header__title{ | ||
color: #023047; | ||
padding: 20px; | ||
} | ||
|
||
.city{ | ||
margin: 15px; | ||
padding: 15px; | ||
} | ||
|
||
.search-btn{ | ||
background-color: #023047; | ||
color: white; | ||
margin-left: 15px; | ||
padding: 15px; | ||
} | ||
|
||
.weather-img{ | ||
margin: auto; | ||
width: 200px; | ||
height: 200px; | ||
object-fit: cover; | ||
} | ||
|
||
.description{ | ||
display: flex; | ||
justify-content: center; | ||
color: white; | ||
} | ||
|
||
.temp { | ||
display: flex; | ||
justify-content: center; | ||
margin: 20px; | ||
} | ||
|
||
.box{ | ||
display: flex; | ||
justify-content: center; | ||
} | ||
|
||
.sub-box{ | ||
padding: 30px; | ||
} |
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,59 @@ | ||
import React from "react"; | ||
import './Header.scss' | ||
import "./Header.scss"; | ||
import WeatherIcon from "../Picture/WeatherIcon"; | ||
import React, { useState} from "react"; | ||
|
||
const Header = ({title}) => | ||
|
||
const Header = ({ title }) => { | ||
const [weatherData, setWeatherData] = useState([]); | ||
const [city, setCity] = useState(""); | ||
|
||
|
||
function getNewWeather (){ | ||
fetch( | ||
`https://api.openweathermap.org/data/2.5/weather?q=${city}&units=metric&appid=3b86046cce0de3be7cfa8369f4540b37` | ||
) | ||
.then((res) => res.json()) | ||
.then((data) => { | ||
setWeatherData(data); | ||
}) | ||
} | ||
|
||
return ( | ||
<header className="c-site-header"> | ||
<div className="heading"> | ||
<h1 className="c-site-header__title">{title}</h1> | ||
<input | ||
className="city" | ||
type="text" | ||
placeholder="City" | ||
value={city} | ||
onChange={(event) => setCity(event.target.value)} | ||
/> | ||
<button className="search-btn" onClick={getNewWeather}>FIND WEATHER</button> | ||
</div> | ||
|
||
<WeatherIcon weatherId={weatherData?.weather?.[0]?.id} /> | ||
<div className="description"> | ||
<h3>{weatherData?.weather?.[0]?.description}</h3> | ||
</div> | ||
|
||
<div className="temp"> | ||
<h2>Temperature : {weatherData?.main?.temp?.toFixed()}°C</h2> | ||
</div> | ||
|
||
<div className="box"> | ||
<div className="sub-box"> | ||
<h4>Humidity : {weatherData?.main?.humidity}% </h4> | ||
</div> | ||
|
||
<div className="sub-box"> | ||
<h4>Pressure : {weatherData?.main?.pressure}</h4> | ||
</div> | ||
</div> | ||
</header> | ||
); | ||
}; | ||
|
||
export default Header; | ||
|
||
|
||
export default Header; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
import React from "react"; | ||
import storm from "../../img/weather-icons/storm.svg"; | ||
import drizzle from "../../img/weather-icons/drizzle.svg"; | ||
import rain from "../../img/weather-icons/rain.svg"; | ||
import snow from "../../img/weather-icons/snow.svg"; | ||
import fog from "../../img/weather-icons/fog.svg"; | ||
import clear from "../../img/weather-icons/clear.svg"; | ||
import partlyCloudy from "../../img/weather-icons/partlycloudy.svg"; | ||
import mostlyCloudy from "../../img/weather-icons/mostlycloudy.svg"; | ||
|
||
const images = { | ||
storm: { src: storm, alt: "storm" }, | ||
drizzle: { src: drizzle, alt: "drizzle" }, | ||
rain: { src: rain, alt: "rain" }, | ||
snow: { src: snow, alt: "snow" }, | ||
fog: { src: fog, alt: "fog" }, | ||
clear: { src: clear, alt: "clear" }, | ||
partlyCloudy: { src: partlyCloudy, alt: "partly cloudy" }, | ||
mostlyCloudy: { src: mostlyCloudy, alt: "mostly cloudy" }, | ||
}; | ||
|
||
|
||
function selectImage(weatherId){ | ||
if (weatherId < 300) { | ||
return images.storm; | ||
} else if (weatherId < 499) { | ||
return images.drizzle; | ||
} else if (weatherId < 599) { | ||
return images.rain; | ||
} else if (weatherId < 699) { | ||
return images.snow; | ||
} else if (weatherId < 799) { | ||
return images.fog; | ||
} else if (weatherId === 800) { | ||
return images.clear; | ||
} else if (weatherId === 801) { | ||
return images.partlyCloudy; | ||
} | ||
return images.mostlyCloudy; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nice code here @zkhing 🙌🏼
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please make this small change, then I will approve this PR, and we can merge it in. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thank you. Actually, my tech buddy kindly helped me with that part. :) And I added unknown.svg image now. |
||
} | ||
|
||
const WeatherIcon = ({weatherId}) =>{ | ||
|
||
const image = selectImage(weatherId) | ||
|
||
return ( | ||
<div className="weather-img"> | ||
<img src={image.src} alt={image.alt} /> | ||
</div> | ||
); | ||
} | ||
|
||
export default WeatherIcon; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is the main wrapper of all your other components. It should look something like this:
You currently have all the weather icon and weather data being displayed inside your Header component. This needs to be fetched in the Header component (as you have done), but it needs to be displayed inside of
<main>
, in a specific component (something likeCurrentWeather
).There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's get this merged in though and I'll create a ticket to move this logic to the right place in a different PR @zkhing
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have improved some changes Lucy but I am stuck and it is still incomplete yet. Please have a look at the changes that I've made and suggest me how to improve when you have time. I do not know how to slice data from API for current and future weather. Many thanks