From 31f7df859b7fe8e0001e5f02ff9dd1c246eba37b Mon Sep 17 00:00:00 2001 From: Adam Joseph Arling Date: Mon, 4 Mar 2024 14:19:33 -0600 Subject: [PATCH] Move logic of toggle component into a convenience hook --- components/Search/GenerativeAIToggle.tsx | 65 ++++-------------------- hooks/useGenerativeAISearch.ts | 5 -- hooks/useGenerativeAISearchToggle.ts | 60 ++++++++++++++++++++++ 3 files changed, 71 insertions(+), 59 deletions(-) delete mode 100644 hooks/useGenerativeAISearch.ts create mode 100644 hooks/useGenerativeAISearchToggle.ts diff --git a/components/Search/GenerativeAIToggle.tsx b/components/Search/GenerativeAIToggle.tsx index 56b52361..3c162c47 100644 --- a/components/Search/GenerativeAIToggle.tsx +++ b/components/Search/GenerativeAIToggle.tsx @@ -4,15 +4,13 @@ import { CheckboxRoot, GenerativeAIToggleWrapper, } from "./Search.styled"; -import React, { useEffect, useState } from "react"; import { DCAPI_ENDPOINT } from "@/lib/constants/endpoints"; import GenerativeAIDialog from "@/components/Shared/Dialog"; import { IconCheck } from "@/components/Shared/SVG/Icons"; import { IconInfo } from "@/components/Shared/SVG/Icons"; -import { UserContext } from "@/context/user-context"; -import { useRouter } from "next/router"; -import { useSearchState } from "@/context/search-context"; +import React from "react"; +import useGenerativeAISearchToggle from "@/hooks/useGenerativeAISearchToggle"; type GenerativeAIToggleProps = { isSearchActive: boolean; @@ -21,49 +19,8 @@ type GenerativeAIToggleProps = { export default function GenerativeAIToggle({ isSearchActive, }: GenerativeAIToggleProps) { - const router = useRouter(); - const { searchState, searchDispatch } = useSearchState(); - const { user } = React.useContext(UserContext); - - const [modalGenerativeAI, setModalGenerativeUI] = useState({ - isOpen: false, - title: "Generative AI Dialog", - }); - const [genAICheckBox, setGenAICheckBox] = useState( - searchState.isGenerativeAI - ); - - const handleGenerativeAIChange = (checked: boolean) => { - if (!user?.isLoggedIn) { - setModalGenerativeUI({ ...modalGenerativeAI, isOpen: checked }); - } - - if (user?.isLoggedIn) { - searchDispatch({ - isGenerativeAI: checked, - type: "updateGenerativeAI", - }); - } - }; - - useEffect(() => { - setGenAICheckBox(searchState.isGenerativeAI); - }, [searchState.isGenerativeAI]); - - // TODO: This needs to accept more than one query param when - // directing to NU SSO. We need the additional query param - // to know that user came wanting to use Generative AI - function goToLocation() { - const currentUrl = `${window.location.origin}${router.asPath}`; - const url = new URL(currentUrl); - url.searchParams.set("ai", "true"); - console.log("url.toString()", url.toString()); - return url.toString(); - } - - function handleModalClose() { - setModalGenerativeUI({ ...modalGenerativeAI, isOpen: false }); - } + const { closeDialog, dialog, goToUrl, isChecked, handleCheckChange } = + useGenerativeAISearchToggle(); return ( <> @@ -71,9 +28,9 @@ export default function GenerativeAIToggle({ {...(isSearchActive ? { css: { marginRight: "$gr5" } } : {})} > @@ -84,12 +41,12 @@ export default function GenerativeAIToggle({

- + Click here {" "} to login diff --git a/hooks/useGenerativeAISearch.ts b/hooks/useGenerativeAISearch.ts deleted file mode 100644 index 34e36ce4..00000000 --- a/hooks/useGenerativeAISearch.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { useState } from "react"; - -export default function useGenerativeAISearch() { - return null; -} diff --git a/hooks/useGenerativeAISearchToggle.ts b/hooks/useGenerativeAISearchToggle.ts new file mode 100644 index 00000000..69efd60d --- /dev/null +++ b/hooks/useGenerativeAISearchToggle.ts @@ -0,0 +1,60 @@ +import React, { useEffect, useState } from "react"; + +import { UserContext } from "@/context/user-context"; +import { useRouter } from "next/router"; +import { useSearchState } from "@/context/search-context"; + +const defaultModalState = { + isOpen: false, + title: "Generative AI Dialog", +}; + +export default function useGenerativeAISearchToggle() { + const { searchState, searchDispatch } = useSearchState(); + const { user } = React.useContext(UserContext); + const router = useRouter(); + + const [dialog, setDialog] = useState(defaultModalState); + const [isChecked, setIsChecked] = useState( + searchState.isGenerativeAI + ); + + const handleCheckChange = (checked: boolean) => { + if (!user?.isLoggedIn) { + setDialog({ ...dialog, isOpen: checked }); + } + + if (user?.isLoggedIn) { + searchDispatch({ + isGenerativeAI: checked, + type: "updateGenerativeAI", + }); + } + }; + + useEffect(() => { + setIsChecked(searchState.isGenerativeAI); + }, [searchState.isGenerativeAI]); + + // TODO: This needs to accept more than one query param when + // directing to NU SSO. We need the additional query param + // to know that user came wanting to use Generative AI + function goToLocation() { + const currentUrl = `${window.location.origin}${router.asPath}`; + const url = new URL(currentUrl); + url.searchParams.set("ai", "true"); + return url.toString(); + } + + function closeDialog() { + setDialog({ ...dialog, isOpen: false }); + } + + return { + closeDialog, + dialog, + goToUrl: goToLocation, + handleCheckChange, + isChecked, + }; +}