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

Pausa ao gravar áudio e mais: 3 novidades no WhatsApp que chegam em breve

 Carl Court (Getty Images)
Imagem: Carl Court (Getty Images)

Renata Baptista

De Tilt, em São Paulo

22/11/2021 20h29

Ao longo deste ano, quem usa o WhatsApp pôde conferir várias novas funções no aplicativo. Entre elas, a tão esperada possibilidade de acelerar áudios, fotos e vídeos de visualização única e opção de pagamentos. Mas as novidades não devem parar por aí.

De acordo com o site especializado WABetaInfo, famoso por antecipar notícias sobre o app de mensagens, muita coisa vem sendo testada para, em breve, chegar a todos os usuários. Confira algumas delas:

Pausa na gravação de um áudio

Já informamos por aqui quando o WhatsApp começou a testar a função que permite ouvir áudio antes de enviá-lo na mensagem. Agora, o aplicativo está trabalhando na possibilidade de deixar que os áudios sejam gravados em etapas.

Com isso, você pode começar a gravar um áudio, pausar a gravação caso precise recuperar o fôlego, ou reorganizar as ideias, para em seguida voltar a gravar sem perder o que já havia sido dito.

O recurso já está disponível para alguns testadores beta.

Outra novidade relativa aos áudios: o controle de velocidade na reprodução deve ser aplicado em breve também às mídias encaminhadas. Hoje só podemos alterar a velocidade de uma mensagem de voz que nos foi enviada diretamente, mas de acordo com o WABetaInfo, isso será corrigido e vamos poder acelerar o que nos for encaminhado numa conversa individual ou num grupo.

"Meus contatos, exceto..."

Ainda está em teste para alguns testadores beta, mas já anunciamos aqui em Tilt uma nova ferramenta no aplicativo que pode ajudar a reforçar a sua privacidade. A novidade é que, além de ocultar a informação do horário do "Visto por último" de alguns contatos específicos, será possível ainda esconder deles suas informações e sua foto de perfil.

Antes, só era possível escolher entre três configurações para definir quem quem pode ou não saber a última vez em que você esteve online: "todos", "ninguém" ou "meus contatos". Já com a nova função, a opção "Meus contatos, exceto..." surge na lista de configurações de privacidade, possibilitando que você aponte de quem quer ocultar a informação.

Uma nova interface para PCs

De acordo com informações do WABetaInfo, uma nova versão desktop do aplicativo, redesenhada para o Windows e para o macOS Catalyst, vai surgir com uma nova interface, diferente da que estamos acostumados.

Entre as novidades da nova função, está uma ferramenta de desenho, permitindo ao usuário criar imagens na hora com algo semelhante a uma caneta ou um pincel.

Nova interface do WhatsApp para PCs - WABetaInfo/Reprodução - WABetaInfo/Reprodução
Imagem: WABetaInfo/Reprodução