Guest User

Untitled

a guest
Jan 17th, 2024
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. "use client";
  2. import { cn } from "@/lib/common";
  3. import { CSSTransition } from "react-transition-group";
  4. import { useTheme } from "next-themes";
  5. import { useRef } from "react";
  6. import { ImCross } from "react-icons/im";
  7. import "./settings-popover.css";
  8. import { useHydrationSafeTheme } from "@/hooks/use-hydration-safe-theme";
  9. import { usePathname, useRouter } from "next/navigation";
  10.  
  11. export function SettingsPopover({
  12.   isOpen,
  13.   setIsOpen,
  14.   menuId,
  15. }: {
  16.   isOpen: boolean;
  17.   setIsOpen: React.Dispatch<React.SetStateAction<boolean>>;
  18.   menuId: string;
  19. }) {
  20.   const { theme, setTheme } = useTheme();
  21.   const hydrationSafeTheme = useHydrationSafeTheme(theme);
  22.   const popoverMenuRef = useRef(null);
  23.   const router = useRouter();
  24.   const pathName = usePathname();
  25.   return (
  26.     <CSSTransition
  27.       ref={popoverMenuRef}
  28.       in={isOpen}
  29.       timeout={500}
  30.       classNames="settings-popover-menu"
  31.     >
  32.       <div
  33.         id={menuId}
  34.         ref={popoverMenuRef}
  35.         className={cn(
  36.           "hidden absolute top-[100%] font-normal text-lg border-gray-400 border bg-white p-6 py-8 pt-10 rounded dark:bg-background-dark-theme "
  37.         )}
  38.       >
  39.         <button
  40.           className="absolute top-3 right-3 hover:cursor-pointer hover:scale-105 hover:text-primary-light-dark-theme"
  41.           onClick={() => setIsOpen(false)}
  42.           title="Close"
  43.           aria-controls={menuId}
  44.           aria-label="Button To Close Settings Menu"
  45.         >
  46.           <ImCross />
  47.         </button>
  48.         <div className="flex flex-col gap-y-3">
  49.           <label htmlFor={`${menuId}-ui-select`}>Theme:</label>
  50.           <select
  51.             id={`${menuId}-ui-select`}
  52.             className="dark:bg-gray-800 p-3 px-5 rounded border border-gray-400"
  53.             onChange={(e) => setTheme(e.target.value)}
  54.             value={hydrationSafeTheme}
  55.             disabled={!hydrationSafeTheme}
  56.             aria-busy={!hydrationSafeTheme}
  57.           >
  58.             {!hydrationSafeTheme && <option>Loading...</option>}
  59.             <option value="system">System</option>
  60.             <option value="light">Light</option>
  61.             <option value="dark">Dark</option>
  62.           </select>
  63.           <label htmlFor={`${menuId}-language-select`}>Language:</label>
  64.           <select
  65.             defaultValue={pathName.split("/")[1]}
  66.             onChange={(e) => {
  67.               const segments = pathName.split("/");
  68.               segments[1] = e.target.value;
  69.               const pathWithNewLocale = segments.join("/");
  70.               router.push(pathWithNewLocale);
  71.             }}
  72.             id={`${menuId}-language-select`}
  73.             className="p-3 px-5 rounded dark:bg-gray-800  border border-gray-400"
  74.           >
  75.             <option value="en">English</option>
  76.             <option value="jp">日本語</option>
  77.           </select>
  78.         </div>
  79.       </div>
  80.     </CSSTransition>
  81.   );
  82. }
  83.  
Advertisement
Add Comment
Please, Sign In to add comment