diff --git a/src/App.css b/src/App.css index bb2cb7e..20d9800 100644 --- a/src/App.css +++ b/src/App.css @@ -31,7 +31,7 @@ height: 100vh; } -.mobile-title { +.nav-title-mobile { display: none; } @@ -50,7 +50,7 @@ z-index: 9; } -.nav-title { +.nav-title-desktop { display: inline-flex; color: orchid; padding-left: 1.5rem; @@ -97,7 +97,7 @@ .sidebar { display: flex; flex-direction: column; - width: 12rem; + width: 13.5rem; position: fixed; background-color: black; color: white; @@ -234,17 +234,20 @@ position: static; } - .desktop-title { + .nav-title-desktop { display: none; } - .mobile-title { + .nav-title-mobile { display: inline-flex; + color: orchid; + padding-left: 1.5rem; + font-family: 'Open Sans', sans-serif; } .nav-searchbar { width: 12rem; - right: 12rem; + right: 7rem; } .sidebar-button { diff --git a/src/features/navbar/Navbar.js b/src/features/navbar/Navbar.js index 30bff4e..d53dc72 100644 --- a/src/features/navbar/Navbar.js +++ b/src/features/navbar/Navbar.js @@ -12,8 +12,8 @@ export default function Navbar() { return ( <>
-

Reddit, but it's all cats

-

Cat Reddit

+

Reddit, but it's all cats

+

Cat Reddit

diff --git a/src/features/posts/postsSlice.js b/src/features/posts/postsSlice.js index 0c57117..b4360e3 100644 --- a/src/features/posts/postsSlice.js +++ b/src/features/posts/postsSlice.js @@ -29,11 +29,32 @@ export const fetchComments = createAsyncThunk( } ); +export const searchByActive = createAsyncThunk( + 'posts/searchByActive', + async(obj) => { + const { sub, term } = obj; + try { + let fulfilledResponse; + const myRequest = new Request(`https://www.reddit.com/${sub}/search.json?q=${term}&restrict_sr=1&sr_nsfw=`); + let response = await fetch(myRequest); + if (response.ok) { + let searchData = await response.json(); + fulfilledResponse = searchData; + } + return fulfilledResponse; + + } catch(e) { + console.log(e); + } + } +) + export const postsSlice = createSlice({ name: 'posts', initialState: { posts: [], activeComments: [], + searchResults: [], requestsPending: false, requestDenied: false, }, @@ -43,7 +64,7 @@ export const postsSlice = createSlice({ }, updatePosts(state,action) { state.posts = action.payload; - }, + } }, extraReducers: (builder) => { builder.addCase(fetchBySub.pending, (state,action) => { @@ -75,12 +96,28 @@ export const postsSlice = createSlice({ state.requestDenied = false; state.activeComments.push(action.payload); }) + + builder.addCase(searchByActive.pending, (state,action) => { + state.requestsPending = true; + state.requestDenied = false; + }) + builder.addCase(searchByActive.rejected, (state,action) => { + state.requestsPending = false; + state.requestDenied = true; + }) + builder.addCase(searchByActive.fulfilled, (state,action) => { + state.requestsPending = false; + state.requestDenied = false; + state.searchResults = action.payload; + }) } }); export default postsSlice.reducer; export const selectPosts = state => state.postsSlice.posts; export const isPending = state => state.postsSlice.requestsPending; +export const selectSearchResults = state => state.postsSlice.searchResults; export const { filterPosts, updatePosts } = postsSlice.actions; // exports also includes fetchBySub (takes argument of a sub) -// exports also includes fetchComments (takes argument of a post permalink) \ No newline at end of file +// exports also includes fetchComments (takes argument of a post permalink) +// exports also includes searchByActive \ No newline at end of file diff --git a/src/features/reddit/redditSlice.js b/src/features/reddit/redditSlice.js index e92887a..5f5d930 100644 --- a/src/features/reddit/redditSlice.js +++ b/src/features/reddit/redditSlice.js @@ -62,6 +62,7 @@ export const redditSlice = createSlice({ isSelected: true } }, + formattedActive: [] }, reducers: { updateSubVisibility(state,action) { // receives a subreddit name as action.payload @@ -69,29 +70,29 @@ export const redditSlice = createSlice({ }, getActiveSubs(state,action) { let activeSubs = []; - let allSubs = state.redditSlice.subreddits; - for (let sub in allSubs) { - if (sub.isSelected) { - activeSubs.push(sub); - } else { - continue; - } + for (let sub in state.subreddits) { + sub.isSelected && activeSubs.push(sub.name); } + state.formattedActive = activeSubs; }, }, extraReducers: {}, }); export const selectAllSubs = state => state.redditSlice.subreddits; -export const selectActiveSubs = state => { +export const selectActive = state => { + let subs = []; + for (let sub in state.redditSlice.subreddits) { + subs.push(sub); + } + let activeSubs = []; - for (let it in state.redditSlice.subreddits) { - if (it.isSelected) { - activeSubs.push(it); - } else { - continue; + for (let each of subs) { + if (each.isSelected) { + activeSubs.push(each); } } + return activeSubs; } export const { updateSubVisibility, getActiveSubs } = redditSlice.actions; diff --git a/src/features/searchBar/searchBar.js b/src/features/searchBar/searchBar.js index 6973652..27315c2 100644 --- a/src/features/searchBar/searchBar.js +++ b/src/features/searchBar/searchBar.js @@ -1,24 +1,53 @@ import React, { useState, useEffect } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { searchByActive, selectSearchResults } from '../posts/postsSlice'; +import { selectActive, selectAllSubs } from "../reddit/redditSlice"; export default function SearchBar() { + const dispatch = useDispatch(); + + const selectedSubs = useSelector(selectAllSubs); + const activeSubs = useSelector(selectActive); + const [term, setTerm] = useState(''); + const [results, setResults] = useState(null); + const searchData = useSelector(selectSearchResults); const handleChange = (e) => { e.preventDefault(); setTerm(e.target.value); } - useEffect(() => { - if (term) { - // dispatch an action which filters content by {term} - } else { - return; + const handleSubmit = () => { + if (term && activeSubs) { + let extracted = []; + for (let sub in activeSubs) { + extracted.push(sub); + } + + console.log(extracted); + let mapped = extracted.map((sub) => dispatch(searchByActive({sub, term}))); + Promise.all([...mapped]).then((data) => setResults(data)); } - }, [term]) + } + + + useEffect(() => { + let active = true; + + if (results && active) { + console.log(results); + } + + return () => { + active = false; + } + }, [results, activeSubs]); return ( <> + ); } \ No newline at end of file diff --git a/src/features/sidebar/Sidebar.css b/src/features/sidebar/Sidebar.css index b1225db..b2b5f88 100644 --- a/src/features/sidebar/Sidebar.css +++ b/src/features/sidebar/Sidebar.css @@ -20,6 +20,14 @@ margin: 0.8rem 0; } +.individual-sub button { + margin-right: 1rem; +} + +.individual-sub label { + text-align: right; +} + .search-sub-input { margin-top: 2rem; } \ No newline at end of file diff --git a/src/features/sidebar/SidebarItem.js b/src/features/sidebar/SidebarItem.js index 5454eb6..ecc2383 100644 --- a/src/features/sidebar/SidebarItem.js +++ b/src/features/sidebar/SidebarItem.js @@ -1,23 +1,17 @@ -import React, { useState } from "react"; -// import { useDispatch } from "react-redux"; -// import { updateSubVisibility } from "../reddit/redditSlice"; +import React, { useEffect, useRef, useState } from "react"; +import { useDispatch } from "react-redux"; +import { updateSubVisibility } from "../reddit/redditSlice"; export default function SidebarItem({sub}) { - const [visible, setVisible] = useState('hide'); // dispatch will be used to dispatch updateSubVisibility on change in state - // const dispatch = useDispatch(); // this will likely be within a useEffect hook + const dispatch = useDispatch(); - const handleClick = () => { - if (visible === 'hide') { - setVisible('show'); - } else if (visible === 'show') { - setVisible('hide'); - } + const handleClick = () => { + dispatch(updateSubVisibility(sub)); } return (
- {/* */} - +
);