Advertisement
Guest User

Untitled

a guest
Feb 18th, 2020
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.32 KB | None | 0 0
  1. import React, { useState, useEffect } from "react";
  2. import { useDispatch, useSelector } from "react-redux";
  3. import styled from "styled-components";
  4.  
  5. import {
  6. selectKeyword,
  7. resetFilters,
  8. getFiltersAndResults,
  9. setPage
  10. } from "../../actions/filters";
  11. import Select from "./Select";
  12. import Input from "./Input";
  13. import { Spinner } from "../common";
  14. import { COL_GRAY } from "../../contants/colors";
  15. import usePath from "../../hooks/usePath";
  16. import { Button } from "../tabs/Tabs";
  17. import { allowedTypes } from "../../reducers/rootReducer";
  18. import useWindowWidth from "../../hooks/useWindowWidth";
  19. import usePrevious from "../../hooks/usePrevious";
  20. import CollapseFilters from "./CollapseFilters";
  21.  
  22. const InputWrapper = styled.div`
  23. margin-bottom: 14px;
  24. `;
  25.  
  26. const Label = styled.label`
  27. text-transform: uppercase;
  28. color: ${COL_GRAY};
  29. margin-bottom: 4px;
  30. font-size: 11px;
  31. font-weight: 700;
  32. display: block;
  33. `;
  34.  
  35. function Filters({ token }) {
  36. const dispatch = useDispatch();
  37. const { data } = useSelector(state => state);
  38. const path = usePath();
  39. const width = useWindowWidth();
  40. const [showFilters, setShowFilters] = useState(width > 768);
  41. const [isFilterClicked, setIsFilterClicked] = useState(false);
  42. const [once, setOnce] = useState(false);
  43. const prevType = usePrevious(data.type);
  44. const prevKeyword = usePrevious(data.keyword);
  45. const prevFilters = usePrevious(data.filters);
  46. const prevPage = usePrevious(data.activePage);
  47.  
  48. function handleReset() {
  49. dispatch(resetFilters());
  50. }
  51.  
  52. useEffect(() => {
  53. dispatch(setPage(1));
  54. }, [data.filters, data.keyword, data.type, dispatch]);
  55.  
  56. useEffect(() => {
  57. setOnce(true);
  58. }, []);
  59.  
  60. useEffect(() => {
  61. function getData() {
  62. if (path === data.type || path === "" || !allowedTypes.includes(path)) {
  63. dispatch(
  64. getFiltersAndResults(
  65. token,
  66. data.type,
  67. data.keyword,
  68. data.filters,
  69. data.activePage
  70. )
  71. );
  72. }
  73. }
  74.  
  75. function hasChanged() {
  76. return (
  77. prevType !== data.type ||
  78. prevKeyword !== data.keyword ||
  79. JSON.stringify(prevFilters) !== JSON.stringify(data.filters) ||
  80. prevPage !== data.activePage
  81. );
  82. }
  83.  
  84. if ((width < 768 && isFilterClicked) || !once) {
  85. getData();
  86. setIsFilterClicked(false);
  87. }
  88.  
  89. if (width > 768 && hasChanged()) {
  90. getData();
  91. }
  92. }, [
  93. token,
  94. data.type,
  95. path,
  96. data.keyword,
  97. data.filters,
  98. dispatch,
  99. data.activePage,
  100. isFilterClicked,
  101. once,
  102. width,
  103. prevFilters,
  104. prevKeyword,
  105. prevPage,
  106. prevType
  107. ]);
  108.  
  109. if (data.isLoading) {
  110. return <Spinner />;
  111. }
  112.  
  113. return (
  114. <div>
  115. {width < 768 && (
  116. <CollapseFilters onClick={() => setShowFilters(!showFilters)} />
  117. )}
  118. {(showFilters || width > 768) && (
  119. <>
  120. <InputWrapper>
  121. <Label htmlFor="keyword">Search for keyword</Label>
  122. <Input action={selectKeyword} id="keyword" />
  123. </InputWrapper>
  124. {data.filtersToFill &&
  125. Object.keys(data.filtersToFill).map(key => (
  126. <InputWrapper key={key}>
  127. {key === "language" && (
  128. <Label htmlFor="language">Language</Label>
  129. )}
  130. <Select
  131. id="language"
  132. placeholder={data.filtersToFill[key].placeholder || key}
  133. selected={{
  134. label: data.filters[data.filtersToFill[key].parent],
  135. value: data.filters[data.filtersToFill[key].parent]
  136. }}
  137. data={data.filtersToFill[key]}
  138. />
  139. </InputWrapper>
  140. ))}
  141. <InputWrapper>
  142. <Button style={{ width: "100%" }} onClick={handleReset}>
  143. Reset filters
  144. </Button>
  145. </InputWrapper>
  146. {width < 768 && (
  147. <InputWrapper>
  148. <Button
  149. style={{ width: "100%" }}
  150. onClick={() => setIsFilterClicked(true)}
  151. >
  152. Filter
  153. </Button>
  154. </InputWrapper>
  155. )}
  156. </>
  157. )}
  158. </div>
  159. );
  160. }
  161.  
  162. export default Filters;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement