feat: add web search engines (#290)
This commit is contained in:
@@ -25,8 +25,10 @@ import classes from "./component.module.css";
|
|||||||
import { actionsAtomRead, groupsAtomRead } from "./data-store";
|
import { actionsAtomRead, groupsAtomRead } from "./data-store";
|
||||||
import { setSelectedAction, spotlightStore } from "./spotlight-store";
|
import { setSelectedAction, spotlightStore } from "./spotlight-store";
|
||||||
import type { SpotlightActionData } from "./type";
|
import type { SpotlightActionData } from "./type";
|
||||||
|
import { useWebSearchEngines } from "./web-search-engines";
|
||||||
|
|
||||||
export const Spotlight = () => {
|
export const Spotlight = () => {
|
||||||
|
useWebSearchEngines();
|
||||||
const [query, setQuery] = useState("");
|
const [query, setQuery] = useState("");
|
||||||
const [group, setGroup] = useState("all");
|
const [group, setGroup] = useState("all");
|
||||||
const groups = useAtomValue(groupsAtomRead);
|
const groups = useAtomValue(groupsAtomRead);
|
||||||
@@ -46,7 +48,11 @@ export const Spotlight = () => {
|
|||||||
const renderRoot =
|
const renderRoot =
|
||||||
item.type === "link"
|
item.type === "link"
|
||||||
? (props: Record<string, unknown>) => (
|
? (props: Record<string, unknown>) => (
|
||||||
<Link href={prepareHref(item.href, query)} {...props} />
|
<Link
|
||||||
|
href={prepareHref(item.href, query)}
|
||||||
|
target={item.openInNewTab ? "_blank" : undefined}
|
||||||
|
{...props}
|
||||||
|
/>
|
||||||
)
|
)
|
||||||
: undefined;
|
: undefined;
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
import { spotlightActions } from "./spotlight-store";
|
import { spotlightActions } from "./spotlight-store";
|
||||||
|
|
||||||
export { Spotlight } from "./component";
|
export { Spotlight } from "./component";
|
||||||
|
export { useRegisterSpotlightActions } from "./data-store";
|
||||||
|
export { openSpotlight };
|
||||||
|
|
||||||
const openSpotlight = spotlightActions.open;
|
const openSpotlight = spotlightActions.open;
|
||||||
export { openSpotlight };
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ interface BaseSpotlightAction {
|
|||||||
interface SpotlightActionLink extends BaseSpotlightAction {
|
interface SpotlightActionLink extends BaseSpotlightAction {
|
||||||
type: "link";
|
type: "link";
|
||||||
href: string;
|
href: string;
|
||||||
|
openInNewTab?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
type MaybePromise<T> = T | Promise<T>;
|
type MaybePromise<T> = T | Promise<T>;
|
||||||
|
|||||||
63
packages/spotlight/src/web-search-engines.ts
Normal file
63
packages/spotlight/src/web-search-engines.ts
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
import { IconDownload } from "@homarr/ui";
|
||||||
|
|
||||||
|
import { useRegisterSpotlightActions } from "./data-store";
|
||||||
|
|
||||||
|
export const useWebSearchEngines = () => {
|
||||||
|
useRegisterSpotlightActions("web-search-engines", [
|
||||||
|
{
|
||||||
|
id: "google",
|
||||||
|
title: "Google",
|
||||||
|
description: "Search the web with Google",
|
||||||
|
icon: "https://www.google.com/favicon.ico",
|
||||||
|
href: "https://www.google.com/search?q=%s",
|
||||||
|
group: "web",
|
||||||
|
type: "link",
|
||||||
|
ignoreSearchAndOnlyShowInGroup: true,
|
||||||
|
openInNewTab: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "bing",
|
||||||
|
title: "Bing",
|
||||||
|
description: "Search the web with Bing",
|
||||||
|
icon: "https://www.bing.com/favicon.ico",
|
||||||
|
href: "https://www.bing.com/search?q=%s",
|
||||||
|
group: "web",
|
||||||
|
type: "link",
|
||||||
|
ignoreSearchAndOnlyShowInGroup: true,
|
||||||
|
openInNewTab: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "duckduckgo",
|
||||||
|
title: "DuckDuckGo",
|
||||||
|
description: "Search the web with DuckDuckGo",
|
||||||
|
icon: "https://duckduckgo.com/favicon.ico",
|
||||||
|
href: "https://duckduckgo.com/?q=%s",
|
||||||
|
group: "web",
|
||||||
|
type: "link",
|
||||||
|
ignoreSearchAndOnlyShowInGroup: true,
|
||||||
|
openInNewTab: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "torrent",
|
||||||
|
title: "Torrents",
|
||||||
|
description: "Search for torrents on torrentdownloads.pro",
|
||||||
|
icon: IconDownload,
|
||||||
|
href: "https://www.torrentdownloads.pro/search/?search=%s",
|
||||||
|
group: "web",
|
||||||
|
type: "link",
|
||||||
|
ignoreSearchAndOnlyShowInGroup: true,
|
||||||
|
openInNewTab: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "youtube",
|
||||||
|
title: "YouTube",
|
||||||
|
description: "Search for videos on YouTube",
|
||||||
|
icon: "https://www.youtube.com/favicon.ico",
|
||||||
|
href: "https://www.youtube.com/results?search_query=%s",
|
||||||
|
group: "web",
|
||||||
|
type: "link",
|
||||||
|
ignoreSearchAndOnlyShowInGroup: true,
|
||||||
|
openInNewTab: true,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user