Code Monkey home page Code Monkey logo

rawdaty's Introduction

Rawdaty

Main Problem ๐Ÿšซ

Parents find itโ€™s hard to get a good kindergarten for their children that appropriates with their location and financial capabilities for the parents, and it should have good reviews and rates.

Problem Solution ๐Ÿ’ก

Create an application that allows parents to find the appropriate kindergarten according to their location, people reviews, and fees, and they can add their comments and reviews about any kindergarten. Also, the application allows any kindergarten owner to add their kindergarten.

User Stories ๐Ÿ“š

As a user

  • I can see a list of top-rated kindergartens.
  • I can search from any page.
  • I can Select the kindergarten's location before Search using the kindergarten's name.
  • I can Filter the search result by tuition fees, location, and reviews.
  • I can see inside each kindergarten's card (name, location, photo, rate, NO.people ).
  • I can see a kindergarten's profile when I click on the cards.
  • I can see (the main photo, name, about, shifts' time, contact, more pictures, location (map), tuition fee, rate, and comments for review) In the profile.
  • I can add a review about the kindergarten.

As a kindergarden Owner

  • I can send a request for adding a new kindergarten.

As an Admin

  • I can accept or reject the new requests for kindergartens.
  • I can add new kindergarten.
  • I can see a list of kindergartens.
  • I can search through the list of kindergartens and filter them by price and location.
  • I can edit and delete kindergartens.
  • I can disable kindergartens.
  • I can delete the comments.

User Journey โœ๏ธ

  • As a user, I can search for kindergartens by entering the name, with the ability to specify the location and the price to get the desired search results that I need. Also, I can see the top-rated kindergartens. I can open the profile of any kindergarten to see all information about it. I can add my rate and review to any kindergarten to help other parents.

  • As a kindergarten owner, I can send a request to add my kindergarten information to the website.

  • As an admin, I can log in to the dashboard, I can see a list of all the kindergartens, see the details for each kindergarten, and I have the ability to delete the kindergarten or edit its data or delete any comments. Also, I can make any kindergarten disabled or enabled, and search for any kindergarten and filter the search results depending on location, price, review, and its status (disabled, enabled). Also, I can add a new kindergarten and, in the notifications section, I can see the requests from kindergarten owners to add new kindergarten, and I can accept or ignore these requests. And I can search in the notifications by user name or kindergarten name. Finally, I can log out from the dashboard.

Prototype

View Prototype rawdaty

Technologies ๐Ÿ’ป

  • BackEnd: Node JS & Express JS
  • FrontEnd: React JS
  • Database: PostgreSQL
  • Styling: CSS
  • Libraries: AntDesign

Lead Mentor

  • Muhammad Abdulhadi

Team Members

  • Alaa Sahloub
  • Alaa AlSer
  • Israa Al Jamal
  • Osama Younis

Resources

rawdaty's People

Contributors

alaa-sahloub avatar alaalser avatar israa91 avatar mu7ammadabed avatar osama-you avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

rawdaty's Issues

GET | /users

relates #5

Route: GET api/v1/users

Acceptance Criteria

  • DB query
  • Response
  • Testing

DB query

SELECT * FROM users ;

Response

  • Success
{ 
    statusCode:200 ,
     data:  
     [{ 
        user_id,
        user_name,
        email,
        password,
        is_admin,
        create_at
     }]
}
  • Failed
{statusCode:400,  message:'Bad request',}

Testing

to be a successful test

  • status === 200
  • typeof(data) === "array"
  • data.length !== 0

GET | /kindergarten/:id/comments

relates #5

Route: GET api/v1/kindergarten/:id/comments

Acceptance Criteria

  • DB query
  • Response
  • Testing

DB query

SELECT * FROM comments WHERE kindergarten_id = id;

Response

  • Success
{ StatusCode: 200,
  data: [{
          comment_id,
          kindergarten_id,
          user_name,
          comment,
          rating,
          create_at
      }]
  • Failed
{statusCode:400, message:"Bad Request"}

Testing

to be a successful test

  • status === 200
  • typeof(data) === "array"
  • data.length !== 0

README

Our readme file should contain:-

  • Main Problem ๐Ÿšซ
  • Problem Solution ๐Ÿ’ก
  • User Stories ๐Ÿ“š
  • User Journey โœ๏ธ
  • Prototype ๐ŸŽจ
  • Technologies ๐Ÿ’ป
  • How to Launch App Locally ๐Ÿ“ฃ
    • Database Setup
    • Environment Variables
    • Start the App
  • Team Lead ๐Ÿ˜Ž
  • Team Members ๐Ÿ˜ƒ
  • Resources ๐Ÿ”

Backend Routes

User Routes

Route Method Description Status
/kindergarten GET get All kindergarten data ๐Ÿ‘
/kindergarten POST add new kindergarten
/kindergarten/:id GET get kindergaten profile details
/kindergarten/:id/comments GET get all comments of this kindergarten
/kindergarten/:id/comments POST add new comment to this kindergarten
/signup POST add a new user
/login POST login for the user
/logout GET logout for the user
/search?q&location&minPrice&maxPrice&rating GET return a list of kindergartens according to name,location,price and rating

Admin Routes

Route Method Description Status
/login POST Verify login and give token ๐Ÿ‘
/logout GET Deletes the token and logs the user out ๐Ÿ‘
/kindergarten GET get All kindergarten data
/kindergarten/:id PUT update or edit kindergarten profile details
/kindergarten/:id DELETE delete this kindergarten
/users GET get all users
/users/:userId GET get data for a specific user by id
/users/:userId PUT update user data
/comments/:commentId DELETE delete a specific comment by comment id

Issue Template

#[relates1] #[relates1]
[Unit name]

Acceptance Criteria

  • crit1
  • crit2
  • ..
  • ..

crit1

[Full Description ]

crit2

[Full Description]


Card Component

Acceptance Criteria

  • Props
  • Snapshot

Props

  • title
  • rating
  • revieweresNo
  • location
  • price
  • cover
  • kindergartenId

Components

  • < Rating />

Snapshot

Notification Component

Component

Acceptance Criteria

  • Props
  • Component
  • Snapshot

Props

  • userName
  • kindergartenName
  • id

Component

<UserImage/>


Snapshot

image

POST | /login

relates #5

Route: POST api/v1/login

Acceptance Criteria

  • DB query
  • Response
  • Testing

DB query

SELECT * FROM users WHERE email = email AND password = password

Validation

{
 email: yup.string().email().required(),
 password: yup.string().min(8).required(),
}

Response

  • Success
{statusCode:200, message:"login is succeed"}
  • Failed
{statusCode:400, message:"email or password is wrong"}

Testing

to be a successful test

  • status === 200
  • typeof(data) === "object"
  • data.length !== 0

General guide

Reviewing code

  • Every PR must be approved by all the team in order to be merged
  • Don't resolve a comment on your PR but only comment back (reply), and let the comment writer resolve it

Working on a task

  1. Branch naming: branch names shall follow this style issueNumber-issue-description (e.g. 102-login-page)

  2. Commiting changes:

    • any changes that are not related to the task (issue) or are not mentioned in it will not be accepted (if there is a bug that is making your task fail, open an issue for it and start working on fixing it)
    • commits must always be descriptive and with appropriate length (neither too long nor too short)
    • every and each commit must relate to the issue at the end
  3. Use of labels and projects

    • once started working on a task
      • label the issue in progress and move it to the in progress column in its project
      • label the PR awaiting review if you need it to be reviewed
      • label the PR in progress if you still working on it
      • PRs must be labeled with changes requested once a change is requested
    • once finished working on a task and got approved
      • label the PR done before merging it
      • label the issue done and move it to the done column in its project
      • close the issue
  4. closed issues and PRs

    • once a PR or an issue is closed it shall not be reopened
    • if there exists a bug related to a specific issue which was closed, another issue is to be opened and labeled bug
    • if there exists some critical bug that is causing the project to crash an issue with the labels bug, urgent, and priority is to be opened

GET | /kindergarten

relates #5

Route: GET api/v1/kindergarten

Acceptance Criteria

  • DB query
  • Response
  • Testing

DB query

SELECT * FROM kindergarten WHERE is_enable = ture AND request_status = 'Accepted';

Response

  • Success
{ StatusCode: 200,
  data: [{
          id,
          kindergarten_name,
          cover_image,
          description,
          phone_number,
          latitude,
          longitude,
          min_price,
          max_price,
          periods,
          images_gallery,
          create_at
        }]
}
  • Failed
{statusCode:400, message:"Bad Request"}

Testing

to be a successful test

  • status === 200
  • typeof(data) === "array"
  • data.length !== 0

/

/

Acceptance Criteria

  • State
  • Props
  • Components
  • Snapshot

State

const [isLoaded,setIsLoaded] = useState(true);
const [data,setData] = useState([]);
const [kindergartenName,setKindergartenName] = useState("");
const [location,setLocation] = useState("");
const [minPrice,setMinPrice] = useState(0);
const [maxPrice,setMaxPrice] = useState(0);

Props

xxxx


Component

  • < Navbar />
  • < Search />
  • < CardContainer />
  • < Footer />

Snapshot

PUT | /users/:userId

relates #5

Route: POST api/v1/signup

Acceptance Criteria

  • Validation
  • DB query
  • Response
  • Testing

Validation

{
 username: yup.string().alphanum().min(5).required(),
 email: yup.string().email().required(),
 password: yup.string().min(8).required(),
 confirmPassword: yup.string().oneOf([yup.ref('password'), null], 'Passwords must match')
}

DB query

UPDATE  users 
SET user_name = user_name,
        email = email,
        password = password
WHERE  user_id=id;

Response

  • Success
{ 
  StatusCode: 200,
  message :"Updated successfully"
}
  • Failed
{
statusCode:401, 
message:"update failed"
}

Testing

to be a successful test

  • status === 200
  • data.length !== 0

POST | /kindergarten

relates #5

Route: POST api/v1/kindergarten

Acceptance Criteria

  • DB query
  • Response
  • Testing
  • Validation

DB query

INSERT INTO kindergarten (kindergarten_name,cover_image,description,phone_number,latitude,longitude,min_price,max_price,periods,images_gallery)
    VALUES (kindergarten_name,cover_image,description,phone_number,latitude,longitude,min_price,max_price,periods,images_gallery)

Response

  • Success
{ 
    StatusCode: 200,
    message: 'Kindergarten has been added successfully',
}
  • Failed
{statusCode:400, message:"Bad Request"}

Testing

to be a successful test

  • status === 200
  • typeof(data) === 'object'
  • message === 'Kindergarten has been added successfully'

Validation

{
  kindergartenName: yup.string().required(),
  coverImage: yup.string().url().required(),
  description: yup.string().required(),
  phoneNumber: yup.number().required(),
  periods: yup.string(),
  latitude: yup.number(),
  longitude: yup.number(),
  minPrice: yup.number(),
  maxPrice: yup.number(),
  imagesGallery: yup.string(),
}

DELETE | /kindergarten/:id

Issues Template

relates #5

Route: DELETE api/v1/kindergarten/:id

Acceptance Criteria

  • DB query
  • Response
  • Testing

DB query

DELETE * FROM kindergarten WHERE kindergarten_id=id  CASCADE;

Response

  • Success
{ 
StatusCode: 200,
message:"Deleted successfully"
}
  • Failed
{
statusCode:400,
 message:"Bad Request"
}

Testing

to be a successful test

  • status === 200

PUT | /kindergarten/:id

relates #5

Route: PUT api/v1/kindergarten/:id

Acceptance Criteria

  • DB query
  • Response
  • Testing

DB query

UPDATE kindergarten SET phone_number = 0123456789 WHERE  id=id;

Response

  • Success
{ 
 StatusCode: 200,
 message : 'Update kidergarten profile data Successfully'
}
  • Failed
{statusCode:400, message:"Bad Request"}

Testing

to be a successful test

  • status === 200
  • message === 'Update kidergarten profile data Successfully'

GET | /search

Issues Template

relates #5

Route: GET api/v1/search?q=&location=&minPrice=&maxPrice=&rating=&maxResults

Acceptance Criteria

  • DB query
  • Response
  • Testing

DB query

SELECT 
kindergarten.kindergarten_name,kindergarten.cover_image,kindergarten.description, 
kindergarten.phone_number,kindergarten.min_price,kindergarten.max_price,
kindergarten.periods,kindergarten.images_gallery,location.location_name,
comments.comment ,comments.rating
FROM 
kindergarten ,location,comments
WHERE
kindergarten_name = q OR min_price = min_price OR max_price=max_price OR location 
IN
(SELECT location_name FROM location WHERE kindergarten.location_id =location.location_id ) OR rating
IN
(SELECT rating FROM comments WHERE kindergarten.kindergarten_id = comments.kindergarten_id);

Response

  • Success
{ StatusCode: 200,
  data: [{
          id,
          kindergarten_name,
          cover_image,
          description,
          phone_number,
          latitude,ND
          longitude,
          min_price,
          max_price,
          periods,
          images_gallery,
          create_at
        }]
}

ND

  • Failed
{statusCode:400, message:"Bad Request"}

Testing

to be a successful test

  • status === 200
  • typeof(data) === "array"
  • data.length !== 0

Frontend Routes

Frontend Routes

Route Description Status
/ Home page
/aboutUs About page
/search?q&location&minPrice&maxPrice Search Results page
/kindergarten/:id Kindergarten profile page
/login User login page
/signup User SignUp page

Admin Frontend Routes

Route Description Status
/admin/login Admin login page
/admin/dashboard Admin dashboard page (list of kindergartens)
/admin/dashboard/addKindergarten Admin add new kindergarten
/admin/dashboard/notifications Admin notifications list

Input Component

Input Component

Acceptance Criteria

  • Props
  • Snapshot

Props

  • labelText
  • placeholder
  • type [text,textarea,date,rangeSlider]
  • value

Snapshot

image
image
image
image

GET | /kindergarten/:id

relates #5

Route: GET api/v1/kindergarten/:id

Acceptance Criteria

  • DB query
  • Response
  • Testing

DB query

SELECT * FROM kindergarten WHERE kindergarten_id = id;

Response

  • Success
{ StatusCode: 200,
  data: {
          id,
          kindergarten_name,
          cover_image,
          description,
          phone_number,
          latitude,
          longitude,
          min_price,
          max_price,
          periods,
          images_gallery,
          create_at
        }
}
  • Failed
{statusCode:400, message:"Bad Request"}

Testing

to be a successful test

  • status === 200
  • typeof(data) === "object"
  • data.length !== 0

Navbar Component

Acceptance Criteria

  • Props
  • Component
  • Snapshots

Props

  • userName
  • userImage
  • userKindergardenId

Component

  • < MainBotton />
  • < NavTap />

Snapshots

image
image

/login

/login

Acceptance Criteria

  • State
  • Props
  • Components
  • Snapshot

State

const [userName,setUserName] = useState("");
const [password,setPassword] = useState("");

Props

xxxx


Component

  • < Login />

Snapshot

SideBar Component

Acceptance Criteria

  • Component
  • Snapshot

Component

  • <SideButton />

Snapshot

image

NavTap Component

Acceptance Criteria

  • Props
  • Snapshots

Props

  • Icon
  • text
  • isActive (default false)

Snapshots

image
image

CardContainer Component

Acceptance Criteria

  • Props
  • Component
  • Snapshots

Props

  • title
  • data

Component

  • < Card />

Snapshots

Travis CI

relates #3

.travis.yml

language: node_js

node_js:
  - lts/* 

services:
  - postgresql

before_script:
  - psql -c "create database db_test_name" -U postgres
  - psql -c "create user username with password '12';" -U postgres
env: 
  global:
  - PGPORT=5432
test:
  adapter: postgresql
  database: db_test_name

Project Setup

[Project Setup]

Acceptance Criteria

  • File Structure
  • Server Setup
  • Client (React) Setup
  • ESLINT config

File Strucutre #3

  • Client
  • Server
  • Testing
    #3

Server Setup

  • Install modules :
    • express
    • jsonwebtoken
    • yup
    • dotenv
    • cookie-parser
    • compression
    • pg
    • nodemon
    • supertest
    • jest
    • eslint
    • pre-commit

Setup the server and make it listen on port 5000

React Setup

Generate react app for the client using command

npx create-react-app 
  • Install modules :
    • prop-types
    • react-router-dom
    • axios
    • antd

Travis CI #6

add .yml to the structure

ESLINT config #10

  • ESLINT for the server

        eslint
        eslint-config-airbnb-base
        eslint-plugin-import
        eslint-config-prettier
        eslint-plugin-prettier
        eslint-plugin-flowtype
        eslint-plugin-jsx-a11y
        eslint-plugin-react
        eslint-plugin-react-hooks
        prettier
  • ESLINT for the react #10

        eslint
        eslint-config-airbnb
        eslint-plugin-prettier
        save-exact prettier
        eslint-config-prettier
        prettier

File Structure

File Structure

  • client/

    • public/
    • src/
      • assets/
        • icons
        • images
      • components/
        • utils/
          • admin/
          • user/
          • index.js
        • pages/
          • admin/
            • index.js
          • Home/
            • index.js
        • app/
          • index.js
          • app.module.css
    • .gitignore
    • .eslintrc.json
    • package-lock.json
    • package.json
  • server/

    • controllers/
      • routes/

        • index.js
      • middlewares/

        • auth/
          • index.js
        • errorHandle/
          • index.js
      • utils/

        • index.js
      • index.js

    • database/
      • config/

        • build.sql
        • fakeData.sql
        • build.js
        • connection.js
      • queries/

        • index.js
    • validation/
      • index.js
    • app.js
    • index.js
    • .env
  • test/

  • .travis.yml

  • .gitignore

  • .eslintrc.json

  • package-lock.json

  • package.json

GET | /logout

relates #5

Route: GET api/v1/logout

Acceptance Criteria

  • Response
  • Testing

Response

  • Success
{ 
    statusCode:200,
    message:'Sign out successfully',
}
  • Failed
{
    statusCode:500, 
    message:"Internal Server Error",
}

Testing

to be a successful test

  • status === 200

Database Schema

Schema Tables

Schema Info

  • Kindergarten

Column Type Modifiers
id SERIAL primary key
kindergarten_name VARCHAR(50) not null
user_id SERIAL REFERENCES user(id)
cover_image TEXT not null
description TEXT not null
location_id SERIAL REFERENCES location(id)
phone_number INTEGER not null
latitude INTEGER
longitude INTEGER
min_price INTEGER
max_price INTEGER
periods TEXT
images_gallery TEXT
request_status TEXT
is_enable BOOLEAN default: false
create_at TIMESTAMP default: now()
  • Location

Column Type Modifiers
id SERIAL primary key
location_name TEXT not null
  • User

Column Type Modifiers
id SERIAL primary key
user_name VARCHAR(50) not null
email VARCHAR(255) not null
password VARCHAR(50) not null
is_admin BOOLEAN default: false
create_at TIMESTAMP default: now()
  • Comment

Column Type Modifiers
id SERIAL primary key
kindergarten_id SERIAL REFERENCES Kindergarten(id)
user_name VARCHAR(50) not null
comment TEXT not null
rating INTEGER not null
create_at TIMESTAMP default: now()

Deploy on heroku

  • Heroku configurations
  • Bring heroku database link
  • Connect repo with heroku

/search?q&location&minPrice&maxPrice

Acceptance Criteria

  • State
  • Props
  • Components
  • Snapshot

State

const [query , setQuery] = useState('');
const [location , setLocation] = useState('');
const [minprice, setMinPrice] = useState(0);
const [maxprice , setMaxPrice] = useState(0);

Props

xxxx


Component

  • <search/>

Snapshot

image

DELETE | /comments/:commentId

relates #5

Route: DELETE api/v1/comments/:commentId

Acceptance Criteria

  • DB query
  • Response
  • Testing

DB query

DELETE FROM comment WHERE commentId = id;

Response

  • Success
{ StatusCode: 200,
message: 'Delete comment Successfully'
}
  • Failed
{statusCode:400, message:"Bad Request"}

Testing

to be a successful test

  • status === 200
  • message === 'Delete comment Successfully'

MainButton Component

MainButton Component

Acceptance Criteria

  • Props
  • Snapshot

Props

  • backgroundColor
  • borderColor
  • fontSize
  • fontColor

Snapshot

POST | /kindergarten/:id/comments

relates #5

Route: POST api/v1/kindergarten/:id/comments

Acceptance Criteria

  • DB query
  • Response
  • Testing
  • Validation

DB query

INSERT INTO comments (user_name ,comment, rating, create_at) VALUES ($1, $2, $3, $4) WHEREย kindergarten_id = id;

Response

  • Success
{ StatusCode: 200,
ย message: 'Add comment successfully'
}
  • Failed
{statusCode:400, message:"Bad Request"}

Testing

to be a successful test

  • status === 200
  • message === "Add comment successfully"

Validation

  • {comment: yup.mixed().required()}

Server Setup

app.js

  • Install middlewares

    • app.use(express.json());
    • app.use(cookieParser());
    • app.use(compression());
    • app.use(express.urlencoded({ extended: false }));
    • app.disable('x-powered-by');
  • Handling server and client errors

  • Setup the server on port 5000

    • app.set('port', process.env.PORT || 5000);

index.js

  • Import app.js in index.js and listen to our app
app.listen(port, () => {
  // eslint-disable-next-line no-console
  console.log(`server is running http://localhost:${port}`);
});

GET | /users/:userId

relates #5

Route: GET api/v1/users/:userId

Acceptance Criteria

  • DB query
  • Response
  • Testing

DB query

SELECT * FROM users WHERE id = userId;

Response

  • Success
{ 
    statusCode:200 ,
     data:  
     { 
        user_id,
        user_name,
        email,
        password,
        is_admin,
        create_at
     }
}
  • Failed
{
    statusCode:404, 
    message:'User not found',
}

Testing

to be a successful test

  • status === 200
  • typeof(data) === 'object'

Search Component

Search Component

Acceptance Criteria

  • Components
  • Snapshot

Components

  • <DorpList />
  • <MainInput type="rangeSlider"/>
  • <MainInput type="search"/>
  • <MainButton />

Snapshot

image

Comment Component

Acceptance Criteria

  • Props
  • Components
  • Snapshot

Props

  • name
  • rating
  • date
  • commentText
  • commentId
  • isAdmin

Components

  • < Rating />
  • < UserImage />
  • < MainButton />

Snapshot

image
image

GET | /admin/kindergarten

relates #5

Route: GET api/v1/admin/kindergarten

Acceptance Criteria

  • DB query
  • Response
  • Testing

DB query

SELECT * FROM kindergarten ;

Response

  • Success
{ StatusCode: 200,
  data: [{
          id,
          kindergarten_name,
          cover_image,
          description,
          phone_number,
          latitude,
          longitude,
          min_price,
          max_price,
          periods,
          images_gallery,
          create_at
        }]
}
  • Failed
{statusCode:400, message:"Bad Request"}

Testing

to be a successful test

  • status === 200
  • typeof(data) === "array"
  • data.length !== 0

Eslint Configurations & VS Code settings

ESLINT config

  • ESLINT for server file
  • You should install these modules as devDependencies

     eslint
     eslint-config-airbnb
     eslint-plugin-prettier
     save-exact prettier
     eslint-config-prettier
     prettier
    
  • Eslint for React app
  • And the same here

      eslint
      eslint-config-airbnb-base
      eslint-plugin-import
      eslint-config-prettier
      eslint-plugin-prettier
      eslint-plugin-flowtype
      eslint-plugin-jsx-a11y
      eslint-plugin-react
      eslint-plugin-react-hooks
      prettier
    

VS Code settings

  • Create settings.json file in .vscode folder then inside the file add

    {
      "eslint.workingDirectories": ["client", "server"],
      "[javascript]": {
        "editor.codeActionsOnSave": {
          "source.fixAll": true
        },
        "editor.formatOnSave": false
      },
      "[json]": {
        "editor.defaultFormatter": "vscode.json-language-features"
      },
      "editor.defaultFormatter": "esbenp.prettier-vscode",
      "editor.formatOnSave": true,
      "files.eol": "\n"
    }

Rating Component

Rating Component

Acceptance Criteria

  • Props
  • Snapshot

Props

  • Rating Value

Snapshot

image

POST | /signup

relates #5

Route: POST api/v1/signup

Acceptance Criteria

  • Validation
  • DB query
  • Response
  • Testing

Validation

{
 username: yup.string().alphanum().min(5).required(),
 email: yup.string().email().required(),
 password: yup.string().min(8).required(),
 confirmPassword: yup.string().oneOf([yup.ref('password'), null], 'Passwords must match')
}

DB query

INSERT INTO users(user_name,email,password) VALUES(user_name,email,password);

Response

  • Success
{ 
  StatusCode: 200,
  message :"Sign up successful"
}
  • Failed
{
statusCode:401, 
message:"You are already registered"
}

Testing

to be a successful test

  • status === 200
  • data.length !== 0

AdminNavBar Component

AdminNavBar Component

Acceptance Criteria

  • Props
  • Component
  • Snapshot

Props

  • userName
  • UserImage
  • notificationData

Component

<NotificactionContainer/>


Snapshot

image

NotificactionContainer Component

NotificactionContainer Component

Acceptance Criteria

  • Props
  • Component
  • Snapshot

Props

  • notificationData

Component

<Notification/>


Snapshot

image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.