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 ?
- { ( 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) { Voice Designer 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")} -

-
-
-
-
- -
- - - - -
-

{usernameInvalidReason}

-
-
- -
- - - - -
-

{emailInvalidReason}

-
-
- -
- - - - -
-

{passwordInvalidReason}

-
-
- -
- - - - -
-

- {passwordConfirmationInvalidReason} -

-
- {/*
+ + + + + +
+
+ +
+ + + + +
+

{usernameInvalidReason}

+
+
+ +
+ + + + +
+

{emailInvalidReason}

+
+
+ +
+ + + + +
+

{passwordInvalidReason}

+
+
+ +
+ + + + +
+

+ {passwordConfirmationInvalidReason} +

+
+ {/*
Remember your password! We don't have password reset currently, and it'll be a few more weeks before it's added (there are more important features to work on). If you lose your password, please let us know in Discord.
*/} - -

- - Already have an account?{" "} - Log in instead. - -

-
- + +

+ + Already have an account?{" "} + Log in instead. + +

-
-
-
+ + + ); } 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";