diff --git a/src/__tests__/pages/index.test.js b/src/__tests__/pages/index.test.js index e16f9ea2..abd13256 100644 --- a/src/__tests__/pages/index.test.js +++ b/src/__tests__/pages/index.test.js @@ -1651,6 +1651,7 @@ describe('index.js: hardcoded notifications', () => { id: 'abcd', dollarProgress: 28e5, dollarProgressFromSearch: 14e5, + dollarProgressFromShop: 0, dollarGoal: 5e6, impactMetric: { impactTitle: @@ -1689,6 +1690,7 @@ describe('index.js: hardcoded notifications', () => { id: 'abcd', dollarProgress: 28e5, dollarProgressFromSearch: 14e5, + dollarProgressFromShop: 0, dollarGoal: 5e6, impactMetric: { impactTitle: @@ -1737,6 +1739,7 @@ describe('index.js: hardcoded notifications', () => { id: 'abcd', dollarProgress: 28e5, dollarProgressFromSearch: 14e5, + dollarProgressFromShop: 0, dollarGoal: 5e6, impactMetric: { impactTitle: diff --git a/src/components/groupImpactComponents/GroupImpact.js b/src/components/groupImpactComponents/GroupImpact.js index de291171..f10b8939 100644 --- a/src/components/groupImpactComponents/GroupImpact.js +++ b/src/components/groupImpactComponents/GroupImpact.js @@ -58,8 +58,13 @@ const GroupImpact = ({ user }) => { GROUP_IMPACT_SIDEBAR_STATE.NORMAL ) const [sidebarOpen, setSidebarOpen] = useState(false) - const { id, dollarGoal, dollarProgressFromSearch, impactMetric } = - groupImpactMetric + const { + id, + dollarGoal, + dollarProgressFromSearch, + dollarProgressFromShop, + impactMetric, + } = groupImpactMetric const { impactTitle, impactCountPerMetric, whyValuableDescription } = impactMetric @@ -87,6 +92,7 @@ const GroupImpact = ({ user }) => { id, dollarProgress: dollarGoal, dollarProgressFromSearch, + dollarProgressFromShop, dollarGoal, impactMetric: { impactTitle, @@ -104,6 +110,7 @@ const GroupImpact = ({ user }) => { id, dollarGoal, dollarProgressFromSearch, + dollarProgressFromShop, impactTitle, whyValuableDescription, ]) @@ -209,6 +216,7 @@ GroupImpact.propTypes = { id: PropTypes.string.isRequired, dollarProgress: PropTypes.number.isRequired, dollarProgressFromSearch: PropTypes.number.isRequired, + dollarProgressFromShop: PropTypes.number.isRequired, dollarGoal: PropTypes.number.isRequired, impactMetric: PropTypes.shape({ impactTitle: PropTypes.string.isRequired, @@ -254,6 +262,7 @@ GroupImpactWrapper.propTypes = { id: PropTypes.string.isRequired, dollarProgress: PropTypes.number.isRequired, dollarProgressFromSearch: PropTypes.number.isRequired, + dollarProgressFromShop: PropTypes.number.isRequired, dollarGoal: PropTypes.number.isRequired, impactMetric: PropTypes.shape({ impactTitle: PropTypes.string.isRequired, diff --git a/src/components/groupImpactComponents/GroupImpactContainer.js b/src/components/groupImpactComponents/GroupImpactContainer.js index a3df758b..483fff40 100644 --- a/src/components/groupImpactComponents/GroupImpactContainer.js +++ b/src/components/groupImpactComponents/GroupImpactContainer.js @@ -10,6 +10,7 @@ export default createFragmentContainer(GroupImpact, { id dollarProgress dollarProgressFromSearch + dollarProgressFromShop dollarGoal impactMetric { impactTitle diff --git a/src/components/groupImpactComponents/GroupImpactSidebar.js b/src/components/groupImpactComponents/GroupImpactSidebar.js index 10473400..729ec736 100644 --- a/src/components/groupImpactComponents/GroupImpactSidebar.js +++ b/src/components/groupImpactComponents/GroupImpactSidebar.js @@ -26,6 +26,7 @@ import { windowOpenTop } from 'src/utils/navigation' import { lighten } from '@material-ui/core' import Handlebars from 'handlebars' import defaultTheme from 'src/utils/theme' +import ShoppingCartIcon from '@mui/icons-material/ShoppingCart' import SearchIcon from '@material-ui/icons/Search' import TabIcon from '@material-ui/icons/Tab' import ToggleButton from '@material-ui/lab/ToggleButton' @@ -253,17 +254,29 @@ const GroupImpactSidebar = ({ setSelectedMode(newValue) event.stopPropagation() } - const { dollarProgress, dollarGoal, dollarProgressFromSearch, impactMetric } = - displayingOldGoal ? lastGroupImpactMetric : groupImpactMetric + const { + dollarProgress, + dollarGoal, + dollarProgressFromSearch, + dollarProgressFromShop, + impactMetric, + } = displayingOldGoal ? lastGroupImpactMetric : groupImpactMetric const { impactTitle, whyValuableDescription, impactCountPerMetric } = impactMetric const classes = useStyles() + const searchDollarProgress = dollarProgressFromSearch && Math.max( Math.min(Math.floor(100 * (dollarProgressFromSearch / dollarGoal)), 100), 1 ) + const shopDollarProgress = + dollarProgressFromShop && + Math.max( + Math.min(Math.floor(100 * (dollarProgressFromShop / dollarGoal)), 100), + 1 + ) const searchDisplayProgress = dollarProgressFromSearch && Math.min( @@ -276,9 +289,18 @@ const GroupImpactSidebar = ({ ), 92 ) + const shopDisplayProgress = + dollarProgressFromShop && + Math.min( + Math.max( + Math.min(Math.floor(100 * (dollarProgressFromShop / dollarGoal)), 100), + 8 + ), + 92 + ) const totalDisplayProgress = Math.max( Math.min(Math.floor(100 * (dollarProgress / dollarGoal)), 100), - (searchDisplayProgress || 0) + 8 + (searchDisplayProgress || 0) + (shopDisplayProgress || 0) + 8 ) const totalProgress = Math.max( Math.min(Math.floor(100 * (dollarProgress / dollarGoal)), 100), @@ -377,8 +399,12 @@ const GroupImpactSidebar = ({
, ] + searchDisplayProgress || shopDisplayProgress + ? [, , ] : [] } tooltips={[ `${ - totalProgress - searchDollarProgress + totalProgress - searchDollarProgress - shopDollarProgress }% of funds raised by tabs opened through Tab for a Cause`, `${searchDollarProgress}% of funds raised by searches through Search for a Cause`, + `${shopDollarProgress}% of funds raised by shopping through Shop for a Cause`, ]} />
@@ -578,12 +606,13 @@ const GroupImpactSidebar = ({ ({ id: 'abcd', dollarProgress: 250, dollarProgressFromSearch: 125, + dollarProgressFromShop: 0, dollarGoal: 600, impactMetric: { impactTitle: 'impact-title', @@ -76,6 +77,7 @@ describe('GroupImpact component', () => { id: 'bcde', dollarProgress: 28e5, dollarProgressFromSearch: 125, + dollarProgressFromShop: 0, dollarGoal: 5e6, impactMetric: { impactTitle: 'Provide 1 home visit from a community health worker', @@ -99,6 +101,7 @@ describe('GroupImpact component', () => { id: 'bcde', dollarProgress: 28e5, dollarProgressFromSearch: 125, + dollarProgressFromShop: 0, dollarGoal: 5e6, impactMetric: { impactTitle: 'Provide 1 home visit from a community health worker', @@ -122,6 +125,7 @@ describe('GroupImpact component', () => { id: 'abcd', dollarProgress: 28e5, dollarProgressFromSearch: 125, + dollarProgressFromShop: 0, dollarGoal: 5e6, impactMetric: { impactTitle: 'Provide 1 home visit from a community health worker', @@ -144,6 +148,7 @@ describe('GroupImpact component', () => { id: 'bcde', dollarProgress: 28e5, dollarProgressFromSearch: 125, + dollarProgressFromShop: 0, dollarGoal: 5e6, impactMetric: { impactTitle: 'Provide 1 home visit from a community health worker', @@ -177,6 +182,7 @@ describe('GroupImpact component', () => { id: 'bcde', dollarProgress: 28e5, dollarProgressFromSearch: 125, + dollarProgressFromShop: 0, dollarGoal: 5e6, impactMetric: { impactTitle: 'Provide 1 home visit from a community health worker', @@ -285,6 +291,7 @@ describe('GroupImpact component', () => { id: 'bcde', dollarProgress: 28e5, dollarProgressFromSearch: 125, + dollarProgressFromShop: 0, dollarGoal: 5e6, impactMetric: { impactTitle: 'Provide 1 home visit from a community health worker', @@ -322,6 +329,7 @@ describe('GroupImpact component', () => { id: 'bcde', dollarProgress: 28e5, dollarProgressFromSearch: 125, + dollarProgressFromShop: 0, dollarGoal: 5e6, impactMetric: { impactTitle: 'Provide 1 home visit from a community health worker', diff --git a/src/components/groupImpactComponents/__tests__/GroupImpactSidebar.test.js b/src/components/groupImpactComponents/__tests__/GroupImpactSidebar.test.js index dde86e22..efbdde91 100644 --- a/src/components/groupImpactComponents/__tests__/GroupImpactSidebar.test.js +++ b/src/components/groupImpactComponents/__tests__/GroupImpactSidebar.test.js @@ -12,6 +12,7 @@ import { shopLandingURL } from 'src/utils/urls' import { windowOpenTop } from 'src/utils/navigation' import SearchIcon from '@material-ui/icons/Search' import TabIcon from '@material-ui/icons/Tab' +import ShoppingCartIcon from '@mui/icons-material/ShoppingCart' import GroupImpactLeaderboard from '../GroupImpactLeaderboard' jest.mock('ga-gtag') @@ -119,6 +120,7 @@ describe('GroupImpactSidebar component', () => { groupImpactMetric: { dollarProgress: 250, dollarProgressFromSearch: 100, + dollarProgressFromShop: 0, dollarGoal: 600, impactMetric: { impactTitle: 'impact-title', @@ -147,16 +149,23 @@ describe('GroupImpactSidebar component', () => { (mockProps.groupImpactMetric.dollarProgressFromSearch / mockProps.groupImpactMetric.dollarGoal) ), + Math.floor( + 100 * + (mockProps.groupImpactMetric.dollarProgressFromShop / + mockProps.groupImpactMetric.dollarGoal) + ), ]) expect(wrapper.find(VerticalLinearProgress).first().prop('icons')).toEqual([ , , + , ]) expect( wrapper.find(VerticalLinearProgress).first().prop('tooltips') ).toEqual([ `25% of funds raised by tabs opened through Tab for a Cause`, `16% of funds raised by searches through Search for a Cause`, + `0% of funds raised by shopping through Shop for a Cause`, ]) expect(wrapper.find(VerticalLinearProgress).at(1).prop('progress')).toEqual( [ @@ -170,6 +179,7 @@ describe('GroupImpactSidebar component', () => { (mockProps.groupImpactMetric.dollarProgressFromSearch / mockProps.groupImpactMetric.dollarGoal) ), + 0, ] ) }) @@ -182,6 +192,7 @@ describe('GroupImpactSidebar component', () => { groupImpactMetric: { dollarProgress: 650, dollarProgressFromSearch: 100, + dollarProgressFromShop: 0, dollarGoal: 600, impactMetric: { impactTitle: 'impact-title', @@ -193,19 +204,21 @@ describe('GroupImpactSidebar component', () => { expect(wrapper.find(Typography).at(2).text()).toEqual('108%') expect( wrapper.find(VerticalLinearProgress).first().prop('progress') - ).toEqual([100, 16]) + ).toEqual([100, 16, 0]) expect(wrapper.find(VerticalLinearProgress).first().prop('icons')).toEqual([ , , + , ]) expect( wrapper.find(VerticalLinearProgress).first().prop('tooltips') ).toEqual([ `84% of funds raised by tabs opened through Tab for a Cause`, `16% of funds raised by searches through Search for a Cause`, + `0% of funds raised by shopping through Shop for a Cause`, ]) expect(wrapper.find(VerticalLinearProgress).at(1).prop('progress')).toEqual( - [100, 16] + [100, 16, 0] ) }) @@ -217,6 +230,7 @@ describe('GroupImpactSidebar component', () => { groupImpactMetric: { dollarProgress: 20, dollarProgressFromSearch: 6, + dollarProgressFromShop: 0, dollarGoal: 600, impactMetric: { impactTitle: 'impact-title', @@ -234,19 +248,21 @@ describe('GroupImpactSidebar component', () => { ) expect( wrapper.find(VerticalLinearProgress).first().prop('progress') - ).toEqual([16, 8]) + ).toEqual([16, 8, 0]) expect(wrapper.find(VerticalLinearProgress).first().prop('icons')).toEqual([ , , + , ]) expect( wrapper.find(VerticalLinearProgress).first().prop('tooltips') ).toEqual([ `2% of funds raised by tabs opened through Tab for a Cause`, `1% of funds raised by searches through Search for a Cause`, + `0% of funds raised by shopping through Shop for a Cause`, ]) expect(wrapper.find(VerticalLinearProgress).at(1).prop('progress')).toEqual( - [3, 1] + [3, 1, 0] ) }) @@ -412,6 +428,7 @@ describe('GroupImpactSidebar component', () => { ...getMockProps(), groupImpactMetric: { dollarProgressFromSearch: 125, + dollarProgressFromShop: 0, dollarProgress: 250, dollarGoal: 600, impactMetric: { @@ -439,6 +456,7 @@ describe('GroupImpactSidebar component', () => { ...getMockProps(), groupImpactMetric: { dollarProgressFromSearch: 125, + dollarProgressFromShop: 0, dollarProgress: 250, dollarGoal: 600, impactMetric: { @@ -466,6 +484,7 @@ describe('GroupImpactSidebar component', () => { ...getMockProps(), groupImpactMetric: { dollarProgressFromSearch: 125, + dollarProgressFromShop: 0, dollarProgress: 250, dollarGoal: 600, impactMetric: { @@ -487,6 +506,7 @@ describe('GroupImpactSidebar component', () => { ...getMockProps(), groupImpactMetric: { dollarProgressFromSearch: 125, + dollarProgressFromShop: 0, dollarProgress: 250, dollarGoal: 600, impactMetric: { diff --git a/src/schema/schema.graphql b/src/schema/schema.graphql index 89ed2733..006905c2 100644 --- a/src/schema/schema.graphql +++ b/src/schema/schema.graphql @@ -498,6 +498,11 @@ type GroupImpactMetric implements Node { """ dollarProgressFromSearch: Int! + """ + The micro USD amount raised for this instance of GroupImpactMetric so far from shop + """ + dollarProgressFromShop: Int! + """ISO datetime string of when this GroupImpactMetric will expire""" dateExpires: String }