From 61ca28e9e265d38389a27a3f382dff6ec372625a Mon Sep 17 00:00:00 2001 From: FadhilP <fadhilpradipta0@gmail.com> Date: Sat, 9 Jan 2021 16:55:40 +0700 Subject: [PATCH 1/4] fix import css file --- diskuy/src/CreateThreadForm.js | 2 +- diskuy/src/CreateTopicForm.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/diskuy/src/CreateThreadForm.js b/diskuy/src/CreateThreadForm.js index 6c99666..520b860 100644 --- a/diskuy/src/CreateThreadForm.js +++ b/diskuy/src/CreateThreadForm.js @@ -6,7 +6,7 @@ import authHeader from './services/auth-header' const LINK = 'http://localhost:4000'; -export default function Form(props){ +export default function CreateThreadForm(props){ const { value: title, bind: bindTitle, reset: resetTitle } = useInput('') const { value: body, bind: bindBody, reset: resetBody } = useInput('') diff --git a/diskuy/src/CreateTopicForm.js b/diskuy/src/CreateTopicForm.js index 027b318..2d59351 100644 --- a/diskuy/src/CreateTopicForm.js +++ b/diskuy/src/CreateTopicForm.js @@ -1,7 +1,7 @@ import axios from "axios"; import React from "react"; import { useInput } from './hooks/input-hook'; -import './Form.css'; +import './CreateThreadForm.css'; import authHeader from './services/auth-header' const LINK = 'http://localhost:4000'; -- GitLab From dd5f4c8263dfd4791b06dfea8f8e5df08db994a6 Mon Sep 17 00:00:00 2001 From: FadhilP <fadhilpradipta0@gmail.com> Date: Sat, 9 Jan 2021 17:15:58 +0700 Subject: [PATCH 2/4] add routing for custom search --- diskuy/src/App.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/diskuy/src/App.js b/diskuy/src/App.js index bea072e..9e4f4cd 100644 --- a/diskuy/src/App.js +++ b/diskuy/src/App.js @@ -4,11 +4,12 @@ import Topic from './Topic'; import Navbar from './Navbar'; import Profile from './Profile/Profile'; import ListThreads from './Threads/ListThreads'; -import Form from './Form'; +import CreateThreadForm from './CreateThreadForm'; import LoginForm from './LoginForm' import TopicList from './TopicList'; import RegisterForm from './RegisterForm' import CreateTopicForm from './CreateTopicForm' +import Search from './Search' import { BrowserRouter as Router, Route, @@ -25,7 +26,8 @@ function App() { <Route exact path='/login' component={LoginForm} /> <Route exact path='/register' component={RegisterForm} /> <Route exact path='/create/topic' component={CreateTopicForm} /> - <Route exact path='/create/:topic/thread' component={Form} /> + <Route exact path='/create/:topic/thread' component={CreateThreadForm} /> + <Route exact path='/search/:input' component={Search} /> <Route exact path='/topic/:topic/:thread' component={Thread} /> <Route exact path='/topic/:topic' component={Topic} /> <Route exact path='/threads' component={ListThreads} /> -- GitLab From 758fb0f8b458b3a1364b0c22b5db835c38d27ef9 Mon Sep 17 00:00:00 2001 From: FadhilP <fadhilpradipta0@gmail.com> Date: Sat, 9 Jan 2021 17:16:19 +0700 Subject: [PATCH 3/4] add functional search bar in navbar --- diskuy/src/Navbar.js | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/diskuy/src/Navbar.js b/diskuy/src/Navbar.js index d9a685d..52b7f4d 100644 --- a/diskuy/src/Navbar.js +++ b/diskuy/src/Navbar.js @@ -3,18 +3,26 @@ import {ReactComponent as DiskuyLogo} from './Logo.svg'; import './Navbar.css'; import { useState } from "react"; import AuthService from './services/auth.service' +import { useInput } from './hooks/input-hook'; import { - Link + Link, withRouter } from "react-router-dom" -const Navbar = () => { +const Navbar = (props) => { const [loggedIn, setLoggedIn] = useState(AuthService.getCurrentUser() && 1) + const { value: search, bind: bindSearch, reset: resetSearch } = useInput('') - const handleLogout = (event) => { + const handleLogout = () => { AuthService.logout() setLoggedIn(false) window.location.reload() } + + const handleSearch = (event) => { + event.preventDefault() + props.history.push(`/search/${search}`) + resetSearch() + } return ( <nav id = "navbar" className='navbar navbar-expand-lg navbar-light position-sticky fixed-top'> <div className="navbar-brand"> @@ -31,15 +39,20 @@ const Navbar = () => { </li> {loggedIn ? ( <li className='nav-item ml-auto' onClick={handleLogout}> - <Link to='/login' className='nav-link'><b>Logout</b></Link> + <Link to='/login' className='nav-link'><b>Logout</b></Link> </li> ): <li className='nav-item ml-auto'> - <Link to='/login' className='nav-link'><b>Login</b></Link> - </li>} + <Link to='/login' className='nav-link'><b>Login</b></Link> + </li> + } </ul> + <form className='form-inline my-2 my-lg-0' onSubmit={handleSearch}> + <input className='form-control mr-sm-2' type='search' placholder='search threads' aria-label="Search" {...bindSearch}/> + <button className='btn btn-outline-success my-2 my-sm-0' type='submit'>Search</button> + </form> </nav> ); } -export default Navbar; +export default withRouter(Navbar); -- GitLab From 2f0287118540a7071c568a4dd8c285bc6dd1dd5a Mon Sep 17 00:00:00 2001 From: FadhilP <fadhilpradipta0@gmail.com> Date: Sat, 9 Jan 2021 17:16:35 +0700 Subject: [PATCH 4/4] add working custom Search component --- diskuy/src/Search.js | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 diskuy/src/Search.js diff --git a/diskuy/src/Search.js b/diskuy/src/Search.js new file mode 100644 index 0000000..42247b1 --- /dev/null +++ b/diskuy/src/Search.js @@ -0,0 +1,38 @@ +import React, { useState, useEffect } from 'react' +import axios from 'axios' +import ThreadList from './ThreadList' +import { Link } from 'react-router-dom' + +const API_URL = 'http://localhost:4000/api' + +export default function Search(props) { + const [threads, setThreads] = useState([]) + const searchParam = props.match.params.input + + useEffect(() => { + const fetch = async () => { + const responseThreads = await axios.get(`${API_URL}/threads`) + const filteredThreads = responseThreads.data.data.filter(thread => thread.title.includes(searchParam)) + setThreads(filteredThreads) + } + fetch() + }, [searchParam]) + + return ( + <div> + <ul> + {threads.map((value) => ( + <Link to={`/topic/${value.topic_name}/${value.id}` } style={{ textDecoration: 'none' }}> + <ThreadList + header={value.title} + user={value.username} + points={value.points} + time={value.updated_at} + topic={value.topic_name}> + </ThreadList> + </Link> + ))} + </ul> + </div> + ) +} \ No newline at end of file -- GitLab