Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
472aaca
package-lock.json
sunilsabatp Aug 9, 2022
520bc19
change the redeem endpoint in profile
sunilsabatp Aug 18, 2022
8a43ba0
fix the error message for redeem code
sunilsabatp Aug 22, 2022
fa20e79
fix codefactor error
sunilsabatp Aug 22, 2022
51f1942
removed unused entities
sunilsabatp Aug 22, 2022
0aad0ae
fix client-side exception issue
sunilsabatp Aug 23, 2022
b11c602
fix the button and validation for redeem modal
sunilsabatp Aug 25, 2022
f437e97
changed name of validate button
sunilsabatp Aug 26, 2022
9719b4e
pull the latest changes from remote
sunilsabatp Aug 26, 2022
50140c4
fix redeem modal
sunilsabatp Aug 31, 2022
78687a8
added button for successful redeem modal
sunilsabatp Sep 1, 2022
893b853
Merge branch 'develop' of https://github.com/Plant-for-the-Planet-org…
sunilsabatp Sep 2, 2022
24b3e99
merged develop
sunilsabatp Sep 2, 2022
7684044
fix codefactor suggested error
sunilsabatp Sep 2, 2022
9a1a8e3
defined type for data
sunilsabatp Sep 2, 2022
bb2ecad
defined type for userProfile
sunilsabatp Sep 2, 2022
da4c1c6
fix the redeem code through route
sunilsabatp Sep 14, 2022
5afb945
removed loaduser from redeemmodal
sunilsabatp Sep 17, 2022
8df3f0f
center map
prachigarg19 Sep 19, 2022
a230235
replace dependency and condition
prachigarg19 Sep 19, 2022
6deb008
Revert "replace dependency and condition"
prachigarg19 Sep 19, 2022
cf37c04
change dependency and condition to center map
prachigarg19 Sep 19, 2022
42d2146
improve condition
prachigarg19 Sep 19, 2022
28e298a
preserve coordinates when we return from single project page
prachigarg19 Sep 20, 2022
a1d5342
clean up code
sunilsabatp Sep 21, 2022
81bfe18
fixed the structure of redeem modal
sunilsabatp Sep 21, 2022
8ecddb1
refactor: minor cleanup
mohitb35 Sep 26, 2022
d15a3e9
fix structure of modal
sunilsabatp Sep 29, 2022
a2a8aac
cleaned up the repetitive code
sunilsabatp Sep 29, 2022
791f913
fix: remove footer app links
mohitb35 Sep 29, 2022
982b995
refactor: remove unused dependencies/fix TS errors
mohitb35 Sep 29, 2022
64483d0
Merge pull request #1576 from Plant-for-the-Planet-org/feature/remove…
sagararyal Sep 29, 2022
a873daf
feat: always show signup form for logged in user
mohitb35 Sep 30, 2022
ff1eb98
feat: show space after end of form
mohitb35 Sep 30, 2022
05c3d0b
fix: make form fields responsive
mohitb35 Sep 30, 2022
bc6d6f6
Revert "feat: always show signup form for logged in user"
mohitb35 Sep 30, 2022
b767573
Merge pull request #1554 from Plant-for-the-Planet-org/feature/redeem…
mariahosfeld Oct 4, 2022
8ef4028
Merge pull request #1570 from Plant-for-the-Planet-org/feature/center…
mariahosfeld Oct 4, 2022
8d754fa
Merge pull request #1578 from Plant-for-the-Planet-org/feature/comple…
mariahosfeld Oct 5, 2022
b3c8ee9
Merge branch 'develop' into feature/dashboard-maintenance-refactor
mohitb35 Oct 6, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10,710 changes: 5,074 additions & 5,636 deletions package-lock.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@
"@storybook/testing-library": "^0.0.11",
"@types/d3-ease": "^1.0.9",
"@types/node": "^14.0.26",
"@types/react": "^16.9.43",
"@types/react": "^18.0.1",
"@types/react-map-gl": "^5.2.7",
"@types/styled-jsx": "^2.2.8",
"@types/uuid": "^8.3.0",
Expand Down
147 changes: 72 additions & 75 deletions pages/claim/[type]/[code].tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { UserPropsContext } from '../../../src/features/common/Layout/UserPropsC
import { ErrorHandlingContext } from '../../../src/features/common/Layout/ErrorHandlingContext';
import ShareOptions from '../../../src/features/common/ShareOptions/ShareOptions';
import { styled } from '@mui/material';
import CancelIcon from '../../../public/assets/images/icons/CancelIcon';

