
Alex
13.10.2018
22:23:54
зря я не отправил сообщение, моя либа разрабатывалась с расчётом, что любые мутации стора будут инкапсулированы в логику (функции) и стоять за каким-то EE связывающим логику и вью
т.е. нет, не разрешаю
а такое store.set(todos([1, 2, 3]).completed, true) эта строчка установит значение completed у элементов массива(или Map) todos с айди 1, 2 и 3

Andrey
13.10.2018
22:25:30
Магия(

Google

Alex
13.10.2018
22:25:48
)))
только ошибся store.set(todos([1, 2, 3], e => e.completed), true)

Andrey
13.10.2018
22:27:14
Ну, уже понятнее, но всё равно жесть.
ОК, не жесть. Непривычно.

Alex
13.10.2018
22:30:05
да, скорее не привычно, теперь представь, что есть какая-то эвент шина, в ней событие markCompleted в пейлоаде number или number[], на событие подписана функция:
function markCompleted(payload) {
store.set(todos(payload, e => e.completed), true);
}
теперь можно выделить несколько элементов и нажать кнопку completed
структура стора следующая:
{
todos: [ { completed } ]
}

Andrey
13.10.2018
22:31:28

Alex
13.10.2018
22:31:45
если удобно, почему нет?

Cenator
13.10.2018
22:31:56

Andrey
13.10.2018
22:32:35

Alex
13.10.2018
22:32:44
типа взял откуда-то ссылку на поддрево из стора и работаешь с поддревом даже не зная, что оно вложено куда-то

Google

Andrey
13.10.2018
22:32:46
Cbynfrcbc dpzn bp ujkjds/
если удобно, почему нет?
Мне кажется, что в итоге люди всё же вернутся к куче маленьких сторов, где синтаксис oldStore => newStore предпочтительнее, имхо.

Alex
13.10.2018
22:33:59
ну суть в том, что можно изолированно работать с частями состояния не зная о внешнем мире, т.е. создавать фичи

Andrey
13.10.2018
22:36:18
Ну, ок. Моя позиция заключается в том, что сторы должны быть маленькими и нельзя пользователю позволять больше, поэтому oldStore => newStore не то что оправдано - оно необходимо.

Kelin
13.10.2018
22:37:49
А во вложенности собирать computed сторами

Alex
13.10.2018
22:38:16
эффекторнулись

Andrey
13.10.2018
22:38:31

Alex
13.10.2018
22:39:04
сопротивляться бесполезно, победитель очевиден
я сдаюсь

Andrey
13.10.2018
22:39:29

Alex
13.10.2018
22:39:49

Andrey
13.10.2018
22:39:52
А в остальном да, всё печально)

Kelin
13.10.2018
22:40:22
Ну собрать todos из соответствующих text, complete итд

Alex
13.10.2018
22:40:35
локальность, это типа, что оно подходит только мне?

Andrey
13.10.2018
22:40:36

Alex
13.10.2018
22:43:10
Ну собрать todos из соответствующих text, complete итд
ты не понял, берёшь строку const store0 = createStore() копируешь ровно столько раз, сколько у тебя глобальных переменных(в том числе в виде объектов) в приложении, потом, переименовываешь store0 в соотвествии с назначением и распихиваешь эти сторы там, где они нужны

Google

Alex
13.10.2018
22:44:07
ну ещё можно как акторы их представлять со своим набором событий и редьюсерами

Kelin
13.10.2018
22:45:03
вообще я имел в виду делать так
const ids = createStore(new Set)
const text = createStore(new Map)
const complete = createStore(new Map)
const todos = combineByIds(ids, { text, complete })

Alex
13.10.2018
22:46:49
да мы поняли

Timofey
13.10.2018
22:48:18

Andrey
13.10.2018
22:48:55
Не будет.

Timofey
13.10.2018
22:51:23
ну вот я покинул компонент и он размонтировался, а к тому времени then отработал и this.setState срабатывает. реакт же кидает ошибку в таком случае

Andrey
13.10.2018
22:52:01

Timofey
13.10.2018
22:52:26
и его можно не парясь игнорить?

Andrey
13.10.2018
22:53:24
Лучше не игнорить, а прерывать запросы.

Kelin
13.10.2018
22:54:16

Kelin
13.10.2018
22:55:20

Волчик
13.10.2018
22:58:51
Кто-нибудь использовал Redux-ORM?
Сильно тормозит?

Cenator
13.10.2018
23:04:42
@MyNameIsLiberty вроде эксперт в ней


Kelin
13.10.2018
23:06:59
Подытожу косяки драфта
Если делать кастомные атомарные блоки
- Результат тяжело превратить в строку по той причине, что “текст” блока должен состоять из одного символа, иначе придется X раз жать delete, чтобы его удалить. Пропсы блока получаются через костыли
- Если нажать delete перед атомарным блоком, он почему-то становится обычной строкой. (Ишью об этом висит 2 года)
- Невозможно получить selectionState внутри компонента блока. Это означает, что невозможно нормальным образом определить, выделен ли он вообще или нет
Если делать декораторы
- Нет возможности сделать декорированный блок “immutable” (типа удалять блок целиком при нажатии delete). Это, в общем-то, логично, но в виду такой захардкоженности блоков и тяжести работы с ними, было бы клево добавить такую возможность
Фразой “Low-level API” разработчики пытаются оправдать архитектурные костыли, которые нагородили и не могут теперь исправить
В либе куча всяких Modifier, AtomicBlocksUtils, RichUtils, KeyBingingUtils, но когда начинаешь что-то делать, понимаешь, что даже этого недостаточно
А, еще забыл
Отсутствует API для плагинов. Есть draft-js-plugins, кастомный компонент редактора, который принимает проп plugins. Но это, сами понимаете, жопа. При этом сорсы плагинов километровые, абсолютно нечитаемые, абсолютно непонятные


