From 8fd6c8f9c910e620755a21c63451ed2c841913e0 Mon Sep 17 00:00:00 2001 From: Vedang Surnis Date: Tue, 17 Oct 2023 00:23:18 +0530 Subject: [PATCH] Realtime location solved --- src/App.js | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 75 insertions(+), 3 deletions(-) diff --git a/src/App.js b/src/App.js index c0ae1c7..d176494 100644 --- a/src/App.js +++ b/src/App.js @@ -21,12 +21,84 @@ 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.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, @@ -94,7 +166,7 @@ class App extends React.Component { position: toast.POSITION.TOP_CENTER, autoClose: 1500, className: 'toast-message' - }); + }); } }); } @@ -129,7 +201,7 @@ class App extends React.Component { visibility={this.state.visibility} /> {this.state.error && ( - + )} );