Skip to content

Instantly share code, notes, and snippets.

@secretpray
Created September 16, 2024 07:11
Show Gist options
  • Save secretpray/2252e402047deb320d4de8682e25e83c to your computer and use it in GitHub Desktop.
Save secretpray/2252e402047deb320d4de8682e25e83c to your computer and use it in GitHub Desktop.
Rails 7-8 Add Timezone support

app/javascript/controllers/timezone_controller.js

import { Controller } from "@hotwired/stimulus"

export default class extends Controller {
    static targets = ["time"]

    connect() {
        this.convertToLocalTime();
    }

    convertToLocalTime() {
        this.timeTargets.forEach((element) => {
            const utcTime = new Date(element.dataset.utcTime)
            const newTime = utcTime.toLocaleString("en-US", {timeZone: "America/New_York"})
            element.innerText = newTime
        });
    }
}

views

app/views/rooms/show.html.erb

<div class="flex flex-col w-full items-center gap-4">
  <h1 class="font-bold text-4xl mx-auto">
    <%= @room.name %>
  </h1>
  <div id="messages" data-controller="timezone" class="min-w-[20rem] py-2 mx-[5rem] flex flex-col gap-2 h-[15rem] overflow-y-auto flex-col-reverse">
    <%= render @messages%>
    <%= turbo_stream_from @room %>
  </div>
  <%= render "messages/form", locals: {room: @room, message: @message}%>
</div>

app/views/messages/_message.html.erb

<div class="p-2 rounded-lg bg-slate-300">
  <%= message.content %>
  <div class="italic text-xs text-slate-700">
    <span>Sent at: </span>
    <span data-timezone-target="time" data-utc-time="<%= message.created_at.iso8601 %>">
    </span>
  </div>
</div>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment