Files
archived-linsa/web/app/components/command-palette/utils.ts
2024-10-07 12:44:17 +03:00

75 lines
1.9 KiB
TypeScript

import { GraphData } from "~/lib/constants"
import { CommandAction, CommandItemType } from "./command-data"
export const filterItems = (items: CommandItemType[], searchRegex: RegExp) =>
items.filter((item) => searchRegex.test(item.value)).slice(0, 10)
export const getTopics = (actions: { navigateTo: (path: string) => void }) => ({
heading: "Topics",
items: GraphData.map((topic) => ({
icon: "Circle" as const,
value: topic?.prettyName || "",
label: topic?.prettyName || "",
action: () => actions.navigateTo(`/${topic?.name}`),
})),
})
export const getPersonalLinks = (
personalLinks: any[],
actions: { openLinkInNewTab: (url: string) => void },
) => ({
heading: "Personal Links",
items: personalLinks.map((link) => ({
id: link?.id,
icon: "Link" as const,
value: link?.title || "Untitled",
label: link?.title || "Untitled",
action: () => actions.openLinkInNewTab(link?.url || "#"),
})),
})
export const getPersonalPages = (
personalPages: any[],
actions: { navigateTo: (path: string) => void },
) => ({
heading: "Personal Pages",
items: personalPages.map((page) => ({
id: page?.id,
icon: "FileText" as const,
value: page?.title || "Untitled",
label: page?.title || "Untitled",
action: () => actions.navigateTo(`/pages/${page?.id}`),
})),
})
export const handleAction = (
action: CommandAction,
payload: any,
callbacks: {
setActivePage: (page: string) => void
setInputValue: (value: string) => void
bounce: () => void
closeDialog: () => void
},
) => {
const { setActivePage, setInputValue, bounce, closeDialog } = callbacks
if (typeof action === "function") {
action()
closeDialog()
return
}
switch (action) {
case "CHANGE_PAGE":
if (payload) {
setActivePage(payload)
setInputValue("")
bounce()
}
break
default:
closeDialog()
}
}