Compare commits
2 Commits
0.6.5
...
b934276342
| Author | SHA1 | Date | |
|---|---|---|---|
| b934276342 | |||
| 6860a5541a |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -33,6 +33,3 @@ environment.go
|
|||||||
|
|
||||||
# REST (http files)
|
# REST (http files)
|
||||||
http-client.private.env.json
|
http-client.private.env.json
|
||||||
|
|
||||||
# Build artifacts
|
|
||||||
build/*.tar.gz
|
|
||||||
|
|||||||
5
frontend/.vscode/extensions.json
vendored
Normal file
5
frontend/.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
"svelte.svelte-vscode"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,70 +1,42 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import {
|
import {
|
||||||
aniListLoggedIn,
|
aniListLoggedIn,
|
||||||
malLoggedIn,
|
malLoggedIn,
|
||||||
simklLoggedIn,
|
simklLoggedIn,
|
||||||
watchlistNeedsRefresh,
|
} from "./helperModules/GlobalVariablesAndHelperFunctions.svelte";
|
||||||
aniListPrimary,
|
import {onMount} from "svelte";
|
||||||
malPrimary,
|
import Router from "svelte-spa-router"
|
||||||
simklPrimary,
|
import Home from "./routes/Home.svelte";
|
||||||
malWatchList,
|
import {wrap} from "svelte-spa-router/wrap";
|
||||||
simklWatchList,
|
import Spinner from "./helperComponents/Spinner.svelte";
|
||||||
} from "./helperModules/GlobalVariablesAndHelperFunctions.svelte";
|
import Header from "./helperComponents/Header.svelte";
|
||||||
import { onMount } from "svelte";
|
import {CheckIfAniListLoggedInAndLoadWatchList} from "./helperModules/CheckIfAniListLoggedInAndLoadWatchList.svelte";
|
||||||
import Router from "svelte-spa-router";
|
import { CheckIfMALLoggedInAndSetUser } from "./helperModules/CheckIfMyAnimeListLoggedIn.svelte";
|
||||||
import Home from "./routes/Home.svelte";
|
import {CheckIfSimklLoggedInAndSetUser} from "./helperModules/CheckIsSimklLoggedIn.svelte"
|
||||||
import { wrap } from "svelte-spa-router/wrap";
|
import {CheckIfAniListLoggedIn} from "../wailsjs/go/main/App";
|
||||||
import Spinner from "./helperComponents/Spinner.svelte";
|
|
||||||
import Header from "./helperComponents/Header.svelte";
|
|
||||||
import { CheckIfAniListLoggedInAndLoadWatchList } from "./helperModules/CheckIfAniListLoggedInAndLoadWatchList.svelte";
|
|
||||||
import { CheckIfMALLoggedInAndSetUser } from "./helperModules/CheckIfMyAnimeListLoggedIn.svelte";
|
|
||||||
import { CheckIfSimklLoggedInAndSetUser } from "./helperModules/CheckIsSimklLoggedIn.svelte";
|
|
||||||
import {
|
|
||||||
CheckIfAniListLoggedIn,
|
|
||||||
GetMyAnimeList,
|
|
||||||
SimklGetUserWatchlist,
|
|
||||||
} from "../wailsjs/go/main/App";
|
|
||||||
import { loc } from "svelte-spa-router";
|
|
||||||
|
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
let isAniListLoggedIn: boolean;
|
let isAniListLoggedIn: boolean
|
||||||
let isMALLoggedIn: boolean;
|
let isMALLoggedIn: boolean
|
||||||
let isSimklLoggedIn: boolean;
|
let isSimklLoggedIn: boolean
|
||||||
aniListLoggedIn.subscribe((value) => (isAniListLoggedIn = value));
|
aniListLoggedIn.subscribe((value) => isAniListLoggedIn = value)
|
||||||
malLoggedIn.subscribe((value) => (isMALLoggedIn = value));
|
malLoggedIn.subscribe((value) => isMALLoggedIn = value)
|
||||||
simklLoggedIn.subscribe((value) => (isSimklLoggedIn = value));
|
simklLoggedIn.subscribe((value) => isSimklLoggedIn = value)
|
||||||
|
|
||||||
!isAniListLoggedIn && (await CheckIfAniListLoggedInAndLoadWatchList());
|
console.log(isAniListLoggedIn)
|
||||||
!isMALLoggedIn && (await CheckIfMALLoggedInAndSetUser());
|
!isAniListLoggedIn && await CheckIfAniListLoggedInAndLoadWatchList()
|
||||||
!isSimklLoggedIn && (await CheckIfSimklLoggedInAndSetUser());
|
!isMALLoggedIn && await CheckIfMALLoggedInAndSetUser()
|
||||||
});
|
!isSimklLoggedIn && await CheckIfSimklLoggedInAndSetUser()
|
||||||
|
})
|
||||||
$: if ($loc?.location === "/" && $watchlistNeedsRefresh) {
|
|
||||||
(async () => {
|
|
||||||
if ($aniListLoggedIn && $aniListPrimary) {
|
|
||||||
await CheckIfAniListLoggedInAndLoadWatchList();
|
|
||||||
}
|
|
||||||
if ($malLoggedIn && $malPrimary) {
|
|
||||||
await GetMyAnimeList(1000).then((w) => malWatchList.set(w));
|
|
||||||
}
|
|
||||||
if ($simklLoggedIn && $simklPrimary) {
|
|
||||||
await SimklGetUserWatchlist().then((w) => simklWatchList.set(w));
|
|
||||||
}
|
|
||||||
|
|
||||||
watchlistNeedsRefresh.set(false);
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Header />
|
<Header />
|
||||||
<Router
|
<Router routes={{
|
||||||
routes={{
|
'/': Home,
|
||||||
"/": Home,
|
'/anime/:id': wrap({
|
||||||
"/anime/:id": wrap({
|
asyncComponent: () => import('./routes/AnimeRoutePage.svelte'),
|
||||||
asyncComponent: () => import("./routes/AnimeRoutePage.svelte"),
|
conditions: [async () => await CheckIfAniListLoggedIn()],
|
||||||
conditions: [async () => await CheckIfAniListLoggedIn()],
|
loadingComponent: Spinner
|
||||||
loadingComponent: Spinner,
|
|
||||||
}),
|
}),
|
||||||
// '*': "Not Found"
|
// '*': "Not Found"
|
||||||
}}
|
}} />
|
||||||
/>
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,224 +1,145 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import {
|
import {
|
||||||
aniListLoggedIn,
|
aniListLoggedIn,
|
||||||
aniListWatchlist,
|
aniListWatchlist,
|
||||||
animePerPage,
|
animePerPage,
|
||||||
watchListPage,
|
watchListPage,
|
||||||
} from "../helperModules/GlobalVariablesAndHelperFunctions.svelte";
|
} from "../helperModules/GlobalVariablesAndHelperFunctions.svelte";
|
||||||
|
|
||||||
import type { AniListCurrentUserWatchList } from "../anilist/types/AniListCurrentUserWatchListType";
|
import type {AniListCurrentUserWatchList} from "../anilist/types/AniListCurrentUserWatchListType"
|
||||||
import { GetAniListUserWatchingList } from "../../wailsjs/go/main/App";
|
import {GetAniListUserWatchingList} from "../../wailsjs/go/main/App";
|
||||||
import { MediaListSort } from "../anilist/types/AniListTypes";
|
import {MediaListSort} from "../anilist/types/AniListTypes";
|
||||||
|
|
||||||
let aniListWatchListLoaded: AniListCurrentUserWatchList;
|
let aniListWatchListLoaded: AniListCurrentUserWatchList
|
||||||
let page: number;
|
let page: number
|
||||||
let perPage: number;
|
let perPage: number
|
||||||
|
|
||||||
watchListPage.subscribe((value) => (page = value));
|
watchListPage.subscribe(value => page = value)
|
||||||
animePerPage.subscribe((value) => (perPage = value));
|
animePerPage.subscribe(value => perPage = value)
|
||||||
aniListWatchlist.subscribe((value) => (aniListWatchListLoaded = value));
|
aniListWatchlist.subscribe((value) => aniListWatchListLoaded = value)
|
||||||
|
|
||||||
const perPageOptions = [10, 20, 50];
|
const perPageOptions = [10, 20, 50]
|
||||||
|
|
||||||
function ChangeWatchListPage(newPage: number) {
|
function ChangeWatchListPage(newPage: number) {
|
||||||
GetAniListUserWatchingList(
|
GetAniListUserWatchingList(newPage, perPage, MediaListSort.UpdatedTimeDesc).then((result) => {
|
||||||
newPage,
|
watchListPage.set(newPage)
|
||||||
perPage,
|
aniListWatchlist.set(result)
|
||||||
MediaListSort.UpdatedTimeDesc,
|
aniListLoggedIn.set(true)
|
||||||
).then((result) => {
|
})
|
||||||
watchListPage.set(newPage);
|
}
|
||||||
aniListWatchlist.set(result);
|
|
||||||
aniListLoggedIn.set(true);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function changePage(
|
function changePage(e): void {
|
||||||
e: KeyboardEvent & { currentTarget: HTMLInputElement },
|
if ((e.key === "Enter" || e.key === "Tab") && Number(e.target.value) !== page) ChangeWatchListPage(Number(e.target.value))
|
||||||
): void {
|
}
|
||||||
if (
|
|
||||||
(e.key === "Enter" || e.key === "Tab") &&
|
function changeCountPerPage(e): void {
|
||||||
Number(e.currentTarget.value) !== page
|
GetAniListUserWatchingList(1, Number(e.target.value), MediaListSort.UpdatedTimeDesc).then((result) => {
|
||||||
)
|
animePerPage.set(Number(e.target.value))
|
||||||
ChangeWatchListPage(Number(e.currentTarget.value));
|
watchListPage.set(1)
|
||||||
}
|
aniListWatchlist.set(result)
|
||||||
|
aniListLoggedIn.set(true)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
function changeCountPerPage(
|
|
||||||
e: Event & { currentTarget: HTMLSelectElement },
|
|
||||||
): void {
|
|
||||||
GetAniListUserWatchingList(
|
|
||||||
1,
|
|
||||||
Number(e.currentTarget.value),
|
|
||||||
MediaListSort.UpdatedTimeDesc,
|
|
||||||
).then((result) => {
|
|
||||||
animePerPage.set(Number(e.currentTarget.value));
|
|
||||||
watchListPage.set(1);
|
|
||||||
aniListWatchlist.set(result);
|
|
||||||
aniListLoggedIn.set(true);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="mb-8">
|
<div class="mb-8">
|
||||||
{#if aniListWatchListLoaded.data.Page.pageInfo.lastPage <= 12}
|
{#if aniListWatchListLoaded.data.Page.pageInfo.lastPage <= 12}
|
||||||
<nav aria-label="Page navigation" class="hidden md:block">
|
<nav aria-label="Page navigation" class="hidden md:block">
|
||||||
<ul class="inline-flex -space-x-px text-base h-10">
|
<ul class="inline-flex -space-x-px text-base h-10">
|
||||||
{#if page === 1}
|
{#if page === 1}
|
||||||
<li>
|
<li>
|
||||||
<button
|
<button disabled
|
||||||
disabled
|
class="flex items-center justify-center px-4 h-10 ms-0 leading-tight border border-e-0 rounded-s-lg border-gray-700 text-gray-400 cursor-default">
|
||||||
class="flex items-center justify-center px-4 h-10 ms-0 leading-tight border border-e-0 rounded-s-lg border-gray-700 text-gray-400 cursor-default"
|
Previous
|
||||||
>
|
</button>
|
||||||
Previous
|
</li>
|
||||||
</button>
|
{:else}
|
||||||
</li>
|
<li>
|
||||||
{:else}
|
<button on:click={() => ChangeWatchListPage(page-1)}
|
||||||
<li>
|
class="flex items-center justify-center px-4 h-10 ms-0 leading-tight border border-e-0 rounded-s-lg border-gray-700 text-gray-400 hover:bg-gray-700 hover:text-white">
|
||||||
<button
|
Previous
|
||||||
on:click={() => ChangeWatchListPage(page - 1)}
|
</button>
|
||||||
class="flex items-center justify-center px-4 h-10 ms-0 leading-tight border border-e-0 rounded-s-lg border-gray-700 text-gray-400 hover:bg-gray-700 hover:text-white"
|
</li>
|
||||||
>
|
{/if}
|
||||||
Previous
|
{#each {length: aniListWatchListLoaded.data.Page.pageInfo.lastPage} as _, i}
|
||||||
</button>
|
{#if i + 1 === page}
|
||||||
</li>
|
<li>
|
||||||
{/if}
|
<button on:click={() => ChangeWatchListPage(i+1)}
|
||||||
{#each { length: aniListWatchListLoaded.data.Page.pageInfo.lastPage } as _, i}
|
class="flex items-center justify-center px-4 h-10 leading-tight border bg-gray-100 border-gray-700 bg-gray-700 text-white">{i + 1}</button>
|
||||||
{#if i + 1 === page}
|
</li>
|
||||||
<li>
|
{:else}
|
||||||
<button
|
<li>
|
||||||
on:click={() => ChangeWatchListPage(i + 1)}
|
<button on:click={() => ChangeWatchListPage(i+1)}
|
||||||
class="flex items-center justify-center px-4 h-10 leading-tight border hover:bg-gray-100 border-gray-700 bg-gray-700 text-white"
|
class="flex items-center justify-center px-4 h-10 leading-tight border dark border-gray-700 text-gray-400 hover:bg-gray-700 hover:text-white">{i + 1}</button>
|
||||||
>{i + 1}</button
|
</li>
|
||||||
>
|
{/if}
|
||||||
</li>
|
{/each}
|
||||||
{:else}
|
{#if page === aniListWatchListLoaded.data.Page.pageInfo.lastPage}
|
||||||
<li>
|
<li>
|
||||||
<button
|
<button disabled
|
||||||
on:click={() => ChangeWatchListPage(i + 1)}
|
class="flex items-center justify-center px-4 h-10 leading-tight border rounded-e-lg dark border-gray-700 text-gray-400 cursor-default">
|
||||||
class="flex items-center justify-center px-4 h-10 leading-tight border dark border-gray-700 text-gray-400 hover:bg-gray-700 hover:text-white"
|
Next
|
||||||
>{i + 1}</button
|
</button>
|
||||||
>
|
</li>
|
||||||
</li>
|
{:else}
|
||||||
{/if}
|
<li>
|
||||||
{/each}
|
<button on:click={() => ChangeWatchListPage(page+1)}
|
||||||
{#if page === aniListWatchListLoaded.data.Page.pageInfo.lastPage}
|
class="flex items-center justify-center px-4 h-10 leading-tight border rounded-e-lg dark border-gray-700 text-gray-400 hover:bg-gray-700 hover:text-white">
|
||||||
<li>
|
Next
|
||||||
<button
|
</button>
|
||||||
disabled
|
</li>
|
||||||
class="flex items-center justify-center px-4 h-10 leading-tight border rounded-e-lg dark border-gray-700 text-gray-400 cursor-default"
|
{/if}
|
||||||
>
|
</ul>
|
||||||
Next
|
</nav>
|
||||||
</button>
|
{/if}
|
||||||
</li>
|
<div class="flex mt-5">
|
||||||
{:else}
|
<div class="w-20 mx-auto">
|
||||||
<li>
|
<select bind:value={perPage} on:change={(e) => changeCountPerPage(e)} id="countPerPage"
|
||||||
<button
|
class="border text-sm rounded-lg block w-full p-2.5 bg-gray-700 border-gray-600 placeholder-gray-400 text-white focus:ring-blue-500 focus:border-blue-500">
|
||||||
on:click={() => ChangeWatchListPage(page + 1)}
|
{#each perPageOptions as option}
|
||||||
class="flex items-center justify-center px-4 h-10 leading-tight border rounded-e-lg dark border-gray-700 text-gray-400 hover:bg-gray-700 hover:text-white"
|
<option value={option}>
|
||||||
>
|
{option}
|
||||||
Next
|
</option>
|
||||||
</button>
|
{/each}
|
||||||
</li>
|
</select>
|
||||||
{/if}
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
{/if}
|
|
||||||
<div class="flex mt-5">
|
|
||||||
<div class="w-20 mx-auto">
|
|
||||||
<select
|
|
||||||
bind:value={perPage}
|
|
||||||
on:change={(e) => changeCountPerPage(e)}
|
|
||||||
id="countPerPage"
|
|
||||||
class="border text-sm rounded-lg block w-full p-2.5 bg-gray-700 border-gray-600 placeholder-gray-400 text-white focus:ring-blue-500 focus:border-blue-500"
|
|
||||||
>
|
|
||||||
{#each perPageOptions as option}
|
|
||||||
<option value={option}>
|
|
||||||
{option}
|
|
||||||
</option>
|
|
||||||
{/each}
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<div>Total Anime: {aniListWatchListLoaded.data.Page.pageInfo.total}</div>
|
|
||||||
{#if aniListWatchListLoaded.data.Page.pageInfo.lastPage <= 12}
|
|
||||||
<div class="md:hidden">
|
|
||||||
Page: {page} of {aniListWatchListLoaded.data.Page.pageInfo.lastPage}
|
|
||||||
</div>
|
</div>
|
||||||
{:else}
|
|
||||||
<div>
|
<div>
|
||||||
Page: {page} of {aniListWatchListLoaded.data.Page.pageInfo.lastPage}
|
<div>Total Anime: {aniListWatchListLoaded.data.Page.pageInfo.total}</div>
|
||||||
|
{#if aniListWatchListLoaded.data.Page.pageInfo.lastPage <= 12}
|
||||||
|
<div class="md:hidden">Page: {page} of {aniListWatchListLoaded.data.Page.pageInfo.lastPage}</div>
|
||||||
|
{:else}
|
||||||
|
<div>Page: {page} of {aniListWatchListLoaded.data.Page.pageInfo.lastPage}</div>
|
||||||
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="max-w-xs mx-auto">
|
<div class="max-w-xs mx-auto">
|
||||||
<div class="relative flex items-center max-w-[11rem]">
|
<div class="relative flex items-center max-w-[11rem]">
|
||||||
<button
|
<button type="button" id="decrement-button" on:click={() => ChangeWatchListPage(page-1)}
|
||||||
type="button"
|
class="bg-gray-700 hover:bg-gray-600 border-gray-600 border rounded-s-lg p-3 h-11 focus:ring-gray-700 focus:ring-2 focus:outline-none">
|
||||||
id="decrement-button"
|
<svg class="w-3 h-3 text-white" aria-hidden="true"
|
||||||
on:click={() => ChangeWatchListPage(page - 1)}
|
xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 18 2">
|
||||||
class={page <= 1
|
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||||
? "border-gray-600 border rounded-s-lg p-3 h-11 focus:ring-gray-700 focus:ring-2 focus:outline-none"
|
d="M1 1h16"/>
|
||||||
: "bg-gray-700 hover:bg-gray-600 border-gray-600 border rounded-s-lg p-3 h-11 focus:ring-gray-700 focus:ring-2 focus:outline-none"}
|
</svg>
|
||||||
disabled={page <= 1}
|
</button>
|
||||||
>
|
<input type="number" min="1" max="{aniListWatchListLoaded.data.Page.pageInfo.lastPage}"
|
||||||
<svg
|
on:keydown={changePage} id="page-counter"
|
||||||
class="w-3 h-3 text-white"
|
class="[appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none border-x-0 h-11 font-medium text-center text-sm block w-full pb-6 bg-gray-700 border-gray-600 placeholder-gray-400 text-white focus:ring-blue-500 focus:border-blue-500"
|
||||||
aria-hidden="true"
|
value={page} required/>
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
<div class="absolute bottom-1 start-1/2 -translate-x-1/2 rtl:translate-x-1/2 flex items-center text-xs text-gray-400 space-x-1 rtl:space-x-reverse">
|
||||||
fill="none"
|
<span>Page #</span>
|
||||||
viewBox="0 0 18 2"
|
</div>
|
||||||
>
|
<button type="button" id="increment-button" on:click={() => ChangeWatchListPage(page+1)}
|
||||||
<path
|
class="hover:bg-gray-600 border-gray-600 border rounded-e-lg p-3 h-11 focus:ring-gray-700 focus:ring-2 focus:outline-none">
|
||||||
stroke="currentColor"
|
<svg class="w-3 h-3 text-white" aria-hidden="true"
|
||||||
stroke-linecap="round"
|
xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 18 18">
|
||||||
stroke-linejoin="round"
|
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||||
stroke-width="2"
|
d="M9 1v16M1 9h16"/>
|
||||||
d="M1 1h16"
|
</svg>
|
||||||
/>
|
</button>
|
||||||
</svg>
|
</div>
|
||||||
</button>
|
|
||||||
<input
|
|
||||||
type="number"
|
|
||||||
min="1"
|
|
||||||
max={aniListWatchListLoaded.data.Page.pageInfo.lastPage}
|
|
||||||
on:keydown={changePage}
|
|
||||||
id="page-counter"
|
|
||||||
class="[appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none border-x-0 h-11 font-medium text-center text-sm block w-full pb-6 bg-gray-700 border-gray-600 placeholder-gray-400 text-white focus:ring-blue-500 focus:border-blue-500"
|
|
||||||
value={page}
|
|
||||||
required
|
|
||||||
/>
|
|
||||||
<div
|
|
||||||
class="absolute bottom-1 start-1/2 -translate-x-1/2 rtl:translate-x-1/2 flex items-center text-xs text-gray-400 space-x-1 rtl:space-x-reverse"
|
|
||||||
>
|
|
||||||
<span>Page #</span>
|
|
||||||
</div>
|
</div>
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
id="increment-button"
|
|
||||||
on:click={() => ChangeWatchListPage(page + 1)}
|
|
||||||
class={page >= aniListWatchListLoaded.data.Page.pageInfo.lastPage
|
|
||||||
? "border-gray-600 border rounded-e-lg p-3 h-11 focus:ring-gray-700 focus:ring-2 focus:outline-none"
|
|
||||||
: "bg-gray-700 hover:bg-gray-600 border-gray-600 border rounded-e-lg p-3 h-11 focus:ring-gray-700 focus:ring-2 focus:outline-none"}
|
|
||||||
disabled={page >= aniListWatchListLoaded.data.Page.pageInfo.lastPage}
|
|
||||||
>
|
|
||||||
<svg
|
|
||||||
class="w-3 h-3 text-white"
|
|
||||||
aria-hidden="true"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
fill="none"
|
|
||||||
viewBox="0 0 18 18"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
stroke="currentColor"
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"
|
|
||||||
stroke-width="2"
|
|
||||||
d="M9 1v16M1 9h16"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
@@ -1,99 +1,68 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import {
|
import {
|
||||||
aniListLoggedIn,
|
aniListLoggedIn,
|
||||||
aniListWatchlist,
|
aniListWatchlist,
|
||||||
GetAnimeSingleItem,
|
GetAnimeSingleItem,
|
||||||
loading,
|
loading,
|
||||||
} from "../helperModules/GlobalVariablesAndHelperFunctions.svelte";
|
} from "../helperModules/GlobalVariablesAndHelperFunctions.svelte";
|
||||||
import { push } from "svelte-spa-router";
|
import {push} from "svelte-spa-router";
|
||||||
import type { AniListCurrentUserWatchList } from "../anilist/types/AniListCurrentUserWatchListType";
|
import type {AniListCurrentUserWatchList} from "../anilist/types/AniListCurrentUserWatchListType"
|
||||||
import { Rating } from "flowbite-svelte";
|
import {Rating} from "flowbite-svelte";
|
||||||
import loader from "../helperFunctions/loader";
|
import loader from '../helperFunctions/loader'
|
||||||
import { CheckIfAniListLoggedInAndLoadWatchList } from "../helperModules/CheckIfAniListLoggedInAndLoadWatchList.svelte";
|
|
||||||
|
|
||||||
let isAniListLoggedIn: boolean;
|
|
||||||
let aniListWatchListLoaded: AniListCurrentUserWatchList;
|
|
||||||
|
|
||||||
aniListLoggedIn.subscribe((value) => (isAniListLoggedIn = value));
|
let isAniListLoggedIn: boolean
|
||||||
aniListWatchlist.subscribe((value) => (aniListWatchListLoaded = value));
|
let aniListWatchListLoaded: AniListCurrentUserWatchList
|
||||||
|
|
||||||
|
aniListLoggedIn.subscribe((value) => isAniListLoggedIn = value)
|
||||||
|
aniListWatchlist.subscribe((value) => aniListWatchListLoaded = value)
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
{#if isAniListLoggedIn}
|
{#if isAniListLoggedIn}
|
||||||
<div
|
<div class="mx-auto max-w-2xl p-4 sm:p-6 lg:max-w-7xl lg:px-8 relative items-center">
|
||||||
class="mx-auto max-w-2xl p-4 sm:p-6 lg:max-w-7xl lg:px-8 relative items-center"
|
<h1 class="text-left text-xl font-bold mb-4">Your AniList WatchList</h1>
|
||||||
>
|
|
||||||
<div class="flex justify-between items-center mb-4">
|
|
||||||
<h1 class="text-left text-xl font-bold">Your AniList WatchList</h1>
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
class="py-2 px-4 bg-gray-700 rounded-lg"
|
|
||||||
on:click={async () => {
|
|
||||||
loading.set(true);
|
|
||||||
await CheckIfAniListLoggedInAndLoadWatchList();
|
|
||||||
loading.set(false);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Refresh WatchList
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div
|
<div class="grid grid-cols-1 gap-x-6 gap-y-10 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 xl:gap-x-8">
|
||||||
class="grid grid-cols-1 gap-x-6 gap-y-10 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 xl:gap-x-8"
|
{#each aniListWatchListLoaded.data.Page.mediaList as media}
|
||||||
>
|
<div use:loader={loading} class="aspect-h-1 aspect-w-1 w-full overflow-hidden rounded-lg xl:aspect-h-8 xl:aspect-w-7">
|
||||||
{#each aniListWatchListLoaded.data.Page.mediaList as media}
|
<div class="flex flex-col items-center group">
|
||||||
<div
|
<button on:click={() => {
|
||||||
use:loader={loading}
|
push(`#/anime/${media.media.id}`)
|
||||||
class="aspect-h-1 aspect-w-1 w-full overflow-hidden rounded-lg xl:aspect-h-8 xl:aspect-w-7"
|
// loading.set(true)
|
||||||
>
|
// GetAniListSingleItem(media.media.id, true).then(() => {
|
||||||
<div class="flex flex-col items-center group">
|
// loading.set(false)
|
||||||
<button
|
//
|
||||||
on:click={() => {
|
// })
|
||||||
push(`#/anime/${media.media.id}`);
|
}}
|
||||||
// loading.set(true)
|
>
|
||||||
// GetAniListSingleItem(media.media.id, true).then(() => {
|
<img class="rounded-lg" src={media.media.coverImage.large} alt={
|
||||||
// loading.set(false)
|
media.media.title.english === "" ?
|
||||||
//
|
media.media.title.romaji :
|
||||||
// })
|
media.media.title.english
|
||||||
}}
|
}/>
|
||||||
>
|
</button>
|
||||||
<img
|
<Rating id="anime-rating" total={5} size={35} rating={media.score/2.0}/>
|
||||||
class="rounded-lg w-[230px] h-[330px] object-cover"
|
<button class="mt-4 text-md font-semibold text-white-700"
|
||||||
src={media.media.coverImage.large}
|
on:click={() => GetAnimeSingleItem(media.media.id, true)}>
|
||||||
alt={media.media.title.english === ""
|
{
|
||||||
? media.media.title.romaji
|
media.media.title.english === "" ?
|
||||||
: media.media.title.english}
|
media.media.title.romaji :
|
||||||
/>
|
media.media.title.english
|
||||||
</button>
|
}
|
||||||
<Rating
|
</button>
|
||||||
id="anime-rating"
|
<p class="mt-1 text-lg font-medium text-white-900">{media.progress}
|
||||||
total={5}
|
/ {media.media.nextAiringEpisode.episode !== 0 ?
|
||||||
size={35}
|
media.media.nextAiringEpisode.episode - 1 : media.media.episodes}</p>
|
||||||
rating={media.score / 2.0}
|
{#if media.media.episodes > 0}
|
||||||
/>
|
<p class="mt-1 text-lg font-medium text-white-900">Total
|
||||||
<button
|
Episodes: {media.media.episodes}</p>
|
||||||
class="mt-4 text-md font-semibold text-white-700"
|
{/if}
|
||||||
on:click={() => GetAnimeSingleItem(media.media.id, true)}
|
</div>
|
||||||
>
|
</div>
|
||||||
{media.media.title.english === ""
|
{/each}
|
||||||
? media.media.title.romaji
|
|
||||||
: media.media.title.english}
|
|
||||||
</button>
|
|
||||||
<p class="mt-1 text-lg font-medium text-white-900">
|
|
||||||
{media.progress}
|
|
||||||
/ {media.media.nextAiringEpisode.episode !== 0
|
|
||||||
? media.media.nextAiringEpisode.episode - 1
|
|
||||||
: media.media.episodes}
|
|
||||||
</p>
|
|
||||||
{#if media.media.episodes > 0}
|
|
||||||
<p class="mt-1 text-lg font-medium text-white-900">
|
|
||||||
Total Episodes: {media.media.episodes}
|
|
||||||
</p>
|
|
||||||
{/if}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/each}
|
{/if}
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{/if}
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,187 +1,162 @@
|
|||||||
<script lang="ts" context="module">
|
<script lang="ts" context="module">
|
||||||
import {
|
import {
|
||||||
GetAniListItem,
|
GetAniListItem,
|
||||||
GetAniListLoggedInUser,
|
GetAniListLoggedInUser,
|
||||||
GetAniListUserWatchingList,
|
GetAniListUserWatchingList,
|
||||||
GetMyAnimeListAnime,
|
GetMyAnimeListAnime,
|
||||||
GetMyAnimeListLoggedInUser,
|
GetMyAnimeListLoggedInUser,
|
||||||
GetSimklLoggedInUser,
|
GetSimklLoggedInUser,
|
||||||
LogoutAniList,
|
LogoutAniList,
|
||||||
LogoutMyAnimeList,
|
LogoutMyAnimeList,
|
||||||
LogoutSimkl,
|
LogoutSimkl,
|
||||||
SimklGetUserWatchlist,
|
SimklGetUserWatchlist,
|
||||||
SimklSearch,
|
SimklSearch
|
||||||
} from "../../wailsjs/go/main/App";
|
} from "../../wailsjs/go/main/App";
|
||||||
import type {
|
import type {
|
||||||
AniListCurrentUserWatchList,
|
AniListCurrentUserWatchList,
|
||||||
AniListGetSingleAnime,
|
AniListGetSingleAnime
|
||||||
} from "../anilist/types/AniListCurrentUserWatchListType.js";
|
} from "../anilist/types/AniListCurrentUserWatchListType.js";
|
||||||
import { writable } from "svelte/store";
|
import {writable} from 'svelte/store'
|
||||||
import type {
|
import type {SimklAnime, SimklUser, SimklWatchList} from "../simkl/types/simklTypes";
|
||||||
SimklAnime,
|
import {type AniListUser, MediaListSort} from "../anilist/types/AniListTypes";
|
||||||
SimklUser,
|
import type {MALAnime, MALWatchlist, MyAnimeListUser} from "../mal/types/MALTypes";
|
||||||
SimklWatchList,
|
import type {TableItems} from "../helperTypes/TableTypes";
|
||||||
} from "../simkl/types/simklTypes";
|
import {AniListGetSingleAnimeDefaultData} from "../helperDefaults/AniListGetSingleAnime";
|
||||||
import {
|
|
||||||
type AniListUser,
|
|
||||||
MediaListSort,
|
|
||||||
} from "../anilist/types/AniListTypes";
|
|
||||||
import type {
|
|
||||||
MALAnime,
|
|
||||||
MALWatchlist,
|
|
||||||
MyAnimeListUser,
|
|
||||||
} from "../mal/types/MALTypes";
|
|
||||||
import type { TableItems } from "../helperTypes/TableTypes";
|
|
||||||
import { AniListGetSingleAnimeDefaultData } from "../helperDefaults/AniListGetSingleAnime";
|
|
||||||
|
|
||||||
export let aniListAnime = writable(AniListGetSingleAnimeDefaultData);
|
export let aniListAnime = writable(AniListGetSingleAnimeDefaultData)
|
||||||
export let title = writable("");
|
export let title = writable("")
|
||||||
export let aniListLoggedIn = writable(false);
|
export let aniListLoggedIn = writable(false)
|
||||||
export let simklLoggedIn = writable(false);
|
export let simklLoggedIn = writable(false)
|
||||||
export let malLoggedIn = writable(false);
|
export let malLoggedIn = writable(false)
|
||||||
export let simklWatchList = writable({} as SimklWatchList);
|
export let simklWatchList = writable({} as SimklWatchList)
|
||||||
export let aniListPrimary = writable(true);
|
export let aniListPrimary = writable(true)
|
||||||
export let simklPrimary = writable(false);
|
export let simklPrimary = writable(false)
|
||||||
export let malPrimary = writable(false);
|
export let malPrimary = writable(false)
|
||||||
export let simklUser = writable({} as SimklUser);
|
export let simklUser = writable({} as SimklUser)
|
||||||
export let aniListUser = writable({} as AniListUser);
|
export let aniListUser = writable({} as AniListUser)
|
||||||
export let malUser = writable({} as MyAnimeListUser);
|
export let malUser = writable({} as MyAnimeListUser)
|
||||||
export let aniListWatchlist = writable({} as AniListCurrentUserWatchList);
|
export let aniListWatchlist = writable({} as AniListCurrentUserWatchList)
|
||||||
export let malWatchList = writable({} as MALWatchlist);
|
export let malWatchList = writable({} as MALWatchlist)
|
||||||
export let malAnime = writable({} as MALAnime);
|
export let malAnime = writable({} as MALAnime)
|
||||||
export let simklAnime = writable({} as SimklAnime);
|
export let simklAnime = writable({} as SimklAnime)
|
||||||
export let loading = writable(false);
|
export let loading = writable(false)
|
||||||
export let tableItems = writable([] as TableItems);
|
export let tableItems = writable([] as TableItems)
|
||||||
export let watchlistNeedsRefresh = writable(false);
|
|
||||||
|
|
||||||
export let watchListPage = writable(1);
|
export let watchListPage = writable(1)
|
||||||
export let animePerPage = writable(20);
|
export let animePerPage = writable(20)
|
||||||
|
|
||||||
let isAniListPrimary: boolean;
|
let isAniListPrimary: boolean
|
||||||
let page: number;
|
let page: number
|
||||||
let perPage: number;
|
let perPage: number
|
||||||
let aniWatchlist: AniListCurrentUserWatchList;
|
let aniWatchlist: AniListCurrentUserWatchList
|
||||||
let currentAniListAnime: AniListGetSingleAnime;
|
let currentAniListAnime: AniListGetSingleAnime
|
||||||
|
|
||||||
let isMalLoggedIn: boolean;
|
let isMalLoggedIn: boolean
|
||||||
let isSimklLoggedIn: boolean;
|
let isSimklLoggedIn: boolean
|
||||||
|
|
||||||
aniListPrimary.subscribe((value) => (isAniListPrimary = value));
|
aniListPrimary.subscribe(value => isAniListPrimary = value)
|
||||||
watchListPage.subscribe((value) => (page = value));
|
watchListPage.subscribe(value => page = value)
|
||||||
animePerPage.subscribe((value) => (perPage = value));
|
animePerPage.subscribe(value => perPage = value)
|
||||||
aniListWatchlist.subscribe((value) => (aniWatchlist = value));
|
aniListWatchlist.subscribe(value => aniWatchlist = value)
|
||||||
malLoggedIn.subscribe((value) => (isMalLoggedIn = value));
|
malLoggedIn.subscribe(value => isMalLoggedIn = value)
|
||||||
simklLoggedIn.subscribe((value) => (isSimklLoggedIn = value));
|
simklLoggedIn.subscribe(value => isSimklLoggedIn = value)
|
||||||
aniListAnime.subscribe((value) => (currentAniListAnime = value));
|
aniListAnime.subscribe(value => currentAniListAnime = value)
|
||||||
|
|
||||||
export async function GetAnimeSingleItem(
|
|
||||||
aniId: number,
|
export async function GetAnimeSingleItem(aniId: number, login: boolean): Promise<""> {
|
||||||
login: boolean,
|
await GetAniListItem(aniId, login).then(aniListResult => {
|
||||||
): Promise<""> {
|
let finalResult: AniListGetSingleAnime
|
||||||
await GetAniListItem(aniId, login).then((aniListResult) => {
|
finalResult = aniListResult
|
||||||
let finalResult: AniListGetSingleAnime;
|
if (login === false) {
|
||||||
finalResult = aniListResult;
|
finalResult.data.MediaList.status = ""
|
||||||
if (login === false) {
|
finalResult.data.MediaList.score = 0
|
||||||
finalResult.data.MediaList.status = "";
|
finalResult.data.MediaList.progress = 0
|
||||||
finalResult.data.MediaList.score = 0;
|
finalResult.data.MediaList.notes = ""
|
||||||
finalResult.data.MediaList.progress = 0;
|
finalResult.data.MediaList.repeat = 0
|
||||||
finalResult.data.MediaList.notes = "";
|
finalResult.data.MediaList.startedAt.day = 0
|
||||||
finalResult.data.MediaList.repeat = 0;
|
finalResult.data.MediaList.startedAt.month = 0
|
||||||
finalResult.data.MediaList.startedAt.day = 0;
|
finalResult.data.MediaList.startedAt.year = 0
|
||||||
finalResult.data.MediaList.startedAt.month = 0;
|
finalResult.data.MediaList.completedAt.day = 0
|
||||||
finalResult.data.MediaList.startedAt.year = 0;
|
finalResult.data.MediaList.completedAt.month = 0
|
||||||
finalResult.data.MediaList.completedAt.day = 0;
|
finalResult.data.MediaList.completedAt.year = 0
|
||||||
finalResult.data.MediaList.completedAt.month = 0;
|
}
|
||||||
finalResult.data.MediaList.completedAt.year = 0;
|
aniListAnime.set(finalResult)
|
||||||
}
|
title.set(currentAniListAnime.data.MediaList.media.title.english === "" ?
|
||||||
aniListAnime.set(finalResult);
|
currentAniListAnime.data.MediaList.media.title.romaji :
|
||||||
title.set(
|
currentAniListAnime.data.MediaList.media.title.english)
|
||||||
currentAniListAnime.data.MediaList.media.title.english === ""
|
})
|
||||||
? currentAniListAnime.data.MediaList.media.title.romaji
|
if (isMalLoggedIn) {
|
||||||
: currentAniListAnime.data.MediaList.media.title.english,
|
await GetMyAnimeListAnime(currentAniListAnime.data.MediaList.media.idMal).then(malResult => {
|
||||||
);
|
malAnime.set(malResult)
|
||||||
});
|
})
|
||||||
if (isMalLoggedIn) {
|
}
|
||||||
await GetMyAnimeListAnime(
|
if (isSimklLoggedIn) {
|
||||||
currentAniListAnime.data.MediaList.media.idMal,
|
await SimklSearch(currentAniListAnime.data.MediaList).then((value: SimklAnime) => {
|
||||||
).then((malResult) => {
|
simklAnime.set(value)
|
||||||
malAnime.set(malResult);
|
})
|
||||||
});
|
}
|
||||||
|
return ""
|
||||||
}
|
}
|
||||||
if (isSimklLoggedIn) {
|
|
||||||
await SimklSearch(currentAniListAnime.data.MediaList).then(
|
export function loginToSimkl(): void {
|
||||||
(value: SimklAnime) => {
|
GetSimklLoggedInUser().then(user => {
|
||||||
simklAnime.set(value);
|
if (Object.keys(user).length === 0) {
|
||||||
},
|
simklLoggedIn.set(false)
|
||||||
);
|
} else {
|
||||||
|
simklUser.set(user)
|
||||||
|
SimklGetUserWatchlist().then(result => {
|
||||||
|
simklWatchList.set(result)
|
||||||
|
simklLoggedIn.set(true)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
export function loginToSimkl(): void {
|
export function loginToAniList(): void {
|
||||||
GetSimklLoggedInUser().then((user) => {
|
GetAniListLoggedInUser().then(result => {
|
||||||
if (Object.keys(user).length === 0) {
|
aniListUser.set(result)
|
||||||
simklLoggedIn.set(false);
|
if (isAniListPrimary) {
|
||||||
} else {
|
GetAniListUserWatchingList(page, perPage, MediaListSort.UpdatedTimeDesc).then((result) => {
|
||||||
simklUser.set(user);
|
aniListWatchlist.set(result)
|
||||||
SimklGetUserWatchlist().then((result) => {
|
aniListLoggedIn.set(true)
|
||||||
simklWatchList.set(result);
|
})
|
||||||
simklLoggedIn.set(true);
|
} else {
|
||||||
});
|
aniListLoggedIn.set(true)
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function loginToAniList(): void {
|
export function loginToMAL(): void {
|
||||||
GetAniListLoggedInUser().then((result) => {
|
GetMyAnimeListLoggedInUser().then(result => {
|
||||||
aniListUser.set(result);
|
malUser.set(result)
|
||||||
if (isAniListPrimary) {
|
malLoggedIn.set(true)
|
||||||
GetAniListUserWatchingList(
|
})
|
||||||
page,
|
}
|
||||||
perPage,
|
|
||||||
MediaListSort.UpdatedTimeDesc,
|
|
||||||
).then((result) => {
|
|
||||||
aniListWatchlist.set(result);
|
|
||||||
aniListLoggedIn.set(true);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
aniListLoggedIn.set(true);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
export function loginToMAL(): void {
|
export function logoutOfAniList(): void {
|
||||||
GetMyAnimeListLoggedInUser().then((result) => {
|
LogoutAniList().then(result => {
|
||||||
malUser.set(result);
|
console.log(result)
|
||||||
malLoggedIn.set(true);
|
if (Object.keys(aniWatchlist).length !== 0) {
|
||||||
});
|
aniListWatchlist.set({} as AniListCurrentUserWatchList)
|
||||||
}
|
}
|
||||||
|
aniListUser.set({} as AniListUser)
|
||||||
|
aniListLoggedIn.set(false)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export function logoutOfAniList(): void {
|
export function logoutOfMAL(): void {
|
||||||
LogoutAniList().then((result) => {
|
LogoutMyAnimeList().then(result => {
|
||||||
console.log(result);
|
console.log(result)
|
||||||
if (Object.keys(aniWatchlist).length !== 0) {
|
malUser.set({} as MyAnimeListUser)
|
||||||
aniListWatchlist.set({} as AniListCurrentUserWatchList);
|
malLoggedIn.set(false)
|
||||||
}
|
})
|
||||||
aniListUser.set({} as AniListUser);
|
}
|
||||||
aniListLoggedIn.set(false);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
export function logoutOfMAL(): void {
|
export function logoutOfSimkl(): void {
|
||||||
LogoutMyAnimeList().then((result) => {
|
LogoutSimkl().then(result => {
|
||||||
console.log(result);
|
console.log(result)
|
||||||
malUser.set({} as MyAnimeListUser);
|
simklUser.set({} as SimklUser)
|
||||||
malLoggedIn.set(false);
|
simklLoggedIn.set(false)
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function logoutOfSimkl(): void {
|
|
||||||
LogoutSimkl().then((result) => {
|
|
||||||
console.log(result);
|
|
||||||
simklUser.set({} as SimklUser);
|
|
||||||
simklLoggedIn.set(false);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,6 @@
|
|||||||
},
|
},
|
||||||
"info": {
|
"info": {
|
||||||
"productName": "AniTrack",
|
"productName": "AniTrack",
|
||||||
"productVersion": "0.6.5"
|
"productVersion": "0.5.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user