PWC code challenge
This project was bootstrapped with Create React App.
Instructions
yarn / npm install
1- yarn build-and-serve
2- Disclaimer:
To use the search, you must enter a valid city ( Sydney, Macquarie Park, etc) inside NSW, Australia. Australia and NSW are hard-coded, but can be made available using dropdowns etc. After entering the value, please press Enter or click on the search icon.
Please note that I'm aware that there's no error handling on the city, and also not a proper one on the api call.
Please consider this only as a happy path :D
This application is tested on Chrome, Safari and Firefox, all the latest version, although I think it should have any issues in IE too :D
Open http://localhost:3000 to view it in the browser.
To run the uni tests
yarn test
Note that I've tried to write unit test for most of the functionality of this application, but I could cover 100% due to the time limit. Please also note that I've added a library for accessibility coverage, which isn't perfect, but it does stop a lot of silly mistakes. I've also audited this in Chrome and have received 100% coverage on accessibility, however, a human validation of the accessibility requirements is still desirable.
##Other considerations
1- Api utilities
For this very simple application, I decided to use SWR
library, which gives me a nice set of react hooks and it uses the default browser fetch
for all the api calls.
SWR
also, nicely integrates with React Suspense, which I have use in this project. ( Checkout Weather component)
For larger application, obviously there needs to be put a little more thought into this.
I also didn't implement a state management like Redux, since I thought it's overkill.
My favourite redux library these days is Epic and RTKQuery.
2- Styling
As you've seen, I've used React Material Components, which comes fully tested and has a decent accessibility coverage.
This means, I didn't use SASS or similar and instead for any custom styling, I used styled
from MUI, which is a css in js technology.
There are some caveats to CSS in JS, in general, so more thought needs to be put in before making a enterprise level decision of the styling library and methos.
3- Environment variables
I put all the variables inside a .env
for now and committed it so you can easily test the app.
However, these variables should ideally be located as part of a pipeline, like Github actions, AWS, Azure, etc.
4- Files structure
I have divided all the components into Modules and Components. A module is essentially a miro-frontend , which can be separated into its own package. A module does the work of fetching, storing and updating the data and state.
There are some technologies like Lerna/Craco , which would be helpful to create a complete micro-frontend architecture.
Eventually, each module can have its own package.json
and version etc.
The rest of the components are basic and dumb and do not have any API connection or state management.
Similar to the modules, all these components also can be shared using a package.