+ return $this->switchViewType($id, $request, 'books');
+ }
+
+ /**
+ * Update the user's preferred shelf-list display setting.
+ */
+ public function switchShelvesView(Request $request, int $id)
+ {
+ return $this->switchViewType($id, $request, 'bookshelves');
+ }
+
+ /**
+ * Update the user's preferred shelf-view book list display setting.
+ */
+ public function switchShelfView(Request $request, int $id)
+ {
+ return $this->switchViewType($id, $request, 'bookshelf');
+ }
+
+ /**
+ * For a type of list, switch with stored view type for a user.
+ */
+ protected function switchViewType(int $userId, Request $request, string $listName)
+ {
+ $this->checkPermissionOrCurrentUser('users-manage', $userId);
+
+ $viewType = $request->get('view_type');
+ if (!in_array($viewType, ['grid', 'list'])) {
+ $viewType = 'list';
+ }
+
+ $user = $this->userRepo->getById($userId);
+ $key = $listName . '_view_type';
+ setting()->putUser($user, $key, $viewType);
+
+ return redirect()->back(302, [], "/settings/users/$userId");
+ }
+
+ /**
+ * Change the stored sort type for a particular view.
+ */
+ public function changeSort(Request $request, string $id, string $type)
+ {
+ $validSortTypes = ['books', 'bookshelves', 'shelf_books'];
+ if (!in_array($type, $validSortTypes)) {
+ return redirect()->back(500);
+ }
+
+ return $this->changeListSort($id, $request, $type);
+ }
+
+ /**
+ * Toggle dark mode for the current user.
+ */
+ public function toggleDarkMode()
+ {
+ $enabled = setting()->getForCurrentUser('dark-mode-enabled', false);
+ setting()->putUser(user(), 'dark-mode-enabled', $enabled ? 'false' : 'true');
+
+ return redirect()->back();
+ }
+
+ /**
+ * Update the stored section expansion preference for the given user.
+ */
+ public function updateExpansionPreference(Request $request, string $id, string $key)
+ {
+ $this->checkPermissionOrCurrentUser('users-manage', $id);
+ $keyWhitelist = ['home-details'];
+ if (!in_array($key, $keyWhitelist)) {
+ return response('Invalid key', 500);
+ }
+
+ $newState = $request->get('expand', 'false');
+