edit.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  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. if (url) {
  53. history.replaceState({}, null, '/edit/' + name);
  54. showLink(name);
  55. }
  56. });
  57. };
  58. var formDidClear = () => {
  59. var name = nameFrom(location.pathname),
  60. url = ($url.value || '').trim();
  61. $url.value = '';
  62. urlDidChange();
  63. if (!name) {
  64. return;
  65. }
  66. xhr.create('DELETE', '/api/url/' + name)
  67. .send()
  68. .onDone((data: string, status: number) => {
  69. var msg = <Msg>JSON.parse(data);
  70. if (!msg.ok) {
  71. showError(msg.error);
  72. }
  73. });
  74. };
  75. var hideDrawer = () => {
  76. dom.css($cmp, 'transform', 'scaleY(0)');
  77. };
  78. var showError = (msg: string) => {
  79. $cmp.textContent = '';
  80. $cmp.classList.remove('link');
  81. $cmp.classList.add('fuck');
  82. var $s = dom.c('span');
  83. $s.textContent = 'ERROR: ' + msg;
  84. $cmp.appendChild($s);
  85. dom.css($cmp, 'transform', 'scaleY(1)');
  86. };
  87. var showLink = (name: string) => {
  88. var lnk = location.origin + '/' + name;
  89. $cmp.textContent = '';
  90. $cmp.classList.remove('fuck');
  91. $cmp.classList.add('link');
  92. var $a = dom.c('a');
  93. $a.setAttribute('href', lnk);
  94. $a.textContent = lnk;
  95. $cmp.appendChild($a);
  96. var $h = dom.c('span');
  97. $h.classList.add('hnt');
  98. $h.textContent = copyKey();
  99. $cmp.appendChild($h);
  100. dom.css($cmp, 'transform', 'scaleY(1)');
  101. getSelection().setBaseAndExtent($a, 0, $a, 1);
  102. };
  103. // Called when the app loads initially.
  104. var appDidLoad = () => {
  105. windowDidResize();
  106. window.addEventListener('resize', windowDidResize, false);
  107. $frm.addEventListener('submit', formDidSubmit, false);
  108. $url.addEventListener('keyup', urlDidChange, false);
  109. $url.addEventListener('paste', urlDidChange, false);
  110. $url.addEventListener('change', urlDidChange, false);
  111. $cls.addEventListener('click', formDidClear, false);
  112. var name = nameFrom(location.pathname);
  113. if (!name) {
  114. $url.focus();
  115. return;
  116. }
  117. xhr.get('/api/url/' + name)
  118. .send()
  119. .onDone((data: string, status: number) => {
  120. var msg = <MsgRoute>JSON.parse(data);
  121. if (status != 200) {
  122. return;
  123. }
  124. // TODO(knorton): Hanlde things.
  125. var url = msg.route.url || '';
  126. $url.value = url;
  127. $url.focus();
  128. urlDidChange();
  129. });
  130. };
  131. var $frm = <HTMLFormElement>dom.q('form'),
  132. $cmp = dom.q('#cmp'),
  133. $cls = dom.q('#cls'),
  134. $url = <HTMLInputElement>dom.q('#url'),
  135. lastUrl: string;
  136. appDidLoad();
  137. }