Alex
13.10.2018
23:13:33
ну да, там пиздец, это ещё на разных браузерах по разному всё работает

Kelin
13.10.2018
23:15:00
Из косяков slate - не дописана (или не раскрыта) дока по сущностям, коих в библиотеки почти 20.
НО это на все 100% компенсируется тем, что главная страница состоит из аж 23 примеров использования. Из этого следует, что практически любую фичу можно просто скопировать из сорсов примеров и воткнуть (что я, собственно, и сделал).
Сорсы при этом понятные и читаемые, очень понравилась фишка с изменением стейта через чейнинг change
Плагины из коробки, onChange, renderNode и остальные хуки работают как мидлвари - передается next
Любое действие можно сделать встроенными методами - перенос курсора, замена текста на определенном куске, вставка блока, удаление, разбиение - вообще все. При этом можно создать command - шорткат, в который прокидывается change, там можно описать цепочку действий и так же юзать в цепочках

Google

Kelin
13.10.2018
23:16:23
Очень понравилось наличие всевозможных moveAnchorToEndOfBlock, moveOffsetTo, moveToStartOfText итд


Сергей
13.10.2018
23:21:12
Из косяков slate - не дописана (или не раскрыта) дока по сущностям, коих в библиотеки почти 20.
НО это на все 100% компенсируется тем, что главная страница состоит из аж 23 примеров использования. Из этого следует, что практически любую фичу можно просто скопировать из сорсов примеров и воткнуть (что я, собственно, и сделал).
Сорсы при этом понятные и читаемые, очень понравилась фишка с изменением стейта через чейнинг change
Плагины из коробки, onChange, renderNode и остальные хуки работают как мидлвари - передается next
Любое действие можно сделать встроенными методами - перенос курсора, замена текста на определенном куске, вставка блока, удаление, разбиение - вообще все. При этом можно создать command - шорткат, в который прокидывается change, там можно описать цепочку действий и так же юзать в цепочках
Блин. Мне нужен редактор с плагинами
Ищу не могу найти (

Kelin
13.10.2018
23:22:15

Сергей
13.10.2018
23:23:16
Это для чего
Slate?

Kelin
13.10.2018
23:26:36
Это для чего
Я делаю редактор команд
У команд есть переменные - { codename, name }
- Их нужно визуально выделять. Конвертить строку Hello, %foo% в Hello, Foo (где foo - codename, Foo - name)
- Если нет переменных - отображать как строку
- Удалять только целиком
- Менять фон при выделении
- Автоматически заменять на переменную, если написать Hello, %foo
- Возможность втыкать переменные нажатием на кнопки на место курсора

Admin
ERROR: S client not available

Kelin
13.10.2018
23:30:27

Сергей
13.10.2018
23:58:24
Хипер даже

Kelin
13.10.2018
23:59:09
ага

Сергей
14.10.2018
00:04:24
https://t.me/this_week_in_react/20

Игорь
14.10.2018
00:21:30

Kelin
14.10.2018
00:22:37

Сергей
14.10.2018
00:23:44
а что там с визуальной кастомизацией?

Google

Kelin
14.10.2018
00:26:41
Ну, блоки = компоненты. Кастомизируй, как хочешь)
https://www.slatejs.org
Тут тонна примеров, в общем-то
Тут и маркдауны всякие, и эмодзи, и видосы, и всплывающие менюшки, куча всего крч

Пг
14.10.2018
00:44:59
styled components позволяет сделать что-то вроде:
props => props.header ? `@media (min-width: 600px) {
display: none;
}`
?

Сергей
14.10.2018
00:45:17
но этот вариант говно

Пг
14.10.2018
00:45:57
Что-то не работает, только если display: ${props => props.header ? 'none': 'block'};

Сергей
14.10.2018
00:46:20

Пг
14.10.2018
00:46:41
export const Logo = styled(Typography)`
max-width: 120px;
padding-right: ${theme.spacing.unit * 2}px;
${(props: any) => props.header ? `
${theme.breakpoints.down('xs')} {
display: none !important;
}`
: ''
}
`;
если убрать функцию, то все ок

Сергей
14.10.2018
00:52:54
попробуй тогда функцию внутрь media засунуть
странно

Cenator
14.10.2018
00:54:02
попробуй так
(добавил css)

Пг
14.10.2018
00:55:05
Кстати, еще вопрос, по поводу nextjs.
при запуске next и рекомпиле при каких-то изменениях + обновление страницы (с хот релоад все ок)
Warning: Prop d did not match. Server: "M 0 0 h 24 v 24 H 0 V 0 Z" Client: "M0 0h24v24H0V0z"
И такие же ошибки с классами MUI
Как с этим бороться?
а css откуда берется?

Cenator
14.10.2018
00:55:30
импортируешь из стайледов

Пг
14.10.2018
00:55:44
ок, спс

Alexander
14.10.2018
03:45:22
Есть какие примеры по структуре приложения react+mobx? Как это правильно делать

Eduard
14.10.2018
03:56:56
Что лучше всего испльзовать чтобы изменять состояние хранилища?

Cenator
14.10.2018
04:15:17
экшены