Files
linsa-linsa-io/web/shared/minimal-tiptap/utils.ts
2024-10-07 12:44:17 +03:00

93 lines
2.1 KiB
TypeScript

import type { Editor } from "@tiptap/core"
import type { MinimalTiptapProps } from "./minimal-tiptap"
let isMac: boolean | undefined
interface Navigator {
userAgentData?: {
brands: { brand: string; version: string }[]
mobile: boolean
platform: string
getHighEntropyValues: (hints: string[]) => Promise<{
platform: string
platformVersion: string
uaFullVersion: string
}>
}
}
function getPlatform(): string {
const nav = navigator as Navigator
if (nav.userAgentData) {
if (nav.userAgentData.platform) {
return nav.userAgentData.platform
}
nav.userAgentData
.getHighEntropyValues(["platform"])
.then((highEntropyValues) => {
if (highEntropyValues.platform) {
return highEntropyValues.platform
}
})
}
if (typeof navigator.platform === "string") {
return navigator.platform
}
return ""
}
export function isMacOS() {
if (isMac === undefined) {
isMac = getPlatform().toLowerCase().includes("mac")
}
return isMac
}
interface ShortcutKeyResult {
symbol: string
readable: string
}
export function getShortcutKey(key: string): ShortcutKeyResult {
const lowercaseKey = key.toLowerCase()
if (lowercaseKey === "mod") {
return isMacOS()
? { symbol: "⌘", readable: "Command" }
: { symbol: "Ctrl", readable: "Control" }
} else if (lowercaseKey === "alt") {
return isMacOS()
? { symbol: "⌥", readable: "Option" }
: { symbol: "Alt", readable: "Alt" }
} else if (lowercaseKey === "shift") {
return isMacOS()
? { symbol: "⇧", readable: "Shift" }
: { symbol: "Shift", readable: "Shift" }
} else {
return { symbol: key, readable: key }
}
}
export function getShortcutKeys(keys: string[]): ShortcutKeyResult[] {
return keys.map((key) => getShortcutKey(key))
}
export function getOutput(
editor: Editor,
format: MinimalTiptapProps["output"],
) {
if (format === "json") {
return editor.getJSON()
}
if (format === "html") {
return editor.getText() ? editor.getHTML() : ""
}
return editor.getText()
}