Splitting PostSegment into its own file, minor refactoring
This commit is contained in:
		
							parent
							
								
									46678dfdeb
								
							
						
					
					
						commit
						ac527a4b71
					
				
					 3 changed files with 62 additions and 44 deletions
				
			
		
							
								
								
									
										47
									
								
								client-solid/src/Components/PostSegment.tsx
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								client-solid/src/Components/PostSegment.tsx
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,47 @@
 | 
				
			||||||
 | 
					import { useNavigate } from "@solidjs/router";
 | 
				
			||||||
 | 
					import { JSXElement, Show } from "solid-js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { Arrow, EngagementIcon } from "../Util/Icons";
 | 
				
			||||||
 | 
					import { Post } from "../Util/api";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * PostSegment is used to display posts in both the main feed and the post view
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * @param {Object} props The properties for the PostSegment component.
 | 
				
			||||||
 | 
					 * @param {Post} props.post The post to display.
 | 
				
			||||||
 | 
					 * @returns {JSXElement} A JSXElement of a post
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export function PostSegment({ post }: { post: Post }): JSXElement {
 | 
				
			||||||
 | 
					  const nav = useNavigate();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const dateOfCreation = new Date(post.createdAt).toDateString();
 | 
				
			||||||
 | 
					  const isEdited = !(post.createdAt == post.updatedAt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return (
 | 
				
			||||||
 | 
					    <div class="card compact w-full flex-grow border-b-2 border-b-primary bg-base-200 text-base-content transition-all hover:bg-base-300">
 | 
				
			||||||
 | 
					      <div class="card-body md:mx-6">
 | 
				
			||||||
 | 
					        <h3>{dateOfCreation}</h3>
 | 
				
			||||||
 | 
					        <Show when={isEdited}>
 | 
				
			||||||
 | 
					          <p>This post has been edited</p>
 | 
				
			||||||
 | 
					        </Show>
 | 
				
			||||||
 | 
					        <p class="break-words text-base-content md:pt-2">{post.content}</p>
 | 
				
			||||||
 | 
					        <div class="card-actions justify-between">
 | 
				
			||||||
 | 
					          <button
 | 
				
			||||||
 | 
					            // onClick={(engagement)}
 | 
				
			||||||
 | 
					            class="btn btn-xs hover:border-x-primary"
 | 
				
			||||||
 | 
					            aria-label="Show sign of engagement"
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
 | 
					            <EngagementIcon />
 | 
				
			||||||
 | 
					          </button>
 | 
				
			||||||
 | 
					          <button
 | 
				
			||||||
 | 
					            onClick={(): void => nav("/post/" + post.id)}
 | 
				
			||||||
 | 
					            class="btn btn-xs"
 | 
				
			||||||
 | 
					            aria-label="View post"
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
 | 
					            <Arrow />
 | 
				
			||||||
 | 
					          </button>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,9 +1,13 @@
 | 
				
			||||||
import { useNavigate } from "@solidjs/router";
 | 
					 | 
				
			||||||
import { For, JSXElement, Show, createSignal } from "solid-js";
 | 
					import { For, JSXElement, Show, createSignal } from "solid-js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { Arrow, EngagementIcon, loadSpinner } from "../Util/Icons";
 | 
					import { loadSpinner } from "../Util/Icons";
 | 
				
			||||||
import { Post, getPosts } from "../Util/api";
 | 
					import { Post, getPosts } from "../Util/api";
 | 
				
			||||||
 | 
					import { PostSegment } from "./PostSegment";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Posts is a component that displays a collection of posts.
 | 
				
			||||||
 | 
					 * @returns {JSXElement} A JSXElement that contains a collection of posts.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
export function Posts(): JSXElement {
 | 
					export function Posts(): JSXElement {
 | 
				
			||||||
  const [posts, setPosts] = createSignal([] as Post[]);
 | 
					  const [posts, setPosts] = createSignal([] as Post[]);
 | 
				
			||||||
  const [loading, setLoading] = createSignal(true);
 | 
					  const [loading, setLoading] = createSignal(true);
 | 
				
			||||||
| 
						 | 
					@ -21,43 +25,3 @@ export function Posts(): JSXElement {
 | 
				
			||||||
    </Show>
 | 
					    </Show>
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
// This is the card container for a post
 | 
					 | 
				
			||||||
export function PostSegment({ post } : { post: Post }): JSXElement {
 | 
					 | 
				
			||||||
  const nav = useNavigate();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  const dateOfCreation = new Date(post.createdAt).toDateString()
 | 
					 | 
				
			||||||
  const isEdited = ! (post.createdAt == post.updatedAt)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return (
 | 
					 | 
				
			||||||
    <div class="card compact w-full flex-grow border-b-2 border-b-primary bg-base-200 text-base-content transition-all hover:bg-base-300">
 | 
					 | 
				
			||||||
      <div class="card-body md:mx-6">
 | 
					 | 
				
			||||||
        <h3>
 | 
					 | 
				
			||||||
          {dateOfCreation}
 | 
					 | 
				
			||||||
        </h3>
 | 
					 | 
				
			||||||
        <Show when={isEdited}>
 | 
					 | 
				
			||||||
         <p>This post has been edited</p> 
 | 
					 | 
				
			||||||
        </Show>
 | 
					 | 
				
			||||||
        <p class="break-words text-base-content md:pt-2">
 | 
					 | 
				
			||||||
          {post.content}
 | 
					 | 
				
			||||||
        </p>
 | 
					 | 
				
			||||||
        <div class="card-actions justify-between">
 | 
					 | 
				
			||||||
          <button
 | 
					 | 
				
			||||||
            // onClick={(engagement)}
 | 
					 | 
				
			||||||
            class="btn btn-xs hover:border-x-primary"
 | 
					 | 
				
			||||||
            aria-label="Show sign of engagement"
 | 
					 | 
				
			||||||
          >
 | 
					 | 
				
			||||||
            <EngagementIcon />
 | 
					 | 
				
			||||||
          </button>
 | 
					 | 
				
			||||||
          <button
 | 
					 | 
				
			||||||
            onClick={(): void => nav("/post/" + post.id)}
 | 
					 | 
				
			||||||
            class="btn btn-xs"
 | 
					 | 
				
			||||||
            aria-label="View post"
 | 
					 | 
				
			||||||
          >
 | 
					 | 
				
			||||||
            <Arrow />
 | 
					 | 
				
			||||||
          </button>
 | 
					 | 
				
			||||||
        </div>
 | 
					 | 
				
			||||||
      </div>
 | 
					 | 
				
			||||||
    </div>
 | 
					 | 
				
			||||||
  );
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,8 +12,12 @@ import { loadSpinner } from "../Util/Icons";
 | 
				
			||||||
import { getPost } from "../Util/api";
 | 
					import { getPost } from "../Util/api";
 | 
				
			||||||
import { CommentSection } from "./CommentSection";
 | 
					import { CommentSection } from "./CommentSection";
 | 
				
			||||||
import { NewCommentInputArea } from "./NewComment";
 | 
					import { NewCommentInputArea } from "./NewComment";
 | 
				
			||||||
import { PostSegment } from "./Posts";
 | 
					import { PostSegment } from "./PostSegment";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * This is the view for a single post along with its comments.
 | 
				
			||||||
 | 
					 *  @returns {JSXElement} A JSXElement
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
export function SinglePost(): JSXElement {
 | 
					export function SinglePost(): JSXElement {
 | 
				
			||||||
  const params = useParams();
 | 
					  const params = useParams();
 | 
				
			||||||
  const [post] = createResource(params.postid, getPost);
 | 
					  const [post] = createResource(params.postid, getPost);
 | 
				
			||||||
| 
						 | 
					@ -24,7 +28,10 @@ export function SinglePost(): JSXElement {
 | 
				
			||||||
      <Show when={post()}>
 | 
					      <Show when={post()}>
 | 
				
			||||||
        <PostSegment post={post()!} />
 | 
					        <PostSegment post={post()!} />
 | 
				
			||||||
        <Show when={login_ctx.loggedIn()}>
 | 
					        <Show when={login_ctx.loggedIn()}>
 | 
				
			||||||
          <NewCommentInputArea parentCommentId={null} parentPostId={parseInt(params.postid)} />
 | 
					          <NewCommentInputArea
 | 
				
			||||||
 | 
					            parentCommentId={null}
 | 
				
			||||||
 | 
					            parentPostId={parseInt(params.postid)}
 | 
				
			||||||
 | 
					          />
 | 
				
			||||||
        </Show>
 | 
					        </Show>
 | 
				
			||||||
        <CommentSection postId={params.postid} />
 | 
					        <CommentSection postId={params.postid} />
 | 
				
			||||||
      </Show>
 | 
					      </Show>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue