You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. const endpointContainer = document.getElementById('endpoint-container');
  2. const getEndpointsBtn = document.getElementById('get-endpoints-btn');
  3. const resultContainer = document.getElementById('resultContainer');
  4. const detailsContainer = document.getElementById('detailsContainer');
  5. function getEndpoints() {
  6. fetch('https://swapi.co/api/')
  7. .then(function(response) {
  8. if (response.ok) {
  9. return response.json();
  10. }
  11. return Promise.reject('Oh ow');
  12. // throw new Error('Oh ow');
  13. })
  14. .then(function(jsonResponse) {
  15. addBtns(jsonResponse);
  16. })
  17. .catch(function(error) {
  18. console.log(error);
  19. });
  20. }
  21. function addBtns(response) {
  22. const btnHtml = Object.keys(response).reduce(function(html, responseKey) {
  23. return (
  24. html +
  25. '<button data-url="' +
  26. response[responseKey] +
  27. '">' +
  28. responseKey +
  29. '</button>'
  30. );
  31. }, '');
  32. endpointContainer.innerHTML = btnHtml;
  33. }
  34. function makeRequest(event) {
  35. if (event.target.matches('button')) {
  36. let btn = event.target;
  37. btn.disabled = true;
  38. let btnText = btn.innerHTML;
  39. btn.innerHTML = 'loading...';
  40. fetch(event.target.dataset.url)
  41. .then(function(response) {
  42. if (response.ok) {
  43. return response.json();
  44. }
  45. return Promise.reject(new Error('Request failed'));
  46. })
  47. .then(function(jsonResponse) {
  48. btn.innerHTML = btnText;
  49. btn.disabled = false;
  50. console.log(jsonResponse);
  51. resultContainer.innerHTML = printElements(jsonResponse.results);
  52. })
  53. .catch(function(error) {
  54. console.log(event.target);
  55. btn.innerHTML = 'Dikke fail...';
  56. btn.disabled = false;
  57. });
  58. }
  59. }
  60. function printElements(list) {
  61. return list.reduce(function(html, listItem) {
  62. return `
  63. ${html}
  64. <article>
  65. <p>${listItem.name ? listItem.name : listItem.title} </p>
  66. <button data-url="${listItem.url}">Show details </button>
  67. </article>
  68. `;
  69. }, '');
  70. }
  71. function printDetails(list) {
  72. // let newString = '';
  73. // Object.keys(list).map(function(item) {
  74. // newString += list[item] + ' ';
  75. // });
  76. // detailsContainer.innerHTML = newString;
  77. return Object.keys(list).reduce(function(html, detailKey) {
  78. debugger;
  79. return `
  80. ${html}
  81. <p>
  82. <strong>${detailKey}:</strong>
  83. ${details[detailKey]}
  84. </p>
  85. `;
  86. }, '');
  87. }
  88. function requestDetails(event) {
  89. if (event.target.matches('button')) {
  90. let btn = event.target;
  91. btn.disabled = true;
  92. let btnText = btn.innerHTML;
  93. btn.innerHTML = 'loading...';
  94. fetch(event.target.dataset.url)
  95. .then(function(response) {
  96. if (response.ok) {
  97. return response.json();
  98. }
  99. return Promise.reject(new Error('Request failed'));
  100. })
  101. .then(function(jsonResponse) {
  102. btn.innerHTML = btnText;
  103. btn.disabled = false;
  104. detailsContainer.innerHTML = printDetails(jsonResponse);
  105. })
  106. .catch(function(error) {
  107. console.log(event.target);
  108. btn.innerHTML = 'Dikke fail...';
  109. btn.disabled = false;
  110. });
  111. }
  112. }
  113. getEndpointsBtn.addEventListener('click', getEndpoints);
  114. endpointContainer.addEventListener('click', makeRequest);
  115. resultContainer.addEventListener('click', requestDetails);