;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Agora vai? Novidade que esconde chats no WhatsApp reaparece com mudanças

WhatsApp realizou mudanças em aguardada nova funcionalidade - iStock/Getty
WhatsApp realizou mudanças em aguardada nova funcionalidade Imagem: iStock/Getty

Gabriel Francisco Ribeiro

De Tilt, em São Paulo

02/09/2020 17h26

Sem tempo, irmão

  • WhatsApp volta a testar função que esconde definitivamente chats arquivados
  • Novidade é uma das mais aguardadas pelos usuários do aplicativo
  • Funcionalidade apareceu em diferentes testes desde 2018
  • Usuário poderá ter também opção de arquivar automaticamente chats

O WhatsApp voltou a testar uma de suas mudanças mais esperadas pelos usuários: o até então chamado "modo férias". A funcionalidade deixará que o usuário arquive conversas com contatos ou grupos sem que elas voltem a aparecer na lista geral de chats quando alguém manda uma nova mensagem, como funciona agora —ou seja, permite ao usuário esconder conversas da janela principal do app.

A mudança havia aparecido pela primeira vez em testes em 2018. Em 2019, foi modificada em novos testes, mas nunca mais reapareceu, o que fez muitos usuários suspeitarem de que o recurso havia sido abandonado pelo aplicativo.

Eis que a versão beta mais recente do WhatsApp para Android traz de volta o recurso com mudanças, como notado pelo site especializado WABetaInfo. E lá vamos nós nessa novela do "possivelmente em desenvolvimento" de um recurso para o aplicativo.

De novo com mudanças

O novo teste do WhatsApp mostra que os chats arquivados vão aparecer diretamente no topo dos chats dos usuários no aplicativo, como mostra a imagem abaixo.

Chats arquivados aparecendo no topo da lista do WhatsApp com nova função ativada - Reprodução/WaBetaInfo - Reprodução/WaBetaInfo
Chats arquivados aparecendo no topo da lista do WhatsApp com nova função ativada
Imagem: Reprodução/WaBetaInfo

Ao clicar nesta seção, haverá um novo botão chamado "notificações". Lá você poderá escolher algumas configurações relativas às conversas e grupos arquivados.

Futura janela de conversas arquivadas do WhatsApp - Reprodução/WABetaInfo - Reprodução/WABetaInfo
Imagem: Reprodução/WABetaInfo

Uma dessas escolhas é se você quer ou não receber notificação das conversas arquivadas. Atualmente, o usuário não tem escolha: ao arquivar uma conversa, ela voltará para a lista de chats principais sempre que houver novas mensagens —o arquivamento, na maioria das vezes, só serve para grupos que você não faz mais parte.

WhatsApp modificou "Modo Férias", muito esperado pelos usuários - Reprodução/WaBetaInfo - Reprodução/WaBetaInfo
WhatsApp modificou "Modo Férias", muito esperado pelos usuários
Imagem: Reprodução/WaBetaInfo

Outra função interessante das notificações é um recurso que arquivará uma conversa ou grupo automaticamente se não houver nenhuma interação nova no período de seis meses.

É possível que o recurso ainda esteja em fase inicial de testes e que novos elementos sejam adicionados antes do lançamento oficial da aguardada atualização. Não há um prazo ainda para o novo recurso (finalmente) chegar a todos os usuários.