Skip to content

Commit

Permalink
refactor index.js
Browse files Browse the repository at this point in the history
  • Loading branch information
kusakawazeusu committed Jul 6, 2020
1 parent 355c806 commit 431d89d
Show file tree
Hide file tree
Showing 2 changed files with 149 additions and 117 deletions.
209 changes: 126 additions & 83 deletions index.html
Original file line number Diff line number Diff line change
@@ -1,97 +1,140 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Movie List</title>
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css"
integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4"
crossorigin="anonymous"
/>
</head>

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Movie List</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4"
crossorigin="anonymous">
</head>

<body>
<!-- navigation -->
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="./index.html">Movie List</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="index.html">Home
<span class="sr-only">(current)</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="favorite.html">favorite</a>
</li>
</ul>
</div>
</nav>
<body>
<!-- navigation -->
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="./index.html">Movie List</a>
<button
class="navbar-toggler"
type="button"
data-toggle="collapse"
data-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent"
aria-expanded="false"
aria-label="Toggle navigation"
>
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="index.html"
>Home
<span class="sr-only">(current)</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="favorite.html">favorite</a>
</li>
</ul>
</div>
</nav>

<div class="container mt-5">
<!--search bar-->
<div class="row" id="search-bar">
<form id="search" class="form-inline">
<label class="sr-only" for="inlineFormInputName2">Name</label>
<input type="text" class="form-control mb-2 mr-sm-2" placeholder="search name ..." id="search-input">
<button type="submit" class="btn btn-primary mb-2" id="submit-search">Search</button>
</form>
</div>
<div class="container mt-5">
<!--search bar-->
<div class="row" id="search-bar">
<form id="search" class="form-inline">
<label class="sr-only" for="inlineFormInputName2">Name</label>
<input
type="text"
class="form-control mb-2 mr-sm-2"
placeholder="search name ..."
id="search-input"
/>
<button type="submit" class="btn btn-primary mb-2" id="submit-search">
Search
</button>
</form>
</div>

<!-- data-panel -->
<div class="row" id="data-panel">
<!-- print movie list here -->
<!-- data-panel -->
<div class="row" id="data-panel">
<!-- print movie list here -->
</div>
</div>
</div>

<!-- Modal -->
<div class="modal fade" id="show-movie-modal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLongTitle" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="show-movie-title">Modal title</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body" id="show-movie-body">
<div class="row">
<div class="col-sm-8" id="show-movie-image">
</div>
<div class="col-sm-4">
<p><em id="show-movie-date"></em></p>
<p id="show-movie-description"></p>
<!-- Modal -->
<div
class="modal fade"
id="show-movie-modal"
tabindex="-1"
role="dialog"
aria-labelledby="exampleModalLongTitle"
aria-hidden="true"
>
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="show-movie-title">Modal title</h5>
<button
type="button"
class="close"
data-dismiss="modal"
aria-label="Close"
>
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body" id="show-movie-body">
<div class="row">
<div class="col-sm-8" id="show-movie-image"></div>
<div class="col-sm-4">
<p><em id="show-movie-date"></em></p>
<p id="show-movie-description"></p>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<div class="modal-footer">
<button
type="button"
class="btn btn-secondary"
data-dismiss="modal"
>
Close
</button>
</div>
</div>
</div>
</div>
</div>

<!-- Pagination -->
<nav aria-label="Page navigation">
<ul class="pagination justify-content-center" id="pagination">
<li class="page-item">
<a class="page-link" href="#">1</a>
</li>
</ul>
</nav>

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js" integrity="sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ"
crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js" integrity="sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm"
crossorigin="anonymous"></script>
<script src="index.js"></script>
</body>
<!-- Pagination -->
<nav aria-label="Page navigation">
<ul class="pagination justify-content-center" id="pagination">
<li class="page-item">
<a class="page-link" href="#">1</a>
</li>
</ul>
</nav>

</html>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script
src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
crossorigin="anonymous"
></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"
integrity="sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ"
crossorigin="anonymous"
></script>
<script
src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"
integrity="sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm"
crossorigin="anonymous"
></script>
<script src="index.js"></script>
</body>
</html>
57 changes: 23 additions & 34 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,33 +1,15 @@
const BASE_URL = "https://movie-list.alphacamp.io";
const INDEX_URL = BASE_URL + "/api/v1/movies/";
const POSTER_URL = BASE_URL + "/posters/";
const movies = [];

const dataPanel = document.getElementById("data-panel");
const searchForm = document.getElementById("search");
const searchInput = document.getElementById("search-input");
const pagination = document.getElementById("pagination");
const paginator = document.getElementById("pagination");
const ITEM_PER_PAGE = 8;
let filteredMovies = [];

// API Services
async function fetchMovies() {
try {
const { data } = await axios.get(INDEX_URL);
return data.results;
} catch (error) {
console.error("Calling Index API Error: ", error);
}
}

async function fetchMovieById(id) {
try {
const { data } = await axios.get(INDEX_URL + id);
return data.results;
} catch (error) {
console.error("Calling Show API Error: ", error);
}
}
const movies = [];
let filteredMovies = [];

// listen to data panel
dataPanel.addEventListener("click", function onPanelClicked(event) {
Expand All @@ -42,22 +24,27 @@ dataPanel.addEventListener("click", function onPanelClicked(event) {
// listen to search form submit event
searchForm.addEventListener("submit", function onSearchSubmitted(event) {
event.preventDefault();
let input = searchInput.value.toLowerCase();
let keyword = searchInput.value.toLowerCase();
if (!keyword) {
return alert("Please enter a valid keyword");
}

filteredMovies = movies.filter((movie) =>
movie.title.toLowerCase().includes(input)
);
console.log(
"Search button clicked, keyword: ",
input,
"result: ",
filteredMovies
movie.title.toLowerCase().includes(keyword)
);

// 如果搜尋不到任何電影
if (filteredMovies.length === 0) {
alert("Cannot find any movies with keyword: " + keyword);
searchInput.value = "";
}

renderPaginator(filteredMovies.length);
renderMovieList(getMoviesByPage(1));
});

// listen to pagination click event
pagination.addEventListener("click", function onPaginatorClicked(event) {
paginator.addEventListener("click", function onPaginatorClicked(event) {
if (event.target.tagName !== "A") return;

console.log("Paginator clicked, page number: ", event.target.dataset.page);
Expand All @@ -82,7 +69,7 @@ function renderPaginator(amount) {
</li>
`;
}
pagination.innerHTML = pageItemContent;
paginator.innerHTML = pageItemContent;
}

function renderMovieList(data) {
Expand Down Expand Up @@ -117,7 +104,9 @@ function showMovieModal(id) {
const modalDescription = document.getElementById("show-movie-description");

// send request to show api
fetchMovieById(id).then((data) => {
axios.get(INDEX_URL + id).then((response) => {
const data = response.data.results;

// insert data into modal ui
modalTitle.textContent = data.title;
modalImage.innerHTML = `<img src="${POSTER_URL}${data.image}" class="img-fluid" alt="Responsive image">`;
Expand All @@ -139,8 +128,8 @@ function addFavoriteItem(id) {
localStorage.setItem("favoriteMovies", JSON.stringify(list));
}

fetchMovies().then((data) => {
movies.push(...data);
axios.get(INDEX_URL).then((response) => {
movies.push(...response.data.results);
renderPaginator(movies.length);
renderMovieList(getMoviesByPage(1));
});

0 comments on commit 431d89d

Please sign in to comment.