62 | );
63 | }
64 |
65 | export default App;
66 |
--------------------------------------------------------------------------------
/classes/lecture-09/resources/react-hooks/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | }
9 |
10 | code {
11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12 | monospace;
13 | }
14 |
--------------------------------------------------------------------------------
/classes/lecture-09/resources/react-hooks/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom/client';
3 | import './index.css';
4 | import App from './App';
5 |
6 |
7 | const root = ReactDOM.createRoot(document.getElementById('root'));
8 | root.render(
9 |
10 |
11 |
12 | );
13 |
14 |
--------------------------------------------------------------------------------
/classes/lecture-10/notes-10.md:
--------------------------------------------------------------------------------
1 | ## Лекция 10: CSRF, CORS, JWT, custom-hook
2 |
3 |
4 | #### Что затронули:
5 |
6 | - CSRF проблема и как избежать: allows
7 | - CORS разрешения и политики
8 | - JWT - токены и безопасность
9 | - useLocalStorage custom hook
10 |
--------------------------------------------------------------------------------
/classes/lecture-10/presentation-10.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JUSSIAR/MIPT-1C-React-Course/2b314a59695cd3b94992cc04ab19dcc3970ab1ba/classes/lecture-10/presentation-10.pdf
--------------------------------------------------------------------------------
/classes/lecture-10/resources/react-custom-hook/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/classes/lecture-10/resources/react-custom-hook/README.md:
--------------------------------------------------------------------------------
1 | # React-redux-practice
--------------------------------------------------------------------------------
/classes/lecture-10/resources/react-custom-hook/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-custom-hook",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@testing-library/jest-dom": "^5.16.5",
7 | "@testing-library/react": "^13.4.0",
8 | "@testing-library/user-event": "^13.5.0",
9 | "react": "^18.2.0",
10 | "react-dom": "^18.2.0",
11 | "react-scripts": "5.0.1",
12 | "web-vitals": "^2.1.4"
13 | },
14 | "scripts": {
15 | "start": "react-scripts start",
16 | "build": "react-scripts build",
17 | "test": "react-scripts test",
18 | "eject": "react-scripts eject"
19 | },
20 | "eslintConfig": {
21 | "extends": [
22 | "react-app",
23 | "react-app/jest"
24 | ]
25 | },
26 | "browserslist": {
27 | "production": [
28 | ">0.2%",
29 | "not dead",
30 | "not op_mini all"
31 | ],
32 | "development": [
33 | "last 1 chrome version",
34 | "last 1 firefox version",
35 | "last 1 safari version"
36 | ]
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/classes/lecture-10/resources/react-custom-hook/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | React App
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/classes/lecture-10/resources/react-custom-hook/src/app/app.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { useLocalStorage } from '../hooks/use-local-storage'
3 |
4 | const init = () => {
5 | console.log('init')
6 | return 'initial value'
7 | }
8 |
9 | function App() {
10 | const [state, setState] = useLocalStorage('state2', init)
11 |
12 | return setState(event.target.value)} value={state}/>
13 | }
14 |
15 | export default App
16 |
--------------------------------------------------------------------------------
/classes/lecture-10/resources/react-custom-hook/src/hooks/use-local-storage.js:
--------------------------------------------------------------------------------
1 | import { useState, useEffect } from "react";
2 |
3 | function getLocalStorageValue(key, initial) {
4 | console.log('storage instance')
5 |
6 | const value = window.localStorage.getItem(key)
7 | if (value) {
8 | return value
9 | }
10 |
11 | return initial instanceof Function
12 | ? initial()
13 | : initial
14 | }
15 |
16 | function setLocalStorageValue(key, value) {
17 | window.localStorage.setItem(key, value)
18 | }
19 |
20 | export function useLocalStorage(key, initial) {
21 | const [value, setValue] = useState(
22 | () => getLocalStorageValue(key, initial)
23 | )
24 |
25 | useEffect(() => {
26 | setLocalStorageValue(key, value)
27 | }, [value])
28 |
29 | return [value, setValue]
30 | }
31 |
32 |
33 | /**
34 | * Extractor
35 | * @param string
36 | * @returns {string|undefined}
37 | * @see returns 'A' when 'a' is the first symbol
38 | */
39 | function extractFirstAndLastSymbols(string) {
40 | if (!string) {
41 | return undefined
42 | }
43 |
44 | if (!(string instanceof String)) {
45 | return undefined
46 | }
47 |
48 | if (string.length === 1) {
49 | return string[0]
50 | }
51 |
52 | if (string.length[0] === 'a') {
53 | return 'A' + string[string.length - 1]
54 | }
55 |
56 | return string[0] + string[string.length - 1]
57 | }
58 |
59 |
--------------------------------------------------------------------------------
/classes/lecture-10/resources/react-custom-hook/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | }
9 |
10 | code {
11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12 | monospace;
13 | }
14 |
--------------------------------------------------------------------------------
/classes/lecture-10/resources/react-custom-hook/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import ReactDOM from 'react-dom/client'
3 | import './index.css'
4 | import App from './app/app'
5 |
6 | const root = ReactDOM.createRoot(document.getElementById('root'))
7 | root.render(
8 |
9 |
10 |
11 | )
12 |
--------------------------------------------------------------------------------
/classes/lecture-11/notes-11.md:
--------------------------------------------------------------------------------
1 | ## Лекция 11:
2 |
3 |
4 | #### Что затронули:
5 |
6 | - test
7 | - lint
8 | - build
9 | - typing
10 | - validation
11 | - pipeline
12 |
13 |
14 | ### Рекомендации чекнуть:
15 |
16 | - webpack
17 | - parcel (про него пытался вспомнить на занятии, но не справился))))
18 | - jest
19 | - webdrivers
20 | - pipeline ci/cd для js экосистемы
21 |
--------------------------------------------------------------------------------
/classes/lecture-11/presentation-11.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JUSSIAR/MIPT-1C-React-Course/2b314a59695cd3b94992cc04ab19dcc3970ab1ba/classes/lecture-11/presentation-11.pdf
--------------------------------------------------------------------------------
/classes/lecture-11/resources/stub.md:
--------------------------------------------------------------------------------
1 | ### Здесь обязательно появится что-то полезное, но пока только это и оно бесполезное(((
--------------------------------------------------------------------------------
/homeworks/homework-01/homework-01.md:
--------------------------------------------------------------------------------
1 | ## Домашнее задание 1
2 |
3 | Задача состоит в том, чтобы создать файлы html и css, в которых сверстать такой макет.
4 |
5 | #### Дедлайны
6 |
7 | - Дедлайн без понижающего коэффициента: **20.10.2024**
8 | - Дедлайн с понижающим коэффициентом 0.5: **27.10.2024**
9 | - Далее понижающий коэффицент равен 0.2 и не сгорает
10 |
11 | #### Особенности формата сдачи ДЗ 1
12 |
13 | Первое дз сдается в телеграмме в формате файлов с кодом / архивом с файлами.
14 |
15 | #### Дополнительный балл за ДЗ 1
16 |
17 | За данное ДЗ есть возможность получить доп балл(то есть за ДЗ можно получить 11, а не 10).
18 | Для этого необходимо реализовать верстку таким образом,
19 | чтобы шапка сайта и меню при прокрутке страницы всегда оставались на экране и не сдвигались.
20 |
21 |
22 | 
23 |
--------------------------------------------------------------------------------
/homeworks/homework-01/layout.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JUSSIAR/MIPT-1C-React-Course/2b314a59695cd3b94992cc04ab19dcc3970ab1ba/homeworks/homework-01/layout.png
--------------------------------------------------------------------------------
/homeworks/homework-02/homework-02.md:
--------------------------------------------------------------------------------
1 | ## Домашнее задание 2
2 |
3 | #### Описание ДЗ
4 |
5 | Что необходимо сделать:
6 |
7 | 1) Необходимо создать репозиторий на [github](https://github.com),
8 | корень которого желательно сделать корнем проекта
9 |
10 | 2) Установить себе [nodejs](https://nodejs.org/en/)
11 |
12 | 3) Инициализировать в репозитории проект `react` с помощью утилиты `npx`.
13 | Команда для инициализации: `npx create-react-app YOUR_PROJECT_NAME`.
14 |
15 | 4) Залить эту штуку в репозиторий на github (здесь можно прям в мастер).
16 |
17 | 5) Убедиться, что получается запускать проект на localhost при помощи менеджера `npm`.
18 | Команда для запуска по дефолту из корня проекта: `npm run start`.
19 |
20 | 6) Сделать [меня](https://github.com/JUSSIAR) контрибьютером вашего проекта.
21 |
22 |
23 | #### Дедлайны
24 |
25 | - Дедлайн без понижающего коэффициента: **20.10.2024**
26 | - Дедлайн с понижающим коэффициентом 0.5: **27.11.2024**
27 | - Далее понижающий коэффицент равен 0.2 и не сгорает
28 |
29 |
--------------------------------------------------------------------------------
/homeworks/homework-03/homework-03.md:
--------------------------------------------------------------------------------
1 | ## Домашнее задание 3
2 |
3 | #### Описание ДЗ
4 |
5 | Что необходимо сделать:
6 |
7 | 1) Необходимо создать ветку из актуального состояния мастера(main) и переключиться при выполнении дз на нее.
8 | Назвать ветку можно как угодно, но рекомендую оформлять все как пет-проект и названия выбирать,
9 | соответственно, по-человечески.
10 |
11 | 2) Создать в корне `src/` директории `assets/` и `components/`.
12 | Идею внутренней структуризации этих директорий пока оставляю за вами, но приветствую качественный подход!
13 |
14 | 3) В `assets/` необходимо положить файл, содержащий данные из приложенного [файла](mock-data.json),
15 | либо данные на ваше усмотрение, похожие по структуре на предложенные
16 | (по аналогии в требованиях далее тоже надо будет редактировать нейминги, если данные будете выбирать по-своему)
17 |
18 | 4) Данный файл импортировать в файле `App.js(x)` и внутри него реализовать mapping массива из этих данных.
19 |
20 | 5) Далее задача состоит в том, чтобы реализовать функциональный компонент, выполняющий следующее:
21 |
22 | - компонент должен принимать в себя в качестве `props` элемент из массива данных (при mapping-е)
23 | - компонент должен рендерить получаемые данные в карточку, содержащую заголовок, текст и количество лайков
24 | - также компонент должен содержать кнопку изменения состояния вашего лайка на этой карточке
25 | - при нажатии на кнопку число лайков должно увеличиваться на 1,
26 | а также должен появляться некоторый признак *"лайкнутости"*
27 | - стилизацию можно выбрать как фломастеры - на свой вкус))
28 |
29 | 6) Соответственно маппинг данных происходит при помощи описанного компонента.
30 |
31 | 7) Все это можно декомпозировать на коммиты в ветку так, как вам будет удобнее.
32 |
33 | 8) Как только вы считаете, что работа закончена - необходимо:
34 |
35 | - запушить ветку в ремоут
36 | - создать pull request на слияние данной ветки в мастер
37 | - внутри реквеста добавить меня в `assignees`
38 | - добавить меня еще в `reviewers`
39 |
40 | 9) Написать сообщение в потоке событий реквеста, что задание готово.
41 |
42 | 10) Итого для меня назначение `assign` и `review` + сообщение о готовности являются маркерами законченного дз,
43 | готового к проверке и время этих событий является временем сдачи дз.
44 |
45 |
46 | #### ВАЖНО!
47 |
48 | - В описании ПР указывайте номер ДЗ, к которому относится ПР
49 | - Одна домашка === один ПР
50 |
51 |
52 | #### Проверка и внесение поправок
53 |
54 | - Проверка будет заключаться в добавлении комментариев к коду в вашем реквесте и выставлении оценки в комментарии
55 | - Как только все правки будут внесены, либо принято иное решение, я буду калибровать оценку и сливать ПР в мастер
56 | - Вы самостоятельно не сливаете ПР-ы с домашкой!
57 | - На внесение правок будет неделя с момента получение фидбэка по ПР
58 |
59 |
60 | #### Пометки к ДЗ 3
61 |
62 | - для хранения состояний в компоненте рекомендую использовать `useState` hook
63 |
64 |
65 | #### Доп балл
66 |
67 | - Для получения доп балла за задание необходимо реализовать возможность отмены лайка
68 |
69 |
70 | #### Дедлайны
71 |
72 | - Дедлайн без понижающего коэффициента: **27.10.2024**
73 | - Дедлайн с понижающим коэффициентом 0.5: **03.11.2024**
74 | - Далее понижающий коэффицент равен 0.2 и не сгорает
75 |
76 |
--------------------------------------------------------------------------------
/homeworks/homework-03/mock-data.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "Tesla",
4 | "text": "Best company",
5 | "currentLikes": 7
6 | },
7 | {
8 | "title": "VK",
9 | "text": "Messenger for children",
10 | "currentLikes": 2
11 | },
12 | {
13 | "title": "Me",
14 | "text": "Best student",
15 | "currentLikes": 999
16 | },
17 | {
18 | "title": "Item",
19 | "text": "Some other item",
20 | "currentLikes": 0
21 | },
22 | {
23 | "title": "Real article",
24 | "text": "Real text for real article",
25 | "currentLikes": 11
26 | }
27 | ]
--------------------------------------------------------------------------------
/homeworks/homework-04/homework-04.md:
--------------------------------------------------------------------------------
1 | ## Домашнее задание 4
2 |
3 |
4 | ### Что нужно сделать и как получить доп баллы
5 |
6 | + **На оценку 7:**
7 | - Надо сделать, чтобы теперь в карточке появилась информация о количестве комментариев к ней
8 | - Далее надо добавить кнопку "открыть комментарии", по которой внутри карточки будет появляться раздел
9 | с комментариями, куда будут рисоваться комменты к этой карточке
10 | - При раскрытии раздела комментариев нужно отобразить их списком и вместо кнопки открыть комментарии нужно сделать
11 | кнопку, скрывающую их и по нажатию на нее комменты должны закрываться и возвращаться кнопка для открытия
12 |
13 | + **Для получения дополнительных баллов к оценке 7 из предыдущего пункта:**
14 | - +0.5 балла за реализацию подгрузки карточек асинхронно в жизненном цикле
15 | - +0.5 балла за реализацию подгрузки комментариев к карточке асинхронно в жизненном цикле
16 | - +1 балл за реализацию возможности добавить комментарий
17 | (то есть форму создания коммента под списком комментов в карточке и кнопку, публикующую его.
18 | Все данные храним в стейте и работаем пока только со стейтом)
19 | - +1 балл за реализацию возможности удаления комментария
20 | (любого комментария - как будто вы админ и можете удалить что угодно)
21 | - +1 балла за реализацию возможности добавить карточку
22 |
23 |
24 | ### Пояснение и помощь
25 |
26 | - новые шаблоны данных лежат в файлах в директории [data](./resources/data)
27 | - примеры хелперов для создания фейковой апишки для подгрузки данных лежат в директории [helpers](./resources/helpers)
28 | - пример того, как реализовать подгрузку через хук в функциональном компоненте по аналогии с `componentDidMount`
29 | в файле [use-effect-usage.jsx](./resources/effects/use-effect-usage.jsx)
30 |
31 |
32 | ### Как сдавать домашку
33 |
34 | 1) Как только вы считаете, что работа закончена - необходимо:
35 |
36 | - запушить ветку в ремоут
37 | - отребейзить ветку на хед мастера, чтобы при мерже коммиты шли подряд
38 | (хотя я при слиянии ваших ПР юзаю сквош, но тем не менее правильная практика - делать ребейз)
39 | - создать pull request на слияние данной ветки в мастер
40 | - внутри реквеста добавить меня в `assignees`
41 | - добавить меня еще в `reviewers`
42 |
43 | 2) Написать сообщение в потоке событий реквеста, что задание готово.
44 |
45 | 3) Итого для меня назначение `assign` и `review` + сообщение о готовности являются маркерами законченного дз,
46 | готового к проверке и время этих событий является временем сдачи дз.
47 |
48 |
49 | ### Дедлайны
50 |
51 | - Дедлайн без понижающего коэффициента: **04.11.2024**
52 | - Дедлайн с понижающим коэффициентом 0.5: **10.11.2024**
53 | - Далее понижающий коэффицент равен 0.2 и не сгорает
54 |
--------------------------------------------------------------------------------
/homeworks/homework-04/resources/data/articles.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "articleId": 11,
4 | "title": "Tesla",
5 | "text": "Best company",
6 | "currentLikes": 7,
7 | "commentsCount": 1
8 | },
9 | {
10 | "articleId": 5,
11 | "title": "VK",
12 | "text": "Messenger for children",
13 | "currentLikes": 2,
14 | "commentsCount": 2
15 | },
16 | {
17 | "articleId": 72,
18 | "title": "Me",
19 | "text": "Best student",
20 | "currentLikes": 999,
21 | "commentsCount": 0
22 | },
23 | {
24 | "articleId": 33,
25 | "title": "Item",
26 | "text": "Some other item",
27 | "currentLikes": 0,
28 | "commentsCount": 2
29 | },
30 | {
31 | "articleId": 16,
32 | "title": "Real article",
33 | "text": "Real text for real article",
34 | "currentLikes": 11,
35 | "commentsCount": 1
36 | }
37 | ]
--------------------------------------------------------------------------------
/homeworks/homework-04/resources/data/comments.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "author": "Sofa",
4 | "articleId": 33,
5 | "text": "Comment comment comment"
6 | },
7 | {
8 | "author": "Ivan",
9 | "articleId": 5,
10 | "text": "Random text from Ivan"
11 | },
12 | {
13 | "author": "Oleg",
14 | "articleId": 5,
15 | "text": "Long text long text long text long text long text long text"
16 | },
17 | {
18 | "author": "Roman",
19 | "articleId": 33,
20 | "text": "Short text"
21 | },
22 | {
23 | "author": "Bob",
24 | "articleId": 16,
25 | "text": "Short text from Bob"
26 | },
27 | {
28 | "author": "Roman",
29 | "articleId": 11,
30 | "text": "Short text from Frank + random random random"
31 | }
32 | ]
--------------------------------------------------------------------------------
/homeworks/homework-04/resources/effects/use-effect-usage.jsx:
--------------------------------------------------------------------------------
1 | // Здесь приведен пример использования useEffect
2 | // для реализации запроса после маунтинга по аналогии с componentDidMount
3 |
4 | import React, {useState, useEffect} from 'react'
5 |
6 | import getData from '{путь в вашем проекте}'
7 |
8 | export function MyComponent() {
9 | const [data, setData] = useState(null)
10 |
11 | useEffect(() => {
12 | getData().then(fetchedData => setData(fetchedData))
13 | }, [])
14 |
15 | return data
16 | ?
{data}
17 | :
NO DATA
18 | }
19 |
--------------------------------------------------------------------------------
/homeworks/homework-04/resources/helpers/get-articles.js:
--------------------------------------------------------------------------------
1 | import articles from '../data/articles.json'
2 |
3 | const ARTICLES_LOAD_DURATION = 1500;
4 |
5 | export async function getArticles() {
6 | return new Promise(resolve => {
7 | setTimeout(() => resolve(articles), ARTICLES_LOAD_DURATION)
8 | })
9 | }
10 |
--------------------------------------------------------------------------------
/homeworks/homework-04/resources/helpers/get-comments-by-article.js:
--------------------------------------------------------------------------------
1 | import comments from '../data/comments.json'
2 |
3 | const COMMENTS_LOAD_DURATION = 1000;
4 |
5 | function selectByArticleId(totalData, id) {
6 | return totalData.filter(({articleId}) => articleId === id)
7 | }
8 |
9 | export async function getComments(articleId) {
10 | return new Promise(resolve => {
11 | const targetComments = selectByArticleId(comments, articleId)
12 | setTimeout(() => resolve(targetComments), COMMENTS_LOAD_DURATION)
13 | })
14 | }
15 |
--------------------------------------------------------------------------------
/homeworks/homework-05/homework-05.md:
--------------------------------------------------------------------------------
1 | ## Домашнее задание 5
2 |
3 |
4 | ### Что нужно сделать и как получить доп баллы
5 |
6 | + **На оценку 9:**
7 | - установить пакеты `node-sass` и `classnames` в проект
8 | - мигрировать всю стилизацию из файлов `.css` в файлы `.scss`
9 | - внедрить использование модульных стилей
10 | - использовать nesting везде, где получится
11 | - прикрутить conditional styles с байндом на контекст объекта, импортированного из модульного файла стилей в каждом случае, где используется условие в стилизации
12 | - вынести все повторяющиеся значения для свойств в переменные
13 | - создать миксины для настройки шрифта и настройки шаблонных стилей карточки статьи(наши карточки)
14 |
15 | + **Для получения доп балла к предыдущим и получения оценки 10:**
16 | - прикрутить media-запросы(мы их не разбирали)
17 |
18 |
19 | ### Флоу сдачи дз
20 |
21 | [Flow](../../additional/docs/homework-flow.md)
22 |
23 |
24 | ### Дедлайны
25 |
26 | - Дедлайн без понижающего коэффициента: **10.11.2024**
27 | - Дедлайн с понижающим коэффициентом 0.5: **17.11.2024**
28 | - Далее понижающий коэффицент равен 0.2 и не сгорает
29 |
--------------------------------------------------------------------------------
/homeworks/homework-06/homework-06.md:
--------------------------------------------------------------------------------
1 | ## Домашнее задание 6
2 |
3 | ### О домашке
4 |
5 | Эта домашка несложная и подразумевает исключительно немного поработать с тем,
6 | что уже есть в проекте и накрутить доп функционал.
7 | Это должно помочь еще раз пройти по всей имеющейся кодовой базе,
8 | возможно подумать о том, как лучше спроектировать структуру исходников,
9 | а также заготовить дополнительную часть пользовательских действий, с которыми будет
10 | интереснее работать далее!
11 |
12 |
13 | ### Что нужно сделать и какие за это баллы
14 |
15 | Изначально баллов 0.
16 |
17 | - Подзадача 1(на 4 балла):
18 | - +1 балл: Необходимо добавить в комментарии дату создания этого комментария
19 | - +1 балла: Необходимо добавить возможность лайка комментария и соответственно сами лайки к комментариям
20 | - +2 балла: Необходимо реализовать сортировку комментариев по дате создания и по числу лайков
21 | (по нажатиям на соответствующие кнопки для вызова нужных упорядочиваний)
22 |
23 | - Подзадача 2(на 3 балла):
24 | - +1 балл: необходимо добавить в карточке дату создания этой карточки
25 | - +2 балла: Необходимо реализовать сортировку карточек по дате создания и по числу лайков
26 | (по нажатиям на соответствующие кнопки для вызова нужных упорядочиваний)
27 |
28 | - Подзадача 3(на 3 балла):
29 | - +1 балл: Добавить возможность изменения текста комментария
30 | - +1 балл: Добавить возможность изменение текста карточки
31 | - +1 балл: Добавить возможность изменения заголовка карточки
32 |
33 |
34 | ### Пояснение
35 |
36 | Пока что это покажется ужасным нагромождением бесполезных в данной реализации действий.
37 | Но в следующих двух занятиях это найдет отличное применение)))
38 |
39 |
40 | ### Флоу сдачи дз
41 |
42 | [Flow](../../additional/docs/homework-flow.md)
43 |
44 |
45 | ### Дедлайны
46 |
47 | - Дедлайн без понижающего коэффициента: **17.11.2024**
48 | - Дедлайн с понижающим коэффициентом 0.5: **24.11.2024**
49 | - Далее понижающий коэффицент равен 0.2 и не сгорает
50 |
--------------------------------------------------------------------------------
/homeworks/homework-07/homework-07.md:
--------------------------------------------------------------------------------
1 | ## Домашнее задание 7
2 |
3 |
4 | ### Что нужно сделать и какие за это баллы
5 |
6 | - На 10 баллов:
7 | + Нужно прикрутить redux к проекту и перетащить в его стор все необходимые данные
8 | + Использовать для запроса данных нужно синхронные функции, потому что по дефолту редакс не умеет в асинхрон
9 | - На дополнительный балл:
10 | + Нужно разобраться как это сделать и прикрутить к проекту middleware redux-thunk
11 | + Тогда уже можно и нужно заиспользовать асинхронную подгрузку
12 |
13 |
14 | ### Флоу сдачи дз
15 |
16 | [Flow](../../additional/docs/homework-flow.md)
17 |
18 |
19 | ### Дедлайны
20 |
21 | - Дедлайн без понижающего коэффициента: **24.11.2024**
22 | - Дедлайн с понижающим коэффициентом 0.5: **01.12.2024**
23 | - Далее понижающий коэффицент равен 0.2 и не сгорает
24 |
--------------------------------------------------------------------------------
/homeworks/homework-08/homework-08.md:
--------------------------------------------------------------------------------
1 | ## Домашнее задание 8
2 |
3 | ### Линковка
4 |
5 | Эта домашка имеет в точности такие же дедлайны как и домашка 7.
6 | Делать их можно в рамках одного ПР и одной ветки. Если хотите - делайте раздельно.
7 |
8 | [Домашка 7](../homework-07/homework-07.md)
9 |
10 |
11 | ### Что нужно сделать и какие за это баллы
12 |
13 | - На 10 баллов:
14 | + Нужно прикрутить `react-router-dom` версии 6(или выше, а лучше latest)
15 | + Сделать маршруты на `/`, `/articles`, `/articles/:articleId`
16 | + Вынести отрисовку карточки полностью в страницу с конкретной карточкой по айдишнику
17 | + Список карточек оставить по урлу на все артиклы
18 | и сделать их без возможности раскрытия комментов
19 | и с сокращенным текстом карточки ессли он длинный(например больше 100 символов)
20 | + по пустому урлу нужна домашняя страница, на которой можно просто поставить заголовок, что это домашняя страница
21 | - На дополнительный балл:
22 | + реализовать 404 страницу и редирект на нее в случае попаданию не туда
23 |
24 |
25 | ### Хинт
26 |
27 | В ресурсах к лекции 08 пример, где сразу использован и редакс и роутер,
28 | так что глядя туда сделать домашку очень несложно.
29 |
30 |
31 | ### Флоу сдачи дз
32 |
33 | [Flow](../../additional/docs/homework-flow.md)
34 |
35 |
36 | ### Дедлайны
37 |
38 | - Дедлайн без понижающего коэффициента: **24.11.2024**
39 | - Дедлайн с понижающим коэффициентом 0.5: **01.12.2024**
40 | - Далее понижающий коэффицент равен 0.2 и не сгорает
41 |
--------------------------------------------------------------------------------
/homeworks/homework-09/homework-09.md:
--------------------------------------------------------------------------------
1 | ## Домашнее задание 9
2 |
3 |
4 | ### Что нужно сделать
5 |
6 | - прикрутить использование `useReducer` для работы со стейтом полей ввода
7 | - завернуть в `useCallback` родительские хэндлеры для проброса вниз если такие имеются
8 | - навесить через `useEffect` логирование информации о том,
9 | что пользователь посетил страницу такой то карточки(статьи/артикла)
10 | - если у кого еще остались классовые компоненты с методами жизненного цикла,
11 | то перетащить их на фунциональные с хуками
12 | - с какой нибудь вероятностью, например 0.05, делать `reject` внутри промисов
13 | с моканными запросами и отлавливать через `.catch` его внутри эффекта,
14 | либо написать свою функцию-прослойку для запроса, ловящую проблемы и логирующую
15 | (просто в консоль) время ошибки и на каком входе для запроса все посыпалось
16 |
17 |
18 | ### Рекомендации и хинты
19 |
20 | - для вероятности достаточно чуть-чуть заиспользовать `Math.random()` и написать `if`
21 | - для даты, внезапно, есть класс `Date`
22 | - для того, чтобы делать логи поинтереснее, напомню - у `console` есть и другие методы кроме `log`
23 |
24 |
25 | ### Флоу сдачи дз
26 |
27 | [Flow](../../additional/docs/homework-flow.md)
28 |
29 |
30 | ### Дедлайны
31 |
32 | - Дедлайн без понижающего коэффициента: **01.12.2024**
33 | - Дедлайн с понижающим коэффициентом 0.5: **07.12.2024**
34 | - Далее понижающий коэффицент равен 0.2 и не сгорает
35 |
--------------------------------------------------------------------------------
/homeworks/homework-10/homework-10.md:
--------------------------------------------------------------------------------
1 | ## Домашнее задание 10
2 |
3 |
4 | ### Что нужно сделать
5 |
6 | - Необходимо реализовать механику авторизации(к сожалению тоже на моках, но тем меньше дебага)
7 | - Конкретно:
8 | + создать формочку авторизации по новому url в роутинге `/auth`
9 | + создать кнопку выйти(где-то на главной, либо если есть шапка или футер, то туда)
10 | + создать моканное апи авторизации, в котором зафиксировать 1-2 пользователя в виде логин-пароль просто в json
11 | + задача моканного апи проверить есть ли такой пользователь, и если да,
12 | то проставить в `window.localStorage` состояние авторизованности (сохранить что угодно, что давало бы возможность понять,
13 | что это именно этот пользователь и он авторизован)
14 | + При клике на кнопку выхода надо стирать из локалстореджа состояние авторизованности
15 |
16 |
17 | ### На доп баллы:
18 |
19 | - +1 балл: необходимо сделать, чтобы при создании новой карточки и/или коммента в автора проставлялся аноним
20 | в случае если никто не залогинен и имя пользователя(которое можно было бы узнать из моканного апи если надо) в случае залогиненного пользователя
21 | - +1 балл: прикрутить какое нибудь хэширование для хранимого идентификатора в локалсторедж
22 |
23 |
24 | ### Хинты и полезное
25 |
26 | - Классный хэш [keccak](https://habr.com/ru/post/159073/)
27 |
28 |
29 | ### На вашу инициативу
30 |
31 | - Если захочется - можно прикрутить форму регистрации, но поставить туда заглушку о временной неработоспособности через
32 | методы браузерного апи объекта window (это не оценивается, но при желании попрактиковаться - прикольно)
33 |
34 |
35 | ### Дедлайны
36 |
37 | - Никаких дедлайнов: сдача дз в любой момент произойдет без понижения.
38 | - Единственное ограничение по времени - это дата выставления оценок за курс.
39 |
--------------------------------------------------------------------------------
/homeworks/homework-11/homework-11.md:
--------------------------------------------------------------------------------
1 | ## Домашнее задание 11
2 |
3 |
4 | ### Что нужно сделать
5 |
6 | - Задача этого дз максимально тривиальна - необходимо покрыть тестами все имеющиеся в проекте функции хелперы
7 | - К этому моменту я ожидаю, что у вас есть:
8 | + хотя бы один хелпер на сортировку
9 | + хотя бы один хелпер на генерацию даты
10 | + скорее всего есть генерация нового индекса
11 |
12 |
13 | ### Хинты
14 |
15 | - Весь флоу покрытия тестами есть в занятии 11
16 |
17 |
18 | ### Дедлайны
19 |
20 | - Никаких дедлайнов: сдача дз в любой момент произойдет без понижения.
21 | - Единственное ограничение по времени - это дата выставления оценок за курс.
22 |
--------------------------------------------------------------------------------