PageSourceSearch

https://www.papalunaelmusical.com/assets/AdminScan-B5lw5OF3.js

js papalunaelmusical.com collected 2026-10-07 00:40:00 UTC 30,668 bytes, 1 lines download raw bytes

1import{_ as e,j as t}from"./index-CXk4OI_Y.js";import{i as a,b as s}from"./vendor-BgUwe5ob.js";import{s as i}from"./supabase-ILApkYvc.js";import{F as n}from"./funcionElegida-Bp9A2HfU.js";import{P as r,S as o}from"./PalauSeatMap-C9JZPm45.js";import{b as c,Z as d}from"./palauPlano-Dd-zfMYX.js";import{B as l}from"./BotonEspera-f2eLXaKj.js";class h{constructor(e,t,a,s,i){this._legacyCanvasSize=h.DEFAULT_CANVAS_SIZE,this._preferredCamera="environment",this._maxScansPerSecond=25,this._lastScanTimestamp=-1,this._destroyed=this._flashOn=this._paused=this._active=!1,this.$video=e,this.$canvas=document.createElement("canvas"),a&&"object"==typeof a?this._onDecode=t:this._legacyOnDecode=t,t="object"==typeof a?a:{},this._onDecodeError=t.onDecodeError||("function"==typeof a?a:this._onDecodeError),this._calculateScanRegion=t.calculateScanRegion||("function"==typeof s?s:this._calculateScanRegion),this._preferredCamera=t.preferredCamera||i||this._preferredCamera,this._legacyCanvasSize="number"==typeof a?a:"number"==typeof s?s:this._legacyCanvasSize,this._maxScansPerSecond=t.maxScansPerSecond||this._maxScansPerSecond,this._onPlay=this._onPlay.bind(this),this._onLoadedMetaData=this._onLoadedMetaData.bind(this),this._onVisibilityChange=this._onVisibilityChange.bind(this),this._updateOverlay=this._updateOverlay.bind(this),e.disablePictureInPicture=!0,e.playsInline=!0,e.muted=!0;let n=!1;if(e.hidden&&(e.hidden=!1,n=!0),document.body.contains(e)||(document.body.appendChild(e),n=!0),a=e.parentElement,t.highlightScanRegion||t.highlightCodeOutline){if(s=!!t.overlay,this.$overlay=t.overlay||document.createElement("div"),(i=this.$overlay.style).position="absolute",i.display="none",i.pointerEvents="none",this.$overlay.classList.add("scan-region-highlight"),!s&&t.highlightScanRegion){this.$overlay.innerHTML='<svg class="scan-region-highlight-svg" viewBox="0 0 238 238" preserveAspectRatio="none" style="position:absolute;width:100%;height:100%;left:0;top:0;fill:none;stroke:#e9b213;stroke-width:4;stroke-linecap:round;stroke-linejoin:round"><path d="M31 2H10a8 8 0 0 0-8 8v21M207 2h21a8 8 0 0 1 8 8v21m0 176v21a8 8 0 0 1-8 8h-21m-176 0H10a8 8 0 0 1-8-8v-21"/></svg>';try{this.$overlay.firstElementChild.animate({transform:["scale(.98)","scale(1.01)"]},{duration:400,iterations:1/0,direction:"alternate",easing:"ease-in-out"})}catch(r){}a.insertBefore(this.$overlay,this.$video.nextSibling)}t.highlightCodeOutline&&(this.$overlay.insertAdjacentHTML("beforeend",'<svg class="code-outline-highlight" preserveAspectRatio="none" style="display:none;width:100%;height:100%;fill:none;stroke:#e9b213;stroke-width:5;stroke-dasharray:25;stroke-linecap:round;stroke-linejoin:round"><polygon/></svg>'),this.$codeOutlineHighlight=this.$overlay.lastElementChild)}this._scanRegion=this._calculateScanRegion(e),requestAnimationFrame(()=>{let t=window.getComputedStyle(e);"none"===t.display&&(e.style.setProperty("display","block","important"),n=!0),"visible"!==t.visibility&&(e.style.setProperty("visibility","visible","important"),n=!0),n&&(e.style.opacity="0",e.style.width="0",e.style.height="0",this.$overlay&&this.$overlay.parentElement&&this.$overlay.parentElement.removeChild(this.$overlay),delete this.$overlay,delete this.$codeOutlineHighlight),this.$overlay&&this._updateOverlay()}),e.addEventListener("play",this._onPlay),e.addEventListener("loadedmetadata",this._onLoadedMetaData),document.addEventListener("visibilitychange",this._onVisibilityChange),window.addEventListener("resize",this._updateOverlay),this._qrEnginePromise=h.createQrEngine()}static set WORKER_PATH(e){}static async hasCamera(){try{return!!(await h.listCameras(!1)).length}catch(e){return!1}}static async listCameras(e=!1){if(!navigator.mediaDevices)return[];let t,a=async()=>(await navigator.mediaDevices.enumerateDevices()).filter(e=>"videoinput"===e.kind);try{e&&(await a()).every(e=>!e.label)&&(t=await navigator.mediaDevices.getUserMedia({audio:!1,video:!0}))}catch(s){}try{return(await a()).map((e,t)=>({id:e.deviceId,label:e.label||(0===t?"Default Camera":`Camera ${t+1}`)}))}finally{t&&h._stopVideoStream(t)}}async hasFlash(){let e;try{if(this.$video.srcObject){if(!(this.$video.srcObject instanceof MediaStream))return!1;e=this.$video.srcObject}else e=(await this._getCameraStream()).stream;return"torch"in e.getVideoTracks()[0].getSettings()}catch(t){return!1}finally{e&&e!==this.$video.srcObject&&h._stopVideoStream(e)}}isFlashOn(){return this._flashOn}async toggleFlash(){this._flashOn?await this.turnFlashOff():await this.turnFlashOn()}async turnFlashOn(){if(!this._flashOn&&!this._destroyed&&(this._flashOn=!0,this._active&&!this._paused))try{if
1(!(await this.hasFlash()))throw"No flash available";await this.$video.srcObject.getVideoTracks()[0].applyConstraints({advanced:[{torch:!0}]})}catch(e){throw this._flashOn=!1,e}}async turnFlashOff(){this._flashOn&&(this._flashOn=!1,await this._restartVideoStream())}destroy(){this.$video.removeEventListener("loadedmetadata",this._onLoadedMetaData),this.$video.removeEventListener("play",this._onPlay),document.removeEventListener("visibilitychange",this._onVisibilityChange),window.removeEventListener("resize",this._updateOverlay),this._destroyed=!0,this._flashOn=!1,this.stop(),h._postWorkerMessage(this._qrEnginePromise,"close")}async start(){if(this._destroyed)throw Error("The QR scanner can not be started as it had been destroyed.");if((!this._active||this._paused)&&(window.location.protocol,this._active=!0,!document.hidden))if(this._paused=!1,this.$video.srcObject)await this.$video.play();else try{let{stream:e,facingMode:t}=await this._getCameraStream();!this._active||this._paused?h._stopVideoStream(e):(this._setVideoMirror(t),this.$video.srcObject=e,await this.$video.play(),this._flashOn&&(this._flashOn=!1,this.turnFlashOn().catch(()=>{})))}catch(e){if(!this._paused)throw this._active=!1,e}}stop(){this.pause(),this._active=!1}async pause(e=!1){if(this._paused=!0,!this._active)return!0;this.$video.pause(),this.$overlay&&(this.$overlay.style.display="none");let t=()=>{this.$video.srcObject instanceof MediaStream&&(h._stopVideoStream(this.$video.srcObject),this.$video.srcObject=null)};return e?(t(),!0):(await new Promise(e=>setTimeout(e,300)),!!this._paused&&(t(),!0))}async setCamera(e){e!==this._preferredCamera&&(this._preferredCamera=e,await this._restartVideoStream())}static async scanImage(e,t,a,s,i=!1,n=!1){let r,o=!1;t&&("scanRegion"in t||"qrEngine"in t||"canvas"in t||"disallowCanvasResizing"in t||"alsoTryWithoutScanRegion"in t||"returnDetailedScanResult"in t)&&(r=t.scanRegion,a=t.qrEngine,s=t.canvas,i=t.disallowCanvasResizing||!1,n=t.alsoTryWithoutScanRegion||!1,o=!0),t=!!a;try{let c,d,l;if([a,c]=await Promise.all([a||h.createQrEngine(),h._loadImage(e)]),[s,d]=h._drawToCanvas(c,r,s,i),a instanceof Worker){let e=a;t||h._postWorkerMessageSync(e,"inversionMode","both"),l=await new Promise((t,a)=>{let i,n,o,c=-1;n=s=>{s.data.id===c&&(e.removeEventListener("message",n),e.removeEventListener("error",o),clearTimeout(i),null!==s.data.data?t({data:s.data.data,cornerPoints:h._convertPoints(s.data.cornerPoints,r)}):a(h.NO_QR_CODE_FOUND))},o=t=>{e.removeEventListener("message",n),e.removeEventListener("error",o),clearTimeout(i),a("Scanner error: "+(t?t.message||t:"Unknown Error"))},e.addEventListener("message",n),e.addEventListener("error",o),i=setTimeout(()=>o("timeout"),1e4);let l=d.getImageData(0,0,s.width,s.height);c=h._postWorkerMessageSync(e,"decode",l,[l.data.buffer])})}else l=await Promise.race([new Promise((e,t)=>window.setTimeout(()=>t("Scanner error: timeout"),1e4)),(async()=>{try{var[t]=await a.detect(s);if(!t)throw h.NO_QR_CODE_FOUND;return{data:t.rawValue,cornerPoints:h._convertPoints(t.cornerPoints,r)}}catch(o){if(t=o.message||o,/not implemented|service unavailable/.test(t))return h._disableBarcodeDetector=!0,h.scanImage(e,{scanRegion:r,canvas:s,disallowCanvasResizing:i,alsoTryWithoutScanRegion:n});throw`Scanner error: ${t}`}})()]);return o?l:l.data}catch(c){if(!r||!n)throw c;let t=await h.scanImage(e,{qrEngine:a,canvas:s,disallowCanvasResizing:i});return o?t:t.data}finally{t||h._postWorkerMessage(a,"close")}}setGrayscaleWeights(e,t,a,s=!0){h._postWorkerMessage(this._qrEnginePromise,"grayscaleWeights",{red:e,green:t,blue:a,useIntegerApproximation:s})}setInversionMode(e){h._postWorkerMessage(this._qrEnginePromise,"inversionMode",e)}static async createQrEngine(t){if(t=()=>e(()=>import("./qr-scanner-worker.min-k9yJ__Ac.js"),[]).then(e=>e.createWorker()),h._disableBarcodeDetector||!("BarcodeDetector"in window)||!BarcodeDetector.getSupportedFormats||!(await BarcodeDetector.getSupportedFormats()).includes("qr_code"))return t();let a=navigator.userAgentData;return a&&a.brands.some(({brand:e})=>/Chromium/i.test(e))&&/mac ?OS/i.test(a.platform)&&await a.getHighEntropyValues(["architecture","platformVersion"]).then(({architecture:e,platformVersion:t})=>/arm/i.test(e||"arm")&&13<=parseInt(t||"13")).catch(()=>!0)?t():new BarcodeDetector({formats:["qr_code"]}
1)}_onPlay(){this._scanRegion=this._calculateScanRegion(this.$video),this._updateOverlay(),this.$overlay&&(this.$overlay.style.display=""),this._scanFrame()}_onLoadedMetaData(){this._scanRegion=this._calculateScanRegion(this.$video),this._updateOverlay()}_onVisibilityChange(){document.hidden?this.pause():this._active&&this.start()}_calculateScanRegion(e){let t=Math.round(2/3*Math.min(e.videoWidth,e.videoHeight));return{x:Math.round((e.videoWidth-t)/2),y:Math.round((e.videoHeight-t)/2),width:t,height:t,downScaledWidth:this._legacyCanvasSize,downScaledHeight:this._legacyCanvasSize}}_updateOverlay(){requestAnimationFrame(()=>{if(this.$overlay){var e=this.$video,t=e.videoWidth,a=e.videoHeight,s=e.offsetWidth,i=e.offsetHeight,n=e.offsetLeft,r=e.offsetTop,o=window.getComputedStyle(e),c=o.objectFit,d=t/a,l=s/i;switch(c){case"none":var h=t,u=a;break;case"fill":h=s,u=i;break;default:("cover"===c?d>l:d<l)?h=(u=i)*d:u=(h=s)/d,"scale-down"===c&&(h=Math.min(h,t),u=Math.min(u,a))}var[m,_]=o.objectPosition.split(" ").map((e,t)=>{const a=parseFloat(e);return e.endsWith("%")?(t?i-u:s-h)*a/100:a});o=this._scanRegion.width||t,l=this._scanRegion.height||a,c=this._scanRegion.x||0;var v=this._scanRegion.y||0;(d=this.$overlay.style).width=o/t*h+"px",d.height=l/a*u+"px",d.top=`${r+_+v/a*u}
1px`,a=/scaleX\(-1\)/.test(e.style.transform),d.left=`${n+(a?s-m-h:m)+(a?t-c-o:c)/t*h}px`,d.transform=e.style.transform}})}static _convertPoints(e,t){if(!t)return e;let a=t.x||0,s=t.y||0,i=t.width&&t.downScaledWidth?t.width/t.downScaledWidth:1;t=t.height&&t.downScaledHeight?t.height/t.downScaledHeight:1;for(let n of e)n.x=n.x*i+a,n.y=n.y*t+s;return e}_scanFrame(){!this._active||this.$video.paused||this.$video.ended||("requestVideoFrameCallback"in this.$video?this.$video.requestVideoFrameCallback.bind(this.$video):requestAnimationFrame)(async()=>{if(!(1>=this.$video.readyState)){var e=Date.now()-this._lastScanTimestamp,t=1e3/this._maxScansPerSecond;e<t&&await new Promise(a=>setTimeout(a,t-e)),this._lastScanTimestamp=Date.now();try{var a=await h.scanImage(this.$video,{scanRegion:this._scanRegion,qrEngine:this._qrEnginePromise,canvas:this.$canvas})}catch(s){if(!this._active)return;this._onDecodeError(s)}!h._disableBarcodeDetector||await this._qrEnginePromise instanceof Worker||(this._qrEnginePromise=h.createQrEngine()),a?(this._onDecode?this._onDecode(a):this._legacyOnDecode&&this._legacyOnDecode(a.data),this.$codeOutlineHighlight&&(clearTimeout(this._codeOutlineHighlightRemovalTimeout),this._codeOutlineHighlightRemovalTimeout=void 0,this.$codeOutlineHighlight.setAttribute("viewBox",`${this._scanRegion.x||0} ${this._scanRegion.y||0} ${this._scanRegion.width||this.$video.videoWidth} ${this._scanRegion.height||this.$video.videoHeight}`),this.$codeOutlineHighlight.firstElementChild.setAttribute("points",a.cornerPoints.map(({x:e,y:t})=>`${e},${t}`).join(" ")),this.$codeOutlineHighlight.style.display="")):this.$codeOutlineHighlight&&!this._codeOutlineHighlightRemovalTimeout&&(this._codeOutlineHighlightRemovalTimeout=setTimeout(()=>this.$codeOutlineHighlight.style.display="none",100))}this._scanFrame()})}_onDecodeError(e){h.NO_QR_CODE_FOUND}async _getCameraStream(){if(!navigator.mediaDevices)throw"Camera not found.";let e=/^(environment|user)$/.test(this._preferredCamera)?"facingMode":"deviceId",t=[{width:{min:1024}},{width:{min:768}},{}],a=t.map(t=>Object.assign({},t,{[e]:{exact:this._preferredCamera}}));for(let i of[...a,...t])try{let e=await navigator.mediaDevices.getUserMedia({video:i,audio:!1});return{stream:e,facingMode:this._getFacingMode(e)||(i.facingMode?this._preferredCamera:"environment"===this._preferredCamera?"user":"environment")}}catch(s){}throw"Camera not found."}async _restartVideoStream(){let e=this._paused;await this.pause(!0)&&!e&&this._active&&await this.start()}static _stopVideoStream(e){for(let t of e.getTracks())t.stop(),e.removeTrack(t)}_setVideoMirror(e){this.$video.style.transform="scaleX("+("user"===e?-1:1)+")"}_getFacingMode(e){return(e=e.getVideoTracks()[0])?/rear|back|environment/i.test(e.label)?"environment":/front|user|face/i.test(e.label)?"user":null:null}static _drawToCanvas(e,t,a,s=!1){a=a||document.createElement("canvas");let i=t&&t.x?t.x:0,n=t&&t.y?t.y:0,r=t&&t.width?t.width:e.videoWidth||e.width,o=t&&t.height?t.height:e.videoHeight||e.height;return s||(s=t&&t.downScaledWidth?t.downScaledWidth:r,t=t&&t.downScaledHeight?t.downScaledHeight:o,a.width!==s&&(a.width=s),a.height!==t&&(a.height=t)),(t=a.getContext("2d",{alpha:!1})).imageSmoothingEnabled=!1,t.drawImage(e,i,n,r,o,0,0,a.width,a.height),[a,t]}static async _loadImage(e){if(e instanceof Image)return await h._awaitImageLoad(e),e;if(e instanceof HTMLVideoElement||e instanceof HTMLCanvasElement||e instanceof SVGImageElement||"OffscreenCanvas"in window&&e instanceof OffscreenCanvas||"ImageBitmap"in window&&e instanceof ImageBitmap)return e;if(!(e instanceof File||e instanceof Blob||e instanceof URL||"string"==typeof e))throw"Unsupported image type.";{let t=new Image;t.src=e instanceof File||e instanceof Blob?URL.createObjectURL(e):e.toString();try{return await h._awaitImageLoad(t),t}finally{(e instanceof File||e instanceof Blob)&&URL.revokeObjectURL(t.src)}}}static async _awaitImageLoad(e){e.complete&&0!==e.naturalWidth||await new Promise((t,a)=>{let s=i=>{e.removeEventListener("load",s),e.removeEventListener("error",s),i instanceof ErrorEvent?a("Image load error"):t()};e.addEventListener("load",s),e.addEventListener("error",s)})}static async _postWorkerMessage(e,t,a,s){return h._postWorkerMessageSync(await e,t,a,s)}static _postWorkerMessageSync(e,t,a,s){if(!(e instanceof Worker))return-1;let i=h._workerMessageId++;return e.postMessage({id:i,type:t,data:a},s),i}}function u(e){return e?new Intl.DateTimeFormat("es-ES",{timeZone:"Europe/Madrid",day:"numeric",month:"long",year:"numeric",hour:"2-digit",minute:"2-digit",hour12:!1}).format(new Date(e)):"—"}function m(e){if(!e)return"";const t=new Date(e);return`${new Intl.DateTimeFormat("es-ES",{timeZone:"Europe/Madrid",day:"2-digit",month:"2-digit",year:"numeric"}).format(t)} a las ${new Intl.DateTimeFormat("es-ES",{timeZone:"Europe/Madrid",hour:"2-digit",minute:"2-digit",hour12:!1}).format(t)}`}h.DEFAULT_CANVAS_SIZE=400,h.NO_QR_CODE_FOUND="No QR code found",h._disableBarcodeDetector=!1,h._workerMessageId=0;let _=null;function v(e,t=!1){try{const a=window.AudioContext||window.webkitAudioContext;if(!a)return;_&&"closed"!==_.state||(_=new a),"suspended"===_.state&&_.resume();const s=(e,t,a)=>{const s=_.createOscillator(),i=_.createGain();s.connect(i),i.connect(_.destination),s.frequency.value=e;const n=_.currentTime+t;i.gain.setValueAtTime(.18,n),i.gain.exponentialRampToValueAtTime(.001,n+a),s.start(n),s.stop(n+a)};e&&t?(s(620,0,.12),s(620,.18,.12)):s(e?880:220,0,.3)}catch{}}const p=e=>(e||"").split("-")[1]||"—",g=e=>(e||"").split("-")[2]||"—",f=e=>{switch((e||"").split("-")[0]){case"W":return{texto:"Butaca adaptada",tono:"adaptada"};case"R":return{texto:"Vista parcial",tono:"parcial"};default:return null}},y=(e,t)=>{const[a,s,i]=(e.seat_code||"").split("-"),[n,r,o]=(t.seat_code||"").split("-");return a.localeCompare(n)||+s-+r||+i-+o};function w(e){const t=new Date(e),a=new Date;return t.getFullYear()===a.getFullYear()&&t.getMonth()===a.getMonth()&&t.getDate()===a.getDate()}const b={current:o.selected,used:o.used,other:o.scanOther};function x(e){if(!e)return"";const t=new Date(e);return`${new Intl.DateTimeFormat("es-ES",{timeZone:"Europe/Madrid",weekday:"short",day:"numeric",month:"short"}).format(t).replace(/\./g,"")} · ${new Intl.DateTimeFormat("es-ES",{timeZone:"Europe/Madrid",hour:"2-digit",minute:"2-digit",hour12:!1}).format(t)}`}function j(){const{user:e}=a(),_=s.useRef(null),j=s.useRef(null),S=s.useRef({code:null,at:0}),E=s.useRef(!1),[$,N]=s.useState(!1),[k,C]=s.useState(null),[O,D]=s.useState(!1),[R,M]=s.useState(null),[P,T]=s.useState(null),[F,L]=s.useState(null),[V,I]=s.useState(""),[H,W]=s.useState(null),[A,q]=s.useState(!1),[B,U]=s.useState([]),[z,Q]=s.useState(""),[Z,Y]=s.useState(null),[G,X]=s.useState(()=>{try{return localStorage.getItem(n)||""}catch{return""}}),K=e=>{X(e),Q(e);try{localStorage.setItem(n,e)}catch{}};s.useEffect(()=>{(async()=>{const{data:e,error:t}=await i.from("shows").select("id, starts_at, status").order("starts_at",{ascending:!0});if(t||!e?.length)return void Y(t?"No hemos podido cargar las funciones. Recarga la página.":"No hay ninguna función creada.");Y(null),U(e);const a=e.find(e=>e.id===G);if(a)Q(a.id);else if(G){X("");try{localStorage.removeItem(n)}catch{}}})()},[]),s.useEffect(()=>{if(!z||R||$)return;let e=!0;return(async()=>{try{const t=await(navigator.permissions?.query({name:"camera"}));e&&"granted"===t?.state&&ae()}catch{}})(),()=>{e=!1}},[z,R]);const J=s.useMemo(()=>c(),[]),ee=s.useMemo(()=>
1{if(!R?.tickets)return J.map(e=>({...e,estado:"taken"}));const e=new Map;return R.tickets.forEach(t=>e.set(t.seat_code,t)),J.map(t=>{const a=e.get(t.id);return a?"used"===a.status?{...t,estado:"used"}:a.is_current?{...t,estado:"current"}:{...t,estado:"active"}:{...t,estado:"taken"}})},[J,R]);s.useEffect(()=>()=>te(),[]);const te=()=>{if(j.current){try{j.current.destroy()}catch{}j.current=null}N(!1)},ae=async()=>{if(!E.current&&!j.current){E.current=!0,C(null),T(null),W(null),M(null),N(!0);for(let e=0;e<20&&!_.current;e++)await new Promise(e=>setTimeout(e,25));if(!_.current)return C("No hemos podido preparar la cámara. Vuelve a intentarlo."),N(!1),void(E.current=!1);try{j.current=new h(_.current,async e=>{const t=Date.now();e.data===S.current.code&&t-S.current.at<3e3||(S.current={code:e.data,at:t},await se(e.data))},{preferredCamera:"environment",maxScansPerSecond:25,highlightScanRegion:!0,highlightCodeOutline:!0}),await j.current.start()}catch(e){C(`No hemos podido iniciar la cámara: ${e.message||"error desconocido"}.`),te()}finally{E.current=!1}}},se=async e=>{const t=(e||"").trim().replace(/[\s\n\r]/g,"");if(!t)return;te(),D(!0),T(null),L(null),W(null),q(!1);const{data:a,error:s}=await i.rpc("get_order_for_scan",{p_ticket_number:t});if(D(!1),s)return T(s.message?.includes("forbidden")?"No tienes permisos para escanear.":"Error consultando la entrada."),void v(!1);if(!a?.found)return T(a?.message||"Entrada no encontrada."),void v(!1);if("paid"!==a.order_status&&"completed"!==a.order_status)return T("El pedido de esta entrada no está pagado."),void v(!1);if(!z)return L("Elige la función antes de validar: no se puede comprobar si la entrada es de hoy."),v(!1),void M(a);if(a.show_id!==z)return L("No es de esta función"),v(!1),void M(a);M(a);const n="used"===a.current_status;v(!n,!n&&!!a.requisito)},ie=async t=>{const{error:a}=await i.rpc("mark_ticket_used",{p_ticket_number:t,p_admin_email:e?.email||null});if(a){const e=a.message||"";if(e.includes("ticket_not_active")||e.includes("order_not_paid"))return{ok:!1,raw:e};throw a}return{ok:!0}},ne=e=>{const t=(e||"").toString();return t.includes("ticket_not_active")?"ya estaba validada o está anulada":t.includes("order_not_paid")?"su pedido no está pagado":"no se ha podido validar"},re=async()=>{const e=R?.tickets?.find(e=>e.is_current);if(!e)return;const{data:t}=await i.rpc("get_order_for_scan",{p_ticket_number:e.ticket_number});t?.found&&M(t)},oe=async(e,t)=>{const a=(t||"").trim().toUpperCase();if(!a)return;te(),D(!0),T(null),L(null),W(null),q(!1);const{data:s,error:n}=await i.rpc("get_order_for_scan_by_seat",{p_show_id:e,p_seat_code:a});return D(!1),n?(T(n.message?.includes("forbidden")?"No tienes permisos para escanear.":"Error consultando la butaca."),void v(!1)):s?.found?"paid"!==s.order_status&&"completed"!==s.order_status?(T("El pedido de esta entrada no está pagado."),void v(!1)):(M(s),void v("used"!==s.current_status,"active"===s.current_status&&!!s.requisito)):(T(s?.message||"Butaca no encontrada."),void v(!1))},ce=async e=>{e.preventDefault(),V.trim()&&(z?(await oe(z,V),I("")):T("Selecciona primero la función."))},de=s.useMemo(()=>{if(!R?.tickets)return{total:0,used:0,pending:0};return{total:R.tickets.length,used:R.tickets.filter(e=>"used"===e.status).length,pending:R.tickets.filter(e=>"active"===e.status).length}},[R]),le=R?.tickets?.find(e=>e.is_current),he=s.useMemo(()=>R?F?{tono:"no",titulo:"No es de esta función",motivo:`Esta entrada es del ${u(R.show_starts_at)}. Comprueba la fecha con quien la trae.`}:"used"===le?.status?A?{tono:"si",titulo:"Validada",motivo:"Puede pasar."}:{tono:"ojo",titulo:"Ya estaba validada",motivo:le.used_at?`Se validó el ${m(le.used_at)}. Puede ser un duplicado.`:"Esta entrada ya se usó. Puede ser un duplicado."}:"active"===le?.status&&R.requisito?{tono:"ojo",titulo:"Pide su acreditación",motivo:`Descuento «${R.discount_label}»: ${R.requisito}.`}:"active"===le?.status?{tono:"si",titulo:"Entrada válida",motivo:null}:{tono:"no",titulo:"No se puede validar",motivo:"Esta entrada está anulada. No la dejes pasar."}:null,[R,F,le,A]),ue=(e=!0)=>t.jsx("header",{className:"admin-section__head",children:t.jsxs("div",{children:[t.jsx("h1",{className:"admin-section__title",children:"Escáner"}),e&&t.jsx("p",{className:"admin-section__sub",children:"Valida las entradas en la puerta del teatro."})]})}),me=B.find(e=>e.id===z),_e=me&&t.jsxs("div",{className:"scan-funcion-barra",children:[t.jsx("span",{className:"scan-funcion-barra__rotulo",children:"Función"}),t.jsx("span",{className:"scan-funcion-barra__valor",children:x(me.starts_at)}),t.jsx("button",{type:"button",className:"scan-funcion-barra__cambiar",onClick:()=>{M(null),K("")},children:"Cambiar"})]});return z?R?t.jsxs("section",{className:"admin-section scan-preview-wrap",children:[ue(!1),_e,t.jsxs("article",{className:`scan-preview-card scan-card--${he.tono}`,children:[t.jsx("header",{className:"scan-veredicto",role:"status","aria-live":"polite",children:t.jsxs("div",{className:"scan-veredicto__medida",children:[t.jsxs("div",{className:"scan-veredicto__principal",children:[t.jsx("span",{className:"scan-veredicto__marca","aria-hidden":"true",children:"si"===he.tono?"✓":"ojo"===he.tono?"!":"✕"}),t.jsxs("div",{className:"scan-veredicto__cuerpo",children:[t.jsx("p",{className:"si"===he.tono?"solo-lectores":"scan-veredicto__titulo",children:he.titulo}),t.jsxs("p",{className:"scan-veredicto__sitio",children:["Fila ",p(R.current_seat)," · Butaca ",g(R.current_seat),f(R.current_seat)&&t.jsx("span",{className:`scan-veredicto__aviso es-${f(R.current_seat).tono}`,children:f(R.current_seat).texto})]}),he.motivo&&t.jsx("p",{className:"scan-veredicto__motivo",children:he.motivo})]})]}),t.jsxs("dl",{className:"scan-veredicto__ficha",children:[t.jsxs("div",{children:[t.jsx("dt",{children:"Titular"}),t.jsx("dd",{children:R.buyer_name})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Número de pedido"}),t.jsx("dd",{className:"scan-veredicto__num",children:R.order_number})]})]})]})}),t.jsxs("div",{className:"scan-preview-layout",children:[t.jsxs("div",{className:"scan-preview-plano",children:[t.jsx("div",{className:"scan-preview-plano__scroll",children:t.jsx(r,{seats:ee,selected:new Set,onToggle:()=>{},isClickable:()=>!1,getColor:e=>"current"===e.estado?b.current:"used"===e.estado?b.used:"active"===e.estado?d[e.zona]?.color||o.fallback:b.other,getTitle:e=>{const t=R.tickets.find(t=>t.seat_code===e.id);return t?t.is_current?`${e.id} — La que se escanea`:"used"===t.status?`${e.id} — Ya usada`:"active"===t.status?`${e.id} — Pendiente de validar`:`${e.id} — ${t.status}`:`${d[e.zona]?.label??`Zona ${e.zona}`} · Fila ${e.fila} · Butaca ${e.asiento}`},className:"seat-map-svg scan-preview-svg"})}),t.jsxs("ul",{className:"scan-preview-legend",children:[t.jsxs("li",{children:[t.jsx("span",{style:{background:b.current}})," Escaneada ahora"]}),t.jsxs("li",{children:[t.jsx("span",{className:"scan-preview-legend__zone-stripes"}),"Pendientes · color de su zona"]}),t.jsxs("li",{children:[t.jsx("span",{style:{background:b.used}})," Ya validadas"]}),t.jsxs("li",{children:[t.jsx("span",{style:{background:b.other,opacity:.45}})," Resto del recinto"]})]})]}),t.jsxs("aside",{className:"scan-preview-side",children:[t.jsxs("h2",{className:"scan-preview-seats__titulo",children:["Butacas del pedido",t.jsxs("span",{className:"scan-preview-seats__cuenta",children:[de.used," de ",de.total," validadas"]})]}),t.jsx("ul",{className:"scan-preview-seats",children:[...R.tickets].sort(y).map(e=>{const a="used"===e.status,s=e.is_current?"is-current":a?"is-used":"is-active",i=e.is_current?b.current:a?b.used:d[e.seat_code?.split("-")[0]]?.color||o.fallback;return t.jsx("li",{className:`scan-preview-seats__item ${s}`,children:t.jsxs("button",{type:"button",className:"scan-preview-seats__boton",onClick:()=>{return t=e.seat_code,void(z&&!O&&t!==R?.current_seat&&oe(z,t));var t},disabled:O||e.is_current,"aria-current":e.is_current?"true":void 0,children:[t.jsx("span",{className:"scan-preview-seats__punto",style:{background:i},"aria-hidden":"true"}),t.jsxs("span",{className:"scan-preview-seats__sitio",children:["Fila ",p(e.seat_code)," · Butaca ",g(e.seat_code)]}),a&&t.jsx("span",{className:"scan-preview-seats__estado es-vali
1dada",children:"Validada"})]})},e.id)})}),P&&t.jsx("p",{className:"scan-preview-card__error",role:"alert",children:P}),H&&t.jsx("p",{className:"scan-preview-card__ok",role:"status",children:H}),t.jsxs("div",{className:"scan-preview-actions",children:[!F&&("active"===le?.status?t.jsx(l,{className:"admin-btn scan-preview-actions__esta",onClick:async()=>{if(!R||F)return;const e=R.tickets.find(e=>e.is_current);if(e&&"active"===e.status){D(!0),T(null),W(null);try{const t=await ie(e.ticket_number);if(!t.ok)return v(!1),T(t.raw.includes("order_not_paid")?"Esta entrada es de un pedido que no está pagado. No la dejes pasar.":"Esta entrada ya no es válida: alguien la ha validado antes."),void(await re());v(!0),q(!0),W("Entrada validada correctamente."),await re()}catch(t){T(t.message||"No hemos podido validar."),v(!1)}finally{D(!1)}}},esperando:O,textoEspera:"Validando…",children:"Validar esta butaca"}):"used"===le?.status?null:t.jsxs("p",{className:"scan-preview-warn",children:["Esta entrada no se puede validar (estado: ",le?.status,")."]})),!F&&de.pending>1&&t.jsx(l,{className:"admin-btn scan-preview-actions__todas",onClick:async()=>{if(!R||F)return;const e=R.tickets.filter(e=>"active"===e.status);D(!0),T(null),W(null);let t=0;const a=[];for(const s of e){const e=`Fila ${p(s.seat_code)} · Butaca ${g(s.seat_code)}`;try{const i=await ie(s.ticket_number);i.ok?t++:a.push(`${e} (${ne(i.raw)})`)}catch{a.push(`${e} (no hemos podido conectar)`)}}D(!1),v(0===a.length&&t>0),t>0&&q(!0),0===a.length?W(`${t} ${1===t?"entrada validada":"entradas validadas"}.`):(W(null),T((t>0?`${t} ${1===t?"entrada validada":"entradas validadas"}. `:"")+`Sin validar: ${a.join("; ")}.`)),await re()},esperando:O,textoEspera:"Validando…",children:`Validar las ${de.pending} pendientes`}),t.jsx("button",{className:"admin-btn admin-btn--ghost scan-preview-actions__salir",onClick:()=>{M(null),T(null),L(null),W(null),I(""),q(!1),S.current={code:null,at:0},ae()},children:"Escanear otra"})]})]})]})]})]}):t.jsxs("section",{className:"admin-section scan-wrap",children:[ue(),_e,t.jsx("div",{className:"scan-centro",children:t.jsxs("article",{className:"scan-camera-card",children:[P&&t.jsx("p",{className:"scan-camera-card__error",role:"alert",children:P}),$?t.jsxs("div",{className:"scan-video",children:[t.jsx("video",{ref:_,muted:!0,playsInline:!0}),t.jsx("button",{type:"button",className:"scan-video__close",onClick:te,"aria-label":"Apagar cámara",children:t.jsx("svg",{viewBox:"0 0 24 24","aria-hidden":"true",children:t.jsx("path",{d:"M7 7 17 17M17 7 7 17"})})})]}):t.jsxs(t.Fragment,{children:[t.jsx("p",{className:"scan-camera-card__text",children:"Apunta la cámara al código QR de la entrada."}),O?t.jsx("p",{className:"scan-camera-card__text",children:"Consultando…"}):t.jsx("button",{className:"admin-btn admin-btn--primary scan-camera-card__cta",onClick:ae,children:"Abrir cámara"}),k&&t.jsx("p",{className:"scan-camera-card__error",role:"alert",children:k}),t.jsxs("form",{className:"scan-manual",onSubmit:ce,children:[t.jsx("label",{htmlFor:"manual",className:"scan-manual__label",children:"¿Sin cámara? Escribe la butaca:"}),t.jsxs("div",{className:"scan-manual__row",children:[t.jsx("input",{id:"manual",value:V,onChange:e=>I(e.target.value.toUpperCase()),autoComplete:"off",placeholder:"ZONA-FILA-BUTACA (A-1-10)"}),t.jsx("button",{type:"submit",className:"admin-btn admin-btn--primary",disabled:O||!V.trim(),children:"Validar"})]})]})]})]})})]}):t.jsxs("section",{className:"admin-section scan-wrap",children:[ue(),t.jsx("div",{className:"scan-centro",children:t.jsxs("article",{className:"scan-paso-card",children:[t.jsx("h2",{className:"scan-paso-card__titulo",children:"¿Qué función estás validando?"}),t.jsx("p",{className:"scan-paso-card__texto",children:"Se recuerda toda la noche. Hace falta para avisarte si alguien trae una entrada de otro día."}),Z&&t.jsx("p",{className:"scan-camera-card__error",role:"alert",children:Z}),t.jsx("ul",{className:"scan-funciones",children:B.map(e=>{const a=function(e){if(!e?.length)return null;const t=Date.now(),a=e.filter(e=>w(e.starts_at));return a.length?a.reduce((e,a)=>Math.abs(new Date(e.starts_at)-t)<=Math.abs(new Date(a.starts_at)-t)?e:a):e.find(e=>new Date(e.starts_at)>=t)??null}(B)?.id===e.id,s=a&&w(e.starts_at);return t.jsx("li",{children:t.jsxs("button",{type:"button",className:"scan-funcion"+(a?" es-ahora":""),onClick:()=>K(e.id),children:[t.jsx("span",{className:"scan-funcion__fecha",children:u(e.starts_at)}),a&&t.jsx("span",{className:"scan-funcion__ahora",children:s?"La de hoy":"La próxima"})]})},e.id)})})]})})]})}export{j as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.