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

'Ubercóptero' oferece voos via app em Manhattan por US$ 200

Mike Segar - 2.out.2019/Reuters
Imagem: Mike Segar - 2.out.2019/Reuters

Claire Ballentine

03/10/2019 13h18

Na próxima vez em que você estiver preso no trânsito a caminho do Aeroporto Internacional John F. Kennedy, em Nova York, vai poder dizer: "Talvez devêssemos pegar um helicóptero".

O Uber Technologies agora oferece o serviço Uber Copter em Nova York a todos os usuários do aplicativo, segundo anúncio da empresa na quinta-feira. Anteriormente, apenas usuários Platinum e Diamond tinham o aos voos de helicóptero, que começaram a operar em 9 de julho.

Os usuários do Uber têm uma janela de quatro horas, entre 14h e 18h, para reservar um Uber Copter durante o horário de pico nos dias úteis. Uma viagem de ida custa entre US$ 200 e US$ 225 por pessoa.

"O foco no curto prazo é oferecer isso para todos os usuários, demonstrar essa visão de conexão perfeita entre carros e helicópteros", diz Eric Allison, que comanda o Uber Elevate, o braço aéreo da empresa.

Com o aplicativo, os clientes podem agendar um voo com até cinco dias de antecedência, enquanto houver assentos disponíveis. Assim como os trajetos de carro do Uber, os preços variam de acordo com a demanda. Por enquanto, dois helicópteros serão usados para fazer as viagens.

O trajeto tem três paradas. Primeiro, um veículo Uber pega os ageiros e os leva para o heliporto de Downtown Manhattan. Para viagens ao JFK, o Uber limitou os pontos de parada a locais abaixo da Houston Street, que a empresa diz serem projetados para maximizar o tempo dos clientes. "Se você mora no Upper West Side, fazer uma viagem para o lower Manhattan e depois um voo de helicóptero para o JFK pode não fazer muito sentido", diz Anil Nathan, gerente-geral de aviação do Uber. A regra "abaixo da Houston" não se aplica se você estiver voando do JFK para o heliporto. Após o pouso no heliporto, um motorista do Uber pode levá-lo a qualquer destino, mesmo que esteja acima da Houston Street.

O voo em si leva cerca de oito minutos, seguido de um trajeto em um veículo Uber a partir do heliporto próximo ao terminal 8 no JFK até o terminal escolhido pelo ageiro.

As viagens podem ser reservadas por meio de uma solicitação no aplicativo Uber, em vez de três separadas, embora os clientes recebam um recibo da conta por e-mail para cada uma delas.

O Uber está usando helicópteros operados pela empresa HeliFlite, com sede em Newark, e tem dois pilotos em cada voo. Um máximo de oito pessoas estarão a bordo.

A viagem de três etapas pode levar apenas 30 minutos, enquanto o mesmo trajeto de carro de Manhattan dura uma hora ou mais, dependendo do trânsito. Em transporte público, o trajeto geralmente leva de 50 a 75 minutos.