diff --git a/src/s1-main/App.tsx b/src/s1-main/App.tsx
index a659908..99560a6 100644
--- a/src/s1-main/App.tsx
+++ b/src/s1-main/App.tsx
@@ -1,13 +1,14 @@
import React from 'react'
import s from './App.module.css'
import HW1 from '../s2-homeworks/hw01/HW1'
+import HW2 from '../s2-homeworks/hw02/HW2'
const App = () => {
return (
react homeworks:
- {/*
*/}
+
{/*
*/}
{/*
*/}
{/*
*/}
diff --git a/src/s2-homeworks/hw02/Affair.tsx b/src/s2-homeworks/hw02/Affair.tsx
new file mode 100644
index 0000000..af39726
--- /dev/null
+++ b/src/s2-homeworks/hw02/Affair.tsx
@@ -0,0 +1,44 @@
+import React from 'react'
+import {AffairType} from './HW2'
+import s from './Affairs.module.css'
+
+type AffairPropsType = {
+ // key не нужно типизировать
+ affair: any // AffairType // need to fix any
+ deleteAffairCallback: any // (id: number) => void // need to fix any
+}
+
+function Affair(props: AffairPropsType) {
+ const deleteCallback = () => {props.deleteAffairCallback(props.affair._id)} // need to fix // создаёт студент
+
+ const priorityClass = s.item + ' ' + s[props.affair.priority]
+
+ return (
+
+
+ {/*создаёт студент*/}
+ {props.affair.name}
+ {/**/}
+
+ [
+
+ {/*создаёт студент*/}
+ {props.affair.priority}
+ {/**/}
+
+ ]
+
+
+
+ )
+}
+
+export default Affair
diff --git a/src/s2-homeworks/hw02/Affairs.module.css b/src/s2-homeworks/hw02/Affairs.module.css
new file mode 100644
index 0000000..68eb82b
--- /dev/null
+++ b/src/s2-homeworks/hw02/Affairs.module.css
@@ -0,0 +1,45 @@
+.hw2 {
+
+}
+
+.button {
+ margin: 10px;
+ width: 60px;
+
+ background: #003300;
+ color: #99ff99;
+ outline: none;
+}
+.button:focus {
+ outline: #99ff99 solid 1px;
+}
+
+.button:active {
+ background: #99ff99;
+}
+
+.active {
+ background: #335533;
+}
+
+.affair {
+ display: flex;
+ align-items: center;
+}
+
+.item {
+ margin: 10px;
+ width: 100px;
+}
+
+.high {
+ color: red;
+}
+
+.middle {
+ color: orange;
+}
+
+.low {
+ color: lime;
+}
diff --git a/src/s2-homeworks/hw02/Affairs.tsx b/src/s2-homeworks/hw02/Affairs.tsx
new file mode 100644
index 0000000..0577f2e
--- /dev/null
+++ b/src/s2-homeworks/hw02/Affairs.tsx
@@ -0,0 +1,65 @@
+import React, { SetStateAction, Dispatch } from 'react'
+import Affair from './Affair'
+import {AffairType, FilterType} from './HW2'
+import s from './Affairs.module.css'
+
+type AffairsPropsType = { // need to fix any
+ data: any // AffairType[]
+ setFilter: any // (filter: FilterType) => void
+ // setFilter: Dispatch
>
+ deleteAffairCallback: any // (id: number) => void
+ filter: any // FilterType
+}
+
+function Affairs(props: AffairsPropsType) {
+ const mappedAffairs = props.data.map((a: AffairType) => (
+
+ ))
+
+ const setAll = () => {
+ props.setFilter('all') // создаёт студент
+ } // need to fix
+ const setHigh = () => {
+ props.setFilter('high') // создаёт студент
+ }
+ const setMiddle = () => {
+ props.setFilter('middle') // создаёт студент
+ }
+ const setLow = () => {
+ props.setFilter('low') // создаёт студент
+ }
+ // const set = (e: React.MouseEvent) => {
+ // props.setFilter(e.currentTarget.value as FilterType)
+ // }
+
+ const cnAll = s.button + ' ' + (props.filter === 'all' ? s.active : '')
+ const cnHigh = s.button + ' ' + (props.filter === 'high' ? s.active : '')
+ const cnMiddle = s.button + ' ' + (props.filter === 'middle' ? s.active : '')
+ const cnLow = s.button + ' ' + (props.filter === 'low' ? s.active : '')
+ // const setClass = (filter: FilterType) => {
+ // return s.button + (props.filter === filter ? ' ' + s.active : '')
+ // }
+
+ return (
+
+
+ {mappedAffairs}
+
+
+
+
+
+
+ {/**/}
+ {/**/}
+ {/**/}
+ {/**/}
+
+ )
+}
+
+export default Affairs
diff --git a/src/s2-homeworks/hw02/AlternativeAffairs.tsx b/src/s2-homeworks/hw02/AlternativeAffairs.tsx
new file mode 100644
index 0000000..74c41ec
--- /dev/null
+++ b/src/s2-homeworks/hw02/AlternativeAffairs.tsx
@@ -0,0 +1,11 @@
+import React from 'react'
+
+function AlternativeAffairs() {
+ return (
+
+
+
+ )
+}
+
+export default AlternativeAffairs
diff --git a/src/s2-homeworks/hw02/HW2.tsx b/src/s2-homeworks/hw02/HW2.tsx
new file mode 100644
index 0000000..32ca749
--- /dev/null
+++ b/src/s2-homeworks/hw02/HW2.tsx
@@ -0,0 +1,69 @@
+import React, {useState} from 'react'
+import Affairs from './Affairs'
+import s from './Affairs.module.css'
+import s2 from '../hw01/Message.module.css'
+
+// types
+export type AffairPriorityType = any // 'high' | 'low' | 'middle' // need to fix any
+export type AffairType = {
+ _id: any // number // need to fix any
+ name: any // string // need to fix any
+ priority: AffairPriorityType
+}
+export type FilterType = 'all' | AffairPriorityType
+
+// constants
+const defaultAffairs: any = [ // need to fix any // AffairType[]
+ {_id: 1, name: 'React', priority: 'high'}, // студенты могут изменить содержимое name и количество элементов в массиве, ...priority не менять!
+ {_id: 2, name: 'anime', priority: 'low'},
+ {_id: 3, name: 'games', priority: 'low'},
+ {_id: 4, name: 'work', priority: 'high'},
+ {_id: 5, name: 'html & css', priority: 'middle'},
+]
+
+// pure helper functions
+export const filterAffairs = (affairs: any, filter: any): any => { // need to fix any // (affairs: AffairType[], filter: FilterType): AffairType[]
+ if (filter === 'all') return affairs // создаёт студент
+ // else if (filter === 'low') return affairs.filter(a => a.priority === 'low')
+ // else if (filter === 'middle') return affairs.filter(a => a.priority === 'middle')
+ // else if (filter === 'high') return affairs.filter(a => a.priority === 'high')
+ // else {
+ // }
+ // return []
+ else return affairs.filter((a: any) => a.priority === filter) // need to fix // создаёт студент
+}
+export const deleteAffair = (affairs: any, _id: any): any => { // need to fix any // (affairs: AffairType[], _id: number): AffairType[]
+ return affairs.filter((a: any) => a._id !== _id) // need to fix // создаёт студент
+}
+
+function HW2() {
+ const [affairs, setAffairs] = useState(defaultAffairs) // need to fix any // AffairType[]
+ const [filter, setFilter] = useState('all') // need to fix any // FilterType
+
+ const filteredAffairs = filterAffairs(affairs, filter)
+ const deleteAffairCallback = (_id: any) => setAffairs(deleteAffair(affairs, _id)) // need to fix any // number
+
+ return (
+
+
+ {/*можно убрать этот тег*/}
+
+
homeworks 2
+
+ {/*не менять*/}
+
+
+
+ {/*можно убрать этот тег*/}
+
+ {/*можно убрать этот тег*/}
+
+ )
+}
+
+export default HW2
diff --git a/src/s2-homeworks/hw02/tests/deleteAffair.test.tsx b/src/s2-homeworks/hw02/tests/deleteAffair.test.tsx
new file mode 100644
index 0000000..87aa204
--- /dev/null
+++ b/src/s2-homeworks/hw02/tests/deleteAffair.test.tsx
@@ -0,0 +1,36 @@
+import React from 'react'
+import {AffairType, deleteAffair} from '../HW2'
+
+let initialState: AffairType[]
+
+beforeEach(() => {
+ initialState = [
+ {_id: 1, name: 'React', priority: 'high'},
+ {_id: 2, name: 'anime', priority: 'low'},
+ {_id: 3, name: 'games', priority: 'low'},
+ {_id: 4, name: 'work', priority: 'high'},
+ {_id: 5, name: 'html & css', priority: 'middle'},
+ {_id: 6, name: 'porn', priority: 'low'},
+ ]
+})
+
+test('delete 0', () => {
+ const newState = deleteAffair(initialState, 0)
+ expect(newState.length).toBe(6)
+})
+test('delete 1', () => {
+ const newState = deleteAffair(initialState, 1)
+ expect(newState.length).toBe(5)
+})
+test('delete 3', () => {
+ const newState = deleteAffair(initialState, 3)
+ expect(newState.length).toBe(5)
+})
+test('delete 6', () => {
+ const newState = deleteAffair(initialState, 6)
+ expect(newState.length).toBe(5)
+})
+test('delete 7', () => {
+ const newState = deleteAffair(initialState, 7)
+ expect(newState.length).toBe(6)
+})
diff --git a/src/s2-homeworks/hw02/tests/filterAffairs.test.tsx b/src/s2-homeworks/hw02/tests/filterAffairs.test.tsx
new file mode 100644
index 0000000..aac5c04
--- /dev/null
+++ b/src/s2-homeworks/hw02/tests/filterAffairs.test.tsx
@@ -0,0 +1,32 @@
+import React from 'react'
+import {AffairType, filterAffairs} from '../HW2'
+
+let initialState: AffairType[]
+
+beforeEach(() => {
+ initialState = [
+ {_id: 1, name: 'React', priority: 'high'},
+ {_id: 2, name: 'anime', priority: 'low'},
+ {_id: 3, name: 'games', priority: 'low'},
+ {_id: 4, name: 'work', priority: 'high'},
+ {_id: 5, name: 'html & css', priority: 'middle'},
+ {_id: 6, name: 'porn', priority: 'low'},
+ ]
+})
+
+test('filter by all', () => {
+ const newState = filterAffairs(initialState, 'all')
+ expect(newState.length).toBe(6)
+})
+test('filter by high', () => {
+ const newState = filterAffairs(initialState, 'high')
+ expect(newState.length).toBe(2)
+})
+test('filter by middle', () => {
+ const newState = filterAffairs(initialState, 'middle')
+ expect(newState.length).toBe(1)
+})
+test('filter by low', () => {
+ const newState = filterAffairs(initialState, 'low')
+ expect(newState.length).toBe(3)
+})