diff --git a/components/forms/newsletter/component.jsx b/components/forms/newsletter/component.jsx index 6820bb5000..ee25b906e2 100644 --- a/components/forms/newsletter/component.jsx +++ b/components/forms/newsletter/component.jsx @@ -11,6 +11,7 @@ import Select from 'components/forms/components/select'; import Submit from 'components/forms/components/submit'; import SuccessMessage from 'components/success-message'; import Error from 'components/forms/components/error'; +import { preferredLanguages } from 'components/forms/profile/config'; import { email as validateEmail } from 'components/forms/validations'; import Checkbox from '../components/checkbox/component'; @@ -29,14 +30,6 @@ const sectors = [ 'Other', ]; -const preferredLanguages = [ - { label: 'English', value: 'en' }, - { label: 'Français', value: 'fr' }, - { label: 'Español', value: 'es' }, - { label: 'Português', value: 'pt' }, - { label: 'Bahasa Indonesia', value: 'id' }, -]; - const interests = [ 'Innovations in Monitoring', 'Fires', diff --git a/components/forms/profile/actions.js b/components/forms/profile/actions.js index 34893a5fb1..02da3ef394 100644 --- a/components/forms/profile/actions.js +++ b/components/forms/profile/actions.js @@ -1,9 +1,19 @@ import { createThunkAction } from 'redux/actions'; +import axios from 'axios'; import { FORM_ERROR } from 'final-form'; import { updateProfile, createProfile } from 'services/user'; import { setMyGFW } from 'providers/mygfw-provider/actions'; +const saveOrttoProfile = async (payload) => { + try { + await axios.post('/api/ortto', payload); + } catch (error) { + // eslint-disable-next-line no-console + console.error(error); + } +}; + export const saveProfile = createThunkAction( 'saveProfile', (fields) => (dispatch) => { @@ -17,6 +27,7 @@ export const saveProfile = createThunkAction( firstName, lastName, email, + old_email, country, city, state, @@ -29,6 +40,8 @@ export const saveProfile = createThunkAction( jobTitle, signUpForTesting, isUserProfileFilled, + receive_updates = false, + preferred_language = 'en', } = fields; const postData = { @@ -47,6 +60,8 @@ export const saveProfile = createThunkAction( aoiCountry, jobTitle, areaOrRegionOfInterest, + receive_updates, + preferred_language, subsector: subsector && subsector.includes('Other') ? `Other: ${subsector_otherInput || ''}` @@ -72,8 +87,27 @@ export const saveProfile = createThunkAction( const updateOrCreate = isUserProfileFilled ? updateProfile : createProfile; return updateOrCreate(id, postData) - .then((response) => { + .then(async (response) => { if (response.data && response.data.data) { + saveOrttoProfile({ + email, + first_name: firstName, + last_name: lastName, + organization: company, + job_title: jobTitle, + job_function: + subsector && subsector.includes('Other') + ? `Other: ${subsector_otherInput || ''}` + : subsector, + sector, + city, + country, + preferred_language, + interests: interests.toString(), + receive_updates, + old_email, + }); + const { attributes } = response.data.data; dispatch( setMyGFW({ diff --git a/components/forms/profile/component.jsx b/components/forms/profile/component.jsx index df45b72073..d3f8659e5b 100644 --- a/components/forms/profile/component.jsx +++ b/components/forms/profile/component.jsx @@ -14,6 +14,7 @@ import Submit from 'components/forms/components/submit'; import ConfirmationMessage from 'components/confirmation-message'; import Button from 'components/ui/button'; import Error from 'components/forms/components/error'; +import { preferredLanguages } from 'components/forms/profile/config'; import { email as validateEmail, @@ -95,6 +96,11 @@ class ProfileForm extends PureComponent { validate={[validateEmail]} required /> + + { }; const mapStateToProps = ({ myGfw, countryData }) => { - const { howDoYouUse, subsector, firstName, fullName, lastName } = + const { howDoYouUse, subsector, firstName, fullName, lastName, email } = myGfw.data || {}; const subsectorHasOther = subsector && subsector.includes('Other'); @@ -43,6 +43,7 @@ const mapStateToProps = ({ myGfw, countryData }) => { myGfw.data && { initialValues: { ...myGfw.data, + old_email: email, firstName: firstName || (fullName && splitFirstName(fullName)), lastName: lastName || (fullName && splitLastName(fullName)), subsector: subsectorOther ? 'Other:' : subsector, diff --git a/components/map/basemaps.js b/components/map/basemaps.js index cb8d6241e1..801f59aa64 100644 --- a/components/map/basemaps.js +++ b/components/map/basemaps.js @@ -51,6 +51,7 @@ export default { baseStyle: false, hasSettings: false, infoModal: 'satellite_basemap', + caveat: '(global)', image: satelliteImage, basemapGroup: 'basemap-satellite', labelsGroup: 'labels-dark', diff --git a/components/satellite-basemaps/component.jsx b/components/satellite-basemaps/component.jsx index 5b790883a8..1ff83db448 100644 --- a/components/satellite-basemaps/component.jsx +++ b/components/satellite-basemaps/component.jsx @@ -63,6 +63,15 @@ const SatelliteBasemaps = ({ } }, [isTropics, defaultSatSet]); + let sortedBasemaps = basemaps; + if (basemaps.length >= 4) { + sortedBasemaps = [ + basemaps[1], + ...basemaps.slice(0, 1), + ...basemaps.slice(2), + ]; + } + const handleToggleActive = () => { setOpen(!activeBasemap.active); setMapBasemap({ @@ -142,7 +151,7 @@ const SatelliteBasemaps = ({

SATELLITE IMAGERY

    - {basemaps.map((basemap) => { + {sortedBasemaps.map((basemap) => { return (
  • { + if (req.method !== 'POST') { + return res.status(405); + } + const { + email, + first_name, + last_name, + organization, + job_title, + job_function, + sector, + city, + country, + preferred_language, + interests, + receive_updates, + old_email, + } = req.body; + + const forwarded = req.headers['x-forwarded-for']; + const ip = forwarded + ? forwarded.split(/, /)[0] + : req.connection.remoteAddress; + + const INTERESTS = [ + 'general_information_data_about_forests', + 'fires', + 'climate_and_carbon', + 'agricultural_supply_chains', + 'forest_watcher_mobile_app', + 'small_grants_fund_and_tech_fellowship', + 'innovations_in_monitoring', + 'biodiversity', + 'landscape_restoration', + 'gfw_users_in_action', + 'places_to_watch_alerts', + 'deforestation', + ]; + + const filteredInterests = interests + .split(',') + .filter((item) => INTERESTS.includes(item.toLowerCase())); + + const formData = new FormData(); + + formData.append('email', email); + formData.append('old_email', old_email); + formData.append('first_name', first_name); + formData.append('last_name', last_name); + formData.append('organization', organization); + formData.append('job_title', job_title); + formData.append('job_function', job_function); + formData.append('sector', sector); + formData.append('city', city); + formData.append('country', country); + formData.append('preferred_language', preferred_language); + formData.append('interests', filteredInterests.join()); + formData.append('receive_updates', receive_updates); + formData.append('ip_addr', ip); + formData.append('form_name', 'GFW My Profile Update'); + + try { + await axios.post('https://ortto.wri.org/custom-forms/gfw/', formData, { + headers: { + 'content-type': 'multipart/form-data', + }, + }); + } catch (error) { + // eslint-disable-next-line no-console + console.error(error); + return res.status(400); + } + + return res.status(201); +};