| 425 | } |
| 426 | |
| 427 | [[nodiscard]] auto WhoReadOrReactedIds( |
| 428 | not_null<HistoryItem*> item, |
| 429 | not_null<QWidget*> context) |
| 430 | -> rpl::producer<PeersWithReactions> { |
| 431 | return rpl::combine( |
| 432 | WhoReactedIds(item, {}, context), |
| 433 | WhoReadIds(item, context) |
| 434 | ) | rpl::map([=](PeersWithReactions &&reacted, Peers &&read) { |
| 435 | if (reacted.state == WhoReadState::Unknown |
| 436 | || read.state == WhoReadState::Unknown) { |
| 437 | return PeersWithReactions{ .state = WhoReadState::Unknown}; |
| 438 | } |
| 439 | auto &list = reacted.list; |
| 440 | for (const auto &peerWithDate : read.list) { |
| 441 | const auto i = ranges::find( |
| 442 | list, |
| 443 | peerWithDate.peer, |
| 444 | [](const PeerWithReaction &p) { |
| 445 | return p.peerWithDate.peer; }); |
| 446 | if (i == end(list)) { |
| 447 | list.push_back({ .peerWithDate = peerWithDate }); |
| 448 | } else if (!i->peerWithDate.date) { |
| 449 | i->peerWithDate.date = peerWithDate.date; |
| 450 | i->peerWithDate.dateReacted = peerWithDate.dateReacted; |
| 451 | } |
| 452 | } |
| 453 | reacted.read = std::move(read.list); |
| 454 | return std::move(reacted); |
| 455 | }); |
| 456 | } |
| 457 | |
| 458 | bool UpdateUserpics( |
| 459 | not_null<State*> state, |
no test coverage detected