Skip to content

Commit

Permalink
Merge branch 'develop' into 426_Empty_card
Browse files Browse the repository at this point in the history
  • Loading branch information
javpet committed Nov 15, 2019
2 parents 37e1677 + a48deb2 commit af677f0
Show file tree
Hide file tree
Showing 12 changed files with 302 additions and 164 deletions.
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,17 @@ npm install -g yarn
```
yarn
```
### Setting up with the backend
The [backend](https://github.com/AgileVentures/sing_for_needs) is currently [deployed](https://sing-for-needs.gigalixirapp.com/graphiql) on [gigalixir](https://gigalixir.com/) to enable Front end developers ease of setup. To get set up with the deployed backend:
- Create a `.env.local` file in the root of the app you just cloned
- Add the following
```
REACT_APP_BASE_URL = 'http://localhost:4002'
REACT_APP_SFN_BACKEND = 'https://sing-for-needs.gigalixirapp.com/graphiql'
SKIP_PREFLIGHT_CHECK=true
```

Please note that the `REACT_APP_BASE_URL` variable is meant to be the base REST API endpoint for the application. Also you can choose to clone the [backend](https://github.com/AgileVentures/sing_for_needs) and get setup locally.

### Starting the development server

Expand Down
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@
"apollo-boost": "^0.4.4",
"apollo-cache-inmemory": "^1.6.3",
"axios": "^0.19.0",
"date-fns": "^2.7.0",
"graphql": "^14.5.8",
"lodash": "^4.17.15",
"moxios": "^0.4.0",
"node-sass": "^4.12.0",
"prop-types": "^15.7.2",
Expand Down
10 changes: 6 additions & 4 deletions src/components/Causes/CauseCard/CauseCard.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import React from 'react'
import PropTypes from 'prop-types'

const CauseCard = props => {
const progress = Math.floor((props.donatedAmount / props.targetAmount) * 100)
return (
<div className="cause-card">
<img
Expand All @@ -20,12 +21,12 @@ const CauseCard = props => {
</span>
<div className="cause-card-progress">
<div className="cause-card-progress-bar">
<div className="cause-card-progress-bar-active" />
<div className="cause-card-progress-bar-active" style={{ width: `${progress}%` }} />
</div>
<p>17% of $30,000</p>
<p>{progress}% of ${props.targetAmount}</p>
</div>
<p className="cause-card-days-to-go">
{props.daysToGo} more days to go
{props.daysToGo} to go
</p>
<button>Donate today</button>
<button className="text-link">Learn More</button>
Expand All @@ -37,8 +38,9 @@ const CauseCard = props => {
CauseCard.propTypes = {
causeName: PropTypes.string,
donatedAmount: PropTypes.number,
targetAmount: PropTypes.number,
numberOfDonors: PropTypes.number,
daysToGo: PropTypes.number,
daysToGo: PropTypes.string,
organization: PropTypes.string
}

Expand Down
2 changes: 1 addition & 1 deletion src/components/Causes/CauseCard/CauseCard.scss
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@
background-color: $primary-color-darkblue-lightest;

.cause-card-progress-bar-active {
width: 33%;
width: 0;
height: 100%;
background-color: $primary-color-accent;
}
Expand Down
8 changes: 5 additions & 3 deletions src/components/Causes/CauseCard/CauseCard.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@ describe('<CauseCard />', () => {
let causeCardWrapper

let props = {
key: 'Happy Fridays',
causeName: 'Happy Fridays',
donatedAmount: 2000,
targetAmount: 5000,
numberOfDonors: 5,
daysToGo: 31,
daysToGo: '31 days',
organization: 'HUMALUPA'
}

Expand Down Expand Up @@ -38,7 +40,7 @@ describe('<CauseCard />', () => {
expect(causeCardWrapper.find('div.cause-card-detail').length).toEqual(1)
})

it('contains the $5000 funds raised', () => {
it('contains the $2000 funds raised', () => {
expect(causeCardWrapper.find('h4.cause-card-funds').text()).toEqual(
'$2000'
)
Expand All @@ -52,7 +54,7 @@ describe('<CauseCard />', () => {

it('contains the amount of time remaining from the campaign', () => {
expect(causeCardWrapper.find('p.cause-card-days-to-go').text()).toEqual(
'31 more days to go'
'31 days to go'
)
})

Expand Down
105 changes: 91 additions & 14 deletions src/containers/Causes/CampaignsEndingSoon/CampaignEndingSoon.test.js
Original file line number Diff line number Diff line change
@@ -1,24 +1,101 @@
import React from 'react'
import CampaignsEndingSoon from './CampaignsEndingSoon'
import { shallow } from 'enzyme'
import { mount } from 'enzyme'
import { MockedProvider } from '@apollo/react-testing'
import { act } from 'react-dom/test-utils'
import { MemoryRouter as Router } from 'react-router-dom'
import CampaignsEndingSoon, { GET_CAUSES_ENDING_SOON_QUERY } from './CampaignsEndingSoon'

describe('<CampaignsEndingSoon />', () => {
let campaignsEndingSoonWrapper
beforeEach(() => {
campaignsEndingSoonWrapper = shallow(<CampaignsEndingSoon />)
async function mountMockedProvider(result) {
const mocks = [
{
request: {
query: GET_CAUSES_ENDING_SOON_QUERY,
variables: { 'scope': 'ending_soon' }
},
result
}
]
jest.useFakeTimers()
const component = mount(
<MockedProvider
mocks={mocks}
addTypename={false}
>
<Router>
<CampaignsEndingSoon />
</Router>
</MockedProvider>)
act(() => {
jest.runAllTimers()
})
component.update()
return component
}

it("has 'Campaign Ending Soon' title", () => {
expect(campaignsEndingSoonWrapper.find('h3').text()).toEqual(
'Campaigns ending soon'
)
describe('<CampaignsEndingSoon />', () => {
let campaignsEndingSoonWrapper, data
beforeEach(async() => {
data = {
'data': {
'causes': [
{
amountRaised: 5000,
endDate: new Date('2019-12-12'),
id: 3,
name: 'Awesome Cause 1',
targetAmount: 1000
},
{
amountRaised: 5000,
endDate: new Date('2019-12-18'),
id: 4,
name: 'Awesome Cause 2',
targetAmount: 1000
}
]
}
}
campaignsEndingSoonWrapper = await mountMockedProvider(data)
})

it('has 2 campaign cards that end soon showing underneath', () => {
expect(campaignsEndingSoonWrapper.find('CauseCard').length).toEqual(2)
describe('data resolves with no error', () => {
it("has 'Campaign Ending Soon' title", () => {
expect(campaignsEndingSoonWrapper.find('h3').text()).toEqual(
'Campaigns ending soon'
)
})

it('has 2 campaign cards that end soon showing underneath', () => {
expect(campaignsEndingSoonWrapper.find('CauseCard').length).toEqual(2)
})

it('has link to navigate to all ending causes', () => {
expect(campaignsEndingSoonWrapper.find('NavLink').length).toEqual(1)
})

describe('CauseCard', () => {
it('has two cause cards cause card', () => {
expect(campaignsEndingSoonWrapper.find('CauseCard').length).toEqual(2)
})

it('first cause card has correct cause name', () => {
expect(campaignsEndingSoonWrapper.find('CauseCard').at(0).find('.cause-card-name').text()).toEqual('Awesome Cause 1')
})

it('second cause card has correct cause name', () => {
expect(campaignsEndingSoonWrapper.find('CauseCard').at(1).find('.cause-card-name').text()).toEqual('Awesome Cause 2')
})
})
})

it('has link to navigate to all ending causes', () => {
expect(campaignsEndingSoonWrapper.find('NavLink').length).toEqual(1)
describe('data resolved with error', () => {
let result
beforeEach(async () => {
result = { error: new Error('aw shucks') }
campaignsEndingSoonWrapper = await mountMockedProvider(result)
})
it('displays error div', () => {
expect(campaignsEndingSoonWrapper.find('div').text()).toEqual('Error')
})
})
})
73 changes: 49 additions & 24 deletions src/containers/Causes/CampaignsEndingSoon/CampaignsEndingSoon.js
Original file line number Diff line number Diff line change
@@ -1,34 +1,59 @@
import React, { Component } from 'react'
import { NavLink } from 'react-router-dom'
import gql from 'graphql-tag'
import { Query } from 'react-apollo'
import CauseCard from '../../../components/Causes/CauseCard/CauseCard'

export const GET_CAUSES_ENDING_SOON_QUERY = gql`
query getCausesEndingSoon($scope: String) {
causes(scope: $scope) {
id
name
amountRaised
targetAmount
endDate
}
}
`

class CampaignsEndingSoon extends Component {
render() {
return (
<div className="campaigns_ending_soon-container">
<h3 className="campaigns_ending_soon-title white">
Campaigns ending soon
</h3>
<div className="cause-cards">
<CauseCard
causeName="Go Blue on World Children's Day"
donatedAmount={3000}
numberOfDonors={23}
daysToGo={12}
organization="UNICEF"
/>
<CauseCard
causeName="Go Blue on World Children's Day"
donatedAmount={5000}
numberOfDonors={12}
daysToGo={45}
organization="UNICEF"
/>
</div>
<NavLink activeClassName="nav__item--selected" to="/causes?q=ending">
See all ending causes
</NavLink>
</div>
<Query query={GET_CAUSES_ENDING_SOON_QUERY} variables={{ scope: 'ending_soon' }}>
{({ data, error, loading }) => {
if (loading) {
return <div className="white">loading</div>
}
if (error) {
return <div>Error</div>
}
return (
<React.Fragment>
<div className="campaigns_ending_soon-container">
<h3 className="campaigns_ending_soon-title white">
Campaigns ending soon
</h3>
<div className="cause-cards">

{ data.causes.map(cause => {
return <CauseCard
key={cause.id}
causeName={cause.name}
donatedAmount={cause.amountRaised}
numberOfDonors={12}
daysToGo={45}
organization="UNICEF"
/>
})}
</div>
<NavLink activeClassName="nav__item--selected" to="/causes?q=ending">
See all ending causes
</NavLink>
</div>
</React.Fragment>
)
}}
</Query>
)
}
}
Expand Down
41 changes: 9 additions & 32 deletions src/containers/Causes/Causes.js
Original file line number Diff line number Diff line change
@@ -1,44 +1,21 @@
import React, { Component } from 'react'
import { Query } from 'react-apollo'
import gql from 'graphql-tag'
import TrendingCauses from './TrendingCauses/TrendingCauses'
import CampaignsEndingSoon from './CampaignsEndingSoon/CampaignsEndingSoon'
import ExploreCauses from './ExploreCauses/ExploreCauses'
import Banner from '../../components/Shared/Banner/Banner'

export const GET_CAUSES_QUERY = gql`
query getCauses {
causes {
name
amountRaised
sponsor
}
}
`
class Causes extends Component {
render() {
return (
<Query query={GET_CAUSES_QUERY}>
{({ data, error, loading }) => {
if (loading) {
return <div className="white">loading</div>
}
if (error) {
return <div>Error</div>
}
return (
<React.Fragment>
<TrendingCauses causes={data.causes} />
<CampaignsEndingSoon />
<ExploreCauses />
<Banner
headline="You can make a difference today"
buttonLabel="Sign up now"
/>
</React.Fragment>
)
}}
</Query>
<React.Fragment>
<TrendingCauses />
<CampaignsEndingSoon />
<ExploreCauses />
<Banner
headline="You can make a difference today"
buttonLabel="Sign up now"
/>
</React.Fragment>
)
}
}
Expand Down

0 comments on commit af677f0

Please sign in to comment.