diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..3b8957b Binary files /dev/null and b/.DS_Store differ diff --git a/components/CGVLayout.tsx b/components/CGVLayout.tsx new file mode 100644 index 0000000..66fcc15 --- /dev/null +++ b/components/CGVLayout.tsx @@ -0,0 +1,137 @@ +import React from "react"; +import Link from "next/link"; + +const MyLayout: React.FC<{ + children: React.ReactNode +}> = ({ children }) => { + + const socialMediaIcons: string[] = [ + "https://static.vecteezy.com/system/resources/previews/018/930/698/original/facebook-logo-facebook-icon-transparent-free-png.png", + "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSn3EAH4J8nweqt0g4mzEvWiZZyvSwZvGZYuKcYOYL5_A&s", + "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/Threads_%28app%29_logo.svg/2048px-Threads_%28app%29_logo.svg.png", + "https://static.vecteezy.com/system/resources/previews/006/057/996/original/tiktok-logo-on-transparent-background-free-vector.jpg", + "https://assets-global.website-files.com/5d66bdc65e51a0d114d15891/64cebc6c19c2fe31de94c78e_X-vector-logo-download.png", + "https://static.vecteezy.com/system/resources/previews/018/930/709/original/line-logo-line-icon-transparent-free-png.png", + "https://img.freepik.com/premium-photo/round-youtube-logo-isolated-white-background_469489-1044.jpg", + ]; + + const socialMediaHrefs: string[] = [ + "https://www.facebook.com/CGV.ID", + "https://www.instagram.com/cgv.id/", + "https://www.threads.net/@cgv.id", + "https://www.tiktok.com/@cgv.id", + "https://x.com/CGV_ID", + "https://linevoom.line.me/user/_dW6OoBCQpPPdkV6Qx1el0GoqVZJ9jG0QbR2W7iY", + "https://www.youtube.com/channel/UC2vfMMUMoAZd-RBGwA0-9Nw", + ]; + + return ( + +
+
+
+
+ {/* Render social media icons + {socialMediaIcons.map((icon, index) => ( + + {`Social + + ))} */} +
+
+ + News + + + Login + + + Sign Up + +
+
+
+

+ + CULTUREPLEX + +

+
+ +
+ +
+ {children} +
+ + +
+ ); +}; + +export const CGVLayout = (page: React.ReactElement) => {page}; diff --git a/data/auditoriumData.ts b/data/auditoriumData.ts new file mode 100644 index 0000000..6aed9f0 --- /dev/null +++ b/data/auditoriumData.ts @@ -0,0 +1,102 @@ +export interface AuditoriumData { + id: number; + title: string; + image_header_url: string; + image_content_url: string; +} + +const auditoriums: AuditoriumData[] = [ + { + id: 1, + title: "Exclusive Auditorium Screening", + image_header_url: "https://cdn.cgv.id/uploads_v2/special_audi/web/thumbnails/2308/SA202308041819584206.jpg", + image_content_url: "https://cdn.cgv.id/uploads_v2/special_audi/web/contents/2308/SA202308041819584206_content.jpg", + }, + { + id: 2, + title: "Auditorium Private Box", + image_header_url: "https://cdn.cgv.id/uploads_v2/special_audi/web/thumbnails/2308/SA202308041826292094.jpg", + image_content_url: "https://cdn.cgv.id/uploads_v2/events/2405/PR202405130837265152_content.jpg", + }, + { + id: 3, + title: "Auditorium Buy One Get One Free", + image_header_url: "https://cdn.cgv.id/uploads_v2/special_audi/web/thumbnails/2308/SA202308041827191534.jpg", + image_content_url: "https://via.placeholder.com/600x400?text=Buy+One+Get+One+Free", + }, + { + id: 4, + title: "Student Discount in Auditoriums", + image_header_url: "https://cdn.cgv.id/uploads_v2/events/2308/EV202308032144572577.jpg", + image_content_url: "https://via.placeholder.com/600x400?text=Student+Discount", + }, + { + id: 5, + title: "Family Fun Day at the Auditorium", + image_header_url: "https://cdn.cgv.id/uploads_v2/events/2404/PR202404291657431685.jpg", + image_content_url: "https://via.placeholder.com/600x400?text=Family+Fun+Day", + }, + { + id: 6, + title: "Early Bird Special in Auditoriums", + image_header_url: "https://via.placeholder.com/300x150?text=Early+Bird+Special", + image_content_url: "https://via.placeholder.com/600x400?text=Early+Bird+Special", + }, + { + id: 7, + title: "Late Night Movies in the Auditorium", + image_header_url: "https://via.placeholder.com/300x150?text=Late+Night+Movies", + image_content_url: "https://via.placeholder.com/600x400?text=Late+Night+Movies", + }, + { + id: 8, + title: "Member's Only Screening in Auditoriums", + image_header_url: "https://via.placeholder.com/300x150?text=Member's+Only+Screening", + image_content_url: "https://via.placeholder.com/600x400?text=Member's+Only+Screening", + }, + { + id: 9, + title: "Weekend Special in Auditoriums", + image_header_url: "https://via.placeholder.com/300x150?text=Weekend+Special", + image_content_url: "https://via.placeholder.com/600x400?text=Weekend+Special", + }, + { + id: 10, + title: "Free Popcorn Day in the Auditorium", + image_header_url: "https://via.placeholder.com/300x150?text=Free+Popcorn+Day", + image_content_url: "https://via.placeholder.com/600x400?text=Free+Popcorn+Day", + }, + { + id: 11, + title: "Valentine's Day Special in Auditoriums", + image_header_url: "https://via.placeholder.com/300x150?text=Valentine's+Day+Special", + image_content_url: "https://via.placeholder.com/600x400?text=Valentine's+Day+Special", + }, + { + id: 12, + title: "Halloween Horror Nights in the Auditorium", + image_header_url: "https://via.placeholder.com/300x150?text=Halloween+Horror+Nights", + image_content_url: "https://via.placeholder.com/600x400?text=Halloween+Horror+Nights", + }, + { + id: 13, + title: "Christmas Movie Marathon in Auditoriums", + image_header_url: "https://via.placeholder.com/300x150?text=Christmas+Movie+Marathon", + image_content_url: "https://via.placeholder.com/600x400?text=Christmas+Movie+Marathon", + }, + { + id: 14, + title: "Spring Break Specials in Auditoriums", + image_header_url: "https://via.placeholder.com/300x150?text=Spring+Break+Specials", + image_content_url: "https://via.placeholder.com/600x400?text=Spring+Break+Specials", + }, + { + id: 15, + title: "Oscar Winner Showcase in Auditoriums", + image_header_url: "https://via.placeholder.com/300x150?text=Oscar+Winner+Showcase", + image_content_url: "https://via.placeholder.com/600x400?text=Oscar+Winner+Showcase", + }, +]; + + +export default auditoriums; diff --git a/data/cinemaData.ts b/data/cinemaData.ts new file mode 100644 index 0000000..e63d788 --- /dev/null +++ b/data/cinemaData.ts @@ -0,0 +1,40 @@ +export const cities = [ + 'City1', + 'City2', + 'City3' +]; + +export const cinemas = [ + 'Cinema1', + 'Cinema2', + 'Cinema3' +]; + +export const cinemaData = { + Balikpapan: ['Terminal Point', 'Bandung Siapi Mall'], + Jakarta: ['CGV Grand Indonesia', 'CGV Pacific Place', 'CGV Central Park', 'CGV Plaza Senayan', 'CGV Kota Kasablanka'], + Surabaya: ['CGV Tunjungan Plaza', 'CGV Marvell City', 'CGV East Coast Center'], + Bandung: ['CGV Paris Van Java', 'CGV 23 Paskal', 'CGV Miko Mall'], + Medan: ['CGV Focal Point', 'CGV Manhattan Times Square'], + Makassar: ['CGV Panakkukang', 'CGV Mall Ratu Indah', 'CGV Trans Studio Mall'], + Yogyakarta: ['CGV J-Walk Mall', 'CGV Hartono Mall', 'CGV Empire XXI'], + Semarang: ['CGV DP Mall', 'CGV Java Supermall'], + Denpasar: ['CGV Level 21 Mall', 'CGV Plaza Renon'], + Palembang: ['CGV Social Market', 'CGV Palembang Icon'], + Malang: ['CGV Malang Town Square', 'CGV Dieng Plaza'], + Batam: ['CGV Kepri Mall', 'CGV Grand Batam Mall'], + Pekanbaru: ['CGV Transmart Pekanbaru', 'CGV Sadira Plaza'], + Pontianak: ['CGV Ayani Megamal', 'CGV Pontianak Mall'], + Manado: ['CGV Manado Town Square', 'CGV Grand Kawanua City Walk'], + Balikpapan2: ['CGV E-Walk', 'CGV Plaza Balikpapan'], + Banjarmasin: ['CGV Duta Mall', 'CGV Q Mall Banjarbaru'], + Samarinda: ['CGV Big Mall', 'CGV Samarinda Central Plaza'], + BandarLampung: ['CGV Transmart Lampung', 'CGV Boemi Kedaton'], + Solo: ['CGV Solo Paragon', 'CGV The Park Mall Solo Baru'], + Padang: ['CGV Transmart Padang', 'CGV Plaza Andalas'], + Mataram: ['CGV Lombok Epicentrum Mall', 'CGV Mataram Mall'], + Jambi: ['CGV WTC Batanghari', 'CGV Jambi Town Square'], + Palu: ['CGV Palu Grand Mall', 'CGV Transmart Palu'], + Tangerang: ['CGV Teraskota', 'CGV AEON Mall BSD City', 'CGV Living World Alam Sutera'], + Depok: ['CGV Depok Town Square', 'CGV Margo City', 'CGV Cinere Bellevue Mall'] +}; diff --git a/data/eventData.ts b/data/eventData.ts new file mode 100644 index 0000000..91268a4 --- /dev/null +++ b/data/eventData.ts @@ -0,0 +1,101 @@ +export interface EventData { + id: number; + title: string; + image_header_url: string; + image_content_url: string; +} + +const events: EventData[] = [ + { + id: 1, + title: "BUY 1 GET 1 FREE dengan tukar point MyTelkomsel kamu!", + image_header_url: "https://cdn.cgv.id/uploads_v2/events/2404/EV202404081054195281.jpg", + image_content_url: "https://cdn.cgv.id/uploads_v2/events/2404/EV202404201614316857_content.jpg", + }, + { + id: 2, + title: "Private Box", + image_header_url: "https://cdn.cgv.id/uploads_v2/events/2308/EV202308032157052628.jpg", + image_content_url: "https://cdn.cgv.id/uploads_v2/events/2308/EV202308032157052628_content.jpg", + }, + { + id: 3, + title: "Buy One Get One Free", + image_header_url: "https://cdn.cgv.id/uploads_v2/events/2308/EV202308032148233011.jpg", + image_content_url: "https://cdn.cgv.id/uploads_v2/events/2308/EV202308042015011813_content.jpg", + }, + { + id: 4, + title: "Student Discount", + image_header_url: "https://cdn.cgv.id/uploads_v2/events/2308/EV202308032144572577.jpg", + image_content_url: "https://via.placeholder.com/600x400?text=Student+Discount", + }, + { + id: 5, + title: "Family Fun Day", + image_header_url: "https://cdn.cgv.id/uploads_v2/events/2308/EV202308032144572577.jpg", + image_content_url: "https://via.placeholder.com/600x400?text=Family+Fun+Day", + }, + { + id: 6, + title: "Early Bird Special", + image_header_url: "https://via.placeholder.com/300x150?text=Early+Bird+Special", + image_content_url: "https://via.placeholder.com/600x400?text=Early+Bird+Special", + }, + { + id: 7, + title: "Late Night Movies", + image_header_url: "https://via.placeholder.com/300x150?text=Late+Night+Movies", + image_content_url: "https://via.placeholder.com/600x400?text=Late+Night+Movies", + }, + { + id: 8, + title: "Member's Only Screening", + image_header_url: "https://via.placeholder.com/300x150?text=Member's+Only+Screening", + image_content_url: "https://via.placeholder.com/600x400?text=Member's+Only+Screening", + }, + { + id: 9, + title: "Weekend Special", + image_header_url: "https://via.placeholder.com/300x150?text=Weekend+Special", + image_content_url: "https://via.placeholder.com/600x400?text=Weekend+Special", + }, + { + id: 10, + title: "Free Popcorn Day", + image_header_url: "https://via.placeholder.com/300x150?text=Free+Popcorn+Day", + image_content_url: "https://via.placeholder.com/600x400?text=Free+Popcorn+Day", + }, + { + id: 11, + title: "Valentine's Day Special", + image_header_url: "https://via.placeholder.com/300x150?text=Valentine's+Day+Special", + image_content_url: "https://via.placeholder.com/600x400?text=Valentine's+Day+Special", + }, + { + id: 12, + title: "Halloween Horror Nights", + image_header_url: "https://via.placeholder.com/300x150?text=Halloween+Horror+Nights", + image_content_url: "https://via.placeholder.com/600x400?text=Halloween+Horror+Nights", + }, + { + id: 13, + title: "Christmas Movie Marathon", + image_header_url: "https://via.placeholder.com/300x150?text=Christmas+Movie+Marathon", + image_content_url: "https://via.placeholder.com/600x400?text=Christmas+Movie+Marathon", + }, + { + id: 14, + title: "Spring Break Specials", + image_header_url: "https://via.placeholder.com/300x150?text=Spring+Break+Specials", + image_content_url: "https://via.placeholder.com/600x400?text=Spring+Break+Specials", + }, + { + id: 15, + title: "Oscar Winner Showcase", + image_header_url: "https://via.placeholder.com/300x150?text=Oscar+Winner+Showcase", + image_content_url: "https://via.placeholder.com/600x400?text=Oscar+Winner+Showcase", + }, +]; + +export default events; diff --git a/data/movieData.ts b/data/movieData.ts new file mode 100644 index 0000000..f6e3787 --- /dev/null +++ b/data/movieData.ts @@ -0,0 +1,260 @@ +export interface MovieData { + id: string; + title: string; + director: string[]; + cast: string[]; + censor_rating: string; + genre: string[]; + language: string; + subtitle: string; + duration: number; + synopsys: string; + posterUrl: string; + trailerUrl: string; + is_showing: number; +} + +const movies: MovieData[] = [ + { + id: '1', + title: 'Inception', + director: ['Christopher Nolan'], + cast: ['Leonardo DiCaprio', 'Joseph Gordon-Levitt', 'Ellen Page'], + censor_rating: 'PG-13', + genre: ['Action', 'Sci-Fi'], + language: 'English', + subtitle: 'English', + duration: 148, + synopsys: 'A thief who steals corporate secrets through the use of dream-sharing technology is given the inverse task of planting an idea into the mind of a C.E.O.', + posterUrl: 'https://cdn.cgv.id/uploads_v2/movie/compressed/24014600.jpg?version=2', + trailerUrl: 'https://www.youtube.com/watch?v=YoHD9XEInc0', + is_showing: 1, + }, + { + id: '2', + title: 'Pulp Fiction', + director: ['Quentin Tarantino'], + cast: ['John Travolta', 'Uma Thurman', 'Samuel L. Jackson'], + censor_rating: 'R', + genre: ['Crime', 'Drama'], + language: 'English', + subtitle: 'English', + duration: 154, + synopsys: 'The lives of two mob hitmen, a boxer, a gangster and his wife intertwine in four tales of violence and redemption.', + posterUrl: 'https://cdn.cgv.id/uploads_v2/movie/compressed/24006500.jpg?version=2', + trailerUrl: 'https://www.youtube.com/watch?v=s7EdQ4FqbhY', + is_showing: 1, + }, + { + id: '3', + title: 'Forrest Gump', + director: ['Robert Zemeckis'], + cast: ['Tom Hanks', 'Robin Wright', 'Gary Sinise'], + censor_rating: 'PG-13', + genre: ['Drama', 'Romance'], + language: 'English', + subtitle: 'English', + duration: 142, + synopsys: 'The presidencies of Kennedy and Johnson, the Vietnam War, the Watergate scandal and other historical events unfold from the perspective of an Alabama man with an IQ of 75.', + posterUrl: 'https://cdn.cgv.id/uploads_v2/movie/compressed/24010700.jpg?version=1', + trailerUrl: 'https://www.youtube.com/watch?v=bLvqoHBptjg', + is_showing: 1, + }, + { + id: '4', + title: 'The Shawshank Redemption', + director: ['Frank Darabont'], + cast: ['Tim Robbins', 'Morgan Freeman', 'Bob Gunton'], + censor_rating: 'R', + genre: ['Drama'], + language: 'English', + subtitle: 'English', + duration: 142, + synopsys: 'Two imprisoned men bond over a number of years, finding solace and eventual redemption through acts of common decency.', + posterUrl: 'https://cdn.cgv.id/uploads_v2/movie/compressed/24013100.jpg?version=1', + trailerUrl: 'https://www.youtube.com/watch?v=6hB3S9bIaco', + is_showing: 1, + }, + { + id: '5', + title: 'The Godfather', + director: ['Francis Ford Coppola'], + cast: ['Marlon Brando', 'Al Pacino', 'James Caan'], + censor_rating: 'R', + genre: ['Crime', 'Drama'], + language: 'English', + subtitle: 'English', + duration: 175, + synopsys: 'The aging patriarch of an organized crime dynasty transfers control of his clandestine empire to his reluctant son.', + posterUrl: 'https://cdn.cgv.id/uploads_v2/movie/compressed/24013300.jpg?version=1', + trailerUrl: 'https://www.youtube.com/watch?v=sY1S34973zA', + is_showing: 1, + }, + { + id: '6', + title: 'The Dark Knight', + director: ['Christopher Nolan'], + cast: ['Christian Bale', 'Heath Ledger', 'Aaron Eckhart'], + censor_rating: 'PG-13', + genre: ['Action', 'Crime', 'Drama'], + language: 'English', + subtitle: 'English', + duration: 152, + synopsys: 'When the menace known as the Joker emerges from his mysterious past, he wreaks havoc and chaos on the people of Gotham.', + posterUrl: 'https://cdn.cgv.id/uploads_v2/movie/compressed/24012700.jpg?version=1', + trailerUrl: 'https://www.youtube.com/watch?v=EXeTwQWrcwY', + is_showing: 1, + }, + { + id: '7', + title: 'Schindler\'s List', + director: ['Steven Spielberg'], + cast: ['Liam Neeson', 'Ralph Fiennes', 'Ben Kingsley'], + censor_rating: 'R', + genre: ['Biography', 'Drama', 'History'], + language: 'English', + subtitle: 'English', + duration: 195, + synopsys: 'In German-occupied Poland during World War II, Oskar Schindler gradually becomes concerned for his Jewish workforce after witnessing their persecution by the Nazis.', + posterUrl: 'https://cdn.cgv.id/uploads_v2/movie/compressed/24013000.jpg?version=1', + trailerUrl: 'https://www.youtube.com/watch?v=gG22XNhtnoY', + is_showing: 1, + }, + { + id: '8', + title: 'Fight Club', + director: ['David Fincher'], + cast: ['Brad Pitt', 'Edward Norton', 'Meat Loaf'], + censor_rating: 'R', + genre: ['Drama'], + language: 'English', + subtitle: 'English', + duration: 139, + synopsys: 'An insomniac office worker and a devil-may-care soap maker form an underground fight club that evolves into much more.', + posterUrl: 'https://cdn.cgv.id/uploads_v2/movie/compressed/24013800.jpg?version=1', + trailerUrl: 'https://www.youtube.com/watch?v=SUXWAEX2jlg', + is_showing: 1, + }, + { + id: '9', + title: 'Goodfellas', + director: ['Martin Scorsese'], + cast: ['Robert De Niro', 'Ray Liotta', 'Joe Pesci'], + censor_rating: 'R', + genre: ['Biography', 'Crime', 'Drama'], + language: 'English', + subtitle: 'English', + duration: 146, + synopsys: 'The story of Henry Hill and his life in the mob, covering his relationship with his wife Karen Hill and his mob partners.', + posterUrl: 'https://cdn.cgv.id/uploads_v2/movie/compressed/24012300.jpg?version=1', + trailerUrl: 'https://www.youtube.com/watch?v=qo5jJpHtI1Y', + is_showing: 1, + }, + { + id: '10', + title: 'The Matrix', + director: ['Lana Wachowski', 'Lilly Wachowski'], + cast: ['Keanu Reeves', 'Laurence Fishburne', 'Carrie-Anne Moss'], + censor_rating: 'R', + genre: ['Action', 'Sci-Fi'], + language: 'English', + subtitle: 'English', + duration: 136, + synopsys: 'A computer hacker learns from mysterious rebels about the true nature of his reality and his role in the war against its controllers.', + posterUrl: 'https://cdn.cgv.id/uploads_v2/movie/compressed/24011500.jpg?version=2', + trailerUrl: 'https://www.youtube.com/watch?v=vKQi3bBA1y8', + is_showing: 1, + }, + { + id: '11', + title: 'Forrest Gump', + director: ['Robert Zemeckis'], + cast: ['Tom Hanks', 'Robin Wright', 'Gary Sinise'], + censor_rating: 'PG-13', + genre: ['Drama', 'Romance'], + language: 'English', + subtitle: 'English', + duration: 142, + synopsys: 'The presidencies of Kennedy and Johnson, the Vietnam War, the Watergate scandal and other historical events unfold from the perspective of an Alabama man with an IQ of 75.', + posterUrl: 'https://cdn.cgv.id/uploads_v2/movie/compressed/24012100.jpg?version=1', + trailerUrl: 'https://www.youtube.com/watch?v=bLvqoHBptjg', + is_showing: 1, + }, + { + id: '12', + title: 'The Lord of the Rings: The Fellowship of the Ring', + director: ['Peter Jackson'], + cast: ['Elijah Wood', 'Ian McKellen', 'Orlando Bloom'], + censor_rating: 'PG-13', + genre: ['Action', 'Adventure', 'Drama'], + language: 'English', + subtitle: 'English', + duration: 178, + synopsys: 'A meek Hobbit from the Shire and eight companions set out on a journey to destroy the powerful One Ring and save Middle-earth from the Dark Lord Sauron.', + posterUrl: 'https://cdn.cgv.id/uploads_v2/movie/compressed/24003200.jpg?version=3g', + trailerUrl: 'https://www.youtube.com/watch?v=V75dMMIW2B4', + is_showing: 1, + }, + { + id: '13', + title: 'The Silence of the Lambs', + director: ['Jonathan Demme'], + cast: ['Jodie Foster', 'Anthony Hopkins', 'Lawrence A. Bonney'], + censor_rating: 'R', + genre: ['Crime', 'Drama', 'Thriller'], + language: 'English', + subtitle: 'English', + duration: 118, + synopsys: 'A young F.B.I. cadet must receive the help of an incarcerated and manipulative cannibal killer to help catch another serial killer, a madman who skins his victims.', + posterUrl: 'https://cdn.cgv.id/uploads_v2/movie/compressed/24011900.jpg?version=1', + trailerUrl: 'https://www.youtube.com/watch?v=W6Mm8Sbe__o', + is_showing: 1, + }, + { + id: '14', + title: 'Forrest Gump', + director: ['Robert Zemeckis'], + cast: ['Tom Hanks', 'Robin Wright', 'Gary Sinise'], + censor_rating: 'PG-13', + genre: ['Drama', 'Romance'], + language: 'English', + subtitle: 'English', + duration: 142, + synopsys: 'The presidencies of Kennedy and Johnson, the Vietnam War, the Watergate scandal and other historical events unfold from the perspective of an Alabama man with an IQ of 75.', + posterUrl: 'https://cdn.cgv.id/uploads_v2/movie/compressed/22024700.jpg?version=1', + trailerUrl: 'https://www.youtube.com/watch?v=bLvqoHBptjg', + is_showing: 1, + }, + { + id: '15', + title: 'The Usual Suspects', + director: ['Bryan Singer'], + cast: ['Kevin Spacey', 'Gabriel Byrne', 'Chazz Palminteri'], + censor_rating: 'R', + genre: ['Crime', 'Drama', 'Mystery'], + language: 'English', + subtitle: 'English', + duration: 106, + synopsys: 'A sole survivor tells of the twisty events leading up to a horrific gun battle on a boat, which began when five criminals met at a seemingly random police lineup.', + posterUrl: 'https://cdn.cgv.id/uploads_v2/movie/compressed/24010900.jpg?version=1', + trailerUrl: 'https://www.youtube.com/watch?v=oiXdPolca5w', + is_showing: 1, + }, + { + id: '16', + title: 'Se7en', + director: ['David Fincher'], + cast: ['Morgan Freeman', 'Brad Pitt', 'Kevin Spacey'], + censor_rating: 'R', + genre: ['Crime', 'Drama', 'Mystery'], + language: 'English', + subtitle: 'English', + duration: 127, + synopsys: 'Two detectives, a rookie and a veteran, hunt a serial killer who uses the seven deadly sins as his motives.', + posterUrl: 'https://cdn.cgv.id/uploads_v2/movie/compressed/24011300.jpg?version=1', + trailerUrl: 'https://www.youtube.com/watch?v=znmZoVkCjpI', + is_showing: 1, + }, +]; + +export default movies; diff --git a/data/promotionData.ts b/data/promotionData.ts new file mode 100644 index 0000000..f3458f7 --- /dev/null +++ b/data/promotionData.ts @@ -0,0 +1,101 @@ +export interface PromotionData { + id: number; + title: string; + image_header_url: string; + image_content_url: string; +} + +const promotions: PromotionData[] = [ + { + id: 1, + title: "BUY 1 GET 1 FREE dengan tukar point MyTelkomsel kamu!", + image_header_url: "https://cdn.cgv.id/uploads_v2/promotions/2405/PR202405171125514961.jpg", + image_content_url: "https://cdn.cgv.id/uploads_v2/promotions/2405/PR202405171125514961_content.jpg", + }, + { + id: 2, + title: "Exclusive Premiere Night", + image_header_url: "https://cdn.cgv.id/uploads_v2/promotions/2405/PR202405100933495889.jpg", + image_content_url: "https://cdn.cgv.id/uploads_v2/promotions/2405/PR202405130837265152_content.jpg", + }, + { + id: 3, + title: "Buy One Get One Free", + image_header_url: "https://cdn.cgv.id/uploads_v2/promotions/2405/PR202405021526585021.jpg", + image_content_url: "https://via.placeholder.com/600x400?text=Buy+One+Get+One+Free", + }, + { + id: 4, + title: "Student Discount", + image_header_url: "https://cdn.cgv.id/uploads_v2/promotions/2404/PR202404251623022054.jpg", + image_content_url: "https://via.placeholder.com/600x400?text=Student+Discount", + }, + { + id: 5, + title: "Family Fun Day", + image_header_url: "https://cdn.cgv.id/uploads_v2/promotions/2404/PR202404291657431685.jpg", + image_content_url: "https://via.placeholder.com/600x400?text=Family+Fun+Day", + }, + { + id: 6, + title: "Early Bird Special", + image_header_url: "https://via.placeholder.com/300x150?text=Early+Bird+Special", + image_content_url: "https://via.placeholder.com/600x400?text=Early+Bird+Special", + }, + { + id: 7, + title: "Late Night Movies", + image_header_url: "https://via.placeholder.com/300x150?text=Late+Night+Movies", + image_content_url: "https://via.placeholder.com/600x400?text=Late+Night+Movies", + }, + { + id: 8, + title: "Member's Only Screening", + image_header_url: "https://via.placeholder.com/300x150?text=Member's+Only+Screening", + image_content_url: "https://via.placeholder.com/600x400?text=Member's+Only+Screening", + }, + { + id: 9, + title: "Weekend Special", + image_header_url: "https://via.placeholder.com/300x150?text=Weekend+Special", + image_content_url: "https://via.placeholder.com/600x400?text=Weekend+Special", + }, + { + id: 10, + title: "Free Popcorn Day", + image_header_url: "https://via.placeholder.com/300x150?text=Free+Popcorn+Day", + image_content_url: "https://via.placeholder.com/600x400?text=Free+Popcorn+Day", + }, + { + id: 11, + title: "Valentine's Day Special", + image_header_url: "https://via.placeholder.com/300x150?text=Valentine's+Day+Special", + image_content_url: "https://via.placeholder.com/600x400?text=Valentine's+Day+Special", + }, + { + id: 12, + title: "Halloween Horror Nights", + image_header_url: "https://via.placeholder.com/300x150?text=Halloween+Horror+Nights", + image_content_url: "https://via.placeholder.com/600x400?text=Halloween+Horror+Nights", + }, + { + id: 13, + title: "Christmas Movie Marathon", + image_header_url: "https://via.placeholder.com/300x150?text=Christmas+Movie+Marathon", + image_content_url: "https://via.placeholder.com/600x400?text=Christmas+Movie+Marathon", + }, + { + id: 14, + title: "Spring Break Specials", + image_header_url: "https://via.placeholder.com/300x150?text=Spring+Break+Specials", + image_content_url: "https://via.placeholder.com/600x400?text=Spring+Break+Specials", + }, + { + id: 15, + title: "Oscar Winner Showcase", + image_header_url: "https://via.placeholder.com/300x150?text=Oscar+Winner+Showcase", + image_content_url: "https://via.placeholder.com/600x400?text=Oscar+Winner+Showcase", + }, +]; + +export default promotions; diff --git a/data/sportData.ts b/data/sportData.ts new file mode 100644 index 0000000..103b0e0 --- /dev/null +++ b/data/sportData.ts @@ -0,0 +1,102 @@ +export interface SportData { + id: number; + title: string; + image_header_url: string; + image_content_url: string; +} + +const sports: SportData[] = [ + { + id: 16, + title: "Live Sports Screening", + image_header_url: "https://cdn.cgv.id/uploads_v2/special_audi/web/thumbnails/2308/SA202308041835362098.jpg", + image_content_url: "https://cdn.cgv.id/uploads_v2/special_audi/web/contents/2308/SA202308041835362098_content.jpg", + }, + { + id: 17, + title: "Football Match Live", + image_header_url: "https://cdn.cgv.id/uploads_v2/special_audi/web/thumbnails/2308/SA202308041834249027.jpg", + image_content_url: "https://cdn.cgv.id/uploads_v2/events/2405/PR202405130837265152_content.jpg", + }, + { + id: 18, + title: "Basketball Championship", + image_header_url: "https://cdn.cgv.id/uploads_v2/special_audi/web/thumbnails/2308/SA202308041833368000.jpg", + image_content_url: "https://via.placeholder.com/600x400?text=Basketball+Championship", + }, + { + id: 19, + title: "Tennis Grand Slam", + image_header_url: "https://cdn.cgv.id/uploads_v2/events/2308/EV202308032144572577.jpg", + image_content_url: "https://via.placeholder.com/600x400?text=Tennis+Grand+Slam", + }, + { + id: 20, + title: "Olympics Viewing", + image_header_url: "https://cdn.cgv.id/uploads_v2/events/2404/PR202404291657431685.jpg", + image_content_url: "https://via.placeholder.com/600x400?text=Olympics+Viewing", + }, + { + id: 21, + title: "Early Morning Workout Sessions", + image_header_url: "https://via.placeholder.com/300x150?text=Early+Morning+Workout+Sessions", + image_content_url: "https://via.placeholder.com/600x400?text=Early+Morning+Workout+Sessions", + }, + { + id: 22, + title: "Late Night Fitness", + image_header_url: "https://via.placeholder.com/300x150?text=Late+Night+Fitness", + image_content_url: "https://via.placeholder.com/600x400?text=Late+Night+Fitness", + }, + { + id: 23, + title: "Member's Only Sports Day", + image_header_url: "https://via.placeholder.com/300x150?text=Member's+Only+Sports+Day", + image_content_url: "https://via.placeholder.com/600x400?text=Member's+Only+Sports+Day", + }, + { + id: 24, + title: "Weekend Sports Events", + image_header_url: "https://via.placeholder.com/300x150?text=Weekend+Sports+Events", + image_content_url: "https://via.placeholder.com/600x400?text=Weekend+Sports+Events", + }, + { + id: 25, + title: "Free Yoga Sessions", + image_header_url: "https://via.placeholder.com/300x150?text=Free+Yoga+Sessions", + image_content_url: "https://via.placeholder.com/600x400?text=Free+Yoga+Sessions", + }, + { + id: 26, + title: "Valentine's Day Sports Special", + image_header_url: "https://via.placeholder.com/300x150?text=Valentine's+Day+Sports+Special", + image_content_url: "https://via.placeholder.com/600x400?text=Valentine's+Day+Sports+Special", + }, + { + id: 27, + title: "Halloween Sports Night", + image_header_url: "https://via.placeholder.com/300x150?text=Halloween+Sports+Night", + image_content_url: "https://via.placeholder.com/600x400?text=Halloween+Sports+Night", + }, + { + id: 28, + title: "Christmas Sports Extravaganza", + image_header_url: "https://via.placeholder.com/300x150?text=Christmas+Sports+Extravaganza", + image_content_url: "https://via.placeholder.com/600x400?text=Christmas+Sports+Extravaganza", + }, + { + id: 29, + title: "Spring Sports Festival", + image_header_url: "https://via.placeholder.com/300x150?text=Spring+Sports+Festival", + image_content_url: "https://via.placeholder.com/600x400?text=Spring+Sports+Festival", + }, + { + id: 30, + title: "Sports Oscar Winner Showcase", + image_header_url: "https://via.placeholder.com/300x150?text=Sports+Oscar+Winner+Showcase", + image_content_url: "https://via.placeholder.com/600x400?text=Sports+Oscar+Winner+Showcase", + }, +]; + + +export default sports; diff --git a/package-lock.json b/package-lock.json index 9344003..f6e5e3b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "Apache-2.0", "dependencies": { "@fortawesome/fontawesome-svg-core": "6.4.0", + "@fortawesome/free-brands-svg-icons": "^6.5.2", "@fortawesome/free-solid-svg-icons": "6.4.0", "@fortawesome/react-fontawesome": "0.2.0", "@hookform/error-message": "2.0.1", @@ -218,6 +219,27 @@ "node": ">=6" } }, + "node_modules/@fortawesome/free-brands-svg-icons": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.5.2.tgz", + "integrity": "sha512-zi5FNYdmKLnEc0jc0uuHH17kz/hfYTg4Uei0wMGzcoCL/4d3WM3u1VMc0iGGa31HuhV5i7ZK8ZlTCQrHqRHSGQ==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.5.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-brands-svg-icons/node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz", + "integrity": "sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, "node_modules/@fortawesome/free-solid-svg-icons": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz", @@ -1611,7 +1633,7 @@ "version": "2.29.3", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.11" }, diff --git a/package.json b/package.json index 3d75a9a..a6edd9b 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ }, "dependencies": { "@fortawesome/fontawesome-svg-core": "6.4.0", + "@fortawesome/free-brands-svg-icons": "^6.5.2", "@fortawesome/free-solid-svg-icons": "6.4.0", "@fortawesome/react-fontawesome": "0.2.0", "@hookform/error-message": "2.0.1", diff --git a/pages/.DS_Store b/pages/.DS_Store new file mode 100644 index 0000000..b6aca82 Binary files /dev/null and b/pages/.DS_Store differ diff --git a/pages/cinema/index.tsx b/pages/cinema/index.tsx new file mode 100644 index 0000000..c2af934 --- /dev/null +++ b/pages/cinema/index.tsx @@ -0,0 +1,72 @@ +import { useState } from "react"; +import { cinemaData } from "@/data/cinemaData"; +import { CGVLayout } from "@/components/CGVLayout"; +import { Page } from "@/types/Page"; + +const CinemaPage: Page = () => { + const [selectedCity, setSelectedCity] = useState(null); + const [selectedCinema, setSelectedCinema] = useState(null); + + const cities = Object.keys(cinemaData); + const cinemas = selectedCity ? cinemaData[selectedCity] : []; + + const handleCityClick = (city: string) => { + setSelectedCity(city); + setSelectedCinema(null); + }; + + const handleCinemaClick = (cinema: string) => { + setSelectedCinema(cinema); + }; + + return ( +
+
+
+
+ CGV Logo +
+
+
+ {cities.map(city => ( +
handleCityClick(city)} + > + {city} +
+ ))} +
+
+
+ {selectedCity && ( +
+ {cinemas.map(cinema => ( +
handleCinemaClick(cinema)} + > + {cinema} +
+ ))} +
+ )} +
+
+
+
+ ); +}; + +CinemaPage.layout = CGVLayout; +export default CinemaPage; diff --git a/pages/content/about_us.tsx b/pages/content/about_us.tsx new file mode 100644 index 0000000..35ad352 --- /dev/null +++ b/pages/content/about_us.tsx @@ -0,0 +1,56 @@ +import React from 'react'; +import { CGVLayout } from '@/components/CGVLayout'; +import { Page } from "@/types/Page"; + +const AboutUs: Page = () => { + return ( +
+
+

TENTANG CJ CGV INDONESIA

+

+ PT. Graha Layar Prima, Tbk juga dikenal sebagai CJ CGV Cinemas (atau sebelumnya dikenal sebagai Blitz Megaplex) adalah jaringan bioskop terkemuka di Indonesia yang didirikan pertama kali pada tahun 2004 dan mengoperasikan bioskop pertamanya di Paris Van Java, Bandung pada tahun 2006. +

+

+ CJ CGV memberikan pengalaman menonton lebih menyenangkan dengan kemajuan teknologi yang digunakan seperti; 3D, 4DX, Screen X, SphereX, dan Dolby Atmos, melalui beragam pilihan auditorium yaitu Regular Class, Velvet Class, Gold Class, Satin Class, Sweetbox, Sky Seat dan Private Box. +

+

+ Mengusung konsep Cultureplex dimana kami tidak hanya menyediakan tempat untuk menonton film, CJ CGV* CINEMAS turut memberi ruang bagi beragam komunitas di sekitar lokasi CGV untuk melakukan aktivitas kesenian, seperti pertunjukan musik dan tarian, pertemuan corporate, gathering, dan memberikan wadah kreasi serta mengekspresikan diri untuk masyarakat seluruh Indonesia. +

+

+ Dengan kapasitas layar yang terus bertambah, CJ CGV memutarkan berbagai macam jenis film dari berbagai Negara seperti India, Korea, Jepang, Thailand dan tentunya konten lokal dari dalam negeri. CJ CGV Indonesia menayangkan berbagai pilihan film dari rumah produksi internasional dan lokal, serta pembuat film independen dan studio anime. Dengan tayangan dari berbagai Negara seperti India, Korea, Thailand, Jepang dan tentunya konten dalam negeri, auditorium CJ CGV juga dilengkapi dengan teknologi audio visual berkualitas tinggi dengan hasil resonansi suara yang jernih. +

+

+ Hingga kini CJ CGV telah mengoperasikan 71 bioskop dan 408 layar yang tersebar di lebih dari 30 kota di seluruh Indonesia, dan akan terus melebarkan jaringan baru untuk memperkuat positioning perusahaan dan menjangkau masyarakat dengan lebih luas. +

+

+ Website: www.cgv.id | Facebook: CGV Cinemas Indonesia |
+ Twitter: @CGV_ID | Instagram: @CGV.ID | LINE: CGV Cinemas +

+
+ +
+
+ + Image 1 + +
+
+ +
+
+ + Image 2 + +
+
+
+ ); +}; + +AboutUs.layout = CGVLayout; +export default AboutUs; diff --git a/pages/content/careers.tsx b/pages/content/careers.tsx new file mode 100644 index 0000000..526b176 --- /dev/null +++ b/pages/content/careers.tsx @@ -0,0 +1,92 @@ +import React from 'react'; +import { CGVLayout } from '@/components/CGVLayout'; +import { Page } from "@/types/Page"; + +const CareersPage: Page = () => { + return ( +
+
+

WHO ARE WE?

+

+ Welcome to CGV CINEMAS. In CGV CINEMAS the terms of Auditorium is what they call Theatre somewhere else, and it is where we screen all of our movies on the largest screens in Indonesia. CGV CINEMAS presents the concept of Cultureplex, where it brings entertainment by combining film, music, fine dining, and meeting point all in one place: The CGV CINEMAS. +

+

+ All of the CGV staffs proudly call themselves stars because of their unique differences. The difference lays on the costumer oriented services. Each stars has the fresh and energetic bearings in giving services with warm and genial approaches, so each costumers can truly feel the amazing experience during their visit to CGV CINEMAS. All of these are based on CGV CINEMAS vision, to be the ultimate choice for the most unforgettable experiences. +

+

+ Based on the vision, CGV CINEMAS is running a mission:
+ 1. to provide the most innovative, fun and enjoyable entertainment experiences to all our customers, and
+ 2. to create growth opportunities to all our stakeholders, employees, suppliers and community. +

+

+ Do you have what it takes to be a stars? If you are interested in joining this marvelous team delivering the unforgettable experience in entertainment, fill the form and send it to us. +

+ +

+ CAREER OPPORTUNITIES +

+
    +
  • + A. Finance & Accounting +
      +
    • a. Purchasing
    • +
    • b. Legal & Compliance
    • +
    • c. IT Management
    • +
    • d. Technical Team +
        +
      • i. Movie Engineer Support
      • +
      +
    • +
    • e. Operations +
        +
      • i. Cinema Supervisor
      • +
      • ii. Assistant Cinema Manager
      • +
      • iii. Operations Accounting
      • +
      • iv. Learning and Development
      • +
      +
    • +
    • f. Food & Beverages
    • +
    • g. Content & Movie Programming
    • +
    • h. Safety Management +
        +
      • i. Hygiene and Sanitation
      • +
      +
    • +
    • i. Marketing
    • +
    • j. Brand Identity Team
    • +
    • k. Advertising Sales & Planning
    • +
    • l. Site Development
    • +
    • m. Project & Construction
    • +
    • n. Design & Layout
    • +
    • o. Human Resources
    • +
    +
  • +
+
+ +
+
+ + Image 1 + +
+
+ +
+
+ + Image 2 + +
+
+
+ ); +}; + +CareersPage.layout = CGVLayout; +export default CareersPage; diff --git a/pages/content/contact_us.tsx b/pages/content/contact_us.tsx new file mode 100644 index 0000000..f334dee --- /dev/null +++ b/pages/content/contact_us.tsx @@ -0,0 +1,51 @@ +import React from 'react'; +import { CGVLayout } from '@/components/CGVLayout'; +import { Page } from "@/types/Page"; + +const ContactUs: Page = () => { + return ( +
+
+

Contact CGV CINEMAS:

+

+ Call Center
callcenter@cgv.id +

+

+ Email
+6221-2920-0100 +

+

+ Call Center Operating Hours
Monday - Sunday 11.00 - 20.00 +

+

+ CGV Cinemas HQ Office
+ AIA Central 26th floor
+ Jl. Jend. Sudirman Kav. 48A – Jakarta Selatan 12930 +

+
+ +
+
+ + Image 1 + +
+
+ +
+
+ + Image 2 + +
+
+
+ ); +}; + +ContactUs.layout = CGVLayout; +export default ContactUs; diff --git a/pages/content/feedback.tsx b/pages/content/feedback.tsx new file mode 100644 index 0000000..2822ecb --- /dev/null +++ b/pages/content/feedback.tsx @@ -0,0 +1,41 @@ +import React from 'react'; +import { CGVLayout } from '@/components/CGVLayout'; +import { Page } from "@/types/Page"; + +const FeedbackPage: Page = () => { + return ( +
+
+

Feedback

+

+ You can leave comments or feedback to our service by directly email us at support@cgv.id. We value every feedback we received. + And once in a while will have promotionnal gift to our eager customer. Grateful for every seconds you give us thoughts! +

+
+ +
+
+ + Image 1 + +
+
+ +
+
+ + Image 2 + +
+
+
+ ); +}; + +FeedbackPage.layout = CGVLayout; +export default FeedbackPage; diff --git a/pages/content/investor_relation.tsx b/pages/content/investor_relation.tsx new file mode 100644 index 0000000..938fed8 --- /dev/null +++ b/pages/content/investor_relation.tsx @@ -0,0 +1,43 @@ +import React from 'react'; +import { CGVLayout } from '@/components/CGVLayout'; +import { Page } from "@/types/Page"; + +const InvestorRelation: Page = () => { + return ( +
+
+

Sekilas Tentang CGV

+

+ PT Graha Layar Prima Tbk Perseroan atau yang lebih dikenal dengan CGV Cinemas didirikan pada tahun 2004 oleh sekelompok investor lokal yang memiliki pengalaman yang luas dalam pengembangan properti, hiburan, dan usaha kewirausahaan. Tahun 2006 merupakan salah satu tonggak sejarah Perseroan karena di tahun ini Perseroan berhasil membuka bioskop pertama Perseroan di Paris Van Java Bandung. Kemudian di tahun 2014 Perseroan menjadi Perusahaan bioskop pertama dan satu-satunya yang menjadi Perusahaan Tercatat di Bursa Efek Indonesia dan berkolaborasi dengan Global Cinema Player terkemuka asal Korea Selatan yakni CJ CGV. +

+

+ Melalui visi Evolving Beyond Movies, No. 1 Cultureplex in Indonesia, CGV Cinemas hadir dengan konsep Cultureplex yang bertujuan untuk memberikan pengalaman menonton film tak terlupakan di tempat pertama, satu-satunya dan terbaik, dimana pengunjung dapat menikmati tak hanya pengalaman menonton film terbaik namun juga berbagai macam keseruan dan pengalaman menarik lainnya. Komitmen teguh Perseroan untuk menghadirkan Cultureplex sebagai konsep bioskop terbaru telah menjadi pendorong dibalik evolusi berkelanjutan Perseroan. +

+
+ +
+
+ + Image 1 + +
+
+ +
+
+ + Image 2 + +
+
+
+ ); +}; + +InvestorRelation.layout = CGVLayout; +export default InvestorRelation; diff --git a/pages/content/legal_term.tsx b/pages/content/legal_term.tsx new file mode 100644 index 0000000..176e76e --- /dev/null +++ b/pages/content/legal_term.tsx @@ -0,0 +1,112 @@ +import React from 'react'; +import { CGVLayout } from '@/components/CGVLayout'; +import { Page } from "@/types/Page"; + +const LegalTerms: Page = () => { + return ( +
+
+

PRIVACY POLICY FOR CGV CINEMAS

+

+ At CGV Cinemas, accessible from www.cgv.id and application, one of our main priorities is the privacy of our visitors. This Privacy Policy document contains types of information that is collected and recorded by CGV Cinemas and how we use it. +

+

+ If you have additional questions or require more information about our Privacy Policy, do not hesitate to contact us. +

+

Log Files

+

+ CGV Cinemas follows a standard procedure of using log files. These files log visitors when they visit websites. All hosting companies do this and a part of hosting services' analytics. The information collected by log files include internet protocol (IP) addresses, browser type, Internet Service Provider (ISP), date and time stamp, referring/exit pages, and possibly the number of clicks. These are not linked to any information that is personally identifiable. The purpose of the information is for analyzing trends, administering the site, tracking users' movement on the website, and gathering demographic information. Our Privacy Policy was created with the help of the Privacy Policy Generator. +

+

Cookies and Web Beacons

+

+ Like any other website, CGV Cinemas uses "cookies". These cookies are used to store information including visitors' preferences, and the pages on the website that the visitor accessed or visited. The information is used to optimize the users' experience by customizing our web page content based on visitors' browser type and/or other information. +

+

+ For more general information on cookies, please read the "Cookies" article from the Privacy Policy Generator. +

+

Google DoubleClick DART Cookie

+

+ Google is one of a third-party vendor on our site. It also uses cookies, known as DART cookies, to serve ads to our site visitors based upon their visit to www.website.com and other sites on the internet. However, visitors may choose to decline the use of DART cookies by visiting the Google ad and content network Privacy Policy at the following URL https://policies.google.com/technologies/ads +

+

Privacy Policies

+

+ You may consult this list to find the Privacy Policy for each of the advertising partners of CGV Cinemas. +

+

+ Third-party ad servers or ad networks uses technologies like cookies, JavaScript, or Web Beacons that are used in their respective advertisements and links that appear on CGV Cinemas, which are sent directly to users' browser. They automatically receive your IP address when this occurs. These technologies are used to measure the effectiveness of their advertising campaigns and/or to personalize the advertising content that you see on websites that you visit. +

+

+ Note that CGV Cinemas has no access to or control over these cookies that are used by third-party advertisers. +

+

Third Party Privacy Policies

+

+ CGV Cinemas's Privacy Policy does not apply to other advertisers or websites. Thus, we are advising you to consult the respective Privacy Policies of these third-party ad servers for more detailed information. It may include their practices and instructions about how to opt-out of certain options. +

+

+ You can choose to disable cookies through your individual browser options. To know more detailed information about cookie management with specific web browsers, it can be found at the browsers' respective websites. What Are Cookies? +

+

Children's Information

+

+ Another part of our priority is adding protection for children while using the internet. We encourage parents and guardians to observe, participate in, and/or monitor and guide their online activity. +

+

+ CGV Cinemas does not knowingly collect any Personal Identifiable Information from children under the age of 13. If you think that your child provided this kind of information on our website, we strongly encourage you to contact us immediately and we will do our best efforts to promptly + remove such information from our records. +

+

Online Privacy Policy Only

+

+ This Privacy Policy applies only to our online activities and is valid for visitors to our website with regards to the information that they shared and/or collect in CGV Cinemas. This policy is not applicable to any information collected offline or via channels other than this website. +

+

Consent

+

+ By using our website, you hereby consent to our Privacy Policy and agree to its Terms and Conditions. +

+

LEGAL TERMS: CGV CINEMAS ONLINE CHANNEL & MEMBERSHIP

+

+ Issue: +

+
    +
  • Unauthorized usage of CGV Cinemas content by third parties without consent and knowledge of CGV Cinemas.
  • +
  • Sale of CGV Cinemas tickets by third parties without consent and knowledge of CGV Cinemas.
  • +
  • Utilization of Members Balance & Points by customers as resellers through unofficial channels not endorsed by CGV Cinemas.
  • +
  • Use of Members Balance & Points by other customers without the permission of the rightful owner.
  • +
+

Terms:

+
    +
  • The content found on CGV Cinemas Website, Application, & Onsite is content selected by CGV Cinemas and has been approved for use by the film owner & partner. Usage by third parties without CGV Cinemas consent is considered an illegal act.
  • +
  • CGV Cinemas only sells official tickets through official channels and partners. CGV Cinemas does not guarantee the security of transactions or ticket availability outside of CGV Cinemas official channels.
  • +
  • The CGV Cinemas Points obtained and used by Members are a form of rewards from CGV Cinemas to the Member as a loyal customer of CGV Cinemas. CGV Cinemas Points used as a payment method are not for resale to customers or third parties.
  • +
  • CGV Cinemas Points represent a value owned by each Member, and their usage requires a PIN & Password that is only known by the Member.
  • +
  • The PIN & Password for CGV Cinemas Members are confidential and the responsibility of each customer. We are not responsible for the misuse of PIN & password by third parties.
  • +
  • All successful transactions that occur in CGV Cinemas are final, and transactions that have already occurred cannot be canceled.
  • +
  • CGV Cinemas is not responsible for transaction errors caused by customers.
  • +
  • CGV Cinemas reserves the right to cancel transactions if there is suspicion of misuse of CGV Cinemas Points or transactions outside of CGV Cinemas official channels.
  • +
+
+ +
+
+ + Image 1 + +
+
+ +
+
+ + Image 2 + +
+
+
+ ); +}; + +LegalTerms.layout = CGVLayout; +export default LegalTerms; diff --git a/pages/index.tsx b/pages/index.tsx index 6c0943a..d703832 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,15 +1,154 @@ -import { WithDefaultLayout } from '../components/DefautLayout'; -import { Title } from '../components/Title'; -import { Page } from '../types/Page'; +import React, { useRef } from 'react'; +import { CGVLayout } from "@/components/CGVLayout"; +import { Page } from "@/types/Page"; +import { Row, Col, Carousel, Button } from "antd"; +import movies from "@/data/movieData"; +import { useState } from "react"; +import promotionData from "@/data/promotionData"; +import newsData from "@/data/eventData"; +import Link from 'next/link'; + +const Home: Page = () => { + const imageLinks = [ + "https://travelmaker1.b-cdn.net/wp-content/uploads/2023/08/Aug-23-CGV-720x405-3.png", + "https://travelmaker1.b-cdn.net/wp-content/uploads/2023/08/Aug-23-CGV-720x405-3.png", + "https://travelmaker1.b-cdn.net/wp-content/uploads/2023/08/Aug-23-CGV-720x405-3.png" + ]; + + const imageLinkUrls = [ + "https://www.cgv.id/app-ticket", + "https://www.cgv.id/app-jajan", + "https://www.cgv.id/app-fitur" + ]; + + const totalMovies = movies.length; + const moviesPerCarousel = 4; + const totalCarousels = Math.ceil(totalMovies / moviesPerCarousel); + + const carouselRef = useRef(null); + + const handleNextCarousel = () => { + carouselRef.current.next(); + }; + + const handlePrevCarousel = () => { + carouselRef.current.prev(); + }; + + const [currentCategory, setCurrentCategory] = useState<'promotions' | 'news'>('promotions'); + const data = currentCategory === 'promotions' ? promotionData.slice(0, 4) : newsData.slice(0, 4); + + const detailLink = currentCategory === 'promotions' ? '/promotion/detail/' : '/news/detail/'; -const IndexPage: Page = () => { return (
- Home - Hello World! + +
+ + + + + {movies.slice(0, 5).map((movie) => ( +
+ + {movie.title} + +
+ ))} +
+ + + +
+ {imageLinks.map((link, index) => ( +
+ + {`Image + +
+ ))} +
+ + +
+
+ + +
+

MOVIE SELECTION

+ + {[...Array(totalCarousels)].map((_, carouselIndex) => ( +
+ + {movies.slice(carouselIndex * moviesPerCarousel, (carouselIndex + 1) * moviesPerCarousel).map((movie) => ( + + + {movie.title} + + + ))} + +
+ ))} +
+
+ + +
+
+ + +
+

CGV UPDATES

+
+
setCurrentCategory('promotions')} + > + Promotions +
+
setCurrentCategory('news')} + > + News +
+
+ + {[...Array(1)].map((_, index) => ( +
+ + {data.map((item) => ( + + + {item.title} + + + ))} + +
+ ))} +
+
); -} +}; -IndexPage.layout = WithDefaultLayout; -export default IndexPage; +Home.layout = CGVLayout; +export default Home; diff --git a/pages/membership/index.tsx b/pages/membership/index.tsx new file mode 100644 index 0000000..fd6813a --- /dev/null +++ b/pages/membership/index.tsx @@ -0,0 +1,69 @@ +import { CGVLayout } from "@/components/CGVLayout"; +import { Collapse, Button } from "antd"; +import Link from 'next/link'; +import { Page } from "@/types/Page"; + + +const { Panel } = Collapse; + +const MembershipPage: Page = () => { + return ( +
+
+

MEMBER

+

SIAP UNTUNG jadi CGV Member

+

Dapatkan reward eksklusif, diskon spesial, akses awal ke film terbaru, dan hadiah menarik lainnya.

+
+ + + + + + +
+ +
+ +
+
+ CGV Membership +
+
+
+

FAQ

+
+ + +

Program loyalti CGV Indonesia yang memberikan reward berupa cashback point di setiap transaksi + customer dan reward tahunan berdasarkan total transaksi atau total visit.

+
+ +

Transaksi adalah total pembelian tiket, snack dan minuman di CGV + selama satu tahun terakhir yang dihitung setiap hari.

+
+ +

Visit adalah transaksi pembelian tiket dalam 1 hari. + Penghitungan jumlah Visit dimulai 8 April 2024 hingga 31 Maret 2025.

+
+ +
+
+
+
+ ); +}; + +MembershipPage.layout = CGVLayout; +export default MembershipPage; diff --git a/pages/movies/info/[id].tsx b/pages/movies/info/[id].tsx new file mode 100644 index 0000000..af96b08 --- /dev/null +++ b/pages/movies/info/[id].tsx @@ -0,0 +1,66 @@ +import React from 'react'; +import { CGVLayout } from "@/components/CGVLayout"; +import { Page } from "@/types/Page"; +import { useRouter } from "next/router"; +import { Row, Col } from "antd"; +import movies from "@/data/movieData"; + +const MovieInfoPage: Page = () => { + const router = useRouter(); + const { id } = router.query; + const movie = movies.find((movie) => movie.id === id); + + if (!movie) { + return
Movie not found.
; + } + + return ( +
+ + + {movie.title} + + +
+ +
+ +
+
+
+

{movie.title}

+
+
+ + +

Director: {movie.director.join(", ")}

+

Starring: {movie.cast.join(", ")}

+

Censor Rating: {movie.censor_rating}

+

Genre: {movie.genre.join(", ")}

+

Language: {movie.language}

+

Subtitle: {movie.subtitle}

+

Duration: {movie.duration} Minutes

+ + +

{movie.synopsys}

+ +
+
+ ); +}; + +MovieInfoPage.layout = CGVLayout; +export default MovieInfoPage; diff --git a/pages/movies/now_playing.tsx b/pages/movies/now_playing.tsx new file mode 100644 index 0000000..adadf32 --- /dev/null +++ b/pages/movies/now_playing.tsx @@ -0,0 +1,34 @@ +import React from 'react'; +import { CGVLayout } from "@/components/CGVLayout"; +import { Page } from "@/types/Page"; +import { Row, Col } from "antd"; +import movies from "@/data/movieData"; + +const NowPlaying: Page = () => { + const totalMovies = movies.length; + const moviesPerRow = 4; + const totalRows = Math.ceil(totalMovies / moviesPerRow); + + return ( +
+ {[...Array(totalRows)].map((_, rowIndex) => ( + + {movies.slice(rowIndex * moviesPerRow, (rowIndex + 1) * moviesPerRow).map((movie) => ( + + + {movie.title} + + + ))} + + ))} +
+ ); +}; + +NowPlaying.layout = CGVLayout; +export default NowPlaying; diff --git a/pages/news/detail/[id].tsx b/pages/news/detail/[id].tsx new file mode 100644 index 0000000..9dd4284 --- /dev/null +++ b/pages/news/detail/[id].tsx @@ -0,0 +1,30 @@ +import { CGVLayout } from "@/components/CGVLayout"; +import { Page } from "@/types/Page"; +import { useRouter } from "next/router"; +import events from "@/data/eventData"; + +const NewsDetailPage: Page = () => { + const router = useRouter(); + const { id } = router.query; + const event = events.find((item) => item.id === Number(id)); + + if (!event) { + return
Event not found.
; + } + + return ( +
+
+ {event.title} +
+
+ ); +}; + +NewsDetailPage.layout = CGVLayout; +export default NewsDetailPage; diff --git a/pages/news/index.tsx b/pages/news/index.tsx new file mode 100644 index 0000000..8df977d --- /dev/null +++ b/pages/news/index.tsx @@ -0,0 +1,61 @@ +import { CGVLayout } from "@/components/CGVLayout"; +import { Page } from "@/types/Page"; +import { Pagination } from "antd"; +import { useState } from "react"; +import events from "@/data/eventData"; +import Link from "next/link"; + +const EventPage: Page = () => { + const [currentPage, setCurrentPage] = useState(1); + const pageSize = 5; + + const handlePageChange = (page: number) => { + setCurrentPage(page); + }; + + const currentData = events.slice((currentPage - 1) * pageSize, currentPage * pageSize); + + return ( + <> +
+
+ {currentData.map((event) => ( +
+ +
+
+ {event.title} +
+
+
+

{event.title}

+
+ Read more... +
+
+ +
+ ))} +
+
+ +
+ +
+ + + ); +}; + +EventPage.layout = CGVLayout; +export default EventPage; diff --git a/pages/promotion/detail/[id].tsx b/pages/promotion/detail/[id].tsx new file mode 100644 index 0000000..5973da1 --- /dev/null +++ b/pages/promotion/detail/[id].tsx @@ -0,0 +1,30 @@ +import { CGVLayout } from "@/components/CGVLayout"; +import { Page } from "@/types/Page"; +import { useRouter } from "next/router"; +import promotions from "@/data/promotionData"; + +const PromotionDetailPage: Page = () => { + const router = useRouter(); + const { id } = router.query; + const promotion = promotions.find((promotion) => promotion.id === Number(id)); + + if (!promotion) { + return
Promotion not found.
; + } + + return ( +
+
+ {promotion.title} +
+
+ ); +}; + +PromotionDetailPage.layout = CGVLayout; +export default PromotionDetailPage; diff --git a/pages/promotion/index.tsx b/pages/promotion/index.tsx new file mode 100644 index 0000000..4ee0c30 --- /dev/null +++ b/pages/promotion/index.tsx @@ -0,0 +1,59 @@ +import {CGVLayout} from "@/components/CGVLayout"; +import { Page } from "@/types/Page"; +import { Pagination } from "antd"; +import { useState } from "react"; +import promotions from "@/data/promotionData"; +import Link from "next/link"; + +const PromotionPage: Page = () => { + const [currentPage, setCurrentPage] = useState(1); + const pageSize = 5; + + const handlePageChange = (page: number) => { + setCurrentPage(page); + }; + + const currentData = promotions.slice((currentPage - 1) * pageSize, currentPage * pageSize); + + return ( + <> +
+
+ {currentData.map((promotion) => ( +
+ +
+
+ {promotion.title} +
+
+
+

{promotion.title}

+
+ Read more... +
+
+ +
+ ))} +
+
+ +
+ +
+ + ); +}; + +PromotionPage.layout = CGVLayout; +export default PromotionPage; diff --git a/pages/snack/index.tsx b/pages/snack/index.tsx new file mode 100644 index 0000000..6fb5af1 --- /dev/null +++ b/pages/snack/index.tsx @@ -0,0 +1,72 @@ +import { useState } from "react"; +import { cinemaData } from "@/data/cinemaData"; +import { CGVLayout } from "@/components/CGVLayout"; +import { Page } from "@/types/Page"; + +const SnackPage: Page = () => { + const [selectedCity, setSelectedCity] = useState(null); + const [selectedCinema, setSelectedCinema] = useState(null); + + const cities = Object.keys(cinemaData); + const cinemas = selectedCity ? cinemaData[selectedCity] : []; + + const handleCityClick = (city: string) => { + setSelectedCity(city); + setSelectedCinema(null); + }; + + const handleCinemaClick = (cinema: string) => { + setSelectedCinema(cinema); + }; + + return ( +
+
+
+
+ CGV Logo +
+
+
+ {cities.map(city => ( +
handleCityClick(city)} + > + {city} +
+ ))} +
+
+
+ {selectedCity && ( +
+ {cinemas.map(cinema => ( +
handleCinemaClick(cinema)} + > + {cinema} +
+ ))} +
+ )} +
+
+
+
+ ); +}; + +SnackPage.layout = CGVLayout; +export default SnackPage; diff --git a/pages/special/detail/[id].tsx b/pages/special/detail/[id].tsx new file mode 100644 index 0000000..882a3f2 --- /dev/null +++ b/pages/special/detail/[id].tsx @@ -0,0 +1,56 @@ +import { CGVLayout } from "@/components/CGVLayout"; +import { Page } from "@/types/Page"; +import sports from "@/data/sportData"; +import auditoriums from "@/data/auditoriumData"; +import Link from "next/link"; +import { useRouter } from "next/router"; + +const SpecialDetailPage: Page = () => { + const router = useRouter(); + const { id } = router.query; + + const sportSpecial = sports.find((special) => special.id === Number(id)); + const auditoriumSpecial = auditoriums.find((special) => special.id === Number(id)); + const special = sportSpecial || auditoriumSpecial; + + if (!special) { + return
Special not found.
; + } + + return ( + <> +
+
+
+ +
+
+ {special.title} +
+

{special.title}

+
+ +
+ +
+
+ {special.title} +
+
+
+
+ + ); +}; + +SpecialDetailPage.layout = CGVLayout; +export default SpecialDetailPage; diff --git a/pages/special/index.tsx b/pages/special/index.tsx new file mode 100644 index 0000000..99f12c8 --- /dev/null +++ b/pages/special/index.tsx @@ -0,0 +1,54 @@ +import { CGVLayout } from "@/components/CGVLayout"; +import { Page } from "@/types/Page"; +import { useState } from "react"; +import Link from "next/link"; +import auditoriumData from "@/data/auditoriumData"; +import sportData from "@/data/sportData"; + +const SpecialPage: Page = () => { + const [currentCategory, setCurrentCategory] = useState<'auditoriums' | 'sports'>('auditoriums'); + const data = currentCategory === 'auditoriums' ? auditoriumData : sportData; + + return ( + <> +
+
+
+
setCurrentCategory('auditoriums')} + > + Auditoriums +
+
setCurrentCategory('sports')} + > + Sports +
+
+ + {data.map((audiOrSport) => ( +
+ +
+
+ {audiOrSport.title} +
+

{audiOrSport.title}

+
+ +
+ ))} +
+
+ + ); +}; + +SpecialPage.layout = CGVLayout; +export default SpecialPage; diff --git a/pages/user/login.tsx b/pages/user/login.tsx new file mode 100644 index 0000000..b990239 --- /dev/null +++ b/pages/user/login.tsx @@ -0,0 +1,56 @@ +import { useForm, Controller } from "react-hook-form"; +import {CGVLayout} from "@/components/CGVLayout"; +import { Page } from "@/types/Page"; +import { zodResolver } from '@hookform/resolvers/zod'; +import Link from "next/link"; +import { useRouter } from 'next/router'; +import { LoginFormSchema, LoginFormType } from "@/schemas/LoginFormSchema"; +import { LoginFormData } from "@/types/LoginFormData"; + + +const LoginPage: Page = () => { + const { handleSubmit, control, formState: { errors } } = useForm({ + resolver: zodResolver(LoginFormSchema), + }); + + const router = useRouter(); + + const onFormSubmit = (data: LoginFormData) => { + alert(`Email: ${data.email}\nPassword: ${data.password}`); + }; + + return ( +
+
+
+
+ + Login + + + Sign Up + +
+
+

Login with your web profile

+
+ + } /> + {errors.email &&

{errors.email.message}

} +
+
+ + } /> + {errors.password &&

{errors.password.message}

} +
+ + Forgot Password? +
+
+
+
+ ); +}; + +LoginPage.layout = CGVLayout; +export default LoginPage; diff --git a/pages/user/register.tsx b/pages/user/register.tsx new file mode 100644 index 0000000..586f6d1 --- /dev/null +++ b/pages/user/register.tsx @@ -0,0 +1,137 @@ +import { useForm, Controller } from "react-hook-form"; +import { Page } from "@/types/Page"; +import { CGVLayout } from "@/components/CGVLayout"; +import { zodResolver } from '@hookform/resolvers/zod'; +import Link from "next/link"; +import { useRouter } from 'next/router'; +import { RegisterFormSchema, RegisterFormType } from "@/schemas/RegisterFormSchema"; +import { RegisterFormData } from "@/types/RegisterFormData"; +import { cinemaData } from "@/data/cinemaData"; + +const RegisterPage: Page = () => { + const { handleSubmit, control, formState: { errors }, watch } = useForm({ + resolver: zodResolver(RegisterFormSchema), + }); + + const router = useRouter(); + const selectedCity = watch("city"); + + const onFormSubmit = (data: RegisterFormData) => { + alert(`Username: ${data.username}\nEmail: ${data.email}\nPassword: ${data.password}`); + }; + + const cities = Object.keys(cinemaData); + + return ( +
+
+
+
+ + Login + + + Sign Up + +
+

Create New Account

+

Please provide accurate information so we may identify you at the Box Office.

+
+
+
+ +
+ ( + + )} /> + ( + + )} /> +
+ {errors.city &&

{errors.city.message}

} +
+
+ + } /> + {errors.fullname &&

{errors.fullname.message}

} +
+
+ + } /> + {errors.username &&

{errors.username.message}

} +
+
+ + ( + + )} /> + {errors.gender &&

{errors.gender.message}

} +
+
+ + } /> + {errors.birthday &&

{errors.birthday.message}

} +
+
+ + } /> + {errors.phone &&

{errors.phone.message}

} +
+
+ + ( + + )} /> + {errors.city &&

{errors.city.message}

} +
+
+
+
+ + } /> + {errors.email &&

{errors.email.message}

} +
+
+ + } /> + {errors.password &&

{errors.password.message}

} +
+
+ + } /> + {errors.pin &&

{errors.pin.message}

} +
+
+ + } /> +
+
+
+

By clicking the create account button, you agree to CGV cinema’s terms of use and privacy policy and approve to receive any information.

+
+ +
+
+
+
+ ); +}; + +RegisterPage.layout = CGVLayout; +export default RegisterPage; diff --git a/schemas/LoginFormSchema.ts b/schemas/LoginFormSchema.ts new file mode 100644 index 0000000..5f1c9a1 --- /dev/null +++ b/schemas/LoginFormSchema.ts @@ -0,0 +1,8 @@ +import { z } from "zod"; + +export const LoginFormSchema = z.object({ + email: z.string().nonempty({ message: 'Email is required.' }).email({ message: 'Email is invalid.' }), + password: z.string().nonempty({ message: 'Password is required.' }).min(8, { message: 'Password must be at least 8 characters.' }) +}); + +export type LoginFormType = z.infer; diff --git a/schemas/RegisterFormSchema.ts b/schemas/RegisterFormSchema.ts new file mode 100644 index 0000000..4732f35 --- /dev/null +++ b/schemas/RegisterFormSchema.ts @@ -0,0 +1,17 @@ +import { z } from "zod"; + +export const RegisterFormSchema = z.object({ + city: z.string().nonempty({ message: 'Preferred Cinema city is required.' }), + cinema: z.string().nonempty({ message: 'Preferred Cinema is required.' }), + fullname: z.string().nonempty({ message: 'Full Name is required.' }), + username: z.string().nonempty({ message: 'Username is required.' }), + gender: z.string().nonempty({ message: 'Gender is required.' }), + birthday: z.string().nonempty({ message: 'Birthday is required.' }), + phone: z.string().nonempty({ message: 'Phone Number is required.' }), + email: z.string().email({ message: 'Email Address is invalid.' }), + password: z.string().min(6, { message: 'Password must be at least 6 characters.' }), + pin: z.string().length(6, { message: 'Pin must be exactly 6 digits.' }), + cgvCard: z.string().optional() +}); + +export type RegisterFormType = z.infer; diff --git a/types/LoginFormData.ts b/types/LoginFormData.ts new file mode 100644 index 0000000..499bf1e --- /dev/null +++ b/types/LoginFormData.ts @@ -0,0 +1,4 @@ +export interface LoginFormData { + email: string; + password: string; +} diff --git a/types/RegisterFormData.ts b/types/RegisterFormData.ts new file mode 100644 index 0000000..7a55a72 --- /dev/null +++ b/types/RegisterFormData.ts @@ -0,0 +1,13 @@ +export interface RegisterFormData { + city: string; + cinema: string; + fullname: string; + username: string; + gender: string; + birthday: string; + phone: string; + email: string; + password: string; + pin: string; + cgvCard?: string; +}