unagi-notifications 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.DS_Store +0 -0
- data/.gitignore +10 -0
- data/.travis.yml +5 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +91 -0
- data/LICENSE.txt +21 -0
- data/README.md +84 -0
- data/Rakefile +10 -0
- data/lib/assets/javascripts/firebase.js +36 -0
- data/lib/assets/javascripts/unagi-notifications.js +88 -0
- data/lib/notifications/engine.rb +7 -0
- data/lib/notifications/helper.rb +37 -0
- data/lib/notifications/railtie.rb +10 -0
- data/lib/notifications/uploader.rb +37 -0
- data/lib/notifications/version.rb +3 -0
- data/lib/notifications.rb +27 -0
- data/notifications.gemspec +45 -0
- data/test/notifications_test.rb +11 -0
- data/test/test_helper.rb +4 -0
- metadata +134 -0
@@ -0,0 +1,88 @@
|
|
1
|
+
var initialize = function() {
|
2
|
+
var opts = $('#js-notifications-container');
|
3
|
+
|
4
|
+
if (opts.length == 0) {
|
5
|
+
return;
|
6
|
+
}
|
7
|
+
|
8
|
+
if (firebase.apps.length === 0) {
|
9
|
+
var config = {
|
10
|
+
apiKey: `${opts.data('firebase-api-key')}`,
|
11
|
+
authDomain: `${opts.data('firebase-project-id')}.firebaseapp.com/`,
|
12
|
+
databaseURL: `https://${opts.data('firebase-project-id')}.firebaseio.com/`,
|
13
|
+
};
|
14
|
+
|
15
|
+
firebase.initializeApp(config);
|
16
|
+
}
|
17
|
+
|
18
|
+
var destination = opts.data('destination');
|
19
|
+
|
20
|
+
var ref = firebase
|
21
|
+
.database()
|
22
|
+
.ref(`notifications/${destination}`);
|
23
|
+
|
24
|
+
ref.off();
|
25
|
+
|
26
|
+
ref
|
27
|
+
.orderByChild('read_at')
|
28
|
+
.equalTo(false)
|
29
|
+
.on('child_added', onNotificationAdded.bind(this));
|
30
|
+
};
|
31
|
+
|
32
|
+
var onNotificationAdded = function(notification) {
|
33
|
+
var value = notification.val();
|
34
|
+
var key = notification.key;
|
35
|
+
|
36
|
+
appendNotification(value, key);
|
37
|
+
setNotificationsCount();
|
38
|
+
}
|
39
|
+
|
40
|
+
var appendNotification = function(notification, key) {
|
41
|
+
var container = $('#js-notifications-container');
|
42
|
+
|
43
|
+
var notification_container = container.data('notification-container');
|
44
|
+
var notification_container_class = container.data('notification-container-class');
|
45
|
+
var notification_class = container.data('notification-class');
|
46
|
+
|
47
|
+
var id = 'js-notification-' + Math.random().toString(36).substr(2, 9)
|
48
|
+
|
49
|
+
var html = "" +
|
50
|
+
"<" + notification_container + " class='" + notification_container_class +"' id='" + id +"'>" +
|
51
|
+
"<a href='" + notification.link + "'>" +
|
52
|
+
"<span class='js-notification " + notification_class + "'>" +
|
53
|
+
notification.text +
|
54
|
+
"</span>" +
|
55
|
+
"</a>" +
|
56
|
+
"</" + notification_container + ">"
|
57
|
+
|
58
|
+
container.prepend(html);
|
59
|
+
bindOnClickListener(id, key, notification);
|
60
|
+
};
|
61
|
+
|
62
|
+
var bindOnClickListener = function(html_id, key, notification) {
|
63
|
+
var opts = $('#js-notifications-container');
|
64
|
+
|
65
|
+
$('#' + html_id).on('click', function() {
|
66
|
+
firebase
|
67
|
+
.database()
|
68
|
+
.ref(`notifications/${opts.data('destination')}`)
|
69
|
+
.child(key)
|
70
|
+
.update({
|
71
|
+
read_at: Date.now()
|
72
|
+
});
|
73
|
+
});
|
74
|
+
};
|
75
|
+
|
76
|
+
var setNotificationsCount = function() {
|
77
|
+
var container = $('#js-notifications-count');
|
78
|
+
|
79
|
+
if (container.length == 0){
|
80
|
+
return;
|
81
|
+
}
|
82
|
+
|
83
|
+
container.text($('.js-notification').length);
|
84
|
+
};
|
85
|
+
|
86
|
+
$(document).ready(initialize); // No Turbolinks
|
87
|
+
$(document).on('page:load', initialize); // Rails <= 4
|
88
|
+
$(document).on('turbolinks:load', initialize); // Rails 5
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Notifications
|
2
|
+
module Helper
|
3
|
+
def notifications_for(destination, opts = {})
|
4
|
+
opts = set_default_options(opts)
|
5
|
+
|
6
|
+
content_tag opts[:container], '',
|
7
|
+
id: 'js-notifications-container',
|
8
|
+
class: opts[:container_class],
|
9
|
+
data: {
|
10
|
+
firebase_project_id: Notifications.configuration.firebase_project_id,
|
11
|
+
firebase_api_key: Notifications.configuration.firebase_api_key,
|
12
|
+
destination: destination,
|
13
|
+
notification_container: opts[:notification_container],
|
14
|
+
notification_container_class: opts[:notification_container_class],
|
15
|
+
notification_class: opts[:notification_class]
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
def notifications_count_for(origin, opts = {})
|
20
|
+
content_tag (opts[:container] || :div), '',
|
21
|
+
id: 'js-notifications-count',
|
22
|
+
class: opts[:container_class]
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def set_default_options(opts)
|
28
|
+
opts[:container] ||= :div
|
29
|
+
opts[:container_class] ||= ''
|
30
|
+
opts[:notification_container] ||= :div
|
31
|
+
opts[:notification_container_class] ||= ''
|
32
|
+
opts[:notificaton_class] ||= ''
|
33
|
+
|
34
|
+
opts
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'openssl'
|
3
|
+
require 'uri'
|
4
|
+
require 'json'
|
5
|
+
require 'faraday'
|
6
|
+
|
7
|
+
module Notifications
|
8
|
+
class Uploader
|
9
|
+
class << self
|
10
|
+
def call(origin: nil, destination:, text:, link:, created_at: Time.now)
|
11
|
+
message = JSON.generate(
|
12
|
+
origin: origin,
|
13
|
+
text: text,
|
14
|
+
link: link,
|
15
|
+
read_at: false,
|
16
|
+
created_at: created_at.to_datetime.to_i
|
17
|
+
)
|
18
|
+
|
19
|
+
connection = Faraday.new(url: firebase_host)
|
20
|
+
|
21
|
+
connection.post do |req|
|
22
|
+
req.url "/notifications/#{destination}.json"
|
23
|
+
req.headers['Content-Type'] = 'application/json'
|
24
|
+
req.body = message
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def firebase_host
|
31
|
+
project_id = Notifications.configuration.firebase_project_id
|
32
|
+
|
33
|
+
"https://#{project_id}.firebaseio.com"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'rails/railtie'
|
2
|
+
require 'action_view/railtie'
|
3
|
+
require 'action_controller/railtie'
|
4
|
+
|
5
|
+
module Notifications
|
6
|
+
def self.configure
|
7
|
+
@configuration ||= Configuration.new
|
8
|
+
|
9
|
+
yield @configuration if block_given?
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.configuration
|
13
|
+
@configuration
|
14
|
+
end
|
15
|
+
|
16
|
+
class Configuration
|
17
|
+
attr_accessor :firebase_project_id, :firebase_api_key
|
18
|
+
end
|
19
|
+
|
20
|
+
configure
|
21
|
+
end
|
22
|
+
|
23
|
+
require 'notifications/version'
|
24
|
+
require 'notifications/uploader'
|
25
|
+
require 'notifications/engine'
|
26
|
+
require 'notifications/railtie'
|
27
|
+
require 'notifications/helper'
|
@@ -0,0 +1,45 @@
|
|
1
|
+
|
2
|
+
# -*- encoding: utf-8 -*-
|
3
|
+
$:.push File.expand_path("../lib", __FILE__)
|
4
|
+
|
5
|
+
require 'notifications/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.name = 'unagi-notifications'
|
9
|
+
spec.version = Notifications::VERSION
|
10
|
+
spec.platform = Gem::Platform::RUBY
|
11
|
+
spec.authors = ['Lucas Hourquebie']
|
12
|
+
spec.email = ['lucashour1993@gmail.com']
|
13
|
+
|
14
|
+
spec.summary = 'Notifications system integration'
|
15
|
+
spec.description = 'Notifications system using Google Firebase for Realtime Database'
|
16
|
+
spec.homepage = 'http://unagi.com.ar'
|
17
|
+
spec.license = 'MIT'
|
18
|
+
|
19
|
+
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
20
|
+
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
21
|
+
if spec.respond_to?(:metadata)
|
22
|
+
spec.metadata["allowed_push_host"] = 'https://rubygems.org'
|
23
|
+
else
|
24
|
+
raise "RubyGems 2.0 or newer is required to protect against " \
|
25
|
+
"public gem pushes."
|
26
|
+
end
|
27
|
+
|
28
|
+
spec.files = [
|
29
|
+
'lib/notifications',
|
30
|
+
'lib/notifications/uploader',
|
31
|
+
'lib/notifications/engine',
|
32
|
+
'lib/notifications/realtie',
|
33
|
+
'lib/notifications/helper'
|
34
|
+
]
|
35
|
+
spec.files = `git ls-files`.split("\n")
|
36
|
+
spec.test_files = `git ls-files -- {spec}/*`.split("\n")
|
37
|
+
spec.require_paths = ['lib']
|
38
|
+
|
39
|
+
spec.add_development_dependency "bundler", "~> 1.16"
|
40
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
41
|
+
|
42
|
+
spec.add_runtime_dependency 'actionpack', '>= 3.2'
|
43
|
+
spec.add_runtime_dependency 'railties', '>= 3.2'
|
44
|
+
spec.add_dependency 'faraday'
|
45
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: unagi-notifications
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Lucas Hourquebie
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-07-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.16'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.16'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: actionpack
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.2'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.2'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: railties
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.2'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.2'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: faraday
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: Notifications system using Google Firebase for Realtime Database
|
84
|
+
email:
|
85
|
+
- lucashour1993@gmail.com
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- ".DS_Store"
|
91
|
+
- ".gitignore"
|
92
|
+
- ".travis.yml"
|
93
|
+
- Gemfile
|
94
|
+
- Gemfile.lock
|
95
|
+
- LICENSE.txt
|
96
|
+
- README.md
|
97
|
+
- Rakefile
|
98
|
+
- lib/assets/javascripts/firebase.js
|
99
|
+
- lib/assets/javascripts/unagi-notifications.js
|
100
|
+
- lib/notifications.rb
|
101
|
+
- lib/notifications/engine.rb
|
102
|
+
- lib/notifications/helper.rb
|
103
|
+
- lib/notifications/railtie.rb
|
104
|
+
- lib/notifications/uploader.rb
|
105
|
+
- lib/notifications/version.rb
|
106
|
+
- notifications.gemspec
|
107
|
+
- test/notifications_test.rb
|
108
|
+
- test/test_helper.rb
|
109
|
+
homepage: http://unagi.com.ar
|
110
|
+
licenses:
|
111
|
+
- MIT
|
112
|
+
metadata:
|
113
|
+
allowed_push_host: https://rubygems.org
|
114
|
+
post_install_message:
|
115
|
+
rdoc_options: []
|
116
|
+
require_paths:
|
117
|
+
- lib
|
118
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '0'
|
123
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '0'
|
128
|
+
requirements: []
|
129
|
+
rubyforge_project:
|
130
|
+
rubygems_version: 2.6.8
|
131
|
+
signing_key:
|
132
|
+
specification_version: 4
|
133
|
+
summary: Notifications system integration
|
134
|
+
test_files: []
|