From bfcf76fdc2c8e966623d084e3a5e976288d1fa9e Mon Sep 17 00:00:00 2001 From: alikia2x Date: Sat, 13 Jul 2024 14:37:47 +0800 Subject: [PATCH] feature: engine selector, without nextui --- bun.lockb | Bin 290125 -> 290879 bytes components/engineSelector.tsx | 53 ++++----- components/onesearch/onesearch.tsx | 6 +- components/onesearch/suggestionBox.tsx | 8 +- components/picker.tsx | 148 +++++++++++++++++++++++++ components/selector.tsx | 85 -------------- components/selectorItem.tsx | 2 +- lib/onesearch/getSearchEngineName.ts | 4 +- package.json | 1 + pages/index.tsx | 12 +- server.ts | 16 +++ 11 files changed, 198 insertions(+), 137 deletions(-) create mode 100644 components/picker.tsx delete mode 100644 components/selector.tsx diff --git a/bun.lockb b/bun.lockb index 66f3594db93725cdfddf94ebdbf214da43a00734..caaa0dae7a519f6b5f9cb2f5accf7dfa71677ded 100755 GIT binary patch delta 45321 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 B=Fb2C diff --git a/components/engineSelector.tsx b/components/engineSelector.tsx index b2c3464..7959fac 100644 --- a/components/engineSelector.tsx +++ b/components/engineSelector.tsx @@ -1,21 +1,22 @@ -import React, { useEffect, useState } from "react"; -import { Dropdown, DropdownTrigger, DropdownMenu, DropdownItem, Button } from "@nextui-org/react"; +import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { settingsAtom } from "lib/state/settings"; import { engineTranslation } from "lib/onesearch/translatedEngineList"; import { settingsType } from "global"; import { useAtomValue, useSetAtom } from "jotai"; +import Picker, { PickedItem } from "./picker"; export default function EngineSelector(props: { className: string }) { const { t } = useTranslation(); const settings: settingsType = useAtomValue(settingsAtom); - const items = settings.searchEngines; + const engines = settings.searchEngines; const currentEngine: string = settings.currentSearchEngine; - const displayEngine = getName(currentEngine); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const [selectedKeys, setSelectedKeys] = useState(new Set([currentEngine]) as any); - const selectedValue = React.useMemo(() => Array.from(selectedKeys).join(", "), [selectedKeys]); + const [selected, setSelected] = useState(currentEngine); const setSettings = useSetAtom(settingsAtom); + let engineList: PickedItem = {}; + for (const engineKey of Object.keys(engines)) { + engineList[engineKey] = getName(engineKey); + } function getName(engineKey: string) { return engineTranslation.includes(engineKey) ? t(`search.engine.${engineKey}`) : engineKey; @@ -30,34 +31,20 @@ export default function EngineSelector(props: { className: string }) { }; }); } - if (selectedValue !== currentEngine) { - setEngine(selectedValue); + if (selected !== currentEngine) { + setEngine(selected); } - }, [currentEngine, selectedValue, setSettings]); + }, [currentEngine, selected, setSettings]); return ( -
- - - - - - {Object.keys(items).map((item) => ( - - {getName(item)} - - ))} - - -
+ { + setSelected(selected); + }} + displayContent={getName(selected)} + className={props.className} + /> ); } diff --git a/components/onesearch/onesearch.tsx b/components/onesearch/onesearch.tsx index 7f686f7..73aaaab 100644 --- a/components/onesearch/onesearch.tsx +++ b/components/onesearch/onesearch.tsx @@ -23,11 +23,11 @@ export default function OneSearch() { const lastRequestTimeRef = useRef(0); const selected = useAtomValue(selectedSuggestionAtom); const settings = useAtomValue(settingsAtom); - const devMode = true; + const devMode = false; const query = useAtomValue(queryAtom); const engineName = getSearchEngineName(); const engine = settings.currentSearchEngine; - const { t } = useTranslation("Search"); + const { t } = useTranslation(); const lang = i18next.language; useEffect(() => { @@ -127,7 +127,7 @@ export default function OneSearch() { {s.suggestion}  - {t("search-help-text", { engine: engineName })} + {t("search.search-help-text", { engine: engineName })} {devMode && ( diff --git a/components/onesearch/suggestionBox.tsx b/components/onesearch/suggestionBox.tsx index 70637a5..e7cefb3 100644 --- a/components/onesearch/suggestionBox.tsx +++ b/components/onesearch/suggestionBox.tsx @@ -1,8 +1,10 @@ export default function SuggestionBox(props: { children?: React.ReactNode }) { return ( -
+
{props.children}
); diff --git a/components/picker.tsx b/components/picker.tsx new file mode 100644 index 0000000..4b7e2dc --- /dev/null +++ b/components/picker.tsx @@ -0,0 +1,148 @@ +import { HTMLAttributes, RefObject, useEffect, useRef, useState } from "react"; +import { selectedOnChange } from "./selectorItem"; +import { createPortal } from "react-dom"; +import { Icon } from "@iconify/react"; +import React from "react"; + +export type selectionType = string; + +interface PickerProps extends HTMLAttributes { + selected: selectionType; + selectionOnChange: selectedOnChange; + displayContent: string; + selectionItems: PickedItem; +} + +export interface PickedItem { + [key: string]: selectionType; +} + +export default function Picker(props: PickerProps) { + const itemListRef: RefObject = useRef(null); + const buttonRef: RefObject = useRef(null); + const [displayList, setDisplayList] = useState(false); + + const updatePosition = () => { + if (itemListRef.current == null || buttonRef.current == null) { + return; + } + const buttonRect = buttonRef.current.getBoundingClientRect(); + const listWidth = itemListRef.current.getBoundingClientRect().width; + // Align to center + itemListRef.current.style.left = buttonRect.x + buttonRect.width / 2 - listWidth / 2 + "px"; + itemListRef.current.style.top = buttonRect.y + buttonRect.height + 16 + "px"; + }; + + useEffect(() => { + updatePosition(); + const handleResize = () => { + updatePosition(); + }; + + window.addEventListener("resize", handleResize); + + // Cleanup event listener on component unmount + return () => { + window.removeEventListener("resize", handleResize); + }; + }, [itemListRef, buttonRef]); + + function toggleDisplay(targetState?: boolean) { + function hideList() { + if (itemListRef.current) { + itemListRef.current.style.opacity = "0%"; + itemListRef.current.style.transform = "scaleX(.85) scaleY(.85)"; + } + setTimeout(() => { + setDisplayList(false); + }, 200); + } + function showList() { + setDisplayList(true); + setTimeout(() => { + updatePosition(); + if (itemListRef.current) { + itemListRef.current.style.opacity = "100%"; + itemListRef.current.style.transform = "scaleX(1) scaleY(1)"; + } + }, 20); + } + if (targetState === true) { + showList(); + } else if (targetState === false) { + hideList(); + } else if (displayList === true) { + hideList(); + } else { + showList(); + } + } + + const { displayContent, selectionOnChange, selectionItems, selected, ...rest } = props; + return ( +
+ + {displayList && ( + + )} +
+ ); +} + +interface PickerListProps { + selected: selectionType; + selectionOnChange: selectedOnChange; + selectionItems: PickedItem; + toggleDisplay: Function; +} + +const PickerList = React.forwardRef((props, ref) => { + const { selected, selectionOnChange, selectionItems } = props; + + return createPortal( +
+ {Object.keys(selectionItems).map((key: string, index) => { + return ( +
{ + selectionOnChange(key); + props.toggleDisplay(); + }} + > + {selectionItems[key]} +
+ {key === selected && ( + + )} +
+ ); + })} +
, + document.body + ); +}); + +PickerList.displayName = "PickerList"; diff --git a/components/selector.tsx b/components/selector.tsx deleted file mode 100644 index ddc7f5d..0000000 --- a/components/selector.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { HTMLAttributes, ReactNode, RefObject, useEffect, useRef } from "react"; -import { selectedOnChange } from "./selectorItem"; -import { createPortal } from "react-dom"; - -export type selectionType = string | number | boolean; - -interface PickerPropsChildrenStyle extends HTMLAttributes { - selected: selectionType; - selectionOnChange: selectedOnChange; - displayContent: string; - children: ReactNode; -} - -interface PickerPropsParamStyle extends HTMLAttributes { - selected: selectionType; - selectionOnChange: selectedOnChange; - displayContent: string; - selectionItems: PickedItem; -} - -interface PickedItem { - [key: string]: selectionType; -} - -export default function Picker(props: PickerPropsChildrenStyle | PickerPropsParamStyle) { - const itemListRef: RefObject = useRef(null); - const buttonRef: RefObject = useRef(null); - - const updatePosition = () => { - if (itemListRef.current == null || buttonRef.current == null) { - return; - } - const buttonRect = buttonRef.current.getBoundingClientRect(); - const listWidth = itemListRef.current.getBoundingClientRect().width; - // Align to center - itemListRef.current.style.left = buttonRect.x + buttonRect.width / 2 - listWidth / 2 + "px"; - itemListRef.current.style.top = buttonRect.y + buttonRect.height + 16 + "px"; - }; - - useEffect(() => { - updatePosition(); - const handleResize = () => { - updatePosition(); - }; - - window.addEventListener('resize', handleResize); - - // Cleanup event listener on component unmount - return () => { - window.removeEventListener('resize', handleResize); - }; - }, [itemListRef, buttonRef]); - - if ("selectionItems" in props) { - const { selectionItems, displayContent, selectionOnChange, ...rest } = props; - return ( -
- - {createPortal( -
- {Object.keys(selectionItems).map((key: string, index) => { - return
{selectionItems[key]}
; - })} -
, - document.body - )} -
- ); - } else { - return ( -
- - {createPortal(
{props.children}
, document.body)} -
- ); - } -} diff --git a/components/selectorItem.tsx b/components/selectorItem.tsx index 94469fa..1365af0 100644 --- a/components/selectorItem.tsx +++ b/components/selectorItem.tsx @@ -1,5 +1,5 @@ import { ReactNode } from "react"; -import { selectionType } from "./selector"; +import { selectionType } from "./picker"; export type selectedOnChange = (target: selectionType) => void; diff --git a/lib/onesearch/getSearchEngineName.ts b/lib/onesearch/getSearchEngineName.ts index 4d6eac6..251a151 100644 --- a/lib/onesearch/getSearchEngineName.ts +++ b/lib/onesearch/getSearchEngineName.ts @@ -12,6 +12,6 @@ export default function(){ } function getName(engineKey: string) { - const { t } = useTranslation("Search"); - return engineTranslation.includes(engineKey) ? t(`engine.${engineKey}`) : engineKey; + const { t } = useTranslation(); + return engineTranslation.includes(engineKey) ? t(`search.engine.${engineKey}`) : engineKey; } \ No newline at end of file diff --git a/package.json b/package.json index 4acdd13..25458a5 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "preview": "NODE_ENV=production bun server.ts" }, "dependencies": { + "@iconify/react": "^5.0.1", "@nextui-org/react": "^2.4.2", "@types/express": "^4.17.21", "cac": "^6.7.14", diff --git a/pages/index.tsx b/pages/index.tsx index 9219879..4fca8f9 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -6,7 +6,6 @@ import { settingsAtom } from "lib/state/settings"; import { bgFocusAtom } from "lib/state/background"; import EngineSelector from "components/engineSelector"; import OneSearch from "components/onesearch/onesearch"; -import Picker from "components/selector"; export default function Homepage() { const settings = useAtomValue(settingsAtom); @@ -16,20 +15,13 @@ export default function Homepage() {
setBgFocus(true)} />
); } diff --git a/server.ts b/server.ts index 46e9c34..b43687f 100644 --- a/server.ts +++ b/server.ts @@ -4,6 +4,7 @@ import ViteExpress from "vite-express"; import pjson from "./package.json"; import { networkInterfaces } from "os"; import cac from "cac"; +import { completeGoogle } from "search-engine-autocomplete"; const start = new Date(); const cli = cac(); @@ -37,6 +38,21 @@ if (parsed.options.host!==undefined && typeof parsed.options.host == "boolean" & app.get("/message", (_, res) => res.send("Hello from express!")); +app.get('/api/suggestion', async (req, res) => { + const query = req.query.q as string; + const t = parseInt(req.query.t as string || "0") || null; + let language = req.query.l as string || 'en-US'; + + try { + const data = await completeGoogle(query, language); + //logger.info({ type: "onesearch_search_autocomplete", query: query, data: data }); + res.json({ ...data, time: t }); + } catch (error) { + //logger.error({ type: "onesearch_search_autocomplete_error", error: error.message }); + res.status(500).json({ error: 'Internal Server Error' }); + } +}); + async function helloMessage() { const { base } = await ViteExpress.getViteConfig(); //console.clear();