2.E.3: Instagram Posts
- 1.Understand how to use JavaScript promises
- 2.Understand how to use Firebase Storage
- 3.Understand how cloud storage works: upload files, store references to those files in our database
- 4.Know how to read documentation to apply a new technology
We will build on the previous exercise to incorporate file uploads and store data as posts to display on our shared feed.
- 1.Start with the code we wrote in the previous exercise in our forked and cloned copy of the Rocket Academy Instagram starter repo.
- 2.
- 1.Start from "Create a default Cloud Storage bucket"; we just completed the prerequisite in the previous step
- 1.Choose "Start in Test mode" when setting up Cloud Storage to avoid setting up security rules for now. We will address this after learning Firebase Authentication.
- 2.Choose a Cloud Storage location nearest to your users. See Firebase docs for a list of locations and their descriptions. Singapore is
asia-southeast1
.
- 2.In "Add your bucket URL to your app", our bucket URL may already be in our Firebase config in
firebase.js
, but we will want to importgetStorage
fromfirebase/storage
andexport const storage = getStorage(firebaseApp);
fromfirebase.js
with the same pattern we used for Realtime Database. We can then importstorage
from./firebase
inApp.js
like what we did with Realtime Database. - 3.We can ignore the options in "Advanced setup" for now; nothing there that we should need yet
- 3.Practice safe sharing, create implement your .env so that you do not share your Firebase credentials online when pushing to GitHub.
- 1.Upgrade the form we created in Instagram Chat to accept file uploads in addition to text. Form submissions will now be considered "posts" that we will save to our database and render in our news feed.
- 1.We can use
<input type="file" />
to accept file inputs in our form. See code snippet below for an example of how to use file input fields with React. - 2.
- 3.On form submit:
- 1.Upload the file to Firebase Storage
- 2.Save the response, the file's database URL together with the post text in Realtime Database.
- 1.Note: Be careful when using promises we may have to wait for the upload and
getDatabaseURL
promises to resolve before we can save the database URL. - 2.Note: We may want to import and use functions from
firebase/storage
as per the Firebase Upload Files tutorial. - 3.Note: We may want to use import aliases when importing functions of the same name such as
ref
from multiple modules, e.g. bothfirebase/storage
andfirebase/database
. See code snippet below for example.
- 2.Upgrade the UI of our app to render posts nicely. Consider using React Bootstrap Cards as a simple solution.
- 1.You may find that the images we upload render too large. Rocket found that creating and applying a CSS class on card images and setting
width
to50vw
andheight
to30vh
gave a good look.
Import Bootstrap CSS to use React Bootstrap
If we wish to use React Bootstrap, don't forget to import Bootstrap CSS in either
index.js
or App.js
.If you see the following Webpack warning, this is an open Bootstrap issue, non-breaking and should be resolved by Bootstrap soon. Can ignore for now.
Warning
(6:29521) autoprefixer: Replace color-adjust to print-color-adjust. The color-adjust shorthand is currently deprecated.
import React from "react";
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
fileInputFile: null,
fileInputValue: "",
textInputValue: "",
};
}
render() {
return (
<div className="App">
<form>
{/* File input example */}
<input
type="file"
// Set state's fileInputValue to "" after submit to reset file input
value={this.state.fileInputValue}
onChange={(e) =>
// e.target.files is a FileList object that is an array of File objects
// e.target.files[0] is a File object that Firebase Storage can upload
this.setState({ fileInputFile: e.target.files[0] })
}
/>
{/* Text input example */}
<input
type="text"
value={this.state.textInputValue}
onChange={(e) => this.setState({ textInputValue: e.target.value })}
/>
</form>
</div>
);
}
}
The following code is in the reference solution. We give aliases using
as
syntax to the named imports ref
from both firebase/database
and firebase/storage
.import { onChildAdded, push, ref as databaseRef, set } from "firebase/database";
import {
getDownloadURL,
ref as storageRef,
uploadBytes,
} from "firebase/storage";
- 1.Implement like functionality on posts. Every post in the news feed has a heart-shaped like button that increments the posts' like count by 1 when we toggle it on. When we toggle the like button off, our app decrements the relevant posts' like count.
- 1.This feature will be buggy for now (e.g. we can refresh our page and like the same post again for duplicate likes) until we implement authentication in the next exercise.
Implement commenting functionality on posts. Every post in the news feed has a comment bar that allows users to leave comments. We can store comments together with their post in our database.
Submit a pull request to the
main
branch of Rocket's Instagram repo and share your PR link in your section Slack channel.If you would like to deploy your app to the internet, follow Create React App GitHub Pages deployment instructions here.
To play with the solution, clone it, run
npm i
and npm start
. We did not host a reference deployment for this solution because we will build on this repo in the following exercises and will host a reference deployment for the final one.Last modified 1yr ago