Add "Playing It Safe" draft and improve type-checking

- Remove most type assertions and improve types
- Validate wordCount property
- Add "Vore Day" tag
- Add licenses
This commit is contained in:
Bad Manners 2024-08-03 20:33:49 -03:00
parent 17ef8c652c
commit fe908a4989
37 changed files with 1309 additions and 841 deletions

View file

@ -16,7 +16,7 @@ type Props = CollectionEntry<"games">["data"];
const { props } = Astro;
const series = props.series && (await getEntry(props.series));
const authors = await getEntries([props.authors].flat());
const authorsList = await getEntries(props.authors);
const copyrightedCharacters = await formatCopyrightedCharacters(props.copyrightedCharacters);
// const relatedStories = (await getEntries(props.relatedStories)).filter((story) => !story.data.isDraft);
// const relatedGames = (await getEntries(props.relatedGames)).filter((game) => !game.data.isDraft);
@ -37,7 +37,7 @@ const tags = props.tags.map<{ id: string; name: string }>((tag) => {
console.warn(`No "${props.lang}" translation for tag "${tag}"`);
return { id, name: tag };
}
return { id, name: categorizedTags[tag]! };
return { id, name: categorizedTags[tag] };
});
const thumbnail =
props.thumbnail &&
@ -128,7 +128,7 @@ const thumbnail =
class="mt-1 space-y-2 px-2 font-serif font-light italic text-stone-600 dark:text-stone-200"
>
<Authors lang={props.lang}>
{authors.map((author) => <UserComponent lang={props.lang} user={author} />)}
{authorsList.map((author) => <UserComponent user={author} lang={props.lang} />)}
</Authors>
<div id="platforms">
<p>{t(props.lang, "game/platforms", props.platforms)}</p>
@ -140,9 +140,13 @@ const thumbnail =
</p>
) : null
}
<div id="content-warning">
<p>{props.contentWarning}</p>
</div>
{
props.contentWarning ? (
<div id="content-warning">
<p>{props.contentWarning}</p>
</div>
) : null
}
</section>
{
thumbnail ? (

View file

@ -26,9 +26,9 @@ if (next && next.data.isDraft) {
next = undefined;
}
const series = props.series && (await getEntry(props.series));
const authors = await getEntries([props.authors].flat());
const commissioner = props.commissioner && (await getEntry(props.commissioner));
const requester = props.requester && (await getEntry(props.requester));
const authorsList = await getEntries(props.authors);
const commissionersList = props.commissioner && (await getEntries(props.commissioner));
const requestersList = props.requester && (await getEntries(props.requester));
const copyrightedCharacters = await formatCopyrightedCharacters(props.copyrightedCharacters);
const relatedStories = (await getEntries(props.relatedStories)).filter((story) => !story.data.isDraft);
// const relatedGames = (await getEntries(props.relatedGames)).filter((game) => !game.data.isDraft);
@ -49,7 +49,7 @@ const tags = props.tags.map<{ id: string; name: string }>((tag) => {
console.warn(`No "${props.lang}" translation for tag "${tag}"`);
return { id: tagSlug, name: tag };
}
return { id: tagSlug, name: categorizedTags[tag]! };
return { id: tagSlug, name: categorizedTags[tag] };
});
const thumbnail =
props.thumbnail &&
@ -60,7 +60,7 @@ const wordCount = props.wordCount?.toString();
<BaseLayout pageTitle={props.title}>
<Fragment slot="head">
<meta property="og:title" content={props.title} data-pagefind-meta="title[content]" />
<meta property="og:description" content={t(props.lang, "story/warnings", wordCount, props.contentWarning.trim())} />
<meta property="og:description" content={t(props.lang, "story/warnings", wordCount, props.contentWarning)} />
<meta property="og:url" content={Astro.url} data-pagefind-meta="url[content]" />
{
thumbnail ? (
@ -178,7 +178,7 @@ const wordCount = props.wordCount?.toString();
class="mt-1 space-y-2 px-2 font-serif font-light italic text-stone-600 dark:text-stone-200"
>
<Authors lang={props.lang}>
{authors.map((author) => <UserComponent lang={props.lang} user={author} />)}
{authorsList.map((author) => <UserComponent user={author} lang={props.lang} />)}
</Authors>
{
props.isDraft ? (
@ -188,22 +188,26 @@ const wordCount = props.wordCount?.toString();
) : null
}
{
commissioner && (
<Commissioners lang={props.lang}>
<UserComponent user={commissioner} lang={props.lang} />
</Commissioners>
requestersList && (
<Requesters lang={props.lang}>
{requestersList.map((requester) => (
<UserComponent user={requester} lang={props.lang} />
))}
</Requesters>
)
}
{
requester && (
<Requesters lang={props.lang}>
<UserComponent user={requester} lang={props.lang} />
</Requesters>
commissionersList && (
<Commissioners lang={props.lang}>
{commissionersList.map((commissioner) => (
<UserComponent user={commissioner} lang={props.lang} />
))}
</Commissioners>
)
}
<div id="content-warning">
<p>
{t(props.lang, "story/warnings", wordCount, props.contentWarning.trim())}
{t(props.lang, "story/warnings", wordCount, props.contentWarning)}
</p>
</div>
</section>