From 6914ff6796b105221b38ee711956fe8258d44b75 Mon Sep 17 00:00:00 2001 From: Madhankumar <madhankumar.r@krds.fr> Date: Fri, 5 Jan 2024 12:53:39 +0530 Subject: [PATCH] code changes --- app/@header/default.js | 26 ++++++++++++++------------ app/layout.js | 14 +++++--------- app/page.js | 46 ++++++++++++++++++++-------------------------- app/theme-context.js | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ components/base/header/index.js | 2 ++ components/base/search/index.js | 12 ++++++++---- theme-context/index.js | 36 ------------------------------------ 7 files changed, 110 insertions(+), 87 deletions(-) create mode 100644 app/theme-context.js delete mode 100644 theme-context/index.js diff --git a/app/@header/default.js b/app/@header/default.js index 5d05739..fc007b4 100644 --- a/app/@header/default.js +++ b/app/@header/default.js @@ -1,22 +1,23 @@ "use client"; +import { useEffect } from "react"; import Header from "@components/base/header"; -import { useAppContext } from "theme-context/index"; +import { useAppContext } from "app/theme-context"; import { useRouter } from "next/navigation"; export default function PageHeader({ searchParams }) { - const { theme, toggleTheme } = useAppContext(); + const { theme, toggleTheme, handleSearchInput, text, isDisabled } = + useAppContext(); const router = useRouter(); - let currentPage = 1; - const urlParams = searchParams.search; + + const currentPage = 1; // Assuming currentPage is constant for now + const search = searchParams.search; + + useEffect(() => { + if (search) handleSearchInput(search, currentPage); + }, [search]); const handleSearch = (value) => { - if (value) { - router.push(`/?page=${currentPage}&search=${value}`, undefined, { - shallow: true, - }); - } else { - router.push(`/?page=${currentPage}`, undefined, { shallow: true }); - } + handleSearchInput(value, currentPage); }; const handleClear = () => { @@ -30,7 +31,8 @@ export default function PageHeader({ searchParams }) { onThemeChange={toggleTheme} onSearch={handleSearch} onClear={handleClear} - value={urlParams} + value={text} + isDisabled={isDisabled} /> ); } diff --git a/app/layout.js b/app/layout.js index 8a9c084..fb70d93 100644 --- a/app/layout.js +++ b/app/layout.js @@ -1,16 +1,12 @@ -import { ThemeProvider } from "theme-context/index"; +import { ThemeProvider } from "app/theme-context"; import "@styles/globals.css"; export default function RootLayout({ children, header }) { return ( <html lang="en"> - <body> - <div id="root"> - <ThemeProvider> - {header} - {children} - </ThemeProvider> - </div> - </body> + <ThemeProvider> + {header} + {children} + </ThemeProvider> </html> ); } diff --git a/app/page.js b/app/page.js index d6af829..9a72eb6 100644 --- a/app/page.js +++ b/app/page.js @@ -3,34 +3,28 @@ import Pagination from "@components/top-level/pagination"; import { getPosts, getPostsBySearch } from "@lib/api"; const Home = async ({ searchParams }) => { - const pageNo = searchParams.page || 1; - const search = searchParams.search; + const { page: pageNo = 1, search } = searchParams; - if (search) { - var { blogs, total } = await getPostsBySearch("posts", pageNo, search); - } else { - var { blogs, total } = await getPosts("posts", pageNo); - } + const { blogs, total } = search + ? await getPostsBySearch("posts", pageNo, search) + : await getPosts("posts", pageNo); - return ( - <> - {blogs?.length ? ( - <div> - <BlogLists - title="Lifestyle" - description="Lorem ipsum dolor sit amet elit. Id quaerat amet ipsum sunt et quos dolorum." - blogs={blogs} - /> - <Pagination - currentPage={Number(pageNo)} - total={Number(total)} - search={search} - /> - </div> - ) : ( - <h2 className="center">No data found</h2> - )} - </> + return blogs?.length ? ( + <div> + <BlogLists + title="Lifestyle" + description="Lorem ipsum dolor sit amet elit. Id quaerat amet ipsum sunt et quos dolorum." + blogs={blogs} + /> + + <Pagination + currentPage={Number(pageNo)} + total={Number(total)} + search={search} + /> + </div> + ) : ( + <h2 className="center">No data found</h2> ); }; diff --git a/app/theme-context.js b/app/theme-context.js new file mode 100644 index 0000000..5584316 --- /dev/null +++ b/app/theme-context.js @@ -0,0 +1,61 @@ +"use client"; +import { createContext, useContext, useState, useEffect } from "react"; +import { useRouter, useSearchParams, usePathname } from "next/navigation"; +export const ThemeContext = createContext(); + +export const useAppContext = () => useContext(ThemeContext); + +export const ThemeProvider = ({ children }) => { + const [theme, setTheme] = useState("light"); + const [text, setText] = useState(""); + const [isDisabled, setIsDisabled] = useState(false); + const router = useRouter(); + const pathName = usePathname(); + const searchParams = useSearchParams(); + const search = searchParams.get("search"); + + useEffect(() => { + const storedTheme = localStorage.getItem("theme"); + setTheme(storedTheme); + }, [theme]); + useEffect(() => { + if (!search) { + setText(""); + } else { + setText(search); + } + if (pathName.includes("singleblog")) { + setIsDisabled(true); + } else { + setIsDisabled(false); + } + }, [pathName, search]); + + const toggleTheme = () => { + const newTheme = theme === "light" ? "dark" : "light"; + localStorage.setItem("theme", newTheme); + setTheme(newTheme); + }; + const handleSearchInput = (value, currentPage) => { + setText(value); + + const query = value + ? `?page=${currentPage}&search=${value}` + : `?page=${currentPage}`; + + router.push(query, undefined, { shallow: true }); + }; + const contextValue = { + theme, + toggleTheme, + text, + handleSearchInput, + isDisabled, + }; + + return ( + <ThemeContext.Provider value={contextValue}> + <body className={theme}>{children}</body> + </ThemeContext.Provider> + ); +}; diff --git a/components/base/header/index.js b/components/base/header/index.js index 5557ee8..c0c03cc 100644 --- a/components/base/header/index.js +++ b/components/base/header/index.js @@ -11,6 +11,7 @@ function Header({ onClear, onThemeChange, value, + isDisabled, }) { const handleTheme = () => { onThemeChange(currentTheme); @@ -36,6 +37,7 @@ function Header({ onSearch={handleSearch} onClear={handleClear} value={value} + disabled={isDisabled} /> </div> diff --git a/components/base/search/index.js b/components/base/search/index.js index 8fadd8a..71c5579 100644 --- a/components/base/search/index.js +++ b/components/base/search/index.js @@ -1,11 +1,14 @@ -import React, { useState } from "react"; +import React, { useState, useEffect } from "react"; import PropTypes from "prop-types"; import Icons from "@components/base/icons"; import styles from "./styles.module.css"; -const Search = ({ onSearch, onClear, value }) => { +const Search = ({ onSearch, onClear, value, ...props }) => { const [inputValue, setInputValue] = useState(value); + useEffect(() => { + setInputValue(value); + }, [value]); const handleCustomClear = () => { onClear(""); setInputValue(""); // Reset the input value @@ -18,7 +21,7 @@ const Search = ({ onSearch, onClear, value }) => { }; const handleChange = (e) => { - setInputValue(e); + setInputValue(e.target.value); }; return ( @@ -31,9 +34,10 @@ const Search = ({ onSearch, onClear, value }) => { type="text" autoFocus={true} value={inputValue} - onChange={(e) => handleChange(e.target.value)} + onChange={handleChange} onKeyUp={handleKeyPress} placeholder="Discover news, articles and more" + {...props} /> {inputValue && ( <span className={`${styles["close-icon"]}`} onClick={handleCustomClear}> diff --git a/theme-context/index.js b/theme-context/index.js deleted file mode 100644 index 27d20bd..0000000 --- a/theme-context/index.js +++ /dev/null @@ -1,36 +0,0 @@ -"use client"; -import { createContext, useContext, useState, useEffect } from "react"; - -export const ThemeContext = createContext(); - -export const useAppContext = () => useContext(ThemeContext); - -export const ThemeProvider = ({ children }) => { - const [theme, setTheme] = useState("light"); - - useEffect(() => { - const storedTheme = localStorage.getItem("theme"); - setTheme(storedTheme); - document.documentElement.setAttribute("class", storedTheme); - }, [theme]); - - const toggleTheme = () => { - const newTheme = theme === "light" ? "dark" : "light"; - localStorage.setItem("theme", newTheme); - setTheme(newTheme); - document.documentElement.setAttribute("class", newTheme); - }; - - const contextValue = { - theme, - toggleTheme, - }; - - return ( - <ThemeContext.Provider value={contextValue}> - <div id="root" className={theme}> - {children} - </div> - </ThemeContext.Provider> - ); -}; -- libgit2 0.27.0