;(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

Corações animados e mais: confira 5 novidades que WhatsApp deve lançar

Recursos em teste prometem melhorias de uso para iOS, Android e web - Getty Images/iStock
Recursos em teste prometem melhorias de uso para iOS, Android e web Imagem: Getty Images/iStock

Aurélio Araújo

Colaboração com Tilt, de São Paulo

24/01/2022 16h03

O WhatsApp, o aplicativo de mensagens mais popular do Brasil, está em constante atualização. Algumas novidades, porém, são tão sutis que podem ser implementadas sem você perceber. Outras, por sua vez, são lançadas aos poucos, e não chegam logo de cara para todo mundo.

É o caso, por exemplo, da função que permite sair de uma conversa e seguir escutando um áudio dela. Dessa forma, o WhatsApp atende uma demanda antiga das pessoas que o utilizam: ouvir áudios por cima de outros apps.

Por enquanto, a novidade só está disponível na versão Beta do app, em que normalmente as novas funcionalidades são testadas. Mas há outras novidades chegando por aí, e Tilt preparou uma listinha para te deixar atualizado.

1) e dentro do aplicativo

Essa é uma função que já foi testada no ado, mas que foi sumiu sem razão aparente. Agora, porém, ela está de volta no WhatsApp Beta, tanto para Android quanto para iOS.

Agora, ao ar as configurações e pedir para fazer contato com o WhatsApp, a equipe de e do app te responde com uma mensagem no chat do próprio aplicativo, se assim você desejar. As conversas com os funcionários do WhatsApp tem aquela marquinha verde de "verificado", para que você saiba que está falando com a verdadeira equipe do aplicativo, e não com alguém se ando por eles.

2) Corações animados

Se você já mandou o emoji de coração vermelho numa mensagem, sabe que ele "pulsa" — ou seja, trata-se de um emoji animado. O que sempre intrigou as pessoas, porém, é que esse era o único emoji de coração que "batia", dando ao vermelho um charme especial. O WhatsApp tem corações de diversas outras cores, por que não fazer com que eles pulsem também?

Pois agora, no WhatsApp Beta para iOS, isso já é possível. Mas, para que a pessoa que recebeu a mensagem veja os coraçõezinhos animados, ela precisa ter essa função ativada no próprio app também. Porém, o Android está excluído da brincadeira por enquanto. Segundo o WABetaInfo, isso deve ser corrigido em breve, embora ainda não haja prazo.

3) Pausar e retomar gravação de áudio

Se você é daqueles que adora usar a função de mandar áudios no WhatsApp, com certeza já ou por alguma situação em que precisou interromper a gravação de uma mensagem — e, às vezes, teve de recomeçá-la ou mandar outro áudio com a sequência do que estava dizendo. Pois agora já é possível parar de gravar e, depois, retomar, sem para isso precisar fazer dois áudios separadamente.

Para implementar a função, o WhatsApp criou um botão de "pausa" à esquerda do botão de envio do áudio. Assim, você pode pausar e até ouvir antes de enviar, ou descartar o áudio se achar que não ficou bom o suficiente.

Mais uma vez, no entanto, só o WhatsApp Beta do iOS foi contemplado até o momento. Em breve, a novidade deve surgir no Android também.

4) Migração de histórico do Android para iOS

Essa é uma inovação que ainda está em desenvolvimento, mas que há tempos é requisitada pelo público do WhatsApp: a possibilidade de migrar o histórico de conversas do Android para o iOS. Isso é necessário para não perder tudo que já foi dito ao trocar o seu smartphone para um outro com sistema operacional diferente.

Atualmente, já é possível fazer o caminho inverso — migrar do iOS para o Android — mas apenas se o celular Android seja Samsung ou Google Pixel. O plano é que isso seja expandido para todos os smartphones com o sistema Android 12. Mas agora o WABetaInfo confirmou que a migração de Android para iOS está sendo produzida, e deve ser lançada também em breve.

Por enquanto, vale ressaltar que ela será para a versão Beta do app. A função é opcional e pedirá sua permissão antes de fazer a migração. Ainda não há uma previsão de lançamento.

5) Confirmação em duas etapas no WhatsApp Web

Talvez você já utilize o sistema de segurança do WhatsApp chamado de "confirmação em duas etapas", que ajuda a proteger seus dados. Por meio dele, toda vez que você a o WhatsApp em um dispositivo novo, uma senha de seis dígitos é requisitada. De forma periódica, o WhatsApp também faz com que você insira essa senha para continuar navegando no app. A ideia é que, dessa forma, apenas você, em posse dessa senha, possa utilizar sua conta no WhatsApp.

Só que tudo isso é válido apenas para a versão móvel do app. Atualmente, não existe confirmação em duas etapas na versão web do WhatsApp. De acordo com o WABetaInfo, isso está prestes a mudar: o aplicativo está trabalhando na criação de uma confirmação em duas etapas para ser usada no desktop.

Dessa forma, apenas você poderá ar o seu WhatsApp Web, já que a senha também será exigida no navegador do computador. Essa novidade ainda está sendo desenvolvida, sem previsão de lançamento.