- Mongo
- Express
- React
- Node
- Redux
- React-DOM
- Bootstrap
A twitter clone built initially as part of the Advanced Web Developer Bootcamp, extended and customised myself.
The site is built on a Node/Express API with a Mongo database, with React/Redux handling the front end.
It makes extensive use of Redux for API interactions and authentification, and Bootstrap for a base UI to build off.
Current features are user signup & signin and RESTful message routing, with full RESTful routing a main goal.
Version logs for the entire project are below...
- Initial create-react-app
- Add dependencies
- Create ActionTypes
- Add simple error reducer
- Add reducer to set current user
- Combine reducers
- Create store & use redux-thunk
- Include Bootstrap
- Add basic navbar
- Include redux state in navbar
- Set color palette in CSS root
- Add Router to App
- Convert links to
<Link>
components
- Add homepage component
- Add custom styling
- Add main component to contain all other components
- Inlcude React-Router routing
- Create basic form page
- Add internal state to monitor input fields
- Update routing in Main container to redirect to authform
- Pass text props from Main to Authform
- Create Auth setCurrentUser action
- Create API middleware to communicate with backend
- Add Promise to handle API calls
- Add authUser function to async call API auth route
- Pass in userData, set JSON web token
- setTokenHeader in API service to include auth
- Add Error actionTypes
- Add + Remove error actions
- Add errors to redux state, middleware in Main
- Render errors in Main component
- Include error actions in Auth actions
- Add logOut auth action
- Add handlers to config auth token
- Add further fields to render on signup
- Add handleSubmit func
- Prevent default
- Call API with authType & data
- Basic return for testing
- Conditionally render component on login/out
- Store JWT in localstore to remember if logged in
- Check on load if user exists & log in
- Clear localstore on logout
- Add actionTypes
- Add load messages action
- Add fetchMessgages thunk to
GET "api/messages"
- Add messages reducer
- Include message reducers in reducer index
- Create MessageTimeline container, show if logged in
- Create MessageList container
- Add fetchMessages to MessageList
- Map out messages to MesageItem
- Create MessageItem component to render message
- include Moment to format message post date
- Bootstrap column layout
- Add Bootstrap classes to components
- Move some HTML around as needed
- Add custom CSS
- Add UserAside card to display current user
- Pass in defaults for missing data
- Also pass to MessageList
- Make HOC to handle authentication
- Take isAuthenicated from Redux
- Only render passed component if auth
- Render basic new message form w/ state
- Handle onSubmit
- Style w/ Bootstrap
- Add alert to show errors
- Add postNewMessage action/api call
- Add removeHessage action/api call
- Add to messages reducer
- Add actions to MessageList, pass to MessageItem
- Add delete message button, bind
this
- Pass click handler from MessageList
- Show/hide on isCorrectUser
- Show/hide on hover
- Styling
- Add message length counter to NewMessage
- Reformat message date as fromNow
- Column resize
- Restyle navbar
- Add basic stateless footer
- Include in App
- Add height to HTML, flex to
#root
to ensure min-page height & footer positioning
- Add app icon as SVG Component
- Include where needed
- Add default props for styling
- Style as appropriate
- Add column size breakpoints
- Add display breakpoins
- Edit action
- Add getOneMessage const, handler, action
- Include in MessageForm
- ...then realize I could just get all & find...
- Refactor MessageForm onSubmit
- Style edit/delete buttons in container
- Apply
display: grid
& style sizing - Break long messages
- Restyle landing page w/ position, calc
- Tweak navbar styling, add btn classes to links
- Responsive navbar elements
- Add Path & update links to individual user
- Modify MessageList to filter by user if needed
- Add new message link to UserASide
- Add isEdited to Message schema & edit handler
- Render text if message is edited
- Add
static.json
with refs for Heroku - Create Heroku app through Heroku CLI
- Push live site
- Create new color palette
- Import fonts
- Strip previous styling
- Strip elements, rearrange as
.navbar-collapse
- Include BootstrapJS in
index.html
- Restyle
.navbar-brand
- Restyle
<footer>
with new colors
- Change link color if not btn
- Apply new fonts
- Fix
#root
sizing issue & auto expand<main>
- Swap
.btn
s to.btn-outline
- Clear old styling
- Restyle new
Icon
position - Add
path-dashoffset
animation
- Swap elements to inline form
- Style
.form-control
s - Add placeholders
- Add prepend to username field
- Add col to form
- Disable button if message empty
- Style adspace column
- Duplicate & style modal version of new message form
- Add click handler to hide if shown
- Create route to mount over MessageTimeline
- Update links in UserCard + Navbar
- Create Loader component to show while awaiting API calls
- Style with mounting & loading animation
- Include in Authform & show with state
- Convert to functional component
- Add useHistory hook
- Redirect to homepage on logout
- Add LandingBackground from Codepen
- CSS-in-JS for LandingBackground
- Mount in Homepage
- Add @keyframes for LandingBackground
- Render edited date in Message
- Remove isEdited, compare createdAt & updatedAt instead
- Remove isEdited from backend
- Responsive display of edit/delete buttons
- Create UserProfile container to show specific user's messages
- Alter routes to reflect change
- Link to UserProfile where username is mentioned
- Add getUser route to backend
- Add user actions, reducers
- Change UserProfile to class to use DidMount
- Populate UserProfile user info from getOneUser
- Add editUSer route to backend
- Add editUser action
- Create EditUser component
- Populate form
- Handle submit
- Add bio to User schema w/ length limit
- Add bio to UserCard + UserProfile
- Refactor modal classes from MessageFormModal
- Use in EditUserModal
- Change routing from Main
- Add EditProfileModal to UserProfile
- Add to state
- Conditionally render edit profile button in UserProfile
- Style UserProfile header
- Refactor UserProfileHeader as seperate Component
- Remove EditUser from UserProfile, mount independently
- Move components around to make more sense
- Refactor LandingPage & Adspace
- Remove padding from columns to get snug
- Remove ALL border-radiuses
- Define heights for elements
- Restrict message list size & scroll
- UserProfile is mounting a fuckton - why?
- PopUser as global async function
- Use in UserCard
- Display errors (Header?)
- Sticky navbar, fill bg on scroll
- Animate component lifecycles
- Redo UserProfile routing to username not id
- Catch 404s!
- checkcurrentuser in editprofile
- Convert Bootstrap to Tailwind
- Push new message to list straight away