+
{children}
);
@@ -300,28 +313,36 @@ export const App: React.FC = () => {
return null;
}
- if (config.error) {
+ function renderSimple(content: React.ReactNode) {
return (
-
-
- }
- error={config.error.message}
- />
-
+ {content}
);
}
+ if (config.loading) {
+ return renderSimple(
);
+ }
+
+ if (config.error) {
+ return renderSimple(
+
+ }
+ error={config.error.message}
+ />
+ );
+ }
+
return (
{
-
+
{maybeRenderReleaseNotes()}
}>
diff --git a/ui/v2.5/src/components/Dialogs/GenerateDialog.tsx b/ui/v2.5/src/components/Dialogs/GenerateDialog.tsx
index 669bc8aa4..5afdb0b8e 100644
--- a/ui/v2.5/src/components/Dialogs/GenerateDialog.tsx
+++ b/ui/v2.5/src/components/Dialogs/GenerateDialog.tsx
@@ -6,7 +6,7 @@ import { Icon } from "src/components/Shared/Icon";
import { useToast } from "src/hooks/Toast";
import * as GQL from "src/core/generated-graphql";
import { FormattedMessage, useIntl } from "react-intl";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
import { Manual } from "../Help/Manual";
import { withoutTypename } from "src/utils/data";
import { GenerateOptions } from "../Settings/Tasks/GenerateOptions";
@@ -25,7 +25,7 @@ export const GenerateDialog: React.FC = ({
onClose,
type,
}) => {
- const { configuration } = React.useContext(ConfigurationContext);
+ const { configuration } = useConfigurationContext();
function getDefaultOptions(): GQL.GenerateMetadataInput {
return {
diff --git a/ui/v2.5/src/components/FrontPage/Control.tsx b/ui/v2.5/src/components/FrontPage/Control.tsx
index 7ff31bbac..72f84516f 100644
--- a/ui/v2.5/src/components/FrontPage/Control.tsx
+++ b/ui/v2.5/src/components/FrontPage/Control.tsx
@@ -1,9 +1,9 @@
-import React, { useContext, useMemo } from "react";
+import React, { useMemo } from "react";
import { useIntl } from "react-intl";
import { FrontPageContent, ICustomFilter } from "src/core/config";
import * as GQL from "src/core/generated-graphql";
import { useFindSavedFilter } from "src/core/StashService";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
import { ListFilterModel } from "src/models/list-filter/filter";
import { GalleryRecommendationRow } from "../Galleries/GalleryRecommendationRow";
import { ImageRecommendationRow } from "../Images/ImageRecommendationRow";
@@ -105,7 +105,7 @@ interface ISavedFilterResults {
const SavedFilterResults: React.FC = ({
savedFilterID,
}) => {
- const { configuration: config } = useContext(ConfigurationContext);
+ const { configuration: config } = useConfigurationContext();
const { loading, data } = useFindSavedFilter(savedFilterID.toString());
const filter = useMemo(() => {
@@ -136,7 +136,7 @@ interface ICustomFilterProps {
const CustomFilterResults: React.FC = ({
customFilter,
}) => {
- const { configuration: config } = useContext(ConfigurationContext);
+ const { configuration: config } = useConfigurationContext();
const intl = useIntl();
const filter = useMemo(() => {
diff --git a/ui/v2.5/src/components/FrontPage/FrontPage.tsx b/ui/v2.5/src/components/FrontPage/FrontPage.tsx
index 89b4db468..12e56f6ab 100644
--- a/ui/v2.5/src/components/FrontPage/FrontPage.tsx
+++ b/ui/v2.5/src/components/FrontPage/FrontPage.tsx
@@ -6,7 +6,7 @@ import { Button } from "react-bootstrap";
import { FrontPageConfig } from "./FrontPageConfig";
import { useToast } from "src/hooks/Toast";
import { Control } from "./Control";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
import {
FrontPageContent,
generateDefaultFrontPageContent,
@@ -24,7 +24,7 @@ const FrontPage: React.FC = PatchComponent("FrontPage", () => {
const [saveUI] = useConfigureUI();
- const { configuration, loading } = React.useContext(ConfigurationContext);
+ const { configuration } = useConfigurationContext();
useScrollToTopOnMount();
@@ -51,7 +51,7 @@ const FrontPage: React.FC = PatchComponent("FrontPage", () => {
setSaving(false);
}
- if (loading || saving) {
+ if (saving) {
return ;
}
diff --git a/ui/v2.5/src/components/FrontPage/FrontPageConfig.tsx b/ui/v2.5/src/components/FrontPage/FrontPageConfig.tsx
index 2f72d0740..33e6c066a 100644
--- a/ui/v2.5/src/components/FrontPage/FrontPageConfig.tsx
+++ b/ui/v2.5/src/components/FrontPage/FrontPageConfig.tsx
@@ -4,7 +4,7 @@ import { useFindSavedFilters } from "src/core/StashService";
import { LoadingIndicator } from "../Shared/LoadingIndicator";
import { Button, Form, Modal } from "react-bootstrap";
import * as GQL from "src/core/generated-graphql";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
import {
ISavedFilterRow,
ICustomFilter,
@@ -277,11 +277,11 @@ interface IFrontPageConfigProps {
export const FrontPageConfig: React.FC = ({
onClose,
}) => {
- const { configuration, loading } = React.useContext(ConfigurationContext);
+ const { configuration } = useConfigurationContext();
const ui = configuration?.ui;
- const { data: allFilters, loading: loading2 } = useFindSavedFilters();
+ const { data: allFilters, loading } = useFindSavedFilters();
const [isAdd, setIsAdd] = useState(false);
const [currentContent, setCurrentContent] = useState([]);
@@ -338,7 +338,7 @@ export const FrontPageConfig: React.FC = ({
setDragIndex(undefined);
}
- if (loading || loading2) {
+ if (loading) {
return ;
}
diff --git a/ui/v2.5/src/components/Galleries/DeleteGalleriesDialog.tsx b/ui/v2.5/src/components/Galleries/DeleteGalleriesDialog.tsx
index 2feaa0f1e..0e50c16b8 100644
--- a/ui/v2.5/src/components/Galleries/DeleteGalleriesDialog.tsx
+++ b/ui/v2.5/src/components/Galleries/DeleteGalleriesDialog.tsx
@@ -4,7 +4,7 @@ import { useGalleryDestroy } from "src/core/StashService";
import * as GQL from "src/core/generated-graphql";
import { ModalComponent } from "../Shared/Modal";
import { useToast } from "src/hooks/Toast";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
import { FormattedMessage, useIntl } from "react-intl";
import { faTrashAlt } from "@fortawesome/free-solid-svg-icons";
@@ -33,7 +33,7 @@ export const DeleteGalleriesDialog: React.FC = (
{ count: props.selected.length, singularEntity, pluralEntity }
);
- const { configuration: config } = React.useContext(ConfigurationContext);
+ const { configuration: config } = useConfigurationContext();
const [deleteFile, setDeleteFile] = useState(
config?.defaults.deleteFile ?? false
diff --git a/ui/v2.5/src/components/Galleries/GalleryDetails/Gallery.tsx b/ui/v2.5/src/components/Galleries/GalleryDetails/Gallery.tsx
index 5d7cdeb51..9cee2d1e2 100644
--- a/ui/v2.5/src/components/Galleries/GalleryDetails/Gallery.tsx
+++ b/ui/v2.5/src/components/Galleries/GalleryDetails/Gallery.tsx
@@ -1,5 +1,5 @@
import { Button, Tab, Nav, Dropdown } from "react-bootstrap";
-import React, { useContext, useEffect, useMemo, useState } from "react";
+import React, { useEffect, useMemo, useState } from "react";
import {
useHistory,
Link,
@@ -41,7 +41,7 @@ import { useScrollToTopOnMount } from "src/hooks/scrollToTop";
import { RatingSystem } from "src/components/Shared/Rating/RatingSystem";
import cx from "classnames";
import { useRatingKeybinds } from "src/hooks/keybinds";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
import { TruncatedText } from "src/components/Shared/TruncatedText";
import { goBackOrReplace } from "src/utils/history";
@@ -59,7 +59,7 @@ export const GalleryPage: React.FC = ({ gallery, add }) => {
const history = useHistory();
const Toast = useToast();
const intl = useIntl();
- const { configuration } = useContext(ConfigurationContext);
+ const { configuration } = useConfigurationContext();
const showLightbox = useGalleryLightbox(gallery.id, gallery.chapters);
const [collapsed, setCollapsed] = useState(false);
diff --git a/ui/v2.5/src/components/Galleries/GalleryDetails/GalleryScrapeDialog.tsx b/ui/v2.5/src/components/Galleries/GalleryDetails/GalleryScrapeDialog.tsx
index 5fe20b7b0..fbfde9f97 100644
--- a/ui/v2.5/src/components/Galleries/GalleryDetails/GalleryScrapeDialog.tsx
+++ b/ui/v2.5/src/components/Galleries/GalleryDetails/GalleryScrapeDialog.tsx
@@ -161,32 +161,38 @@ export const GalleryScrapeDialog: React.FC = ({
return (
<>
setTitle(value)}
/>
setCode(value)}
/>
setURLs(value)}
/>
setDate(value)}
/>
setPhotographer(value)}
/>
setStudio(value)}
@@ -194,6 +200,7 @@ export const GalleryScrapeDialog: React.FC = ({
onCreateNew={createNewStudio}
/>
setPerformers(value)}
@@ -203,6 +210,7 @@ export const GalleryScrapeDialog: React.FC = ({
/>
{scrapedTagsRow}
setDetails(value)}
diff --git a/ui/v2.5/src/components/Galleries/GallerySelect.tsx b/ui/v2.5/src/components/Galleries/GallerySelect.tsx
index 4cd8825bb..c76266cf7 100644
--- a/ui/v2.5/src/components/Galleries/GallerySelect.tsx
+++ b/ui/v2.5/src/components/Galleries/GallerySelect.tsx
@@ -12,7 +12,7 @@ import {
queryFindGalleriesForSelect,
queryFindGalleriesByIDForSelect,
} from "src/core/StashService";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
import { useIntl } from "react-intl";
import { defaultMaxOptionsShown } from "src/core/config";
import { ListFilterModel } from "src/models/list-filter/filter";
@@ -70,7 +70,7 @@ const gallerySelectSort = PatchFunction(
const _GallerySelect: React.FC<
IFilterProps & IFilterValueProps & ExtraGalleryProps
> = (props) => {
- const { configuration } = React.useContext(ConfigurationContext);
+ const { configuration } = useConfigurationContext();
const intl = useIntl();
const maxOptionsShown =
configuration?.ui.maxOptionsShown ?? defaultMaxOptionsShown;
diff --git a/ui/v2.5/src/components/Groups/GroupCard.tsx b/ui/v2.5/src/components/Groups/GroupCard.tsx
index 87a594446..7412c986a 100644
--- a/ui/v2.5/src/components/Groups/GroupCard.tsx
+++ b/ui/v2.5/src/components/Groups/GroupCard.tsx
@@ -10,7 +10,7 @@ import { FormattedMessage } from "react-intl";
import { RatingBanner } from "../Shared/RatingBanner";
import { faPlayCircle, faTag } from "@fortawesome/free-solid-svg-icons";
import { RelatedGroupPopoverButton } from "./RelatedGroupPopover";
-import { SweatDrops } from "../Shared/SweatDrops";
+import { OCounterButton } from "../Shared/CountButton";
const Description: React.FC<{
sceneNumber?: number;
@@ -111,16 +111,7 @@ export const GroupCard: React.FC = ({
function maybeRenderOCounter() {
if (!group.o_counter) return;
- return (
-
-
-
- );
+ return ;
}
function maybeRenderPopoverButtonGroup() {
diff --git a/ui/v2.5/src/components/Groups/GroupDetails/Group.tsx b/ui/v2.5/src/components/Groups/GroupDetails/Group.tsx
index b48f3b98c..b2b3d8176 100644
--- a/ui/v2.5/src/components/Groups/GroupDetails/Group.tsx
+++ b/ui/v2.5/src/components/Groups/GroupDetails/Group.tsx
@@ -23,7 +23,7 @@ import {
import { GroupEditPanel } from "./GroupEditPanel";
import { faRefresh, faTrashAlt } from "@fortawesome/free-solid-svg-icons";
import { RatingSystem } from "src/components/Shared/Rating/RatingSystem";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
import { DetailImage } from "src/components/Shared/DetailImage";
import { useRatingKeybinds } from "src/hooks/keybinds";
import { useLoadStickyHeader } from "src/hooks/detailsPanel";
@@ -146,7 +146,7 @@ const GroupPage: React.FC = ({ group, tabKey }) => {
const Toast = useToast();
// Configuration settings
- const { configuration } = React.useContext(ConfigurationContext);
+ const { configuration } = useConfigurationContext();
const uiConfig = configuration?.ui;
const enableBackgroundImage = uiConfig?.enableMovieBackgroundImage ?? false;
const compactExpandedDetails = uiConfig?.compactExpandedDetails ?? false;
diff --git a/ui/v2.5/src/components/Groups/GroupDetails/GroupScrapeDialog.tsx b/ui/v2.5/src/components/Groups/GroupDetails/GroupScrapeDialog.tsx
index bdb5d6ad5..d37210c43 100644
--- a/ui/v2.5/src/components/Groups/GroupDetails/GroupScrapeDialog.tsx
+++ b/ui/v2.5/src/components/Groups/GroupDetails/GroupScrapeDialog.tsx
@@ -149,37 +149,44 @@ export const GroupScrapeDialog: React.FC = ({
return (
<>
setName(value)}
/>
setAliases(value)}
/>
setDuration(value)}
/>
setDate(value)}
/>
setDirector(value)}
/>
setSynopsis(value)}
/>
setStudio(value)}
@@ -187,18 +194,21 @@ export const GroupScrapeDialog: React.FC = ({
onCreateNew={createNewStudio}
/>
setURLs(value)}
/>
{scrapedTagsRow}
setFrontImage(value)}
/>
= PatchComponent("GroupSelect", (props) => {
const [createGroup] = useGroupCreate();
- const { configuration } = React.useContext(ConfigurationContext);
+ const { configuration } = useConfigurationContext();
const intl = useIntl();
const maxOptionsShown =
configuration?.ui.maxOptionsShown ?? defaultMaxOptionsShown;
diff --git a/ui/v2.5/src/components/Images/DeleteImagesDialog.tsx b/ui/v2.5/src/components/Images/DeleteImagesDialog.tsx
index 36a3ead3c..ec442a5ca 100644
--- a/ui/v2.5/src/components/Images/DeleteImagesDialog.tsx
+++ b/ui/v2.5/src/components/Images/DeleteImagesDialog.tsx
@@ -4,7 +4,7 @@ import { useImagesDestroy } from "src/core/StashService";
import * as GQL from "src/core/generated-graphql";
import { ModalComponent } from "src/components/Shared/Modal";
import { useToast } from "src/hooks/Toast";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
import { FormattedMessage, useIntl } from "react-intl";
import { faTrashAlt } from "@fortawesome/free-solid-svg-icons";
@@ -33,7 +33,7 @@ export const DeleteImagesDialog: React.FC = (
{ count: props.selected.length, singularEntity, pluralEntity }
);
- const { configuration: config } = React.useContext(ConfigurationContext);
+ const { configuration: config } = useConfigurationContext();
const [deleteFile, setDeleteFile] = useState(
config?.defaults.deleteFile ?? false
diff --git a/ui/v2.5/src/components/Images/ImageCard.tsx b/ui/v2.5/src/components/Images/ImageCard.tsx
index 9a8c86a10..a22e48139 100644
--- a/ui/v2.5/src/components/Images/ImageCard.tsx
+++ b/ui/v2.5/src/components/Images/ImageCard.tsx
@@ -5,7 +5,6 @@ import * as GQL from "src/core/generated-graphql";
import { Icon } from "src/components/Shared/Icon";
import { GalleryLink, TagLink } from "src/components/Shared/TagLink";
import { HoverPopover } from "src/components/Shared/HoverPopover";
-import { SweatDrops } from "src/components/Shared/SweatDrops";
import { PerformerPopoverButton } from "src/components/Shared/PerformerPopoverButton";
import { GridCard } from "src/components/Shared/GridCard/GridCard";
import { RatingBanner } from "src/components/Shared/RatingBanner";
@@ -18,6 +17,7 @@ import {
import { imageTitle } from "src/core/files";
import { TruncatedText } from "../Shared/TruncatedText";
import { StudioOverlay } from "../Shared/GridCard/StudioOverlay";
+import { OCounterButton } from "../Shared/CountButton";
interface IImageCardProps {
image: GQL.SlimImageDataFragment;
@@ -74,16 +74,7 @@ export const ImageCard: React.FC = (
function maybeRenderOCounter() {
if (props.image.o_counter) {
- return (
-
-
-
- );
+ return ;
}
}
diff --git a/ui/v2.5/src/components/Images/ImageDetails/Image.tsx b/ui/v2.5/src/components/Images/ImageDetails/Image.tsx
index 3b77d2eef..699d3d4e4 100644
--- a/ui/v2.5/src/components/Images/ImageDetails/Image.tsx
+++ b/ui/v2.5/src/components/Images/ImageDetails/Image.tsx
@@ -1,5 +1,5 @@
import { Tab, Nav, Dropdown } from "react-bootstrap";
-import React, { useContext, useEffect, useMemo, useState } from "react";
+import React, { useEffect, useMemo, useState } from "react";
import { FormattedDate, FormattedMessage, useIntl } from "react-intl";
import { useHistory, Link, RouteComponentProps } from "react-router-dom";
import { Helmet } from "react-helmet";
@@ -29,7 +29,7 @@ import { imagePath, imageTitle } from "src/core/files";
import { isVideo } from "src/utils/visualFile";
import { useScrollToTopOnMount } from "src/hooks/scrollToTop";
import { useRatingKeybinds } from "src/hooks/keybinds";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
import TextUtils from "src/utils/text";
import { RatingSystem } from "src/components/Shared/Rating/RatingSystem";
import cx from "classnames";
@@ -48,7 +48,7 @@ const ImagePage: React.FC = ({ image }) => {
const history = useHistory();
const Toast = useToast();
const intl = useIntl();
- const { configuration } = useContext(ConfigurationContext);
+ const { configuration } = useConfigurationContext();
const [incrementO] = useImageIncrementO(image.id);
const [decrementO] = useImageDecrementO(image.id);
diff --git a/ui/v2.5/src/components/Images/ImageDetails/ImageScrapeDialog.tsx b/ui/v2.5/src/components/Images/ImageDetails/ImageScrapeDialog.tsx
index cc7dffe66..44b112078 100644
--- a/ui/v2.5/src/components/Images/ImageDetails/ImageScrapeDialog.tsx
+++ b/ui/v2.5/src/components/Images/ImageDetails/ImageScrapeDialog.tsx
@@ -163,32 +163,38 @@ export const ImageScrapeDialog: React.FC = ({
return (
<>
setTitle(value)}
/>
setCode(value)}
/>
setURLs(value)}
/>
setDate(value)}
/>
setPhotographer(value)}
/>
setStudio(value)}
@@ -196,6 +202,7 @@ export const ImageScrapeDialog: React.FC = ({
onCreateNew={createNewStudio}
/>
setPerformers(value)}
@@ -204,6 +211,7 @@ export const ImageScrapeDialog: React.FC = ({
/>
{scrapedTagsRow}
setDetails(value)}
diff --git a/ui/v2.5/src/components/Images/ImageList.tsx b/ui/v2.5/src/components/Images/ImageList.tsx
index dc1f9b1e1..df10ff4b5 100644
--- a/ui/v2.5/src/components/Images/ImageList.tsx
+++ b/ui/v2.5/src/components/Images/ImageList.tsx
@@ -1,10 +1,4 @@
-import React, {
- useCallback,
- useState,
- useMemo,
- MouseEvent,
- useContext,
-} from "react";
+import React, { useCallback, useState, useMemo, MouseEvent } from "react";
import { FormattedNumber, useIntl } from "react-intl";
import cloneDeep from "lodash-es/cloneDeep";
import { useHistory } from "react-router-dom";
@@ -23,7 +17,7 @@ import "flexbin/flexbin.css";
import Gallery, { RenderImageProps } from "react-photo-gallery";
import { ExportDialog } from "../Shared/ExportDialog";
import { objectTitle } from "src/core/files";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
import { ImageGridCard } from "./ImageGridCard";
import { View } from "../List/views";
import { IItemListOperation } from "../List/FilteredListToolbar";
@@ -51,7 +45,7 @@ const ImageWall: React.FC = ({
zoomIndex,
handleImageOpen,
}) => {
- const { configuration } = useContext(ConfigurationContext);
+ const { configuration } = useConfigurationContext();
const uiConfig = configuration?.ui;
const containerRef = React.useRef(null);
diff --git a/ui/v2.5/src/components/List/EditFilterDialog.tsx b/ui/v2.5/src/components/List/EditFilterDialog.tsx
index 5f6d43004..3f0f486b8 100644
--- a/ui/v2.5/src/components/List/EditFilterDialog.tsx
+++ b/ui/v2.5/src/components/List/EditFilterDialog.tsx
@@ -1,7 +1,6 @@
import cloneDeep from "lodash-es/cloneDeep";
import React, {
useCallback,
- useContext,
useEffect,
useMemo,
useRef,
@@ -14,7 +13,7 @@ import {
CriterionOption,
} from "src/models/list-filter/criteria/criterion";
import { FormattedMessage, useIntl } from "react-intl";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
import { ListFilterModel } from "src/models/list-filter/filter";
import { getFilterOptions } from "src/models/list-filter/factory";
import { FilterTags } from "./FilterTags";
@@ -65,6 +64,9 @@ const CriterionOptionList: React.FC = ({
onTogglePin,
externallySelected = false,
}) => {
+ const { configuration } = useConfigurationContext();
+ const { sfwContentMode } = configuration.interface;
+
const prevCriterion = usePrevious(currentCriterion);
const scrolled = useRef(false);
@@ -148,7 +150,9 @@ const CriterionOptionList: React.FC = ({
className="collapse-icon fa-fw"
icon={type === c.type ? faChevronDown : faChevronRight}
/>
-
+
{criteria.some((cc) => c.type === cc) && (
);
diff --git a/ui/v2.5/src/components/Scenes/SceneDetails/Scene.tsx b/ui/v2.5/src/components/Scenes/SceneDetails/Scene.tsx
index f7e844392..aee6ab344 100644
--- a/ui/v2.5/src/components/Scenes/SceneDetails/Scene.tsx
+++ b/ui/v2.5/src/components/Scenes/SceneDetails/Scene.tsx
@@ -3,7 +3,6 @@ import React, {
useEffect,
useState,
useMemo,
- useContext,
useRef,
useLayoutEffect,
} from "react";
@@ -32,7 +31,7 @@ import SceneQueue, { QueuedScene } from "src/models/sceneQueue";
import { ListFilterModel } from "src/models/list-filter/filter";
import Mousetrap from "mousetrap";
import { OrganizedButton } from "./OrganizedButton";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
import { getPlayerPosition } from "src/components/ScenePlayer/util";
import {
faEllipsisV,
@@ -184,7 +183,7 @@ const ScenePage: React.FC = PatchComponent("ScenePage", (props) => {
const intl = useIntl();
const [updateScene] = useSceneUpdate();
const [generateScreenshot] = useSceneGenerateScreenshot();
- const { configuration } = useContext(ConfigurationContext);
+ const { configuration } = useConfigurationContext();
const [showDraftModal, setShowDraftModal] = useState(false);
const boxes = configuration?.general?.stashBoxes ?? [];
@@ -689,7 +688,7 @@ const SceneLoader: React.FC> = ({
match,
}) => {
const { id } = match.params;
- const { configuration } = useContext(ConfigurationContext);
+ const { configuration } = useConfigurationContext();
const { data, loading, error } = useFindScene(id);
const [scene, setScene] = useState();
diff --git a/ui/v2.5/src/components/Scenes/SceneDetails/SceneEditPanel.tsx b/ui/v2.5/src/components/Scenes/SceneDetails/SceneEditPanel.tsx
index 69b378787..e56ea265b 100644
--- a/ui/v2.5/src/components/Scenes/SceneDetails/SceneEditPanel.tsx
+++ b/ui/v2.5/src/components/Scenes/SceneDetails/SceneEditPanel.tsx
@@ -19,7 +19,7 @@ import ImageUtils from "src/utils/image";
import { getStashIDs } from "src/utils/stashIds";
import { useFormik } from "formik";
import { Prompt } from "react-router-dom";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
import { IGroupEntry, SceneGroupTable } from "./SceneGroupTable";
import { faSearch } from "@fortawesome/free-solid-svg-icons";
import { objectTitle } from "src/core/files";
@@ -103,7 +103,7 @@ export const SceneEditPanel: React.FC = ({
setStudio(scene.studio ?? null);
}, [scene.studio]);
- const { configuration: stashConfig } = React.useContext(ConfigurationContext);
+ const { configuration: stashConfig } = useConfigurationContext();
// Network state
const [isLoading, setIsLoading] = useState(false);
diff --git a/ui/v2.5/src/components/Scenes/SceneDetails/SceneHistoryPanel.tsx b/ui/v2.5/src/components/Scenes/SceneDetails/SceneHistoryPanel.tsx
index 1ac9dd5a2..2ba587a2b 100644
--- a/ui/v2.5/src/components/Scenes/SceneDetails/SceneHistoryPanel.tsx
+++ b/ui/v2.5/src/components/Scenes/SceneDetails/SceneHistoryPanel.tsx
@@ -21,6 +21,7 @@ import {
useSceneResetActivity,
} from "src/core/StashService";
import * as GQL from "src/core/generated-graphql";
+import { useConfigurationContext } from "src/hooks/Config";
import { useToast } from "src/hooks/Toast";
import { TextField } from "src/utils/field";
import TextUtils from "src/utils/text";
@@ -172,6 +173,9 @@ export const SceneHistoryPanel: React.FC = ({ scene }) => {
const intl = useIntl();
const Toast = useToast();
+ const { configuration } = useConfigurationContext();
+ const { sfwContentMode } = configuration.interface;
+
const [dialogs, setDialogs] = React.useState({
playHistory: false,
oHistory: false,
@@ -299,6 +303,9 @@ export const SceneHistoryPanel: React.FC = ({ scene }) => {
}
function maybeRenderDialogs() {
+ const clearHistoryMessageID = sfwContentMode
+ ? "dialogs.clear_o_history_confirm_sfw"
+ : "dialogs.clear_play_history_confirm";
return (
<>
= ({ scene }) => {
/>
handleClearODates()}
onCancel={() => setDialogPartial({ oHistory: false })}
@@ -351,6 +358,11 @@ export const SceneHistoryPanel: React.FC = ({ scene }) => {
) as string[];
const oHistory = (scene.o_history ?? []).filter((h) => h != null) as string[];
+ const oHistoryMessageID = sfwContentMode ? "o_history_sfw" : "o_history";
+ const noneMessageID = sfwContentMode
+ ? "odate_recorded_no_sfw"
+ : "odate_recorded_no";
+
return (
{maybeRenderDialogs()}
@@ -401,7 +413,7 @@ export const SceneHistoryPanel: React.FC
= ({ scene }) => {
-
+
@@ -427,7 +439,7 @@ export const SceneHistoryPanel: React.FC = ({ scene }) => {
handleDeleteODate(t)}
/>
diff --git a/ui/v2.5/src/components/Scenes/SceneDetails/SceneScrapeDialog.tsx b/ui/v2.5/src/components/Scenes/SceneDetails/SceneScrapeDialog.tsx
index 6a89caf85..7be291bd2 100644
--- a/ui/v2.5/src/components/Scenes/SceneDetails/SceneScrapeDialog.tsx
+++ b/ui/v2.5/src/components/Scenes/SceneDetails/SceneScrapeDialog.tsx
@@ -218,32 +218,38 @@ export const SceneScrapeDialog: React.FC = ({
return (
<>
setTitle(value)}
/>
setCode(value)}
/>
setURLs(value)}
/>
setDate(value)}
/>
setDirector(value)}
/>
setStudio(value)}
@@ -251,6 +257,7 @@ export const SceneScrapeDialog: React.FC = ({
onCreateNew={createNewStudio}
/>
setPerformers(value)}
@@ -259,6 +266,7 @@ export const SceneScrapeDialog: React.FC = ({
ageFromDate={date.useNewValue ? date.newValue : date.originalValue}
/>
setGroups(value)}
@@ -267,17 +275,20 @@ export const SceneScrapeDialog: React.FC = ({
/>
{scrapedTagsRow}
setDetails(value)}
/>
setStashID(value)}
/>
{
},
});
- const { filter, setFilter, loading: filterLoading } = filterState;
+ const { filter, setFilter } = filterState;
const { effectiveFilter, result, cachedResult, items, totalCount } =
queryResult;
@@ -709,7 +709,7 @@ export const FilteredSceneList = (props: IFilteredScenes) => {
];
// render
- if (filterLoading || sidebarStateLoading) return null;
+ if (sidebarStateLoading) return null;
const operations = (
{
};
const SceneMarkerCardImage = (props: ISceneMarkerCardProps) => {
- const { configuration } = React.useContext(ConfigurationContext);
+ const { configuration } = useConfigurationContext();
const file = useMemo(
() =>
diff --git a/ui/v2.5/src/components/Scenes/SceneMarkerWallPanel.tsx b/ui/v2.5/src/components/Scenes/SceneMarkerWallPanel.tsx
index 9c507730b..0349fae0f 100644
--- a/ui/v2.5/src/components/Scenes/SceneMarkerWallPanel.tsx
+++ b/ui/v2.5/src/components/Scenes/SceneMarkerWallPanel.tsx
@@ -1,17 +1,11 @@
-import React, {
- useCallback,
- useContext,
- useEffect,
- useMemo,
- useState,
-} from "react";
+import React, { useCallback, useEffect, useMemo, useState } from "react";
import * as GQL from "src/core/generated-graphql";
import Gallery, {
GalleryI,
PhotoProps,
RenderImageProps,
} from "react-photo-gallery";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
import { objectTitle } from "src/core/files";
import { Link, useHistory } from "react-router-dom";
import { TruncatedText } from "../Shared/TruncatedText";
@@ -46,7 +40,7 @@ interface IExtraProps {
export const MarkerWallItem: React.FC<
RenderImageProps & IExtraProps
> = (props: RenderImageProps & IExtraProps) => {
- const { configuration } = useContext(ConfigurationContext);
+ const { configuration } = useConfigurationContext();
const playSound = configuration?.interface.soundOnPreview ?? false;
const showTitle = configuration?.interface.wallShowTitle ?? false;
diff --git a/ui/v2.5/src/components/Scenes/SceneMergeDialog.tsx b/ui/v2.5/src/components/Scenes/SceneMergeDialog.tsx
index d5a18d4ac..511ca2351 100644
--- a/ui/v2.5/src/components/Scenes/SceneMergeDialog.tsx
+++ b/ui/v2.5/src/components/Scenes/SceneMergeDialog.tsx
@@ -372,27 +372,32 @@ const SceneMergeDetails: React.FC = ({
return (
<>
setTitle(value)}
/>
setCode(value)}
/>
setURL(value)}
/>
setDate(value)}
/>
(
@@ -404,6 +409,7 @@ const SceneMergeDetails: React.FC = ({
onChange={(value) => setRating(value)}
/>
(
@@ -425,6 +431,7 @@ const SceneMergeDetails: React.FC = ({
onChange={(value) => setOCounter(value)}
/>
(
@@ -446,6 +453,7 @@ const SceneMergeDetails: React.FC = ({
onChange={(value) => setPlayCount(value)}
/>
(
@@ -469,6 +477,7 @@ const SceneMergeDetails: React.FC = ({
onChange={(value) => setPlayDuration(value)}
/>
(
@@ -492,32 +501,38 @@ const SceneMergeDetails: React.FC = ({
onChange={(value) => setGalleries(value)}
/>
setStudio(value)}
/>
setPerformers(value)}
ageFromDate={date.useNewValue ? date.newValue : date.originalValue}
/>
setGroups(value)}
/>
setTags(value)}
/>
setDetails(value)}
/>
(
@@ -539,6 +554,7 @@ const SceneMergeDetails: React.FC = ({
onChange={(value) => setOrganized(value)}
/>
(
@@ -550,6 +566,7 @@ const SceneMergeDetails: React.FC = ({
onChange={(value) => setStashIDs(value)}
/>
& ExtraSceneProps
> = (props) => {
- const { configuration } = React.useContext(ConfigurationContext);
+ const { configuration } = useConfigurationContext();
const intl = useIntl();
const maxOptionsShown =
configuration?.ui.maxOptionsShown ?? defaultMaxOptionsShown;
diff --git a/ui/v2.5/src/components/Scenes/SceneWallPanel.tsx b/ui/v2.5/src/components/Scenes/SceneWallPanel.tsx
index 6f98cdaab..3f5020793 100644
--- a/ui/v2.5/src/components/Scenes/SceneWallPanel.tsx
+++ b/ui/v2.5/src/components/Scenes/SceneWallPanel.tsx
@@ -1,10 +1,4 @@
-import React, {
- useCallback,
- useContext,
- useEffect,
- useMemo,
- useState,
-} from "react";
+import React, { useCallback, useEffect, useMemo, useState } from "react";
import * as GQL from "src/core/generated-graphql";
import { SceneQueue } from "src/models/sceneQueue";
import Gallery, {
@@ -12,7 +6,7 @@ import Gallery, {
PhotoProps,
RenderImageProps,
} from "react-photo-gallery";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
import { objectTitle } from "src/core/files";
import { Link, useHistory } from "react-router-dom";
import { TruncatedText } from "../Shared/TruncatedText";
@@ -35,7 +29,7 @@ export const SceneWallItem: React.FC<
> = (props: RenderImageProps & IExtraProps) => {
const intl = useIntl();
- const { configuration } = useContext(ConfigurationContext);
+ const { configuration } = useConfigurationContext();
const playSound = configuration?.interface.soundOnPreview ?? false;
const showTitle = configuration?.interface.wallShowTitle ?? false;
diff --git a/ui/v2.5/src/components/Settings/SettingsInterfacePanel/SettingsInterfacePanel.tsx b/ui/v2.5/src/components/Settings/SettingsInterfacePanel/SettingsInterfacePanel.tsx
index e0c538cd0..ba93385b5 100644
--- a/ui/v2.5/src/components/Settings/SettingsInterfacePanel/SettingsInterfacePanel.tsx
+++ b/ui/v2.5/src/components/Settings/SettingsInterfacePanel/SettingsInterfacePanel.tsx
@@ -240,6 +240,14 @@ export const SettingsInterfacePanel: React.FC = PatchComponent(
+ saveInterface({ sfwContentMode: v })}
+ />
+
diff --git a/ui/v2.5/src/components/Settings/Tasks/DataManagementTasks.tsx b/ui/v2.5/src/components/Settings/Tasks/DataManagementTasks.tsx
index e093dc60a..c36e076f4 100644
--- a/ui/v2.5/src/components/Settings/Tasks/DataManagementTasks.tsx
+++ b/ui/v2.5/src/components/Settings/Tasks/DataManagementTasks.tsx
@@ -22,7 +22,7 @@ import { SettingSection } from "../SettingSection";
import { BooleanSetting, Setting } from "../Inputs";
import { ManualLink } from "src/components/Help/context";
import { Icon } from "src/components/Shared/Icon";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
import { FolderSelect } from "src/components/Shared/FolderSelect/FolderSelect";
import {
faMinus,
@@ -44,7 +44,7 @@ const CleanDialog: React.FC
= ({
onClose,
}) => {
const intl = useIntl();
- const { configuration } = React.useContext(ConfigurationContext);
+ const { configuration } = useConfigurationContext();
const libraryPaths = configuration?.general.stashes.map((s) => s.path);
diff --git a/ui/v2.5/src/components/Settings/Tasks/DirectorySelectionDialog.tsx b/ui/v2.5/src/components/Settings/Tasks/DirectorySelectionDialog.tsx
index 9fdaf09f4..87a58f292 100644
--- a/ui/v2.5/src/components/Settings/Tasks/DirectorySelectionDialog.tsx
+++ b/ui/v2.5/src/components/Settings/Tasks/DirectorySelectionDialog.tsx
@@ -9,7 +9,7 @@ import { useIntl } from "react-intl";
import { Icon } from "src/components/Shared/Icon";
import { ModalComponent } from "src/components/Shared/Modal";
import { FolderSelect } from "src/components/Shared/FolderSelect/FolderSelect";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
interface IDirectorySelectionDialogProps {
animation?: boolean;
@@ -22,7 +22,7 @@ export const DirectorySelectionDialog: React.FC<
IDirectorySelectionDialogProps
> = ({ animation, allowEmpty = false, initialPaths = [], onClose }) => {
const intl = useIntl();
- const { configuration } = React.useContext(ConfigurationContext);
+ const { configuration } = useConfigurationContext();
const libraryPaths = configuration?.general.stashes.map((s) => s.path);
diff --git a/ui/v2.5/src/components/Settings/Tasks/LibraryTasks.tsx b/ui/v2.5/src/components/Settings/Tasks/LibraryTasks.tsx
index cb60891fd..605e37933 100644
--- a/ui/v2.5/src/components/Settings/Tasks/LibraryTasks.tsx
+++ b/ui/v2.5/src/components/Settings/Tasks/LibraryTasks.tsx
@@ -7,7 +7,7 @@ import {
mutateMetadataGenerate,
} from "src/core/StashService";
import { withoutTypename } from "src/utils/data";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
import { IdentifyDialog } from "../../Dialogs/IdentifyDialog/IdentifyDialog";
import * as GQL from "src/core/generated-graphql";
import { DirectorySelectionDialog } from "./DirectorySelectionDialog";
@@ -123,7 +123,7 @@ export const LibraryTasks: React.FC = () => {
type DialogOpenState = typeof dialogOpen;
- const { configuration } = React.useContext(ConfigurationContext);
+ const { configuration } = useConfigurationContext();
const [configRead, setConfigRead] = useState(false);
useEffect(() => {
diff --git a/ui/v2.5/src/components/Setup/Setup.tsx b/ui/v2.5/src/components/Setup/Setup.tsx
index ab5411fe1..27f9b4e58 100644
--- a/ui/v2.5/src/components/Setup/Setup.tsx
+++ b/ui/v2.5/src/components/Setup/Setup.tsx
@@ -1,4 +1,4 @@
-import React, { useState, useContext, useCallback } from "react";
+import React, { useState, useCallback } from "react";
import { FormattedMessage, useIntl } from "react-intl";
import {
Alert,
@@ -15,7 +15,7 @@ import {
useSystemStatus,
} from "src/core/StashService";
import { useHistory } from "react-router-dom";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
import StashConfiguration from "../Settings/StashConfiguration";
import { Icon } from "../Shared/Icon";
import { LoadingIndicator } from "../Shared/LoadingIndicator";
@@ -518,6 +518,10 @@ const SetPathsStep: React.FC = ({ goBack, next }) => {
const [stashes, setStashes] = useState(
setupState.stashes ?? []
);
+ const [sfwContentMode, setSfwContentMode] = useState(
+ setupState.sfwContentMode ?? false
+ );
+
const [databaseFile, setDatabaseFile] = useState(
setupState.databaseFile ?? ""
);
@@ -555,6 +559,7 @@ const SetPathsStep: React.FC = ({ goBack, next }) => {
cacheLocation,
blobsLocation: storeBlobsInDatabase ? "" : blobsLocation,
storeBlobsInDatabase,
+ sfwContentMode,
};
next(input);
}
@@ -594,6 +599,22 @@ const SetPathsStep: React.FC = ({ goBack, next }) => {
/>
+
+
+
+
+
+
+
+
+ }
+ onChange={() => setSfwContentMode(!sfwContentMode)}
+ />
+
+
{overrideDatabase ? null : (
= ({ goBack }) => {
export const Setup: React.FC = () => {
const intl = useIntl();
- const { configuration, loading: configLoading } =
- useContext(ConfigurationContext);
+ const { configuration } = useConfigurationContext();
const [saveUI] = useConfigureUI();
@@ -1024,7 +1044,7 @@ export const Setup: React.FC = () => {
}
}
- if (configLoading || statusLoading) {
+ if (statusLoading) {
return ;
}
diff --git a/ui/v2.5/src/components/Shared/CountButton.tsx b/ui/v2.5/src/components/Shared/CountButton.tsx
index 1519c104b..ad099c2f5 100644
--- a/ui/v2.5/src/components/Shared/CountButton.tsx
+++ b/ui/v2.5/src/components/Shared/CountButton.tsx
@@ -1,10 +1,11 @@
-import { faEye } from "@fortawesome/free-solid-svg-icons";
+import { faEye, faThumbsUp } from "@fortawesome/free-solid-svg-icons";
import React from "react";
import { Button, ButtonGroup } from "react-bootstrap";
import { Icon } from "src/components/Shared/Icon";
import { SweatDrops } from "./SweatDrops";
import cx from "classnames";
import { useIntl } from "react-intl";
+import { useConfigurationContext } from "src/hooks/Config";
interface ICountButtonProps {
value: number;
@@ -63,11 +64,17 @@ export const ViewCountButton: React.FC = (props) => {
export const OCounterButton: React.FC = (props) => {
const intl = useIntl();
+ const { configuration } = useConfigurationContext();
+ const { sfwContentMode } = configuration.interface;
+
+ const icon = !sfwContentMode ? : ;
+ const messageID = !sfwContentMode ? "o_count" : "o_count_sfw";
+
return (
}
- title={intl.formatMessage({ id: "o_count" })}
+ icon={icon}
+ title={intl.formatMessage({ id: messageID })}
countTitle={intl.formatMessage({ id: "actions.view_history" })}
/>
);
diff --git a/ui/v2.5/src/components/Shared/DetailItem.tsx b/ui/v2.5/src/components/Shared/DetailItem.tsx
index a92f75868..76b595127 100644
--- a/ui/v2.5/src/components/Shared/DetailItem.tsx
+++ b/ui/v2.5/src/components/Shared/DetailItem.tsx
@@ -3,6 +3,7 @@ import { FormattedMessage } from "react-intl";
interface IDetailItem {
id?: string | null;
+ className?: string;
label?: React.ReactNode;
value?: React.ReactNode;
labelTitle?: string;
@@ -13,6 +14,7 @@ interface IDetailItem {
export const DetailItem: React.FC = ({
id,
+ className = "",
label,
value,
labelTitle,
@@ -30,7 +32,7 @@ export const DetailItem: React.FC = ({
const sanitisedID = id.replace(/_/g, "-");
return (
-
+
{message}
{fullWidth ? ":" : ""}
diff --git a/ui/v2.5/src/components/Shared/GridCard/StudioOverlay.tsx b/ui/v2.5/src/components/Shared/GridCard/StudioOverlay.tsx
index 875b122d8..9bfd25071 100644
--- a/ui/v2.5/src/components/Shared/GridCard/StudioOverlay.tsx
+++ b/ui/v2.5/src/components/Shared/GridCard/StudioOverlay.tsx
@@ -1,6 +1,6 @@
import React, { useMemo } from "react";
import { Link } from "react-router-dom";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
interface IStudio {
id: string;
@@ -11,7 +11,7 @@ interface IStudio {
export const StudioOverlay: React.FC<{
studio: IStudio | null | undefined;
}> = ({ studio }) => {
- const { configuration } = React.useContext(ConfigurationContext);
+ const { configuration } = useConfigurationContext();
const configValue = configuration?.interface.showStudioAsText;
diff --git a/ui/v2.5/src/components/Shared/PopoverCountButton.tsx b/ui/v2.5/src/components/Shared/PopoverCountButton.tsx
index 79a36bd9d..d652ff6ad 100644
--- a/ui/v2.5/src/components/Shared/PopoverCountButton.tsx
+++ b/ui/v2.5/src/components/Shared/PopoverCountButton.tsx
@@ -11,14 +11,14 @@ import React from "react";
import { Button, OverlayTrigger, Tooltip } from "react-bootstrap";
import { FormattedNumber, useIntl } from "react-intl";
import { Link } from "react-router-dom";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
import TextUtils from "src/utils/text";
import { Icon } from "./Icon";
export const Count: React.FC<{
count: number;
}> = ({ count }) => {
- const { configuration } = React.useContext(ConfigurationContext);
+ const { configuration } = useConfigurationContext();
const abbreviateCounter = configuration?.ui.abbreviateCounters ?? false;
if (!abbreviateCounter) {
diff --git a/ui/v2.5/src/components/Shared/Rating/RatingSystem.tsx b/ui/v2.5/src/components/Shared/Rating/RatingSystem.tsx
index a0a11c363..11103acf8 100644
--- a/ui/v2.5/src/components/Shared/Rating/RatingSystem.tsx
+++ b/ui/v2.5/src/components/Shared/Rating/RatingSystem.tsx
@@ -1,5 +1,4 @@
-import React from "react";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
import {
defaultRatingStarPrecision,
defaultRatingSystemOptions,
@@ -23,7 +22,7 @@ export interface IRatingSystemProps {
export const RatingSystem = PatchComponent(
"RatingSystem",
(props: IRatingSystemProps) => {
- const { configuration: config } = React.useContext(ConfigurationContext);
+ const { configuration: config } = useConfigurationContext();
const ratingSystemOptions =
config?.ui.ratingSystemOptions ?? defaultRatingSystemOptions;
diff --git a/ui/v2.5/src/components/Shared/RatingBanner.tsx b/ui/v2.5/src/components/Shared/RatingBanner.tsx
index d152b8b52..d94b26433 100644
--- a/ui/v2.5/src/components/Shared/RatingBanner.tsx
+++ b/ui/v2.5/src/components/Shared/RatingBanner.tsx
@@ -1,4 +1,4 @@
-import React, { useContext } from "react";
+import React from "react";
import { FormattedMessage } from "react-intl";
import {
convertToRatingFormat,
@@ -6,14 +6,14 @@ import {
RatingStarPrecision,
RatingSystemType,
} from "src/utils/rating";
-import { ConfigurationContext } from "src/hooks/Config";
+import { useConfigurationContext } from "src/hooks/Config";
interface IProps {
rating?: number | null;
}
export const RatingBanner: React.FC = ({ rating }) => {
- const { configuration: config } = useContext(ConfigurationContext);
+ const { configuration: config } = useConfigurationContext();
const ratingSystemOptions =
config?.ui.ratingSystemOptions ?? defaultRatingSystemOptions;
const isLegacy =
diff --git a/ui/v2.5/src/components/Shared/ScrapeDialog/ScrapeDialog.tsx b/ui/v2.5/src/components/Shared/ScrapeDialog/ScrapeDialog.tsx
index 59d5f3985..b67c55f41 100644
--- a/ui/v2.5/src/components/Shared/ScrapeDialog/ScrapeDialog.tsx
+++ b/ui/v2.5/src/components/Shared/ScrapeDialog/ScrapeDialog.tsx
@@ -24,6 +24,7 @@ import { CountrySelect } from "../CountrySelect";
import { StringListInput } from "../StringListInput";
import { ImageSelector } from "../ImageSelector";
import { ScrapeResult } from "./scrapeResult";
+import { useConfigurationContext } from "src/hooks/Config";
interface IScrapedFieldProps {
result: ScrapeResult;
@@ -31,6 +32,7 @@ interface IScrapedFieldProps {
interface IScrapedRowProps extends IScrapedFieldProps {
className?: string;
+ field: string;
title: string;
renderOriginalField: (result: ScrapeResult) => JSX.Element | undefined;
renderNewField: (result: ScrapeResult) => JSX.Element | undefined;
@@ -105,7 +107,10 @@ export const ScrapeDialogRow = (props: IScrapedRowProps) => {
}
return (
-
+
{props.title}
@@ -175,6 +180,8 @@ function getNameString(value: string) {
interface IScrapedInputGroupRowProps {
title: string;
+ field: string;
+ className?: string;
placeholder?: string;
result: ScrapeResult;
locked?: boolean;
@@ -187,6 +194,8 @@ export const ScrapedInputGroupRow: React.FC = (
return (
(
= (props) => {
interface IScrapedStringListRowProps {
title: string;
+ field: string;
placeholder?: string;
result: ScrapeResult;
locked?: boolean;
@@ -253,6 +263,7 @@ export const ScrapedStringListRow: React.FC = (
(
= (
return (
(
= (props) => {
interface IScrapedImageRowProps {
title: string;
+ field: string;
className?: string;
result: ScrapeResult;
onChange: (value: ScrapeResult) => void;
@@ -355,6 +368,7 @@ export const ScrapedImageRow: React.FC = (props) => {
return (
(
= (props) => {
interface IScrapedImagesRowProps {
title: string;
+ field: string;
className?: string;
result: ScrapeResult;
images: string[];
@@ -397,6 +412,7 @@ export const ScrapedImagesRow: React.FC = (props) => {
return (
(
= (
props: IScrapeDialogProps
) => {
const intl = useIntl();
+ const { configuration } = useConfigurationContext();
+ const { sfwContentMode } = configuration.interface;
+
return (
= (
text: intl.formatMessage({ id: "actions.cancel" }),
variant: "secondary",
}}
- modalProps={{ size: "lg", dialogClassName: "scrape-dialog" }}
+ modalProps={{
+ size: "lg",
+ dialogClassName: `scrape-dialog ${sfwContentMode ? "sfw-mode" : ""}`,
+ }}
>