FindMyRecipe / src / lib / components / RecipePagination.svelte
RecipePagination.svelte
Raw
<script>
  import { createEventDispatcher } from 'svelte';
  export let page;
  export let totalPages;

  $: totalRange = [...Array(7).keys()].map((i) => i + page - 3);
  $: if (totalRange[0] <= 0 ) {
    totalRange = totalRange.map((i) => i + 1 - totalRange[0]);
  }

  $: prevPages = totalRange.filter((i) => i < page);
  $: nextPages = totalRange.filter((i) => i > page && i <= totalPages); 

  const dispatch = createEventDispatcher();

  function handlePreviousPage() {
    dispatch('pageChange', { page: page - 1 })
  }

  function handleChangePage(newPage) {
    dispatch('pageChange', { page: newPage })
  }

  function handleNextPage() {
    dispatch('pageChange', { page: page + 1 })
  }
</script>

<div class="flex flex-row justify-center md:text-xl">
  {#if page > 4}
    <button
      class="btn font-semibold mx-4 bg-base-100"
      on:click={handlePreviousPage}
    >
      Prev
    </button>
  {/if}
  {#each prevPages as i}
    <button
      class="btn mx-4 bg-base-100"
      on:click={() => handleChangePage(i)}
    >
      {i}
    </button>
  {/each}
  <button class="btn no-animation font-extrabold mx-4 underline bg-base-100">
    {page}
  </button>
  {#each nextPages as i}
    <button
      class="btn mx-4 bg-base-100"
      on:click={() => handleChangePage(i)}
    >
      {i}
    </button>
  {/each}
    {#if page < totalPages - 3}
    <button
      class="btn font-semibold mx-4 bg-base-100"
      on:click={handleNextPage}
    >
      Next
    </button>
  {/if}
</div>