diff --git a/package.json b/package.json index 2b097dc1..1cc7b2bd 100755 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "@cypress/webpack-dev-server": "^1.8.4", "@mate-academy/cypress-tools": "^1.0.4", "@mate-academy/eslint-config-react-typescript": "^1.0.11", - "@mate-academy/scripts": "^1.2.3", + "@mate-academy/scripts": "^1.2.8", "@mate-academy/students-ts-config": "*", "@mate-academy/stylelint-config": "*", "@types/node": "^17.0.45", diff --git a/src/App.tsx b/src/App.tsx index f6361547..4b81edd8 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,39 +1,318 @@ -import React from 'react'; +import { ChangeEvent, useState } from 'react'; +import classNames from 'classnames'; import '@fortawesome/fontawesome-free/css/all.css'; import 'bulma/css/bulma.css'; -import './App.scss'; import peopleFromServer from './people.json'; +import { Person } from './types/Person'; +import { Button } from './components/Button'; -export class App extends React.Component { - state = {}; - - render() { - return ( -
| name | -sex | -born | -
|---|---|---|
| {person.name} | -{person.sex} | -{person.born} | -
No people yet
; + } + + function isSelected({ slug }: Person) { + return selectedPeople.some(person => person.slug === slug); + } + + const sortBy = (field: keyof Person) => { + const isFirstClick = sortField !== field; + const isSecondClick = sortField === field && !isReversed; + + setSortField(isFirstClick || isSecondClick ? field : ''); + setReversed(isSecondClick); + }; + + const selectPerson = (personToAdd: Person) => { + setSelectedPeople(current => [...current, personToAdd]); + }; + + const unselectPerson = (personToDelete: Person) => { + setSelectedPeople(current => current.filter( + person => person.slug !== personToDelete.slug, + )); + }; + + const clearSelection = () => { + setSelectedPeople([]); + }; + + const moveUp = (personToMove: Person) => { + setPeople(currentPeople => { + const position = currentPeople.findIndex( + person => person.slug === personToMove.slug, + ); + + if (position === 0) { + return currentPeople; + } + + return [ + ...currentPeople.slice(0, position - 1), + currentPeople[position], + currentPeople[position - 1], + ...currentPeople.slice(position + 1), + ]; + }); + }; + + const moveDown = (personToMove: Person) => { + setPeople(curentPeople => { + const position = curentPeople.findIndex( + person => person.slug === personToMove.slug, + ); + + if (position === curentPeople.length - 1) { + return curentPeople; + } + + const updatedPeople = [...curentPeople]; + + updatedPeople[position] = curentPeople[position + 1]; + updatedPeople[position + 1] = curentPeople[position]; + + return updatedPeople; + }); + }; + + const handleInput = (event: ChangeEvent| + | + name + sortBy('name')}> + + + + + | + ++ sex + sortBy('sex')}> + + + + + | + ++ born + sortBy('born')}> + + + + + | + ++ mother + sortBy('motherName')}> + + + + + | + ++ father + sortBy('fatherName')}> + + + + + | + ++ |
|---|---|---|---|---|---|---|
| + {isSelected(person) ? ( + + ) : ( + + )} + | + ++ {person.name} + | + +{person.sex} | +{person.born} | +{person.motherName || ''} | +{person.fatherName || ''} | + ++ + + + | +