├── Patterns └── InterfaceBasedProgramming │ ├── Tasks │ ├── noLocationAccess │ │ └── index.js │ └── setCurrentLocationToRegistrationForm │ │ └── index.js │ └── packages │ ├── addressManager │ ├── adapters │ │ └── convertCoordinatesToRegistrationFormAddress.js │ ├── getAddressByCoordinates.js │ └── index.js │ └── currentLocationReceiver │ ├── getCurrentLocation.js │ ├── getCurrentLocationMock.js │ └── index.js └── README.md /Patterns/InterfaceBasedProgramming/Tasks/noLocationAccess/index.js: -------------------------------------------------------------------------------- 1 | export default () => { 2 | // do something 3 | }; 4 | -------------------------------------------------------------------------------- /Patterns/InterfaceBasedProgramming/Tasks/setCurrentLocationToRegistrationForm/index.js: -------------------------------------------------------------------------------- 1 | import currentLocationReceiver from "@/packages/currentLocationReceiver"; 2 | import addressManager from "@/packages/addressManager"; 3 | 4 | import noLocationAccess from "../noLocationAccess"; 5 | 6 | export default async () => { 7 | const coordinates = await currentLocationReceiver.getCurrentLocation(); 8 | 9 | if (!coordinates) { 10 | noLocationAccess(); 11 | return; 12 | } 13 | 14 | const address = 15 | await addressManager.convertCoordinatesToRegistrationFormAddress( 16 | coordinates 17 | ); 18 | 19 | if (!address) { 20 | noLocationAccess(); 21 | return; 22 | } 23 | 24 | updateForm(address); 25 | }; 26 | -------------------------------------------------------------------------------- /Patterns/InterfaceBasedProgramming/packages/addressManager/adapters/convertCoordinatesToRegistrationFormAddress.js: -------------------------------------------------------------------------------- 1 | import getAddressByCoordinates from "../getAddressByCoordinates"; 2 | 3 | export default (coordinates) => { 4 | const address = getAddressByCoordinates(coordinates); 5 | 6 | if (!address) { 7 | return null; 8 | } 9 | 10 | const registrationFormAddress = address.results[0].address_components.reduce( 11 | (memo, item) => { 12 | if (item.types.includes("postal_code")) { 13 | memo.postalCode = item.short_name; 14 | } else if (item.types.includes("country")) { 15 | memo.country = item.short_name; 16 | } else if (item.types.includes("locality")) { 17 | memo.city = item.short_name; 18 | } else if (item.types.includes("route")) { 19 | memo.streetName = item.short_name; 20 | } else if (item.types.includes("street_number")) { 21 | memo.houseNumber = item.short_name; 22 | } 23 | 24 | return memo; 25 | }, 26 | {} 27 | ); 28 | 29 | return registrationFormAddress; 30 | }; 31 | -------------------------------------------------------------------------------- /Patterns/InterfaceBasedProgramming/packages/addressManager/getAddressByCoordinates.js: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | 3 | export default (coordinates) => { 4 | try { 5 | const { data } = await axios.get( 6 | "https://maps.googleapis.com/maps/api/geocode/json?", 7 | { 8 | params: { 9 | latlng: `${coordinates.lat}, ${coordinates.lng}`, 10 | key: "SomeKey", 11 | language: "en", 12 | }, 13 | } 14 | ); 15 | 16 | return data; 17 | } catch (error) { 18 | return null; 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /Patterns/InterfaceBasedProgramming/packages/addressManager/index.js: -------------------------------------------------------------------------------- 1 | import convertCoordinatesToRegistrationFormAddress from "./adapters/convertCoordinatesToRegistrationFormAddress"; 2 | // import convertCoordinatesToShopAddress from './adapters/convertCoordinatesToShopAddress' 3 | // import getAddressSuggestions from './adapters/getAddressSuggestions' 4 | // import converteAddressToCoordinates from './adapters/converteAddressToCoordinates' 5 | 6 | export default { 7 | convertCoordinatesToRegistrationFormAddress, 8 | // convertCoordinatesToShopAddress, 9 | // getAddressSuggestions, 10 | // converteAddressToCoordinates, 11 | }; 12 | -------------------------------------------------------------------------------- /Patterns/InterfaceBasedProgramming/packages/currentLocationReceiver/getCurrentLocation.js: -------------------------------------------------------------------------------- 1 | export default async () => { 2 | return new Promise((resolve) => { 3 | navigator.geolocation.getCurrentPosition( 4 | (position) => { 5 | if (!position || !position.coords) { 6 | resolve(null); 7 | return; 8 | } 9 | 10 | resolve({ 11 | lat: position.coords.latitude, 12 | lng: position.coords.longitude, 13 | }); 14 | }, 15 | () => resolve(null) 16 | ); 17 | }); 18 | }; 19 | -------------------------------------------------------------------------------- /Patterns/InterfaceBasedProgramming/packages/currentLocationReceiver/getCurrentLocationMock.js: -------------------------------------------------------------------------------- 1 | export default async () => { 2 | return { 3 | lat: 37.0902, 4 | long: 95.7129, 5 | }; 6 | }; 7 | -------------------------------------------------------------------------------- /Patterns/InterfaceBasedProgramming/packages/currentLocationReceiver/index.js: -------------------------------------------------------------------------------- 1 | import getCurrentLocation from "./getCurrentLocation"; 2 | // import getCurrentLocationMock from "./getCurrentLocationMock"; 3 | 4 | export default { 5 | getCurrentLocation, 6 | }; 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Patterns: 2 | 3 | ## Interface Based Programming (setCurrentLocation) 4 | 5 | - [RU video](https://youtu.be/T4QFV0qUi1c) 6 | - [Sources](https://github.com/Sin9k/Patterns/tree/main/Patterns/InterfaceBasedProgramming) 7 | --------------------------------------------------------------------------------