dyedavelly / connect

Linkedin Clone
0 stars 0 forks source link

CONNECT

Check out the LIVE SITE

Introduction

Connect is a full-stack web application designed to emulate the LinkedIn experience. Users can post and share professional content. The application features a responsive React/Redux frontend, Ruby on Rails backend for efficient data handling, and a PostgreSQL database.

Technologies used

Languages

Backend

Database

Frontend

Storage

Hosting

Key Features

User Authentication

1. Secure Account Management:

2. Error Handling:

3. Demo User Access:

POSTS

1. View Posts

2. Create Post

3. Edit/Update Post

4. Delete Post

Code Snippets

  1. Display Edit/Delete Options for the Post only if the post belongs to the user who is logged-in:

gif of posts

<>
    {!isEditMode && (
        <div className="post-box"> 
            <div className="post-name-and-menu">
                <div className="photo-and-name">
                {author?.photoUrl ? (
                <img className="profile-photo" src={author.photoUrl}/>
                    ) : (<span className="profile-icon"><FaUserCircle /></span>
                    )}
                <span className="author-name">{author.firstName} {author.lastName}</span>
                </div>
                <div className="post-body">{post.body}</div>
                {post?.imageUrl ? (
                    <img className="post-image" src={post.imageUrl} />
                ) : null }   
            </div>
            <div>
                {author.id === sessionUser && (
                        <>
                        {!showMenu && (
                            <button onClick={toggleMenu} className="horizontal-menu"><FiMoreHorizontal /></button>
                        )}
                        {showMenu && (
                            <ul className="post-dropdown" ref={dropdownRef}>
                                <li>
                                    <button onClick={editPost}>Edit</button>
                                </li>
                                <li>
                                    <button onClick={deletePost}>Delete</button>
                                </li>
                            </ul>
                        )}
                        </>
                    )}
            </div>
        </div>
    )}
    {isEditMode && (
        <div className="modal-overlay">
                <div className="modal">
                    <div className="modal-header">
                        <span className="modal-header-name-photo">
                            {author?.photoUrl ? (
                            <img className="start-post-profile-photo" src={author.photoUrl}/>
                            ) : (<span className="start-post-profile-icon"><FaUserCircle /></span>
                            )}
                            <span className="modal-name">{author.firstName} {author.lastName.charAt(0)}</span>
                        </span>
                        <button className="close-button" onClick={closeModal}>X</button>
                    </div>
                    <textarea value={body} onChange={(e) => setBody(e.target.value)}></textarea>
                    <div className="bottom-border"></div>
                    <div className="modal-post-button">
                    <button onClick={updatePost} className="post-submit-button">Save</button>
                    </div>  
                </div>
        </div>
    )}
</>
  1. Display Firstname and Lastname fields on the signup screen only after entering the Email and Password:

gif of sign-up page

<p className="main-title">Make the most your professional life</p>
      <div className="container">
      <div className="signup-box">
          <ul className="errors">
            {errors.map(error => <li key={error}>{error}</li>)}
          </ul>
         {!nameScreen && ( 
          <>
          <form onSubmit={agreeButton}>
          <label>Email</label>
          <input type="text" className="input-field" value={email} onChange={(e) => setEmail(e.target.value)} required/>
          <label>Password (6+ characters) </label>
          <input type="password" className="input-field" value={password} onChange={(e) => setPassword(e.target.value)} required/>
          <p className="terms">
                  By clicking Continue, you agree to connect’s <a href="#">User Agreement</a>, <a href="#">Privacy Policy</a>, and <a href="#">Cookie Policy</a>.
          </p>
          <button type="submit" className="sign-up-button">Agree & Join</button>
        </form>
        <p className="sign-in">Already on connect? <Link to={"/login"}>Sign in</Link></p>
        </>
         )} 
          {nameScreen && ( 
          <form onSubmit={handleSubmit}>
          <label>First name</label>
          <input type="text" className="input-field" value={first_name} onChange={(e) => setFirstname(e.target.value)} required/>
          <label>Last name</label>
          <input type="text" className="input-field" value={last_name} onChange={(e) => setLastname(e.target.value)} required/>
          <button type="submit" className="sign-up-button">Continue</button>
        </form>
         )} 
      </div>
    </div>