2024-12-19 15:20:03 +00:00
"use client" ;
2025-01-11 14:24:28 +00:00
import { useParams , usePathname , useSearchParams } from "next/navigation" ;
2024-12-19 15:20:03 +00:00
import React , { useEffect , useState } from "react" ;
import { Icon } from "@iconify/react/dist/iconify.js" ;
import NewContent from "@/components/landing-page/new-content" ;
import { Textarea } from "@/components/ui/textarea" ;
2025-01-05 13:46:18 +00:00
import { getCookiesDecrypt } from "@/lib/utils" ;
import { checkWishlistStatus , deleteWishlist , getDetail , saveWishlist } from "@/service/landing/landing" ;
2025-01-11 14:24:28 +00:00
import { close , error , loading , successCallback } from "@/config/swal" ;
2025-01-05 13:46:18 +00:00
import { useToast } from "@/components/ui/use-toast" ;
import { Link , useRouter } from "@/i18n/routing" ;
2025-01-11 14:24:28 +00:00
import { sendMediaUploadToEmail } from "@/service/media-tracking/media-tracking" ;
import { Popover , PopoverContent , PopoverTrigger } from "@/components/ui/popover" ;
import { Input } from "@/components/ui/input" ;
import { Button } from "@/components/ui/button" ;
2024-12-19 15:20:03 +00:00
const DetailDocument = ( ) = > {
const [ selectedSize , setSelectedSize ] = useState < string > ( "L" ) ;
const [ selectedTab , setSelectedTab ] = useState ( "video" ) ;
const router = useRouter ( ) ;
const pathname = usePathname ( ) ;
const params = useParams ( ) ;
2025-01-05 13:46:18 +00:00
const slug = String ( params ? . slug ) ;
2024-12-19 15:20:03 +00:00
const [ detailDataDocument , setDetailDataDocument ] = useState < any > ( ) ;
2024-12-23 15:40:32 +00:00
const [ selectedDocument , setSelectedDocument ] = useState ( 0 ) ;
2025-01-05 13:46:18 +00:00
const [ isSaved , setIsSaved ] = useState ( false ) ;
const [ wishlistId , setWishlistId ] = useState ( ) ;
const { toast } = useToast ( ) ;
const [ isDownloadAll , setIsDownloadAll ] = useState ( false ) ;
const [ downloadProgress , setDownloadProgress ] = useState ( 0 ) ;
const [ isFromSPIT , setIsFromSPIT ] = useState ( false ) ;
const [ main , setMain ] = useState < any > ( ) ;
const [ resolutionSelected , setResolutionSelected ] = useState ( "720" ) ;
const [ imageSizeSelected , setImageSizeSelected ] = useState ( "l" ) ;
const userId = getCookiesDecrypt ( "uie" ) ;
2025-01-11 14:24:28 +00:00
const [ emailShareList , setEmailShareList ] = useState < any > ( ) ;
const [ emailShareInput , setEmailShareInput ] = useState < any > ( ) ;
const [ emailMessageInput , setEmailMessageInput ] = useState ( ) ;
const searchParams = useSearchParams ( ) ;
const id = searchParams ? . get ( "id" ) ;
const [ width , setWidth ] = useState < any > ( ) ;
const [ content , setContent ] = useState < any > ( [ ] ) ;
const userRoleId = getCookiesDecrypt ( "urie" ) ;
let typeString = "video" ;
2024-12-19 15:20:03 +00:00
useEffect ( ( ) = > {
initFetch ( ) ;
2025-01-05 13:46:18 +00:00
checkWishlist ( ) ;
2024-12-19 15:20:03 +00:00
} , [ ] ) ;
const initFetch = async ( ) = > {
const response = await getDetail ( String ( slug ) ) ;
2025-01-05 13:46:18 +00:00
console . log ( "detailDocument" , response ) ;
setIsFromSPIT ( response ? . data ? . data ? . isFromSPIT ) ;
2025-01-11 14:24:28 +00:00
setWidth ( window . innerWidth ) ;
setContent ( response ? . data . data ) ;
2025-01-05 13:46:18 +00:00
setMain ( {
id : response?.data?.data?.files [ 0 ] ? . id ,
type : response ? . data ? . data ? . fileType . name ,
url :
Number ( response ? . data ? . data ? . fileType ? . id ) == 4
? response ? . data ? . data ? . files [ 0 ] ? . secondaryUrl
: Number ( response ? . data ? . data ? . fileType ? . id ) == 2
? ` ${ process . env . NEXT_PUBLIC_API } /media/view?id= ${ response ? . data ? . data ? . files [ 0 ] ? . id } &operation=file&type=video `
: response ? . data ? . data ? . files [ 0 ] ? . url ,
thumbnailFileUrl : response?.data?.data?.files [ 0 ] ? . thumbnailFileUrl ,
names : response?.data?.data?.files [ 0 ] ? . fileName ,
format : response?.data?.data?.files [ 0 ] ? . format ,
widthPixel : response?.data?.data?.files [ 0 ] ? . widthPixel ,
heightPixel : response?.data?.data?.files [ 0 ] ? . heightPixel ,
size : response?.data?.data?.files [ 0 ] ? . size ,
caption : response?.data?.data?.files [ 0 ] ? . caption ,
} ) ;
2024-12-19 15:20:03 +00:00
setDetailDataDocument ( response ? . data ? . data ) ;
} ;
2025-01-05 13:46:18 +00:00
const doBookmark = async ( ) = > {
if ( userId ) {
const data = {
mediaUploadId : slug?.split ( "-" ) ? . [ 0 ] ,
} ;
loading ( ) ;
const res = await saveWishlist ( data ) ;
if ( res ? . error ) {
error ( res . message ) ;
return false ;
}
close ( ) ;
toast ( {
title : "Konten berhasil disimpan" ,
} ) ;
checkWishlist ( ) ;
} else {
router . push ( "/auth" ) ;
}
} ;
async function checkWishlist() {
if ( userId ) {
const res = await checkWishlistStatus ( slug . split ( "-" ) ? . [ 0 ] ) ;
console . log ( res ? . data ? . data ) ;
const isAlreadyOnWishlist = res ? . data ? . data !== "-1" ;
setWishlistId ( res ? . data ? . data ) ;
setIsSaved ( isAlreadyOnWishlist ) ;
}
}
const handleDeleteWishlist = async ( ) = > {
if ( userId ) {
loading ( ) ;
const res = await deleteWishlist ( wishlistId ) ;
if ( res ? . error ) {
error ( res . message ) ;
return false ;
}
toast ( {
title : "Konten berhasil dihapus" ,
} ) ;
close ( ) ;
checkWishlist ( ) ;
} else {
router . push ( "/auth" ) ;
}
} ;
2024-12-19 15:20:03 +00:00
const sizes = [
{ label : "XL" , value : "3198 x 1798 px" } ,
{ label : "L" , value : "2399 x 1349 px" } ,
{ label : "M" , value : "1599 x 899 px" } ,
{ label : "S" , value : "1066 x 599 px" } ,
{ label : "XS" , value : "800 x 450 px" } ,
] ;
2025-01-05 13:46:18 +00:00
async function sendActivityLog ( activityTypeId : number ) {
const data = {
activityTypeId ,
mediaId : slug.split ( "-" ) ? . [ 0 ] ,
url : window.location.href ,
} ;
// set activity
// const response = await postActivityLog(data, token);
// console.log(response);
}
const handleDownload = ( ) = > {
if ( downloadProgress === 0 ) {
if ( ! userId ) {
router . push ( "/auth/login" ) ;
} else {
sendActivityLog ( 2 ) ;
sendActivityLog ( 3 ) ;
if ( isDownloadAll ) {
let url : string ;
const baseId = slug . split ( "-" ) ? . [ 0 ] ;
// if (type === "1") {
// url = `${process.env.NEXT_PUBLIC_API}/media/file/download-zip?id=${baseId}&resolution=${resolutionSelected}`;
// } else if (type === "2") {
// url = `${process.env.NEXT_PUBLIC_API}/media/file/download-zip?id=${baseId}&resolution=${imageSizeSelected}`;
// } else {
url = ` ${ process . env . NEXT_PUBLIC_API } /media/file/download-zip?id= ${ baseId } ` ;
// }
downloadFile ( url , "FileDownload.zip" ) ;
} else {
if ( isFromSPIT && main ? . url ? . includes ( "spit.humas" ) ) {
downloadFile ( ` ${ main ? . url } ` , ` ${ main . names } ` ) ;
} else {
downloadFile ( ` ${ main ? . url } ` , ` ${ main . names } ` ) ;
}
}
// } else if (type === "1" && resolutionSelected?.length > 0) {
// if (isFromSPIT && main?.url?.includes("spit.humas")) {
// downloadFile(`${main?.url}`, `${main.names}`);
// } else {
// const url = `${process.env.NEXT_PUBLIC_API}/media/view?id=${main?.id}&operation=file&type=video&resolution=${resolutionSelected}p`;
// downloadFile(url, `${main.names}`);
// }
// } else if (type === "2" && imageSizeSelected?.length > 0) {
// const url = `${process.env.NEXT_PUBLIC_API}/media/view?id=${main?.id}&operation=file&type=image&resolution=${imageSizeSelected}`;
// downloadFile(url, `${main.names}`);
// } else if (type === "3" || type === "4") {
// downloadFile(`${main?.url}`, `${main.names}`);
// }
}
}
} ;
const downloadFile = ( fileUrl : string , name : string ) = > {
const xhr = new XMLHttpRequest ( ) ;
xhr . open ( "GET" , fileUrl , true ) ;
xhr . responseType = "blob" ;
xhr . addEventListener ( "progress" , ( event ) = > {
if ( event . lengthComputable ) {
const percentCompleted = Math . round ( ( event . loaded / event . total ) * 100 ) ;
setDownloadProgress ( percentCompleted ) ;
}
} ) ;
xhr . addEventListener ( "readystatechange" , ( ) = > {
if ( xhr . readyState === 4 && xhr . status === 200 ) {
const contentType = xhr . getResponseHeader ( "content-type" ) || "application/octet-stream" ;
const extension = contentType . split ( "/" ) [ 1 ] ;
const filename = ` ${ name } . ${ extension } ` ;
const blob = new Blob ( [ xhr . response ] , {
type : contentType ,
} ) ;
const downloadUrl = URL . createObjectURL ( blob ) ;
const a = document . createElement ( "a" ) ;
a . href = downloadUrl ;
a . download = filename ;
document . body . append ( a ) ;
a . click ( ) ;
a . remove ( ) ;
}
} ) ;
xhr . onloadend = ( ) = > {
setDownloadProgress ( 0 ) ;
} ;
xhr . send ( ) ;
} ;
2025-01-11 14:24:28 +00:00
const handleShare = ( type : any , url : any ) = > {
if ( Number ( userRoleId ) < 1 || userRoleId == undefined ) {
router . push ( "/auth/login" ) ;
} else {
sendActivityLog ( 2 ) ;
sendActivityLog ( 4 ) ;
if ( type == "wa" && width <= 768 ) {
window . open ( ` whatsapp://send? ${ url } ` , "_blank" ) ;
} else if ( type == "wa" && width > 768 ) {
window . open ( ` https://web.whatsapp.com/send? ${ url } ` , "_blank" , "noreferrer" ) ;
} else {
window . open ( url ) ;
}
}
} ;
async function shareToEmail() {
if ( Number ( userRoleId ) < 1 || userRoleId == undefined ) {
router . push ( "/auth/login" ) ;
} else {
const data = {
mediaUploadId : id?.split ( "-" ) ? . [ 0 ] ,
email : emailShareList || [ emailShareInput ] ,
message : emailMessageInput ,
url : window.location.href ,
} ;
loading ( ) ;
const res = await sendMediaUploadToEmail ( data ) ;
if ( res ? . error ) {
error ( res . message ) ;
return false ;
}
close ( ) ;
successCallback ( "Konten Telah Dikirim" ) ;
}
}
const handleEmailList = ( e : any ) = > {
const arrayEmail : any = [ ] ;
for ( let i = 0 ; i < emailShareList ? . length ; i += 1 ) {
arrayEmail . push ( emailShareList [ i ] ) ;
}
if ( e . which == 13 ) {
if ( e . target . value ) {
arrayEmail . push ( e . target . value ) ;
setEmailShareList ( arrayEmail ) ;
setEmailShareInput ( "" ) ;
}
e . preventDefault ( ) ;
}
return false ;
} ;
2024-12-19 15:20:03 +00:00
return (
< >
2024-12-23 15:40:32 +00:00
< div className = "px-4 md:px-24 py-4" >
2024-12-19 15:20:03 +00:00
< div className = "rounded-md overflow-hidden md:flex" >
{ /* Bagian Kiri */ }
< div className = "md:w-3/4" >
2024-12-23 15:40:32 +00:00
< div className = "relative" >
< img src = { detailDataDocument ? . files [ selectedDocument ] ? . url } alt = "Main" className = "rounded-lg w-auto h-fit" / >
2024-12-19 15:20:03 +00:00
< div className = "absolute top-4 left-4" > < / div >
< / div >
2024-12-23 15:40:32 +00:00
{ /* Footer Informasi */ }
2024-12-24 16:16:20 +00:00
< div className = "text-sm text-gray-500 flex justify-between items-center border-t mt-4" >
< p className = "flex flex-row items-center mt-3" >
2024-12-23 15:40:32 +00:00
oleh & nbsp ; < span className = "font-semibold text-black" > { detailDataDocument ? . uploadedBy ? . userLevel ? . name } < / span > & nbsp ; | & nbsp ; Diupdate pada { detailDataDocument ? . updatedAt } WIB & nbsp ; | & nbsp ;
< Icon icon = "formkit:eye" width = "15" height = "15" / >
& nbsp ;
{ detailDataDocument ? . clickCount }
< / p >
2024-12-24 16:16:20 +00:00
< p className = "mt-3" > Kreator : { detailDataDocument ? . creatorName } < / p >
2024-12-23 15:40:32 +00:00
< / div >
{ /* Keterangan */ }
< div className = "md:w-3/4" >
2024-12-24 16:16:20 +00:00
< h1 className = "flex flex-row font-bold text-2xl my-8" > { detailDataDocument ? . title } < / h1 >
2024-12-23 15:40:32 +00:00
< div dangerouslySetInnerHTML = { { __html : detailDataDocument?.htmlDescription } } / >
< / div >
2024-12-19 15:20:03 +00:00
< / div >
{ /* Bagian Kanan */ }
2024-12-23 15:40:32 +00:00
< div className = "md:w-1/4 p-4 bg-[#f7f7f7] h-fit rounded-lg mx-4" >
2025-01-05 13:46:18 +00:00
{ isSaved ? (
< a onClick = { ( ) = > handleDeleteWishlist ( ) } className = "flex flex-col mb-3 items-center justify-center cursor-pointer" >
< Icon icon = "material-symbols:bookmark" width = { 40 } / >
< p className = "text-base lg:text-lg" > Hapus < / p >
< / a >
) : (
< a onClick = { ( ) = > doBookmark ( ) } className = "flex flex-col mb-3 items-center justify-center cursor-pointer" >
< Icon icon = "material-symbols:bookmark-outline" width = { 40 } / >
< p className = "text-base lg:text-lg" > Simpan < / p >
< / a >
) }
2024-12-19 15:20:03 +00:00
{ /* garis */ }
< div className = "border-t border-black my-4" > < / div >
2025-01-05 13:46:18 +00:00
< Link href = { ` /all/filter?title=polda&category= ${ detailDataDocument ? . category . id } ` } className = "bg-red-600 text-white text-xs font-bold px-3 py-3 my-3 flex justify-center items-center rounded" >
2024-12-19 15:20:03 +00:00
{ detailDataDocument ? . category ? . name }
< / Link >
< div className = "flex justify-center flex-wrap gap-2 mb-4" >
2025-01-05 13:46:18 +00:00
{ detailDataDocument ? . tags ? . split ( "," ) . map ( ( tag : string ) = > (
< a onClick = { ( ) = > router . push ( ` /all/filter?tag= ${ tag } ` ) } key = { tag } className = "bg-gray-200 text-gray-700 text-xs px-3 py-1 rounded-full cursor-pointer hover:bg-gray-500" >
{ tag }
< / a >
) ) }
2024-12-19 15:20:03 +00:00
< / div >
< div className = "border-t border-black my-4" > < / div >
{ /* Opsi Ukuran Foto */ }
< h4 className = "flex text-lg justify-center items-center font-semibold my-3" > Opsi Ukuran Foto < / h4 >
< div className = "border-t border-black my-4" > < / div >
< div className = "space-y-2" >
2025-01-05 13:46:18 +00:00
{ sizes . map ( ( size : any ) = > (
< div className = "flex flex-row justify-between" >
< div key = { size . label } className = "items-center flex flex-row gap-2 cursor-pointer" >
< input type = "radio" name = "size" value = { size . label } checked = { selectedSize === size . label } onChange = { ( ) = > setSelectedSize ( size . label ) } className = "text-red-600 focus:ring-red-600" / >
< div className = "text-sm" > { size . label } < / div >
< / div >
< div className = "" >
< div className = "text-sm" > { size . value } < / div >
2024-12-19 15:20:03 +00:00
< / div >
2025-01-05 13:46:18 +00:00
< / div >
2024-12-19 15:20:03 +00:00
) ) }
< / div >
{ /* Download Semua */ }
< div className = "mt-4" >
< label className = "flex items-center space-x-2 text-sm" >
2025-01-05 13:46:18 +00:00
< input type = "checkbox" className = "text-red-600 focus:ring-red-600" onChange = { ( ) = > setIsDownloadAll ( ! isDownloadAll ) } / >
2024-12-19 15:20:03 +00:00
< span > Download Semua File ? < / span >
< / label >
< / div >
{ /* Tombol Download */ }
2025-01-05 13:46:18 +00:00
< button onClick = { handleDownload } className = "mt-4 bg-red-600 text-white w-full py-2 flex justify-center items-center gap-1 rounded-md text-sm hover:bg-red-700" >
2024-12-19 15:20:03 +00:00
< svg xmlns = "http://www.w3.org/2000/svg" width = "1em" height = "1em" viewBox = "0 0 24 24" >
< path fill = "white" d = "m12 16l-5-5l1.4-1.45l2.6 2.6V4h2v8.15l2.6-2.6L17 11zm-6 4q-.825 0-1.412-.587T4 18v-3h2v3h12v-3h2v3q0 .825-.587 1.413T18 20z" / >
< / svg >
Download
< / button >
2025-01-11 14:24:28 +00:00
{ /* Tombol Bagikan */ }
< div className = "flex flex-row py-3" >
< p className = "text-base font-semibold" > Bagikan < / p >
< a className = "ml-8 cursor-pointer" onClick = { ( ) = > handleShare ( "fb" , ` https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fmediahub.polri.go.id%2F ${ typeString } %2Fdetail%2F ${ content ? . id } "e= ${ content ? . title } ` ) } >
< Icon icon = "brandico:facebook" height = "20" className = "px-auto text-red-600 text-center" / >
< / a >
< a className = "ml-5 cursor-pointer" onClick = { ( ) = > handleShare ( "tw" , ` https://twitter.com/share?url=https%3A%2F%2Fmediahub.polri.go.id%2F ${ typeString } %2Fdetail%2F ${ content ? . id } &text= ${ content ? . title } ` ) } >
< Icon icon = "mdi:twitter" width = "23" className = "text-red-600 text-center" / >
< / a >
< a className = "ml-5 cursor-pointer" onClick = { ( ) = > handleShare ( "wa" , ` text= ${ content ? . title } %0D%0A%0D%0Ahttps%3A%2F%2Fmediahub.polri.go.id%2F ${ typeString } %2Fdetail%2F ${ content ? . id } ` ) } >
< Icon icon = "ri:whatsapp-fill" width = "23" className = "text-red-600 text-center" / >
< / a >
< Popover >
< PopoverTrigger className = "flex justify-end gap-1 cursor-pointer" asChild >
< a className = "ml-5 cursor-pointer" data - toggle = "dropdown" href = "#" aria - expanded = "false" >
< Icon icon = "material-symbols-light:mail" width = "23" className = "text-red-600 text-center" / >
< / a >
< / PopoverTrigger >
< PopoverContent >
< div className = "flex flex-col" >
< h1 className = "mb-2" > Share Ke Email < / h1 >
< div className = "flex flex-col mb-2" >
< p className = "text-base font-semibold mb-1" > Email Tujuan : < / p >
< Input value = { emailShareInput } onChange = { ( event ) = > setEmailShareInput ( event . target . value ) } onKeyPress = { handleEmailList } type = "email" placeholder = "Tekan Enter untuk input Email" / >
< / div >
< Button className = "bg-blue-500 text-white p-2 w-fit rounded-lg" onClick = { ( ) = > shareToEmail ( ) } >
Kirim
< / Button >
< / div >
< / PopoverContent >
< / Popover >
< / div >
2024-12-19 15:20:03 +00:00
< / div >
< / div >
< / div >
2025-01-05 13:46:18 +00:00
2024-12-19 15:20:03 +00:00
< div className = "w-full mb-8" >
{ /* Comment */ }
2024-12-20 15:52:53 +00:00
< div className = "flex flex-col my-16 p-10 bg-[#f7f7f7]" >
2024-12-24 16:16:20 +00:00
< div className = "gap-5 flex flex-col px-4 lg:px-16" >
2024-12-20 15:52:53 +00:00
< p className = "flex items-start text-lg" > Berikan Komentar < / p >
< Textarea placeholder = "Type your comments here." className = "flex w-full" / >
2024-12-24 16:16:20 +00:00
< button className = "flex items-start bg-[#bb3523] rounded-lg text-white w-fit px-4 py-1" > Kirim < / button >
2024-12-20 15:52:53 +00:00
< / div >
2024-12-19 15:20:03 +00:00
< / div >
{ /* Konten Serupa */ }
2024-12-24 16:16:20 +00:00
< div className = "" >
2025-01-07 17:44:23 +00:00
< NewContent group = "mabes" type = { "similar" } / >
2024-12-19 15:20:03 +00:00
< / div >
< / div >
< / >
) ;
} ;
export default DetailDocument ;