memorium/_fresh/island-kmenu_kmenu.js.map
2023-08-24 00:13:09 +02:00

8 lines
29 KiB
Plaintext

{
"version": 3,
"sources": ["islands/KMenu/commands/add_movie_infos.ts", "lib/helpers.ts", "islands/KMenu/commands/create_movie.ts", "islands/KMenu/commands/create_article.ts", "islands/KMenu/commands/add_series_infos.ts", "islands/KMenu/commands/create_series.ts", "islands/KMenu/commands.ts", "islands/KMenu.tsx"],
"sourcesContent": ["import { MenuEntry } from \"@islands/KMenu/types.ts\";\nimport { Movie } from \"@lib/resource/movies.ts\";\nimport { TMDBMovie } from \"@lib/types.ts\";\nimport { getCookie } from \"@lib/string.ts\";\n\nexport const addMovieInfos: MenuEntry = {\n title: \"Add Movie infos\",\n meta: \"\",\n icon: \"IconReportSearch\",\n cb: async (state, context) => {\n state.activeState.value = \"loading\";\n const movie = context as Movie;\n\n const query = movie.name;\n\n const response = await fetch(\n `/api/tmdb/query?q=${encodeURIComponent(query)}`,\n );\n\n const json = await response.json() as TMDBMovie[];\n\n const menuID = `result/${movie.name}`;\n\n state.menus[menuID] = {\n title: \"Select\",\n entries: json.map((m) => ({\n title: `${m.title} released ${m.release_date}`,\n cb: async () => {\n state.activeState.value = \"loading\";\n await fetch(`/api/movies/enhance/${movie.name}/`, {\n method: \"POST\",\n body: JSON.stringify({ tmdbId: m.id }),\n });\n state.visible.value = false;\n state.activeState.value = \"normal\";\n window.location.reload();\n },\n })),\n };\n\n state.activeMenu.value = menuID;\n state.commandInput.value = \"\";\n state.activeState.value = \"normal\";\n },\n visible: () => {\n const loc = globalThis[\"location\"];\n if (!getCookie(\"session_cookie\")) return false;\n return (loc?.pathname?.includes(\"movie\") &&\n !loc.pathname.endsWith(\"movies\"));\n },\n};\n", "export function json(content: unknown) {\n const headers = new Headers();\n headers.append(\"Content-Type\", \"application/json\");\n return new Response(JSON.stringify(content), {\n headers,\n });\n}\n\nexport const isValidUrl = (urlString: string) => {\n try {\n return Boolean(new URL(urlString));\n } catch (e) {\n return false;\n }\n};\n\nexport const fixRenderedMarkdown = (content: string) => {\n return content.replace(\"***\\n\", \"---\")\n .replace(\"----------------\", \"---\")\n .replace(\"\\n---\", \"---\")\n .replace(/^(date:[^'\\n]*)'|'/gm, (match, p1, p2) => {\n if (p1) {\n // This is a line starting with date: followed by single quotes\n return p1.replace(/'/gm, \"\");\n } else if (p2) {\n return \"\";\n } else {\n // This is a line with single quotes, but not starting with date:\n return match;\n }\n });\n};\n\nexport async function fetchStream(url: string, cb: (chunk: string) => void) {\n const response = await fetch(url);\n const reader = response?.body?.getReader();\n if (reader) {\n while (true) {\n const { done, value } = await reader.read();\n if (done) return;\n const data = new TextDecoder().decode(value);\n data\n .split(\"$\")\n .filter((d) => d && d.length)\n .map((d) => cb(Array.isArray(d) ? d[0] : d));\n }\n }\n}\n\nexport const createStreamResponse = () => {\n let controller: ReadableStreamController<ArrayBufferView>;\n const body = new ReadableStream({\n start(cont) {\n controller = cont;\n },\n });\n\n const response = new Response(body, {\n headers: {\n \"content-type\": \"text/plain\",\n \"x-content-type-options\": \"nosniff\",\n },\n });\n\n function cancel() {\n controller.close();\n }\n\n function enqueue(chunk: string) {\n controller?.enqueue(new TextEncoder().encode(\"$\" + chunk));\n }\n\n return {\n response,\n cancel,\n enqueue,\n };\n};\n\nexport function debounce<T extends (...args: Parameters<T>) => void>(\n this: ThisParameterType<T>,\n fn: T,\n delay = 300,\n) {\n let timer: ReturnType<typeof setTimeout> | undefined;\n return (...args: Parameters<T>) => {\n clearTimeout(timer);\n timer = setTimeout(() => fn.apply(this, args), delay);\n };\n}\n", "import { MenuEntry } from \"@islands/KMenu/types.ts\";\nimport { TMDBMovie } from \"@lib/types.ts\";\nimport { debounce } from \"@lib/helpers.ts\";\nimport { Movie } from \"@lib/resource/movies.ts\";\nimport { getCookie } from \"@lib/string.ts\";\n\nexport const createNewMovie: MenuEntry = {\n title: \"Create new movie\",\n meta: \"\",\n icon: \"IconSquareRoundedPlus\",\n cb: (state) => {\n state.menus[\"input_link\"] = {\n title: \"Search\",\n entries: [],\n };\n\n state.menus[\"loading\"] = {\n title: \"Search\",\n entries: [\n {\n title: \"Loading\",\n icon: \"IconLoader2\",\n cb() {\n },\n },\n ],\n };\n\n state.activeMenu.value = \"input_link\";\n state.activeState.value = \"normal\";\n\n let currentQuery: string;\n const search = debounce(async function search(query: string) {\n currentQuery = query;\n if (query.length < 2) {\n return;\n }\n\n const response = await fetch(\"/api/tmdb/query?q=\" + query);\n\n const movies = await response.json() as TMDBMovie[];\n\n if (query !== currentQuery) return;\n\n state.menus[\"input_link\"] = {\n title: \"Search\",\n entries: movies.map((r) => {\n return {\n title: `${r.title} - ${r.release_date}`,\n cb: async () => {\n state.activeState.value = \"loading\";\n const response = await fetch(\"/api/movies/\" + r.id, {\n method: \"POST\",\n });\n const movie = await response.json() as Movie;\n unsub();\n window.location.href = \"/movies/\" + movie.name;\n },\n };\n }),\n };\n state.activeMenu.value = \"input_link\";\n }, 500);\n\n const unsub = state.commandInput.subscribe((value) => {\n state.activeMenu.value = \"loading\";\n search(value);\n });\n },\n visible: () => {\n if (!getCookie(\"session_cookie\")) return false;\n if (\n !globalThis?.location?.pathname?.includes(\"movie\") &&\n globalThis?.location?.pathname !== \"/\"\n ) return false;\n return true;\n },\n};\n", "import { MenuEntry } from \"@islands/KMenu/types.ts\";\nimport { fetchStream, isValidUrl } from \"@lib/helpers.ts\";\nimport { getCookie } from \"@lib/string.ts\";\n\nexport const createNewArticle: MenuEntry = {\n title: \"Create new article\",\n meta: \"\",\n icon: \"IconSquareRoundedPlus\",\n cb: (state) => {\n state.menus[\"input_link\"] = {\n title: \"Link:\",\n entries: [],\n };\n\n state.activeMenu.value = \"input_link\";\n state.activeState.value = \"input\";\n\n const unsub = state.commandInput.subscribe((value) => {\n if (isValidUrl(value)) {\n unsub();\n\n state.activeState.value = \"loading\";\n\n fetchStream(\"/api/articles/create?url=\" + value, (chunk) => {\n if (chunk.startsWith(\"id:\")) {\n state.loadingText.value = \"Finished\";\n setTimeout(() => {\n window.location.href = \"/articles/\" +\n chunk.replace(\"id:\", \"\").trim();\n }, 500);\n } else {\n state.loadingText.value = chunk;\n }\n });\n }\n });\n },\n visible: () => {\n if (!getCookie(\"session_cookie\")) return false;\n if (\n !globalThis?.location?.pathname?.includes(\"article\") &&\n globalThis?.location?.pathname !== \"/\"\n ) return false;\n return true;\n },\n};\n", "import { MenuEntry } from \"@islands/KMenu/types.ts\";\nimport { TMDBSeries } from \"@lib/types.ts\";\nimport { getCookie } from \"@lib/string.ts\";\nimport { Series } from \"@lib/resource/series.ts\";\n\nexport const addSeriesInfo: MenuEntry = {\n title: \"Add Series infos\",\n meta: \"\",\n icon: \"IconReportSearch\",\n cb: async (state, context) => {\n state.activeState.value = \"loading\";\n const series = context as Series;\n\n const query = series.name;\n\n const response = await fetch(\n `/api/tmdb/query?q=${encodeURIComponent(query)}&type=serie`,\n );\n\n const json = await response.json() as TMDBSeries[];\n\n const menuID = `result/${series.name}`;\n\n state.menus[menuID] = {\n title: \"Select\",\n entries: json.map((m) => ({\n title: `${m.name || m.original_name} released ${m.first_air_date}`,\n cb: async () => {\n state.activeState.value = \"loading\";\n await fetch(`/api/series/enhance/${series.name}/`, {\n method: \"POST\",\n body: JSON.stringify({ tmdbId: m.id }),\n });\n state.visible.value = false;\n state.activeState.value = \"normal\";\n //window.location.reload();\n },\n })),\n };\n\n state.commandInput.value = \"\";\n state.activeMenu.value = menuID;\n state.activeState.value = \"normal\";\n },\n visible: () => {\n const loc = globalThis[\"location\"];\n if (!getCookie(\"session_cookie\")) return false;\n return (loc?.pathname?.includes(\"series\") &&\n !loc.pathname.endsWith(\"series\"));\n },\n};\n", "import { MenuEntry } from \"@islands/KMenu/types.ts\";\nimport { TMDBSeries } from \"@lib/types.ts\";\nimport { debounce } from \"@lib/helpers.ts\";\nimport { Series } from \"@lib/resource/series.ts\";\nimport { getCookie } from \"@lib/string.ts\";\n\nexport const createNewSeries: MenuEntry = {\n title: \"Create new series\",\n meta: \"\",\n icon: \"IconSquareRoundedPlus\",\n cb: (state) => {\n state.menus[\"input_link\"] = {\n title: \"Search\",\n entries: [],\n };\n\n state.menus[\"loading\"] = {\n title: \"Search\",\n entries: [\n {\n title: \"Loading\",\n icon: \"IconLoader2\",\n cb() {\n },\n },\n ],\n };\n\n state.activeMenu.value = \"input_link\";\n state.activeState.value = \"normal\";\n\n let currentQuery: string;\n const search = debounce(async function search(query: string) {\n currentQuery = query;\n if (query.length < 2) {\n return;\n }\n\n const response = await fetch(\n \"/api/tmdb/query?q=\" + query + \"&type=series\",\n );\n\n const series = await response.json() as TMDBSeries[];\n\n if (query !== currentQuery) return;\n\n state.menus[\"input_link\"] = {\n title: \"Search\",\n entries: series.map((r) => {\n return {\n title: `${r.name} - ${r.first_air_date}`,\n cb: async () => {\n state.activeState.value = \"loading\";\n const response = await fetch(\"/api/series/\" + r.id, {\n method: \"POST\",\n });\n const series = await response.json() as Series;\n unsub();\n window.location.href = \"/series/\" + series.name;\n },\n };\n }),\n };\n state.commandInput.value = \"\";\n state.activeMenu.value = \"input_link\";\n }, 500);\n\n const unsub = state.commandInput.subscribe((value) => {\n state.activeMenu.value = \"loading\";\n search(value);\n });\n },\n visible: () => {\n if (!getCookie(\"session_cookie\")) return false;\n if (\n !globalThis?.location?.pathname?.includes(\"series\") &&\n globalThis?.location?.pathname !== \"/\"\n ) return false;\n return true;\n },\n};\n", "import { Menu } from \"@islands/KMenu/types.ts\";\nimport { addMovieInfos } from \"@islands/KMenu/commands/add_movie_infos.ts\";\nimport { createNewMovie } from \"@islands/KMenu/commands/create_movie.ts\";\nimport { createNewArticle } from \"@islands/KMenu/commands/create_article.ts\";\nimport { getCookie } from \"@lib/string.ts\";\nimport { addSeriesInfo } from \"@islands/KMenu/commands/add_series_infos.ts\";\nimport { createNewSeries } from \"@islands/KMenu/commands/create_series.ts\";\n\nexport const menus: Record<string, Menu> = {\n main: {\n title: \"Run\",\n entries: [\n {\n title: \"Clear Cache\",\n icon: \"IconRefresh\",\n cb: async (state) => {\n state.activeState.value = \"loading\";\n await fetch(\"/api/cache\", {\n method: \"DELETE\",\n });\n state.activeState.value = \"normal\";\n state.visible.value = false;\n },\n visible: () => {\n if (!getCookie(\"session_cookie\")) return false;\n return true;\n },\n },\n {\n title: \"Login\",\n icon: \"IconLogin\",\n cb: () => {\n const url = new URL(window.location.href);\n url.pathname = \"/api/auth/login\";\n url.searchParams.set(\n \"redirect\",\n encodeURIComponent(window.location.pathname),\n );\n window.location.href = url.href;\n },\n visible: () => {\n return !getCookie(\"session_cookie\");\n },\n },\n {\n title: \"Search\",\n icon: \"IconSearch\",\n cb: () => {\n window.location.href += \"?q=\";\n },\n visible: () => {\n return !!getCookie(\"session_cookie\") && window.location.search === \"\";\n },\n },\n {\n title: \"Logout\",\n icon: \"IconLogout\",\n cb: () => {\n const url = new URL(window.location.href);\n url.pathname = \"/api/auth/logout\";\n url.searchParams.set(\n \"redirect\",\n encodeURIComponent(window.location.pathname),\n );\n window.location.href = url.href;\n },\n visible: () => {\n return !!getCookie(\"session_cookie\");\n },\n },\n {\n title: \"Sync Typesense\",\n icon: \"IconStarFilled\",\n cb: () => {\n fetch(\"/api/query/sync\", {\n method: \"POST\",\n });\n },\n visible: () => {\n return !!getCookie(\"session_cookie\");\n },\n },\n addSeriesInfo,\n createNewArticle,\n createNewMovie,\n createNewSeries,\n addMovieInfos,\n ],\n },\n};\n", "import { Signal, useSignal } from \"@preact/signals\";\nimport { useEffect, useRef } from \"preact/hooks\";\nimport { useEventListener } from \"@lib/hooks/useEventListener.ts\";\nimport { menus } from \"@islands/KMenu/commands.ts\";\nimport { MenuEntry } from \"@islands/KMenu/types.ts\";\nimport * as icons from \"@components/icons.tsx\";\nimport { IS_BROWSER } from \"$fresh/runtime.ts\";\nconst KMenuEntry = (\n { entry, activeIndex, index }: {\n entry: MenuEntry;\n activeIndex: Signal<number>;\n index: number;\n },\n) => {\n return (\n <div\n onClick={() => activeIndex.value = index}\n class={`px-4 py-2 flex items-center gap-1 ${\n activeIndex.value === index\n ? \"bg-gray-100 text-gray-900\"\n : \"text-gray-400\"\n }`}\n >\n {entry?.icon && icons[entry.icon]({ class: \"w-4 h-4 mr-1\" })}\n {entry.title}\n </div>\n );\n};\n\nexport const KMenu = (\n { type = \"main\", context }: { context: unknown; type: keyof typeof menus },\n) => {\n const activeMenuType = useSignal(type);\n const activeMenu = menus[activeMenuType.value || \"main\"];\n const activeState = useSignal<\"normal\" | \"loading\" | \"error\" | \"input\">(\n \"normal\",\n );\n const loadingText = useSignal(\"\");\n const activeIndex = useSignal(-1);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const input = useRef<HTMLInputElement>(null);\n const commandInput = useSignal(\"\");\n\n const visible = useSignal(false);\n if (visible.value === false) {\n setTimeout(() => {\n activeMenuType.value = \"main\";\n activeState.value = \"normal\";\n if (input.current) {\n input.current.value = \"\";\n }\n commandInput.value = \"\";\n }, 100);\n }\n\n const entries = activeMenu?.entries?.filter((entry) => {\n const entryVisible = typeof entry[\"visible\"] === \"boolean\"\n ? entry.visible\n : typeof entry[\"visible\"] === \"function\"\n ? entry.visible?.(context)\n : true;\n\n const search = commandInput?.value?.toLowerCase();\n const searchMatches = entry.title.toLowerCase().includes(search) ||\n entry.meta?.toLowerCase()?.includes(search);\n\n return entryVisible && searchMatches;\n });\n\n if (entries.length === 1) {\n activeIndex.value = 0;\n }\n\n function activateEntry(menuEntry?: MenuEntry) {\n if (!menuEntry) return;\n\n menuEntry.cb({\n activeMenu: activeMenuType,\n loadingText,\n menus,\n activeState,\n commandInput,\n visible,\n }, context);\n }\n\n const container = containerRef.current;\n if (container) {\n const selectedItem = container.children[activeIndex.value];\n if (selectedItem) {\n const itemPosition = selectedItem.getBoundingClientRect();\n const containerPosition = container.getBoundingClientRect();\n\n // Check if the selected item is above the visible area\n if (itemPosition.top < containerPosition.top) {\n container.scrollTop -= containerPosition.top - itemPosition.top;\n } // Check if the selected item is below the visible area\n else if (itemPosition.bottom > containerPosition.bottom) {\n container.scrollTop += itemPosition.bottom - containerPosition.bottom;\n }\n }\n }\n\n useEventListener(\"keydown\", (ev: KeyboardEvent) => {\n if (ev.key === \"k\") {\n if (ev?.target?.nodeName == \"INPUT\") {\n return;\n }\n\n if (!visible.value) {\n ev.preventDefault();\n ev.stopPropagation();\n }\n\n visible.value = !visible.value;\n }\n\n if (ev.key === \"ArrowDown\") {\n const index = activeIndex.value;\n if (index + 1 >= entries.length) {\n activeIndex.value = 0;\n } else {\n activeIndex.value += 1;\n }\n }\n\n if (ev.key === \"Enter\") {\n activateEntry(entries[activeIndex.value]);\n }\n\n if (ev.key === \"ArrowUp\") {\n const index = activeIndex.value;\n if (index - 1 < 0) {\n activeIndex.value = entries.length - 1;\n } else {\n activeIndex.value -= 1;\n }\n }\n\n if (ev.key === \"Escape\") {\n visible.value = false;\n if (input.current) {\n input.current.value = \"\";\n }\n }\n\n if (visible.value) {\n input.current?.focus();\n } else {\n input.current?.blur();\n }\n }, IS_BROWSER ? document?.body : undefined);\n\n return (\n <div\n class={`opacity-${visible.value ? 100 : 0} pointer-events-${\n visible.value ? \"auto\" : \"none\"\n } transition grid place-items-center w-full h-full fixed top-0 left-0 z-50`}\n style={{ background: \"#141217ee\" }}\n >\n <div\n class={`relative w-1/2 max-h-64 max-w-[400px] rounded-2xl shadow-2xl nnoisy-gradient overflow-hidden after:opacity-10 bg-gray-700`}\n style={{ background: \"#2B2930\", color: \"#818181\" }}\n >\n <div\n class={`grid h-12 text-gray-400 ${\n activeState.value !== \"loading\" && \"border-b\"\n } border-gray-500 `}\n style={{\n gridTemplateColumns: activeState.value !== \"loading\"\n ? \"auto 1fr\"\n : \"1fr\",\n }}\n >\n {(activeState.value === \"normal\" || activeState.value === \"input\") &&\n (\n <>\n <div class=\"grid place-items-center border-r border-gray-500\">\n <span class=\"text-white mx-4\">\n {activeMenu.title}\n </span>\n </div>\n <input\n ref={input}\n onInput={() => {\n commandInput.value = input.current?.value || \"\";\n }}\n style={{ outline: \"none !important\" }}\n placeholder=\"Command\"\n class=\"bg-transparent color pl-4 outline outline outline-2 outline-offset-2\"\n />\n </>\n )}\n {activeState.value === \"loading\" && (\n <div class=\"py-3 px-4 flex items-center gap-2\">\n <icons.IconLoader2 class=\"animate-spin w-4 h-4\" />\n {loadingText.value || \"Loading...\"}\n </div>\n )}\n </div>\n {activeState.value === \"normal\" &&\n (\n <div\n class=\"\"\n style={{ maxHeight: \"12rem\", overflowY: \"auto\" }}\n ref={containerRef}\n >\n {entries?.length === 0 && (\n <div class=\"text-gray-400 px-4 py-2\">\n No Entries\n </div>\n )}\n {entries.map(\n (k, index) => {\n return (\n <KMenuEntry\n entry={k}\n activeIndex={activeIndex}\n index={index}\n />\n );\n },\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n"],
"mappings": "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",
"names": ["series", "k"]
}