@ -1,13 +1,15 @@
< template >
< transition appear name = "fade" >
< div class = "modal p-8 overflow-auto items-center" @click.self ="close" >
< transition name = "slide" >
< div v-if ="tmdbId !== undefined" class="modal p-8 overflow-auto items-center" @click.self="close" >
< transition name = "slide" appear
@ before - enter = "lockScroll(true)" @ enter - cancelled = "lockScroll(false)"
@ leave = "lockScroll(false)" @ leave - cancelled = "lockScroll(true)" >
< div v-if ="movie !== undefined" class="relative w-full max-w-6xl bg-white md:bg-none overflow-hidden rounded-xl flex-col flex-shrink-0 shadow-xl" >
< div class = "bg-center bg-cover" : class = "{ 'text-white': isDark }"
: style = "movie.backdrop_path ? `background: url('/api/tmdb/image/w1280${movie.backdrop_p ath}')` : ''" >
: style = "movie.backdropPath ? `background: url('/api/tmdb/image/w1280${movie.backdropP ath}')` : ''" >
< div class = "movie-modal-content z-10" :style ="backdropOverlayStyle" >
< div class = "flex p-4 items-center" >
< movie -poster v -if = " movie.poster_p ath " :src ="movie.poster_p ath"
< movie -poster v -if = " movie.posterP ath " :src ="movie.posterP ath"
class = "w-3/12 flex-shrink-0 rounded-xl shadow-md md:shadow-xl" @ onLoad = "onPosterLoad" / >
< div class = "p-4 flex flex-col justify-center" >
< h2 class = "text-lg md:text-4xl" >
@ -23,9 +25,9 @@
< / div >
< div class = "mt-4 hidden md:block" >
< button class = "py-2 px-4 rounded-full shadow-md hover:shadow-lg disabled:opacity-50 disabled:cursor-default focus:outline-none ring-0 transition-transform transform hover:scale-105" : class = "{ 'bg-white text-black': isDark, 'bg-black text-white': !isDark }"
v - if = "movie.is_requested " > View Request Status < / button >
v - if = "movie.ticketId !== null " > View Request Status < / button >
< button v -else class = "py-2 w-36 rounded-full shadow-md hover:shadow-lg disabled:opacity-50 disabled:cursor-default focus:outline-none ring-0 transition-transform transform hover:scale-105" : class = "{ 'bg-white text-black': isDark, 'bg-black text-white': !isDark }"
: disabled = "isRequesting || isRequested " @ click = "request" > { { isRequesting ? "Requesting..." : isRequested ? "Request Sent " : "Request" } } < / button >
: disabled = "isRequesting" @ click = "request" > { { isRequesting ? "Requesting..." : "Request" } } < / button >
< / div >
< / div >
< / div >
@ -38,9 +40,9 @@
< / div >
< div class = "text-center" >
< button class = "py-2 px-4 rounded-full bg-red-500 text-white disabled:opacity-50"
v - if = "movie.is_requested " > View Request Status < / button >
v - if = "movie.ticketId !== null " > View Request Status < / button >
< button v -else class = "py-2 px-8 rounded-full shadow-sm bg-red-500 hover:bg-black transition-colors text-white disabled:opacity-50 disabled:cursor-default focus:outline-none ring-0 disabled:bg-black"
: disabled = "isRequesting || isRequested " @ click = "request" > { { isRequesting ? "Requesting..." : isRequested ? "Request Sent " : "Request" } } < / button >
: disabled = "isRequesting" @ click = "request" > { { isRequesting ? "Requesting..." : "Request" } } < / button >
< / div >
< / div >
< / div >
@ -51,7 +53,7 @@
< script lang = "ts" >
import { defineComponent } from "vue" ;
import { IApiMovieDetails Response , IApiMovieDetails } from "@common/api_schema" ;
import { IApiData Response , IApiMovieDetails } from "@common/api_schema" ;
import { authFetch } from "../../routes" ;
import { getAverageRgb } from "../../util" ;
import { useStore , Mutation , Action } from "../../store" ;
@ -79,16 +81,16 @@ export default defineComponent({
/ / r e t u r n L < = 0 . 1 7 9 ;
} ,
releaseYear ( ) : string {
if ( ! this . movie || ! this . movie . release_d ate ) {
if ( ! this . movie || ! this . movie . releaseD ate ) {
return "" ;
}
return this . movie . release_d ate . slice ( 0 , 4 ) ;
return this . movie . releaseD ate . slice ( 0 , 4 ) ;
} ,
releaseDate ( ) : string {
if ( ! this . movie || ! this . movie . release_d ate ) {
if ( ! this . movie || ! this . movie . releaseD ate ) {
return "" ;
}
let [ year , month , day ] = this . movie . release_d ate . split ( '-' ) ;
let [ year , month , day ] = this . movie . releaseD ate . split ( '-' ) ;
return ` ${ month } / ${ day } / ${ year } ` ;
} ,
runtime ( ) : string {
@ -105,11 +107,13 @@ export default defineComponent({
rgb : { r : 0 , g : 0 , b : 0 } ,
movie : < IApiMovieDetails | undefined > undefined ,
isPosterLoaded : false ,
isRequesting : false ,
isRequested : false
isRequesting : false
}
} ,
methods : {
lockScroll ( lock : boolean ) {
useStore ( ) . commit ( Mutation . LockScroll , lock ) ;
} ,
close ( ) {
this . movie = undefined ;
this . $emit ( "onClose" ) ;
@ -148,22 +152,30 @@ export default defineComponent({
this . rgb = < any > rgb ;
} ,
async fetchMovieDetails ( ) {
let response = await ( authFetch ( ` /api/movie/details/ ${ this . movieId } ` ) ) ;
if ( this . tmdbId === undefined ) {
return ;
}
let response = await ( authFetch ( ` /api/movie/details/ ${ this . tmdbId } ` ) ) ;
if ( response . status != 200 ) {
this . close ( ) ;
return ;
}
let movie = < IApiMovieDetailsResponse > await response . json ( ) ;
let movie = < IApiDataResponse < IApiMovieDetails > > await response . json ( ) ;
this . movie = movie . data ;
} ,
async request ( ) {
if ( this . isRequesting || this . movie == null || this . movie . imdb_i d == null || this . isRequested ) {
if ( this . isRequesting || this . movie == null || this . movie . tmdbI d == null ) {
return ;
}
this . isRequesting = true ;
let ticketId = await this . $store . dispatch ( Action . RequestMovie , this . movieId ) ;
this . isRequested = true ;
let response = await this . $store . dispatch ( Action . RequestMovie , this . movie . tmdbId ) ;
this . isRequesting = false ;
if ( response . status == "Forbidden" ) {
console . log ( "Failed to add movie: quota has been met" ) ;
return ;
}
console . log ( response ) ;
this . movie . ticketId = response . data . ticketId ;
}
} ,
mounted ( ) {
@ -174,21 +186,15 @@ export default defineComponent({
document . removeEventListener ( "keydown" , this . onKeyPress ) ;
} ,
props : {
movie Id: {
tmdb Id: {
type : [ Number , String ] ,
required : tru e
required : fals e
}
} ,
watch : {
movie Id( newId : number , oldId : number ) {
console . log ( newId ) ;
tmdb Id( newId : number | string | undefined , oldId : number | string | undefined ) {
this . fetchMovieDetails ( ) ;
}
} ,
beforeRouteEnter ( ) {
useStore ( ) . commit ( Mutation . LockScroll , true ) ;
} ,
beforeRouteLeave ( ) {
useStore ( ) . commit ( Mutation . LockScroll , false ) ;
}
} ) ;
< / script >