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

WhatsApp: 4 recursos novos que chegaram e você não percebeu

Pessoa digita mensagem no WhatsApp - Asterfolio/ Unsplash
Pessoa digita mensagem no WhatsApp Imagem: Asterfolio/ Unsplash

Letícia Naísa

De Tilt, em São Paulo

06/11/2021 16h21

De tanto usar o aplicativo de mensagens todos os dias, algumas ferramentas novas podem ar batido. Tudo o que está ali hoje nem sempre esteve, coisa ou outra é novidade.

Para te atualizar sobre as últimas do WhatsApp, Tilt reuniu quatro das últimas atualizações do app para você ficar por dentro.

Editor de mídia web

Na versão para computador do aplicativo, agora é possível editar uma imagem antes de enviá-la para alguém. Antes dessa atualização, era preciso fazer qualquer alteração em fotos pelo celular. Mandar uma mensagem com uma foto com escritos, por exemplo, era impossível.

A atualização surgiu em agosto. Ao enviar uma foto, surge no topo da janela uma série de opções de edição. Além de poder recortar e girar a imagem, é possível colar emojis, figurinhas dos seus favoritos, escrever um texto ou desenhar com uma "canetinha". É possível escolher cores para incrementar o desenho.

Preview de links

Antes de enviar algum link, agora é possível ver uma pré-visualização do que será compartilhado. A atualização permite ter mais contexto sobre o conteúdo que será enviado.

Sugestões de figurinha

Os dias da figurinha "Pera, tô caçando a figurinha" estão contados. Na nova versão do WhatsApp, estão disponíveis sugestões de figurinha de acordo com o que foi digitado antes para que você não perca o timing da conversa — nem a piada.

Guia de negócios

Nem sempre é fácil entrar em contato com alguma loja, principalmente se ela não tem site ou não tem telefone disponível na internet. Para ajudar clientes a encontrarem estabelecimentos, o WhatsApp expandiu a ferramenta Guia de Negócios para mais usuários na cidade de São Paulo. É possível ver uma lista de lojas que atendem via WhatsApp no seu bairro fazendo o seguinte:

  • Clique no ícone de nova conversa (o balãozinho verde no canto inferior direito da tela)
  • Escolha a opção "Empresas perto de você"
  • Ative a localização ou escolha algum bairro da lista disponível
  • Selecione o tipo de estabelecimento que você procura
  • Procure a loja com a qual você quer entrar em contato na lista disponível