Shioriko/web/app/src/routes/Posts.svelte

109 lines
3.4 KiB
Svelte
Raw Normal View History

2021-05-09 15:07:23 +00:00
<script>
import { onMount } from "svelte";
import { getPosts } from "../api.js";
import { Link} from "svelte-routing";
2021-05-10 02:45:40 +00:00
import queryString from "query-string";
export let location;
2021-05-09 15:07:23 +00:00
let page = 1;
let totalPages = 1;
let posts = [];
const getData = async () => {
const data = await getPosts({page});
2021-05-10 02:45:40 +00:00
if(Array.isArray(data.posts)) {
posts = data.posts;
2021-05-10 02:47:19 +00:00
totalPages = data.totalPage;
2021-05-10 02:45:40 +00:00
}
2021-05-09 15:07:23 +00:00
}
2021-05-10 02:45:40 +00:00
onMount(() => {
let queryParams;
$: queryParams = queryString.parse(location.search);
if(queryParams.page) {
2021-05-10 03:17:42 +00:00
page = parseInt(queryParams.page);
2021-05-10 02:45:40 +00:00
}
getData();
})
2021-05-09 15:07:23 +00:00
2021-05-10 02:45:40 +00:00
const handlePage = (i) => {
return () => {
2021-05-10 03:17:42 +00:00
page = i;
2021-05-10 02:45:40 +00:00
getData();
}
}
2021-05-09 15:07:23 +00: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 02:45:40 +00: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 03:17:42 +00:00
{#if page > 3}
2021-05-10 02:45:40 +00: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">&hellip;</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 03:17:42 +00:00
{#if (totalPages - page) > 3}
2021-05-10 02:45:40 +00:00
<li>
<span class="pagination-ellipsis">&hellip;</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 15:07:23 +00:00
{#each posts as post (post.id)}
2021-05-10 02:45:40 +00:00
<div class="column is-one-quarter card">
2021-05-09 15:07:23 +00: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 02:45:40 +00:00
<p>
<Link to="/tag/{tag}">{tag}</Link>
</p>
2021-05-09 15:07:23 +00:00
{/each}
</div>
</div>
</div>
{/each}
</div>
</div>
</section>