82 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { MenuEntry } from "@islands/KMenu/types.ts";
 | |
| import { TMDBSeries } from "@lib/types.ts";
 | |
| import { debounce } from "@lib/helpers.ts";
 | |
| import { Series } from "@lib/resource/series.ts";
 | |
| import { getCookie } from "@lib/string.ts";
 | |
| 
 | |
| export const createNewSeries: MenuEntry = {
 | |
|   title: "Create new series",
 | |
|   meta: "",
 | |
|   icon: "IconSquareRoundedPlus",
 | |
|   cb: (state) => {
 | |
|     state.menus["input_link"] = {
 | |
|       title: "Search",
 | |
|       entries: [],
 | |
|     };
 | |
| 
 | |
|     state.menus["loading"] = {
 | |
|       title: "Search",
 | |
|       entries: [
 | |
|         {
 | |
|           title: "Loading",
 | |
|           icon: "IconLoader2",
 | |
|           cb() {
 | |
|           },
 | |
|         },
 | |
|       ],
 | |
|     };
 | |
| 
 | |
|     state.activeMenu.value = "input_link";
 | |
|     state.activeState.value = "normal";
 | |
| 
 | |
|     let currentQuery: string;
 | |
|     const search = debounce(async function search(query: string) {
 | |
|       currentQuery = query;
 | |
|       if (query.length < 2) {
 | |
|         return;
 | |
|       }
 | |
| 
 | |
|       const response = await fetch(
 | |
|         "/api/tmdb/query?q=" + query + "&type=series",
 | |
|       );
 | |
| 
 | |
|       const series = await response.json() as TMDBSeries[];
 | |
| 
 | |
|       if (query !== currentQuery) return;
 | |
| 
 | |
|       state.menus["input_link"] = {
 | |
|         title: "Search",
 | |
|         entries: series.map((r) => {
 | |
|           return {
 | |
|             title: `${r.name} - ${r.first_air_date}`,
 | |
|             cb: async () => {
 | |
|               state.activeState.value = "loading";
 | |
|               const response = await fetch("/api/series/" + r.id, {
 | |
|                 method: "POST",
 | |
|               });
 | |
|               const series = await response.json() as Series;
 | |
|               unsub();
 | |
|               window.location.href = "/series/" + series.name;
 | |
|             },
 | |
|           };
 | |
|         }),
 | |
|       };
 | |
|       state.commandInput.value = "";
 | |
|       state.activeMenu.value = "input_link";
 | |
|     }, 500);
 | |
| 
 | |
|     const unsub = state.commandInput.subscribe((value) => {
 | |
|       state.activeMenu.value = "loading";
 | |
|       search(value);
 | |
|     });
 | |
|   },
 | |
|   visible: () => {
 | |
|     if (!getCookie("session_cookie")) return false;
 | |
|     if (
 | |
|       !globalThis?.location?.pathname?.includes("series") &&
 | |
|       globalThis?.location?.pathname !== "/"
 | |
|     ) return false;
 | |
|     return true;
 | |
|   },
 | |
| };
 |