2 Commits

Author SHA1 Message Date
b934276342 chore(version): bump version to 0.5.1
Increment version number from 0.5.0 to 0.5.1 for the upcoming release.
2026-03-20 10:56:39 -04:00
6860a5541a style(frontend): format Header.svelte with consistent code style
Apply consistent formatting to Header.svelte:
- Add semicolons to all statements
- Improve JSX/HTML attribute formatting for better readability
- Add link import from svelte-spa-router for SPA navigation
- Format multi-line attributes with proper indentation

These changes improve code consistency and maintainability without
altering any functionality.
2026-03-20 10:56:37 -04:00
8 changed files with 1193 additions and 1353 deletions

3
.gitignore vendored
View File

@@ -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
View File

@@ -0,0 +1,5 @@
{
"recommendations": [
"svelte.svelte-vscode"
]
}

View File

@@ -3,68 +3,40 @@
aniListLoggedIn, aniListLoggedIn,
malLoggedIn, malLoggedIn,
simklLoggedIn, simklLoggedIn,
watchlistNeedsRefresh,
aniListPrimary,
malPrimary,
simklPrimary,
malWatchList,
simklWatchList,
} from "./helperModules/GlobalVariablesAndHelperFunctions.svelte"; } from "./helperModules/GlobalVariablesAndHelperFunctions.svelte";
import { onMount } from "svelte"; import {onMount} from "svelte";
import Router from "svelte-spa-router"; import Router from "svelte-spa-router"
import Home from "./routes/Home.svelte"; import Home from "./routes/Home.svelte";
import { wrap } from "svelte-spa-router/wrap"; import {wrap} from "svelte-spa-router/wrap";
import Spinner from "./helperComponents/Spinner.svelte"; import Spinner from "./helperComponents/Spinner.svelte";
import Header from "./helperComponents/Header.svelte"; import Header from "./helperComponents/Header.svelte";
import { CheckIfAniListLoggedInAndLoadWatchList } from "./helperModules/CheckIfAniListLoggedInAndLoadWatchList.svelte"; import {CheckIfAniListLoggedInAndLoadWatchList} from "./helperModules/CheckIfAniListLoggedInAndLoadWatchList.svelte";
import { CheckIfMALLoggedInAndSetUser } from "./helperModules/CheckIfMyAnimeListLoggedIn.svelte"; import { CheckIfMALLoggedInAndSetUser } from "./helperModules/CheckIfMyAnimeListLoggedIn.svelte";
import { CheckIfSimklLoggedInAndSetUser } from "./helperModules/CheckIsSimklLoggedIn.svelte"; import {CheckIfSimklLoggedInAndSetUser} from "./helperModules/CheckIsSimklLoggedIn.svelte"
import { import {CheckIfAniListLoggedIn} from "../wailsjs/go/main/App";
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"
}} }} />
/>

View File

