
Gena
30.08.2018
13:31:42
Т.е. когда вы переходите назад, компонент с верхушки стека, действительно удаляется и из-под него становится виден предидущий экран, в итоге unmount у компонента вызвается. А когда происходит переход вперед, текущий компонент никуда не исчезает, просто его не видно за новым, естественно никакого анмаунта не происходит... просто маунтится и рендерится новый компонент, который становится текущим и анимируется так чтоб занять весь экран...

Алексей
30.08.2018
13:40:22

Stepan
30.08.2018
13:44:16
там вроде даже в доке было это написано

Google

Ruslan
30.08.2018
13:52:51
Т.е. когда вы переходите назад, компонент с верхушки стека, действительно удаляется и из-под него становится виден предидущий экран, в итоге unmount у компонента вызвается. А когда происходит переход вперед, текущий компонент никуда не исчезает, просто его не видно за новым, естественно никакого анмаунта не происходит... просто маунтится и рендерится новый компонент, который становится текущим и анимируется так чтоб занять весь экран...
Спасибо большое, понял теперь, буду думать, как реализовать, потому что на didmount я вешаю специальный переход по роуту на физ кнопку андроид через BackHandler, и получается, вешать вешаю, а из за того, что unmount не срабатывает, хэндлер не сбрасывается и начинает работать там, где не должен быть
И кое какой роутинг нарушается

Peter
30.08.2018
14:00:21

John
30.08.2018
14:00:34

Gena
30.08.2018
14:02:54
Oo... они ещё и прям то, что с сайта https://opencollective.com/... получили (текст логотипа), прям напрямую в терминал пуляют, без фильтрации ESC-последовательностей...
Но из позитива, у них в коде появились ручки, чтоб это вырубать на всяких CI и production серверах

Ruslan
30.08.2018
15:01:50

Peter
30.08.2018
15:02:28

Ruslan
30.08.2018
15:03:17

Peter
30.08.2018
15:03:49

Ruslan
30.08.2018
15:04:44

Gena
30.08.2018
15:10:48
если у вас react-navigation то да, теперь экраны умирают, если с них уходишь.
Это не поможет, в данном случае... т.к. их умирание в общем случае не связано с навигацией... потому что экран должен остаться по крайней мере, пока его видно из-под нового... т.е. до конца транзишна... А если навигация свайпом включена (не знаю есть она в react-navigation или нет... в NavigationExperimental была...), то по крайней мере тот экран, что под верхушкой стека должен жить всё время)

Google

Peter
30.08.2018
15:12:08

Play
30.08.2018
15:12:49

Gena
30.08.2018
15:13:02
На самом деле если я правильно понимаю, что нужно @zharkov_r , то это надо делать вообще не в UI слое... и уж тем более не привязываться к life-cycle реакт компонентов. Это должно быть в модели навигации... именно там, где происходит переключение скринов и запуск транзишнов.

Алексей
30.08.2018
15:16:03
что то мне подсказывает что тут сейчас XY проблема решается, и что может на самом деле и не нужно вот кровь из носу анмаунтить компонент

Ruslan
30.08.2018
15:18:53

Peter
30.08.2018
15:25:45
Кто-нить подскажите
почему вот тут: https://github.com/keri4141/React-Native-Navigation-Redux-Example
на экране hometab, нельзя обратиться к хранилищу через this.props
и достать то что в initialState
ошибка вылазит undefined

Dmitry
30.08.2018
15:32:22

Peter
30.08.2018
15:37:44
const mapStateToProps = state => ({ users: state.users });
export default connect(mapStateToProps)(Hometab);
все подключено
Dmitry

Dmitry
30.08.2018
15:38:46
А вызывается как
И да, в registerComponent прокинут store и Provider ?

Peter
30.08.2018
15:42:50
Navigation.registerComponent(
"ReactNativeReduxExample.Hometab",
() => Hometab,
store,
Provider
);
const createStoreWithMiddleware = applyMiddleware(thunk)(createStore);
const reducer = combineReducers(reducers);
const store = createStoreWithMiddleware(reducer);
вызываю консоль логом
и вижу пропс проброшен

Google

Peter
30.08.2018
15:43:19
но значение undefined
хотя вот
const initialState = Immutable({
root: undefined,
users: "user123",
isLoading: false
});
а, надо было в mapState не state.prop а state.root.prop обращаться
вопрос закрыт

Влад
30.08.2018
17:30:07
Привет всем! А есть ли тут люди, которые делали приложения с реферальной системой? Чтобы можно было привлекать друзей в приложение и получать за это бонусные баллые?


