diff --git a/packages/fakeyou.com/public/images/landing/select-vd.webp b/packages/fakeyou.com/public/images/landing/select-vd.webp
new file mode 100644
index 0000000000..357cff55a3
Binary files /dev/null and b/packages/fakeyou.com/public/images/landing/select-vd.webp differ
diff --git a/packages/fakeyou.com/src/components/common/TempSelect/TempSelect.tsx b/packages/fakeyou.com/src/components/common/TempSelect/TempSelect.tsx
index 0d80378b23..36f2a297aa 100644
--- a/packages/fakeyou.com/src/components/common/TempSelect/TempSelect.tsx
+++ b/packages/fakeyou.com/src/components/common/TempSelect/TempSelect.tsx
@@ -5,8 +5,8 @@ import "../Select/Select.scss";
import ReactSelect, { Props as ReactSelectProps } from "react-select";
export interface Option {
- value: string,
- label: string
+ value: string;
+ label: string;
}
export interface SelectProps extends ReactSelectProps {
@@ -14,34 +14,64 @@ export interface SelectProps extends ReactSelectProps {
label?: string;
rounded?: boolean;
small?: boolean;
- options: Option[],
+ options: Option[];
onChange?: (value: any) => void;
}
-
-
-export default function Select({ label, icon, name, onChange: inChange = () => {}, options = [], rounded, small, value, ...rest }: SelectProps) {
- const valueLabel = options.find((option: any)=> option.value === value)?.label || "";
- const onChange = ({ value }: any) => inChange({ target: { value, name, type: "select" } });
+export default function Select({
+ label,
+ icon,
+ name,
+ onChange: inChange = () => {},
+ options = [],
+ rounded,
+ small,
+ value,
+ ...rest
+}: SelectProps) {
+ const valueLabel =
+ options.find((option: any) => option.value === value)?.label || "";
+ const onChange = ({ value }: any) =>
+ inChange({ target: { value, name, type: "select" } });
const classNames = {
control: ({ isFocused }: { isFocused: boolean }) =>
- `select${ icon ? " with-icon" : "" }${ rounded ? " rounded-full" : "" }${ isFocused ? " focused" : "" }`,
+ `select${icon ? " with-icon" : ""}${rounded ? " rounded-full" : ""}${
+ isFocused ? " focused" : ""
+ }`,
option: () => "select-option",
- input: () => "select-input",
+ input: () => "select-input",
placeholder: () => "select-placeholder",
singleValue: () => "select-value",
menu: () => "select-container",
indicatorSeparator: () => "select-separator",
};
- return <>
- { label && }
-
- { icon &&
}
-
-
+ return (
+
+ {label &&
}
+
+ {icon && (
+
+ )}
+
+
+
- >;
-};
\ No newline at end of file
+ );
+}
diff --git a/packages/fakeyou.com/src/components/layout/PageHeader/PageHeader.tsx b/packages/fakeyou.com/src/components/layout/PageHeader/PageHeader.tsx
index 6b4bb69918..2f9d25689b 100644
--- a/packages/fakeyou.com/src/components/layout/PageHeader/PageHeader.tsx
+++ b/packages/fakeyou.com/src/components/layout/PageHeader/PageHeader.tsx
@@ -21,6 +21,12 @@ interface PageHeaderProps {
extension?: React.ReactNode;
buttonLabel?: string;
button?: ButtonProps;
+ secondaryButtonLabel?: string;
+ secondaryButton?: ButtonProps;
+ secondaryButtonVariant?: "primary" | "secondary" | "danger";
+ secondaryButtonTo?: string;
+ secondaryButtonIcon?: IconDefinition;
+ secondaryButtonOnClick?: () => void;
buttonVariant?: "primary" | "secondary" | "danger";
buttonTo?: string;
buttonIcon?: IconDefinition;
@@ -51,22 +57,40 @@ export default function PageHeader({
showBackButton,
backbuttonTo,
backbuttonLabel,
+ secondaryButton,
+ secondaryButtonLabel,
+ secondaryButtonVariant = "secondary",
+ secondaryButtonTo,
+ secondaryButtonIcon,
+ secondaryButtonOnClick,
}: PageHeaderProps) {
-
const icon = (
<>{titleIcon &&
}>
);
const buttonProps = {
- ...button ? button : {},
- ...buttonIcon && { icon: buttonIcon },
- ...buttonLabel && { label: buttonLabel },
- ...buttonOnClick && { onClick: buttonOnClick },
- ...buttonTo && { to: buttonTo },
- ...buttonVariant && { variant: buttonVariant }
+ ...(button ? button : {}),
+ ...(buttonIcon && { icon: buttonIcon }),
+ ...(buttonLabel && { label: buttonLabel }),
+ ...(buttonOnClick && { onClick: buttonOnClick }),
+ ...(buttonTo && { to: buttonTo }),
+ ...(buttonVariant && { variant: buttonVariant }),
};
- const HeaderBtn = () => button || showButton ?
: null;
+ const secondaryButtonProps = {
+ ...(secondaryButton ? secondaryButton : {}),
+ ...(secondaryButtonIcon && { icon: secondaryButtonIcon }),
+ ...(secondaryButtonLabel && { label: secondaryButtonLabel }),
+ ...(secondaryButtonOnClick && { onClick: secondaryButtonOnClick }),
+ ...(secondaryButtonTo && { to: secondaryButtonTo }),
+ ...(secondaryButtonVariant && { variant: secondaryButtonVariant }),
+ };
+
+ const HeaderBtn = () =>
+ button || showButton ?
: null;
+
+ const HeaderBtnTwo = () =>
+ secondaryButton ?
: null;
if (!panel) {
return (
@@ -95,9 +119,10 @@ export default function PageHeader({
{subText}
- { ( button || showButton ) && (
-
+ {(button || showButton) && (
+
+
)}
diff --git a/packages/fakeyou.com/src/v2/view/PageContainer.tsx b/packages/fakeyou.com/src/v2/view/PageContainer.tsx
index b4a31f7b73..edd1671dba 100644
--- a/packages/fakeyou.com/src/v2/view/PageContainer.tsx
+++ b/packages/fakeyou.com/src/v2/view/PageContainer.tsx
@@ -644,7 +644,10 @@ class PageContainer extends React.Component<
path="/voice-designer/create"
>
@@ -654,7 +657,10 @@ class PageContainer extends React.Component<
path="/voice-designer/dataset/:dataset_token/edit"
>
@@ -664,7 +670,10 @@ class PageContainer extends React.Component<
path="/voice-designer/dataset/:dataset_token/upload"
>
@@ -687,6 +696,9 @@ class PageContainer extends React.Component<
{
const images = [
// Main Images:
- "mascot/kitsune_pose2.webp",
+ // "mascot/kitsune_pose2.webp",
// "mascot/may4th.webp",
// "mascot/halloween_1.webp",
// "mascot/halloween_2.webp",
// "mascot/halloween_3.webp",
+ "mascot/xmas_1.webp",
+ "mascot/xmas_2.webp",
+ "mascot/xmas_3.webp",
+ "mascot/xmas_4.webp",
];
return images[Math.floor(Math.random() * images.length)];
@@ -317,7 +321,7 @@ function LandingPage(props: Props) {
- Make yourself sound like anyone
+ Create your own AI voice
@@ -327,7 +331,7 @@ function LandingPage(props: Props) {
diff --git a/packages/fakeyou.com/src/v2/view/pages/signup/SignupPage.tsx b/packages/fakeyou.com/src/v2/view/pages/signup/SignupPage.tsx
index e8a9724b2d..b552cb8d40 100644
--- a/packages/fakeyou.com/src/v2/view/pages/signup/SignupPage.tsx
+++ b/packages/fakeyou.com/src/v2/view/pages/signup/SignupPage.tsx
@@ -17,6 +17,9 @@ import { WebUrl } from "../../../../common/WebUrl";
import { BeginStripeCheckoutFlow } from "../../../../common/BeginStripeCheckoutFlow";
import { usePrefixedDocumentTitle } from "../../../../common/UsePrefixedDocumentTitle";
import { PosthogClient } from "@storyteller/components/src/analytics/PosthogClient";
+import Container from "components/common/Container";
+import PageHeader from "components/layout/PageHeader";
+import Panel from "components/common/Panel";
enum FieldTriState {
EMPTY_FALSE,
@@ -185,10 +188,10 @@ function SignupPage(props: Props) {
Analytics.accountSignupAttempt();
if (
- (usernameValid !== FieldTriState.TRUE) ||
- (emailValid !== FieldTriState.TRUE) ||
- (passwordValid !== FieldTriState.TRUE) ||
- (passwordConfirmationValid !== FieldTriState.TRUE)
+ usernameValid !== FieldTriState.TRUE ||
+ emailValid !== FieldTriState.TRUE ||
+ passwordValid !== FieldTriState.TRUE ||
+ passwordConfirmationValid !== FieldTriState.TRUE
) {
return false;
}
@@ -346,118 +349,115 @@ function SignupPage(props: Props) {
}
return (
-
-
-
-
- {t("account.SignUpPage.signUpTitle")}
-
-
-
+
+
+
);
}
diff --git a/packages/fakeyou.com/src/v2/view/pages/voice_designer/VoiceDesignerFormPage.tsx b/packages/fakeyou.com/src/v2/view/pages/voice_designer/VoiceDesignerFormPage.tsx
index 8b0a5f2e14..606ea93aec 100644
--- a/packages/fakeyou.com/src/v2/view/pages/voice_designer/VoiceDesignerFormPage.tsx
+++ b/packages/fakeyou.com/src/v2/view/pages/voice_designer/VoiceDesignerFormPage.tsx
@@ -24,12 +24,13 @@ import useVoiceRequests from "./useVoiceRequests";
import useUploadedFiles from "hooks/useUploadedFiles";
import { FrontendInferenceJobType } from "@storyteller/components/src/jobs/InferenceJob";
+import { SessionWrapper } from "@storyteller/components/src/session/SessionWrapper";
interface RouteParams {
dataset_token?: string;
}
-function VoiceDesignerFormPage({ enqueueInferenceJob }: { enqueueInferenceJob: any }) {
+function VoiceDesignerFormPage({ enqueueInferenceJob, sessionWrapper }: { enqueueInferenceJob: any, sessionWrapper: SessionWrapper }) {
const history = useHistory();
const { datasets, inputCtrl, languages, visibilityOptions, voices } = useVoiceRequests({});
const [language, languageSet] = useState("en");
@@ -166,6 +167,10 @@ function VoiceDesignerFormPage({ enqueueInferenceJob }: { enqueueInferenceJob: a
}
},[dataset_token,datasets,fetched]);
+ if (!sessionWrapper.isLoggedIn()) {
+ history.push("/voice-designer");
+ }
+
return (
;
@@ -147,12 +158,24 @@ function VoiceDesignerMainPage({
"Voice created successfully",
][status];
- const button = {
+ const createVoiceButton = {
label: `Create new voice`,
icon: faPlus,
to: "/voice-designer/create",
};
+ const signUpButton = {
+ label: `Sign Up`,
+ icon: faPenToSquare,
+ to: "/signup",
+ };
+
+ // const pricingButton = {
+ // label: `View Pricing`,
+ // icon: faStar,
+ // to: "/pricing",
+ // };
+
const dataPlaceholder = () =>
You haven't created any voices.
@@ -165,58 +188,89 @@ function VoiceDesignerMainPage({
/>
;
+ const LogggedInView = () => <>
+
+
+
+
+
+
+
+
+ >;
+
+ const LoggedOutView = () =>
+
+
+
Please log in to access voice creation.
+
+
+ If you don't have an account yet, sign up now to unlock this
+ feature!
+
+
+
+
+
+
+
+
+ ;
+
return (
<>
-
-
-
-
-
-
-
-
-
-
-
+
+ { user ? : }
{/* Delete Modal */}
{deleteText.text}}
onConfirm={handleDelete}
/>
+
>
);
}
diff --git a/packages/fakeyou.com/src/v2/view/pages/voice_designer/VoiceDesignerUseVoicePage.tsx b/packages/fakeyou.com/src/v2/view/pages/voice_designer/VoiceDesignerUseVoicePage.tsx
index f66555a637..38f28ba008 100644
--- a/packages/fakeyou.com/src/v2/view/pages/voice_designer/VoiceDesignerUseVoicePage.tsx
+++ b/packages/fakeyou.com/src/v2/view/pages/voice_designer/VoiceDesignerUseVoicePage.tsx
@@ -31,6 +31,7 @@ import { GetVoice } from "@storyteller/components/src/api/voice_designer/voices/
import Skeleton from "components/common/Skeleton";
import useVoiceRequests from "./useVoiceRequests";
import { v4 as uuidv4 } from "uuid";
+import { useHistory } from "react-router-dom";
interface VoiceDesignerUseVoicePageProps {
sessionWrapper: SessionWrapper;
@@ -62,6 +63,7 @@ export default function VoiceDesignerUseVoicePage(
});
const { inference } = useVoiceRequests({});
const [isEnqueuing, setIsEnqueuing] = useState(false);
+ const history = useHistory();
const getVoiceDetails = useCallback(async (voice_token) => {
try {
@@ -189,6 +191,10 @@ export default function VoiceDesignerUseVoicePage(
);
}
+ if (!props.sessionWrapper.isLoggedIn()) {
+ history.push("/voice-designer");
+ }
+
return (
diff --git a/packages/fakeyou.com/src/v2/view/pages/voice_designer/VoiceDesignerVoiceEditPage.tsx b/packages/fakeyou.com/src/v2/view/pages/voice_designer/VoiceDesignerVoiceEditPage.tsx
index f2820c747f..ff8ffb199b 100644
--- a/packages/fakeyou.com/src/v2/view/pages/voice_designer/VoiceDesignerVoiceEditPage.tsx
+++ b/packages/fakeyou.com/src/v2/view/pages/voice_designer/VoiceDesignerVoiceEditPage.tsx
@@ -19,38 +19,40 @@ function VoiceDesignerVoiceEditPage() {
const [visibility, visibilitySet] = useState("hidden");
const [title, titleSet] = useState("");
- const [fetched,fetchedSet] = useState(false);
+ const [fetched, fetchedSet] = useState(false);
const history = useHistory();
const { voice_token } = useParams();
- const { inputCtrl, languages, visibilityOptions, voices } = useVoiceRequests({});
+ const { inputCtrl, languages, visibilityOptions, voices } = useVoiceRequests(
+ {}
+ );
usePrefixedDocumentTitle("Edit Voice");
- const onClick = () => voices.update(voice_token,{
- title,
- creator_set_visibility: visibility,
- ietf_language_tag: language,
- })
- .then((res: any) => {
- if (res && res.success) {
- history.push("/voice-designer");
- }
- });
+ const onClick = () =>
+ voices
+ .update(voice_token, {
+ title,
+ creator_set_visibility: visibility,
+ ietf_language_tag: language,
+ })
+ .then((res: any) => {
+ if (res && res.success) {
+ history.push("/voice-designer");
+ }
+ });
useEffect(() => {
if (!fetched && voice_token) {
fetchedSet(true);
- voices.get(voice_token,{})
- .then((res) => {
+ voices.get(voice_token, {}).then((res) => {
languageSet(res.ietf_language_tag);
titleSet(res.title);
visibilitySet(res.creator_set_visibility);
});
}
-
- },[fetched, voice_token, voices]);
+ }, [fetched, voice_token, voices]);
return (
@@ -67,23 +69,26 @@ function VoiceDesignerVoiceEditPage() {
-
+
-
@@ -95,12 +100,12 @@ function VoiceDesignerVoiceEditPage() {
// placeholder: "Voice name",
onChange: inputCtrl(visibilitySet),
options: visibilityOptions,
- value: visibility
+ value: visibility,
}}
/>
-
+
diff --git a/packages/fakeyou.com/src/v2/view/pages/voice_designer/components/steps/UploadSamples.tsx b/packages/fakeyou.com/src/v2/view/pages/voice_designer/components/steps/UploadSamples.tsx
index cd4fdff0d4..3acb1a2fbf 100644
--- a/packages/fakeyou.com/src/v2/view/pages/voice_designer/components/steps/UploadSamples.tsx
+++ b/packages/fakeyou.com/src/v2/view/pages/voice_designer/components/steps/UploadSamples.tsx
@@ -6,6 +6,7 @@ import moment from 'moment';
import ListItems from "../NewList";
import { v4 as uuidv4 } from "uuid";
+// import { SessionContext } from 'context';
import { ListSamplesForDataset } from "@storyteller/components/src/api/voice_designer/voice_dataset_samples/ListSamplesForDataset";
import { UploadSample } from "@storyteller/components/src/api/voice_designer/voice_dataset_samples/UploadSample";