@@ -6,7 +6,6 @@
malLoggedIn, malLoggedIn,
simklAnime, simklAnime,
simklLoggedIn, simklLoggedIn,
watchlistNeedsRefresh,
} from "../helperModules/GlobalVariablesAndHelperFunctions.svelte"; } from "../helperModules/GlobalVariablesAndHelperFunctions.svelte";
import { push } from "svelte-spa-router"; import { push } from "svelte-spa-router";
import WebsiteLink from "./WebsiteLink.svelte"; import WebsiteLink from "./WebsiteLink.svelte";
@@ -24,7 +23,10 @@
} from "../mal/types/MALTypes"; } from "../mal/types/MALTypes";
import type { SimklAnime } from "../simkl/types/simklTypes"; import type { SimklAnime } from "../simkl/types/simklTypes";
import { writable } from "svelte/store"; import { writable } from "svelte/store";
import type { StatusOption, StatusOptions } from "../helperTypes/StatusTypes"; import type {
StatusOption,
StatusOptions,
} from "../helperTypes/StatusTypes";
import type { AniListUpdateVariables } from "../anilist/types/AniListTypes"; import type { AniListUpdateVariables } from "../anilist/types/AniListTypes";
import { convertDateToAniList } from "../helperFunctions/convertDateToAniList"; import { convertDateToAniList } from "../helperFunctions/convertDateToAniList";
import { import {
@@ -79,7 +81,8 @@
{ id: 5, aniList: "REPEATING", mal: "rewatching", simkl: "watching" }, { id: 5, aniList: "REPEATING", mal: "rewatching", simkl: "watching" },
]; ];
let startingAnilistStatusOption: StatusOption = statusOptions.filter( let startingAnilistStatusOption: StatusOption = statusOptions.filter(
(option) => currentAniListAnime.data.MediaList.status === option.aniList, (option) =>
currentAniListAnime.data.MediaList.status === option.aniList,
)[0]; )[0];
let startedAtDate: Date | null = convertAniListDateToDate( let startedAtDate: Date | null = convertAniListDateToDate(
currentAniListAnime.data.MediaList.startedAt, currentAniListAnime.data.MediaList.startedAt,
@@ -110,11 +113,15 @@
let startDate = ""; let startDate = "";
let finishDate = ""; let finishDate = "";
if (currentMalAnime.my_list_status.start_date !== "") { if (currentMalAnime.my_list_status.start_date !== "") {
const startArray = re.exec(currentMalAnime.my_list_status.start_date); const startArray = re.exec(
currentMalAnime.my_list_status.start_date,
);
startDate = `${startArray[2]}-${startArray[3]}-${startArray[1]}`; startDate = `${startArray[2]}-${startArray[3]}-${startArray[1]}`;
} }
if (currentMalAnime.my_list_status.finish_date !== "") { if (currentMalAnime.my_list_status.finish_date !== "") {
const finishArray = re.exec(currentMalAnime.my_list_status.finish_date); const finishArray = re.exec(
currentMalAnime.my_list_status.finish_date,
);
finishDate = `${finishArray[2]}-${finishArray[3]}-${finishArray[1]}`; finishDate = `${finishArray[2]}-${finishArray[3]}-${finishArray[1]}`;
} }
AddAnimeServiceToTable({ AddAnimeServiceToTable({
@@ -191,7 +198,6 @@
submitData[key] = value; submitData[key] = value;
} }
try {
if ( if (
isAniListLoggedIn && isAniListLoggedIn &&
currentAniListAnime.data.MediaList.mediaId !== 0 currentAniListAnime.data.MediaList.mediaId !== 0
@@ -206,11 +212,10 @@
startedAt: convertDateToAniList(startedAtDate), startedAt: convertDateToAniList(startedAtDate),
completedAt: convertDateToAniList(completedAtDate), completedAt: convertDateToAniList(completedAtDate),
}; };
await AniListUpdateEntry(body).then((value: AniListGetSingleAnime) => { await AniListUpdateEntry(body).then(
(value: AniListGetSingleAnime) => {
value.data.MediaList.media.tags = value.data.MediaList.media.tags =
currentAniListAnime.data.MediaList.media.tags; currentAniListAnime.data.MediaList.media.tags;
value.data.MediaList.media.genres =
currentAniListAnime.data.MediaList.media.genres;
aniListAnime.update((newValue) => { aniListAnime.update((newValue) => {
newValue = value; newValue = value;
return newValue; return newValue;
@@ -231,7 +236,8 @@
repeat: currentAniListAnime.data.MediaList.repeat, repeat: currentAniListAnime.data.MediaList.repeat,
notes: currentAniListAnime.data.MediaList.notes, notes: currentAniListAnime.data.MediaList.notes,
}); });
}); },
);
} }
if (malLoggedIn && currentMalAnime.id !== 0) { if (malLoggedIn && currentMalAnime.id !== 0) {
@@ -248,7 +254,8 @@
(malAnimeReturn: MalListStatus) => { (malAnimeReturn: MalListStatus) => {
malAnime.update((value) => { malAnime.update((value) => {
value.my_list_status.status = malAnimeReturn.status; value.my_list_status.status = malAnimeReturn.status;
value.my_list_status.is_rewatching = malAnimeReturn.is_rewatching; value.my_list_status.is_rewatching =
malAnimeReturn.is_rewatching;
value.my_list_status.score = malAnimeReturn.score; value.my_list_status.score = malAnimeReturn.score;
value.my_list_status.num_episodes_watched = value.my_list_status.num_episodes_watched =
malAnimeReturn.num_episodes_watched; malAnimeReturn.num_episodes_watched;
@@ -275,12 +282,14 @@
id: `m-${currentMalAnime.id}`, id: `m-${currentMalAnime.id}`,
title: currentMalAnime.title, title: currentMalAnime.title,
service: "MyAnimeList", service: "MyAnimeList",
progress: currentMalAnime.my_list_status.num_episodes_watched, progress:
currentMalAnime.my_list_status.num_episodes_watched,
status: currentMalAnime.my_list_status.status, status: currentMalAnime.my_list_status.status,
startedAt: startDate, startedAt: startDate,
completedAt: finishDate, completedAt: finishDate,
score: currentMalAnime.my_list_status.score, score: currentMalAnime.my_list_status.score,
repeat: currentMalAnime.my_list_status.num_times_rewatched, repeat: currentMalAnime.my_list_status
.num_times_rewatched,
notes: currentMalAnime.my_list_status.comments, notes: currentMalAnime.my_list_status.comments,
}); });
}, },
@@ -288,9 +297,13 @@
} }
if (simklLoggedIn && currentSimklAnime.show.ids.simkl !== 0) { if (simklLoggedIn && currentSimklAnime.show.ids.simkl !== 0) {
if (currentSimklAnime.watched_episodes_count !== submitData.episodes) { if (
await SimklSyncEpisodes(currentSimklAnime, submitData.episodes).then( currentSimklAnime.watched_episodes_count !== submitData.episodes
(value: SimklAnime) => { ) {
await SimklSyncEpisodes(
currentSimklAnime,
submitData.episodes,
).then((value: SimklAnime) => {
AddAnimeServiceToTable({ AddAnimeServiceToTable({
id: `s-${value.show.ids.simkl}`, id: `s-${value.show.ids.simkl}`,
title: value.show.title, title: value.show.title,
@@ -307,13 +320,14 @@
newValue = value; newValue = value;
return newValue; return newValue;
}); });
}, });
);
} }
if (currentSimklAnime.user_rating !== submitData.rating) { if (currentSimklAnime.user_rating !== submitData.rating) {
await SimklSyncRating(currentSimklAnime, submitData.rating).then( await SimklSyncRating(
(value) => { currentSimklAnime,
submitData.rating,
).then((value) => {
AddAnimeServiceToTable({ AddAnimeServiceToTable({
id: `s-${value.show.ids.simkl}`, id: `s-${value.show.ids.simkl}`,
title: value.show.title, title: value.show.title,
@@ -330,8 +344,7 @@
newValue = value; newValue = value;
return newValue; return newValue;
}); });
}, });
);
} }
if (currentSimklAnime.status !== submitData.status.simkl) { if (currentSimklAnime.status !== submitData.status.simkl) {
@@ -358,19 +371,14 @@
}); });
} }
} }
} catch (error) {
console.error("Error submitting changes:", error);
} finally {
submitting.set(false); submitting.set(false);
submitSuccess.set(true); submitSuccess.set(true);
watchlistNeedsRefresh.set(true);
setTimeout(() => submitSuccess.set(false), 2000); setTimeout(() => submitSuccess.set(false), 2000);
}
}; };
const deleteEntries = async () => { const deleteEntries = async () => {
submitting.set(true); submitting.set(true);
try {
if ( if (
isAniListLoggedIn && isAniListLoggedIn &&
currentAniListAnime.data.MediaList.mediaId !== 0 currentAniListAnime.data.MediaList.mediaId !== 0
@@ -419,14 +427,9 @@
notes: "", notes: "",
}); });
} }
} catch (error) {
console.error("Error deleting entries:", error);
} finally {
submitting.set(false); submitting.set(false);
submitSuccess.set(true); submitSuccess.set(true);
watchlistNeedsRefresh.set(true);
setTimeout(() => submitSuccess.set(false), 2000); setTimeout(() => submitSuccess.set(false), 2000);
}
}; };
let max = 999; let max = 999;
@@ -439,7 +442,8 @@
currentAniListAnime.data.MediaList.media.nextAiringEpisode.episode !== 0 currentAniListAnime.data.MediaList.media.nextAiringEpisode.episode !== 0
) { ) {
max = max =
currentAniListAnime.data.MediaList.media.nextAiringEpisode.episode - 1; currentAniListAnime.data.MediaList.media.nextAiringEpisode.episode -
1;
} }
</script> </script>
@@ -475,18 +479,21 @@
on:click={() => { on:click={() => {
currentAniListAnime.data.MediaList.progress -= 1; currentAniListAnime.data.MediaList.progress -= 1;
if ( if (
currentAniListAnime.data.MediaList.progress < currentAniListAnime.data.MediaList
currentAniListAnime.data.MediaList.media.episodes .progress <
currentAniListAnime.data.MediaList.media
.episodes
) { ) {
startingAnilistStatusOption = statusOptions[0]; startingAnilistStatusOption =
if (currentAniListAnime.data.MediaList.repeat === 0) statusOptions[0];
if (
currentAniListAnime.data.MediaList
.repeat === 0
)
completedAtDate = null; completedAtDate = null;
} }
}} }}
disabled={currentAniListAnime.data.MediaList.progress <= 0} 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"
class={currentAniListAnime.data.MediaList.progress <= 0
? "border-gray-600 border rounded-s-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-s-lg p-3 h-11 focus:ring-gray-700 focus:ring-2 focus:outline-none"}
> >
<svg <svg
class="w-3 h-3 text-white" class="w-3 h-3 text-white"
@@ -512,18 +519,22 @@
id="episodes" id="episodes"
class="border border-x-0 p-2.5 h-11 text-center text-sm block w-full placeholder-gray-400 [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none class="border border-x-0 p-2.5 h-11 text-center text-sm block w-full placeholder-gray-400 [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none
{currentAniListAnime.data.MediaList.progress < 0 || {currentAniListAnime.data.MediaList.progress < 0 ||
(currentAniListAnime.data.MediaList.media.episodes > 0 && (currentAniListAnime.data.MediaList.media.episodes >
0 &&
currentAniListAnime.data.MediaList.progress > currentAniListAnime.data.MediaList.progress >
currentAniListAnime.data.MediaList.media.episodes) || currentAniListAnime.data.MediaList.media
(currentAniListAnime.data.MediaList.media.nextAiringEpisode .episodes) ||
.episode > 0 && (currentAniListAnime.data.MediaList.media
.nextAiringEpisode.episode > 0 &&
currentAniListAnime.data.MediaList.progress > currentAniListAnime.data.MediaList.progress >
currentAniListAnime.data.MediaList.media.nextAiringEpisode currentAniListAnime.data.MediaList.media
.episode - .nextAiringEpisode.episode -
1) 1)
? 'border-red-500 border-[2px] text-rose-300 focus:ring-red-500 focus:border-red-500' ? 'border-red-500 border-[2px] text-rose-300 focus:ring-red-500 focus:border-red-500'
: 'bg-gray-700 hover:bg-gray-600 border-gray-600 text-white focus:ring-blue-500 focus:border-blue-500'} w-24" : 'bg-gray-700 hover:bg-gray-600 border-gray-600 text-white focus:ring-blue-500 focus:border-blue-500'} w-24"
bind:value={currentAniListAnime.data.MediaList.progress} bind:value={
currentAniListAnime.data.MediaList.progress
}
required required
/> />
<button <button
@@ -533,38 +544,27 @@
on:click={() => { on:click={() => {
currentAniListAnime.data.MediaList.progress += 1; currentAniListAnime.data.MediaList.progress += 1;
if ( if (
currentAniListAnime.data.MediaList.media.episodes === currentAniListAnime.data.MediaList.media
.episodes ===
currentAniListAnime.data.MediaList.progress currentAniListAnime.data.MediaList.progress
) { ) {
startingAnilistStatusOption = statusOptions[2]; startingAnilistStatusOption =
statusOptions[2];
completedAtDate = new Date(); completedAtDate = new Date();
} }
if (currentAniListAnime.data.MediaList.progress - 1 === 0) { if (
startingAnilistStatusOption = statusOptions[0]; currentAniListAnime.data.MediaList
if (startedAtDate === null) startedAtDate = new Date(); .progress -
1 ===
0
) {
startingAnilistStatusOption =
statusOptions[0];
if (startedAtDate === null)
startedAtDate = new Date();
} }
}} }}
disabled={(currentAniListAnime.data.MediaList.media.episodes > class="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"
0 &&
currentAniListAnime.data.MediaList.progress >=
currentAniListAnime.data.MediaList.media.episodes) ||
(currentAniListAnime.data.MediaList.media.nextAiringEpisode
.episode > 0 &&
currentAniListAnime.data.MediaList.progress >
currentAniListAnime.data.MediaList.media.nextAiringEpisode
.episode -
2)}
class={(currentAniListAnime.data.MediaList.media.episodes > 0 &&
currentAniListAnime.data.MediaList.progress >=
currentAniListAnime.data.MediaList.media.episodes) ||
(currentAniListAnime.data.MediaList.media.nextAiringEpisode
.episode > 0 &&
currentAniListAnime.data.MediaList.progress >
currentAniListAnime.data.MediaList.media.nextAiringEpisode
.episode -
2)
? "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"}
> >
<svg <svg
class="w-3 h-3 text-white" class="w-3 h-3 text-white"
@@ -584,15 +584,16 @@
</button> </button>
</div> </div>
<div> <div>
/ {currentAniListAnime.data.MediaList.media.nextAiringEpisode / {currentAniListAnime.data.MediaList.media
.episode !== 0 .nextAiringEpisode.episode !== 0
? currentAniListAnime.data.MediaList.media.nextAiringEpisode ? currentAniListAnime.data.MediaList.media
.episode - 1 .nextAiringEpisode.episode - 1
: currentAniListAnime.data.MediaList.media.episodes} : currentAniListAnime.data.MediaList.media.episodes}
</div> </div>
{#if currentAniListAnime.data.MediaList.media.nextAiringEpisode.episode !== 0} {#if currentAniListAnime.data.MediaList.media.nextAiringEpisode.episode !== 0}
<div> <div>
of {currentAniListAnime.data.MediaList.media.episodes} of {currentAniListAnime.data.MediaList.media
.episodes}
</div> </div>
{/if} {/if}
</div> </div>
@@ -664,7 +665,8 @@
name="repeat" name="repeat"
min="0" min="0"
id="repeat" id="repeat"
class="border {currentAniListAnime.data.MediaList.repeat < 0 class="border {currentAniListAnime.data.MediaList
.repeat < 0
? 'border-red-500 border-[2px] text-rose-300 focus:ring-red-500 focus:border-red-500' ? 'border-red-500 border-[2px] text-rose-300 focus:ring-red-500 focus:border-red-500'
: 'border-gray-500 text-white focus:ring-blue-500 focus:border-blue-500'} text-sm rounded-lg block w-24 p-2.5 bg-gray-600 placeholder-gray-400 text-white" : 'border-gray-500 text-white focus:ring-blue-500 focus:border-blue-500'} text-sm rounded-lg block w-24 p-2.5 bg-gray-600 placeholder-gray-400 text-white"
bind:value={currentAniListAnime.data.MediaList.repeat} bind:value={currentAniListAnime.data.MediaList.repeat}
@@ -728,7 +730,6 @@
Sync Changes Sync Changes
</button> </button>
<button <button
type="button"
class="text-white bg-gray-800 border border-gray-600 focus:outline-none hover:bg-gray-700 focus:ring-4 class="text-white bg-gray-800 border border-gray-600 focus:outline-none hover:bg-gray-700 focus:ring-4
focus:ring-gray-700 font-medium rounded-lg text-sm px-5 py-2.5 me-2 mb-2 focus:ring-gray-700 font-medium rounded-lg text-sm px-5 py-2.5 me-2 mb-2
hover:border-gray-600" hover:border-gray-600"
@@ -828,7 +829,7 @@
<div class="flex m-5"> <div class="flex m-5">
<div> <div>
<h3 class="text-2xl">Genres</h3> <h3 class="text-2xl">Genres</h3>
{#each currentAniListAnime.data.MediaList.media.genres || [] as genre} {#each currentAniListAnime.data.MediaList.media.genres as genre}
<div> <div>
<Badge large border color="blue" class="m-1 w-52"> <Badge large border color="blue" class="m-1 w-52">
<div> <div>

View File

@@ -6,56 +6,41 @@
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") &&
Number(e.currentTarget.value) !== page
)
ChangeWatchListPage(Number(e.currentTarget.value));
} }
function changeCountPerPage( function changeCountPerPage(e): void {
e: Event & { currentTarget: HTMLSelectElement }, GetAniListUserWatchingList(1, Number(e.target.value), MediaListSort.UpdatedTimeDesc).then((result) => {
): void { animePerPage.set(Number(e.target.value))
GetAniListUserWatchingList( watchListPage.set(1)
1, aniListWatchlist.set(result)
Number(e.currentTarget.value), aniListLoggedIn.set(true)
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">
@@ -64,57 +49,43 @@
<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 Previous
</button> </button>
</li> </li>
{:else} {:else}
<li> <li>
<button <button on:click={() => ChangeWatchListPage(page-1)}
on:click={() => ChangeWatchListPage(page - 1)} 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">
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"
>
Previous Previous
</button> </button>
</li> </li>
{/if} {/if}
{#each { length: aniListWatchListLoaded.data.Page.pageInfo.lastPage } as _, i} {#each {length: aniListWatchListLoaded.data.Page.pageInfo.lastPage} as _, i}
{#if i + 1 === page} {#if i + 1 === page}
<li> <li>
<button <button on:click={() => ChangeWatchListPage(i+1)}
on:click={() => ChangeWatchListPage(i + 1)} 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>
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"
>{i + 1}</button
>
</li> </li>
{:else} {:else}
<li> <li>
<button <button on:click={() => ChangeWatchListPage(i+1)}
on:click={() => ChangeWatchListPage(i + 1)} 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>
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
>
</li> </li>
{/if} {/if}
{/each} {/each}
{#if page === aniListWatchListLoaded.data.Page.pageInfo.lastPage} {#if page === aniListWatchListLoaded.data.Page.pageInfo.lastPage}
<li> <li>
<button <button disabled
disabled 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 rounded-e-lg dark border-gray-700 text-gray-400 cursor-default"
>
Next Next
</button> </button>
</li> </li>
{:else} {:else}
<li> <li>
<button <button on:click={() => ChangeWatchListPage(page+1)}
on:click={() => ChangeWatchListPage(page + 1)} 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">
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"
>
Next Next
</button> </button>
</li> </li>
@@ -124,12 +95,8 @@
{/if} {/if}
<div class="flex mt-5"> <div class="flex mt-5">
<div class="w-20 mx-auto"> <div class="w-20 mx-auto">
<select <select bind:value={perPage} on:change={(e) => changeCountPerPage(e)} id="countPerPage"
bind:value={perPage} 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: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} {#each perPageOptions as option}
<option value={option}> <option value={option}>
{option} {option}
@@ -141,81 +108,35 @@
<div> <div>
<div>Total Anime: {aniListWatchListLoaded.data.Page.pageInfo.total}</div> <div>Total Anime: {aniListWatchListLoaded.data.Page.pageInfo.total}</div>
{#if aniListWatchListLoaded.data.Page.pageInfo.lastPage <= 12} {#if aniListWatchListLoaded.data.Page.pageInfo.lastPage <= 12}
<div class="md:hidden"> <div class="md:hidden">Page: {page} of {aniListWatchListLoaded.data.Page.pageInfo.lastPage}</div>
Page: {page} of {aniListWatchListLoaded.data.Page.pageInfo.lastPage}
</div>
{:else} {:else}
<div> <div>Page: {page} of {aniListWatchListLoaded.data.Page.pageInfo.lastPage}</div>
Page: {page} of {aniListWatchListLoaded.data.Page.pageInfo.lastPage}
</div>
{/if} {/if}
</div> </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"}
disabled={page <= 1}
>
<svg
class="w-3 h-3 text-white"
aria-hidden="true"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 18 2"
>
<path
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M1 1h16"
/>
</svg> </svg>
</button> </button>
<input <input type="number" min="1" max="{aniListWatchListLoaded.data.Page.pageInfo.lastPage}"
type="number" on:keydown={changePage} id="page-counter"
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" 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} value={page} required/>
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">
/>
<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> <span>Page #</span>
</div> </div>
<button <button type="button" id="increment-button" on:click={() => ChangeWatchListPage(page+1)}
type="button" 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">
id="increment-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 18">
class={page >= aniListWatchListLoaded.data.Page.pageInfo.lastPage <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
? "border-gray-600 border rounded-e-lg p-3 h-11 focus:ring-gray-700 focus:ring-2 focus:outline-none" d="M9 1v16M1 9h16"/>
: "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> </svg>
</button> </button>
</div> </div>

View File

@@ -5,51 +5,31 @@
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} {#each aniListWatchListLoaded.data.Page.mediaList as media}
<div <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">
use:loader={loading}
class="aspect-h-1 aspect-w-1 w-full overflow-hidden rounded-lg xl:aspect-h-8 xl:aspect-w-7"
>
<div class="flex flex-col items-center group"> <div class="flex flex-col items-center group">
<button <button on:click={() => {
on:click={() => { push(`#/anime/${media.media.id}`)
push(`#/anime/${media.media.id}`);
// loading.set(true) // loading.set(true)
// GetAniListSingleItem(media.media.id, true).then(() => { // GetAniListSingleItem(media.media.id, true).then(() => {
// loading.set(false) // loading.set(false)
@@ -57,38 +37,27 @@
// }) // })
}} }}
> >
<img <img class="rounded-lg" src={media.media.coverImage.large} alt={
class="rounded-lg w-[230px] h-[330px] object-cover" media.media.title.english === "" ?
src={media.media.coverImage.large} media.media.title.romaji :
alt={media.media.title.english === "" media.media.title.english
? media.media.title.romaji }/>
: media.media.title.english}
/>
</button> </button>
<Rating <Rating id="anime-rating" total={5} size={35} rating={media.score/2.0}/>
id="anime-rating" <button class="mt-4 text-md font-semibold text-white-700"
total={5} on:click={() => GetAnimeSingleItem(media.media.id, true)}>
size={35} {
rating={media.score / 2.0} media.media.title.english === "" ?
/> media.media.title.romaji :
<button media.media.title.english
class="mt-4 text-md font-semibold text-white-700" }
on:click={() => GetAnimeSingleItem(media.media.id, true)}
>
{media.media.title.english === ""
? media.media.title.romaji
: media.media.title.english}
</button> </button>
<p class="mt-1 text-lg font-medium text-white-900"> <p class="mt-1 text-lg font-medium text-white-900">{media.progress}
{media.progress} / {media.media.nextAiringEpisode.episode !== 0 ?
/ {media.media.nextAiringEpisode.episode !== 0 media.media.nextAiringEpisode.episode - 1 : media.media.episodes}</p>
? media.media.nextAiringEpisode.episode - 1
: media.media.episodes}
</p>
{#if media.media.episodes > 0} {#if media.media.episodes > 0}
<p class="mt-1 text-lg font-medium text-white-900"> <p class="mt-1 text-lg font-medium text-white-900">Total
Total Episodes: {media.media.episodes} Episodes: {media.media.episodes}</p>
</p>
{/if} {/if}
</div> </div>
</div> </div>

View File

@@ -10,178 +10,153 @@
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;
finalResult = aniListResult;
if (login === false) { if (login === false) {
finalResult.data.MediaList.status = ""; finalResult.data.MediaList.status = ""
finalResult.data.MediaList.score = 0; finalResult.data.MediaList.score = 0
finalResult.data.MediaList.progress = 0; finalResult.data.MediaList.progress = 0
finalResult.data.MediaList.notes = ""; finalResult.data.MediaList.notes = ""
finalResult.data.MediaList.repeat = 0; finalResult.data.MediaList.repeat = 0
finalResult.data.MediaList.startedAt.day = 0; finalResult.data.MediaList.startedAt.day = 0
finalResult.data.MediaList.startedAt.month = 0; finalResult.data.MediaList.startedAt.month = 0
finalResult.data.MediaList.startedAt.year = 0; finalResult.data.MediaList.startedAt.year = 0
finalResult.data.MediaList.completedAt.day = 0; finalResult.data.MediaList.completedAt.day = 0
finalResult.data.MediaList.completedAt.month = 0; finalResult.data.MediaList.completedAt.month = 0
finalResult.data.MediaList.completedAt.year = 0; finalResult.data.MediaList.completedAt.year = 0
} }
aniListAnime.set(finalResult); aniListAnime.set(finalResult)
title.set( title.set(currentAniListAnime.data.MediaList.media.title.english === "" ?
currentAniListAnime.data.MediaList.media.title.english === "" currentAniListAnime.data.MediaList.media.title.romaji :
? currentAniListAnime.data.MediaList.media.title.romaji currentAniListAnime.data.MediaList.media.title.english)
: currentAniListAnime.data.MediaList.media.title.english, })
);
});
if (isMalLoggedIn) { if (isMalLoggedIn) {
await GetMyAnimeListAnime( await GetMyAnimeListAnime(currentAniListAnime.data.MediaList.media.idMal).then(malResult => {
currentAniListAnime.data.MediaList.media.idMal, malAnime.set(malResult)
).then((malResult) => { })
malAnime.set(malResult);
});
} }
if (isSimklLoggedIn) { if (isSimklLoggedIn) {
await SimklSearch(currentAniListAnime.data.MediaList).then( await SimklSearch(currentAniListAnime.data.MediaList).then((value: SimklAnime) => {
(value: SimklAnime) => { simklAnime.set(value)
simklAnime.set(value); })
},
);
} }
return ""; return ""
} }
export function loginToSimkl(): void { export function loginToSimkl(): void {
GetSimklLoggedInUser().then((user) => { GetSimklLoggedInUser().then(user => {
if (Object.keys(user).length === 0) { if (Object.keys(user).length === 0) {
simklLoggedIn.set(false); simklLoggedIn.set(false)
} else { } else {
simklUser.set(user); simklUser.set(user)
SimklGetUserWatchlist().then((result) => { SimklGetUserWatchlist().then(result => {
simklWatchList.set(result); simklWatchList.set(result)
simklLoggedIn.set(true); simklLoggedIn.set(true)
}); })
} }
}); })
} }
export function loginToAniList(): void { export function loginToAniList(): void {
GetAniListLoggedInUser().then((result) => { GetAniListLoggedInUser().then(result => {
aniListUser.set(result); aniListUser.set(result)
if (isAniListPrimary) { if (isAniListPrimary) {
GetAniListUserWatchingList( GetAniListUserWatchingList(page, perPage, MediaListSort.UpdatedTimeDesc).then((result) => {
page, aniListWatchlist.set(result)
perPage, aniListLoggedIn.set(true)
MediaListSort.UpdatedTimeDesc, })
).then((result) => {
aniListWatchlist.set(result);
aniListLoggedIn.set(true);
});
} else { } else {
aniListLoggedIn.set(true); aniListLoggedIn.set(true)
} }
}); })
} }
export function loginToMAL(): void { export function loginToMAL(): void {
GetMyAnimeListLoggedInUser().then((result) => { GetMyAnimeListLoggedInUser().then(result => {
malUser.set(result); malUser.set(result)
malLoggedIn.set(true); malLoggedIn.set(true)
}); })
} }
export function logoutOfAniList(): void { export function logoutOfAniList(): void {
LogoutAniList().then((result) => { LogoutAniList().then(result => {
console.log(result); console.log(result)
if (Object.keys(aniWatchlist).length !== 0) { if (Object.keys(aniWatchlist).length !== 0) {
aniListWatchlist.set({} as AniListCurrentUserWatchList); aniListWatchlist.set({} as AniListCurrentUserWatchList)
} }
aniListUser.set({} as AniListUser); aniListUser.set({} as AniListUser)
aniListLoggedIn.set(false); aniListLoggedIn.set(false)
}); })
} }
export function logoutOfMAL(): void { export function logoutOfMAL(): void {
LogoutMyAnimeList().then((result) => { LogoutMyAnimeList().then(result => {
console.log(result); console.log(result)
malUser.set({} as MyAnimeListUser); malUser.set({} as MyAnimeListUser)
malLoggedIn.set(false); malLoggedIn.set(false)
}); })
} }
export function logoutOfSimkl(): void { export function logoutOfSimkl(): void {
LogoutSimkl().then((result) => { LogoutSimkl().then(result => {
console.log(result); console.log(result)
simklUser.set({} as SimklUser); simklUser.set({} as SimklUser)
simklLoggedIn.set(false); simklLoggedIn.set(false)
}); })
} }
</script> </script>

View File

@@ -12,6 +12,6 @@
}, },
"info": { "info": {
"productName": "AniTrack", "productName": "AniTrack",
"productVersion": "0.6.5" "productVersion": "0.5.1"
} }
} }