Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issue 236 fetch plays datastore #311

Merged
merged 48 commits into from
Jun 25, 2022
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
7148f68
✨ Introduced the fetch call of plays from the datastore
atapas Jun 14, 2022
0f8cb18
restore data from api and render out plays
Angryman18 Jun 15, 2022
fa2e4d4
reducer fix
Angryman18 Jun 15, 2022
4b55667
request changes
Angryman18 Jun 15, 2022
9383139
resolve merge conflicts
Angryman18 Jun 15, 2022
df1760c
play-meta deleted and component dynamic import
Angryman18 Jun 16, 2022
f468a63
Merge remote-tracking branch 'origin/main' into issue-236-fetch-plays…
atapas Jun 17, 2022
6a90e5b
Merge branch 'issue-236-fetch-plays-datastore' of https://github.com/…
atapas Jun 17, 2022
912e3d9
Initial commit(test commit)
atapas Jun 17, 2022
a513dc7
🎨 Fixed the issue with dynamic import
atapas Jun 17, 2022
89dcd61
Merge branch 'main' into issue-236-fetch-plays-datastore
atapas Jun 17, 2022
facee5d
Merge remote-tracking branch 'origin/main' into issue-236-fetch-plays…
atapas Jun 18, 2022
84bd6b8
Merge branch 'main' into issue-236-fetch-plays-datastore
atapas Jun 18, 2022
a1d3602
Merge branch 'issue-236-fetch-plays-datastore' of https://github.com/…
atapas Jun 18, 2022
8845f8f
created single and multi submit method
koustov Jun 18, 2022
11cbf18
🐛 Intermediate code
atapas Jun 18, 2022
8a96f7d
replaced array with single object for request
koustov Jun 18, 2022
229a59b
commented few code to remove warnings
koustov Jun 18, 2022
6388034
requested changes
Angryman18 Jun 19, 2022
eba3b40
removed getPlayId by passing props into the Header
Angryman18 Jun 19, 2022
d32b197
n.map error possible fix
Angryman18 Jun 19, 2022
6004a27
🔥 Removing postbuild tem
atapas Jun 19, 2022
950c052
Removed all plays
koustov Jun 19, 2022
dcb2f2b
filter data from db
Angryman18 Jun 19, 2022
2cea5b7
initial commit for search/filter
atapas Jun 19, 2022
45c68f1
merge main
atapas Jun 19, 2022
0732952
submit multi change
Angryman18 Jun 19, 2022
5ea9893
play-meta-utls cleanup
Angryman18 Jun 19, 2022
2b1e62c
useSearchFilter deleted
Angryman18 Jun 19, 2022
36f67d4
example folder name change
Angryman18 Jun 19, 2022
dfeb6e0
generate graphql clause dynamically
Angryman18 Jun 20, 2022
98a4a77
spinner added and plop template modified
Angryman18 Jun 20, 2022
b0bc5eb
featured plays rendered
Angryman18 Jun 21, 2022
fb1b1b4
🔥 Removed unusued code
atapas Jun 21, 2022
ad93189
✨ Now corrected one NHost URL
atapas Jun 21, 2022
84bd9bf
🐛 Fixed the filtering bug
atapas Jun 21, 2022
f102d34
partial commit to pull new changes
Angryman18 Jun 21, 2022
b5ee530
error handling, warning removal and comments resolved
Angryman18 Jun 21, 2022
981e8c2
added @nhost/react
Angryman18 Jun 21, 2022
a75d6ae
removed demo plays
Angryman18 Jun 21, 2022
54bd612
requred changs
Angryman18 Jun 22, 2022
b850380
Merge branch 'issue-236-fetch-plays-datastore' of github.com:reactpla…
koustov Jun 23, 2022
264c911
added json-graphql-parser for query processing
koustov Jun 24, 2022
168e9f8
Revert "Removed all plays"
koustov Jun 24, 2022
59b5009
filter play fix
Angryman18 Jun 24, 2022
4fde8a6
required changs
Angryman18 Jun 25, 2022
9232df9
Update package.json
Angryman18 Jun 25, 2022
9c54a0b
removed text
Angryman18 Jun 25, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,16 @@
"version": "1.0.0",
"private": true,
"dependencies": {
"@apollo/client": "^3.6.8",
"@giscus/react": "^2.0.3",
"@nhost/react": "^0.8.0",
"@nhost/react-apollo": "^4.3.0",
Angryman18 marked this conversation as resolved.
Show resolved Hide resolved
"@types/lodash": "^4.14.182",
"@types/react": "^18.0.6",
"@types/react-dom": "^18.0.2",
"date-fns": "^2.28.0",
"firebase": "^9.8.2",
"graphql": "^16.5.0",
Angryman18 marked this conversation as resolved.
Show resolved Hide resolved
"lodash": "^4.17.21",
"node-sass": "^7.0.1",
"plop": "^3.0.5",
Expand Down
1 change: 1 addition & 0 deletions src/actions/type.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const GET_ALL_PLAYS = 'GET_ALL_PLAYS'
Angryman18 marked this conversation as resolved.
Show resolved Hide resolved
42 changes: 42 additions & 0 deletions src/common/hooks/useGetPlays.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@

import { gql, useQuery } from '@apollo/client';

const GET_PLAYS_QUERY = gql`
query Fetch_Plays {
plays {
blog
component
cover
created_at
description
featured
github
id
language
level {
name
}
name
path
play_tags {
tag {
name
}
}
updated_at
user {
id
displayName
avatarUrl
}
video
}
}
`;

const useGetPlays = () => {
atapas marked this conversation as resolved.
Show resolved Hide resolved
const {loading, error, data} = useQuery(GET_PLAYS_QUERY);
return [loading, error, data];
}

export default useGetPlays;
8 changes: 6 additions & 2 deletions src/common/playlists/PlayHeaderInfo.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,11 @@ const Tags = ({tags}) => {
};

const PlayHeaderInfo = ({ play }) => {


const structureTags = play?.play_tags.reduce((pre, next) => {
atapas marked this conversation as resolved.
Show resolved Hide resolved
return pre.concat(next.tag.name)
}, [])

return (
<div className="header-leftcol">
<div className="header-leftcol-action">
Expand All @@ -53,7 +57,7 @@ const PlayHeaderInfo = ({ play }) => {
<div className="header-primary">
<h3 className="header-title">{play.name}</h3>
<div className="header-title-tags">
<LevelBadge level={play.level} /> { play.tags && <Tags tags={play.tags.split(',')} /> }
<LevelBadge level={play.level.name} /> { structureTags && <Tags tags={structureTags.toString().split(',')} /> }
</div>
</div>
<div className="header-secondary">
Expand Down
11 changes: 6 additions & 5 deletions src/common/playlists/PlayList.jsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { useSearchFilter } from "common/search/hooks/useSearchFilter";
import PlayThumbnail from "./PlayThumbnail";
import { ReactComponent as ImageOops } from "images/img-oops.svg";
import { Link } from 'react-router-dom';
import { Fragment } from "react";

import "./playlist.css";

const PlayList = () => {
const PlayList = ({key}) => {
const plays = useSearchFilter();

if (plays.length === 0) {
return (
<div className="play-not-found">
Expand All @@ -19,14 +20,14 @@ const PlayList = () => {
);
}
return (
<>
<Fragment key={key}>
<ol className="list-plays">
{plays.map((play, index) => (
<PlayThumbnail key={play.id} play={play} />
))}
</ol>
</>
</Fragment>
);
};

export default PlayList;
export default PlayList;
6 changes: 4 additions & 2 deletions src/common/playlists/PlayMeta.jsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { cloneElement } from "react";
import { Helmet } from "react-helmet";
import * as Plays from '../../plays'

function PlayMeta({ id, name, description, path, cover, component }) {
const playFolder = path.split("/")[2];
const RenderPlay = Plays[component]
Angryman18 marked this conversation as resolved.
Show resolved Hide resolved

let metaImage; // Initialize metaImage variable
if (cover) {
Expand Down Expand Up @@ -50,9 +52,9 @@ function PlayMeta({ id, name, description, path, cover, component }) {
/>
)}
</Helmet>
{cloneElement(component(), { id })}
{cloneElement(<RenderPlay />, { id })}
</>
);
}

export default PlayMeta;
export default PlayMeta;
62 changes: 49 additions & 13 deletions src/common/routing/RouteDefs.jsx
Original file line number Diff line number Diff line change
@@ -1,35 +1,71 @@
import App from "App";
import { Footer, Header, Home, PlayMeta, DefMeta, PageNotFound, PlayIdeas } from "common";
import {
Footer,
Header,
Home,
PlayMeta,
DefMeta,
PageNotFound,
PlayIdeas,
} from "common";
import { connect } from "react-redux";
import PlayList from "common/playlists/PlayList";
import { getAllPlays } from "meta/play-meta-util";
import { BrowserRouter, Route, Routes } from "react-router-dom";
import { NhostApolloProvider } from "@nhost/react-apollo";
import { NhostClient, NhostReactProvider } from "@nhost/react";
import useGetPlays from "common/hooks/useGetPlays";
import { useEffect } from "react";
import { GET_ALL_PLAYS } from "../../actions/type";

const RouteDefs = () => {
const plays = getAllPlays();
const nhost = new NhostClient({
backendUrl: process.env.REACT_APP_NHOST_BACKEND_URL || "",
});

const ChildRoutes = (props) => {
const { dispatch, plays } = props;
const [_, error, data] = useGetPlays();
atapas marked this conversation as resolved.
Show resolved Hide resolved

useEffect(() => {
dispatch({ type: GET_ALL_PLAYS, payload: data?.plays, error });
}, [data]);

return (
<BrowserRouter>
<Header />
<DefMeta />
<Routes>
<Route path="/" element={<Home />} />
<Route path="/plays" element={<App />}>
<Route path='/' element={<Home />} />
<Route path='/plays' element={<App />}>
<Route index element={<PlayList />} />
{plays.map((play, index) => (
{!!plays.length && plays?.map((play, index) => (
<Route
key={index}
path={play.path}
element={<PlayMeta {...play} />} // Put play data inside PlayMeta tag for dynamic meta tags
path={play?.path}
element={<PlayMeta key={index} {...play} />} // Put play data inside PlayMeta tag for dynamic meta tags
/>
))}
</Route>
<Route path="/ideas" element={<PlayIdeas />} />
<Route path="/*" element={<PageNotFound />} />

<Route path='/ideas' element={<PlayIdeas />} />
<Route path='/*' element={<PageNotFound />} />
</Routes>
<Footer />
</BrowserRouter>
);
};

export default RouteDefs;
const RouteDefs = (props) => {
return (
<NhostReactProvider nhost={nhost}>
<NhostApolloProvider nhost={nhost}>
<ChildRoutes {...props} />
</NhostApolloProvider>
</NhostReactProvider>
);
};

const mapStateToProps = (state) => {
const plays = state?.PlayReducer;
return { plays };
};

export default connect(mapStateToProps)(RouteDefs);
52 changes: 28 additions & 24 deletions src/common/search/hooks/useSearchFilter.js
Original file line number Diff line number Diff line change
@@ -1,49 +1,53 @@
import { SearchContext } from "common/search/search-context";
import { getPlaysOnSearch } from "meta/play-meta-util";
import { useContext, useEffect, useState } from "react";
import { useSelector } from "react-redux";

const useSearchFilter = () => {
const { searchTerm, filterQuery } = useContext(SearchContext);

console.log('searchTerm', searchTerm);
console.log('filterQuery', filterQuery);

const data = useSelector((state) => state?.PlayReducer);
const [plays, setPlays] = useState([]);

useEffect(() => {
const filteredPlays = filterPlays(searchTerm, filterQuery);
const filteredPlays = filterPlays(data, searchTerm, filterQuery);
setPlays(filteredPlays);
}, [searchTerm, filterQuery]);

}, [searchTerm, filterQuery, data]);
return plays;
};

const filterPlays = (searchTerm, filterQuery) => {
const filterPlays = (data, searchTerm, filterQuery) => {
atapas marked this conversation as resolved.
Show resolved Hide resolved
let filteredPlays = [];
const { level, tags, creator, language } = filterQuery;

const searchedPlays = getPlaysOnSearch(searchTerm);

filteredPlays = searchedPlays.filter(play => {
return (play.github === creator || !creator);
const searchedPlays = getPlaysOnSearch(data, searchTerm);

filteredPlays = searchedPlays.filter((play) => {
return play.github === creator || !creator;
});

filteredPlays = filteredPlays.filter(play => {
return (play.level === level || !level);
filteredPlays = filteredPlays.filter((play) => {
return play.level.name === level || !level;
});

filteredPlays = filteredPlays.filter(play => {
return (play.tags.includes(tags[0]) || !tags[0]);
filteredPlays = filteredPlays.filter((play) => {
return play.play_tags.includes(tags[0]) || !tags[0];
});

filteredPlays = filteredPlays.filter(play => {
const lang = play.language || 'js';
return (lang === language || !language);
filteredPlays = filteredPlays.filter((play) => {
const lang = play.language || "js";
return lang === language || !language;
});



return filteredPlays;
}
};

export { useSearchFilter };
const getPlaysOnSearch = (data, searchTerm) => {
return data?.filter((play) => {
return (
play?.name?.toLowerCase().includes(searchTerm.toLowerCase()) ||
play?.description?.toLowerCase().includes(searchTerm.toLowerCase())
);
});
};

export { useSearchFilter };
12 changes: 7 additions & 5 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ import RouteDefs from "common/routing/RouteDefs";
import { SearchContext } from "common/search/search-context";
import "index.css";
import React, { useState } from "react";
import { createRoot } from 'react-dom/client';
import { createRoot } from "react-dom/client";
import reportWebVitals from "reportWebVitals";
import { Provider } from "react-redux";
import { store } from "store/store";

/** removing console statement in react prod build */
if (process.env.NODE_ENV !== "development") {
Expand All @@ -19,16 +21,16 @@ const Index = () => {
level: "",
tags: [],
creator: "",
language: ""
language: "",
});

const value = { searchTerm, setSearchTerm, filterQuery, setFilterQuery };
return (
<React.StrictMode>
<Provider store={store}>
Angryman18 marked this conversation as resolved.
Show resolved Hide resolved
<SearchContext.Provider value={value}>
<RouteDefs />
</SearchContext.Provider>
</React.StrictMode>
</Provider>
);
};
const container = document.getElementById("root");
Expand All @@ -37,4 +39,4 @@ createRoot(container).render(<Index />);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
reportWebVitals();
6 changes: 5 additions & 1 deletion src/meta/play-meta-util.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@

import { plays } from './play-meta';
import { store } from '../store/store';



const getAllPlays = () => {
return plays;
};

const getPlayById = id => {
return plays.find(play => play.id === id);
const getAllPlays = store.getState().PlayReducer
return getAllPlays.find(play => play.id === id);
};

const getPlaysOnSearch = searchTerm => {
Expand Down
16 changes: 16 additions & 0 deletions src/store/reducers/play.reducer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { GET_ALL_PLAYS } from "../../actions/type";

const PlayReducer = (state = [], actions) => {
switch (actions.type) {
case GET_ALL_PLAYS:
if (actions.error) {
return [];
}
const data = actions.payload ?? []
return [...data];
default:
return state;
}
};

export default PlayReducer;
6 changes: 6 additions & 0 deletions src/store/reducers/root-reducers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { combineReducers } from "redux";
import PlayReducer from "./play.reducer";

const RootReducers = combineReducers({ PlayReducer });

export default RootReducers;
Loading