From 91d42c0a404ce83614e4ac5fc17e876fbb6631cf Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Mon, 6 Sep 2021 04:50:12 -0400 Subject: [PATCH] updates to support hidden tts models for banned users --- vocodes/src/v2/api/tts/GetTtsModel.ts | 48 +++++++++++++++---- .../tts/tts_model_view/TtsModelViewFc.tsx | 27 ++++++++++- 2 files changed, 63 insertions(+), 12 deletions(-) diff --git a/vocodes/src/v2/api/tts/GetTtsModel.ts b/vocodes/src/v2/api/tts/GetTtsModel.ts index 8dd1e81f20..6a29ecc1c7 100644 --- a/vocodes/src/v2/api/tts/GetTtsModel.ts +++ b/vocodes/src/v2/api/tts/GetTtsModel.ts @@ -1,10 +1,5 @@ import { ApiConfig } from "../../../common/ApiConfig"; -interface TtsModelViewResponsePayload { - success: boolean, - model: TtsModel, -} - export interface TtsModel { model_token: string, title: string, @@ -25,13 +20,36 @@ export interface TtsModel { } export interface TtsModelModeratorFields { + creator_is_banned: boolean, creator_ip_address_creation: string, creator_ip_address_last_update: string, mod_deleted_at: string | undefined | null, user_deleted_at: string | undefined | null, } -export async function GetTtsModel(modelToken: string) : Promise { +export enum TtsModelLookupError { + NotFound, + ServerError, + FrontendError, +} + +export type GetTtsModelResponse = TtsModel | TtsModelLookupError; + +export function GetTtsModelIsOk(response: GetTtsModelResponse): response is TtsModel { + return response.hasOwnProperty('model_token'); +} + +export function GetTtsModelIsErr(response: GetTtsModelResponse): response is TtsModelLookupError { + return !response.hasOwnProperty('model_token'); +} + +interface TtsModelViewResponsePayload { + success: boolean, + error_reason?: string, + model?: TtsModel, +} + +export async function GetTtsModel(modelToken: string) : Promise { const endpoint = new ApiConfig().viewTtsModel(modelToken); return await fetch(endpoint, { @@ -44,12 +62,22 @@ export async function GetTtsModel(modelToken: string) : Promise res.json()) .then(res => { const response : TtsModelViewResponsePayload = res; - if (!response.success) { - return; + + if (response?.success) { + return response.model!; + } + + if (response?.success === false) { + if (response.error_reason?.includes("not found")) { + return TtsModelLookupError.NotFound; + } else { + return TtsModelLookupError.ServerError; + } } - return response?.model; + + return TtsModelLookupError.FrontendError; }) .catch(e => { - return undefined; + return TtsModelLookupError.FrontendError; }); } diff --git a/vocodes/src/v2/view/tts/tts_model_view/TtsModelViewFc.tsx b/vocodes/src/v2/view/tts/tts_model_view/TtsModelViewFc.tsx index c5a22cd6b6..63c178c91a 100644 --- a/vocodes/src/v2/view/tts/tts_model_view/TtsModelViewFc.tsx +++ b/vocodes/src/v2/view/tts/tts_model_view/TtsModelViewFc.tsx @@ -9,7 +9,7 @@ import { v4 as uuidv4 } from 'uuid'; import { FrontendUrlConfig } from '../../../../common/FrontendUrlConfig'; import { HiddenIconFc } from '../../_icons/HiddenIcon'; import { VisibleIconFc } from '../../_icons/VisibleIcon'; -import { GetTtsModel, TtsModel } from '../../../api/tts/GetTtsModel'; +import { GetTtsModel, GetTtsModelIsErr, GetTtsModelIsOk, TtsModel, TtsModelLookupError } from '../../../api/tts/GetTtsModel'; import { GravatarFc } from '../../_common/GravatarFc'; import { GetTtsModelUseCount } from '../../../api/tts/GetTtsModelUseCount'; import { BackLink } from '../../_common/BackLink'; @@ -28,11 +28,19 @@ function TtsModelViewFc(props: Props) { const [ttsModel, setTtsModel] = useState(undefined); const [ttsModelUseCount, setTtsModelUseCount] = useState(undefined); + const [notFoundState, setNotFoundState] = useState(false); const getModel = useCallback(async (token) => { const model = await GetTtsModel(token); - if (model) { + + if (GetTtsModelIsOk(model)) { setTtsModel(model); + } else if (GetTtsModelIsErr(model)) { + switch(model) { + case TtsModelLookupError.NotFound: + setNotFoundState(true); + break; + } } }, []); @@ -46,6 +54,17 @@ function TtsModelViewFc(props: Props) { getModelUseCount(token); }, [token, getModel, getModelUseCount]); + + if (notFoundState) { + return ( +

Model not found

+ ); + } + + if (!ttsModel) { + return
+ } + const handleChangeText = (ev: React.FormEvent) => { const textValue = (ev.target as HTMLTextAreaElement).value; props.setTextBuffer(textValue); @@ -142,6 +161,10 @@ function TtsModelViewFc(props: Props) {

Moderator Details

+ + Creator is banned + {ttsModel?.maybe_moderator_fields?.creator_is_banned ? "banned" : "good standing" } + Creation IP address {ttsModel?.maybe_moderator_fields?.creator_ip_address_creation || "server error"}