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

Baú digital, GPS e evento: veja 3 recursos para ajudar sua vida no WhatsApp

WhatsApp tem funções que vão além da simples troca de mensagens - Reprodução
WhatsApp tem funções que vão além da simples troca de mensagens Imagem: Reprodução

Nicole D'Almeida

Colaboração para Tilt

28/08/2019 04h00

Não basta ser um dos principais aplicativos de troca de mensagens instantâneas do mundo, atingindo mais de 1,5 bilhão de usuários, o WhatsApp tem outras funções além do óbvio envio de mensagens e criação de grupos de amigos.

Recuperamos aqui então três dicas em que o WhatsApp extrapola seu objetivo principal e se torna um pequeno assistente pessoal. Pode servir como um pequeno baú digital para guardar anotações e arquivos diversos; compartilhar sua localização em tempo real para amigos e familiares que estejam esperando por você enquanto está no Uber; e anotar eventos no calendário para agendar sua vida.

Armazenar arquivos

Quer guardar alguma informação, seja link de sites, fotos, vídeos, documentos ou dados importantes? No WhatsApp você consegue criar um grupo apenas com você e compartilhar as informações, tendo-as sempre em mãos.

Vale lembrar que para criar um grupo é preciso ter ao menos duas pessoas, mas você pode excluir a outra assim que o grupo for feito.

Para isso:

  1. Toque no ícone de criar nova mensagem, localizado no canto superior direito (iOS) ou no canto inferior direito (Android).
  2. Toque em "Novo Grupo".
  3. Escolha um participante. Você pode usar o campo de busca para facilitar a procura. Clique nele.
  4. Toque em "Seguinte" (iOS) ou na seta verde no canto inferior direito (Android).
  5. Dê um nome para o grupo e toque em "Criar" (iOS) ou no botão verde com um tique (Android).

Como criar grupo no WhatsApp - Reprodução - Reprodução
Imagem: Reprodução

Para excluir a outra pessoa:

  1. Toque no nome do grupo.
  2. Toque na pessoa que será removida.
  3. Toque em "Remover do grupo" (iOS) ou "Remover [nome do contato]" (Android).
  4. Em seguida, "Remover" (iOS) ou "Ok" (Android).

Como remover pessoa de grupo do WhatsApp - Reprodução - Reprodução
Imagem: Reprodução

Compartilhar localização

Vai sair sozinho e quer que alguém fique a par de onde você se encontra? Você pode compartilhar sua localização com quem quiser. Siga os os:

  1. Na conversa desejada, toque no ícone de + ao lado da barra de digitação (iOS) ou no clipe (Android).
  2. Toque em "Localização". Talvez você tenha que dar permissão de uso da localização (GPS) ao WhatsApp.
  3. Toque em "Localização em tempo real".
  4. Escolha por quanto tempo você quer que a pessoa te acompanhe.
  5. Toque no ícone de enviar.

Compartilhar localização no WhatsApp - Reprodução - Reprodução
Imagem: Reprodução

Criar eventos no calendário

Está marcando de encontrar alguém pelo WhatsApp? É possível criar um evento no app Calendário do iPhone de forma ágil. Esse recurso só está disponível para iOS.

  1. Entre em uma conversa com um amigo com quem quer marcar o compromisso
  2. Escreva para ele uma mensagem com a data sugerida, como "30 de setembro de 2019"
  3. A mensagem com a data se tornou um link; toque nele.
  4. Toque em "Criar evento".
  5. Na janela seguinte, escreva os detalhes do evento e clique em "Adicionar"

Criar evento a partir do WhatsApp - Reprodução - Reprodução
Imagem: Reprodução

SIGA TILT NAS REDES SOCIAIS