edit.ts 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /// <reference path="lib/dom.ts" />
  2. /// <reference path="lib/types.ts" />
  3. /// <reference path="lib/xhr.ts" />
  4. namespace go {
  5. // Get the OS-specific shortcut key for copying.
  6. var copyKey = () => navigator.userAgent.indexOf('Macintosh') >= 0
  7. ? '⌘-C'
  8. : 'Ctrl-C';
  9. // Extract the name from the page location.
  10. var nameFrom = (uri: string) => {
  11. var parts = uri.substring(1).split('/');
  12. return parts[1];
  13. };
  14. // Called with the window resizes.
  15. var windowDidResize = () => {
  16. var rect = $frm.getBoundingClientRect();
  17. dom.css($frm, 'margin-top', (window.innerHeight / 3 - rect.height / 2) + 'px');
  18. };
  19. // Called when the URL changes.
  20. var urlDidChange = () => {
  21. var url = ($url.value || '').trim();
  22. if (url == lastUrl) {
  23. return;
  24. }
  25. lastUrl = url;
  26. hideDrawer();
  27. if (url) {
  28. $cls.classList.add('vis');
  29. } else {
  30. $cls.classList.remove('vis');
  31. }
  32. };
  33. var formDidSubmit = (e: Event) => {
  34. e.preventDefault();
  35. var name = nameFrom(location.pathname),
  36. url = ($url.value || '').trim();
  37. xhr.post('/api/url/' + name)
  38. .sendJSON({ url: url })
  39. .onDone((data: string, status: number) => {
  40. var msg = <MsgRoute>JSON.parse(data);
  41. if (!msg.ok) {
  42. showError(msg.error);
  43. return;
  44. }
  45. var route = msg.route;
  46. if (!route) {
  47. hideDrawer();
  48. return;
  49. }
  50. var url = route.url || '',
  51. name = route.name || '',
  52. host = route.source_host || '';
  53. if (url) {
  54. history.replaceState({}, null, '/edit/' + name);
  55. showLink(name, host);
  56. }
  57. });
  58. };
  59. var formDidClear = () => {
  60. var name = nameFrom(location.pathname),
  61. url = ($url.value || '').trim();
  62. $url.value = '';
  63. urlDidChange();
  64. if (!name) {
  65. return;
  66. }
  67. xhr.create('DELETE', '/api/url/' + name)
  68. .send()
  69. .onDone((data: string, status: number) => {
  70. var msg = <Msg>JSON.parse(data);
  71. if (!msg.ok) {
  72. showError(msg.error);
  73. }
  74. });
  75. };
  76. var hideDrawer = () => {
  77. dom.css($cmp, 'transform', 'scaleY(0)');
  78. };
  79. var showError = (msg: string) => {
  80. $cmp.textContent = '';
  81. $cmp.classList.remove('link');
  82. $cmp.classList.add('fuck');
  83. var $s = dom.c('span');
  84. $s.textContent = 'ERROR: ' + msg;
  85. $cmp.appendChild($s);
  86. dom.css($cmp, 'transform', 'scaleY(1)');
  87. };
  88. var showLink = (name: string, src: string) => {
  89. var lnk = '/' + name;
  90. if (src != '') {
  91. lnk = src + lnk;
  92. } else {
  93. lnk = location.origin + lnk;
  94. }
  95. $cmp.textContent = '';
  96. $cmp.classList.remove('fuck');
  97. $cmp.classList.add('link');
  98. var $a = dom.c('a');
  99. $a.setAttribute('href', lnk);
  100. $a.textContent = lnk;
  101. $cmp.appendChild($a);
  102. var $h = dom.c('span');
  103. $h.classList.add('hnt');
  104. $h.textContent = copyKey();
  105. $cmp.appendChild($h);
  106. dom.css($cmp, 'transform', 'scaleY(1)');
  107. getSelection().setBaseAndExtent($a, 0, $a, 1);
  108. };
  109. // Called when the app loads initially.
  110. var appDidLoad = () => {
  111. windowDidResize();
  112. window.addEventListener('resize', windowDidResize, false);
  113. $frm.addEventListener('submit', formDidSubmit, false);
  114. $url.addEventListener('keyup', urlDidChange, false);
  115. $url.addEventListener('paste', urlDidChange, false);
  116. $url.addEventListener('change', urlDidChange, false);
  117. $cls.addEventListener('click', formDidClear, false);
  118. var name = nameFrom(location.pathname);
  119. if (!name) {
  120. $url.focus();
  121. return;
  122. }
  123. xhr.get('/api/url/' + name)
  124. .send()
  125. .onDone((data: string, status: number) => {
  126. var msg = <MsgRoute>JSON.parse(data);
  127. if (status != 200) {
  128. return;
  129. }
  130. // TODO(knorton): Hanlde things.
  131. var url = msg.route.url || '';
  132. $url.value = url;
  133. $url.focus();
  134. urlDidChange();
  135. });
  136. };
  137. var $frm = <HTMLFormElement>dom.q('form'),
  138. $cmp = dom.q('#cmp'),
  139. $cls = dom.q('#cls'),
  140. $url = <HTMLInputElement>dom.q('#url'),
  141. lastUrl: string;
  142. appDidLoad();
  143. }