Dmitry
30.08.2018
18:10:25
А вот вам задачка, хорошего решения я пока не нашел, поэтому довольствуюсь плохим, но более менее рабочим.
Итак, есть некий REST API, который возвращает массив сообщений. Запрашиваем, получаем, кладем в стор и работаем с ними. Как результат имеем всегда свежие данные. Далее, я хочу сделать возможность оффлайн просмотра последних N сообщение и кладу их в AsyncStorage. Перед запросом на сервер кидаю в стор данные из AsyncStorage, а свежие данные докидываю, когда прилетят. Пока все просто и понятно. Далее, сообщения могут быть изменены на сервере и тогда в запросе прилетят обновленные сообщения, тут мы просто их мерджим. А далее самое сложное (на мой взгляд), сообщения могут быть удалены на сервере, тогда в запросе их не будет и нужно, а они лежат в AsyncStorage. Сейчас в запросе прилетают все сообщения с флагами deleted и по нему удаляются из AsyncStorage, но тогда приложения всегда тянет лишние данные, которых может быть очень много. Для решения был сделан polling для отправки события удаления сообщения на сервере к приложению и по нему эти сообщения удаляются из AsyncStorage и тут возникает новая проблема. У одного получателя может быть несколько устройств с приложениями и своми кэшами, которые могут быть оффлайн на момент получения уведомления от сервера. Можно было помечать доставленные уведомления от сервера к конкретному приложению, но текущая реализация нигде не хранит уведомления, они создаются в момент, какого-то события, отправляются один раз и, в случае не получения уведомления (оффлайн), получатель второй раз его уже не получит. Может быть, кто-то сталкивался с такими задачи на правктике или имеет свои мысли на этот счет, с удовольствием обсужу варианты)


Arsenii
30.08.2018
18:17:55
возможно можно сравнивать ид которе пришли с сервера и удалять из стора все которые не нашлись в ответе?

Dmitry
30.08.2018
18:19:18

Vladimir
30.08.2018
18:26:09
А как выглядит метод запроса удаленных, какие параметры?

Dmitry
30.08.2018
18:26:31
Возможно, что единственным способом будет хранить все уведомления под все устройства в БД с флагами о получении и так синхронизировать

Vladimir
30.08.2018
18:27:35
Они пушатся?

Dmitry
30.08.2018
18:28:56
Они пушатся?
Да, они прилетают с сервера в момент события и только. Понятно, что можно при входе запрашивать удаленные, т.к. в онлайне они событиями удалятся, но так ты не можешь контролировать, какие именно из них ты уже удалил у себя и будешь всегда тянуть с сервера все удаленные

Vladimir
30.08.2018
18:30:20
Возможно, стоит получать «историю» изменения сообщений, легковесный запрос, не привязанный к конкретному устройству, там лишь нужен некий id для получения истории (дата, номер последнего и т.п)
В EWS, Gmail всё примерно так, в IMAP чуть упрощённее. Но это почта. В мессенджерах повеселее протоколы, наверное, можно их курить.

Arsenii
30.08.2018
18:32:44
возможно поможет отпрпавка пушей, и приложение будет их обрабатывать? но не показывать. Вот только не уверен что в ios обычные пуши так могут. Voip могут, так делал

Dmitry
30.08.2018
18:33:02

Vladimir
30.08.2018
18:33:54
У телеграмма открыт код вроде как

Dmitry
30.08.2018
18:34:30

Google

Arsenii
30.08.2018
18:37:33
в андроиде можно получить и обработать, даже не показав
вот в ios не уверен, но помоему там на 30 сек запускается апп при voip пуше.
а если сделать фоновую процесс (через то что в RN есть) и ходить на сервер раз в час или как система пустит, за списком удаленных. в запрос добавить время с которого надо начинать список

Vladimir
30.08.2018
18:39:17
В iOS есть silent push

Admin
ERROR: S client not available

Dmitry
30.08.2018
18:45:35


