Save "showNsfw" setting on server

This commit is contained in:
schroda
2025-04-21 19:18:42 +02:00
parent 2022b7028e
commit 4c1a493cf5
7 changed files with 19 additions and 10 deletions

View File

@@ -9,4 +9,5 @@
export type MetadataBrowseSettings = { export type MetadataBrowseSettings = {
hideLibraryEntries: boolean; hideLibraryEntries: boolean;
extensionLanguages: string[]; extensionLanguages: string[];
showNsfw: boolean;
}; };

View File

@@ -16,7 +16,6 @@ import { requestManager } from '@/lib/requests/RequestManager.ts';
import { NumberSetting } from '@/modules/core/components/settings/NumberSetting.tsx'; import { NumberSetting } from '@/modules/core/components/settings/NumberSetting.tsx';
import { MutableListSetting } from '@/modules/core/components/settings/MutableListSetting.tsx'; import { MutableListSetting } from '@/modules/core/components/settings/MutableListSetting.tsx';
import { TextSetting } from '@/modules/core/components/settings/text/TextSetting.tsx'; import { TextSetting } from '@/modules/core/components/settings/text/TextSetting.tsx';
import { useLocalStorage } from '@/modules/core/hooks/useStorage.tsx';
import { import {
createUpdateMetadataServerSettings, createUpdateMetadataServerSettings,
useMetadataServerSettings, useMetadataServerSettings,
@@ -47,8 +46,6 @@ export const BrowseSettings = () => {
setAction(null); setAction(null);
}, [t]); }, [t]);
const [showNsfw, setShowNsfw] = useLocalStorage<boolean>('showNsfw', true);
const { data, loading, error, refetch } = requestManager.useGetServerSettings({ const { data, loading, error, refetch } = requestManager.useGetServerSettings({
notifyOnNetworkStatusChange: true, notifyOnNetworkStatusChange: true,
}); });
@@ -64,7 +61,7 @@ export const BrowseSettings = () => {
}; };
const { const {
settings: { hideLibraryEntries }, settings: { hideLibraryEntries, showNsfw },
} = useMetadataServerSettings(); } = useMetadataServerSettings();
const updateMetadataServerSettings = createUpdateMetadataServerSettings<keyof MetadataBrowseSettings>((e) => const updateMetadataServerSettings = createUpdateMetadataServerSettings<keyof MetadataBrowseSettings>((e) =>
makeToast(t('global.error.label.failed_to_save_changes'), 'error', getErrorMessage(e)), makeToast(t('global.error.label.failed_to_save_changes'), 'error', getErrorMessage(e)),
@@ -101,7 +98,11 @@ export const BrowseSettings = () => {
primary={t('settings.label.show_nsfw')} primary={t('settings.label.show_nsfw')}
secondary={t('settings.label.show_nsfw_description')} secondary={t('settings.label.show_nsfw_description')}
/> />
<Switch edge="end" checked={showNsfw} onChange={() => setShowNsfw(!showNsfw)} /> <Switch
edge="end"
checked={showNsfw}
onChange={() => updateMetadataServerSettings('showNsfw', !showNsfw)}
/>
</ListItem> </ListItem>
<NumberSetting <NumberSetting
settingTitle={t('settings.server.requests.sources.parallel.label.title')} settingTitle={t('settings.server.requests.sources.parallel.label.title')}

View File

@@ -18,7 +18,6 @@ import { useTranslation } from 'react-i18next';
import { Link, useLocation, useNavigate } from 'react-router-dom'; import { Link, useLocation, useNavigate } from 'react-router-dom';
import { CustomTooltip } from '@/modules/core/components/CustomTooltip.tsx'; import { CustomTooltip } from '@/modules/core/components/CustomTooltip.tsx';
import { requestManager } from '@/lib/requests/RequestManager.ts'; import { requestManager } from '@/lib/requests/RequestManager.ts';
import { useLocalStorage } from '@/modules/core/hooks/useStorage.tsx';
import { AppbarSearch } from '@/modules/core/components/AppbarSearch.tsx'; import { AppbarSearch } from '@/modules/core/components/AppbarSearch.tsx';
import { LoadingPlaceholder } from '@/modules/core/components/placeholder/LoadingPlaceholder.tsx'; import { LoadingPlaceholder } from '@/modules/core/components/placeholder/LoadingPlaceholder.tsx';
import { makeToast } from '@/modules/core/utils/Toast.ts'; import { makeToast } from '@/modules/core/utils/Toast.ts';
@@ -130,13 +129,12 @@ export function Extensions({ tabsMenuHeight }: { tabsMenuHeight: number }) {
requestManager.useExtensionListFetch(); requestManager.useExtensionListFetch();
const { const {
settings: { extensionLanguages: shownLangs }, settings: { extensionLanguages: shownLangs, showNsfw },
} = useMetadataServerSettings(); } = useMetadataServerSettings();
const updateMetadataServerSettings = createUpdateMetadataServerSettings< const updateMetadataServerSettings = createUpdateMetadataServerSettings<
keyof Pick<MetadataBrowseSettings, 'extensionLanguages'> keyof Pick<MetadataBrowseSettings, 'extensionLanguages'>
>((e) => makeToast(t('global.error.label.failed_to_save_changes'), 'error', getErrorMessage(e))); >((e) => makeToast(t('global.error.label.failed_to_save_changes'), 'error', getErrorMessage(e)));
const [showNsfw] = useLocalStorage<boolean>('showNsfw', true);
const [query] = useQueryParam('query', StringParam); const [query] = useQueryParam('query', StringParam);
const [updatingExtensionIds, setUpdatingExtensionIds] = useState<string[]>([]); const [updatingExtensionIds, setUpdatingExtensionIds] = useState<string[]>([]);

View File

@@ -33,6 +33,7 @@ import { getErrorMessage } from '@/lib/HelperFunctions.ts';
import { useNavBarContext } from '@/modules/navigation-bar/contexts/NavbarContext.tsx'; import { useNavBarContext } from '@/modules/navigation-bar/contexts/NavbarContext.tsx';
import { Sources } from '@/modules/source/services/Sources.ts'; import { Sources } from '@/modules/source/services/Sources.ts';
import { SourceDisplayNameInfo, SourceIdInfo } from '@/modules/source/Source.types.ts'; import { SourceDisplayNameInfo, SourceIdInfo } from '@/modules/source/Source.types.ts';
import { useMetadataServerSettings } from '@/modules/settings/services/ServerSettingsMetadata.ts';
type SourceLoadingState = { isLoading: boolean; hasResults: boolean; emptySearch: boolean }; type SourceLoadingState = { isLoading: boolean; hasResults: boolean; emptySearch: boolean };
type SourceToLoadingStateMap = Map<string, SourceLoadingState>; type SourceToLoadingStateMap = Map<string, SourceLoadingState>;
@@ -187,7 +188,9 @@ export const SearchAll: React.FC = () => {
const searchString = useDebounce(query, TRIGGER_SEARCH_THRESHOLD); const searchString = useDebounce(query, TRIGGER_SEARCH_THRESHOLD);
const [shownLangs, setShownLangs] = useLocalStorage<string[]>('shownSourceLangs', sourceDefualtLangs()); const [shownLangs, setShownLangs] = useLocalStorage<string[]>('shownSourceLangs', sourceDefualtLangs());
const [showNsfw] = useLocalStorage<boolean>('showNsfw', true); const {
settings: { showNsfw },
} = useMetadataServerSettings();
const { data, loading, error, refetch } = requestManager.useGetSourceList({ notifyOnNetworkStatusChange: true }); const { data, loading, error, refetch } = requestManager.useGetSourceList({ notifyOnNetworkStatusChange: true });
const sources = useMemo(() => data?.sources.nodes ?? [], [data?.sources.nodes]); const sources = useMemo(() => data?.sources.nodes ?? [], [data?.sources.nodes]);

View File

@@ -86,6 +86,7 @@ const APP_METADATA_OBJECT: Record<AppMetadataKeys, undefined> = {
unread: undefined, unread: undefined,
showChapterNumber: undefined, showChapterNumber: undefined,
extensionLanguages: undefined, extensionLanguages: undefined,
showNsfw: undefined,
}; };
export const VALID_APP_METADATA_KEYS = Object.keys(APP_METADATA_OBJECT); export const VALID_APP_METADATA_KEYS = Object.keys(APP_METADATA_OBJECT);
@@ -136,6 +137,7 @@ export const GLOBAL_METADATA_KEYS: AppMetadataKeys[] = [
// browse // browse
'hideLibraryEntries', 'hideLibraryEntries',
'extensionLanguages', 'extensionLanguages',
'showNsfw',
// history // history
'hideHistory', 'hideHistory',

View File

@@ -42,6 +42,7 @@ export const SERVER_SETTINGS_METADATA_DEFAULT: MetadataServerSettings = {
// browse // browse
hideLibraryEntries: false, hideLibraryEntries: false,
extensionLanguages: extensionDefaultLangs(), extensionLanguages: extensionDefaultLangs(),
showNsfw: true,
// history // history
hideHistory: false, hideHistory: false,

View File

@@ -26,13 +26,16 @@ import { AppRoutes } from '@/modules/core/AppRoute.constants.ts';
import { getErrorMessage } from '@/lib/HelperFunctions.ts'; import { getErrorMessage } from '@/lib/HelperFunctions.ts';
import { useNavBarContext } from '@/modules/navigation-bar/contexts/NavbarContext.tsx'; import { useNavBarContext } from '@/modules/navigation-bar/contexts/NavbarContext.tsx';
import { Sources as SourceService } from '@/modules/source/services/Sources.ts'; import { Sources as SourceService } from '@/modules/source/services/Sources.ts';
import { useMetadataServerSettings } from '@/modules/settings/services/ServerSettingsMetadata.ts';
export function Sources() { export function Sources() {
const { t } = useTranslation(); const { t } = useTranslation();
const { setAction } = useNavBarContext(); const { setAction } = useNavBarContext();
const [shownLangs, setShownLangs] = useLocalStorage<string[]>('shownSourceLangs', sourceDefualtLangs()); const [shownLangs, setShownLangs] = useLocalStorage<string[]>('shownSourceLangs', sourceDefualtLangs());
const [showNsfw] = useLocalStorage<boolean>('showNsfw', true); const {
settings: { showNsfw },
} = useMetadataServerSettings();
const { const {
data, data,