rss-reader's People
rss-reader's Issues
Абстрактно названа функция onButtonClick(Sidebar.js:16) и onFormButtonClick(Sidebar.js:20)
При виде данного названия и зная, что мы в файле Sidebar.js, я смог построить весьма скудное умозаключение: "Эта функция сработает при нажатии какой-то кнопки в Сайдбаре". Нужно назвать более конкретно. При этом ниже есть функция onFormButtonClick, которая чуть уточняет своё местоположение, но всё равно есть неопределённость, так как в средних формах не всегда одна кнопка фигурирует.
Обернуть ExpandLess и ExpandMore в Material UI компонент "IconButton"
Если иконка нажимабельна, а не просто для отображения, то следует использовать её внутри IconButton, чтобы был визуальный эффект нажатия и наведения
Нельзя удалить категорию с ненулевым количеством лент
Упрощение onChannelDelete
rss-reader/src/containers/Channels.js
Lines 13 to 19 in b354788
Вроде должно сработать так:
function onChannelDelete(index) {
if (channels[index].editable === true) {
return;
}
setChannels(channels.splice(index, 1));
}
Омагад! Омагад! Скример!
UX фильтрации при отсутствии статей
Тонкий момент UX: когда человек на что-нибудь нажимает, что-то вводит и ожидает, что что-то произойдёт - должно что-то происходить. Здесь же ничего не происходит, потому что технически нечему происходить, так как нечего фильтровать. Но это понимают только сверхразумы, типа тебя и твоего кота, например.
Можно избежать психологических травм пользователей, если, например, дизейблить поле ввода, если фильтровать нечего. На самом деле это не идеальный вариант, а скорее просто дешёво-приемлимый, так как есть минус: всё, что дизейблится, должно поясняться (нельзя задизейблить и не показать рядом какую-то подсказочку, мол почему задизейблено)
Неунифицированный подход функций onCategoryDelete и onChannelDelete
onCategoryDelete принимает в параметрах список категорий и id категории, которую нужно удалить,
onChannelDelete принимает только id канала, который нужно удалить.
Почему было решено сделать разный подход одной и той же по типу операции?
Смешивание стилей написания составных слов в именах переменных
(activeChannel vs rss_url, logo_url) как минимум. В js'е юзают lowerCamelCase
Почему-то кнопка "Новая категория" не нажимается
Здравствуйте! Я начинающий в вашей системе, столкнулся с трудностью добавления новой категории. Я нажал на кнопочку "Новая категория". Эта кнопочка скакнула вниз, вместо неё появилось какое-то поле ввода с иконкой удаления. Я нажал на "Новая категория" ещё раз, но она уже не нажимается. Я сломал вторую мышку, она всё равно не нажимается. Я ничего не понимаю. Памагити.
Рефакторинг функции onClick(Channels.js:55)
rss-reader/src/containers/Channels.js
Lines 55 to 66 in db73a9b
if (item.id === id) {
item.active = true;
}
if (context.activeChannel && item.id === context.activeChannel.id && item.id !== id) {
item.active = false;
}
Можно вроде упростить длинное выражение с помощью else:
if (item.id === id) {
item.active = true;
} else if (context.activeChannel && item.id === context.activeChannel.id) {
item.active = false;
}
В режиме редактирования RSS-ленты не получается её удалить
Тыкаю-тыкаю на иконку корзины, а ничего(
Упрощение onChangePostsList
rss-reader/src/containers/Posts.js
Lines 56 to 59 in b354788
- Зачем обрамлять фигурными скобками?
- Вроде бы можно упростить функцию, если учесть тот факт, что .map возвращает новый список
Пустой Select выбора категории RSS-ленты
post.visible
У объекта "Пост" заметил свойство visible, что означает, что пост может быть видим или не видим. На самом деле пост всегда видим, даже если не полностью, для таких случаев человечество придумало слова expanded (расширен) и collapsed (сжат). Можно взять любое из этих слов и так же как с visible: true/false
Получить дружелюбную дату
мило =)
Но когда речь идёт о видоизменении даты под конкретные ситуации, то говорят "форматирование даты":
function formatDate(date)
Рефакторинг функции onChannelDelete (Channels.js:13)
-
Не понятно, почему мы принимаем в параметрах index и id. Зачем нам для удаления канала и индекс в неком списке и идентификатор удаляемого канала? Кажется, достаточно что-то одно.
-
Можно вынести дублирующие длинные обращения в переменную:
кажется, можно назвать это "channelToDelete" и "channelToChange".
Дабы это было не похоже на просто "так надо", попробую объяснить этот момент:
Пусть у нас какой-то персонаж игры, хранится в списке всех персонажей, у него есть функция "съесть пищу", которая снизит его голод, повысит уровень жизни и улучшит настроение:
function eatFood(playerIndex, food) {
players[playerIndex].starvationLevel -= food.caloriesLevel;
players[playerIndex].healthPoints += food.healthPoints;
players[playerIndex].mood += food.moodLevel;
}
А теперь прочитаем эту функцию:
Функция "съесть пищу" принимает индекс игрока и пищу.
Уменьшаем уровень голода у игрока из списка игроков по индексу playerIndex на уровень калорийности пищи.
Увеличиваем очки жизни у игрока из списка игроков по индексу playerIndex на очки жизни пищи.
Увеличиваем настроение у игрока из списка игроков по индексу playerIndex на уровень настроения пищи.
А теперь вынесем общую часть в переменную:
function eatFood(playerIndex, food) {
const player = players[playerIndex];
player.starvationLevel -= food.caloriesLevel;
player.healthPoints += food.healthPoints;
player.mood += food.moodLevel;
}
Функция "съесть пищу" принимает индекс игрока и пищу.
Берём игрока из списка игроков по индексу.
Уменьшаем его уровень голода на уровень калорийности пищи.
Увеличиваем его очки жизни на очки жизни пищи.
Увеличиваем его настроение на уровень настроения пищи.
- В конце метода вызывается onChannelDelete, затем onChannelsChange, при этом onChannelDelete вызывает setChannels, причём дважды, затем onChannelsChange выывает ещё один setChannels. То есть в итоге вызывается трижды. Зачем так?
Лента добавилась в список до завершения заполнения формы
Полоска под списком категорий
Слово-паразит "data"
rss-reader/src/containers/Sidebar.js
Lines 77 to 86 in db73a9b
Слово "data"(данные) - это очень привлекательное слово для программистов, потому что подходит практически в каждом случае в силу своей абстрактности. В то же время абстрактность мешает человеку понять конкретность (капитан очевидность). Код будет намного понятнее, если таких абстрактностей будет как можно меньше.
В данной конкретной ситуации можно назвать аттрибут "items"... или "entries"... или "elements". Если верить гуглу, если List - тип данных в программировании, - то у него "elements", а если List - список в пользовательском интерфейсе, - то у него "items"
Запретить выделение текста имени приложения
Устранить дублирование кода в слое взаимодействия с сервером
В директории src/api некоторые части кода повторяются, например headers в addCategory, addChannel, updateChannel. Нужно вынести куда-нибудь общий код
Элемент списка RSS-лент изменяется в высоте в режиме редактирования
Введите название поста
Но зачем я должен это делать? Не понятно. Даже при том, что у поле ввода есть иконка лупы, это может натолкнуть у австралопитека на как минимум 2 предположения:
- "Я введу название поста, он будет искаться словно как в гугле, и я смогу его прочитать"
- "Я введу название поста, тем самым быстрее найду его из списка"
Рефакторинг функции onChannelItemChange(Channels.js:30)
Здесь проблема в том, что функция выполняет разные действия в зависимости от параметра. Пришли в голову 2 альтернативы:
- Channel вызывает разные callback'и (onTitleChange и onLinkChange) вместо использования одного лишь onChange. Таким образом в Channels.js будут два трёх-строчных метода.
- Channel вызывает onChange, но передаёт туда весь объект канала с полями title и link. Таким образом в Channels.js метод onChannelItemChange присвоит все поля, даже если какие-то из них не были реально изменены, но это не считается плохим подходом:
function onChannelItemChange(index, newChannel) {
const channelToChange = context.channels[index];
channelToChange.editable = true;
channelToChange.title = newChannel.title;
channelToChange.rss_url = newChannel.rss_url;
context.onChannelsChange([...context.channels]);
}
Этот код - не мусор, случайно?
rss-reader/src/components/FormControl.js
Lines 85 to 100 in db73a9b
Непонятный интерфейс при отсутствии каких-либо RSS-лент и категорий
Пользователь, который только начал работу с твоим сервисом, в первую очередь задастся вопросами:
- Что за пустые прямоугольники?
- Что за поле поиска и почему ничего не происходит, когда я ввожу там текст?
- Что происходит?
Нужно что-то придумать с этим. Интерфейс должен проявлять любовь, заботу и нежность по отношению к пользователям :)
Смешанные чувства от формы добавления RSS-ленты
Мне понравилось, что не открывается какое-нибудь всплывающее окно с формой, а всё происходит "не отходя от кассы". Однако есть и замечания:
-
Между поля ввода нет интервала. Это вызывает проблему только при фокусе какого-либо из полей:
-
Пусть категория выбирается из списка существующих с помощью компонента Select
-
Если выбрать имя ленты из предлагаемого списка, то поле ввода отличается от соседних. Да и вообще зачем предлагать там что-либо. Кажется, этим никто не будет пользоваться. Пусть вбивают без возникающих подсказок
Упрощение change
rss-reader/src/containers/Posts.js
Lines 62 to 69 in b354788
Функция в 1-2 строчки (оба варианта норм). А твой вариант читать долго(( пожалей ленивых
Невалидное имя ленты
Заполняю форму добавления RSS-ленты. Решил добавить такую:
Имя: Medium: @dane.mackier
Ссылка: https://medium.com/feed/@dane.mackier
Но почему-то сервис не разрешает задать такое имя, говоря: "Невалидное имя ленты":
Не понимаю, что такого запретного в таком имени, и сервис даже не удосуживается показать, какие символы разрешены(
Воспользоваться @material-ui/icons
В проекте есть папка icons с SVG-компонентами. Прикольно, но в этом нет необходимости: Material UI предоставляет гугловские иконки Material'а в пакете @material-ui/icons.
В итоге будет на 1 папку с 6 файлами меньше.
Проиграю сценарий, как добавить иконку:
- Заходим на сайт https://material.io/tools/icons/?icon=looks_4&style=baseline
- Ищем нужную иконку в этом стоге сена. Ну в твоём случае есть лайфхак: в фигме в структуре элементов имена иконок соответствуют Material Icons именам:
(чтобы не ползать по структуре, можно натыкать на саму иконку в интерфейсе фигмы) - Запомнить имя иконки:
- Мысленно перевести в UpperCamelCase: ExpandLess, ExpandMore
- Это и будет именами компонент нужных иконок
(импорт будет таким: @material-ui/icons/ExpandLess и @material-ui/icons/ExpandMore)
Разная высота у существующей и новой категории
Куда-то пропадают RSS-ленты текущей категории при заполнении формы добавления RSS-ленты
Упрощение кода с помощью готовых компонентов Material UI
Приведу пример.
У тебя разметка всё же осталась с прямым использованием CSS. Есть компонент Grid, который позволяет сделать всё почти без CSS:
Выглядит вроде бы также:
По Diff'у видно, что кода приубавилось чуток, и это я лишь самый-самый верх структуры приложения заменил. Надо везде так же. Как можно меньше CSS, как можно меньше не Material UI компонент =)
Не меняется фоновый цвет при наведении на RSS-ленту
Непонятные имена функций в App.js
onCategoriesFinish(App.js:45). Эта функция вызовется, когда категории завершатся?
onChannelFinish (App.js:53). Эта функция вызовется, когда каналы завершатся?
Расстояние между элементами списка категорий
Убрать переход по RSS-ссылке при клике на неё
Я просто хотел выбрать элемент списка, чтобы справа увидеть посты, а меня перекинуло ваще куда-то(
Упрощение onChannelItemEditFinish
rss-reader/src/containers/Channels.js
Lines 28 to 30 in b354788
Вроде бы если просто channels.map(bla-bla-bla); оставить, то должно сработать, так как .map возвращает новый список
Warning: "Each child in a list should have a unique "key" prop."
Переключаться на новосозданную категорию
Если пользователь создал новую категорию, пусть система сразу на неё переключается.
Никому эти пустые полоски не нужны
Не подсвечивается активный элемент списка категорий RSS-лент
Упростить выражение
rss-reader/src/components/List.js
Line 95 in db73a9b
Использовать встроенный метод строки "padStart"
С одной стороны жалко, что крутую самописную функцию заставляют вырезать из кода, но с другой стороны это делегирование ответственности в продумывании и тестировании на других. У тебя функция:
rss-reader/src/components/Post.js
Lines 96 to 101 in db73a9b
может быть заменена с помощью метода типа данных "string":
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/String/padStart
Упростить выражения
rss-reader/src/components/List.js
Lines 18 to 33 in db73a9b
Поиск визуально сливается с первой статьёй
Неиспользуемый файл
/src/components/Button.js
Добавил ленту в активную категорию, но система всё равно думает, что в категории нет лент
Давай проще)
rss-reader/src/containers/Posts.js
Line 55 in b354788
Пусть все поля ввода текста будут в одном стиле
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.