Play
30.08.2018
19:37:47
А вот вам задачка, хорошего решения я пока не нашел, поэтому довольствуюсь плохим, но более менее рабочим.
Итак, есть некий REST API, который возвращает массив сообщений. Запрашиваем, получаем, кладем в стор и работаем с ними. Как результат имеем всегда свежие данные. Далее, я хочу сделать возможность оффлайн просмотра последних N сообщение и кладу их в AsyncStorage. Перед запросом на сервер кидаю в стор данные из AsyncStorage, а свежие данные докидываю, когда прилетят. Пока все просто и понятно. Далее, сообщения могут быть изменены на сервере и тогда в запросе прилетят обновленные сообщения, тут мы просто их мерджим. А далее самое сложное (на мой взгляд), сообщения могут быть удалены на сервере, тогда в запросе их не будет и нужно, а они лежат в AsyncStorage. Сейчас в запросе прилетают все сообщения с флагами deleted и по нему удаляются из AsyncStorage, но тогда приложения всегда тянет лишние данные, которых может быть очень много. Для решения был сделан polling для отправки события удаления сообщения на сервере к приложению и по нему эти сообщения удаляются из AsyncStorage и тут возникает новая проблема. У одного получателя может быть несколько устройств с приложениями и своми кэшами, которые могут быть оффлайн на момент получения уведомления от сервера. Можно было помечать доставленные уведомления от сервера к конкретному приложению, но текущая реализация нигде не хранит уведомления, они создаются в момент, какого-то события, отправляются один раз и, в случае не получения уведомления (оффлайн), получатель второй раз его уже не получит. Может быть, кто-то сталкивался с такими задачи на правктике или имеет свои мысли на этот счет, с удовольствием обсужу варианты)
web sockets, подписки в graphQL? Вы описываете real-time приложение, идеальная реализация которого graphQL + Apollo.


Gena
30.08.2018
20:09:47
А вот вам задачка, хорошего решения я пока не нашел, поэтому довольствуюсь плохим, но более менее рабочим.
Итак, есть некий REST API, который возвращает массив сообщений. Запрашиваем, получаем, кладем в стор и работаем с ними. Как результат имеем всегда свежие данные. Далее, я хочу сделать возможность оффлайн просмотра последних N сообщение и кладу их в AsyncStorage. Перед запросом на сервер кидаю в стор данные из AsyncStorage, а свежие данные докидываю, когда прилетят. Пока все просто и понятно. Далее, сообщения могут быть изменены на сервере и тогда в запросе прилетят обновленные сообщения, тут мы просто их мерджим. А далее самое сложное (на мой взгляд), сообщения могут быть удалены на сервере, тогда в запросе их не будет и нужно, а они лежат в AsyncStorage. Сейчас в запросе прилетают все сообщения с флагами deleted и по нему удаляются из AsyncStorage, но тогда приложения всегда тянет лишние данные, которых может быть очень много. Для решения был сделан polling для отправки события удаления сообщения на сервере к приложению и по нему эти сообщения удаляются из AsyncStorage и тут возникает новая проблема. У одного получателя может быть несколько устройств с приложениями и своми кэшами, которые могут быть оффлайн на момент получения уведомления от сервера. Можно было помечать доставленные уведомления от сервера к конкретному приложению, но текущая реализация нигде не хранит уведомления, они создаются в момент, какого-то события, отправляются один раз и, в случае не получения уведомления (оффлайн), получатель второй раз его уже не получит. Может быть, кто-то сталкивался с такими задачи на правктике или имеет свои мысли на этот счет, с удовольствием обсужу варианты)
При такой постановке - REST API... хорошего (прям реал-тайм) решения не будет. Нужна возможность пуша со стороны сервера (не мобильного, а просто послать клиенту что-то без поллинга)...
Вот вам кратко мой вариант:
0. Для простоты - "канал сообщений" (список) один глобальный, все клиенты равноправны. Мы оптимизируем время обновления и трафик. Мы не оптимизируем время разработки и не подстраиваимся под существующие решения.
1. Транспорт WebSockets, енкодинг произвольный, допустим json.
2. Сообщение на сервере, помимо прочего имеет атрибуты: id, таймштамп создания, таймштамп изменения, флаг "удалено".
3. После загрузки и установки соединения, клиент делает запрос: "сервер, дай мне список последних N сообщений, у меня есть сообщения с ID1 по ID2, последний раз я получал их во время T", сервер на это шлет
a. если диапазон последних N сообщений не пересекается с ID1-ID2, то список с флагом, что кеш надо почистить.
b. если диапазон пересекается, то: список новых сообщений, список обновившихся с момента T из диапазона ID1-ID2 сообщений, в том числе удаленных (для экономии трафика, можно слать удаленные отдельным списком айдишников)
Т.е. ответ сервера, это: список изменившихся сообщений и флаг сброса кеша
4. С момента соединения, сервер так же абсолютно независимо от п.3 до момента дисконнекта шлет отдельными командами обновления на каждое новое, модифицированное или удаленное сообщение всем приконнекченным клиентам...
5. Клиент, получив ответ на 3, мержит к себе в модель данных изменения, при необходимости стирает кеш (м.б. клиент последний раз год назад открывали) и разблокирует UI (в том смысле, что показать кеш можно было и раньше, но давать менять что-то не надо бы).
6. Клиент с самого начала слушает индивидуальные обновления от сервера, по каждому соотвественно обновляет модель.


