# Understanding Props

# Props

React props are similar to attributes with HTML.

# Syntax Singular

export default function ParentComponent(prop) {
  return (
    <p>{prop}</p>
  )
}

# Syntax Multiple

export default function ParentComponent({propA, propB, propC}) {
  return (
    <p>{propA}</p>
    <p>{propB}</p>
    <p>{propC}</p>
  )
}

# PropTypes

Form of validation for props.

# Installing PropTypes

npm installation:

npm install prop-types --save

Imports to use PropTypes:

import PropTypes from 'prop-types';

# PropTypes Syntax

BlogItem.propTypes = {
  index: PropTypes.number.isRequired,
  blogPost: PropTypes.object.isRequired,
  imageOrientation: PropTypes.string,
};

# Passing Props From Parent to Child

Props can be passed down from a parent component to child component.

# Example

# BlogsPage Component

import React from 'react';

import Navbar from "../../components/Navbar";
import Heading from "../../components/Heading";
import BlogList from "../../components/BlogList";
import Footer from "../../components/Footer";

import "../../App.css";
import "./index.css";

//Importing Dummy Data
const data = require("../../dummy-data.json");
let blogPosts = data.blogPosts;

export default function BlogsPage() {
  return (
    <>
      <Navbar />
      <div className="container">
        <Heading />
        <div className="scroll-menu">
          <CategoriesList />
        </div>
        <div style={{ display: "flex", justifyContent: "space-between" }}>
          <p className="page-subtitle">Blog Posts</p>
        </div>
        <BlogList blogPosts={blogPosts} />
      </div>
      <Footer />
  );
}

# BlogList Component

import React from "react";
import PropTypes from "prop-types";
import "./index.css";
import BlogItem from "../BlogItem";

export default function BlogList({ blogPosts }) {
  return (
    <div className="blog-list">
      {blogPosts.map((blogPost, index) => {
        return (
          <div
            key={index}
            style={{
              width: "100%",
            }}
          >
            <BlogItem
              index={index}
              blogPost={blogPost}
              imageOrientation={"top"}
            />
          </div>
        );
      })}
    </div>
  );
}

BlogList.propTypes = {
  blogPosts: PropTypes.array.isRequired,
};

# BlogItem Component

import React from "react";
import PropTypes from "prop-types";

import BlogItemText from "../BlogItemText";

import "../../App.css";
import "./index.css";


export default function BlogItem({
  index,
  blogPost,
  imageOrientation,
}) {
if (imageOrientation === "top") {
    return (
      <div key={index} className="card-1">
        <img src={blogPost.image} className="card-img-top" alt="..." />
        <div className="card-text-bottom">
          <BlogItemText
            blogPost={blogPost}
            headerFontSize="20px"
          ></BlogItemText>
        </div>
      </div>
    );
  } else {
    return (
      <div key={index} className="card-2">
        <img src={blogPost.image} className="card-img-left" alt="..." />
        <div className="card-text-right">
          <BlogItemText
            blogPost={blogPost}
            headerFontSize="20px"
          ></BlogItemText>
        </div>
      </div>
    );
  }
}

BlogItem.propTypes = {
  index: PropTypes.number.isRequired,
  blogPost: PropTypes.object.isRequired,
  imageOrientation: PropTypes.string,
};

# Function Example

Functions can be passed as props as well.

# BlogsPage Component

import React, { useEffect, useState } from "react";

import Navbar from "../../components/Navbar";
import Heading from "../../components/Heading";
import BlogList from "../../components/BlogList";
import CategoriesList from "../../components/CategoriesList";
import Footer from "../../components/Footer";

import "../../App.css";
import "./index.css";

// Week 1: Import the blogPosts and categories from the dummy-data.json file
const data = require("../../dummy-data.json");
let blogPosts = data.blogPosts;
const categories = data.categories;

export default function BlogsPage() {

  const [categoryId, setCategoryId] = useState(undefined);
  const [blogs, setBlogs] = useState([]);

  useEffect(() => {
    // Week 1: Filter the blogPosts based on the categoryId
    const blogs = blogPosts.filter((x) =>
      categoryId !== undefined
        ? x.categories.find((y) => y.id.toString() === categoryId.toString())
        : true
    );
    setBlogs(() => blogs);
  }, [categoryId]);

  return (
    <>
      <Navbar />
      <div className="container">
        <Heading />
        <div className="scroll-menu">
          <CategoriesList 
              categories={categories} 
              categoryId={categoryId}
              setCategoryId={setCategoryId}>
          </CategoriesList>
        </div>
        <div style={{ display: "flex", justifyContent: "space-between" }}>
          <p className="page-subtitle">Blog Posts</p>
        </div>
        <BlogList blogPosts={blogs} />
      </div>
      <Footer />
    </>
  );
}

# CategoriesList Component

import React from "react";
import PropTypes from "prop-types";

export default function CategoriesList({
  categories,
  categoryId,
  setCategoryId,
}) {
  return categories.map((category, index) => {
    return categoryId === category.id.toString() ? (
      <button
        key={index}
        onClick={() => setCategoryId(category.id)}
        style={{ color: "blue" }}
      >
        <p key={index}>{category.title}</p>
      </button>
    ) : (
      <button
        key={index}
        onClick={() => setCategoryId(category.id)}
        style={{ color: "black" }}
      >
        <p key={index}>{category.title}</p>
      </button>
    );
  });
}

CategoriesList.propTypes = {
  categories: PropTypes.array.isRequired,
  categoryId: PropTypes.string.isRequired,
  setCategoryId: PropTypes.func.isRequired,
};