git-io-addon/script.js

253 lines
7.5 KiB
JavaScript

var GitIO = function ( )
{
var API_ENDPOINT = 'http://git.io/'
this.invoke = function ( command, params, response_callback )
{
if( 'generate' == command )
{ requestForShortenUrl
( params.url
, params.code
, function ( data )
{ response_callback( data ) }
)
}
}
var requestForShortenUrl = function ( url, code, callback )
{
var xhr = new XMLHttpRequest( )
var form_data = new FormData( )
form_data.append( 'url', url )
if( code )
{ form_data.append( 'code', code ) }
xhr.onload = function ( e )
{
if( 201 == this.status )
{ callback
({ 'status': 'OK'
, 'shortened_url' : this.getResponseHeader( 'Location' )
})
}
else
{ callback
({ 'status' : 'Error'
, 'error' :
{ 'code' : this.status
, 'message' : this.responseText
}
})
}
}
xhr.open( 'POST', API_ENDPOINT, true )
xhr.send( form_data )
}
}
chrome.extension.onRequest.addListener
( function ( request, sender, sendResponse )
{ GitIO.invoke( request.command, request.params, sendResponse ) }
)
localStorage.getItem( 'notFirstRun', function ( arr )
{
if( arr['notFirstRun'] ) return
var shrtList =
{ 'http://git.io/help' : 'https://github.com/blog/985-git-io-github-url-shortener'
, 'http://git.io/nn' : 'https://github.com/noformnocontent'
, 'http://git.io/chrome' : 'https://github.com/noformnocontent/git-io-chrome'
}
localStorage.setItem( 'shrtList', shrtList )
localStorage.setItem( 'notFirstRun', true )
})
var shrt_field = document.getElementById( 'shortened-url' )
, url_field = document.getElementById( 'full-url' )
, notifications = document.getElementById( 'notifications' )
, message_field = document.getElementById( 'message' )
, action_button = document.getElementById( 'action-button' )
, show_all_recent_links = document.getElementById( 'show-all-recent-links' )
, clear_list = document.getElementById( 'clear-list' )
, recent_links = document.getElementById( 'recent-links' )
, lis = recent_links.getElementsByTagName( 'li' )
var shrtLink = function ( )
{ getShortenedUrl( ) }
action_button.addEventListener( 'click', shrtLink )
localStorage.getItem( function ( arr )
{ for( var k in arr )
{ createShrtListElement( k, arr[k]) }
})
var setMessage = function ( message )
{ message_field.innerHTML = message }
var copyResultToClipboard = function ( field )
{
field.select( )
document.execCommand( 'Copy' )
notifications.classList.remove( 'error' )
notifications.classList.add( 'done' )
setMessage( 'Link is copied to the clipboard.' )
}
var bindBtnToCoopy = function ( )
{
action_button.removeEventListener( 'click', shrtLink, false )
action_button.addEventListener( 'click', function ( )
{ copyResultToClipboard( shrt_field ) })
action_button.innerHTML = 'cpy!'
action_button.classList.remove( 'error' )
action_button.classList.add( 'done' )
notifications.classList.remove( 'error' )
notifications.classList.add( 'done' )
setMessage( 'You can now copy the link by clicking “cpy!”'
+ ' It will also stay in your shrt-list if you ever need it again.'
)
}
var createShrtListElement = function ( shrt, fullUrl, flashListsElement )
{
if( !/^https?:\/\/git\.io\/.+/.test( shrt ) ) return
var listElement = document.createElement( 'li' )
, listInput = document.createElement( 'input' )
, listVisit = document.createElement( 'a' )
, listCopy = document.createElement( 'a' )
listInput.value = shrt
listInput.type = 'text'
listInput.readOnly = true
listVisit.href = shrt
listVisit.target = '_new'
listVisit.title = 'Open link in new tab'
listVisit.appendChild( document.createTextNode( '' ))
listCopy.href = '#copy'
listCopy.title = 'Copy link to clipboard'
listCopy.appendChild( document.createTextNode( '' ))
listCopy.addEventListener( 'click', function ( e )
{
copyResultToClipboard
( e.currentTarget.parentNode
.getElementsByTagName( 'input' )[0]
)
e.preventDefault( )
})
listElement.title = fullUrl
listElement.appendChild( listInput )
listElement.appendChild( listVisit )
listElement.appendChild( listCopy )
if( flashListsElement )
{ listElement.classList.add( 'current' ) }
recent_links.insertBefore
( listElement, recent_links.firstChild )
testShrtListLength( )
}
var getShortenedUrl = function ( )
{
var request_data =
{ 'command': 'generate'
, 'params':
{ 'url': url_field
, 'code': shrt_field.value
}
}
chrome.extension.sendRequest( request_data, function ( data )
{
if( 'OK' == data.status )
{
// TODO: notice if sent and recived shortened are different
shrt_field.value = data.shortened_url
bindBtnToCoopy( )
localStorage.getItem( data.shortened_url, function ( arr )
{
if( !arr[data.shortened_url] )
{
var urlPair = { }
urlPair[data.shortened_url] = tab.url
localStorage.setItem( urlPair )
}
else
{ // bump to the top and '.current' the one in the list
}
})
}
else if( 'Error' == data.status )
{
action_button.innerHTML = 'rrr!'
action_button.classList.remove( 'done' )
action_button.classList.add( 'error' )
notifications.classList.remove( 'done' )
notifications.classList.add( 'error' )
setMessage( data.error.code + ': ' + data.error.message )
}
else
{
action_button.innerHTML = '??!'
action_button.classList.remove( 'done' )
action_button.classList.add( 'error' )
notifications.classList.remove( 'done' )
notifications.classList.add( 'error' )
setMessage( data.status )
}
})
}
var testShrtListLength = function ( )
{
if( lis.length > 3 )
{
show_all_recent_links.style.display = 'block'
show_all_recent_links.getElementsByTagName( 'li' )[0]
.innerHTML = '▾ show ' + ( lis.length-3 ) + ' more ▾'
show_all_recent_links.addEventListener( 'click', function ( )
{
for( var i = 3; i < lis.length; i++ )
{ lis[i].style.display = 'block' }
show_all_recent_links.style.display = 'none'
clear_list.style.display = 'block'
clear_list.addEventListener( 'click', function ( )
{
while( lis[0] )
{ lis[0].parentNode.removeChild( lis[0]) }
localStorage.clear( )
localStorage.setItem( 'notFirstRun', true )
clear_list.style.display = 'none'
})
})
}
}
chrome.storage.onChanged.addListener( function ( changes, namespace )
{
for( key in changes )
{ if( changes[key].newValue )
{ createShrtListElement( key, changes[key], true ) }
}
})