{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":662726534,"defaultBranch":"main","name":"FSO_02","ownerLogin":"djanyreason","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2023-07-05T18:50:03.000Z","ownerAvatar":"https://github.com/avatars/u/105326181?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1688583005.0187452","currentOid":""},"activityList":{"items":[{"before":"0eff534cdb85847d8649a7c1b2ab71d56f34bec4","after":"f8d1a47eaade2890e1f4052a233d81e0efd7c504","ref":"refs/heads/main","pushedAt":"2024-03-20T21:51:37.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Update README.md\n\nUpdates README to better describe project","shortMessageHtmlLink":"Update README.md"}},{"before":"74da5f0dcdedcc4e7005bc64f44d1abb3978187e","after":"0eff534cdb85847d8649a7c1b2ab71d56f34bec4","ref":"refs/heads/main","pushedAt":"2024-03-20T21:45:58.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Update README.md\n\nUpdates README to better describe project","shortMessageHtmlLink":"Update README.md"}},{"before":"841f9a13b2c484acc00bc3931dae2d240f5c4c3d","after":"74da5f0dcdedcc4e7005bc64f44d1abb3978187e","ref":"refs/heads/main","pushedAt":"2024-03-20T21:36:33.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Update README.md\n\nUpdates README to better describe project","shortMessageHtmlLink":"Update README.md"}},{"before":"690065dc2cae595732e7e8c0a0930ca76b988920","after":"841f9a13b2c484acc00bc3931dae2d240f5c4c3d","ref":"refs/heads/main","pushedAt":"2024-03-20T17:59:32.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Update README.md\n\nAdds details about the projects in this repository.","shortMessageHtmlLink":"Update README.md"}},{"before":"518a70da9c18c2ee99f054dd3d6a703cb1638321","after":"690065dc2cae595732e7e8c0a0930ca76b988920","ref":"refs/heads/main","pushedAt":"2023-07-21T08:45:26.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Completes ex. 2.20, adds live weather service\n\nThis commit adds live weather report for the capital to the\nCountryInfo component. This is done through axios calls to\nopenweathermap, defined in services/weather.js. The weather is\npopulated in a state variable which is rendered at the end of the\nCountryInfo component, and is populated using useEffect.","shortMessageHtmlLink":"Completes ex. 2.20, adds live weather service"}},{"before":"f3b37b43604a0775289b5922419961249ed95f18","after":"518a70da9c18c2ee99f054dd3d6a703cb1638321","ref":"refs/heads/main","pushedAt":"2023-07-21T07:55:33.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Completes ex. 2.19, adds show detail buttons\n\nThis commit creates a Country component for each country listed by\nthe Countries component when the filter results in 2-10 total\ncountries. This component includes the country's name and a 'show'\nbutton which, when clicked, displays a CountryInfo component for that\ncountry (when displayed, the button changes to 'hide' which removes\nthe CountryInfo component when clicked).\n\nDisplaying the CountryInfo component and the button's text are both\nhandled using state variables in the Country component. Specifically,\nthe Country component includes a state variable after the button that\nis set to an empty
on initial render and is reset to an empty\n
when the hide button is clicked. When 'show' is clicked, an\naxios call is made to the data server (defined in getOne in\nrestcountries.js), with the result used to generate the CountryInfo\ncomponent.","shortMessageHtmlLink":"Completes ex. 2.19, adds show detail buttons"}},{"before":"b25624fe068b7849e7960221d076dd3c47a60fb3","after":"f3b37b43604a0775289b5922419961249ed95f18","ref":"refs/heads/main","pushedAt":"2023-07-20T20:25:00.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Completes ex. 2.18, creating country data app\n\nThis commit creates the basic country data app. It countains a filter\ncomponent which creates an input form, and a component that is either\na list of countries which match the filter term or detail for one\nspecific country when only one country matches. The filtering is\nhandled by a function defined in the App component and passed as a\nprop to the Filter component.","shortMessageHtmlLink":"Completes ex. 2.18, creating country data app"}},{"before":"2353350c97464618a8827b0d364b73933b522dc5","after":"b25624fe068b7849e7960221d076dd3c47a60fb3","ref":"refs/heads/main","pushedAt":"2023-07-20T18:44:57.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Adds axios service to communicate with REST server\n\nThis commit adds a file restcountries.js which contains two methods\nthat use axios to communicate with the REST API countries server, one\nwhich gets all countries, and the other which gets the detail for one\ncountry.","shortMessageHtmlLink":"Adds axios service to communicate with REST server"}},{"before":"fe90f7720c291d6354e869616eef4640e78af104","after":"2353350c97464618a8827b0d364b73933b522dc5","ref":"refs/heads/main","pushedAt":"2023-07-20T18:22:33.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Initial upload of default files","shortMessageHtmlLink":"Initial upload of default files"}},{"before":"20f26ec271c136466341d6168ab04a3cf598cb42","after":"fe90f7720c291d6354e869616eef4640e78af104","ref":"refs/heads/main","pushedAt":"2023-07-20T17:59:46.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Completes ex. 2.17, adding error message\n\nThis commit catches errors caused when an entry has already been\ndeleted from the server, but the update is not rendered locally\n(e.g., when another window deleted the entry). The commit adds a\ncatch to the phonebookService.remove call, which displays a red\nmessage saying the entry had already been deleted from the server.","shortMessageHtmlLink":"Completes ex. 2.17, adding error message"}},{"before":"23724bfb89f73251089c7a013bb38dc7f3a99518","after":"20f26ec271c136466341d6168ab04a3cf598cb42","ref":"refs/heads/main","pushedAt":"2023-07-20T15:25:22.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Fixes bugs for delete entry message, alert timing\n\nPreviously, alert messages for deleting entries were displayed\nregardless of whether the user confirmed or canceled the deletion. In\nadditon, in the previous commit, which aimed to preserve the most\nrecent alert message for the full 3 seconds even if it overlapped\nwith a previous message, I neglected to add the relevant code to the\ndeletion section. This casused me to miss that the new code added in\nthe previous commit was not using state correctly inside the\nsetTimeour functions.\n\nThis commit first corrects the delete entry alert messages, by moving\nthe code inside the appropriate if statement. It also corrects the\nfunctionality added in the previous commit, by adding a useRef\nvariable which points to the messageTimeouts state variable, and is\nused inside out the setTimeout functions. This addresses the issue,\nin which the setTimeout calls were using the state at the time they\nwere initialized, not at the end of the timeout.\n\nIn addition, this commit does a little bit of code cleanup by adding\na local function handleMessage to the App component which takes as a\nparameter a new message object and does all of the necessary steps to\nset it as the new message and set its timeout - this code was\nrepeated in multiple places previously, so making a local function to\nhandle it makes the code shorter and cleaner.","shortMessageHtmlLink":"Fixes bugs for delete entry message, alert timing"}},{"before":"cb1efeff382d565a213be360ae4c48d2be42f36b","after":"23724bfb89f73251089c7a013bb38dc7f3a99518","ref":"refs/heads/main","pushedAt":"2023-07-20T14:11:00.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Preserves most recent alert message for full 3 sec\n\nPreviously, each message was accompanied by a set timeout for 3\nseconds to reset the message to null. If you performed a new action\nduring those 3 seconds, the timeout would remove the alert from the\nnew action after the 3 seconds from the first action.\n\nThis commit adds a state variable that is incremented every time a\nalert message is set, and decremented every time an alert message 3\nsecond timeout completes. The setTimeout methods now only reset the\nalert to null if it is the last alert message (i.e., the state\nvariable is equal to 1).","shortMessageHtmlLink":"Preserves most recent alert message for full 3 sec"}},{"before":"0723d801716487b0dda9259351991696d23996b0","after":"cb1efeff382d565a213be360ae4c48d2be42f36b","ref":"refs/heads/main","pushedAt":"2023-07-20T13:56:14.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Completes ex. 2.16 adding alert messages on action\n\nThis commit adds a Notification component which displays alert\nmessages confirming successful completion of phonebook actions (e.g.,\nadding entry, changing number, deleting entry). The messages\nhave css styling defined in the component and disappear after 2\nseconds.\n\nThe Notification component takes as a prop a class with 2 members,\none being the text of the alert message and the other being the font\ncolor - this is so for future exercises error messages can be\ndisplayed in a different color.","shortMessageHtmlLink":"Completes ex. 2.16 adding alert messages on action"}},{"before":"3f6d4364b6a5067b269a3a3e9ddfcdd1dddf9bec","after":"0723d801716487b0dda9259351991696d23996b0","ref":"refs/heads/main","pushedAt":"2023-07-19T16:40:35.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Completes ex. 2.15, enabling phone number updates\n\nThis commit changes the behavior when a duplicate name is added so\nthat it will update the number of the entry, rather than rejecting\nthe addition. This first prompts the user saying the name is already\nin the phonebook and asking to confirm the update, then if confirmed\nwill make the update on the server and in the phonebook.","shortMessageHtmlLink":"Completes ex. 2.15, enabling phone number updates"}},{"before":"e350d9d58f9acfd6aa6aa071d2a237426149eb61","after":"3f6d4364b6a5067b269a3a3e9ddfcdd1dddf9bec","ref":"refs/heads/main","pushedAt":"2023-07-19T16:16:41.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Completes ex. 2.14, adding entry delete buttons\n\nThis commit adds a delete button to the Entry component which prompts\nthe user to confirm, then if confirmed removes the entry from the\nphonebook and from the server. The function to enable this is defined\nin the App component, then passed to each Entry component to be used\nas the onClick for the delete button.","shortMessageHtmlLink":"Completes ex. 2.14, adding entry delete buttons"}},{"before":"ab9cee2dc98370c3535254bee7d77213385070fc","after":"e350d9d58f9acfd6aa6aa071d2a237426149eb61","ref":"refs/heads/main","pushedAt":"2023-07-19T15:38:12.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Completes ex. 2.13, adding module for server comms\n\nThis commit adds services/entries.js which includes functions for\naxios server communicatons. The app module imports functions for\nserver communications from this new file, rather than importing\naxios, and uses these functions for all interactions with the server","shortMessageHtmlLink":"Completes ex. 2.13, adding module for server comms"}},{"before":"9d0a7d0b38b2b1a6875dd4423c71862ba6ac2804","after":"ab9cee2dc98370c3535254bee7d77213385070fc","ref":"refs/heads/main","pushedAt":"2023-07-19T15:17:49.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Completes exercise 2.12, saving data to server\n\nThis commit adds functionality to the App component so that entries\nadded to the phonebook are saved to the server, so they will persist\non reloading the page.","shortMessageHtmlLink":"Completes exercise 2.12, saving data to server"}},{"before":"0b77da7503dd2c4b37e81e60e553feb2eae348ba","after":"9d0a7d0b38b2b1a6875dd4423c71862ba6ac2804","ref":"refs/heads/main","pushedAt":"2023-07-19T14:47:05.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Moves add person function to App component\n\nWith the alphabetical sort removed, it made more sense to handle the\nfunction for adding a person to the phonebook to the App component,\nand pass that function to the PersonForm component. This way the\nPersonForm component does not have direct access to the list of\nentries, which is outside of its component.","shortMessageHtmlLink":"Moves add person function to App component"}},{"before":"fdbcc5cced6f95bcfbd89a0d46aea343e614e033","after":"0b77da7503dd2c4b37e81e60e553feb2eae348ba","ref":"refs/heads/main","pushedAt":"2023-07-19T14:26:20.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Removes alphabetical sort from phonebook entries\n\nFuture exercises for this project have us writing new entries to the\nserver, rather than just handling them locally. At this point in Full\nStack Open, we have not yet gotten to back-end development, so the\nwrites would just be handled by default axios json actions. In order\nto maintain an alphabetical sort, I would either have to overwrite\nthe entire server data on each write, or I would have to do a full\nsort on the starting data imported from the server - doing either of\nthese strikes me as too much for a front-end react app; it could be\ndone, but it just feels like front-end is the wrong place for this\nmuch.\n\nSince the alphabetical sort stuff was mostly a side-task I took on\nbecause it was more efficient big-O-wise, and I'm pretty sure FSO\nintends for us to use more straightforward javascript and mapping\nfunctions, I commented out the alphabetical sort functionality and\nun-commented the simpler non-sorting code.","shortMessageHtmlLink":"Removes alphabetical sort from phonebook entries"}},{"before":"9ec9cadfedee7beddd4405c08761a50a85dd2753","after":"fdbcc5cced6f95bcfbd89a0d46aea343e614e033","ref":"refs/heads/main","pushedAt":"2023-07-07T20:00:22.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Completes exercise 2.11 loads start data from json\n\nThis commit adds an Effect that uses an axios promise to load\nstarting data from the file db.json and then set the persons state\nto the loaded data.","shortMessageHtmlLink":"Completes exercise 2.11 loads start data from json"}},{"before":"cb6ffc005657daf15472740789d1775e0557fcba","after":"9ec9cadfedee7beddd4405c08761a50a85dd2753","ref":"refs/heads/main","pushedAt":"2023-07-07T19:54:29.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Adds/edits files for local DB read/write","shortMessageHtmlLink":"Adds/edits files for local DB read/write"}},{"before":"0503d3d2e54a0ff54fb57eaa63b3254a8dec7442","after":"cb6ffc005657daf15472740789d1775e0557fcba","ref":"refs/heads/main","pushedAt":"2023-07-07T14:26:33.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Completes exercises 2.9 and 2.10 adding a filter\n\nThis commit adds a filter to the phonebook, which displays only\nentries with names that contain the string entered into the filter\ntextbox. This is case insensitive. A seperate component is added for\nthe filter, and saved in a separate Filter.js file.\n\nAs the phonebook app is separated into multiple components in their\nown files, this completes exercise 2.10.","shortMessageHtmlLink":"Completes exercises 2.9 and 2.10 adding a filter"}},{"before":"8f90d7eed25e225e24ccdd0a60a120628028b5da","after":"0503d3d2e54a0ff54fb57eaa63b3254a8dec7442","ref":"refs/heads/main","pushedAt":"2023-07-07T01:18:06.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Completes exercise 2.8, adding phone number entry\n\nThis commit adds a second text entry field for phone number, and\nhas the phonebook list both names and numbers. It also moves the\ninput form to a new PersonForm component in a separate js file.","shortMessageHtmlLink":"Completes exercise 2.8, adding phone number entry"}},{"before":"38355f2c664f2fb46af48169efffe20be9f8ace9","after":"8f90d7eed25e225e24ccdd0a60a120628028b5da","ref":"refs/heads/main","pushedAt":"2023-07-06T23:54:06.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Adds Entry component for phonebook entries\n\nThis commit changes the list of entries from
's defined directly\nin the app component to an Entry component, which is defined in its\nown js file.","shortMessageHtmlLink":"Adds Entry component for phonebook entries"}},{"before":"3aef8e3ee57d6a3de23cc8fe6d97559fc82ec01e","after":"38355f2c664f2fb46af48169efffe20be9f8ace9","ref":"refs/heads/main","pushedAt":"2023-07-06T23:46:28.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Adds generic text field entry handler function\n\nThis commit adds a function that returns a function for handling text\nfield entry and updating state variables. It takes as a parameter the\nupdate state function for the associated text field entry, and\nreturns an event handler function which updates the correct state\nvariable associated with the text field.","shortMessageHtmlLink":"Adds generic text field entry handler function"}},{"before":"550125203746303e6ac3592cc3bae83a5e0514ca","after":"3aef8e3ee57d6a3de23cc8fe6d97559fc82ec01e","ref":"refs/heads/main","pushedAt":"2023-07-06T23:17:21.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Displays names in phonebook sorted alphabetically\n\nThis commit adds a new function to the App component which maintains\na sorting of the phonebook entries alphabetically by name, assuming\nthe list begins either empty or sorted. It also changes the check for\nrepeated entries to leverage the alphaabetical sort so that it runs\nin O(log(n)) time, rather than O(n).\n\nAlso - this commit addresses an oversight in the solution to exercise\n2.7 in the previous commit. The exercise asks for the comparison to\nreject duplicate names regardless of capitalization, but that was not\nimplemented in the previous commit. This commit fixes that, both in\nthe new comparison function and in the previous comparison (using\nreduce, now commented out but still present).","shortMessageHtmlLink":"Displays names in phonebook sorted alphabetically"}},{"before":"d10da739c40422aaaff5e045f333e2b3c2949b4c","after":"550125203746303e6ac3592cc3bae83a5e0514ca","ref":"refs/heads/main","pushedAt":"2023-07-06T20:18:51.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Completes exercise 2.7 preventing duplicate names\n\nThis commit adds functionality to the form submit button handler that\nuses the array reduce method to test if the name being submitted is\nalready a part of the names array. If it is, the handler calls the\nalert function to state that the name is already a part of the\nphonebook and does not add the name to the names array. Otherwise,\nthe name is added as in the previous commit.","shortMessageHtmlLink":"Completes exercise 2.7 preventing duplicate names"}},{"before":"3d3188c06076ae39dcc681abc3dc1144722f5cd7","after":"d10da739c40422aaaff5e045f333e2b3c2949b4c","ref":"refs/heads/main","pushedAt":"2023-07-06T19:38:21.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Completes exercise 2.6 enabling adding names\n\nThis commit adds event handler functions to the form to handle text\nentry in the name input field and adding names to the persons state\nvariable by clicking the add button. It also displays the names in\nthe persons state variable at the bottom of the page through the map\narray function.","shortMessageHtmlLink":"Completes exercise 2.6 enabling adding names"}},{"before":"c59ccff4368bee5b1be5c480d1f42d4341b47068","after":"3d3188c06076ae39dcc681abc3dc1144722f5cd7","ref":"refs/heads/main","pushedAt":"2023-07-06T19:08:41.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Uploads files for the phonebook exercise","shortMessageHtmlLink":"Uploads files for the phonebook exercise"}},{"before":"27ae6d6e9df3bd07d3a7392e50830d959b11ceba","after":"c59ccff4368bee5b1be5c480d1f42d4341b47068","ref":"refs/heads/main","pushedAt":"2023-07-06T14:33:35.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"djanyreason","name":null,"path":"/djanyreason","primaryAvatarUrl":"https://github.com/avatars/u/105326181?s=80&v=4"},"commit":{"message":"Completes exercise 2.4 allowing multiple courses\n\nThis commit adjusts the App component so that the 'course' object\ndescribing a course is replaced by a 'courses' array, consisting of\nmultiple objects each of which describes a course. The App component\nnow returns a
consisting of an

with the curriculum name,\nfollowed by a series of Course components generated by using map on\nthe courses array.\n\nNB: Exercise 2.2 also completed exercise 2.3 (use the reduce method),\nand exercise 2.1 also completed exercise 2.5 (put the Course\ncomponent in a separate js file and import into App.js).","shortMessageHtmlLink":"Completes exercise 2.4 allowing multiple courses"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"Y3Vyc29yOnYyOpK7MjAyNC0wMy0yMFQyMTo1MTozNy4wMDAwMDBazwAAAAQbI7Kg","startCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wMy0yMFQyMTo1MTozNy4wMDAwMDBazwAAAAQbI7Kg","endCursor":"Y3Vyc29yOnYyOpK7MjAyMy0wNy0wNlQxNDozMzozNS4wMDAwMDBazwAAAANQITRj"}},"title":"Activity ยท djanyreason/FSO_02"}