diff --git a/src/App.js b/src/App.js index eac5399..0a78a16 100644 --- a/src/App.js +++ b/src/App.js @@ -23,13 +23,88 @@ class App extends React.Component { visibility: [], displayLoader: "none", }; + + this.componentDidMount = this.componentDidMount.bind(this); this.city = this.city.bind(this); this.submit = this.submit.bind(this); + this.clearInput = this.clearInput.bind(this); this.componentWillMount = this.componentWillMount.bind(this); + this.closeToasterMessage = this.closeToasterMessage.bind(this); } + async componentDidMount() { + try { + const position = await this.getCurrentPosition(); + const { latitude, longitude } = position.coords; + + const reverseGeocodeRes = await fetch( + `http://api.openweathermap.org/geo/1.0/reverse?lat=${latitude}&lon=${longitude}&limit=1&appid=${process.env.REACT_APP_OPEN_WEATHER_SECRET}` + ); + const reverseGeocodeData = await reverseGeocodeRes.json(); + const cityName = reverseGeocodeData[0]?.name || "london"; + + + + this.setState({ + city_name: cityName, + }); + + // Now fetch weather data based on the user's location + this.fetchWeatherData(cityName); + } catch (error) { + console.error("Error getting location or weather data:", error); + this.setState({ + error: true, + toast_message: "Error fetching location or weather data.", + }); + } + } + + getCurrentPosition() { + return new Promise((resolve, reject) => { + navigator.geolocation.getCurrentPosition(resolve, reject); + }); + } + + async fetchWeatherData(city) { + const url = `http://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${process.env.REACT_APP_OPEN_WEATHER_SECRET}`; + try { + const response = await fetch(url); + if (!response.ok) { + throw Error(response.status); + } + const responseData = await response.json(); + + this.setState({ + temp: responseData.main.temp, + city: responseData.name, + icon: responseData.weather[0].icon, + desc: responseData.weather[0].description, + humidity: responseData.main.humidity, + pressure: responseData.main.pressure, + wind: responseData.wind.speed, + visibility: responseData.visibility, + error: false, + toast_message: "", + }); + } catch (error) { + if (error.message === "404") { + this.setState({ + error: true, + toast_message: + "The location entered is invalid. Please enter a valid location.", + }); + toast("The location entered is invalid", { + position: toast.POSITION.TOP_CENTER, + autoClose: 1500, + className: 'toast-message' + }); + } + } + } + city(event) { this.setState({ city_name: event.target.value, @@ -102,7 +177,7 @@ class App extends React.Component { position: toast.POSITION.TOP_CENTER, autoClose: 1500, className: 'toast-message' - }); + }); } }); } @@ -140,7 +215,7 @@ class App extends React.Component { visibility={this.state.visibility} /> {this.state.error && ( - + )} );