Caval  Canti

Caval Canti

1564629218

How to Build a Decentralized Todo List with React and Blockstack

Blockstack and React. Blockstack is a platform that makes it very easy to build decentralized apps. It is faster and more secure to build a simple app using Blockstack authentication and storage than traditional auth/storage methods.

Blockstack's Approach to Decentralization

Big companies like Google and Facebook have centralized databases where they control your data and can do whatever they want with it.

Blockstack Apps allow users to have complete control of their data. No one can access the user's data without their permission. User data is encrypted and stored in private "data lockers", and the user can give an app permission to read/write data to their storage.

In the case of our Todo List app, this means that the app developer will never know what's on your Todo List.

The App

Our Todo List is going to be very simple so we can focus on learning how Blockstack works.

This is what the finished app looks like:

The Setup

First we will setup the environment. You should have a recent version of node.js installed.

React

We'll be using create-react-app, so type npx create-react-app secure-todo-list into your terminal to create the new project

After a minute or so, it should be complete.

Navigate to your new directory with cd secure-todo-list then type npm start to make sure everything is working well.

You should see this in your browser:

Then open up the project folder in your coding editor and let's do some cleanup. Delete the following files:

  • App.css
  • App.test.js
  • index.css
  • logo.svg

Then open App.js and replace the contents with this:

import React from "react"

class App extends React.Component {
render() {
return <div>Nice Meme</div>
}
}

export default App

And update index.js

import React from “react”
import ReactDOM from “react-dom”
import App from “./App”
import * as serviceWorker from “./serviceWorker”

ReactDOM.render(<App />, document.getElementById(“root”))

// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister()

Prettier

If you don’t use prettier, I highly recommend it. It makes your code much cleaner without any effort. You can add it to your editor by looking for the prettier plugin.

Add a .prettierrc file to your project root directory (secure-todo-list/) with an empty object as the content, which gives you the default settings.

{}

Semantic UI

We’ll use Semantic UI, a CSS library, to give our app some styling.

Copy this url (https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.css) into your public/index.html by adding this line into the head of your html file.

<link
rel=“stylesheet”
href=“https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.css
/>

Now you should have a very beautiful, minimalist site completed.

Blockstack Account

You’re going to need a Blockstack Account so you can login and use your app. You can get one by going to https://blockstack.org/ and selecting Create ID from the menu.

A Simple Todo List

We’re going to start by building a simple todo list in React without any Blockstack. The app state will be lost whenever the page is refreshed, but this will make it easier to see where blockstack comes in.

Initial State

Let’s start by adding some state to our App. Add this above the render function in App.js

state = {
todos: [
{
id: 1,
title: “Wash the dishes”,
done: false,
},
{
id: 2,
title: “Clean my room”,
done: false,
},
],
}

Now our app keeps track of todos, which have three atributes:

  • id: A unique identifier for this todo item
  • title: The name given to this task
  • done: Whether or not this task has been completed

Displaying the Todos

Now that we have some todos, let’s display them on the page.

Change your render method to the following:

  render() {
return (
<div style={{ padding: “30px 0” }}
className=“ui text container center aligned”>
<h2>My Todos</h2>
<div className=“ui grid”>
<div className=“row centered”>
<div className=“column twelve wide”>
<div className=“grouped fields”>
{this.state.todos
.filter(todo => !todo.done)
.map(todo => (
<div key={todo.id} className=“field”>
<div className=“ui checkbox”>
<input type=“checkbox” />
<label>{todo.title}</label>
</div>
</div>
))}
</div>
</div>
</div>
</div>
</div>
);
}

All the classnames like ui text container center aligned are from Semantic UI and help make our app look nicer.