const { useTranslation } = i18next;

Expand Down Expand Up @@ -87,27 +88,26 @@ function ClaimDonation({}: Props): ReactElement {
}
}, [router]);

async function validateCode(code: any, type: any) {
async function redeemCode(code: string) {
setIsUploadingData(true);
const submitData = {
type: type,
// type: type,
code: code,
};
if (contextLoaded && user) {
const userLang = localStorage.getItem('language') || 'en';
postAuthenticatedRequest(
`/api/v1.3/${userLang}/validateCode`,
`/app/redeem`,
submitData,
token,
handleError
).then((res) => {
if (res.code === 401) {
setErrorMessage(res.message);
if (res.error_code === 'already_redeemed') {
setErrorMessage(t('redeem:alreadyRedeemed'));
setIsUploadingData(false);
} else if (res.status === 'error') {
setErrorMessage(res.errorText || t('me:wentWrong'));
} else if (res.error_code === 'invalid_code') {
setErrorMessage(t('redeem:invalidCode'));
setIsUploadingData(false);
} else if (res.status === 'success') {
} else if (res.status === 'redeemed') {
setCodeValidated(true);
setValidCodeData(res);
setIsUploadingData(false);
Expand All @@ -125,8 +125,8 @@ function ClaimDonation({}: Props): ReactElement {
// From here user can go back to home by clicking X
if (contextLoaded && user) {
// validate code
if (routerReady && code && type) {
validateCode(code, type);
if (routerReady && code) {
redeemCode(code);
}
}

Expand All @@ -145,34 +145,34 @@ function ClaimDonation({}: Props): ReactElement {
}
}, [contextLoaded, user, code]);

async function redeemCode(code: any, type: any) {
setIsUploadingData(true);
const submitData = {
type: type,
code: code,
};
if (contextLoaded && user) {
const userLang = localStorage.getItem('language') || 'en';
postAuthenticatedRequest(
`/api/v1.3/${userLang}/convertCode`,
submitData,
token,
handleError
).then((res) => {
if (res.code === 401) {
setErrorMessage(res.message);
setIsUploadingData(false);
} else if (!res.response || res.response.status === 'error') {
setErrorMessage(res.errorText || t('me:wentWrong'));
setIsUploadingData(false);
} else if (res.response.status === 'success') {
setCodeRedeemed(true);
setIsUploadingData(false);
setCodeValidated(false);
}
});
}
}
// async function redeemCode(code: any, type: any) {
// setIsUploadingData(true);
// const submitData = {
// type: type,
// code: code,
// };
// if (contextLoaded && user) {
// const userLang = localStorage.getItem('language') || 'en';
// postAuthenticatedRequest(
// `/api/v1.3/${userLang}/convertCode`,
// submitData,
// token,
// handleError
// ).then((res) => {
// if (res.code === 401) {
// setErrorMessage(res.message);
// setIsUploadingData(false);
// } else if (!res.response || res.response.status === 'error') {
// setErrorMessage(res.errorText || t('me:wentWrong'));
// setIsUploadingData(false);
// } else if (res.response.status === 'success') {
// setCodeRedeemed(true);
// setIsUploadingData(false);
// setCodeValidated(false);
// }
// });
// }
// }

const closeRedeem = () => {
setCodeValidated(false);
Expand Down Expand Up @@ -288,61 +288,58 @@ function ClaimDonation({}: Props): ReactElement {
<div className={styles.modal}>
{codeValidated && validCodeData ? (
<>
{errorMessage && (
<span className={styles.formErrors}>{errorMessage}</span>
)}
<div style={{ position: 'relative', left: '108px' }}>
<button className={styles.crossButton}>
<CancelIcon />
</button>
</div>

<div className={styles.codeTreeCount}>
{getFormattedNumber(
i18n.language,
Number(validCodeData.treeCount)
Number(validCodeData.units)
)}
<span>
{t('common:tree', {
count: Number(validCodeData.treeCount),
count: Number(validCodeData.units),
})}
</span>
</div>

{validCodeData.tpos?.length > 0 && (
<div className={styles.plantedBy}>
<span>{t('common:plantedBy')}</span>
<p>{validCodeData.tpos[0].tpoName}</p>
</div>
)}

<div
onClick={() => redeemCode(code, type)}
className="primaryButton"
style={{ maxWidth: '200px', marginTop: '24px' }}
>
{isUploadingData ? (
<div className={styles.spinner}></div>
) : (
t('redeem:addToMyTrees')
)}
<div className={styles.codeTreeCount}>
<span>{t('redeem:successfullyRedeemed')}</span>
</div>
</>
) : (
<>
<div>
{t('redeem:validating')} {code}
<div style={{ position: 'relative', left: '108px' }}>
<button className={styles.crossButton} onClick={closeRedeem}>
<CancelIcon />
</button>
</div>
{errorMessage ? (
<div style={{ fontWeight: 'bold' }}>{code}</div>
) : (
<div style={{ fontWeight: 'bold' }}>
{t('redeem:redeeming')} {code}
</div>
)}

{errorMessage && (
{errorMessage ? (
<span className={styles.formErrors}>{errorMessage}</span>
) : (
<div
onClick={() => redeemCode(code)}
className="primaryButton"
style={{ maxWidth: '200px', marginTop: '24px' }}
>
{isUploadingData ? (
<div className={styles.spinner}></div>
) : (
t('redeem:redeemCode')
)}
</div>
)}
<div
onClick={() => validateCode(code, type)}
className="primaryButton"
style={{ maxWidth: '200px', marginTop: '24px' }}
>
{isUploadingData ? (
<div className={styles.spinner}></div>
) : (
t('redeem:validateCode')
)}
</div>
</>
)}
</div>
Expand Down
11 changes: 9 additions & 2 deletions public/static/locales/en/redeem.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,13 @@
"addToMyTrees": "Add to my trees",
"validateCode": "Validate Code",
"enterRedeemCode": "Please enter a code to redeem",
"validating": "Validating",
"invalidType": "Invalid type, please check the link again"
"invalidType": "Invalid type, please check the link again",
"successfullyRedeemed": "Successfully Redeemed",
"exitToProfile": "Exit to Profile",
"redeemCode": "Redeem Code",
"alreadyRedeemed": "The code has already been redeemed",
"invalidCode": "This code is invalid",
"redeemAnotherCode": "Redeem Another Code",
"redeeming": "Redeeming:"
}

19 changes: 2 additions & 17 deletions src/features/common/Layout/Footer/index.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
import React, { useEffect, useState } from 'react';
import AppleIcon from '../../../../../public/assets/images/footer/AppStore';
import GooglePlayIcon from '../../../../../public/assets/images/footer/GooglePlay';
import React, { ReactElement, useEffect, useState } from 'react';
import UNEPLogo from '../../../../../public/assets/images/footer/UNEPLogo';
import World from '../../../../../public/assets/images/footer/World';
import getLanguageName from '../../../../utils/language/getLanguageName';
Expand All @@ -15,7 +13,7 @@ import DarkModeSwitch from '../DarkModeSwitch.tsx';
const { useTranslation } = i18next;

// let styles = require('./Footer.module.css');
export default function Footer() {
export default function Footer(): ReactElement | null {
const { t, i18n, ready } = useTranslation(['common']);
const config = tenantConfig();

Expand Down Expand Up @@ -118,19 +116,6 @@ export default function Footer() {
{`${getLanguageName(language)} · ${selectedCurrency}`}
</p>
</button>
<a href="https://play.google.com/store/apps/details?id=org.pftp">
<button id={'googleIcon'} className={styles.footer_button}>
<GooglePlayIcon />
<p className={styles.selected_language_bold}>Google Play</p>
</button>
</a>
<a href="https://apps.apple.com/us/app/plant-for-the-planet/id1444740626">
<button id={'appleIcon'} className={styles.footer_button}>
<AppleIcon />
<p className={styles.selected_language_bold}>App Store</p>
</button>
</a>

<div className={styles.footer_social_container}>
<button id={'facebookIcon'}>
<a
Expand Down
11 changes: 10 additions & 1 deletion src/features/common/Layout/ProjectPropsContext.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import React, { ReactElement } from 'react';
import { ParamsContext } from './QueryParamsContext';

interface Props {}

Expand Down Expand Up @@ -109,6 +110,7 @@ function ProjectPropsProvider({ children }: any): ReactElement {
const [filtersOpen, setFilterOpen] = React.useState(false);
const [purpose, setPurpose] = React.useState('trees');
const [plantLocationsLoaded, setPlantLocationsLoaded] = React.useState(false);
const { embed, showProjectList } = React.useContext(ParamsContext);

const mapRef = React.useRef(null);
const EMPTY_STYLE = {
Expand All @@ -123,7 +125,14 @@ function ProjectPropsProvider({ children }: any): ReactElement {
minZoom: 1,
maxZoom: 25,
});
const defaultMapCenter = isMobile ? [22.54, 9.59] : [36.96, -28.5];
const isEmbed = embed === 'true' && showProjectList === 'false';
const defaultMapCenter = isMobile
? isEmbed
? [22.54, 0]
: [22.54, 9.59]
: isEmbed
? [36.96, 0]
: [36.96, -28.5];
const defaultZoom = isMobile ? 1 : 1.4;
const [viewport, setViewPort] = React.useState({
width: Number('100%'),
Expand Down
55 changes: 28 additions & 27 deletions src/features/common/Layout/UserPropsContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -51,36 +51,37 @@ function UserPropsProvider({ children }: any): ReactElement {
logout({ returnTo: returnUrl });
};

React.useEffect(() => {
async function loadUser() {
setContextLoaded(false);
try {
const res = await getAccountInfo(token);
if (res.status === 200) {
const resJson = await res.json();
setUser(resJson);
} else if (res.status === 303) {
// if 303 -> user doesn not exist in db
setUser(null);
if (typeof window !== 'undefined') {
router.push('/complete-signup', undefined, { shallow: true });
}
} else if (res.status === 401) {
// in case of 401 - invalid token: signIn()
setUser(false);
setToken(null);
loginWithRedirect({
redirectUri: `${process.env.NEXTAUTH_URL}/login`,
ui_locales: localStorage.getItem('language') || 'en',
});
} else {
// any other error
async function loadUser() {
setContextLoaded(false);
try {
const res = await getAccountInfo(token);
if (res.status === 200) {
const resJson = await res.json();
setUser(resJson);
} else if (res.status === 303) {
// if 303 -> user doesn not exist in db
setUser(null);
if (typeof window !== 'undefined') {
router.push('/complete-signup', undefined, { shallow: true });
}
} catch (err) {
console.log(err);
} else if (res.status === 401) {
// in case of 401 - invalid token: signIn()
setUser(false);
setToken(null);
loginWithRedirect({
redirectUri: `${process.env.NEXTAUTH_URL}/login`,
ui_locales: localStorage.getItem('language') || 'en',
});
} else {
// any other error
}
setContextLoaded(true);
} catch (err) {
console.log(err);
}
setContextLoaded(true);
}

React.useEffect(() => {
if (token) loadUser();
}, [token]);

Expand Down
13 changes: 12 additions & 1 deletion src/features/projects/components/ProjectsMap.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ export default function ProjectsMap(): ReactElement {
} = React.useContext(ProjectPropsContext);

const { t } = useTranslation(['maps']);
const { embed } = React.useContext(ParamsContext);
const { embed, showProjectList } = React.useContext(ParamsContext);
//Map
const _onStateChange = (state: any) => setMapState({ ...state });
const _onViewportChange = (view: any) => setViewPort({ ...view });
Expand Down Expand Up @@ -161,6 +161,17 @@ export default function ProjectsMap(): ReactElement {
}
}, [zoomLevel]);

React.useEffect(() => {
if (embed === 'true' && showProjectList === 'false') {
const newViewport = {
...viewport,
latitude: 36.96,
longitude: 0,
};
setViewPort(newViewport);
}
}, [showProjectList]);

return (
<div
className={
Expand Down
Loading