Incremented version from 0.5.3 to 0.6.0 for release with new features.
This release includes:
- Smart watchlist refresh on navigation
- Improved WatchList UI with manual refresh button
- Client-side routing for logo navigation
- Better UX with automatic data updates
Version bump reflects significant feature additions and improvements to the user experience.
Enhanced the WatchList component with better layout and manual refresh functionality.
Changes:
- Added Refresh WatchList button with loading state handling
- Restructured header layout using flexbox with justify-between
- Title on left, refresh button on right, vertically aligned with items-center
- Improved button styling with consistent py-2 px-4 padding
- Added CheckIfAniListLoggedInAndLoadWatchList import for refresh functionality
- Maintained mb-4 spacing for consistent vertical rhythm
This gives users manual control over watchlist updates and provides better visual balance to the header section.
UI improvements:
- Horizontal flex container for proper left/right alignment
- Responsive button sizing
- Clear visual separation between title and action
Added intelligent watchlist refresh mechanism that only refetches data when changes are actually made, preventing unnecessary API calls and improving performance.
Changes:
- Added watchlistNeedsRefresh store to track when watchlist data has changed
- Implemented reactive watcher in App.svelte that uses svelte-spa-router's loc store to detect navigation to home
- Set dirty flag in Anime.svelte after successful status updates and entry deletions
- Added conditional refresh logic that checks user's primary service (AniList, MAL, or Simkl)
- Parallel refresh support for multiple services when logged in
This resolves the issue where clicking the logo would cause full page reloads and unnecessary re-authentication checks, while also ensuring watchlist data stays current when users make changes.
Technical details:
- Uses $loc.location to detect route changes
- IIFE pattern for async operations in reactive statements
- Only refreshes for logged-in primary services
- Flag resets after successful refresh
Related to: Header.svelte client-side routing fix
- Add try-catch-finally error handling to handleSubmit and deleteEntries
functions to ensure submitting state is always reset, even when API calls
fail or timeout. This fixes the infinite loading spinner bug.
- Preserve genres field after AniList updates, matching the existing tags
preservation pattern. Prevents genres array from being lost after form
submission, which was causing "{#each} only works with iterable values"
error when the page re-rendered.
- Add fallback (|| []) to genres each block to prevent rendering errors
when genres is undefined or null for entries without genre data.
These fixes ensure robust error handling and data consistency during anime
list updates across AniList, MAL, and Simkl services.
Fixes: submit button spinner never stopping after form submission
Fixes: "{#each} only works with iterable values" error on genres display
Add *.tar.gz pattern to build directory exclusion in .gitignore to prevent
build artifacts like Anitrack-0.5.2.tar.gz from being committed to the
repository. These generated files are ephemeral build outputs that should
not be tracked in version control.
Bug: Every click of the logo would consistently do a full page reload
- Logo clicking now uses svelte-spa-router's link
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.
Remove all .http test files and environment configuration used for API testing.
These files were used during development for testing AniList, MAL, and Simkl API endpoints
but are no longer needed as the application has matured.
Removed files:
- rest/AniTrack/ - AniList API test endpoints (search, queries, mutations, OAuth)
- rest/MAL/ - MyAnimeList API test endpoints (OAuth, anime lists, updates)
- rest/Simkl/ - Simkl API test endpoints (OAuth, watchlist, updates)
- rest/http-client.env.json - Environment configuration for test files
Add the genre field to the AniList Search GraphQL query in the Bruno API
collection. This keeps the API documentation collection in sync with the
application's query structure, allowing for testing and verification of
genre data retrieval from the AniList API.
Regenerate the Wails TypeScript models to include the new Genres field
in the MediaList type definition. This is an auto-generated file that
reflects the updated Go backend type structure with the genres []string
field added to the media object.
- Anime.svelte: Add genre display section with clickable badges that link
to AniList search results for each genre. Genres are now displayed above
the existing tags section with consistent styling.
- WebsiteLink.svelte: Enhance component to support custom URLs via the `url`
export parameter. Previously, the component only generated URLs based on
service prefixes (a-, m-, s-). Now it accepts a direct URL parameter for
flexible linking to AniList searches and other external resources.
These changes provide users with an improved browsing experience by making
genres interactive and easily searchable.
Update the AniListCurrentUserWatchListType TypeScript interface to include
the genres field as a string array, matching the updated backend Go type
definition. This ensures type safety and proper IDE autocomplete when
working with genre data in the frontend.
Add the `genres` field to AniList GraphQL queries and type definitions:
- Add genres field to GetAniListItem query for fetching single anime details
- Add genres field to AniListSearch query for search results
- Add genres field to GetAniListUserWatchingList query for user's watch list
- Update MediaList type definition to include Genres []string field
This enhancement allows the application to retrieve and display anime genre
information from the AniList API, providing users with better categorization
and discovery capabilities.