index.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. (function() {
  2. var $frm = $('form'),
  3. $cmp = $('#cmp'),
  4. $cls = $('#cls'),
  5. $url = $('#url'),
  6. copyKey = navigator.userAgent.indexOf('Macintosh') >= 0 ? '⌘-C' : 'Ctrl-C',
  7. lastUrl;
  8. var $e = function(name) {
  9. return $(document.createElement(name));
  10. };
  11. var resize = function() {
  12. var rect = $frm.get(0).getBoundingClientRect();
  13. $frm.css('margin-top', window.innerHeight/3 - rect.height/2);
  14. };
  15. var nameFrom = function(uri) {
  16. var parts = uri.substring(1).split('/');
  17. return parts[1];
  18. };
  19. var load = function() {
  20. var name = nameFrom(location.pathname);
  21. $.ajax({
  22. url: '/api/url/' + name,
  23. dataType: 'json'
  24. }).always(function(data) {
  25. if (!data.ok) {
  26. showError(data.error);
  27. return;
  28. }
  29. var route = data.route,
  30. url = route && route.url || '';
  31. $url.val(url).focus();
  32. urlDidChange();
  33. });
  34. }
  35. var showLink = function(name, src) {
  36. var lnk = '/' + name;
  37. if (src != '') {
  38. lnk = src + lnk;
  39. } else {
  40. lnk = location.origin + lnk;
  41. }
  42. $cmp.text('')
  43. .removeClass('fuck')
  44. .addClass('link');
  45. var a = $(document.createElement('a'))
  46. .attr('href', lnk)
  47. .text(lnk)
  48. .appendTo($cmp);
  49. var h = $(document.createElement('span'))
  50. .addClass('hnt')
  51. .text(copyKey)
  52. .appendTo($cmp);
  53. $cmp.css('transform', 'scaleY(1)');
  54. getSelection().setBaseAndExtent(a.get(0), 0, a.get(0), 1);
  55. };
  56. var showError = function(message) {
  57. $cmp.text('')
  58. .removeClass('link')
  59. .addClass('fuck');
  60. $e('span').text('ERROR: ' + message)
  61. .appendTo($cmp);
  62. $cmp.css('transform', 'scaleY(1)');
  63. };
  64. var hideDrawer = function() {
  65. $cmp.css('transform', 'scaleY(0)');
  66. };
  67. var urlDidChange = function() {
  68. var url = $url.val().trim();
  69. if (url == lastUrl) {
  70. return;
  71. }
  72. lastUrl = url;
  73. hideDrawer();
  74. if (url) {
  75. $cls.fadeIn(200);
  76. } else {
  77. $cls.fadeOut(200);
  78. }
  79. };
  80. $frm.on('submit', function(e) {
  81. e.preventDefault();
  82. var name = nameFrom(location.pathname),
  83. url = $url.val().trim();
  84. $.ajax({
  85. type: 'POST',
  86. url : '/api/url/' + name,
  87. data : JSON.stringify({ url : url }),
  88. dataType : 'json'
  89. }).always(function(data) {
  90. if (!data.ok) {
  91. showError(data.error);
  92. return;
  93. }
  94. var route = data.route;
  95. if (!route) {
  96. hideDrawer();
  97. return;
  98. }
  99. var url = route.url || '',
  100. name = route.name || '';
  101. src = route.source_host || '';
  102. if (url) {
  103. history.replaceState({}, null, '/edit/' + name);
  104. showLink(name, src);
  105. }
  106. });
  107. });
  108. $url.on('keydown', urlDidChange)
  109. .on('paste', urlDidChange)
  110. .on('change', urlDidChange);
  111. $cls.on('click', function(e) {
  112. $url.val('');
  113. $frm.submit();
  114. urlDidChange();
  115. });
  116. window.addEventListener('resize', resize);
  117. resize();
  118. urlDidChange();
  119. load();
  120. })();