From 5879bc3fafad678f5a66ff7943d90b1d2ced4d2c Mon Sep 17 00:00:00 2001 From: Mirna Milic Date: Wed, 28 May 2025 17:23:07 +0200 Subject: [PATCH] Enable installing app as pwa --- app/assets/images/icon-192.png | Bin 0 -> 3747 bytes app/assets/images/icon-512.png | Bin 0 -> 13044 bytes app/controllers/service_worker_controller.rb | 7 +++++++ app/javascript/application.js | 1 + app/javascript/custom/companion.js | 11 ++++++++++ app/views/layouts/application.html.erb | 1 + app/views/layouts/calendar.html.erb | 1 + app/views/service_worker/manifest.json.erb | 21 +++++++++++++++++++ app/views/service_worker/service_worker.js | 14 +++++++++++++ config/importmap.rb | 1 + config/routes.rb | 3 +++ 11 files changed, 60 insertions(+) create mode 100644 app/assets/images/icon-192.png create mode 100644 app/assets/images/icon-512.png create mode 100644 app/controllers/service_worker_controller.rb create mode 100644 app/javascript/custom/companion.js create mode 100644 app/views/service_worker/manifest.json.erb create mode 100644 app/views/service_worker/service_worker.js diff --git a/app/assets/images/icon-192.png b/app/assets/images/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..0f40c2a16ade5f00e8dd3c53819af064b2fe0b44 GIT binary patch literal 3747 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 LAXzJJ6!iZ9eb)#p literal 0 HcmV?d00001 diff --git a/app/controllers/service_worker_controller.rb b/app/controllers/service_worker_controller.rb new file mode 100644 index 0000000..0cfafab --- /dev/null +++ b/app/controllers/service_worker_controller.rb @@ -0,0 +1,7 @@ +class ServiceWorkerController < ApplicationController + protect_from_forgery except: :service_worker + def service_worker + end + def manifest + end +end diff --git a/app/javascript/application.js b/app/javascript/application.js index c275ea8..a0afebe 100644 --- a/app/javascript/application.js +++ b/app/javascript/application.js @@ -1,2 +1,3 @@ // Configure your import map in config/importmap.rb. Read more: https://github.com/rails/importmap-rails import "controllers" +import "custom/companion" diff --git a/app/javascript/custom/companion.js b/app/javascript/custom/companion.js new file mode 100644 index 0000000..97d7805 --- /dev/null +++ b/app/javascript/custom/companion.js @@ -0,0 +1,11 @@ +if (navigator.serviceWorker) { + navigator.serviceWorker + .register("/service-worker.js", { scope: "/" }) + .then(() => navigator.serviceWorker.ready) + .then((registration) => { + if ("SyncManager" in window) { + registration.sync.register("sync-forms"); + } + }) + .then(() => console.log("[Companion]", "Service worker registered!")); +} diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 43feb1f..3ebfd04 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -2,6 +2,7 @@ <%= content_for?(:title) ? yield(:title) : "Terminator" %> + <%= csrf_meta_tags %> <%= csp_meta_tag %> diff --git a/app/views/layouts/calendar.html.erb b/app/views/layouts/calendar.html.erb index 2d4def9..e398ca6 100644 --- a/app/views/layouts/calendar.html.erb +++ b/app/views/layouts/calendar.html.erb @@ -2,6 +2,7 @@ Terminator + <%= csrf_meta_tags %> <%= csp_meta_tag %> diff --git a/app/views/service_worker/manifest.json.erb b/app/views/service_worker/manifest.json.erb new file mode 100644 index 0000000..c2391e9 --- /dev/null +++ b/app/views/service_worker/manifest.json.erb @@ -0,0 +1,21 @@ +{ + "short_name": "Zdravo Stopalo", + "name": "Zdravo Stopalo", + "icons": [ + { + "src": "<%= image_path('icon-192.png')%>", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "<%= image_path('icon-512.png')%>", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": "<%= root_path %>", + "background_color": "#FFFFFF", + "display": "standalone", + "scope": "<%= root_path %>", + "theme_color": "#8e2731" +} diff --git a/app/views/service_worker/service_worker.js b/app/views/service_worker/service_worker.js new file mode 100644 index 0000000..e44d1bb --- /dev/null +++ b/app/views/service_worker/service_worker.js @@ -0,0 +1,14 @@ +function onInstall(event) { + console.log("[Serviceworker]", "Installing!", event); +} + +function onActivate(event) { + console.log("[Serviceworker]", "Activating!", event); +} + +function onFetch(event) { + console.log("[Serviceworker]", "Fetching!", event); +} +self.addEventListener("install", onInstall); +self.addEventListener("activate", onActivate); +self.addEventListener("fetch", onFetch); diff --git a/config/importmap.rb b/config/importmap.rb index 0ea2e3b..ecfbdae 100644 --- a/config/importmap.rb +++ b/config/importmap.rb @@ -4,3 +4,4 @@ pin "@hotwired/stimulus", to: "stimulus.min.js" pin "@hotwired/stimulus-loading", to: "stimulus-loading.js" pin "application" pin_all_from "app/javascript/controllers", under: "controllers" +pin_all_from "app/javascript/custom", under: "custom" diff --git a/config/routes.rb b/config/routes.rb index 2ab910a..69f7424 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,6 +12,9 @@ Rails.application.routes.draw do # Can be used by load balancers and uptime monitors to verify that the app is live. get "up" => "rails/health#show", as: :rails_health_check + # config/routes.rb + get "/service-worker.js" => "service_worker#service_worker" + get "/manifest.json" => "service_worker#manifest" # Defines the root path route ("/") # root "posts#index" end