You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
173 lines
7.8 KiB
173 lines
7.8 KiB
import { h } from "../jsx.ts";
|
|
import { Context } from "../oak.ts";
|
|
|
|
import Story from "../templates/Story.tsx";
|
|
import watt from "../wattpad.ts";
|
|
import FourOhFour from "./404.tsx";
|
|
|
|
import Script from "../components/Script.tsx";
|
|
import StoryButtonScript from "../scripts/Story.ts";
|
|
import StoryProgressSavingScript from "../scripts/StoryProgressSaving.ts";
|
|
import ScrollHeader from "../scripts/ScrollHeader.ts";
|
|
|
|
export default async (params: URLSearchParams, ctx: Context) => {
|
|
if (!params.get("id")) return FourOhFour(undefined, ctx);
|
|
|
|
const story = await watt.getStory(params.get("id") as string, false);
|
|
|
|
// chapters
|
|
if (params.get("chapter")) {
|
|
await story.chapters[Number(params.get("chapter") as string)].init();
|
|
return (
|
|
<Story
|
|
story={story}
|
|
stylepath="css/index.scss"
|
|
currentHref={"/story?" + params.toString()}
|
|
>
|
|
<Script function={StoryProgressSavingScript} />
|
|
<Script function={ScrollHeader} />
|
|
<div style="margin-left: 1em; margin-right: 1em;">
|
|
{
|
|
story.chapters[Number(params.get("chapter") as string)]
|
|
.html
|
|
}
|
|
</div>
|
|
<div class="pagenav">
|
|
{Number(params.get("chapter") ?? 0) === 0 ? undefined : (
|
|
<a
|
|
href={(() => {
|
|
// total and utter jank
|
|
params.set(
|
|
"chapter",
|
|
(
|
|
Number(params.get("chapter")) - 1
|
|
).toString()
|
|
);
|
|
const strParams = params.toString();
|
|
params.set(
|
|
"chapter",
|
|
(
|
|
Number(params.get("chapter")) + 1
|
|
).toString()
|
|
);
|
|
return "/story?" + strParams.toString();
|
|
})()}
|
|
>
|
|
<
|
|
</a>
|
|
)}
|
|
|
|
|
{story.chapters.length ===
|
|
Number(params.get("chapter")) + 1 ? undefined : (
|
|
<a
|
|
href={(() => {
|
|
const tmpParams = params;
|
|
tmpParams.set(
|
|
"chapter",
|
|
(
|
|
Number(params.get("chapter")) + 1
|
|
).toString()
|
|
);
|
|
return "/story?" + tmpParams.toString();
|
|
})()}
|
|
>
|
|
>
|
|
</a>
|
|
)}
|
|
</div>
|
|
</Story>
|
|
);
|
|
}
|
|
// metadata
|
|
else {
|
|
return (
|
|
<Story
|
|
story={story}
|
|
stylepath="css/index.scss"
|
|
currentHref={"/story?" + params.toString()}
|
|
>
|
|
<Script function={StoryProgressSavingScript} />
|
|
<Script function={StoryButtonScript} />
|
|
<Script function={ScrollHeader} />
|
|
<div style="display:flex;align-items:center;justify-content:center;flex-direction:column;">
|
|
<div class="story">
|
|
<img id="storycover" src={story.storyJSON.cover} />
|
|
<div>
|
|
<h3 id="storyname">{story.name}</h3>
|
|
<p>{story.storyJSON.description}</p>
|
|
<p>
|
|
Original URL:{" "}
|
|
<a href={story.storyJSON.url}>
|
|
{decodeURI(story.storyJSON.url)}
|
|
</a>
|
|
<br />
|
|
Author:{" "}
|
|
<a
|
|
href={`/user?name=${story.storyJSON.user.name}`}
|
|
>
|
|
{story.storyJSON.user.fullname
|
|
? story.storyJSON.user.fullname
|
|
: story.storyJSON.user.name}
|
|
</a>
|
|
<br />©
|
|
{" " +
|
|
(() => {
|
|
switch (story.storyJSON.copyright) {
|
|
case 1:
|
|
return "All Rights Reserved";
|
|
case 2:
|
|
return "Public Domain";
|
|
case 3:
|
|
return "CC-BY";
|
|
case 4:
|
|
return "CC-BY-NC";
|
|
case 5:
|
|
return "CC-BY-NC-ND";
|
|
case 6:
|
|
return "CC-BY-NC-SA";
|
|
case 7:
|
|
return "CC-BY-SA";
|
|
case 8:
|
|
return "CC-BY-ND";
|
|
}
|
|
})()}
|
|
</p>
|
|
<div style="display:flex;flex-wrap:wrap;align-items:center;justify-content:center;flex-direction:row;text-align:center; margin-left: 0;">
|
|
{story.tags
|
|
.map((v) => (
|
|
<div>
|
|
<a
|
|
href={`/search?query=${v}&type=tag`}
|
|
style="color: black !important; background-color:darkgrey; border-radius: 0.3em; padding: 0.2em; border: none;outline: none;text-decoration: none; margin-bottom: 0.5em;"
|
|
>
|
|
#{v}
|
|
</a>
|
|
</div>
|
|
))
|
|
.join("")}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="detail-buttons" class="detail-buttons">
|
|
<button id="favorite" class="favorite-story-button">
|
|
Favorite
|
|
</button>
|
|
{/* Crazy levels of jank */}
|
|
<form action={"/feed"}>
|
|
<input type="hidden" name="feedtype" value="rss" />
|
|
<input type="hidden" name="id" value={story.id} />
|
|
<button
|
|
type="submit"
|
|
id="feed"
|
|
class="favorite-story-button"
|
|
>
|
|
Subscribe to RSS feed
|
|
</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</Story>
|
|
);
|
|
}
|
|
};
|