diff --git a/packages/components/src/api/ApiConfig.ts b/packages/components/src/api/ApiConfig.ts
index 453ba0d200..1fc776580c 100644
--- a/packages/components/src/api/ApiConfig.ts
+++ b/packages/components/src/api/ApiConfig.ts
@@ -46,7 +46,8 @@ class ApiConfig {
break;
case "storyteller.ai":
case "staging.storyteller.ai":
- apiHost = "api.storyteller.ai";
+ //apiHost = "api.storyteller.ai";
+ apiHost = "api.fakeyou.com";
break;
case "storyteller.stream":
// Storyteller.stream is deprecated and will be decommissioned in the future.
@@ -61,7 +62,8 @@ class ApiConfig {
case "devproxy.storyteller.ai":
case "devproxy.storyteller.ai:7000":
case "devproxy.storyteller.ai:7001":
- apiHost = "api.storyteller.ai";
+ //apiHost = "api.storyteller.ai";
+ apiHost = "api.fakeyou.com";
useSsl = true;
break;
case "dev.fakeyou.com":
diff --git a/packages/components/src/api/GetApiHost.ts b/packages/components/src/api/GetApiHost.ts
index f49b5d2b6f..e2a7547b83 100644
--- a/packages/components/src/api/GetApiHost.ts
+++ b/packages/components/src/api/GetApiHost.ts
@@ -15,13 +15,15 @@ export default function GetApiHost() {
return hostConfig("api.fakeyou.com");
case "storyteller.ai":
case "staging.storyteller.ai":
- return hostConfig("api.storyteller.ai");
+ //return hostConfig("api.storyteller.ai");
+ return hostConfig("api.fakeyou.com");
case "storyteller.stream": // Storyteller.stream is deprecated and will be decommissioned in the future.
return hostConfig("api.storyteller.stream");
case "devproxy.fakeyou.com":
return hostConfig("api.fakeyou.com");
case "devproxy.storyteller.ai":
- return hostConfig("api.storyteller.ai");
+ //return hostConfig("api.storyteller.ai");
+ return hostConfig("api.fakeyou.com");
case "dev.fakeyou.com":
return hostConfig("api.dev.fakeyou.com:12345",false); // false disables SSL
default:
diff --git a/packages/components/src/api/enums/MediaFileClass.ts b/packages/components/src/api/enums/MediaFileClass.ts
new file mode 100644
index 0000000000..69d222b55e
--- /dev/null
+++ b/packages/components/src/api/enums/MediaFileClass.ts
@@ -0,0 +1,27 @@
+
+export enum MediaFileClass {
+ /// Unknown (default value)
+ /// This will be present until we migrate all old files.
+ Unknown = "unknown",
+
+ /// Audio files: wav, mp3, etc.
+ Audio = "audio",
+
+ /// Image files: png, jpeg, etc.
+ Image = "image",
+
+ /// Video files: mp4, etc.
+ Video = "video",
+
+ /// Engine "animations"
+ Animation = "animation",
+
+ /// Engine "characters"
+ Character = "character",
+
+ /// Engine "prop" items
+ Prop = "prop",
+
+ /// Engine scenes (internal and external scenes)
+ Scene = "scene",
+}
diff --git a/packages/fakeyou.com/src/common/UsePrefixedDocumentTitle.tsx b/packages/fakeyou.com/src/common/UsePrefixedDocumentTitle.tsx
index 08a99eabca..c1bdc08362 100644
--- a/packages/fakeyou.com/src/common/UsePrefixedDocumentTitle.tsx
+++ b/packages/fakeyou.com/src/common/UsePrefixedDocumentTitle.tsx
@@ -1,12 +1,35 @@
import { useDocumentTitle } from "@storyteller/components/src/hooks/UseDocumentTitle"
+import { DomainConfig, Website, getCurrentDomainConfig } from "utils/domainConfig";
-const DEFAULT_FOR_EMPTY_TITLE = "FakeYou. Deep Fake Text to Speech.";
+const FAKEYOU_DEFAULT_TITLE = "FakeYou. Deep Fake Text to Speech.";
+const FAKEYOU_SUFFIX = "FakeYou";
+
+const STORYTELLER_DEFAULT_TITLE = "Storyteller.ai - AI Film and Movie Tools";
+const STORYTELLER_SUFFIX = "Storyteller.ai";
export function usePrefixedDocumentTitle(title?: string) {
+ const domainConfig : DomainConfig = getCurrentDomainConfig();
+
const fixed = title === undefined ? "" : title.trim();
+
+ let defaultTitle;
+ let defaultSuffix;
+
+ switch (domainConfig.website) {
+ case Website.FakeYou:
+ defaultTitle = FAKEYOU_DEFAULT_TITLE;
+ defaultSuffix = FAKEYOU_SUFFIX;
+ break;
+ case Website.StorytellerAi:
+ default:
+ defaultTitle = STORYTELLER_DEFAULT_TITLE;
+ defaultSuffix = STORYTELLER_SUFFIX;
+ break;
+ }
+
// NB: Choice of a vertical bar "|" separator is due to conserving pixels, which *might* matter to SEO.
// I haven't fully investigated the veracity of this, nor the position of prefixes, suffixes, etc.
// https://www.searchenginejournal.com/pipe-or-dash-in-title-tag/378099/#close
- const outputTitle = fixed.length === 0 ? DEFAULT_FOR_EMPTY_TITLE : `${fixed} | FakeYou`;
+ const outputTitle = fixed.length === 0 ? defaultTitle : `${fixed} | ${defaultSuffix}`;
useDocumentTitle(outputTitle);
}
diff --git a/packages/fakeyou.com/src/components/entities/EntityInput/EntityInput.tsx b/packages/fakeyou.com/src/components/entities/EntityInput/EntityInput.tsx
index 176965a1ea..f63e509945 100644
--- a/packages/fakeyou.com/src/components/entities/EntityInput/EntityInput.tsx
+++ b/packages/fakeyou.com/src/components/entities/EntityInput/EntityInput.tsx
@@ -4,11 +4,9 @@ import { a, useTransition } from "@react-spring/web";
import { MediaFile } from "@storyteller/components/src/api/media_files/GetMedia";
import Iframe from "react-iframe";
import { Label, Spinner } from "components/common";
-import { AcceptTypes, EntityInputMode, EntityModeProp } from "components/entities/EntityTypes";
-import { useFile, useMedia, useModal, useSession } from "hooks";
+import { AcceptTypes, EntityInputMode, EntityModeProp, UploaderResponse } from "components/entities/EntityTypes";
+import { useMedia, useMediaUploader, useModal, useSession } from "hooks";
import { BucketConfig } from "@storyteller/components/src/api/BucketConfig";
-import { UploadMedia, UploadMediaResponse } from "@storyteller/components/src/api/media_files/UploadMedia";
-import { v4 as uuidv4 } from "uuid";
import EntityInputEmpty from "./EntityInputEmpty";
import "./EntityInput.scss";
@@ -77,22 +75,11 @@ export default function EntityInput({ accept: inAccept, aspectRatio = "square",
onChange({ target: { name, value: token } });
};
- const { clear, inputProps } = useFile({
- onChange: (inputFile: any) => {
- if (inputFile) UploadMedia({
- uuid_idempotency_token: uuidv4(),
- file: inputFile,
- source: "file",
- })
- .then((res: UploadMediaResponse) => {
- if ("media_file_token" in res) {
- clear();
- selectToken(res.media_file_token);
- }
- });
- else console.log("🥺 no file");
- }
+ const { inputProps } = useMediaUploader({
+ autoUpload: true,
+ onSuccess: (res: UploaderResponse) => selectToken(res.media_file_token)
});
+
const onSelect = (data: MediaFile) => {
mediaSet(data);
selectToken(data.token);
diff --git a/packages/fakeyou.com/src/components/entities/EntityInput/EntityInputEmpty.tsx b/packages/fakeyou.com/src/components/entities/EntityInput/EntityInputEmpty.tsx
index ce401f7d4e..7579e7dda6 100644
--- a/packages/fakeyou.com/src/components/entities/EntityInput/EntityInputEmpty.tsx
+++ b/packages/fakeyou.com/src/components/entities/EntityInput/EntityInputEmpty.tsx
@@ -1,5 +1,5 @@
import React from "react";
-import { AcceptTypes, EntityInputMode, MediaFilters } from "components/entities/EntityTypes";
+import { AcceptTypes, EntityInputMode, isSelectedType, MediaFilters } from "components/entities/EntityTypes";
import { SlideProps } from "./EntityInput";
import { MediaBrowser } from "components/modals";
import { FileWrapper } from "components/common";
@@ -23,26 +23,23 @@ interface EmptySlideProps extends SlideProps {
user: any
};
-const mediaCheck = (value: string) => (value in MediaFilters);
-
export default function EntityInputEmpty({ accept, open, inputMode, inputProps, user, ...rest }: EmptySlideProps) {
const accepted = accept ? accept : [];
- const isMedia = !!accepted.find(mediaCheck);
+ const isMedia = isSelectedType(MediaFilters.all,accepted[0]);
+
const browserClick = () => open({
component: MediaBrowser,
props: { accept, inputMode, username: user?.username || "", ...rest }
});
const mediaIcons = () => {
- switch (accepted[0]) {
- case "audio": return faWaveform;
- case "image": return faImage;
- case "bvh": return faPersonWalking;
- default: return faFile;
- }
+ if (isSelectedType(MediaFilters.audio,accepted[0])) return faWaveform;
+ if (isSelectedType(MediaFilters.engine_asset,accepted[0])) return faPersonWalking;
+ if (isSelectedType(MediaFilters.image,accepted[0])) return faImage;
+ if (isSelectedType(MediaFilters.video,accepted[0])) return faFile;
+ return faFile;
};
-
const supported = `${ accepted.length ? accepted.join(", ") : accepted[0] } files supported`;
return <>
diff --git a/packages/fakeyou.com/src/components/entities/EntityTypes.tsx b/packages/fakeyou.com/src/components/entities/EntityTypes.tsx
index 184109ac5c..4aea3d2022 100644
--- a/packages/fakeyou.com/src/components/entities/EntityTypes.tsx
+++ b/packages/fakeyou.com/src/components/entities/EntityTypes.tsx
@@ -1,3 +1,7 @@
+import { enumToKeyArr } from "resources";
+import { UploadMediaResponse } from "@storyteller/components/src/api/media_files/UploadMedia";
+import { UploadEngineAssetResponse }from "@storyteller/components/src/api/media_files/UploadEngineAsset";
+
export enum EntityInputMode {
bookmarks,
media,
@@ -10,10 +14,7 @@ export enum MediaFilters {
audio,
image,
video,
- bvh,
- glb,
- gltf,
- fbx
+ engine_asset
}
export enum WeightsFilters {
@@ -36,19 +37,47 @@ export enum WeightsCategories {
voiceConversion
}
-export type EntityModeProp = keyof typeof EntityInputMode;
-export type MediaFilterProp = keyof typeof MediaFilters;
-export type WeightFilterProp = keyof typeof WeightsFilters;
-export type WeightCategoriesProp = keyof typeof WeightsCategories;
-export type AcceptTypes = MediaFilterProp | WeightFilterProp;
-export type JobSelection = WeightCategoriesProp | WeightFilterProp;
-
export enum EntityType {
unknown,
media,
weights
}
+export enum EngineTypes {
+ bvh,
+ fbx,
+ glb,
+ gltf,
+ obj,
+ ron
+}
+
+export enum AudioTypes {
+ mp3,
+ wav
+}
+
+export enum ImageTypes {
+ jpg,
+ png
+}
+
+export enum VideoTypes {
+ mp4,
+}
+
+export type EntityModeProp = keyof typeof EntityInputMode;
+export type MediaFilterProp = keyof typeof MediaFilters;
+export type WeightFilterProp = keyof typeof WeightsFilters;
+export type EngineFilterProp = keyof typeof EngineTypes;
+export type AudioFilterProp = keyof typeof AudioTypes;
+export type ImageFilterProp = keyof typeof ImageTypes;
+export type VideoFilterProp = keyof typeof VideoTypes;
+export type WeightCategoriesProp = keyof typeof WeightsCategories;
+export type AcceptTypes = EngineFilterProp | AudioFilterProp | ImageFilterProp | VideoFilterProp | WeightFilterProp;
+export type JobSelection = WeightCategoriesProp | WeightFilterProp;
+export type UploaderResponse = UploadEngineAssetResponse | UploadMediaResponse;
+
export const ListEntityFilters = (mode?: number) => {
const bookmarkFilters = Object.keys({ ...MediaFilters, ...WeightsFilters }).filter(val => isNaN(Number(val))).reduce((obj,current) => ({ ...obj, [current]: current }),{});
@@ -62,4 +91,25 @@ export const EntityFilterOptions = (mode?: EntityInputMode, t = (v:string) => v)
if (typeof value === "string") return { value, label: t(value) }
return { label: "all", value: "all" };
});
-};
\ No newline at end of file
+};
+
+export const isSelectedType = (mode: MediaFilters, fileExtension: string) => enumToKeyArr([
+ { ...AudioTypes, ...ImageTypes, ...VideoTypes, ...EngineTypes },
+ AudioTypes,
+ ImageTypes,
+ VideoTypes,
+ EngineTypes
+][mode]).includes(fileExtension);
+
+export const getMediaCategory = (fileExtension: string) => {
+ isSelectedType(MediaFilters.image,fileExtension);
+ if (isSelectedType(MediaFilters.engine_asset, fileExtension)) return MediaFilters.engine_asset;
+ if (isSelectedType(MediaFilters.audio, fileExtension)) return MediaFilters.audio;
+ if (isSelectedType(MediaFilters.image, fileExtension)) return MediaFilters.image;
+ if (isSelectedType(MediaFilters.video, fileExtension)) return MediaFilters.video;
+ return MediaFilters.all; // will change to "unknown" eventually
+}
+
+
+
+
diff --git a/packages/fakeyou.com/src/components/layout/SideNav/SideNav.tsx b/packages/fakeyou.com/src/components/layout/SideNav/SideNav.tsx
index a96377a081..e8c869b32f 100644
--- a/packages/fakeyou.com/src/components/layout/SideNav/SideNav.tsx
+++ b/packages/fakeyou.com/src/components/layout/SideNav/SideNav.tsx
@@ -30,6 +30,8 @@ import { useInferenceJobs, useLocalize } from "hooks";
import { Logout } from "@storyteller/components/src/api/session/Logout";
import { Button } from "components/common";
import { WebUrl } from "common/WebUrl";
+import { DomainConfig, Website } from "utils/domainConfig";
+import { useDomainConfig } from "context/DomainConfigContext";
interface SideNavProps {
sessionWrapper: SessionWrapper;
@@ -56,6 +58,7 @@ export default function SideNav({
const isOnLoginPage = window.location.pathname.includes("/login");
const isOnSignUpPage = window.location.pathname.includes("/signup");
const isOnStudioPage = window.location.pathname.includes("/studio");
+ const domain: DomainConfig = useDomainConfig();
let history = useHistory();
const handleNavLinkClick = () => {
@@ -107,7 +110,8 @@ export default function SideNav({
const shouldNotShowSidebar =
(!isLoggedIn && (isOnLandingPage || isOnLoginPage || isOnSignUpPage)) ||
- isOnStudioPage;
+ isOnStudioPage ||
+ (domain.website === Website.StorytellerAi && isOnLandingPage);
const shouldShowSidebar = windowWidth >= 992 && !shouldNotShowSidebar;
const sidebarClassName = `sidebar ${
shouldShowSidebar ? "visible" : ""
@@ -333,7 +337,7 @@ export default function SideNav({
@@ -341,7 +345,7 @@ export default function SideNav({
icon={faHome}
className="sidebar-heading-icon"
/>
- Home
+ {domain.website === Website.FakeYou ? "Home" : "Dashboard"}
diff --git a/packages/fakeyou.com/src/hooks/index.tsx b/packages/fakeyou.com/src/hooks/index.tsx
index 65610c6c90..a33be1d36f 100644
--- a/packages/fakeyou.com/src/hooks/index.tsx
+++ b/packages/fakeyou.com/src/hooks/index.tsx
@@ -14,6 +14,7 @@ import useLazyLists from './useLazyLists';
import useListContent from './useListContent';
import useLocalize from './useLocalize';
import useMedia from './useMedia';
+import useMediaUploader from './useMediaUploader';
import useModal from './useModal';
import useNotifications from './useNotifications';
import useOnScreen from "./useOnScreen";
@@ -44,6 +45,7 @@ export {
useListContent,
useLocalize,
useMedia,
+ useMediaUploader,
useModal,
useNotifications,
useOnScreen,
diff --git a/packages/fakeyou.com/src/hooks/useFile/useFile.tsx b/packages/fakeyou.com/src/hooks/useFile/useFile.tsx
index ed6a4a2156..557b95cf42 100644
--- a/packages/fakeyou.com/src/hooks/useFile/useFile.tsx
+++ b/packages/fakeyou.com/src/hooks/useFile/useFile.tsx
@@ -19,7 +19,7 @@ export default function useFile({ debug, onChange = n, onClear = n }: Props) {
blobSet(inputFile ? URL.createObjectURL(inputFile) : "");
};
const inputChange = ({ target = {} }: { target: any }) => {
- fileChange(target.value);
+ fileChange(target.files ? target.files[0] : target.value);
};
const clear = () => {
if (inputRef?.current?.value) inputRef.current.value = '';
diff --git a/packages/fakeyou.com/src/hooks/useMediaUploader/index.tsx b/packages/fakeyou.com/src/hooks/useMediaUploader/index.tsx
new file mode 100644
index 0000000000..3555ba20f5
--- /dev/null
+++ b/packages/fakeyou.com/src/hooks/useMediaUploader/index.tsx
@@ -0,0 +1 @@
+export { default } from "./useMediaUploader";
\ No newline at end of file
diff --git a/packages/fakeyou.com/src/hooks/useMediaUploader/useMediaUploader.tsx b/packages/fakeyou.com/src/hooks/useMediaUploader/useMediaUploader.tsx
new file mode 100644
index 0000000000..d33c224485
--- /dev/null
+++ b/packages/fakeyou.com/src/hooks/useMediaUploader/useMediaUploader.tsx
@@ -0,0 +1,66 @@
+import { useState } from "react";
+import { useFile } from "hooks";
+import { v4 as uuidv4 } from "uuid";
+import { isSelectedType, MediaFilters, UploaderResponse } from "components/entities/EntityTypes";
+import { UploadMedia } from "@storyteller/components/src/api/media_files/UploadMedia";
+import { UploadEngineAsset }from "@storyteller/components/src/api/media_files/UploadEngineAsset";
+import { MediaFileSubtype } from "@storyteller/components/src/api/enums/MediaFileSubtype";
+import { GetFileTypeByExtension as extension } from "@storyteller/components/src/utils/GetFileTypeByExtension";
+import { MediaFileClass } from "@storyteller/components/src/api/enums/MediaFileClass";
+
+interface Props {
+ autoUpload?: boolean,
+ onSuccess?: (res: UploaderResponse) => any;
+}
+
+const n = () => {};
+
+export default function useMediaUploader({ autoUpload, onSuccess = n }: Props) {
+ const [mediaClass,mediaClassSet] = useState(MediaFileClass.Unknown);
+ const [engineSubtype,engineSubtypeSet] = useState();
+
+ const createUpload = (inputFile: File, todo = n ) => {
+ const fileExtension = extension(inputFile.name || "");
+ const isEngineAsset = isSelectedType(MediaFilters.engine_asset, fileExtension);
+ const baseConfig = { uuid_idempotency_token: uuidv4(), file: inputFile };
+ const engineConfig = { ...baseConfig, media_file_subtype: engineSubtype, media_file_class: mediaClass };
+ const mediaConfig = { ...baseConfig, source: "file" };
+ const uploader = isEngineAsset ? UploadEngineAsset(engineConfig) : UploadMedia(mediaConfig);
+
+ if (inputFile) {
+ uploader
+ .then((res: UploaderResponse) => {
+ if ("media_file_token" in res) {
+ onSuccess(res);
+ todo();
+ }
+ });
+ }
+ };
+
+ const { file, clear, inputProps } = useFile({
+ ...autoUpload ? { onChange: (inputFile: File) => createUpload(inputFile,clear) } : {}
+ });
+
+ const upload = () => createUpload(file,clear);
+
+ const engineSubtypeChange = ({ target }: { target: any }) => engineSubtypeSet(target.value);
+
+ const mediaClassChange = ({ target }: { target: any }) => mediaClassSet(target.value);
+
+ return {
+ clear,
+ engineSubtype,
+ engineSubtypeChange,
+ mediaClass,
+ mediaClassChange,
+ file,
+ inputProps,
+ isAudio: isSelectedType(MediaFilters.audio, extension(file?.name || "")),
+ isEngineAsset: isSelectedType(MediaFilters.engine_asset, extension(file?.name || "")),
+ isImage: isSelectedType(MediaFilters.image, extension(file?.name || "")),
+ isVideo: isSelectedType(MediaFilters.video, extension(file?.name || "")),
+ upload
+ }
+
+};
\ No newline at end of file
diff --git a/packages/fakeyou.com/src/v2/view/PageContainer.tsx b/packages/fakeyou.com/src/v2/view/PageContainer.tsx
index d04313e233..df58a8d189 100644
--- a/packages/fakeyou.com/src/v2/view/PageContainer.tsx
+++ b/packages/fakeyou.com/src/v2/view/PageContainer.tsx
@@ -127,6 +127,7 @@ import DevTTS from "./pages/dev_tts/DevTTS";
import { StudioIntroPage } from "./pages/storyteller_studio_intro/StudioIntroPage";
import StudioVSTPage from "./pages/storyteller_studio_intro/StudioVST/StudioVSTPage";
import { StudioIntroResultPage } from "./pages/storyteller_studio_intro/StudioIntroResultPage";
+import DashboardPage from "./pages/dashboard/DashboardPage";
interface Props {
sessionWrapper: SessionWrapper;
@@ -727,6 +728,10 @@ class PageContainer extends React.Component<
/>
+
+
+
+
@@ -812,7 +817,7 @@ class PageContainer extends React.Component<
-
+
{/* Route for initial voice creation */}
+
+
+ );
+}
diff --git a/packages/fakeyou.com/src/v2/view/pages/dev_upload/DevUpload.tsx b/packages/fakeyou.com/src/v2/view/pages/dev_upload/DevUpload.tsx
index e39616b909..cfbc9a4168 100644
--- a/packages/fakeyou.com/src/v2/view/pages/dev_upload/DevUpload.tsx
+++ b/packages/fakeyou.com/src/v2/view/pages/dev_upload/DevUpload.tsx
@@ -1,142 +1,68 @@
import React, { useState } from "react";
-import Panel from "components/common/Panel";
-import Container from "components/common/Container";
import PageHeader from "components/layout/PageHeader";
-import { useSession } from "hooks";
-import { Button } from "components/common";
+import { useMediaUploader, useSession } from "hooks";
+import { Button, Container, Panel } from "components/common";
+import { UploaderResponse } from "components/entities/EntityTypes";
import { faUpload } from "@fortawesome/pro-solid-svg-icons";
-import { FileType, GetFileTypeByExtension } from "@storyteller/components/src/utils/GetFileTypeByExtension";
-import { UploadMedia, UploadMediaResponse, } from "@storyteller/components/src/api/media_files/UploadMedia";
-import { UploadEngineAsset, UploadEngineAssetResponse, } from "@storyteller/components/src/api/media_files/UploadEngineAsset";
import { MediaFileSubtype } from "@storyteller/components/src/api/enums/MediaFileSubtype";
-import { v4 as uuidv4 } from "uuid";
+import { MediaFileClass } from "@storyteller/components/src/api/enums/MediaFileClass";
import { Link } from "react-router-dom";
-enum UploadType {
- EngineAsset = "engine_asset",
- Image = "image",
- Audio = "audio",
- Video = "video",
- Unknown = "unknown",
-}
-
interface DevUploadProps {}
export default function DevUpload(props: DevUploadProps) {
+ const [tokens, tokensSet] = useState([]);
+ const { engineSubtype, engineSubtypeChange, mediaClass, mediaClassChange, file, inputProps, isEngineAsset, isVideo, upload } = useMediaUploader({
+ onSuccess: (res: UploaderResponse) => tokensSet([res.media_file_token, ...tokens])
+ });
+
+ const { onChange } = inputProps;
const { studioAccessCheck } = useSession();
- const [file, fileSet] = useState(null);
- const [maybeMediaFileSubtype, maybeMediaFileSubtypeSet] = useState(undefined);
- const [uploadType, uploadTypeSet] = useState(UploadType.Unknown);
- const [tokens, tokensSet] = useState([]);
-
- const handleFileChange = (event: any) => {
- const maybeFile = event.target.files[0];
- const fileType = GetFileTypeByExtension(maybeFile?.name || "");
-
- let uploadType = UploadType.Unknown;
-
- switch (fileType) {
- case FileType.Bvh:
- case FileType.Fbx:
- case FileType.Glb:
- case FileType.Gltf:
- case FileType.Obj:
- case FileType.Ron:
- uploadType = UploadType.EngineAsset;
- break;
- case FileType.Jpg:
- case FileType.Png:
- uploadType = UploadType.Image;
- break;
- case FileType.Mp3:
- case FileType.Wav:
- uploadType = UploadType.Audio;
- break;
- case FileType.Mp4:
- uploadType = UploadType.Video;
- break;
- case FileType.Unknown:
- default:
- uploadType = UploadType.Unknown;
- break;
- }
-
- fileSet(maybeFile);
- uploadTypeSet(uploadType);
- };
-
- const handleSubtypeChange = (ev: React.FormEvent) => {
- const value = (ev.target as HTMLSelectElement).value;
- const maybeSubtype = value as MediaFileSubtype;
- maybeMediaFileSubtypeSet(maybeSubtype);
- }
-
- const handleUpload = () => {
- if (!file) {
- console.error("no file specified for upload");
- return;
- }
-
- switch(uploadType) {
- case UploadType.EngineAsset:
- UploadEngineAsset({
- uuid_idempotency_token: uuidv4(),
- file,
- media_file_subtype: maybeMediaFileSubtype,
- })
- .then((res: UploadEngineAssetResponse) => {
- if ("media_file_token" in res) {
- tokensSet([res.media_file_token, ...tokens]);
- fileSet(null);
- }
- });
- break;
- default:
- UploadMedia({
- uuid_idempotency_token: uuidv4(),
- file,
- source: "file",
- })
- .then((res: UploadMediaResponse) => {
- if ("media_file_token" in res) {
- tokensSet([res.media_file_token, ...tokens]);
- fileSet(null);
- }
- });
- }
- };
-
let title = "Upload Generic File";
- let mediaFileSubtypeForm = <>>;
+ let engineSubForm = <>>;
- switch (uploadType) {
- case UploadType.Video:
- title = "Upload Video";
- break;
-
- case UploadType.EngineAsset:
- title = "Upload Engine Asset";
- mediaFileSubtypeForm = (
- <>
-
-
-
-
- >
- );
- break;
+ if (isVideo) { title = "Upload Video"; }
+ if (isEngineAsset) {
+ title = "Upload Engine Asset";
+ engineSubForm = (
+ <>
+
+
+
+
+
+
+
+
+ >
+ );
}
return studioAccessCheck(
@@ -146,7 +72,7 @@ export default function DevUpload(props: DevUploadProps) {
subText="Upload files to the server for testing."
/>
- {maybeMediaFileSubtype}
+ {engineSubtype}
@@ -154,22 +80,22 @@ export default function DevUpload(props: DevUploadProps) {
-
+
- {mediaFileSubtypeForm}
+ {engineSubForm}
diff --git a/packages/fakeyou.com/src/v2/view/pages/fbx_to_gltf/FbxToGltfPage.tsx b/packages/fakeyou.com/src/v2/view/pages/fbx_to_gltf/FbxToGltfPage.tsx
index 05455ada9b..62c4cad198 100644
--- a/packages/fakeyou.com/src/v2/view/pages/fbx_to_gltf/FbxToGltfPage.tsx
+++ b/packages/fakeyou.com/src/v2/view/pages/fbx_to_gltf/FbxToGltfPage.tsx
@@ -1,24 +1,26 @@
+import React, { useState } from "react";
import {
faArrowRightArrowLeft,
- faFile,
- faTrashAlt,
+ // faFile,
+ // faTrashAlt,
} from "@fortawesome/pro-solid-svg-icons";
-import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+// import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { Button, Container, Panel } from "components/common";
-import FileInput from "components/common/FileInput";
+// import FileInput from "components/common/FileInput";
import PageHeader from "components/layout/PageHeader";
-import { useFile, useInferenceJobs, useMedia } from "hooks";
-import React, { useEffect, useState } from "react";
-import { useHistory, useParams } from "react-router-dom";
-import { v4 as uuidv4 } from "uuid";
-import { UploadMedia } from "@storyteller/components/src/api/media_files/UploadMedia";
+// import { useHistory, useParams } from "react-router-dom";
+// import { v4 as uuidv4 } from "uuid";
+// import { UploadMedia } from "@storyteller/components/src/api/media_files/UploadMedia";
import { FrontendInferenceJobType } from "@storyteller/components/src/jobs/InferenceJob";
import FbxToGltfJobList from "./components/FbxToGltfJobList";
import {
- EnqueueFbxToGltf,
- EnqueueFbxToGltfIsSuccess,
- EnqueueFbxToGltfIsError,
+ // EnqueueFbxToGltf,
+ // EnqueueFbxToGltfIsSuccess,
+ // EnqueueFbxToGltfIsError,
} from "@storyteller/components/src/api/file_conversion/EnqueueFbxToGltf";
+import { onChanger } from "resources";
+
+import { EntityInput } from "components/entities";
interface FbxToGltfPageProps {
enqueueInferenceJob: (
@@ -30,117 +32,39 @@ interface FbxToGltfPageProps {
export default function FbxToGltfPage({
enqueueInferenceJob,
}: FbxToGltfPageProps) {
- const history = useHistory();
- const { mediaToken: mediaTokenParam } = useParams<{ mediaToken: string }>();
- const [mediaToken, setMediaToken] = useState
(mediaTokenParam);
- const { media: presetFile } = useMedia({
- mediaToken: mediaToken ?? undefined,
- });
- const fileProps = useFile({});
- const [isSubmitting, setIsSubmitting] = useState(false);
- const [isWorking, setIsWorking] = useState(false);
+ const [mediaToken,mediaTokenSet] = useState();
+ const onChange = onChanger({ mediaTokenSet });
- const { inferenceJobs } = useInferenceJobs(
- FrontendInferenceJobType.ConvertFbxtoGltf
- );
+ // const EnqueueConvert = async ({ upload_token }: any) => {
+ // if (!upload_token) return false;
- console.log("inferenceJobs", inferenceJobs);
+ // try {
+ // let request = {
+ // uuid_idempotency_token: uuidv4(),
+ // file_source: undefined,
+ // media_file_token: upload_token,
+ // };
- useEffect(() => {
- // If there's a mediaToken, automatically prepare the file for conversion
- if (mediaToken && presetFile) {
- }
- }, [mediaToken, presetFile]);
+ // const response = await EnqueueFbxToGltf(request);
- const clearMediaToken = () => {
- // Reset the media token state
- setMediaToken(null);
- history.push("/fbx-to-gltf");
- };
+ // if (EnqueueFbxToGltfIsSuccess(response)) {
+ // console.log("Enqueue successful");
- const makeFBXUploadRequest = () => ({
- uuid_idempotency_token: uuidv4(),
- file: fileProps.file,
- source: "file",
- type: "fbx/model",
- });
-
- const handleUploadFBX = async () => {
- try {
- const res = await UploadMedia(makeFBXUploadRequest());
- if (res.success && res.media_file_token) {
- return { upload_token: res.media_file_token };
- }
- console.error("Upload failed:", res);
- return null;
- } catch (error) {
- console.error("Error in upload:", error);
- return null;
- }
- };
-
- const submit = async () => {
- if (isSubmitting) return;
- setIsSubmitting(true);
- setIsWorking(true);
- try {
- let uploadToken = mediaToken;
-
- // If no media token, upload the file first
- if (!mediaToken && fileProps.file) {
- const uploadResponse = await handleUploadFBX();
- if (uploadResponse && uploadResponse.upload_token) {
- uploadToken = uploadResponse.upload_token;
- } else {
- console.error("Failed to upload file. Response:", uploadResponse);
- throw new Error("File upload failed");
- }
- }
-
- // Enqueue the conversion job
- if (uploadToken) {
- await EnqueueConvert({ upload_token: uploadToken });
- } else {
- console.error("No upload token available for conversion");
- }
- } catch (error) {
- console.error("Error in submit process: ", error);
- } finally {
- setIsWorking(false);
- setIsSubmitting(false);
- }
- };
-
- const EnqueueConvert = async ({ upload_token }: any) => {
- if (!upload_token) return false;
-
- try {
- let request = {
- uuid_idempotency_token: uuidv4(),
- file_source: undefined,
- media_file_token: upload_token,
- };
-
- const response = await EnqueueFbxToGltf(request);
-
- if (EnqueueFbxToGltfIsSuccess(response)) {
- console.log("Enqueue successful");
-
- if (response && response.inference_job_token) {
- enqueueInferenceJob(
- response.inference_job_token,
- FrontendInferenceJobType.ConvertFbxtoGltf
- );
- }
- return true;
- } else if (EnqueueFbxToGltfIsError(response)) {
- throw new Error("Enqueue failed");
- }
- } catch (error) {
- console.error("Error in enqueueing conversion: ", error);
- return false;
- }
- };
+ // if (response && response.inference_job_token) {
+ // enqueueInferenceJob(
+ // response.inference_job_token,
+ // FrontendInferenceJobType.ConvertFbxtoGltf
+ // );
+ // }
+ // return true;
+ // } else if (EnqueueFbxToGltfIsError(response)) {
+ // throw new Error("Enqueue failed");
+ // }
+ // } catch (error) {
+ // console.error("Error in enqueueing conversion: ", error);
+ // return false;
+ // }
+ // };
return (
@@ -156,47 +80,59 @@ export default function FbxToGltfPage({
- {mediaToken && presetFile ? (
-
-
-
-
-
-
-
-
{presetFile.token}
-
- Created by {presetFile.maybe_creator_user?.display_name}
-
-
-
-
-
-
-
- ) : (
-
- )}
+
+ {
+
+ // mediaToken && presetFile ? (
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
{presetFile.token}
+ //
+ // Created by {presetFile.maybe_creator_user?.display_name}
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ // ) : (
+ //
+ // )
+ }
diff --git a/packages/fakeyou.com/src/v2/view/pages/landing/LandingPage.tsx b/packages/fakeyou.com/src/v2/view/pages/landing/LandingPage.tsx
index 037f31a146..90c9f2442a 100644
--- a/packages/fakeyou.com/src/v2/view/pages/landing/LandingPage.tsx
+++ b/packages/fakeyou.com/src/v2/view/pages/landing/LandingPage.tsx
@@ -35,20 +35,34 @@ interface Props {
}
function LandingPage(props: Props) {
- usePrefixedDocumentTitle("FakeYou Celebrity Voice Generator");
-
PosthogClient.recordPageview();
const domain: DomainConfig = useDomainConfig();
+ const webpageTitle =
+ domain.website === Website.FakeYou
+ ? "FakeYou Celebrity Voice Generator"
+ : "";
+
+ usePrefixedDocumentTitle(webpageTitle);
+
const isLoggedIn = props.sessionWrapper.isLoggedIn();
- const canAccessStudio = props.sessionWrapper.canAccessStudio();
+ // DO NOT LEAK THIS YET!!
+ let protectedStudioOnboarding = <>>;
+
+ if (props.sessionWrapper.canAccessStudio()) {
+ protectedStudioOnboarding = (
+ <>
+
+ >
+ );
+ }
return (
<>
- {domain.website === Website.StorytellerAi && !isLoggedIn && (
-
+ {domain.website === Website.StorytellerAi && (
+
)}
{domain.website === Website.FakeYou ? (
@@ -79,27 +93,22 @@ function LandingPage(props: Props) {
) : (
<>
{/* STORYTELLER,AI */}
- {!isLoggedIn ? (
- <>
- {!canAccessStudio && }
-
-
-
-
- >
- ) : (
-
- )}
+
+ {protectedStudioOnboarding}
+
+
+
+
+
+
>
)}
diff --git a/packages/fakeyou.com/src/v2/view/pages/landing/components/LandingVideoReel/LandingVideoReel.tsx b/packages/fakeyou.com/src/v2/view/pages/landing/components/LandingVideoReel/LandingVideoReel.tsx
index e526023967..e4b42c9658 100644
--- a/packages/fakeyou.com/src/v2/view/pages/landing/components/LandingVideoReel/LandingVideoReel.tsx
+++ b/packages/fakeyou.com/src/v2/view/pages/landing/components/LandingVideoReel/LandingVideoReel.tsx
@@ -1,12 +1,26 @@
import { faArrowRight } from "@fortawesome/pro-solid-svg-icons";
import { Button } from "components/common";
-import React, { useEffect } from "react";
+import React, { useEffect, useState } from "react";
import "./LandingVideoReel.scss";
+import { SessionWrapper } from "@storyteller/components/src/session/SessionWrapper";
+import { useLocation } from "react-router-dom";
-interface LandingVideoReelProps {}
+interface LandingVideoReelProps {
+ sessionWrapper: SessionWrapper;
+}
-export default function LandingVideoReel(props: LandingVideoReelProps) {
- const isOnLandingPage = window.location.pathname === "/";
+export default function LandingVideoReel({
+ sessionWrapper,
+}: LandingVideoReelProps) {
+ const location = useLocation();
+ const [isOnLandingPage, setIsOnLandingPage] = useState(
+ window.location.pathname === "/"
+ );
+ const isLoggedIn = sessionWrapper.isLoggedIn();
+
+ useEffect(() => {
+ setIsOnLandingPage(location.pathname === "/");
+ }, [location]);
useEffect(() => {
const contentWrapper = document.getElementById("page-content-wrapper");
@@ -41,7 +55,7 @@ export default function LandingVideoReel(props: LandingVideoReelProps) {
searchBar?.classList.remove("landing-search");
contentWrapper?.classList.remove("no-page-padding-top");
};
- }, [isOnLandingPage]);
+ }, [isOnLandingPage, isLoggedIn]);
return (
@@ -62,8 +76,8 @@ export default function LandingVideoReel(props: LandingVideoReelProps) {