script.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. const form = document.querySelector("form");
  2. const fileInput = document.querySelector(".file-input");
  3. const progressArea = document.querySelector(".progress-area");
  4. const uploadedArea = document.querySelector(".uploaded-area");
  5. // form click event
  6. form.addEventListener("click", () => {
  7. fileInput.click();
  8. });
  9. fileInput.onchange = ({
  10. target
  11. }) => {
  12. let file = target.files[0];
  13. if (file) {
  14. let fileName = file.name;
  15. if (fileName.length >= 12) {
  16. let splitName = fileName.split('.');
  17. fileName = splitName[0].substring(0, 13) + "... ." + splitName[1];
  18. }
  19. uploadFile(fileName);
  20. }
  21. }
  22. // file upload function
  23. function uploadFile(name) {
  24. let fileSize;
  25. let xhr = new XMLHttpRequest();
  26. xhr.open("POST", "index.php");
  27. xhr.upload.addEventListener("progress", ({
  28. loaded,
  29. total
  30. }) => {
  31. let fileLoaded = Math.floor((loaded / total) * 100);
  32. let fileTotal = Math.floor(total / 1000);
  33. (fileTotal < 1024) ? fileSize = fileTotal + " KB": fileSize = (loaded / (1024 * 1024)).toFixed(2) + " MB";
  34. let progressHTML = `<li class="row">
  35. <i class="fas fa-file-alt"></i>
  36. <div class="content">
  37. <div class="details">
  38. <span class="name">${name} • Uploading</span>
  39. <span class="percent">${fileLoaded}%</span>
  40. </div>
  41. <div class="progress-bar">
  42. <div class="progress" style="width: ${fileLoaded}%"></div>
  43. </div>
  44. </div>
  45. </li>`;
  46. // uploadedArea.innerHTML = ""; //uncomment this line if you don't want to show upload history
  47. uploadedArea.classList.add("onprogress");
  48. progressArea.innerHTML = progressHTML;
  49. });
  50. let data = new FormData(form);
  51. xhr.send(data);
  52. xhr.onload = function() {
  53. var api_reply = JSON.parse(xhr.responseText);
  54. if (api_reply['status'] == "OK") {
  55. let url = window.location.href + api_reply['path'];
  56. progressArea.innerHTML = "";
  57. let uploadedHTML = `<li class="row">
  58. <div class="content upload">
  59. <i class="fas fa-file-alt"></i>
  60. <div class="details">
  61. <span class="name">${name} [${fileSize}] <i class="fas fa-check"></i></span>
  62. <span class="small"><a href="${url}">${url}</a></span>
  63. </div>
  64. </div>
  65. <i onclick="copyTextToClipboard('${url}',this)" class="fas fa-clipboard"></i>
  66. </li>`;
  67. uploadedArea.classList.remove("onprogress");
  68. // uploadedArea.innerHTML = uploadedHTML; //uncomment this line if you don't want to show upload history
  69. uploadedArea.insertAdjacentHTML("afterbegin", uploadedHTML); //remove this line if you don't want to show upload history
  70. } else if (api_reply['status'] == "FAIL") {
  71. let error = api_reply['msg'];
  72. progressArea.innerHTML = "";
  73. let uploadedHTML = `<li class="row">
  74. <div class="content upload">
  75. <i class="fas fa-file-alt"></i>
  76. <div class="details">
  77. <span class="name">${name} [${fileSize}]</span>
  78. <span class="small">${error}</a></span>
  79. </div>
  80. </div>
  81. <i class="fas fa-exclamation-triangle"></i>
  82. </li>`;
  83. uploadedArea.classList.remove("onprogress");
  84. // uploadedArea.innerHTML = uploadedHTML; //uncomment this line if you don't want to show upload history
  85. uploadedArea.insertAdjacentHTML("afterbegin", uploadedHTML); //remove this line if you don't want to show upload history
  86. }
  87. }
  88. }
  89. // Fallback function to copy text to clipboard
  90. function fallbackCopyTextToClipboard(text) {
  91. var textArea = document.createElement("textarea");
  92. textArea.value = text;
  93. // Avoid scrolling to bottom
  94. textArea.style.top = "0";
  95. textArea.style.left = "0";
  96. textArea.style.position = "fixed";
  97. document.body.appendChild(textArea);
  98. textArea.focus();
  99. textArea.select();
  100. try {
  101. var successful = document.execCommand('copy');
  102. var msg = successful ? 'successful' : 'unsuccessful';
  103. console.log('Fallback: Copying text command was ' + msg);
  104. } catch (err) {
  105. console.error('Fallback: Oops, unable to copy', err);
  106. }
  107. document.body.removeChild(textArea);
  108. }
  109. // Main function to copy text to clipboard
  110. function copyTextToClipboard(text,el) {
  111. if (!navigator.clipboard) {
  112. fallbackCopyTextToClipboard(text);
  113. }
  114. else{
  115. navigator.clipboard.writeText(text).then(
  116. function() {
  117. console.log('Async: Copying to clipboard was successful!');
  118. }, function(err) {
  119. console.error('Async: Could not copy text: ', err);
  120. }
  121. );
  122. }
  123. el.className = "fas fa-check";
  124. setTimeout(()=> {
  125. el.className = "fas fa-clipboard";
  126. },3000);
  127. }