From b7f9b0aff74778786d6aaa50ff77bff9fdf69c4b Mon Sep 17 00:00:00 2001 From: User Date: Fri, 7 Feb 2025 18:24:52 -0500 Subject: [PATCH] 0.1.5 --- .../Commands/CleanupReadingHistories.php | 2 +- app/Http/Controllers/ComicController.php | 19 +- app/Http/Controllers/PagesController.php | 5 +- app/Http/Resources/UserCollection.php | 3 +- app/Models/User.php | 9 + bun.lockb | Bin 171159 -> 178520 bytes composer.lock | 354 +++++++++--------- package.json | 30 +- resources/js/Pages/Comic/Chapters.jsx | 6 +- resources/js/Pages/Comic/Histories.jsx | 22 +- resources/js/Pages/Comic/HistoriesByComic.jsx | 34 +- resources/js/Pages/Comic/Index.jsx | 16 +- resources/js/Pages/Pages/Updates.jsx | 13 + resources/js/app.jsx | 2 +- resources/js/components/ui/app-sidebar.jsx | 26 +- resources/views/app.blade.php | 2 +- routes/web.php | 6 +- 17 files changed, 304 insertions(+), 245 deletions(-) diff --git a/app/Console/Commands/CleanupReadingHistories.php b/app/Console/Commands/CleanupReadingHistories.php index f7f0113..6ea0932 100644 --- a/app/Console/Commands/CleanupReadingHistories.php +++ b/app/Console/Commands/CleanupReadingHistories.php @@ -63,7 +63,7 @@ class CleanupReadingHistories extends Command /** * Clean up duplicate reading histories for a single user. * - * @param \App\Models\User $user + * @param User $user * @return void */ protected function cleanUpForUser(User $user): void diff --git a/app/Http/Controllers/ComicController.php b/app/Http/Controllers/ComicController.php index 32ad4f7..f5192cc 100644 --- a/app/Http/Controllers/ComicController.php +++ b/app/Http/Controllers/ComicController.php @@ -59,6 +59,21 @@ class ComicController extends Controller return str_replace(array_keys($this->zhConversion::ZH_TO_HANT), array_values($this->zhConversion::ZH_TO_HANT), $string); } + public function toggleHistory(Request $request): JsonResponse + { + if ($request->session()->has('historyDisabled')) { + $newValue = !$request->session()->get('historyDisabled'); + } else { + $newValue = true; + } + + // Put Session + $request->session()->put('historyDisabled', $newValue); + + // Return to frontend + return response()->json(['historyDisabled' => $newValue]); + } + /** * Show user favourites * @@ -323,7 +338,9 @@ class ComicController extends Controller ImageUpsert::dispatch($comicObj->id, $chapterObj->id, $chapter); // Update history - $request->user()->readingHistories()->attach($chapterObj->id, ['comic_id' => $comicObj->id]); + if (!$request->session()->get('historyDisabled', false)) { + $request->user()->readingHistories()->attach($chapterObj->id, ['comic_id' => $comicObj->id]); + } // Get chapters from DB $chapters = $comicObj->chapters()->where('metadata->group_path_word', $chapter['chapter']['group_path_word'])->orderBy('order')->get(['name', 'chapter_uuid']); diff --git a/app/Http/Controllers/PagesController.php b/app/Http/Controllers/PagesController.php index 060129c..0267e2d 100644 --- a/app/Http/Controllers/PagesController.php +++ b/app/Http/Controllers/PagesController.php @@ -13,13 +13,12 @@ class PagesController { /** - * @param Request $request * @param string $path * @return ResponseFactory|Application|\Illuminate\Http\Response|Response */ - public function show(Request $request, string $path = '') + public function show(string $path = '') { - if (!File::exists(resource_path("js/Pages/Pages/$path.jsx"))) { + if (!File::exists(resource_path("js/Pages/Pages/{$path}.jsx"))) { return response('Page not found', 404); } diff --git a/app/Http/Resources/UserCollection.php b/app/Http/Resources/UserCollection.php index a6f2be2..e3f65e2 100644 --- a/app/Http/Resources/UserCollection.php +++ b/app/Http/Resources/UserCollection.php @@ -19,7 +19,8 @@ class UserCollection extends ResourceCollection 'name' => $request->user()->name, 'email' => $request->user()->email, 'settings' => $request->user()->settings, - 'favourites' => $request->user()->favourites()->get(['pathword'])->pluck('pathword') + 'favourites' => $request->user()->favourites()->get(['pathword'])->pluck('pathword'), + 'historyDisabled' => $request->session()->get('historyDisabled', false), ]; } } diff --git a/app/Models/User.php b/app/Models/User.php index aabadc8..fda6e55 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -55,16 +55,25 @@ class User extends Authenticatable implements MustVerifyEmail ]; } + /** + * @return BelongsToMany + */ public function favourites(): BelongsToMany { return $this->belongsToMany(Comic::class, 'user_favourite')->withTimestamps(); } + /** + * @return BelongsToMany + */ public function readingHistories(): BelongsToMany { return $this->belongsToMany(Chapter::class, 'reading_histories')->withTimestamps(); } + /** + * @return array + */ public function cleanUpReadingHistories(): array { // Get the user's ID diff --git a/bun.lockb b/bun.lockb index 7d3305ecf0e6e3387eadd8d3b5ac1bb47d737c55..2c15e1bab2f09e6e9013ea2772cc0244811510b4 100755 GIT binary patch delta 25080 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 W%o=C#+Qox1`14xDVWaqtw*Mblzi*WQ delta 21069 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.17.0 <10.25.0" }, "require-dev": { - "illuminate/collections": "^10.0|^11.0", + "illuminate/collections": "^10.0|^11.0|^12.0", "mockery/mockery": "^1.5", "pestphp/pest": "^2.3|^3.4", "phpstan/phpstan": "^1.11", @@ -1536,38 +1537,38 @@ "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.3.3" + "source": "https://github.com/laravel/prompts/tree/v0.3.4" }, - "time": "2024-12-30T15:53:31+00:00" + "time": "2025-01-24T15:41:01+00:00" }, { "name": "laravel/sanctum", - "version": "v4.0.7", + "version": "v4.0.8", "source": { "type": "git", "url": "https://github.com/laravel/sanctum.git", - "reference": "698064236a46df016e64a7eb059b1414e0b281df" + "reference": "ec1dd9ddb2ab370f79dfe724a101856e0963f43c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sanctum/zipball/698064236a46df016e64a7eb059b1414e0b281df", - "reference": "698064236a46df016e64a7eb059b1414e0b281df", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/ec1dd9ddb2ab370f79dfe724a101856e0963f43c", + "reference": "ec1dd9ddb2ab370f79dfe724a101856e0963f43c", "shasum": "" }, "require": { "ext-json": "*", - "illuminate/console": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/database": "^11.0", - "illuminate/support": "^11.0", + "illuminate/console": "^11.0|^12.0", + "illuminate/contracts": "^11.0|^12.0", + "illuminate/database": "^11.0|^12.0", + "illuminate/support": "^11.0|^12.0", "php": "^8.2", "symfony/console": "^7.0" }, "require-dev": { "mockery/mockery": "^1.6", - "orchestra/testbench": "^9.0", + "orchestra/testbench": "^9.0|^10.0", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.5" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { @@ -1602,29 +1603,29 @@ "issues": "https://github.com/laravel/sanctum/issues", "source": "https://github.com/laravel/sanctum" }, - "time": "2024-12-11T16:40:21+00:00" + "time": "2025-01-26T19:34:36+00:00" }, { "name": "laravel/serializable-closure", - "version": "v2.0.1", + "version": "v2.0.2", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "613b2d4998f85564d40497e05e89cb6d9bd1cbe8" + "reference": "2e1a362527783bcab6c316aad51bf36c5513ae44" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/613b2d4998f85564d40497e05e89cb6d9bd1cbe8", - "reference": "613b2d4998f85564d40497e05e89cb6d9bd1cbe8", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/2e1a362527783bcab6c316aad51bf36c5513ae44", + "reference": "2e1a362527783bcab6c316aad51bf36c5513ae44", "shasum": "" }, "require": { "php": "^8.1" }, "require-dev": { - "illuminate/support": "^10.0|^11.0", + "illuminate/support": "^10.0|^11.0|^12.0", "nesbot/carbon": "^2.67|^3.0", - "pestphp/pest": "^2.36", + "pestphp/pest": "^2.36|^3.0", "phpstan/phpstan": "^2.0", "symfony/var-dumper": "^6.2.0|^7.0.0" }, @@ -1663,26 +1664,26 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2024-12-16T15:26:28+00:00" + "time": "2025-01-24T15:42:37+00:00" }, { "name": "laravel/tinker", - "version": "v2.10.0", + "version": "v2.10.1", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5" + "reference": "22177cc71807d38f2810c6204d8f7183d88a57d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/ba4d51eb56de7711b3a37d63aa0643e99a339ae5", - "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5", + "url": "https://api.github.com/repos/laravel/tinker/zipball/22177cc71807d38f2810c6204d8f7183d88a57d3", + "reference": "22177cc71807d38f2810c6204d8f7183d88a57d3", "shasum": "" }, "require": { - "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", - "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", "php": "^7.2.5|^8.0", "psy/psysh": "^0.11.1|^0.12.0", "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0" @@ -1690,10 +1691,10 @@ "require-dev": { "mockery/mockery": "~1.3.3|^1.4.2", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^8.5.8|^9.3.3" + "phpunit/phpunit": "^8.5.8|^9.3.3|^10.0" }, "suggest": { - "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0)." + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0)." }, "type": "library", "extra": { @@ -1727,9 +1728,9 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.10.0" + "source": "https://github.com/laravel/tinker/tree/v2.10.1" }, - "time": "2024-09-23T13:32:56+00:00" + "time": "2025-01-27T14:24:01+00:00" }, { "name": "league/commonmark", @@ -3852,16 +3853,16 @@ }, { "name": "sentry/sentry-laravel", - "version": "4.10.2", + "version": "4.12.0", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-laravel.git", - "reference": "0e2e5bc4311da51349487afcf67b8fca937f6d94" + "reference": "da1ee3417dfb3576a6aaa0f8b25892ebdb98fdb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/0e2e5bc4311da51349487afcf67b8fca937f6d94", - "reference": "0e2e5bc4311da51349487afcf67b8fca937f6d94", + "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/da1ee3417dfb3576a6aaa0f8b25892ebdb98fdb0", + "reference": "da1ee3417dfb3576a6aaa0f8b25892ebdb98fdb0", "shasum": "" }, "require": { @@ -3925,7 +3926,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-laravel/issues", - "source": "https://github.com/getsentry/sentry-laravel/tree/4.10.2" + "source": "https://github.com/getsentry/sentry-laravel/tree/4.12.0" }, "funding": [ { @@ -3937,7 +3938,7 @@ "type": "custom" } ], - "time": "2024-12-17T11:38:58+00:00" + "time": "2025-02-05T13:13:03+00:00" }, { "name": "symfony/clock", @@ -4240,16 +4241,16 @@ }, { "name": "symfony/error-handler", - "version": "v7.2.1", + "version": "v7.2.3", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "6150b89186573046167796fa5f3f76601d5145f8" + "reference": "959a74d044a6db21f4caa6d695648dcb5584cb49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/6150b89186573046167796fa5f3f76601d5145f8", - "reference": "6150b89186573046167796fa5f3f76601d5145f8", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/959a74d044a6db21f4caa6d695648dcb5584cb49", + "reference": "959a74d044a6db21f4caa6d695648dcb5584cb49", "shasum": "" }, "require": { @@ -4295,7 +4296,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.2.1" + "source": "https://github.com/symfony/error-handler/tree/v7.2.3" }, "funding": [ { @@ -4311,7 +4312,7 @@ "type": "tidelift" } ], - "time": "2024-12-07T08:50:44+00:00" + "time": "2025-01-07T09:39:55+00:00" }, { "name": "symfony/event-dispatcher", @@ -4535,16 +4536,16 @@ }, { "name": "symfony/http-foundation", - "version": "v7.2.2", + "version": "v7.2.3", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "62d1a43796ca3fea3f83a8470dfe63a4af3bc588" + "reference": "ee1b504b8926198be89d05e5b6fc4c3810c090f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/62d1a43796ca3fea3f83a8470dfe63a4af3bc588", - "reference": "62d1a43796ca3fea3f83a8470dfe63a4af3bc588", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ee1b504b8926198be89d05e5b6fc4c3810c090f0", + "reference": "ee1b504b8926198be89d05e5b6fc4c3810c090f0", "shasum": "" }, "require": { @@ -4593,7 +4594,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.2.2" + "source": "https://github.com/symfony/http-foundation/tree/v7.2.3" }, "funding": [ { @@ -4609,20 +4610,20 @@ "type": "tidelift" } ], - "time": "2024-12-30T19:00:17+00:00" + "time": "2025-01-17T10:56:55+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.2.2", + "version": "v7.2.3", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "3c432966bd8c7ec7429663105f5a02d7e75b4306" + "reference": "caae9807f8e25a9b43ce8cc6fafab6cf91f0cc9b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/3c432966bd8c7ec7429663105f5a02d7e75b4306", - "reference": "3c432966bd8c7ec7429663105f5a02d7e75b4306", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/caae9807f8e25a9b43ce8cc6fafab6cf91f0cc9b", + "reference": "caae9807f8e25a9b43ce8cc6fafab6cf91f0cc9b", "shasum": "" }, "require": { @@ -4707,7 +4708,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.2.2" + "source": "https://github.com/symfony/http-kernel/tree/v7.2.3" }, "funding": [ { @@ -4723,20 +4724,20 @@ "type": "tidelift" } ], - "time": "2024-12-31T14:59:40+00:00" + "time": "2025-01-29T07:40:13+00:00" }, { "name": "symfony/mailer", - "version": "v7.2.0", + "version": "v7.2.3", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "e4d358702fb66e4c8a2af08e90e7271a62de39cc" + "reference": "f3871b182c44997cf039f3b462af4a48fb85f9d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/e4d358702fb66e4c8a2af08e90e7271a62de39cc", - "reference": "e4d358702fb66e4c8a2af08e90e7271a62de39cc", + "url": "https://api.github.com/repos/symfony/mailer/zipball/f3871b182c44997cf039f3b462af4a48fb85f9d3", + "reference": "f3871b182c44997cf039f3b462af4a48fb85f9d3", "shasum": "" }, "require": { @@ -4787,7 +4788,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.2.0" + "source": "https://github.com/symfony/mailer/tree/v7.2.3" }, "funding": [ { @@ -4803,20 +4804,20 @@ "type": "tidelift" } ], - "time": "2024-11-25T15:21:05+00:00" + "time": "2025-01-27T11:08:17+00:00" }, { "name": "symfony/mime", - "version": "v7.2.1", + "version": "v7.2.3", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "7f9617fcf15cb61be30f8b252695ed5e2bfac283" + "reference": "2fc3b4bd67e4747e45195bc4c98bea4628476204" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/7f9617fcf15cb61be30f8b252695ed5e2bfac283", - "reference": "7f9617fcf15cb61be30f8b252695ed5e2bfac283", + "url": "https://api.github.com/repos/symfony/mime/zipball/2fc3b4bd67e4747e45195bc4c98bea4628476204", + "reference": "2fc3b4bd67e4747e45195bc4c98bea4628476204", "shasum": "" }, "require": { @@ -4871,7 +4872,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.2.1" + "source": "https://github.com/symfony/mime/tree/v7.2.3" }, "funding": [ { @@ -4887,7 +4888,7 @@ "type": "tidelift" } ], - "time": "2024-12-07T08:50:44+00:00" + "time": "2025-01-27T11:08:17+00:00" }, { "name": "symfony/options-resolver", @@ -5738,16 +5739,16 @@ }, { "name": "symfony/routing", - "version": "v7.2.0", + "version": "v7.2.3", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e" + "reference": "ee9a67edc6baa33e5fae662f94f91fd262930996" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/e10a2450fa957af6c448b9b93c9010a4e4c0725e", - "reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e", + "url": "https://api.github.com/repos/symfony/routing/zipball/ee9a67edc6baa33e5fae662f94f91fd262930996", + "reference": "ee9a67edc6baa33e5fae662f94f91fd262930996", "shasum": "" }, "require": { @@ -5799,7 +5800,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.2.0" + "source": "https://github.com/symfony/routing/tree/v7.2.3" }, "funding": [ { @@ -5815,7 +5816,7 @@ "type": "tidelift" } ], - "time": "2024-11-25T11:08:51+00:00" + "time": "2025-01-17T10:56:55+00:00" }, { "name": "symfony/service-contracts", @@ -6236,16 +6237,16 @@ }, { "name": "symfony/var-dumper", - "version": "v7.2.0", + "version": "v7.2.3", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c" + "reference": "82b478c69745d8878eb60f9a049a4d584996f73a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c6a22929407dec8765d6e2b6ff85b800b245879c", - "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/82b478c69745d8878eb60f9a049a4d584996f73a", + "reference": "82b478c69745d8878eb60f9a049a4d584996f73a", "shasum": "" }, "require": { @@ -6299,7 +6300,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.2.0" + "source": "https://github.com/symfony/var-dumper/tree/v7.2.3" }, "funding": [ { @@ -6315,20 +6316,20 @@ "type": "tidelift" } ], - "time": "2024-11-08T15:48:14+00:00" + "time": "2025-01-17T11:39:41+00:00" }, { "name": "tightenco/ziggy", - "version": "v2.4.2", + "version": "v2.5.1", "source": { "type": "git", "url": "https://github.com/tighten/ziggy.git", - "reference": "6612c8c9b2d5b3e74fd67c58c11465df1273f384" + "reference": "40df446f6053787edb245381c3b3d80b031b5fc0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tighten/ziggy/zipball/6612c8c9b2d5b3e74fd67c58c11465df1273f384", - "reference": "6612c8c9b2d5b3e74fd67c58c11465df1273f384", + "url": "https://api.github.com/repos/tighten/ziggy/zipball/40df446f6053787edb245381c3b3d80b031b5fc0", + "reference": "40df446f6053787edb245381c3b3d80b031b5fc0", "shasum": "" }, "require": { @@ -6383,9 +6384,9 @@ ], "support": { "issues": "https://github.com/tighten/ziggy/issues", - "source": "https://github.com/tighten/ziggy/tree/v2.4.2" + "source": "https://github.com/tighten/ziggy/tree/v2.5.1" }, - "time": "2025-01-02T20:06:52+00:00" + "time": "2025-01-31T19:23:01+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -6924,16 +6925,16 @@ }, { "name": "filp/whoops", - "version": "2.16.0", + "version": "2.17.0", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "befcdc0e5dce67252aa6322d82424be928214fa2" + "reference": "075bc0c26631110584175de6523ab3f1652eb28e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/befcdc0e5dce67252aa6322d82424be928214fa2", - "reference": "befcdc0e5dce67252aa6322d82424be928214fa2", + "url": "https://api.github.com/repos/filp/whoops/zipball/075bc0c26631110584175de6523ab3f1652eb28e", + "reference": "075bc0c26631110584175de6523ab3f1652eb28e", "shasum": "" }, "require": { @@ -6983,7 +6984,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.16.0" + "source": "https://github.com/filp/whoops/tree/2.17.0" }, "funding": [ { @@ -6991,7 +6992,7 @@ "type": "github" } ], - "time": "2024-09-25T12:00:00+00:00" + "time": "2025-01-25T12:00:00+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -7046,16 +7047,16 @@ }, { "name": "laravel/breeze", - "version": "v2.3.2", + "version": "v2.3.3", "source": { "type": "git", "url": "https://github.com/laravel/breeze.git", - "reference": "2a4764055792b14e0e571a710adbda9c9eb300d4" + "reference": "c40f7fce4fd80e39c7f4317697eeba21d2344003" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/breeze/zipball/2a4764055792b14e0e571a710adbda9c9eb300d4", - "reference": "2a4764055792b14e0e571a710adbda9c9eb300d4", + "url": "https://api.github.com/repos/laravel/breeze/zipball/c40f7fce4fd80e39c7f4317697eeba21d2344003", + "reference": "c40f7fce4fd80e39c7f4317697eeba21d2344003", "shasum": "" }, "require": { @@ -7103,39 +7104,39 @@ "issues": "https://github.com/laravel/breeze/issues", "source": "https://github.com/laravel/breeze" }, - "time": "2025-01-21T14:57:42+00:00" + "time": "2025-01-26T19:08:50+00:00" }, { "name": "laravel/pail", - "version": "v1.2.1", + "version": "v1.2.2", "source": { "type": "git", "url": "https://github.com/laravel/pail.git", - "reference": "353ac12134b98e2e7c3333d916bd3e523931e583" + "reference": "f31f4980f52be17c4667f3eafe034e6826787db2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pail/zipball/353ac12134b98e2e7c3333d916bd3e523931e583", - "reference": "353ac12134b98e2e7c3333d916bd3e523931e583", + "url": "https://api.github.com/repos/laravel/pail/zipball/f31f4980f52be17c4667f3eafe034e6826787db2", + "reference": "f31f4980f52be17c4667f3eafe034e6826787db2", "shasum": "" }, "require": { "ext-mbstring": "*", - "illuminate/console": "^10.24|^11.0", - "illuminate/contracts": "^10.24|^11.0", - "illuminate/log": "^10.24|^11.0", - "illuminate/process": "^10.24|^11.0", - "illuminate/support": "^10.24|^11.0", + "illuminate/console": "^10.24|^11.0|^12.0", + "illuminate/contracts": "^10.24|^11.0|^12.0", + "illuminate/log": "^10.24|^11.0|^12.0", + "illuminate/process": "^10.24|^11.0|^12.0", + "illuminate/support": "^10.24|^11.0|^12.0", "nunomaduro/termwind": "^1.15|^2.0", "php": "^8.2", "symfony/console": "^6.0|^7.0" }, "require-dev": { - "laravel/framework": "^10.24|^11.0", + "laravel/framework": "^10.24|^11.0|^12.0", "laravel/pint": "^1.13", - "orchestra/testbench-core": "^8.12|^9.0", - "pestphp/pest": "^2.20", - "pestphp/pest-plugin-type-coverage": "^2.3", + "orchestra/testbench-core": "^8.13|^9.0|^10.0", + "pestphp/pest": "^2.20|^3.0", + "pestphp/pest-plugin-type-coverage": "^2.3|^3.0", "phpstan/phpstan": "^1.10", "symfony/var-dumper": "^6.3|^7.0" }, @@ -7181,7 +7182,7 @@ "issues": "https://github.com/laravel/pail/issues", "source": "https://github.com/laravel/pail" }, - "time": "2024-10-23T12:56:23+00:00" + "time": "2025-01-28T15:15:15+00:00" }, { "name": "laravel/pint", @@ -7251,28 +7252,28 @@ }, { "name": "laravel/sail", - "version": "v1.40.0", + "version": "v1.41.0", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "237e70656d8eface4839de51d101284bd5d0cf71" + "reference": "fe1a4ada0abb5e4bd99eb4e4b0d87906c00cdeec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/237e70656d8eface4839de51d101284bd5d0cf71", - "reference": "237e70656d8eface4839de51d101284bd5d0cf71", + "url": "https://api.github.com/repos/laravel/sail/zipball/fe1a4ada0abb5e4bd99eb4e4b0d87906c00cdeec", + "reference": "fe1a4ada0abb5e4bd99eb4e4b0d87906c00cdeec", "shasum": "" }, "require": { - "illuminate/console": "^9.52.16|^10.0|^11.0", - "illuminate/contracts": "^9.52.16|^10.0|^11.0", - "illuminate/support": "^9.52.16|^10.0|^11.0", + "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0", + "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0", + "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0", "php": "^8.0", "symfony/console": "^6.0|^7.0", "symfony/yaml": "^6.0|^7.0" }, "require-dev": { - "orchestra/testbench": "^7.0|^8.0|^9.0", + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", "phpstan/phpstan": "^1.10" }, "bin": [ @@ -7310,7 +7311,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2025-01-13T16:57:11+00:00" + "time": "2025-01-24T15:45:36+00:00" }, { "name": "mockery/mockery", @@ -7457,37 +7458,37 @@ }, { "name": "nunomaduro/collision", - "version": "v8.5.0", + "version": "v8.6.1", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "f5c101b929c958e849a633283adff296ed5f38f5" + "reference": "86f003c132143d5a2ab214e19933946409e0cae7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/f5c101b929c958e849a633283adff296ed5f38f5", - "reference": "f5c101b929c958e849a633283adff296ed5f38f5", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/86f003c132143d5a2ab214e19933946409e0cae7", + "reference": "86f003c132143d5a2ab214e19933946409e0cae7", "shasum": "" }, "require": { "filp/whoops": "^2.16.0", - "nunomaduro/termwind": "^2.1.0", + "nunomaduro/termwind": "^2.3.0", "php": "^8.2.0", - "symfony/console": "^7.1.5" + "symfony/console": "^7.2.1" }, "conflict": { - "laravel/framework": "<11.0.0 || >=12.0.0", - "phpunit/phpunit": "<10.5.1 || >=12.0.0" + "laravel/framework": "<11.39.1 || >=13.0.0", + "phpunit/phpunit": "<11.5.3 || >=12.0.0" }, "require-dev": { - "larastan/larastan": "^2.9.8", - "laravel/framework": "^11.28.0", - "laravel/pint": "^1.18.1", - "laravel/sail": "^1.36.0", - "laravel/sanctum": "^4.0.3", + "larastan/larastan": "^2.9.12", + "laravel/framework": "^11.39.1", + "laravel/pint": "^1.20.0", + "laravel/sail": "^1.40.0", + "laravel/sanctum": "^4.0.7", "laravel/tinker": "^2.10.0", - "orchestra/testbench-core": "^9.5.3", - "pestphp/pest": "^2.36.0 || ^3.4.0", + "orchestra/testbench-core": "^9.9.2", + "pestphp/pest": "^3.7.3", "sebastian/environment": "^6.1.0 || ^7.2.0" }, "type": "library", @@ -7525,6 +7526,7 @@ "cli", "command-line", "console", + "dev", "error", "handling", "laravel", @@ -7550,25 +7552,25 @@ "type": "patreon" } ], - "time": "2024-10-15T16:06:32+00:00" + "time": "2025-01-23T13:41:43+00:00" }, { "name": "pestphp/pest", - "version": "v3.7.2", + "version": "v3.7.4", "source": { "type": "git", "url": "https://github.com/pestphp/pest.git", - "reference": "709ecb1ba2641fc0c4653ebe1fd8a402bbf4d18b" + "reference": "4a987d3d5c4e3ba36c76fecbf56113baac2d1b2b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/709ecb1ba2641fc0c4653ebe1fd8a402bbf4d18b", - "reference": "709ecb1ba2641fc0c4653ebe1fd8a402bbf4d18b", + "url": "https://api.github.com/repos/pestphp/pest/zipball/4a987d3d5c4e3ba36c76fecbf56113baac2d1b2b", + "reference": "4a987d3d5c4e3ba36c76fecbf56113baac2d1b2b", "shasum": "" }, "require": { "brianium/paratest": "^7.7.0", - "nunomaduro/collision": "^8.5.0", + "nunomaduro/collision": "^8.6.1", "nunomaduro/termwind": "^2.3.0", "pestphp/pest-plugin": "^3.0.0", "pestphp/pest-plugin-arch": "^3.0.0", @@ -7650,7 +7652,7 @@ ], "support": { "issues": "https://github.com/pestphp/pest/issues", - "source": "https://github.com/pestphp/pest/tree/v3.7.2" + "source": "https://github.com/pestphp/pest/tree/v3.7.4" }, "funding": [ { @@ -7662,7 +7664,7 @@ "type": "github" } ], - "time": "2025-01-19T17:35:09+00:00" + "time": "2025-01-23T14:03:29+00:00" }, { "name": "pestphp/pest-plugin", @@ -7806,27 +7808,27 @@ }, { "name": "pestphp/pest-plugin-laravel", - "version": "v3.0.0", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/pestphp/pest-plugin-laravel.git", - "reference": "7dd98c0c3b3542970ec21fce80ec5c88916ac469" + "reference": "1c4e994476375c72aa7aebaaa97aa98f5d5378cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-laravel/zipball/7dd98c0c3b3542970ec21fce80ec5c88916ac469", - "reference": "7dd98c0c3b3542970ec21fce80ec5c88916ac469", + "url": "https://api.github.com/repos/pestphp/pest-plugin-laravel/zipball/1c4e994476375c72aa7aebaaa97aa98f5d5378cd", + "reference": "1c4e994476375c72aa7aebaaa97aa98f5d5378cd", "shasum": "" }, "require": { - "laravel/framework": "^11.22.0", - "pestphp/pest": "^3.0.0", + "laravel/framework": "^11.39.1|^12.0.0", + "pestphp/pest": "^3.7.4", "php": "^8.2.0" }, "require-dev": { - "laravel/dusk": "^8.2.5", - "orchestra/testbench": "^9.4.0", - "pestphp/pest-dev-tools": "^3.0.0" + "laravel/dusk": "^8.2.13|dev-develop", + "orchestra/testbench": "^9.9.0|^10.0.0", + "pestphp/pest-dev-tools": "^3.3.0" }, "type": "library", "extra": { @@ -7864,7 +7866,7 @@ "unit" ], "support": { - "source": "https://github.com/pestphp/pest-plugin-laravel/tree/v3.0.0" + "source": "https://github.com/pestphp/pest-plugin-laravel/tree/v3.1.0" }, "funding": [ { @@ -7876,7 +7878,7 @@ "type": "github" } ], - "time": "2024-09-08T23:32:52+00:00" + "time": "2025-01-24T13:22:39+00:00" }, { "name": "pestphp/pest-plugin-mutate", @@ -9694,16 +9696,16 @@ }, { "name": "symfony/yaml", - "version": "v7.2.0", + "version": "v7.2.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "099581e99f557e9f16b43c5916c26380b54abb22" + "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/099581e99f557e9f16b43c5916c26380b54abb22", - "reference": "099581e99f557e9f16b43c5916c26380b54abb22", + "url": "https://api.github.com/repos/symfony/yaml/zipball/ac238f173df0c9c1120f862d0f599e17535a87ec", + "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec", "shasum": "" }, "require": { @@ -9746,7 +9748,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.2.0" + "source": "https://github.com/symfony/yaml/tree/v7.2.3" }, "funding": [ { @@ -9762,7 +9764,7 @@ "type": "tidelift" } ], - "time": "2024-10-23T06:56:12+00:00" + "time": "2025-01-07T12:55:42+00:00" }, { "name": "ta-tikoma/phpunit-architecture-test", diff --git a/package.json b/package.json index d5f0295..131468e 100644 --- a/package.json +++ b/package.json @@ -18,24 +18,24 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "tailwindcss": "^3.4.17", - "vite": "^6.0.11" + "vite": "^6.1.0" }, "dependencies": { "@hookform/resolvers": "^3.10.0", - "@radix-ui/react-avatar": "^1.1.2", - "@radix-ui/react-checkbox": "^1.1.3", - "@radix-ui/react-collapsible": "^1.1.2", - "@radix-ui/react-dialog": "^1.1.4", - "@radix-ui/react-dropdown-menu": "^2.1.4", - "@radix-ui/react-label": "^2.1.1", - "@radix-ui/react-select": "^2.1.4", - "@radix-ui/react-separator": "^1.1.1", - "@radix-ui/react-slot": "^1.1.1", - "@radix-ui/react-switch": "^1.1.2", - "@radix-ui/react-tabs": "^1.1.2", - "@radix-ui/react-toast": "^1.2.4", - "@radix-ui/react-tooltip": "^1.1.6", - "@sentry/react": "^8.50.0", + "@radix-ui/react-avatar": "^1.1.3", + "@radix-ui/react-checkbox": "^1.1.4", + "@radix-ui/react-collapsible": "^1.1.3", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-dropdown-menu": "^2.1.6", + "@radix-ui/react-label": "^2.1.2", + "@radix-ui/react-select": "^2.1.6", + "@radix-ui/react-separator": "^1.1.2", + "@radix-ui/react-slot": "^1.1.2", + "@radix-ui/react-switch": "^1.1.3", + "@radix-ui/react-tabs": "^1.1.3", + "@radix-ui/react-toast": "^1.2.6", + "@radix-ui/react-tooltip": "^1.1.8", + "@sentry/react": "^8.54.0", "@sentry/vite-plugin": "^2.23.0", "@tanstack/react-table": "^8.20.6", "class-variance-authority": "^0.7.1", diff --git a/resources/js/Pages/Comic/Chapters.jsx b/resources/js/Pages/Comic/Chapters.jsx index 045a10a..39f38a3 100644 --- a/resources/js/Pages/Comic/Chapters.jsx +++ b/resources/js/Pages/Comic/Chapters.jsx @@ -66,7 +66,7 @@ export default function Chapters({ auth, comic, chapters, histories, offset }) { } const ComicChapterLink = (props) => { - const isNew = Date.now() - Date.parse(props.datetime_created) < 6.048e+8; + const isNew = Date.now() - Date.parse(props.datetime_created) < 6.048e+8; // 1 week const isRead = histories.includes(props.uuid); return ( @@ -226,7 +226,7 @@ export default function Chapters({ auth, comic, chapters, histories, offset }) {
- { (chapters.total > (chapters.limit + chapters.offset) && chapters.offset > 0) && ( + { (chapters.total > chapters.limit && chapters.offset > 0) && (
- +
Select @@ -120,22 +120,16 @@ export default function Histories({ auth, histories }) { )) }
-
+
- { histories.current_page > 1 && ( - - + { histories.links.map((h, i) => ( + + { h.label.includes('Previous') && } + { !h.label.includes('Previous') && !h.label.includes('Next') && { h.label } } + { h.label.includes('Next') && } - ) } - - { histories.current_page } - - { histories.current_page < histories.last_page && ( - - - - ) } + ) ) }
diff --git a/resources/js/Pages/Comic/HistoriesByComic.jsx b/resources/js/Pages/Comic/HistoriesByComic.jsx index a783854..bf41e4d 100644 --- a/resources/js/Pages/Comic/HistoriesByComic.jsx +++ b/resources/js/Pages/Comic/HistoriesByComic.jsx @@ -67,23 +67,23 @@ export default function Histories({ auth, histories }) { - { histories.map((comic, i) => - comic.histories.map((record, j) => ( - - { (j === 0) ? - - { comic.comic.comic_name } - - : null } - - - { record.chapter_name } - - - { record.read_at } - - ) ) - ) } + { histories.map((comic, i) => comic.histories.map((record, j) => ( + + { (j === 0) && + + { comic.comic.comic_name } + + } + + + { record.chapter_name } + + + + { record.read_at } + + + ) ) ) }
diff --git a/resources/js/Pages/Comic/Index.jsx b/resources/js/Pages/Comic/Index.jsx index 1a7046e..1e60d3d 100644 --- a/resources/js/Pages/Comic/Index.jsx +++ b/resources/js/Pages/Comic/Index.jsx @@ -14,9 +14,11 @@ export default function Index({ comics, offset, auth }) { const url = new URL(window.location); // searchParams - const [favourites, setFavourites] = useState(auth.user?.favourites ?? []); + const [favourites, setFavourites] = useState((auth?.user?.favourites !== null) ? auth.user.favourites : []); const { toast } = useToast(); + const itemsPerPage = 30; + /** * On click handler for the star * Do posting and make a toast @@ -84,19 +86,21 @@ export default function Index({ comics, offset, auth }) {
-
+
{ parseInt(offset) !== 0 && - + + + } + { parseInt(comics.total) > parseInt(offset) + itemsPerPage && + + } - - -
diff --git a/resources/js/Pages/Pages/Updates.jsx b/resources/js/Pages/Pages/Updates.jsx index 4354805..8861b5d 100644 --- a/resources/js/Pages/Pages/Updates.jsx +++ b/resources/js/Pages/Pages/Updates.jsx @@ -11,6 +11,19 @@ export default function Updates({ auth }) { Updates
+ + + 0.1.5 + Release: 07 Feb 2025 + + +
    +
  • General bug fixes and system improvements
  • +
  • Toggle reading history
  • +
  • Queue driver, Horizon is now default driver
  • +
+
+
0.1.4 diff --git a/resources/js/app.jsx b/resources/js/app.jsx index e2f8fa9..5944d1d 100644 --- a/resources/js/app.jsx +++ b/resources/js/app.jsx @@ -17,7 +17,7 @@ Sentry.init({ // Tracing tracesSampleRate: 0.1, // Capture 10% of the transactions // Set 'tracePropagationTargets' to control for which URLs distributed tracing should be enabled - tracePropagationTargets: ["localhost", /^https:\/\/c\.yumj\.in/], + tracePropagationTargets: [/^https:\/\/c\.yumj\.in/], // Session Replay replaysSessionSampleRate: 0.1, // This sets the sample rate at 10%. You may want to change it to 100% while in development and then sample at a lower rate in production. replaysOnErrorSampleRate: 1.0, // If you're not already sampling the entire session, change the sample rate to 100% when sampling sessions where errors occur. diff --git a/resources/js/components/ui/app-sidebar.jsx b/resources/js/components/ui/app-sidebar.jsx index 7f887a4..cc1f915 100644 --- a/resources/js/components/ui/app-sidebar.jsx +++ b/resources/js/components/ui/app-sidebar.jsx @@ -8,10 +8,15 @@ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/component import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from '@/components/ui/dropdown-menu'; import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarMenu, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem } from '@/components/ui/sidebar'; +import { useToast } from '@/hooks/use-toast.js'; + export function AppSidebar({ auth }) { const { tags } = usePage().props; const [search, setSearch] = useState(''); + const [historyDisabled, setHistoryDisabled] = useState(false); + + const { toast } = useToast(); const searchOnSubmitHandler = (e) => { e.preventDefault(); @@ -68,9 +73,22 @@ export function AppSidebar({ auth }) { const [theme, setTheme] = useState(getTheme()); + const toggleHistoryButtonHandler = () => { + axios.post(route('comics.toggleHistory')).then(res => { + setHistoryDisabled(res.data.historyDisabled); + toast({ + title: "All set", + description: `Histories are now ${ res.data.historyDisabled ? 'Disabled' : 'Enabled' }`, + }); + }); + } + useEffect(() => { setTheme(getTheme()); setThemeInHtml(getTheme()); + + // Set historyDisabled + setHistoryDisabled(auth.user.historyDisabled); }, []); return ( @@ -86,7 +104,7 @@ export function AppSidebar({ auth }) {
Comic - 0.1.4 + 0.1.5
@@ -214,13 +232,13 @@ export function AppSidebar({ auth }) { - - History On + toggleHistoryButtonHandler() }> + { (historyDisabled) ? "History Off" : "History On" } themeButtonOnclickHandler() }> <>{ theme === 'dark' ? () : () } Toggle theme - Queues + Queues Profile Favourites History diff --git a/resources/views/app.blade.php b/resources/views/app.blade.php index 2ac075e..d482c81 100644 --- a/resources/views/app.blade.php +++ b/resources/views/app.blade.php @@ -3,7 +3,7 @@ - + {{ config('app.name', 'Laravel') }} @routes @viteReactRefresh diff --git a/routes/web.php b/routes/web.php index 4151f6f..e82e0d3 100644 --- a/routes/web.php +++ b/routes/web.php @@ -7,7 +7,7 @@ use Illuminate\Support\Facades\Route; use Inertia\Inertia; // Auth protected routes -Route::controller(ComicController::class)->middleware('auth')->name('comics.')->group(function () { +Route::controller(ComicController::class)->middleware(['auth', 'verified'])->name('comics.')->group(function () { Route::get('/', 'index')->name('index'); Route::get('/author/{author}', 'author')->name('author'); Route::get('/search/{search}', 'search')->name('search'); @@ -30,13 +30,15 @@ Route::controller(ComicController::class)->middleware('auth')->name('comics.')-> Route::patch('/histories', 'patchHistories')->name('patchHistories'); Route::delete('/history/{pathword}', 'destroyHistory')->name('destroyHistory'); Route::delete('/histories', 'destroyHistories')->name('destroyHistories'); + + // History Toggle + Route::post('/toggleHistory', 'toggleHistory')->name('toggleHistory'); }); Route::controller(PagesController::class)->middleware('auth')->name('pages.')->group(function () { Route::get('/pages/{path?}', 'show')->name('show'); }); - Route::get('/dashboard', function () { return Inertia::render('Dashboard'); })->middleware(['auth', 'verified'])->name('dashboard');