PIMS/public/build/assets/Index-Dc3cIue4.js

2 lines
6.4 KiB
JavaScript

import{d as $,r as o,c as H,e as U,p as z,a as r,f as C,u as B,h as F,w as A,b as s,i as v,q as K,z as J,v as G,o as n,t as m,F as h,g as Q,l as j,T as Y}from"./app-CClrM5Yi.js";import{_ as Z}from"./AppLayout.vue_vue_type_script_setup_true_lang-DESMBqxz.js";import{_ as ee}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./AppLogoIcon.vue_vue_type_script_setup_true_lang-7XZAfK5W.js";import"./useForwardExpose-BhawR5VU.js";import"./VisuallyHidden-Cu70tzB6.js";import"./RovingFocusGroup-CNFroA6Y.js";import"./useArrowNavigation-C6Y-ieo6.js";import"./index-C4J_hXM0.js";import"./createLucideIcon-ZFd4jktC.js";const te={class:"flex h-full flex-1 flex-col gap-4 overflow-x-auto rounded-xl p-4"},ae={class:"flex items-center gap-2"},se={key:0,class:"rounded-md border border-red-300 bg-red-50 p-3 text-red-800 dark:border-red-800 dark:bg-red-950 dark:text-red-200"},oe={class:"divide-y divide-muted-foreground/20"},re={class:"h-20 w-14 shrink-0 overflow-hidden rounded bg-muted"},ne=["src"],ie={class:"flex min-w-0 flex-1 flex-col"},le={class:"flex items-center justify-between gap-2"},ce={class:"truncate font-medium"},de={class:"text-xs text-muted-foreground"},ue={class:"mt-2"},fe={key:0,class:"inline-flex items-center rounded-md border px-3 py-1.5 text-xs"},pe=["disabled","aria-busy","onClick"],ve={key:0},me={key:1},he={key:0,class:"fixed bottom-4 left-1/2 z-50 -translate-x-1/2 rounded bg-foreground px-3 py-2 text-sm text-background shadow-lg"},_e={key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/50"},xe={class:"w-full max-w-md rounded-lg bg-background p-5 shadow-lg"},ge={class:"text-base font-semibold"},ye=$({__name:"Index",setup(be){const _=o(""),x=o(1),i=o([]),D=o(0),w=o(!1),d=o(!1),g=o(null),c=o(!1),y=o(""),u=o(new Set),p=o(!1),q=o(""),k=o("");let S=null;const E=H(()=>w.value&&!d.value);async function T(e=!1){if(!d.value){d.value=!0,g.value=null;try{const a=new URLSearchParams;a.set("q",_.value),a.set("page",String(x.value));const t=await fetch(`/admin/movies/search?${a.toString()}`,{headers:{Accept:"application/json","X-Requested-With":"XMLHttpRequest"},credentials:"same-origin"});if(!t.ok)throw new Error(`Search failed: ${t.status}`);const l=await t.json();D.value=l.total,w.value=l.has_more,e?i.value=l.results:i.value=i.value.concat(l.results)}catch(a){g.value=a?.message??"Unexpected error"}finally{d.value=!1}}}function L(){clearTimeout(S);const e=_.value.trim().length;e>=3&&e%3===0&&(S=setTimeout(()=>{x.value=1,T(!0)},300))}function N(){clearTimeout(S),x.value=1,T(!0)}async function X(){E.value&&(x.value+=1,await T(!1))}const b=o(null);let f=null;U(()=>{f=new IntersectionObserver(e=>{for(const a of e)a.isIntersecting&&X()},{root:null,rootMargin:"200px",threshold:0}),b.value&&f.observe(b.value)}),z(b,(e,a)=>{a&&f&&f.unobserve(a),e&&f&&f.observe(e)});async function I(e){try{if(u.value.has(e.provider_id))return;const a=new URLSearchParams({provider_id:e.provider_id}),t=await fetch(`/admin/movies/exists?${a.toString()}`,{headers:{Accept:"application/json","X-Requested-With":"XMLHttpRequest"},credentials:"same-origin"});if(!t.ok)throw new Error("Duplicate check failed");if((await t.json()).exists){q.value=e.title??"This movie",k.value=e.provider_id,p.value=!0;return}await M(e.provider_id,"overwrite")}catch(a){console.error(a),y.value=a instanceof Error?a.message:"Something went wrong",c.value=!0,setTimeout(()=>c.value=!1,2500)}}async function M(e,a){try{u.value.add(e);const t=await fetch("/admin/movies/accept",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","X-Requested-With":"XMLHttpRequest","X-CSRF-TOKEN":document.querySelector('meta[name="csrf-token"]')?.content??""},body:JSON.stringify({provider_id:e,mode:a}),credentials:"same-origin"});if(!t.ok)throw new Error("Accept failed");try{const l=await t.json(),R=i.value.findIndex(W=>W.provider_id===e);R!==-1&&(i.value[R]._accepted=!0),y.value=a==="duplicate"?"Saved as duplicate":"Accepted (overwrote if existed)",c.value=!0,setTimeout(()=>c.value=!1,2e3)}catch{}}catch(t){throw console.error(t),y.value=t instanceof Error?t.message:"Accept failed",c.value=!0,setTimeout(()=>c.value=!1,2500),t}finally{u.value.delete(e)}}function O(){const e=k.value;p.value=!1,e&&M(e,"overwrite")}function P(){const e=k.value;p.value=!1,e&&M(e,"duplicate")}function V(){p.value=!1}return(e,a)=>(n(),r(h,null,[C(B(F),{title:"Movies"}),C(Z,{breadcrumbs:[{title:"Dashboard",href:"/dashboard"},{title:"Movies",href:"/admin/movies"}]},{default:A(()=>[s("div",te,[s("div",ae,[K(s("input",{class:"w-full rounded-md border border-gray-300 bg-background px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-primary",type:"text",placeholder:"Search movies by title…","onUpdate:modelValue":a[0]||(a[0]=t=>_.value=t),onInput:L,onKeyup:J(N,["enter"])},null,544),[[G,_.value]])]),g.value?(n(),r("div",se,m(g.value),1)):v("",!0),s("ul",oe,[(n(!0),r(h,null,Q(i.value,t=>(n(),r("li",{key:t.provider_id,class:"flex gap-3 py-3"},[s("div",re,[t.poster_url?(n(),r("img",{key:0,src:t.poster_url,alt:"Poster",class:"h-full w-full object-cover"},null,8,ne)):v("",!0)]),s("div",ie,[s("div",le,[s("div",ce,m(t.title),1),s("div",de,m(t.year),1)]),s("div",ue,[t._accepted?(n(),r("span",fe,"Accepted")):(n(),r("button",{key:1,class:"inline-flex items-center rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:opacity-90",disabled:u.value.has(t.provider_id),"aria-busy":u.value.has(t.provider_id)?"true":"false",onClick:l=>I(t)},[u.value.has(t.provider_id)?(n(),r("span",ve,"Working…")):(n(),r("span",me,"Accept"))],8,pe))])])]))),128))]),s("div",{ref_key:"sentinel",ref:b,class:"py-6 text-center text-sm text-muted-foreground"},[d.value?(n(),r(h,{key:0},[j("Loading…")],64)):!w.value&&i.value.length>0?(n(),r(h,{key:1},[j("End of results")],64)):!i.value.length&&!d.value?(n(),r(h,{key:2},[j("No results")],64)):v("",!0)],512),C(Y,{name:"fade"},{default:A(()=>[c.value?(n(),r("div",he,m(y.value),1)):v("",!0)]),_:1})]),p.value?(n(),r("div",_e,[s("div",xe,[s("h3",ge,m(q.value)+" is already in our list. How should we proceed?",1),s("div",{class:"mt-4 flex justify-end gap-2"},[s("button",{class:"rounded-md border px-3 py-1.5 text-sm",onClick:V},"Cancel"),s("button",{class:"rounded-md border px-3 py-1.5 text-sm",onClick:P},"Save as Duplicate"),s("button",{class:"rounded-md bg-primary px-3 py-1.5 text-sm text-primary-foreground",onClick:O},"Overwrite")])])])):v("",!0)]),_:1})],64))}}),De=ee(ye,[["__scopeId","data-v-e85a9790"]]);export{De as default};