···4import { validate as isValid } from 'uuid';
5import { ContextVariables } from "../auth";
6import { PostEdit } from "../layout/editPost";
7-import { ScheduledPost, ScheduledPostList } from "../layout/postList";
08import { authMiddleware } from "../middleware/auth";
9import { corsHelperMiddleware } from "../middleware/corsHelper";
10import {
···174 originalPost.text = content;
175 c.header("HX-Trigger-After-Settle", `{"scrollListToPost": "${id}"}`);
176 c.header("HX-Trigger-After-Swap", "postUpdatedNotice, timeSidebar, scrollTop");
177- return c.html(<ScheduledPost post={originalPost} dynamic={true} />);
178 }
179180 c.header("HX-Trigger-After-Settle", swapErrEvents);
···190 // Get the original post to replace with
191 if (postInfo !== null) {
192 c.header("HX-Trigger-After-Swap", "timeSidebar, scrollListTop, scrollTop");
193- return c.html(<ScheduledPost post={postInfo} dynamic={true} />);
194 }
195196 // Refresh sidebar otherwise
···4import { validate as isValid } from 'uuid';
5import { ContextVariables } from "../auth";
6import { PostEdit } from "../layout/editPost";
7+import { PostHTML } from "../layout/post";
8+import { ScheduledPostList } from "../layout/postList";
9import { authMiddleware } from "../middleware/auth";
10import { corsHelperMiddleware } from "../middleware/corsHelper";
11import {
···175 originalPost.text = content;
176 c.header("HX-Trigger-After-Settle", `{"scrollListToPost": "${id}"}`);
177 c.header("HX-Trigger-After-Swap", "postUpdatedNotice, timeSidebar, scrollTop");
178+ return c.html(<PostHTML post={originalPost} dynamic={true} />);
179 }
180181 c.header("HX-Trigger-After-Settle", swapErrEvents);
···191 // Get the original post to replace with
192 if (postInfo !== null) {
193 c.header("HX-Trigger-After-Swap", "timeSidebar, scrollListTop, scrollTop");
194+ return c.html(<PostHTML post={postInfo} dynamic={true} />);
195 }
196197 // Refresh sidebar otherwise
+2-2
src/layout/editPost.tsx
···1import { MAX_LENGTH } from "../limits";
2import { EmbedDataType, Post } from "../types.d";
3-import { PostContentObject } from "./postList";
45type EditedPostProps = {
6 post: Post;
···45export function PostEdit({post}:EditedPostProps) {
46 // If this post is posted, just show the same object again.
47 if (post.posted) {
48- return (<PostContentObject text={post.text} posted={true} repost={false} />);
49 }
5051 const editSpinner: string = `editSpinner${post.postid}`;
···1import { MAX_LENGTH } from "../limits";
2import { EmbedDataType, Post } from "../types.d";
3+import { PostContent } from "./post";
45type EditedPostProps = {
6 post: Post;
···45export function PostEdit({post}:EditedPostProps) {
46 // If this post is posted, just show the same object again.
47 if (post.posted) {
48+ return (<PostContent text={post.text} posted={true} repost={false} />);
49 }
5051 const editSpinner: string = `editSpinner${post.postid}`;
+1-1
src/layout/makePost.tsx
···12} from "../limits";
13import { PreloadRules } from "../types.d";
14import { ConstScriptPreload } from "../utils/constScriptGen";
15-import { ContentLabelOptions } from "./options/contentLabelOptions";
16import { IncludeDependencyTags } from "./helpers/includesTags";
017import { RetweetOptions } from "./options/retweetOptions";
18import { ScheduleOptions } from "./options/scheduleOptions";
19
···12} from "../limits";
13import { PreloadRules } from "../types.d";
14import { ConstScriptPreload } from "../utils/constScriptGen";
015import { IncludeDependencyTags } from "./helpers/includesTags";
16+import { ContentLabelOptions } from "./options/contentLabelOptions";
17import { RetweetOptions } from "./options/retweetOptions";
18import { ScheduleOptions } from "./options/scheduleOptions";
19
+43
src/layout/post.tsx
···0000000000000000000000000000000000000000000
···1+import { html } from "hono/html";
2+import { MAX_POSTED_LENGTH } from "../limits";
3+import { Post } from "../types.d";
4+import { PostDataFooter, PostDataHeader } from "./posts/wrappers";
5+6+type PostContentProps = {
7+ text: string;
8+ posted: boolean;
9+ repost: boolean;
10+};
11+12+export function PostContent(props: PostContentProps) {
13+ const ellipses = props.posted && !props.repost && props.text.length >= (MAX_POSTED_LENGTH-1) ? "..." : "";
14+ return (<p class="postText">{props.text}{ellipses}</p>);
15+};
16+17+type ScheduledPostOptions = {
18+ post: Post;
19+ // if the object should be dynamically replaced.
20+ // usually in edit/cancel edit settings.
21+ dynamic?: boolean;
22+};
23+24+export function PostHTML(props: ScheduledPostOptions) {
25+ const content: Post = props.post;
26+ const oobSwapStr = (props.dynamic) ? `hx-swap-oob="#postBase${content.postid}"` : "";
27+ const hasBeenPosted: boolean = (content.posted === true && content.uri !== undefined);
28+29+ const postHTML = html`
30+ <article
31+ id="postBase${content.postid}" ${oobSwapStr}>
32+ ${<PostDataHeader content={content} posted={hasBeenPosted} />}
33+ <div id="post${content.postid}">
34+ ${<PostContent text={content.text} posted={content.posted || false} repost={content.isRepost || false} />}
35+ </div>
36+ ${<PostDataFooter content={content} posted={hasBeenPosted} />}
37+ </article>`;
38+ // if this is a thread, chain it nicely
39+ if (content.isChildPost)
40+ return html`<blockquote>${postHTML}</blockquote>`;
41+42+ return postHTML;
43+};