The line this.state.todos.filter(todo => !todo.done).map(todo => …filters out todos that are already done and hides them from the page.

Now you should have something that looks like a todo list.

If you click on one of those checkboxes, you’ll realize that it does nothing. Ideally we want things to disappear when we check them, so let’s add that in.

Completing Todos

Add an onClick handler to the checkbox.

<input
type=“checkbox”
onClick={() => {
this.handleCheckboxClick(todo.id)
}}
/>

We use a slightly strange syntax because we want to pass in the id of the selected todo to our handler function.

The handler should be added above the render function.

  handleCheckboxClick(id) {
let newTodos = […this.state.todos];
newTodos[newTodos.findIndex(todo => todo.id === id)].done = true;
this.setState({
todos: newTodos
});
}

This is one of the many ways to modify array state in React. First we make a copy of the current list of todos, then we mark the selected todo (identified by its id) as done and update the state.

Now when you check the box, the todo should vanish from the page, since we filter out any item that is marked as done.

Adding Todos

In real life, people probably have more tasks to do than washing dishes and cleaning their room, so let’s allow users to add their own todos.

First let’s add an input form to our render method.

render() {
return (
<div
style={{ padding: “30px 0” }}
className=“ui text container center aligned”
>
<h2>My Todos</h2>
<div className=“ui grid”>
<div className=“row centered”>
<div className=“column twelve wide”>
<form className=“ui form” onSubmit={this.handleAddTodoClick}>
<div className=“inline fields”>
<div className=“twelve wide field”>
<input
type=“text”
value={this.state.newTodo}
onChange={this.hanldeInputChange}
/>
</div>
<button className=“ui button primary” type=“submit”>
Add todo
</button>
</div>
</form>
</div>
</div>
<div className=“row centered”>
<div className=“column twelve wide”>
<div className=“grouped fields”>
{this.state.todos
.filter(todo => !todo.done)
.map(todo => (
<div key={todo.id} className=“field”>
<div className=“ui checkbox”>
<input
type=“checkbox”
onClick={() => {
this.handleCheckboxClick(todo.id);
}}
/>
<label>{todo.title}</label>
</div>
</div>
))}
</div>
</div>
</div>
</div>
</div>
);
}

Then let’s implement all those handler functions.

Update the initial state to keep track of our new todo value, and cleanup those default todos

state = {
todos: [],
newTodo: “”,
}

Implement the handleInputChange function which will keep track of what the user is entering.

hanldeInputChange = e => {
this.setState({
newTodo: e.target.value,
})
}

Next we implement handleAddTodoClick which is called when the user hits enter or clicks the button to add their new todo item.

handleAddTodoClick = e => {
e.preventDefault()
const newTodo = {
id: this.state.todos.length + 1,
title: this.state.newTodo,
done: false,
}
const todos = […this.state.todos]
todos.push(newTodo)
this.setState({
todos: todos,
newTodo: “”,
})
}

Your entire App.js should look like this:

import React from “react”

class App extends React.Component {
state = {
todos: [],
newTodo: “”,
}

handleCheckboxClick(id) {
let newTodos = […this.state.todos]
newTodos[newTodos.findIndex(todo => todo.id === id)].done = true
this.setState({
todos: newTodos,
})
}

handleAddTodoClick = e => {
e.preventDefault()
const newTodo = {
id: this.state.todos.length + 1,
title: this.state.newTodo,
done: false,
}
const todos = […this.state.todos]
todos.push(newTodo)
this.setState({
todos: todos,
newTodo: “”,
})
}

hanldeInputChange = e => {
this.setState({
newTodo: e.target.value,
})
}

render() {
return (
<div
style={{ padding: “30px 0” }}
className=“ui text container center aligned”
>
<h2>My Todos</h2>
<div className=“ui grid”>
<div className=“row centered”>
<div className=“column twelve wide”>
<form className=“ui form” onSubmit={this.handleAddTodoClick}>
<div className=“inline fields”>
<div className=“twelve wide field”>
<input
type=“text”
value={this.state.newTodo}
onChange={this.hanldeInputChange}
/>
</div>
<button className=“ui button primary” type=“submit”>
Add todo
</button>
</div>
</form>
</div>
</div>
<div className=“row centered”>
<div className=“column twelve wide”>
<div className=“grouped fields”>
{this.state.todos
.filter(todo => !todo.done)
.map(todo => (
<div key={todo.id} className=“field”>
<div className=“ui checkbox”>
<input
type=“checkbox”
onClick={() => {
this.handleCheckboxClick(todo.id)
}}
/>
<label>{todo.title}</label>
</div>
</div>
))}
</div>
</div>
</div>
</div>
</div>
)
}
}

export default App

Now you should be able to add new todo items, and check them off. The only problem is that when you refresh the page, you lose all of your precious todos. Now it’s time to actually save our todos using Blockstack.

Let’s Add Blockstack!

Now we’ll add user authentication and storage using Blockstack. First stop your app with ctrl-c and install blockstack with npm install blockstack. Then we can start the app again with npm start and everything should still be working the same.

Authentication

Setup blockstack in App.js by adding the following lines above the class declaration.

import { UserSession, AppConfig } from “blockstack”;

const appConfig = new AppConfig([“store_write”]);
const userSession = new UserSession({ appConfig: appConfig });

class App extends React.Component {

}

The line const appConfig = new AppConfig([“store_write”]); is used to set the configuration of our blockstack app. You can request the permissions you want from the user. In this case, we request store_write permissions, which allows us to store data in the user’s private storage.

If we wanted to build something more social, we would want publish_datapermissions, which allows certain user data to be visible to other users.

const userSession = new UserSession({ appConfig: appConfig });establishes a user session, which allows us to handle authentication.

Add a login button to the top of the page.

<div style={{ padding: “30px 0” }} className=“ui text container center aligned”>
<button className=“ui button positive” onClick={this.handleSignIn}>
Sign in with blockstack
</button>
<h2>My Todos</h2>

</div>

And implement our handler function this.handleSignIn like this:

handleSignIn = () => {
userSession.redirectToSignIn()
}

Yep, it takes one line of code to implement sign in.

Your page should now look like this:

Let’s click on that button and see what happens!

Well, we’re taken to the blockstack browser for login, but it looks like there’s a problem…

Hmm, “Failed to fetch information about the app requesting authentication. Please contact the app maintainer to resolve the issue.” That’s not very descriptive, but our console says something a little more useful.

Access to fetch at ‘http://localhost:3000/manifest.json’ from origin ‘https://browser.blockstack.org’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. If an opaque response serves your needs, set the request’s mode to ‘no-cors’ to fetch the resource with CORS disabled.

What is going on here? This is actually a very common bug when you’re just getting started with Blockstack, so let’s talk about it.

Fixing The CORS Error

The issue is that the Blockstack Browser is trying to access a file from your website called manifest.json, which contains information about your app. However, due to CORS, websites can’t make requests to other websites on a different domain by default. This is done for security purposes. So our website right now is rejecting the Blockstack Browser’s request for our manifest.json but we actually want Blockstack to be able to access that file.

To do that, we’ll need to modify our webpack config. Since we used create-react-app , the webpack config is hidden. To modify it, we use the command npm run eject . You will probably get a warning about having untracked files and uncommitted changes. So commit all your changes to git first.

git add -A
git commit -m “did things”
npm run eject

You’ll see two new folders in your directory called scripts and config. Go to config/webpackDevServer.config.js and add the following line on top of the module exports function.

module.exports = function(proxy, allowedHost) {
return {
headers: {
“Access-Control-Allow-Origin”: “*”
},

// WebpackDevServer 2.4.3 introduced a security fix that prevents remote
// websites from potentially accessing local content through DNS rebinding:

...

}
}

Now start the project again with npm start and let’s try logging in again.

Our app could probably use a better name than “Create React App Sample” so let’s go to public/manifest.json to modify that. You can change the app name to anything you like here.

{
“short_name”: “Todo List”,
“name”: “Secure Todo List”,
“icons”: [
{
“src”: “favicon.ico”,
“sizes”: “64x64 32x32 24x24 16x16”,
“type”: “image/x-icon”
}
],
“start_url”: “.”,
“display”: “standalone”,
“theme_color”: “#000000”,
“background_color”: “#ffffff”
}

Authentication Continued

Now let’s modify the view based on whether or not the user is logged in. Logged out users probably shouldn’t see their todo list, and logged in users don’t need to see the login button.

To make this a bit cleaner, we’re going to separate those two things into different components. We’ll have a TodoList component which shows the Todo List and a Login component which shows the login page.

Copy the contents of App.js into a new file called TodoList.js and modify it as follows.

import React from “react”

class TodoList extends React.Component {
state = {
todos: [],
newTodo: “”,
}

handleCheckboxClick(id) {
let newTodos = […this.state.todos]
newTodos[newTodos.findIndex(todo => todo.id === id)].done = true
this.setState({
todos: newTodos,
})
}

handleAddTodoClick = e => {
e.preventDefault()
const newTodo = {
id: this.state.todos.length + 1,
title: this.state.newTodo,
done: false,
}
const todos = […this.state.todos]
todos.push(newTodo)
this.setState({
todos: todos,
newTodo: “”,
})
}

hanldeInputChange = e => {
this.setState({
newTodo: e.target.value,
})
}

render() {
return (
<div
style={{ padding: “30px 0” }}
className=“ui text container center aligned”
>
<h2>My Todos</h2>
<div className=“ui grid”>
<div className=“row centered”>
<div className=“column twelve wide”>
<form className=“ui form” onSubmit={this.handleAddTodoClick}>
<div className=“inline fields”>
<div className=“twelve wide field”>
<input
type=“text”
value={this.state.newTodo}
onChange={this.hanldeInputChange}
/>
</div>
<button className=“ui button primary” type=“submit”>
Add todo
</button>
</div>
</form>
</div>
</div>
<div className=“row centered”>
<div className=“column twelve wide”>
<div className=“grouped fields”>
{this.state.todos
.filter(todo => !todo.done)
.map(todo => (
<div key={todo.id} className=“field”>
<div className=“ui checkbox”>
<input
type=“checkbox”
onClick={() => {
this.handleCheckboxClick(todo.id)
}}
/>
<label>{todo.title}</label>
</div>
</div>
))}
</div>
</div>
</div>
</div>
</div>
)
}
}

export default TodoList

Then make a Login.js component like this.

import React from “react”

class Login extends React.Component {
handleSignIn = () => {
this.props.userSession.redirectToSignIn()
}

render() {
return (
<div
style={{ padding: “30px 0” }}
className=“ui text container center aligned”
>
<h1>Decentralized Todo List</h1>
<p>This is the most secure todo list on the market.</p>

    &lt;button className="ui button positive" onClick={this.handleSignIn}&gt;
      Sign in with blockstack
    &lt;/button&gt;
  &lt;/div&gt;
)

}
}

export default Login

We pass in the userSession as props. This object contains helpful functions to do with user authentication.

Finally our App.js will be modified to show the Login component when the user is logged out, and the TodoList when the user is logged in.

import React from “react”
import { UserSession, AppConfig } from “blockstack”
import Login from “./Login”
import TodoList from “./TodoList”
const appConfig = new AppConfig([“store_write”])
const userSession = new UserSession({ appConfig: appConfig })

class App extends React.Component {
render() {
return (
<div>
{userSession.isUserSignedIn() ? (
<TodoList userSession={userSession} />
) : (
<Login userSession={userSession} />
)}
</div>
)
}
}

export default App

We use the function userSession.isUserSignedIn() to find out whether there is a logged in user or not.

Now you should see the login page by default. When you click the button, you are redirected to Blockstack, then once you select your id you are redirected to your app, then…it still shows you the login page. What’s up with that?

Turns out we’re actually in an intermediary login stage. By this point, Blockstack has given the app a token with all of the user information. We need to add one more function call to extract information from that toke and finish the sign in.

Add these lines above the render() function in your App component.

 componentWillMount() {
if (userSession.isSignInPending()) {
userSession
.handlePendingSignIn()
.then(() => {
window.location = window.location.origin;
})
.catch(err => console.log(err));
}
}

This extracts the user information from the token, and completes the sign in, then refreshes the page.

Here is a chart that explains the whole Blockstack authentication process.

With this in place, try logging in again and you should be redirected to the todo list.

Lastly, let’s add a sign out button to the todo list page. Go to TodoList.jsand add a button to the top of the page in the render function.

 <div
style={{ padding: “30px 0” }}
className=“ui text container center aligned”
>
<button className=“ui button negative” onClick={this.handleSignout}>
Sign out
</button>

    &lt;h2&gt;My Todos&lt;/h2&gt;
    &lt;div className="ui grid"&gt;

        ...

 &lt;/div&gt;

</div>

Add the handleSignout function somewhere above the render function.

handleSignout = () => {
this.props.userSession.signUserOut(window.location.origin)
}

Now you can login and logout of the app with Blockstack.

Storing The Todos

Now that the user can login to our app, we can store their data with Blockstack.

We’ll be using two core functions of the blockstack.js library: putFile and getFile.

They do exactly what they sound like. putFile allows you to store files, and getFile allows you to retrieve files. You can store any type of file, and they can be encrypted if you want.

In our case, we’ll be storing our todos in JSON format because it makes them easy to handle.

Go to TodoList.js and modify the handleAddTodoClick function as follows:

handleAddTodoClick = e => {
e.preventDefault()
const newTodo = {
id: this.state.todos.length + 1,
title: this.state.newTodo,
done: false,
}
const todos = […this.state.todos]
todos.push(newTodo)
const options = { encrypt: true }
this.props.userSession
.putFile(“todos.json”, JSON.stringify(todos), options)
.then(() => {
this.setState({
todos,
newTodo: “”,
})
})
}

This stores all the user’s todos in a file called todos.json

Modify handleCheckboxClick so that when we mark todos as done, this is also updated in the user storage.

  handleCheckboxClick(id) {
let newTodos = […this.state.todos];
newTodos[newTodos.findIndex(todo => todo.id === id)].done = true;
const options = { encrypt: true };
this.props.userSession
.putFile(“todos.json”, JSON.stringify(newTodos), options)
.then(() => {
this.setState({
todos: newTodos
});
});
}

Try making some todos now and you should see something like this in your console, indicating that the files were stored.

If you refresh the page you won’t see anything, because we still need to retrieve the todos.

Add a new function to your class called fetchData which will get the todo list from user storage.

  async fetchData() {
const options = { decrypt: true };
const file = await this.props.userSession.getFile(“todos.json”, options);
let todos = JSON.parse(file || “[]”);
this.setState({
todos
});
}

We will call this function in our componentDidMount

componentDidMount() {
this.fetchData();
}

Now you can add a todo item, refresh your page, and it will still be there!

Adding User Profile Data

Right now our app doesn’t feel very personal, but we can use Blockstack to get information like the user’s name to customize their experience.

Add a new field to the state to store the user object.

state = {
newTodo: “”,
todos: [],
user: null,
}

Then modify the fetchData function to update the state with user info.

  async fetchData() {
const options = { decrypt: true };
const file = await this.props.userSession.getFile(“todos.json”, options);
let todos = JSON.parse(file || “[]”);
this.setState({
todos,
user: new Person(this.props.userSession.loadUserData().profile)
});
}

And add an import statement at the top of your file.

import { Person } from “blockstack”

The Person object puts the user data in an easily accessible format.

Modify the render function to display some user information. We’ll be showing their name and profile image.

render() {
const { user } = this.state;

return (
  &lt;div
    style={{ padding: "30px 0" }}
    className="ui text container center aligned"
  &gt;
    &lt;button className="ui button negative" onClick={this.handleSignout}&gt;
      Sign out
    &lt;/button&gt;
    &lt;h1&gt;{user &amp;&amp; user.name()}&lt;/h1&gt;
    &lt;img
      className="ui centered medium rounded image"
      src={user &amp;&amp; user.avatarUrl()}
      alt="user profile image"
    /&gt;
    &lt;h2&gt;My Todos&lt;/h2&gt;

    ...

Now the app should feature the user’s name and profile image.

Our app looks good to go, now let’s deploy it for the rest of the world to see.

Deploying To Netlify

There are many ways to deploy your React app, but Netlify is one of the best. It allows you to easily setup continuous deployment.

First let’s make a new repository on github.

Add and commit all of your files.

git add -A
git commit -m “made everything”

Then follow the commands to push an existing repository. For me that would be:

git remote add origin https://github.com/dkb868/secure-todo-list.git
git push -u origin master

Now you should have a beautiful new repo up on github.

Make an account on Netlify, then in your dashboard, select “New site from Git”.

Select Github, and search for your repo.

Use the following build settings, then click Deploy Site

Give it a few minutes, then you should have your site up at something.netlify.com. You can modify this name if you want, or add a custom domain.

If we go to our newly launched app, we’ll see a familiar error.

We know this is a CORS error, and we fixed it in our development environment, so now we need to fix it in production.

With Netlify, this is as simple as adding a netlify.toml file in your root project directory.

[[headers]]
for = “/"
[headers.values]
Access-Control-Allow-Origin = "

Add that file and push it to GitHub. Once you have continuous deploy enabled, it will be deployed automatically in a few minutes.

Now everything should be working great.

Conclusion

If you made it this far, congrats for finishing the app!

Thanks for reading. If you liked this post, share it with all of your programming buddies!

Further reading

☞ React - The Complete Guide (incl Hooks, React Router, Redux)

☞ Modern React with Redux [2019 Update]

☞ The Complete React Developer Course (w/ Hooks and Redux)

☞ React JS Web Development - The Essentials Bootcamp

☞ React JS, Angular & Vue JS - Quickstart & Comparison

☞ The Complete React Js & Redux Course - Build Modern Web Apps

☞ React JS and Redux Bootcamp - Master React Web Development



This post was originally published here

#reactjs #blockchain #web-development #react-native

What is GEEK

Buddha Community

How to Build a Decentralized Todo List with React and Blockstack
Autumn  Blick

Autumn Blick

1598839687

How native is React Native? | React Native vs Native App Development

If you are undertaking a mobile app development for your start-up or enterprise, you are likely wondering whether to use React Native. As a popular development framework, React Native helps you to develop near-native mobile apps. However, you are probably also wondering how close you can get to a native app by using React Native. How native is React Native?

In the article, we discuss the similarities between native mobile development and development using React Native. We also touch upon where they differ and how to bridge the gaps. Read on.

A brief introduction to React Native

Let’s briefly set the context first. We will briefly touch upon what React Native is and how it differs from earlier hybrid frameworks.

React Native is a popular JavaScript framework that Facebook has created. You can use this open-source framework to code natively rendering Android and iOS mobile apps. You can use it to develop web apps too.

Facebook has developed React Native based on React, its JavaScript library. The first release of React Native came in March 2015. At the time of writing this article, the latest stable release of React Native is 0.62.0, and it was released in March 2020.

Although relatively new, React Native has acquired a high degree of popularity. The “Stack Overflow Developer Survey 2019” report identifies it as the 8th most loved framework. Facebook, Walmart, and Bloomberg are some of the top companies that use React Native.

The popularity of React Native comes from its advantages. Some of its advantages are as follows:

  • Performance: It delivers optimal performance.
  • Cross-platform development: You can develop both Android and iOS apps with it. The reuse of code expedites development and reduces costs.
  • UI design: React Native enables you to design simple and responsive UI for your mobile app.
  • 3rd party plugins: This framework supports 3rd party plugins.
  • Developer community: A vibrant community of developers support React Native.

Why React Native is fundamentally different from earlier hybrid frameworks

Are you wondering whether React Native is just another of those hybrid frameworks like Ionic or Cordova? It’s not! React Native is fundamentally different from these earlier hybrid frameworks.

React Native is very close to native. Consider the following aspects as described on the React Native website:

  • Access to many native platforms features: The primitives of React Native render to native platform UI. This means that your React Native app will use many native platform APIs as native apps would do.
  • Near-native user experience: React Native provides several native components, and these are platform agnostic.
  • The ease of accessing native APIs: React Native uses a declarative UI paradigm. This enables React Native to interact easily with native platform APIs since React Native wraps existing native code.

Due to these factors, React Native offers many more advantages compared to those earlier hybrid frameworks. We now review them.

#android app #frontend #ios app #mobile app development #benefits of react native #is react native good for mobile app development #native vs #pros and cons of react native #react mobile development #react native development #react native experience #react native framework #react native ios vs android #react native pros and cons #react native vs android #react native vs native #react native vs native performance #react vs native #why react native #why use react native

Franz  Becker

Franz Becker

1651604400

React Starter Kit: Build Web Apps with React, Relay and GraphQL.

React Starter Kit — "isomorphic" web app boilerplate   

React Starter Kit is an opinionated boilerplate for web development built on top of Node.js, Express, GraphQL and React, containing modern web development tools such as Webpack, Babel and Browsersync. Helping you to stay productive following the best practices. A solid starting point for both professionals and newcomers to the industry.

See getting started guide, demo, docs, roadmap  |  Join #react-starter-kit chat room on Gitter  |  Visit our sponsors:

 

Hiring

Getting Started

Customization

The master branch of React Starter Kit doesn't include a Flux implementation or any other advanced integrations. Nevertheless, we have some integrations available to you in feature branches that you can use either as a reference or merge into your project:

You can see status of most reasonable merge combination as PRs labeled as TRACKING

If you think that any of these features should be on master, or vice versa, some features should removed from the master branch, please let us know. We love your feedback!

Comparison

 

React Starter Kit

React Static Boilerplate

ASP.NET Core Starter Kit

App typeIsomorphic (universal)Single-page applicationSingle-page application
Frontend
LanguageJavaScript (ES2015+, JSX)JavaScript (ES2015+, JSX)JavaScript (ES2015+, JSX)
LibrariesReact, History, Universal RouterReact, History, ReduxReact, History, Redux
RoutesImperative (functional)DeclarativeDeclarative, cross-stack
Backend
LanguageJavaScript (ES2015+, JSX)n/aC#, F#
LibrariesNode.js, Express, Sequelize,
GraphQL
n/aASP.NET Core, EF Core,
ASP.NET Identity
SSRYesn/an/a
Data APIGraphQLn/aWeb API

Backers

♥ React Starter Kit? Help us keep it alive by donating funds to cover project expenses via OpenCollective or Bountysource!

lehneres Tarkan Anlar Morten Olsen Adam David Ernst Zane Hitchcox  

How to Contribute

Anyone and everyone is welcome to contribute to this project. The best way to start is by checking our open issues, submit a new issue or feature request, participate in discussions, upvote or downvote the issues you like or dislike, send pull requests.

Learn More

Related Projects

  • GraphQL Starter Kit — Boilerplate for building data APIs with Node.js, JavaScript (via Babel) and GraphQL
  • Membership Database — SQL schema boilerplate for user accounts, profiles, roles, and auth claims
  • Babel Starter Kit — Boilerplate for authoring JavaScript/React.js libraries

Support

License

Copyright © 2014-present Kriasoft, LLC. This source code is licensed under the MIT license found in the LICENSE.txt file. The documentation to the project is licensed under the CC BY-SA 4.0 license.


Author: kriasoft
Source Code: https://github.com/kriasoft/react-starter-kit
License: MIT License

#graphql #react 

Aubrey  Price

Aubrey Price

1589722410

Build a simple React Native Pokemon app with React-Navigation

As we start learning new technologies we want to start building something or work on a simple project to get a better understanding of the technology. So, let’s build this simple app.
For this app, we will be using PokeApi to get our pokemon data, and also we will be using Hooks. I am using pokemondb for pokemon sprites. It’s just a personal preference you can use whatever you want.

#react-native #react-native-app #react-navigation #react-native-development #react

Mathew Rini

1615544450

How to Select and Hire the Best React JS and React Native Developers?

Since March 2020 reached 556 million monthly downloads have increased, It shows that React JS has been steadily growing. React.js also provides a desirable amount of pliancy and efficiency for developing innovative solutions with interactive user interfaces. It’s no surprise that an increasing number of businesses are adopting this technology. How do you select and recruit React.js developers who will propel your project forward? How much does a React developer make? We’ll bring you here all the details you need.

What is React.js?

Facebook built and maintains React.js, an open-source JavaScript library for designing development tools. React.js is used to create single-page applications (SPAs) that can be used in conjunction with React Native to develop native cross-platform apps.

React vs React Native

  • React Native is a platform that uses a collection of mobile-specific components provided by the React kit, while React.js is a JavaScript-based library.
  • React.js and React Native have similar syntax and workflows, but their implementation is quite different.
  • React Native is designed to create native mobile apps that are distinct from those created in Objective-C or Java. React, on the other hand, can be used to develop web apps, hybrid and mobile & desktop applications.
  • React Native, in essence, takes the same conceptual UI cornerstones as standard iOS and Android apps and assembles them using React.js syntax to create a rich mobile experience.

What is the Average React Developer Salary?

In the United States, the average React developer salary is $94,205 a year, or $30-$48 per hour, This is one of the highest among JavaScript developers. The starting salary for junior React.js developers is $60,510 per year, rising to $112,480 for senior roles.

* React.js Developer Salary by Country

  • United States- $120,000
  • Canada - $110,000
  • United Kingdom - $71,820
  • The Netherlands $49,095
  • Spain - $35,423.00
  • France - $44,284
  • Ukraine - $28,990
  • India - $9,843
  • Sweden - $55,173
  • Singapore - $43,801

In context of software developer wage rates, the United States continues to lead. In high-tech cities like San Francisco and New York, average React developer salaries will hit $98K and $114per year, overall.

However, the need for React.js and React Native developer is outpacing local labour markets. As a result, many businesses have difficulty locating and recruiting them locally.

It’s no surprise that for US and European companies looking for professional and budget engineers, offshore regions like India are becoming especially interesting. This area has a large number of app development companies, a good rate with quality, and a good pool of React.js front-end developers.

As per Linkedin, the country’s IT industry employs over a million React specialists. Furthermore, for the same or less money than hiring a React.js programmer locally, you may recruit someone with much expertise and a broader technical stack.

How to Hire React.js Developers?

  • Conduct thorough candidate research, including portfolios and areas of expertise.
  • Before you sit down with your interviewing panel, do some homework.
  • Examine the final outcome and hire the ideal candidate.

Why is React.js Popular?

React is a very strong framework. React.js makes use of a powerful synchronization method known as Virtual DOM, which compares the current page architecture to the expected page architecture and updates the appropriate components as long as the user input.

React is scalable. it utilises a single language, For server-client side, and mobile platform.

React is steady.React.js is completely adaptable, which means it seldom, if ever, updates the user interface. This enables legacy projects to be updated to the most new edition of React.js without having to change the codebase or make a few small changes.

React is adaptable. It can be conveniently paired with various state administrators (e.g., Redux, Flux, Alt or Reflux) and can be used to implement a number of architectural patterns.

Is there a market for React.js programmers?
The need for React.js developers is rising at an unparalleled rate. React.js is currently used by over one million websites around the world. React is used by Fortune 400+ businesses and popular companies such as Facebook, Twitter, Glassdoor and Cloudflare.

Final thoughts:

As you’ve seen, locating and Hire React js Developer and Hire React Native developer is a difficult challenge. You will have less challenges selecting the correct fit for your projects if you identify growing offshore locations (e.g. India) and take into consideration the details above.

If you want to make this process easier, You can visit our website for more, or else to write a email, we’ll help you to finding top rated React.js and React Native developers easier and with strives to create this operation

#hire-react-js-developer #hire-react-native-developer #react #react-native #react-js #hire-react-js-programmer

Raleigh  Hayes

Raleigh Hayes

1626915420

Firebase & React Tutorial | Build a Todo App

Hey everyone! Firebase + React is probably one of the quickest ways to get started with a full-stack application, and it’s so simple! Today’s video is a tutorial on how to get started with Firebase authentication, firestore, and cloud functions. I hope you enjoy it!

Useful Links:
https://github.com/redhwannacef/youtube-tutorials/tree/master/firebase-tutorial

Timestamps:
0:00 - Intro
0:19 - What is Firebase?
0:50 - Create Project In Firebase
1:45 - App Code Intro
2:35 - Initialise Firebase
4:48: Google Authentication
6:29 - Firestore - Write, Read
8:21 - Firestore Rules
10:34 - Firestore - Edit, Delete
12:39 - Cloud Function
16:23 - Thank You For Watching :)

#todo #react #firebase #firebase & react #firebase & react tutorial