Skip to content

Commit

Permalink
Changed the items in the menu and added minor changes to the code
Browse files Browse the repository at this point in the history
novaisea committed May 13, 2021
1 parent 5cd4841 commit 9d4b5f9
Showing 9 changed files with 296 additions and 44 deletions.
17 changes: 17 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -9,6 +9,7 @@
"@testing-library/react": "^11.1.0",
"@testing-library/user-event": "^12.1.10",
"antd": "^4.7.3",
"axios": "^0.21.1",
"react": "^17.0.1",
"react-dom": "^17.0.1",
"react-router-dom": "^5.2.0",
6 changes: 6 additions & 0 deletions src/App.js
Original file line number Diff line number Diff line change
@@ -13,6 +13,9 @@ import Register from './components/register';
import Login from './components/login';
import Home from './components/home';
import Dog from './components/dog';
import NewDog from './components/newDog';
import EditDog from './components/editDog';
import Messages from './components/messages';
import Uploader from './components/upload';

import UserContext from './contexts/user';
@@ -74,6 +77,9 @@ class App extends React.Component {
<Route path="/login" children={<Login />} />
<Route path="/upload" children={<Uploader />} />
<Route path="/dog/:id" children={<Dog />} />
<Route path="/newdog" children={<NewDog />} />
<Route path="/edit/:id" component={EditDog} />
<Route path="/messages" children={<Messages />} />
<Route path="/" children={<Home />} exact />
</Switch>
</Content>
114 changes: 114 additions & 0 deletions src/components/editDog.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
import React from 'react';
import axios from 'axios';
import { withRouter } from "react-router";

import { Upload, Form, Input, Button, Typography } from 'antd';
const { Title } = Typography;
const { TextArea } = Input;

const formItemLayout = {
labelCol: { xs: { span: 24 }, sm: { span: 6 } },
wrapperCol: { xs: { span: 24 }, sm: { span: 12 } }
};

const tailFormItemLayout = {
wrapperCol: { xs: { span: 24, offset: 0 }, sm: { span: 16, offset: 6 } },
};

class EditDog extends React.Component {

constructor(props) {
super(props);
this.state = {
selectedFile: null
}

}

componentDidMount(){
this.setState({
dogID: this.props.match.params.id
})
}

handleBreedChange=event=>{
this.setState({
breed: event.target.value
})
}

handleAgeChange=event=>{
this.setState({
age: event.target.value
})
}

handleSizeChange=event=>{
this.setState({
size: event.target.value
})
}

handleDescriptionChange=event=>{
this.setState({
description: event.target.value
})
}

handleImageChange=event=>{
this.setState({
selectedFile: event.target.files[0],
loaded: 0,
})
}

onClickHandler = () => {
const data = new FormData()
if(this.state.selectedFile){data.append('upload', this.state.selectedFile)}
if(this.state.breed){data.append('breed', this.state.breed)}
if(this.state.age){data.append('age', this.state.age)}
if(this.state.size){data.append('size', this.state.size)}
if(this.state.description){data.append('description', this.state.description)}
axios.put(`https://animal-hello-3000.codio-box.uk/api/v1/dogs/${this.state.dogID}`, data, {
auth: {
username: 'daniel',
password: 'abc'
},
headers: {
'content-type': 'multipart/form-data'
}
})
.then(res => { // then print response status
console.log(res.statusText)
this.props.history.push('/')
})
}

render(){
return (
<Form {...formItemLayout}>
<Title level={2}> Edit dog</Title>
<Form.Item name="breed" label="Breed">
<Input onChange={this.handleBreedChange}/>
</Form.Item>
<Form.Item name="age" label="Age">
<Input onChange={this.handleAgeChange}/>
</Form.Item>
<Form.Item name="size" label="Size">
<Input onChange={this.handleSizeChange}/>
</Form.Item>
<Form.Item name="description" label="Description">
<TextArea rows={3} onChange={this.handleDescriptionChange}/>
</Form.Item >
<Form.Item label="Image">
<Input type="file" name="file" onChange={this.handleImageChange}/>
</Form.Item>
<Button type="button" onClick={this.onClickHandler}>Submit</Button>
</Form>
);
}

}


export default withRouter(EditDog);
15 changes: 11 additions & 4 deletions src/components/home.js
Original file line number Diff line number Diff line change
@@ -1,24 +1,31 @@
import React from 'react';
import React, { useState } from 'react';
import { PageHeader, Input } from 'antd';
import HomeGrid from './homegrid';

const { Search } = Input;

function Home(props) {

const [search, setSearch] = useState(undefined);

function searchHandler(value) {
console.log("setting query")
setSearch(value)
}

return (
<div className="site-layout-content">
<div style={{ padding: '2% 20%' }}>
<Search placeholder="input search text"
<Search placeholder="Search dogs"
allowClear
enterButton="Search"
size="large"
onSearch={String}/>
onSearch={searchHandler}/>
<PageHeader className="site-page-header"
title="Dog Shelter"
subTitle="Welcome to the website where you will find your new friend!"/>
</div>
<HomeGrid />
<HomeGrid key={search} query={search}/>
</div>
);
}
27 changes: 19 additions & 8 deletions src/components/homegrid.js
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@ import React from 'react';
import { Col, Row } from 'antd';
import DogCard from './dogcard';
import { status, json } from '../utilities/requestHandlers';
import { withRouter } from 'react-router-dom';

class HomeGrid extends React.Component {

@@ -11,22 +12,32 @@ class HomeGrid extends React.Component {
dogs: []
}
}

componentDidMount() {
fetch('https://animal-hello-3000.codio-box.uk/api/v1/dogs')

componentDidMount() {
let url = "https://animal-hello-3000.codio-box.uk/api/v1/dogs"
if (this.props.query) {url = `https://animal-hello-3000.codio-box.uk/api/v1/dogs?query=${this.props.query}`}
console.log(url)
fetch(url)
.then(status)
.then(json)
.then(data => {
this.setState({ dogs: data })
})
.catch(err => console.log("Error fetching dogs"));
.catch(err => {
console.log("Error fetching dogs")
this.setState({ found: false})

});
}

render() {
if (!this.state.dogs.length) {
return <h3>Loading dogs...</h3>
if(!this.state.found){
return <h3>No dogs were found. Refresh the page or check your connection!</h3>
}
return <h4>Loading dogs...</h4>
}
const cardList = this.state.dogs.map(dog => {
const dogList = this.state.dogs.map(dog => {
return (
<div style={{padding:"10px"}} key={dog.ID}>
<Col span={6}>
@@ -37,10 +48,10 @@ class HomeGrid extends React.Component {
});
return (
<Row type="flex" justify="space-around">
{cardList}
{dogList}
</Row>
);
}
}

export default HomeGrid;
export default withRouter(HomeGrid);
11 changes: 11 additions & 0 deletions src/components/messages.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import React from 'react';

function Messages(props) {
return (
<>
<p>This is where the messages page is displayed</p>
</>
);
}

export default Messages;
44 changes: 12 additions & 32 deletions src/components/nav.js
Original file line number Diff line number Diff line change
@@ -6,39 +6,19 @@ import UserContext from '../contexts/user';

function Nav(props) {
const context = useContext(UserContext);
const loggedIn = context.user.loggedIn;
console.log(context);
let LoginNav;
if (!loggedIn) {
LoginNav = (
<>
<Menu.Item key="2">
<Link to="/register">Register</Link>
</Menu.Item>
<Menu.Item key="3">
<Link to="/login">Login</Link>
</Menu.Item>
</>
)
} else {
LoginNav = (
<>
<Menu.Item key="2"><Link to="/account">Account</Link></Menu.Item>
<Menu.Item key="3" onClick={context.logout}>
<Link to="/">Logout</Link>
</Menu.Item>
</>
)
}
return (
<>
<div className="logo" />
<Menu theme="dark" mode="horizontal" defaultSelectedKeys={['1']}>
<Menu.Item key="1"><Link to="/">Home</Link></Menu.Item>
{LoginNav}
<Menu.Item key="4"><Link to="/upload">Upload</Link></Menu.Item>
</Menu>
</>
<>
<div className="logo" />
<Menu theme="dark" mode="horizontal" defaultSelectedKeys={['1']}>
<Menu.Item key="1"><Link to="/">Home</Link></Menu.Item>
<Menu.Item key="2" disabled={context.user.loggedIn}><Link to="/login">Login</Link></Menu.Item>
<Menu.Item key="3" disabled={context.user.loggedIn}><Link to="/register">Register</Link></Menu.Item>
<Menu.Item key="4" disabled={!context.user.loggedIn}><Link to="/messages">Messages</Link></Menu.Item>
<Menu.Item key="5" disabled={!context.user.loggedIn}><Link to="/account">Account</Link></Menu.Item>
<Menu.Item key="6" disabled={context.user.role!=='admin'}><Link to="/newdog">Add Dog</Link></Menu.Item>
<Menu.Item key="7" disabled={!context.user.loggedIn} onClick={context.logout}> <Link to="/">Logout</Link></Menu.Item>
</Menu>
</>
);
}

105 changes: 105 additions & 0 deletions src/components/newDog.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
import React from 'react';
import axios from 'axios';

import { Upload, Form, Input, Button, Typography } from 'antd';
const { Title } = Typography;
const { TextArea } = Input;

const formItemLayout = {
labelCol: { xs: { span: 24 }, sm: { span: 6 } },
wrapperCol: { xs: { span: 24 }, sm: { span: 12 } }
};

const tailFormItemLayout = {
wrapperCol: { xs: { span: 24, offset: 0 }, sm: { span: 16, offset: 6 } },
};

class NewDog extends React.Component {

constructor(props) {
super(props);
this.state = {
selectedFile: null
}

}
handleBreedChange=event=>{
this.setState({
breed: event.target.value
})
}

handleAgeChange=event=>{
this.setState({
age: event.target.value
})
}

handleSizeChange=event=>{
this.setState({
size: event.target.value
})
}

handleDescriptionChange=event=>{
this.setState({
description: event.target.value
})
}

handleImageChange=event=>{
this.setState({
selectedFile: event.target.files[0],
loaded: 0,
})
}

onClickHandler = () => {
const data = new FormData()
data.append('upload', this.state.selectedFile)
data.append('breed', this.state.breed)
data.append('age', this.state.age)
data.append('size', this.state.size)
data.append('description', this.state.description)
axios.post("https://animal-hello-3000.codio-box.uk/api/v1/dogs", data, {
auth: {
username: 'daniel',
password: 'abc'
},
headers: {
'content-type': 'multipart/form-data'
}
})
.then(res => { // then print response status
console.log(res.statusText)
})
}

render(){
return (
<Form {...formItemLayout}>
<Title level={2}> Insert a new dog</Title>
<Form.Item name="breed" label="Breed">
<Input onChange={this.handleBreedChange}/>
</Form.Item>
<Form.Item name="age" label="Age">
<Input onChange={this.handleAgeChange}/>
</Form.Item>
<Form.Item name="size" label="Size">
<Input onChange={this.handleSizeChange}/>
</Form.Item>
<Form.Item name="description" label="Description">
<TextArea rows={3} onChange={this.handleDescriptionChange}/>
</Form.Item >
<Form.Item label="Image">
<Input type="file" name="file" onChange={this.handleImageChange}/>
</Form.Item>
<Button type="button" onClick={this.onClickHandler}>Submit</Button>
</Form>
);
}

}


export default NewDog;

0 comments on commit 9d4b5f9

Please sign in to comment.