2021-05-09 22:07:23 +07:00
|
|
|
<script>
|
|
|
|
import { onMount } from "svelte";
|
|
|
|
import { getPosts } from "../api.js";
|
|
|
|
import { Link} from "svelte-routing";
|
2021-05-10 09:45:40 +07:00
|
|
|
import queryString from "query-string";
|
|
|
|
|
|
|
|
export let location;
|
2021-05-09 22:07:23 +07:00
|
|
|
|
|
|
|
let page = 1;
|
|
|
|
let totalPages = 1;
|
|
|
|
let posts = [];
|
|
|
|
const getData = async () => {
|
|
|
|
const data = await getPosts({page});
|
2021-05-10 09:45:40 +07:00
|
|
|
if(Array.isArray(data.posts)) {
|
|
|
|
posts = data.posts;
|
2021-05-10 09:47:19 +07:00
|
|
|
totalPages = data.totalPage;
|
2021-05-10 09:45:40 +07:00
|
|
|
}
|
2021-05-09 22:07:23 +07:00
|
|
|
}
|
2021-05-10 09:45:40 +07:00
|
|
|
onMount(() => {
|
|
|
|
let queryParams;
|
|
|
|
$: queryParams = queryString.parse(location.search);
|
|
|
|
if(queryParams.page) {
|
2021-05-10 10:17:42 +07:00
|
|
|
page = parseInt(queryParams.page);
|
2021-05-10 09:45:40 +07:00
|
|
|
}
|
|
|
|
getData();
|
|
|
|
})
|
2021-05-09 22:07:23 +07:00
|
|
|
|
2021-05-10 09:45:40 +07:00
|
|
|
const handlePage = (i) => {
|
|
|
|
return () => {
|
2021-05-10 10:17:42 +07:00
|
|
|
page = i;
|
2021-05-10 09:45:40 +07:00
|
|
|
getData();
|
|
|
|
}
|
|
|
|
}
|
2021-05-09 22:07:23 +07:00
|
|
|
</script>
|
|
|
|
|
|
|
|
<section class="hero is-primary">
|
|
|
|
<div class="hero-body">
|
|
|
|
<p class="title">
|
|
|
|
Posts
|
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
</section>
|
|
|
|
|
|
|
|
<section class="section">
|
|
|
|
<div class="container">
|
2021-05-10 09:45:40 +07:00
|
|
|
<nav class="pagination" role="navigation" aria-label="pagination">
|
|
|
|
{#if page > 1}
|
|
|
|
<a class="pagination-previous">Previous</a>
|
|
|
|
{/if}
|
|
|
|
{#if page < totalPages}
|
|
|
|
<a class="pagination-next">Next page</a>
|
|
|
|
{/if}
|
|
|
|
<ul class="pagination-list">
|
2021-05-10 10:17:42 +07:00
|
|
|
{#if page > 3}
|
2021-05-10 09:45:40 +07:00
|
|
|
<li>
|
|
|
|
<Link on:click="{handlePage(1)}" to="/posts?page={1}" class="pagination-link" aria-label="Goto page 1">1</Link>
|
|
|
|
</li>
|
|
|
|
<li>
|
|
|
|
<span class="pagination-ellipsis">…</span>
|
|
|
|
</li>
|
|
|
|
{/if}
|
|
|
|
{#each [...Array(5).keys()].map(x => x + page - 2) as i }
|
|
|
|
{#if i >= 1 && i <= totalPages}
|
|
|
|
{#if i == page}
|
|
|
|
<li>
|
|
|
|
<Link on:click="{handlePage(i)}" to="/posts?page={i}" class="pagination-link is-current" aria-label="Goto page {i}">{i}</Link>
|
|
|
|
</li>
|
|
|
|
{:else}
|
|
|
|
<li>
|
|
|
|
<Link on:click="{handlePage(i)}" to="/posts?page={i}" class="pagination-link" aria-label="Goto page {i}">{i}</Link>
|
|
|
|
</li>
|
|
|
|
{/if}
|
|
|
|
{/if}
|
|
|
|
{/each}
|
2021-05-10 10:17:42 +07:00
|
|
|
{#if (totalPages - page) > 3}
|
2021-05-10 09:45:40 +07:00
|
|
|
<li>
|
|
|
|
<span class="pagination-ellipsis">…</span>
|
|
|
|
</li>
|
|
|
|
<li>
|
|
|
|
<Link on:click="{handlePage(totalPages)}" to="/posts?page={totalPages}" class="pagination-link" aria-label="Goto page {totalPages}">{totalPages}</Link>
|
|
|
|
</li>
|
|
|
|
{/if}
|
|
|
|
</ul>
|
|
|
|
</nav>
|
|
|
|
<div class="columns is-multiline">
|
2021-05-09 22:07:23 +07:00
|
|
|
{#each posts as post (post.id)}
|
2021-05-10 09:45:40 +07:00
|
|
|
<div class="column is-one-quarter card">
|
2021-05-09 22:07:23 +07:00
|
|
|
<div class="card-image">
|
|
|
|
<figure class="image">
|
|
|
|
<Link to="/post/{post.id}">
|
|
|
|
<img src="{post.image_path}">
|
|
|
|
</Link>
|
|
|
|
</figure>
|
|
|
|
</div>
|
|
|
|
<div class="card-content">
|
|
|
|
<div class="content">
|
|
|
|
{#each post.tags as tag (tag)}
|
2021-05-10 09:45:40 +07:00
|
|
|
<p>
|
|
|
|
<Link to="/tag/{tag}">{tag}</Link>
|
|
|
|
</p>
|
2021-05-09 22:07:23 +07:00
|
|
|
{/each}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
{/each}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</section>
|