mirror of
https://github.com/linsa-io/linsa.git
synced 2026-02-23 19:05:01 +01:00
* wip * feat: new command palette * chore: add universal search * chore: cleanup * feat: use title class for heading * feat: add topic * chore: advance search
61 lines
1.4 KiB
TypeScript
61 lines
1.4 KiB
TypeScript
import * as React from "react"
|
|
import { ensureUrlProtocol } from "@/lib/utils"
|
|
import { useTheme } from "next-themes"
|
|
import { toast } from "sonner"
|
|
import { useRouter } from "next/navigation"
|
|
import { LaAccount, PersonalPage } from "@/lib/schema"
|
|
|
|
export const useCommandActions = () => {
|
|
const { setTheme } = useTheme()
|
|
const router = useRouter()
|
|
|
|
const changeTheme = React.useCallback(
|
|
(theme: string) => {
|
|
setTheme(theme)
|
|
toast.success(`Theme changed to ${theme}.`, { position: "bottom-right" })
|
|
},
|
|
[setTheme]
|
|
)
|
|
|
|
const navigateTo = React.useCallback(
|
|
(path: string) => {
|
|
router.push(path)
|
|
},
|
|
[router]
|
|
)
|
|
|
|
const openLinkInNewTab = React.useCallback((url: string) => {
|
|
window.open(ensureUrlProtocol(url), "_blank")
|
|
}, [])
|
|
|
|
const copyCurrentURL = React.useCallback(() => {
|
|
navigator.clipboard.writeText(window.location.href)
|
|
toast.success("URL copied to clipboard.", { position: "bottom-right" })
|
|
}, [])
|
|
|
|
const createNewPage = React.useCallback(
|
|
(me: LaAccount) => {
|
|
try {
|
|
const newPersonalPage = PersonalPage.create(
|
|
{ public: false, createdAt: new Date(), updatedAt: new Date() },
|
|
{ owner: me._owner }
|
|
)
|
|
|
|
me.root?.personalPages?.push(newPersonalPage)
|
|
router.push(`/pages/${newPersonalPage.id}`)
|
|
} catch (error) {
|
|
toast.error("Failed to create page")
|
|
}
|
|
},
|
|
[router]
|
|
)
|
|
|
|
return {
|
|
changeTheme,
|
|
navigateTo,
|
|
openLinkInNewTab,
|
|
copyCurrentURL,
|
|
createNewPage
|
|
}
|
|
}
|