It’s time to put your development skills to the test!
You are called to add a new feature to the Feed App: displaying image comments when a user taps on an image in the feed.
The goal is to implement this feature using what you learned in the program.
You'll develop the API, Presentation, and UI layers for this feature.
Important: There's no need to cache comments.
-
Display a list of comments when the user taps on an image in the feed.
-
Loading the comments can fail, so you must handle the UI states accordingly.
-
Show a loading spinner while loading the comments.
-
If it fails to load: Show an error message.
-
If it loads successfully: Show all loaded comments in the order they were returned by the remote API.
-
-
-
The loading should start automatically when the user navigates to the screen.
- The user should also be able to reload the comments manually (Pull-to-refresh).
-
At all times, the user should have a back button to return to the feed screen.
- Cancel any running comments API requests when the user navigates back.
-
The comments screen layout should match the UI specs.
- Present the comment date using relative date formatting, e.g., "1 day ago."
-
The comments screen title should be localized in all languages supported in the project.
-
The comments screen should support:
- Light and Dark Mode
- Dynamic Fonts
-
Write tests to validate your implementation, including unit, integration, and snapshot tests (aim to write the test first!).
-
Follow the specs below and test-drive this feature from scratch:
Follow the UI specs for loading, error, and success states:
As an online customer
I want the app to load image commments
So I can see how people are engaging with images in my feed
Given the customer has connectivity
When the customer requests to see comments on an image
Then the app should display all comments for that image
Given the customer doesn't have connectivity
When the customer requests to see comments on an image
Then the app should display an error message
- ImageID
- Execute "Load Image Comments" command with above data.
- System loads data from remote service.
- System validates data.
- System creates comments from valid data.
- System delivers comments.
- System delivers invalid data error.
- System delivers connectivity error.
Property | Type |
---|---|
id |
UUID |
message |
String |
created_at |
Date (ISO8601 String) |
author |
CommentAuthorObject |
Property | Type |
---|---|
username |
String |
GET /image/{image-id}/comments
2xx RESPONSE
{
"items": [
{
"id": "a UUID",
"message": "a message",
"created_at": "2020-05-20T11:24:59+0000",
"author": {
"username": "a username"
}
},
{
"id": "another UUID",
"message": "another message",
"create at": "2020-05-19T14:23:53+0000",
"author": {
"username": "another username"
}
},
...
]
}
https://ile-api.essentialdeveloper.com/essential-feed
Base URL + /v1/feed
https://ile-api.essentialdeveloper.com/essential-feed/v1/feed
Base URL + /v1/image/{image-id}/comments
https://ile-api.essentialdeveloper.com/essential-feed/v1/image/{image-id}/comments
-
Fork the latest version of this repository. Here's how forking works.
-
Open the
EssentialApp/EssentialApp.xcworkspace
workspace project on Xcode 12.2 (you can use other Xcode versions by switching to the appropriate branch, e.g.,xcode11
/xcode12
).⚠️ Important: On Xcode 12.2, run the snapshot tests using the 'iPhone 12 - iOS 14.2' simulator (the same simulator used to take the snapshots). On older Xcode branches, run the tests with the 'iPhone 11 - iOS 13.x or 14.x' simulator.
-
You can develop the platform-agnostic logic in the
EssentialFeed
target using themacOS
platform to speed up the TDD cycle. -
Feel free to organize the 'Image Comments' feature in any way you want in the project. You can use the existing projects and targets, or create new ones if you want to.
-
If you add new projects, make sure to add them to the
EssentialApp
workspace. -
If you add new targets, make sure to add them to the
CI_macOS
andCI_iOS
schemes as needed, so we can run all tests on the CI server.
-
-
You can see/interact with your solution by running the Application on the simulator (or device).
- Switch to the
EssentialApp
scheme and press CMD+R.
- Switch to the
-
When all tests are passing and you're done implementing your solution, create a Pull Request from your branch to the main challenge repo with the title: "Your Name - Image Comments Challenge.
7) Post a comment in the challenge page in the academy with the link to your PR, so we can review your solution and provide feedback.
-
Aim to commit your changes every time you add/alter the behavior of your system or refactor your code.
-
Aim for descriptive commit messages that clarify the intent of your contribution which will help other developers understand your train of thought and purpose of changes.
-
The system should always be in a green state, meaning that in each commit all tests should be passing.
-
The project should build without warnings.
-
The code should be carefully organized and easy to read (e.g. indentation must be consistent).
-
Make careful and proper use of access control, marking as
private
any implementation details that aren’t referenced from other external components. -
Aim to write self-documenting code by providing context and detail when naming your components, avoiding explanations in comments.
Happy coding!