@@ -370,3 +331,17 @@ export const Performer: React.FC = () => {
);
};
+
+const PerformerLoader: React.FC = () => {
+ const { id } = useParams<{ id?: string }>();
+ const { data, loading, error } = useFindPerformer(id ?? "");
+
+ if (loading) return
;
+ if (error) return
;
+ if (!data?.findPerformer)
+ return
;
+
+ return
;
+};
+
+export default PerformerLoader;
diff --git a/ui/v2.5/src/components/Performers/PerformerDetails/PerformerCreate.tsx b/ui/v2.5/src/components/Performers/PerformerDetails/PerformerCreate.tsx
new file mode 100644
index 000000000..33b60f92b
--- /dev/null
+++ b/ui/v2.5/src/components/Performers/PerformerDetails/PerformerCreate.tsx
@@ -0,0 +1,42 @@
+import React, { useState } from "react";
+import { LoadingIndicator } from "src/components/Shared";
+import { PerformerEditPanel } from "./PerformerEditPanel";
+
+const PerformerCreate: React.FC = () => {
+ const [imagePreview, setImagePreview] = useState
();
+ const [imageEncoding, setImageEncoding] = useState(false);
+
+ const activeImage = imagePreview ?? "";
+
+ const onImageChange = (image?: string | null) => setImagePreview(image);
+ const onImageEncoding = (isEncoding = false) => setImageEncoding(isEncoding);
+
+ function renderPerformerImage() {
+ if (imageEncoding) {
+ return ;
+ }
+ if (activeImage) {
+ return
;
+ }
+ }
+
+ return (
+
+
+ {renderPerformerImage()}
+
+
+
+ );
+};
+
+export default PerformerCreate;
diff --git a/ui/v2.5/src/components/Performers/PerformerDetails/PerformerDetailsPanel.tsx b/ui/v2.5/src/components/Performers/PerformerDetails/PerformerDetailsPanel.tsx
index 4afb3c172..03223a9c3 100644
--- a/ui/v2.5/src/components/Performers/PerformerDetails/PerformerDetailsPanel.tsx
+++ b/ui/v2.5/src/components/Performers/PerformerDetails/PerformerDetailsPanel.tsx
@@ -7,7 +7,7 @@ import { TextField, URLField } from "src/utils/field";
import { genderToString } from "src/utils/gender";
interface IPerformerDetails {
- performer: Partial;
+ performer: GQL.PerformerDataFragment;
}
export const PerformerDetailsPanel: React.FC = ({
@@ -17,7 +17,7 @@ export const PerformerDetailsPanel: React.FC = ({
const intl = useIntl();
function renderTagsField() {
- if (!performer.tags?.length) {
+ if (!performer.tags.length) {
return;
}
@@ -38,7 +38,7 @@ export const PerformerDetailsPanel: React.FC = ({
}
function renderStashIDs() {
- if (!performer.stash_ids?.length) {
+ if (!performer.stash_ids.length) {
return;
}
diff --git a/ui/v2.5/src/components/Performers/PerformerDetails/PerformerGalleriesPanel.tsx b/ui/v2.5/src/components/Performers/PerformerDetails/PerformerGalleriesPanel.tsx
index 7d1810bac..e7f4f020c 100644
--- a/ui/v2.5/src/components/Performers/PerformerDetails/PerformerGalleriesPanel.tsx
+++ b/ui/v2.5/src/components/Performers/PerformerDetails/PerformerGalleriesPanel.tsx
@@ -4,7 +4,7 @@ import { GalleryList } from "src/components/Galleries/GalleryList";
import { performerFilterHook } from "src/core/performers";
interface IPerformerDetailsProps {
- performer: Partial;
+ performer: GQL.PerformerDataFragment;
}
export const PerformerGalleriesPanel: React.FC = ({
diff --git a/ui/v2.5/src/components/Performers/PerformerDetails/PerformerImagesPanel.tsx b/ui/v2.5/src/components/Performers/PerformerDetails/PerformerImagesPanel.tsx
index cb242c580..6e22700ad 100644
--- a/ui/v2.5/src/components/Performers/PerformerDetails/PerformerImagesPanel.tsx
+++ b/ui/v2.5/src/components/Performers/PerformerDetails/PerformerImagesPanel.tsx
@@ -4,7 +4,7 @@ import { ImageList } from "src/components/Images/ImageList";
import { performerFilterHook } from "src/core/performers";
interface IPerformerImagesPanel {
- performer: Partial;
+ performer: GQL.PerformerDataFragment;
}
export const PerformerImagesPanel: React.FC = ({
diff --git a/ui/v2.5/src/components/Performers/PerformerDetails/PerformerMoviesPanel.tsx b/ui/v2.5/src/components/Performers/PerformerDetails/PerformerMoviesPanel.tsx
index 4176bfb3d..f3facc01b 100644
--- a/ui/v2.5/src/components/Performers/PerformerDetails/PerformerMoviesPanel.tsx
+++ b/ui/v2.5/src/components/Performers/PerformerDetails/PerformerMoviesPanel.tsx
@@ -4,7 +4,7 @@ import { MovieList } from "src/components/Movies/MovieList";
import { performerFilterHook } from "src/core/performers";
interface IPerformerDetailsProps {
- performer: Partial;
+ performer: GQL.PerformerDataFragment;
}
export const PerformerMoviesPanel: React.FC = ({
diff --git a/ui/v2.5/src/components/Performers/PerformerDetails/PerformerOperationsPanel.tsx b/ui/v2.5/src/components/Performers/PerformerDetails/PerformerOperationsPanel.tsx
index 24c710f26..66c658054 100644
--- a/ui/v2.5/src/components/Performers/PerformerDetails/PerformerOperationsPanel.tsx
+++ b/ui/v2.5/src/components/Performers/PerformerDetails/PerformerOperationsPanel.tsx
@@ -6,7 +6,7 @@ import { mutateMetadataAutoTag } from "src/core/StashService";
import { useToast } from "src/hooks";
interface IPerformerOperationsProps {
- performer: Partial;
+ performer: GQL.PerformerDataFragment;
}
export const PerformerOperationsPanel: React.FC = ({
@@ -15,9 +15,6 @@ export const PerformerOperationsPanel: React.FC = ({
const Toast = useToast();
async function onAutoTag() {
- if (!performer?.id) {
- return;
- }
try {
await mutateMetadataAutoTag({ performers: [performer.id] });
Toast.success({ content: "Started auto tagging" });
diff --git a/ui/v2.5/src/components/Performers/PerformerDetails/PerformerScenesPanel.tsx b/ui/v2.5/src/components/Performers/PerformerDetails/PerformerScenesPanel.tsx
index 64464cffa..6cc07b390 100644
--- a/ui/v2.5/src/components/Performers/PerformerDetails/PerformerScenesPanel.tsx
+++ b/ui/v2.5/src/components/Performers/PerformerDetails/PerformerScenesPanel.tsx
@@ -4,7 +4,7 @@ import { SceneList } from "src/components/Scenes/SceneList";
import { performerFilterHook } from "src/core/performers";
interface IPerformerDetailsProps {
- performer: Partial;
+ performer: GQL.PerformerDataFragment;
}
export const PerformerScenesPanel: React.FC = ({
diff --git a/ui/v2.5/src/components/Performers/Performers.tsx b/ui/v2.5/src/components/Performers/Performers.tsx
index 53aa517c8..f221feba4 100644
--- a/ui/v2.5/src/components/Performers/Performers.tsx
+++ b/ui/v2.5/src/components/Performers/Performers.tsx
@@ -1,7 +1,8 @@
import React from "react";
import { Route, Switch } from "react-router-dom";
import { PersistanceLevel } from "src/hooks/ListHook";
-import { Performer } from "./PerformerDetails/Performer";
+import Performer from "./PerformerDetails/Performer";
+import PerformerCreate from "./PerformerDetails/PerformerCreate";
import { PerformerList } from "./PerformerList";
const Performers = () => (
@@ -13,6 +14,7 @@ const Performers = () => (
)}
/>
+
);
diff --git a/ui/v2.5/src/components/Scenes/SceneDetails/Scene.tsx b/ui/v2.5/src/components/Scenes/SceneDetails/Scene.tsx
index 0e2d14220..413f981e5 100644
--- a/ui/v2.5/src/components/Scenes/SceneDetails/Scene.tsx
+++ b/ui/v2.5/src/components/Scenes/SceneDetails/Scene.tsx
@@ -38,12 +38,12 @@ import { SceneGenerateDialog } from "../SceneGenerateDialog";
import { SceneVideoFilterPanel } from "./SceneVideoFilterPanel";
import { OrganizedButton } from "./OrganizedButton";
-interface ISceneParams {
- id?: string;
+interface IProps {
+ scene: GQL.SceneDataFragment;
+ refetch: () => void;
}
-export const Scene: React.FC = () => {
- const { id = "new" } = useParams();
+const ScenePage: React.FC = ({ scene, refetch }) => {
const location = useLocation();
const history = useHistory();
const Toast = useToast();
@@ -53,18 +53,16 @@ export const Scene: React.FC = () => {
const [timestamp, setTimestamp] = useState(getInitialTimestamp());
const [collapsed, setCollapsed] = useState(false);
- const { data, error, loading, refetch } = useFindScene(id);
- const scene = data?.findScene;
const {
data: sceneStreams,
error: streamableError,
loading: streamableLoading,
- } = useSceneStreams(id);
+ } = useSceneStreams(scene.id);
const [oLoading, setOLoading] = useState(false);
- const [incrementO] = useSceneIncrementO(scene?.id ?? "0");
- const [decrementO] = useSceneDecrementO(scene?.id ?? "0");
- const [resetO] = useSceneResetO(scene?.id ?? "0");
+ const [incrementO] = useSceneIncrementO(scene.id);
+ const [decrementO] = useSceneDecrementO(scene.id);
+ const [resetO] = useSceneResetO(scene.id);
const [organizedLoading, setOrganizedLoading] = useState(false);
@@ -85,7 +83,7 @@ export const Scene: React.FC = () => {
const queryParams = queryString.parse(location.search);
const autoplay = queryParams?.autoplay === "true";
- const currentQueueIndex = queueScenes.findIndex((s) => s.id === id);
+ const currentQueueIndex = queueScenes.findIndex((s) => s.id === scene.id);
async function getQueueFilterScenes(filter: ListFilterModel) {
const query = await queryFindScenes(filter);
@@ -113,7 +111,7 @@ export const Scene: React.FC = () => {
useEffect(() => {
setRerenderPlayer(true);
- }, [id]);
+ }, [scene.id]);
useEffect(() => {
setSceneQueue(SceneQueue.fromQueryParameters(location.search));
@@ -142,8 +140,8 @@ export const Scene: React.FC = () => {
await updateScene({
variables: {
input: {
- id: scene?.id ?? "",
- organized: !scene?.organized,
+ id: scene.id,
+ organized: !scene.organized,
},
},
});
@@ -192,10 +190,6 @@ export const Scene: React.FC = () => {
}
async function onRescan() {
- if (!scene) {
- return;
- }
-
await mutateMetadataScan({
paths: [scene.path],
});
@@ -214,10 +208,6 @@ export const Scene: React.FC = () => {
}
async function onGenerateScreenshot(at?: number) {
- if (!scene) {
- return;
- }
-
await generateScreenshot({
variables: {
id: scene.id,
@@ -323,7 +313,7 @@ export const Scene: React.FC = () => {
}
function maybeRenderDeleteDialog() {
- if (isDeleteAlertOpen && scene) {
+ if (isDeleteAlertOpen) {
return (
);
@@ -331,7 +321,7 @@ export const Scene: React.FC = () => {
}
function maybeRenderSceneGenerateDialog() {
- if (isGenerateDialogOpen && scene) {
+ if (isGenerateDialogOpen) {
return (
{
}
}
- function renderOperations() {
- return (
-
-
-
- onRescan()}
- >
-
-
- setIsGenerateDialogOpen(true)}
- >
-
-
-
- onGenerateScreenshot(JWUtils.getPlayer().getPosition())
- }
- >
-
-
- onGenerateScreenshot()}
- >
-
-
- setIsDeleteAlertOpen(true)}
- >
-
-
-
-
- );
- }
-
- function renderTabs() {
- if (!scene) {
- return;
- }
-
- return (
- k && setActiveTabKey(k)}
+ const renderOperations = () => (
+
+
+
+ onRescan()}
+ >
+
+
+ setIsGenerateDialogOpen(true)}
+ >
+
+
+
+ onGenerateScreenshot(JWUtils.getPlayer().getPosition())
+ }
+ >
+
+
+ onGenerateScreenshot()}
+ >
+
+
+ setIsDeleteAlertOpen(true)}
+ >
+
+
+
+
+ );
-
-
-
-
-
- playScene(sceneID)}
- onNext={onQueueNext}
- onPrevious={onQueuePrevious}
- onRandom={onQueueRandom}
- start={queueStart}
- hasMoreScenes={queueHasMoreScenes()}
- onLessScenes={() => onQueueLessScenes()}
- onMoreScenes={() => onQueueMoreScenes()}
- />
-
-
-
-
-
-
-
- {scene.galleries.length === 1 && (
-
-
-
+ const renderTabs = () => (
+ k && setActiveTabKey(k)}
+ >
+
+
+
+
+
+
+
+
+
+ playScene(sceneID)}
+ onNext={onQueueNext}
+ onPrevious={onQueuePrevious}
+ onRandom={onQueueRandom}
+ start={queueStart}
+ hasMoreScenes={queueHasMoreScenes()}
+ onLessScenes={() => onQueueLessScenes()}
+ onMoreScenes={() => onQueueMoreScenes()}
+ />
+
+
+
+
+
+
+
+ {scene.galleries.length === 1 && (
+
+
-
-
+ )}
+ {scene.galleries.length > 1 && (
+
+
-
- setIsDeleteAlertOpen(true)}
- onUpdate={() => refetch()}
- />
-
-
-
- );
- }
+ )}
+
+
+
+
+
+
+
+ setIsDeleteAlertOpen(true)}
+ onUpdate={() => refetch()}
+ />
+
+
+
+ );
// set up hotkeys
useEffect(() => {
@@ -582,10 +561,8 @@ export const Scene: React.FC = () => {
return collapsed ? ">" : "<";
}
- if (loading || streamableLoading) return ;
- if (error) return ;
+ if (streamableLoading) return ;
if (streamableError) return ;
- if (!scene) return ;
return (
@@ -638,3 +615,17 @@ export const Scene: React.FC = () => {
);
};
+
+const SceneLoader: React.FC = () => {
+ const { id } = useParams<{ id?: string }>();
+ const { data, loading, error, refetch } = useFindScene(id ?? "");
+
+ if (loading) return ;
+ if (error) return ;
+ if (!data?.findScene)
+ return ;
+
+ return ;
+};
+
+export default SceneLoader;
diff --git a/ui/v2.5/src/components/Scenes/Scenes.tsx b/ui/v2.5/src/components/Scenes/Scenes.tsx
index 0f301f7f5..d485d3a16 100644
--- a/ui/v2.5/src/components/Scenes/Scenes.tsx
+++ b/ui/v2.5/src/components/Scenes/Scenes.tsx
@@ -1,7 +1,7 @@
import React from "react";
import { Route, Switch } from "react-router-dom";
import { PersistanceLevel } from "src/hooks/ListHook";
-import { Scene } from "./SceneDetails/Scene";
+import Scene from "./SceneDetails/Scene";
import { SceneList } from "./SceneList";
import { SceneMarkerList } from "./SceneMarkerList";
diff --git a/ui/v2.5/src/components/Studios/StudioDetails/Studio.tsx b/ui/v2.5/src/components/Studios/StudioDetails/Studio.tsx
index 984e60c5c..fd528b16d 100644
--- a/ui/v2.5/src/components/Studios/StudioDetails/Studio.tsx
+++ b/ui/v2.5/src/components/Studios/StudioDetails/Studio.tsx
@@ -2,14 +2,12 @@ import { Tabs, Tab } from "react-bootstrap";
import React, { useEffect, useState } from "react";
import { useParams, useHistory } from "react-router-dom";
import { FormattedMessage, useIntl } from "react-intl";
-import cx from "classnames";
import Mousetrap from "mousetrap";
import * as GQL from "src/core/generated-graphql";
import {
useFindStudio,
useStudioUpdate,
- useStudioCreate,
useStudioDestroy,
mutateMetadataAutoTag,
} from "src/core/StashService";
@@ -30,32 +28,29 @@ import { StudioEditPanel } from "./StudioEditPanel";
import { StudioDetailsPanel } from "./StudioDetailsPanel";
import { StudioMoviesPanel } from "./StudioMoviesPanel";
+interface IProps {
+ studio: GQL.StudioDataFragment;
+}
+
interface IStudioParams {
- id?: string;
tab?: string;
}
-export const Studio: React.FC = () => {
+const StudioPage: React.FC = ({ studio }) => {
const history = useHistory();
const Toast = useToast();
const intl = useIntl();
- const { tab = "details", id = "new" } = useParams();
- const isNew = id === "new";
+ const { tab = "details" } = useParams();
// Editing state
- const [isEditing, setIsEditing] = useState(isNew);
+ const [isEditing, setIsEditing] = useState(false);
const [isDeleteAlertOpen, setIsDeleteAlertOpen] = useState(false);
// Studio state
const [image, setImage] = useState();
- const { data, loading: studioLoading, error } = useFindStudio(id);
- const studio = data?.findStudio;
-
- const [isLoading, setIsLoading] = useState(false);
const [updateStudio] = useStudioUpdate();
- const [createStudio] = useStudioCreate();
- const [deleteStudio] = useStudioDestroy({ id });
+ const [deleteStudio] = useStudioDestroy({ id: studio.id });
// set up hotkeys
useEffect(() => {
@@ -68,53 +63,29 @@ export const Studio: React.FC = () => {
};
});
- useEffect(() => {
- if (data && data.findStudio) {
- setImage(undefined);
- }
- }, [data]);
-
function onImageLoad(imageData: string) {
setImage(imageData);
}
const imageEncoding = ImageUtils.usePasteImage(onImageLoad, isEditing);
- async function onSave(
- input: Partial
- ) {
+ async function onSave(input: Partial) {
try {
- setIsLoading(true);
-
- if (!isNew) {
- const result = await updateStudio({
- variables: {
- input: input as GQL.StudioUpdateInput,
- },
- });
- if (result.data?.studioUpdate) {
- setIsEditing(false);
- }
- } else {
- const result = await createStudio({
- variables: {
- input: input as GQL.StudioCreateInput,
- },
- });
- if (result.data?.studioCreate?.id) {
- history.push(`/studios/${result.data.studioCreate.id}`);
- setIsEditing(false);
- }
+ const result = await updateStudio({
+ variables: {
+ input: input as GQL.StudioUpdateInput,
+ },
+ });
+ if (result.data?.studioUpdate) {
+ setIsEditing(false);
}
} catch (e) {
Toast.error(e);
- } finally {
- setIsLoading(false);
}
}
async function onAutoTag() {
- if (!studio?.id) return;
+ if (!studio.id) return;
try {
await mutateMetadataAutoTag({ studios: [studio.id] });
Toast.success({
@@ -153,7 +124,7 @@ export const Studio: React.FC = () => {
id="dialogs.delete_confirm"
values={{
entityName:
- studio?.name ??
+ studio.name ??
intl.formatMessage({ id: "studio" }).toLocaleLowerCase(),
}}
/>
@@ -167,7 +138,7 @@ export const Studio: React.FC = () => {
}
function renderImage() {
- let studioImage = studio?.image_path;
+ let studioImage = studio.image_path;
if (isEditing) {
if (image === null) {
studioImage = `${studioImage}&default=true`;
@@ -177,9 +148,7 @@ export const Studio: React.FC = () => {
}
if (studioImage) {
- return (
-
- );
+ return
;
}
}
@@ -194,31 +163,13 @@ export const Studio: React.FC = () => {
const setActiveTabKey = (newTab: string | null) => {
if (tab !== newTab) {
const tabParam = newTab === "scenes" ? "" : `/${newTab}`;
- history.replace(`/studios/${id}${tabParam}`);
+ history.replace(`/studios/${studio.id}${tabParam}`);
}
};
- if (isLoading || studioLoading) return ;
- if (error) return ;
- if (!studio?.id && !isNew)
- return ;
-
return (
-
- {isNew && (
-
- {intl.formatMessage(
- { id: "actions.add_entity" },
- { entityType: intl.formatMessage({ id: "studio" }) }
- )}
-
- )}
+
{imageEncoding ? (
@@ -226,12 +177,12 @@ export const Studio: React.FC = () => {
renderImage()
)}
- {!isEditing && !isNew && studio ? (
+ {!isEditing ? (
<>
{}}
@@ -243,7 +194,7 @@ export const Studio: React.FC = () => {
>
) : (
)}
+ studio={studio}
onSubmit={onSave}
onCancel={onToggleEdit}
onDelete={onDelete}
@@ -251,46 +202,58 @@ export const Studio: React.FC = () => {
/>
)}
- {studio?.id && (
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- )}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{renderDeleteAlert()}
);
};
+
+const StudioLoader: React.FC = () => {
+ const { id } = useParams<{ id?: string }>();
+ const { data, loading, error } = useFindStudio(id ?? "");
+
+ if (loading) return ;
+ if (error) return ;
+ if (!data?.findStudio)
+ return ;
+
+ return ;
+};
+
+export default StudioLoader;
diff --git a/ui/v2.5/src/components/Studios/StudioDetails/StudioChildrenPanel.tsx b/ui/v2.5/src/components/Studios/StudioDetails/StudioChildrenPanel.tsx
index a8ef45547..cd4eddec0 100644
--- a/ui/v2.5/src/components/Studios/StudioDetails/StudioChildrenPanel.tsx
+++ b/ui/v2.5/src/components/Studios/StudioDetails/StudioChildrenPanel.tsx
@@ -5,7 +5,7 @@ import { ListFilterModel } from "src/models/list-filter/filter";
import { StudioList } from "../StudioList";
interface IStudioChildrenPanel {
- studio: Partial;
+ studio: GQL.StudioDataFragment;
}
export const StudioChildrenPanel: React.FC = ({
diff --git a/ui/v2.5/src/components/Studios/StudioDetails/StudioCreate.tsx b/ui/v2.5/src/components/Studios/StudioDetails/StudioCreate.tsx
new file mode 100644
index 000000000..080eb7242
--- /dev/null
+++ b/ui/v2.5/src/components/Studios/StudioDetails/StudioCreate.tsx
@@ -0,0 +1,79 @@
+import React, { useState } from "react";
+import { useHistory } from "react-router-dom";
+import { useIntl } from "react-intl";
+
+import * as GQL from "src/core/generated-graphql";
+import { useStudioCreate } from "src/core/StashService";
+import { ImageUtils } from "src/utils";
+import { LoadingIndicator } from "src/components/Shared";
+import { useToast } from "src/hooks";
+import { StudioEditPanel } from "./StudioEditPanel";
+
+const StudioCreate: React.FC = () => {
+ const history = useHistory();
+ const Toast = useToast();
+ const intl = useIntl();
+
+ // Studio state
+ const [image, setImage] = useState();
+
+ const [createStudio] = useStudioCreate();
+
+ function onImageLoad(imageData: string) {
+ setImage(imageData);
+ }
+
+ const imageEncoding = ImageUtils.usePasteImage(onImageLoad, true);
+
+ async function onSave(
+ input: Partial
+ ) {
+ try {
+ const result = await createStudio({
+ variables: {
+ input: input as GQL.StudioCreateInput,
+ },
+ });
+ if (result.data?.studioCreate?.id) {
+ history.push(`/studios/${result.data.studioCreate.id}`);
+ }
+ } catch (e) {
+ Toast.error(e);
+ }
+ }
+
+ function renderImage() {
+ if (image) {
+ return
;
+ }
+ }
+
+ return (
+
+
+
+ {intl.formatMessage(
+ { id: "actions.add_entity" },
+ { entityType: intl.formatMessage({ id: "studio" }) }
+ )}
+
+
+ {imageEncoding ? (
+
+ ) : (
+ renderImage()
+ )}
+
+
history.push("/studios")}
+ onDelete={() => {}}
+ />
+
+
+ );
+};
+
+export default StudioCreate;
diff --git a/ui/v2.5/src/components/Studios/StudioDetails/StudioDetailsPanel.tsx b/ui/v2.5/src/components/Studios/StudioDetails/StudioDetailsPanel.tsx
index 838d2ebe7..c05e7eca4 100644
--- a/ui/v2.5/src/components/Studios/StudioDetails/StudioDetailsPanel.tsx
+++ b/ui/v2.5/src/components/Studios/StudioDetails/StudioDetailsPanel.tsx
@@ -7,7 +7,7 @@ import { RatingStars } from "src/components/Scenes/SceneDetails/RatingStars";
import { TextField, URLField } from "src/utils/field";
interface IStudioDetailsPanel {
- studio: Partial;
+ studio: GQL.StudioDataFragment;
}
export const StudioDetailsPanel: React.FC = ({
@@ -31,7 +31,7 @@ export const StudioDetailsPanel: React.FC = ({
}
function renderTagsList() {
- if (!studio?.aliases?.length) {
+ if (!studio.aliases?.length) {
return;
}
diff --git a/ui/v2.5/src/components/Studios/StudioDetails/StudioEditPanel.tsx b/ui/v2.5/src/components/Studios/StudioDetails/StudioEditPanel.tsx
index 1f6f227ae..fa793fa12 100644
--- a/ui/v2.5/src/components/Studios/StudioDetails/StudioEditPanel.tsx
+++ b/ui/v2.5/src/components/Studios/StudioDetails/StudioEditPanel.tsx
@@ -211,7 +211,12 @@ export const StudioEditPanel: React.FC = ({
<>
{
+ // Check if it's a redirect after studio creation
+ if (action === "PUSH" && location.pathname.startsWith("/studios/"))
+ return true;
+ return intl.formatMessage({ id: "dialogs.unsaved_changes" });
+ }}
/>