mirror of
https://github.com/storytold/artcraft.git
synced 2026-11-12 04:42:16 +00:00
hide templates and template results from banned users
This commit is contained in:
1 parent
5c2b17dcee
commit
91a552b83a
4 files changed
+89
-40
No files matched your search
@@ -1,10 +1,5 @@
|
||||
import { ApiConfig } from "../../../common/ApiConfig";
|
||||
|
||||
interface W2lInferenceResultResponsePayload {
|
||||
success: boolean,
|
||||
result: W2lResult,
|
||||
}
|
||||
|
||||
export interface W2lResult {
|
||||
w2l_result_token: string,
|
||||
maybe_w2l_template_token?: string,
|
||||
@@ -36,12 +31,36 @@ export interface W2lResult {
|
||||
}
|
||||
|
||||
export interface W2lInferenceResultModeratorFields {
|
||||
creator_ip_address: string,
|
||||
template_creator_is_banned: boolean,
|
||||
result_creator_is_banned_if_user: boolean,
|
||||
result_creator_ip_address: string,
|
||||
result_creator_deleted_at: string | undefined | null,
|
||||
mod_deleted_at: string | undefined | null,
|
||||
user_deleted_at: string | undefined | null,
|
||||
}
|
||||
|
||||
export async function GetW2lResult(resultToken: string) : Promise<W2lResult | undefined> {
|
||||
export enum W2lResultLookupError {
|
||||
NotFound,
|
||||
ServerError,
|
||||
FrontendError,
|
||||
}
|
||||
|
||||
export type GetW2lResultResponse = W2lResult | W2lResultLookupError;
|
||||
|
||||
export function GetW2lResultIsOk(response: GetW2lResultResponse): response is W2lResult {
|
||||
return response.hasOwnProperty('w2l_result_token');
|
||||
}
|
||||
|
||||
export function GetW2lResultIsErr(response: GetW2lResultResponse): response is W2lResultLookupError {
|
||||
return !response.hasOwnProperty('w2l_result_token');
|
||||
}
|
||||
|
||||
interface W2lInferenceResultResponsePayload {
|
||||
success: boolean,
|
||||
error_reason?: string,
|
||||
result?: W2lResult,
|
||||
}
|
||||
|
||||
export async function GetW2lResult(resultToken: string) : Promise<GetW2lResultResponse> {
|
||||
const endpoint = new ApiConfig().viewW2lInferenceResult(resultToken);
|
||||
|
||||
return await fetch(endpoint, {
|
||||
@@ -53,13 +72,23 @@ export async function GetW2lResult(resultToken: string) : Promise<W2lResult | un
|
||||
})
|
||||
.then(res => res.json())
|
||||
.then(res => {
|
||||
const response : W2lInferenceResultResponsePayload = res;
|
||||
if (!response.success) {
|
||||
return;
|
||||
const response : W2lInferenceResultResponsePayload = res;
|
||||
|
||||
if (response?.success) {
|
||||
return response.result!;
|
||||
}
|
||||
|
||||
if (response?.success === false) {
|
||||
if (response.error_reason?.includes("not found")) {
|
||||
return W2lResultLookupError.NotFound;
|
||||
} else {
|
||||
return W2lResultLookupError.ServerError;
|
||||
}
|
||||
}
|
||||
return response?.result;
|
||||
|
||||
return W2lResultLookupError.FrontendError;
|
||||
})
|
||||
.catch(e => {
|
||||
return undefined;
|
||||
return W2lResultLookupError.FrontendError;
|
||||
});
|
||||
}
|
||||
@@ -54,22 +54,22 @@ interface W2lTemplateViewResponsePayload {
|
||||
}
|
||||
|
||||
export async function GetW2lTemplate(templateToken: string) : Promise<GetW2lTemplateResponse> {
|
||||
const endpoint = new ApiConfig().viewW2lTemplate(templateToken);
|
||||
const endpoint = new ApiConfig().viewW2lTemplate(templateToken);
|
||||
|
||||
return await fetch(endpoint, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Accept': 'application/json',
|
||||
},
|
||||
credentials: 'include',
|
||||
})
|
||||
.then(res => res.json())
|
||||
.then(res => {
|
||||
const templatesResponse : W2lTemplateViewResponsePayload = res;
|
||||
return await fetch(endpoint, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Accept': 'application/json',
|
||||
},
|
||||
credentials: 'include',
|
||||
})
|
||||
.then(res => res.json())
|
||||
.then(res => {
|
||||
const templatesResponse : W2lTemplateViewResponsePayload = res;
|
||||
|
||||
if (templatesResponse?.success) {
|
||||
return templatesResponse.template!;
|
||||
}
|
||||
if (templatesResponse?.success) {
|
||||
return templatesResponse.template!;
|
||||
}
|
||||
|
||||
if (templatesResponse?.success === false) {
|
||||
if (templatesResponse.error_reason?.includes("not found")) {
|
||||
|
||||
@@ -4,7 +4,7 @@ import { ApiConfig } from '../../../../common/ApiConfig';
|
||||
import { FrontendUrlConfig } from '../../../../common/FrontendUrlConfig';
|
||||
import { SessionWrapper } from '../../../../session/SessionWrapper';
|
||||
import { useParams, Link, useHistory } from 'react-router-dom';
|
||||
import { GetW2lResult, W2lResult } from '../../../api/w2l/GetW2lResult';
|
||||
import { GetW2lResult, GetW2lResultIsOk, W2lResult } from '../../../api/w2l/GetW2lResult';
|
||||
|
||||
interface Props {
|
||||
sessionWrapper: SessionWrapper,
|
||||
@@ -19,7 +19,7 @@ function W2lResultDeleteFc(props: Props) {
|
||||
|
||||
const getInferenceResult = useCallback(async (token) => {
|
||||
const templateResponse = await GetW2lResult(token);
|
||||
if (templateResponse) {
|
||||
if (GetW2lResultIsOk(templateResponse)) {
|
||||
setW2lInferenceResult(templateResponse)
|
||||
}
|
||||
}, []);
|
||||
@@ -74,7 +74,7 @@ function W2lResultDeleteFc(props: Props) {
|
||||
}
|
||||
|
||||
let currentlyDeleted = !!w2lInferenceResult?.maybe_moderator_fields?.mod_deleted_at ||
|
||||
!!w2lInferenceResult?.maybe_moderator_fields?.user_deleted_at;
|
||||
!!w2lInferenceResult?.maybe_moderator_fields?.result_creator_deleted_at;
|
||||
|
||||
const h1Title = currentlyDeleted ? "Undelete Result?" : "Delete Result?";
|
||||
|
||||
@@ -88,7 +88,6 @@ function W2lResultDeleteFc(props: Props) {
|
||||
"Recover the W2L Result (makes it visible again)" :
|
||||
"Delete W2L Result (hides from everyone but mods)";
|
||||
|
||||
|
||||
const durationSeconds = (w2lInferenceResult?.duration_millis || 0) / 1000;
|
||||
|
||||
return (
|
||||
|
||||
@@ -8,7 +8,7 @@ import { HiddenIconFc } from '../../_icons/HiddenIcon';
|
||||
import { VisibleIconFc } from '../../_icons/VisibleIcon';
|
||||
import { FrontendUrlConfig } from '../../../../common/FrontendUrlConfig';
|
||||
import { DownloadIcon } from '../../_icons/DownloadIcon';
|
||||
import { GetW2lResult, W2lResult } from '../../../api/w2l/GetW2lResult';
|
||||
import { GetW2lResult, GetW2lResultIsErr, GetW2lResultIsOk, W2lResult, W2lResultLookupError } from '../../../api/w2l/GetW2lResult';
|
||||
import { MetaTags } from '../../../../common/MetaTags';
|
||||
|
||||
interface Props {
|
||||
@@ -19,11 +19,18 @@ function W2lResultViewFc(props: Props) {
|
||||
let { token } = useParams() as { token : string };
|
||||
|
||||
const [w2lInferenceResult, setW2lInferenceResult] = useState<W2lResult|undefined>(undefined);
|
||||
const [notFoundState, setNotFoundState] = useState<boolean>(false);
|
||||
|
||||
const getInferenceResult = useCallback(async (token) => {
|
||||
const templateResponse = await GetW2lResult(token);
|
||||
if (templateResponse) {
|
||||
if (GetW2lResultIsOk(templateResponse)) {
|
||||
setW2lInferenceResult(templateResponse)
|
||||
} else if (GetW2lResultIsErr(templateResponse)) {
|
||||
switch(templateResponse) {
|
||||
case W2lResultLookupError.NotFound:
|
||||
setNotFoundState(true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}, []);
|
||||
|
||||
@@ -31,8 +38,14 @@ function W2lResultViewFc(props: Props) {
|
||||
getInferenceResult(token);
|
||||
}, [token, getInferenceResult]); // NB: Empty array dependency sets to run ONLY on mount
|
||||
|
||||
if (w2lInferenceResult === undefined) {
|
||||
return <div />;
|
||||
if (notFoundState) {
|
||||
return (
|
||||
<h1 className="title is-1">Template result not found</h1>
|
||||
);
|
||||
}
|
||||
|
||||
if (!w2lInferenceResult) {
|
||||
return <div />
|
||||
}
|
||||
|
||||
let videoLink = new BucketConfig().getGcsUrl(w2lInferenceResult?.public_bucket_video_path);
|
||||
@@ -59,16 +72,24 @@ function W2lResultViewFc(props: Props) {
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Creator IP address</th>
|
||||
<td>{w2lInferenceResult?.maybe_moderator_fields?.creator_ip_address || "server error"}</td>
|
||||
<th>Template creator is banned</th>
|
||||
<td>{w2lInferenceResult?.maybe_moderator_fields?.template_creator_is_banned ? "banned" : "good standing" }</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Result creator is banned (if user)</th>
|
||||
<td>{w2lInferenceResult?.maybe_moderator_fields?.result_creator_is_banned_if_user ? "banned" : "good standing" }</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Result creator IP address</th>
|
||||
<td>{w2lInferenceResult?.maybe_moderator_fields?.result_creator_ip_address || "server error"}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Mod deleted at (UTC)</th>
|
||||
<td>{w2lInferenceResult?.maybe_moderator_fields?.mod_deleted_at || "not deleted"}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>User deleted at (UTC)</th>
|
||||
<td>{w2lInferenceResult?.maybe_moderator_fields?.user_deleted_at || "not deleted"}</td>
|
||||
<th>Result creator deleted at (UTC)</th>
|
||||
<td>{w2lInferenceResult?.maybe_moderator_fields?.result_creator_deleted_at || "not deleted"}</td>
|
||||
</tr>
|
||||
</>
|
||||
);
|
||||
@@ -115,7 +136,7 @@ function W2lResultViewFc(props: Props) {
|
||||
<span>Public <VisibleIconFc /></span> ;
|
||||
|
||||
const currentlyDeleted = !!w2lInferenceResult?.maybe_moderator_fields?.mod_deleted_at ||
|
||||
!!w2lInferenceResult?.maybe_moderator_fields?.user_deleted_at;
|
||||
!!w2lInferenceResult?.maybe_moderator_fields?.result_creator_deleted_at;
|
||||
|
||||
const deleteButtonTitle = currentlyDeleted ? "Undelete Result?" : "Delete Result?";
|
||||
|
||||
|
||||
Reference in new issue
Block a user