memorium/islands/KMenu/commands/create_movie.ts

73 lines
1.8 KiB
TypeScript
Raw Normal View History

2023-08-04 13:48:12 +02:00
import { MenuEntry } from "@islands/KMenu/types.ts";
import { TMDBMovie } from "@lib/types.ts";
import { debounce } from "@lib/helpers.ts";
import { Movie } from "@lib/resource/movies.ts";
export const createNewMovie: MenuEntry = {
title: "Create new movie",
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;
console.log({ query });
if (query.length < 2) {
return;
}
const response = await fetch("/api/tmdb/query?q=" + query);
const movies = await response.json() as TMDBMovie[];
console.log({ query, currentQuery, movies });
if (query !== currentQuery) return;
state.menus["input_link"] = {
title: "Search",
entries: movies.map((r) => {
return {
title: `${r.title} - ${r.release_date}`,
cb: async () => {
state.activeState.value = "loading";
const response = await fetch("/api/movies/" + r.id, {
method: "POST",
});
const movie = await response.json() as Movie;
window.location.href = "/movies/" + movie.name;
},
};
}),
};
state.activeMenu.value = "input_link";
}, 500);
const unsub = state.commandInput.subscribe((value) => {
state.activeMenu.value = "loading";
search(value);
});
},
visible: () => true,
};