Dmitry
30.08.2018
20:43:18
Спасибо за участие. К сожалению сейчас нет возможности использовать сокеты, поэтому и приходится работать с пуллингом
При такой постановке - REST API... хорошего (прям реал-тайм) решения не будет. Нужна возможность пуша со стороны сервера (не мобильного, а просто послать клиенту что-то без поллинга)...
Вот вам кратко мой вариант:
0. Для простоты - "канал сообщений" (список) один глобальный, все клиенты равноправны. Мы оптимизируем время обновления и трафик. Мы не оптимизируем время разработки и не подстраиваимся под существующие решения.
1. Транспорт WebSockets, енкодинг произвольный, допустим json.
2. Сообщение на сервере, помимо прочего имеет атрибуты: id, таймштамп создания, таймштамп изменения, флаг "удалено".
3. После загрузки и установки соединения, клиент делает запрос: "сервер, дай мне список последних N сообщений, у меня есть сообщения с ID1 по ID2, последний раз я получал их во время T", сервер на это шлет
a. если диапазон последних N сообщений не пересекается с ID1-ID2, то список с флагом, что кеш надо почистить.
b. если диапазон пересекается, то: список новых сообщений, список обновившихся с момента T из диапазона ID1-ID2 сообщений, в том числе удаленных (для экономии трафика, можно слать удаленные отдельным списком айдишников)
Т.е. ответ сервера, это: список изменившихся сообщений и флаг сброса кеша
4. С момента соединения, сервер так же абсолютно независимо от п.3 до момента дисконнекта шлет отдельными командами обновления на каждое новое, модифицированное или удаленное сообщение всем приконнекченным клиентам...
5. Клиент, получив ответ на 3, мержит к себе в модель данных изменения, при необходимости стирает кеш (м.б. клиент последний раз год назад открывали) и разблокирует UI (в том смысле, что показать кеш можно было и раньше, но давать менять что-то не надо бы).
6. Клиент с самого начала слушает индивидуальные обновления от сервера, по каждому соотвественно обновляет модель.
Как гарантировать целостность, если например с ID1 по IDn есть пропущенные сообщения. По ним не получить актуальную информацию


Gena
30.08.2018
20:45:28
А с обычным протоколом HTTP, я не знаю как такое сделать нормально, дело в том, что вот этот запрос на последние сообщения довольно тяжелый для сервера. С поллингом, сервер ляжет от таких запросов, но логически это по прежнему рабочая схема должна быть.

Dmitry
30.08.2018
20:59:31
На самом деле...
Пока я расписывал всю эту историю, похоже что пришёл к решению
Достаточно хранить историю событий, которые произошли в оффлайне и отдавать ее при входе в онлайн

morda
30.08.2018
21:02:39
Рассказываю рассказываю уже сам понял а они...

Dmitry
30.08.2018
21:03:53

morda
30.08.2018
21:04:50
Ну это "желтая уточка")
https://ru.wikipedia.org/wiki/Метод_утёнка

Dmitry
30.08.2018
21:06:51

morda
30.08.2018
21:07:20
Работает кстати))

Dmitry
30.08.2018
21:13:19
Факт

Google

Dmitry
30.08.2018
21:14:39
А кто нибудь вообще пытался проксировать сокеты через NGINX? Я Билый час потратил так и не завелось

Demuz
31.08.2018
05:13:09

Dmitry
31.08.2018
05:33:05
Спасибо, перепроверю, но по-моему у меня при схожем конфиге не завелось...

andreyelek
31.08.2018
07:03:34

✡️Хаски
31.08.2018
07:06:06
Была такая проблема , вам нужно открыть в студи не корень проекта , а <project_root>/android

andreyelek
31.08.2018
07:11:38
не понел что мне сделать

✡️Хаски
31.08.2018
07:13:20

Никита
31.08.2018
07:15:49
без запуска студии запускаю эмулятор в таком стиле:
emulator -avd Pixel_API_27

andreyelek
31.08.2018
07:16:31