Setting up the Eventlite app with webpacker

Hrishi Mittal
 
For our main project in this course, we will use webpacker. So let's start by building on top of the app we created in the previous lesson with webpacker.

Note: We're not going to use the react-rails or react_on_rails gems for our app, so proceed from here with just the webpacker setup from the previous lesson (without the other third-party gems).

Let’s create a new component called Eventlite for our app in app/javascript/packs/Eventlite.js:

import React from 'react'
import ReactDOM from 'react-dom'

const Eventlite = props => (
  <div>Welcome to Eventlite</div>
)

document.addEventListener('DOMContentLoaded', () => {
  ReactDOM.render(
    <Eventlite />,
    document.body.appendChild(document.createElement('div')),
  )
})

We'll keep things simple for now and have just one page where we can create events and list them.

Let’s start by creating a list of events.

We’ll send the events data from our controller to the view and then display it inside the React component.

At the moment, we don’t have a database model for saving event data, so for now, we’ll start by passing in some dummy JSON data.

Inside the index action in events_controller.rb:

class EventsController < ApplicationController
  def index
    @events = [
      {
        title: "London Retail Expo",
        datetime: "Monday 21 Oct, 2019",
        location: "London Excel Centre"
      },
      {
        title: "Enterprise Sales Training Workshop",
        datetime: "Tuesday 22 Oct, 2019",
        location: "Expert Sales Company Headquarters"
      },
      {
        title: "Ruby Hack Night",
        datetime: "Friday 25 Oct, 2019",
        location: "Learnetto Headquarters"
      },
      {
        title: "Beginners Salsa dance meetup",
        datetime: "Saturday 26 Oct, 2019",
        location: "Bar Salsa"
      }
    ]
  end
end

We can access this data from our index view with a content_tag.

In events/index.html.erb:

<h1 class="logo">Eventlite</h1>

<%= javascript_pack_tag 'Eventlite' %>

<%= content_tag :div,
  id: "events_data",
  data: @events.to_json do %>
<% end %>

Now we need to update the Eventlite component to use this data.

First, we parse the JSON and pass it as a prop called events to the Eventlite component:

In Eventlite.js:

document.addEventListener('DOMContentLoaded', () => {
  const node = document.getElementById('events_data')
  const data = JSON.parse(node.getAttribute('data'))
  ReactDOM.render(
    <Eventlite events={data} />,
    document.body.appendChild(document.createElement('div')),
  )
})

Now that the component has the events data as a prop, we can loop through the events to display each event’s information.

Let’s start by displaying the titles for all events in a simple list.

In Eventlite.js:

const Eventlite = props => (
  <div>
    {props.events.map(function(event){
      return(
        <div className="event">{event.title}</div>
      )
    })}
  </div>
)

Add some CSS to style the page and events:

application.css:

body {
  width: 500px;
  margin: auto;
  font-family: Arial;
  color: #333333;
}

h1.logo {
  font-weight: 400;
  font-size: 40px;
}


events.scss:

.event {
  padding: 20px 0;
  border-bottom: solid 1px #EAEAEA;
}


Refresh the web page to see the result:




So that's the basic setup of our app done. Next, we'll look at how we are going to structure all the components and build further.