cubism 0.1.0.pre3 → 0.1.0.pre4
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 +4 -4
- data/README.md +58 -10
- data/app/channels/cubism/presence_channel.rb +24 -1
- data/app/channels/cubism/presence_channel.rb~ +6 -2
- data/app/helpers/cubism_helper.rb +14 -5
- data/app/helpers/cubism_helper.rb~ +15 -2
- data/app/models/concerns/cubism/presence.rb +5 -3
- data/app/models/concerns/cubism/user.rb +0 -4
- data/app/models/concerns/cubism/user.rb~ +11 -0
- data/app/models/cubism/current.rb +5 -0
- data/app/models/cubism/current.rb~ +0 -0
- data/lib/cubism/broadcaster.rb +37 -0
- data/lib/cubism/broadcaster.rb~ +35 -0
- data/lib/cubism/cubicle_block_store.rb +27 -0
- data/lib/cubism/cubicle_block_store.rb~ +0 -0
- data/lib/cubism/version.rb +1 -1
- data/lib/cubism/version.rb~ +1 -1
- data/lib/cubism.rb +8 -0
- data/lib/cubism.rb~ +2 -0
- metadata +24 -6
- data/app/jobs/cubism/stream_presence_job.rb +0 -15
- data/app/jobs/cubism/stream_presence_job.rb~ +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: af6a4e98fdf0f80e86235cd109e063af6535651ab112bb6b50329eda64eae2ef
|
4
|
+
data.tar.gz: 85dd646220a2d3b040ac409489e52462f969fbd935d66abe234f1eeebf51828c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c8eb831972225222b251825d9accccbebdb09aaf9298c963a0355501be3a94ecd6d26be1af60dd78bc74ee279da83cf24aa612a73cb90a33b07ade5e64e00619
|
7
|
+
data.tar.gz: 18e35469a81269c4b23e17fb141543594fb44d0195c8e48650d7c895c82ed0c2dfa4ad65ddab6a06a194b2ddc8c252de64c4fdb5403b940acb925d72d044f758
|
data/README.md
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
# Cubism
|
2
|
+
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
3
|
+
[](#contributors-)
|
4
|
+
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
2
5
|
[](https://twitter.com/julian_rubisch)
|
3
6
|
|
4
7
|
Lightweight Resource-Based Presence Solution with CableReady
|
@@ -8,7 +11,8 @@ Lightweight Resource-Based Presence Solution with CableReady
|
|
8
11
|
- [Table of Contents](#table-of-contents)
|
9
12
|
- [Usage](#usage)
|
10
13
|
- [Installation](#installation)
|
11
|
-
- [
|
14
|
+
- [API](#api)
|
15
|
+
- [Gotchas](#gotchas)
|
12
16
|
- [Contributing](#contributing)
|
13
17
|
- [License](#license)
|
14
18
|
- [Contributors](#contributors)
|
@@ -16,12 +20,11 @@ Lightweight Resource-Based Presence Solution with CableReady
|
|
16
20
|
## Usage
|
17
21
|
|
18
22
|
### Prepare your User Model
|
19
|
-
In your app's `User` model, include `Cubism::User
|
23
|
+
In your app's `User` model, include `Cubism::User`:
|
20
24
|
|
21
25
|
```rb
|
22
26
|
class User < ApplicationRecord
|
23
27
|
include Cubism::User
|
24
|
-
self.cubicle_attributes = %i[email id]
|
25
28
|
|
26
29
|
# ...
|
27
30
|
end
|
@@ -33,6 +36,8 @@ In the models you'd like to track presence for, include the `Cubism::Presence` c
|
|
33
36
|
```rb
|
34
37
|
class Project < ApplicationRecord
|
35
38
|
include Cubism::Presence
|
39
|
+
|
40
|
+
# ...
|
36
41
|
end
|
37
42
|
```
|
38
43
|
|
@@ -41,18 +46,14 @@ end
|
|
41
46
|
Using the `cubicle_for` helper, you can set up a presence indicator. It will
|
42
47
|
|
43
48
|
1. subscribe to the respective resource, and
|
44
|
-
2.
|
49
|
+
2. render a block which is passed the list of present `users`:
|
45
50
|
|
46
51
|
```erb
|
47
|
-
<%= cubicle_for @project, current_user do %>
|
48
|
-
|
49
|
-
<span data-cubicle-attribute="email"></span>
|
50
|
-
</span>
|
52
|
+
<%= cubicle_for @project, current_user do |users| %>
|
53
|
+
<%= users.map(&:username).join(", ")
|
51
54
|
<% end %>
|
52
55
|
```
|
53
56
|
|
54
|
-
Note that this template will simply be repeated for every user that's in the `@project`s `present_users` set.
|
55
|
-
|
56
57
|
## Installation
|
57
58
|
Add this line to your application's Gemfile:
|
58
59
|
|
@@ -86,6 +87,39 @@ import "@minthesize/cubism";
|
|
86
87
|
CableReady.initialize({ consumer });
|
87
88
|
```
|
88
89
|
|
90
|
+
## API
|
91
|
+
|
92
|
+
The `cubicle_for` helper accepts the following options as keyword arguments:
|
93
|
+
|
94
|
+
- `exclude_current_user (true|false)`: Whether or not to exclude the current user from the list of present users broadcasted to the view. Useful e.g. for "typing..." indicators.
|
95
|
+
- `appear_trigger`: a JavaScript event name (e.g. `:focus`) to use. The default is `:connect`, i.e. register a user as "appeared"/"present" when the element connects to the DOM.
|
96
|
+
- `disappear_trigger`: a JavaScript event name (e.g. `:blur`) to use. The default is `:disconnect`, i.e. remove a user form the present users list when the element disconnects from the DOM.
|
97
|
+
- `trigger_root`: a CSS selector to attach the appear/disappear events to. Defaults to the `cubicle-element` itself.
|
98
|
+
- `html_options` are passed to the TagBuilder.
|
99
|
+
|
100
|
+
## Gotchas
|
101
|
+
|
102
|
+
### Usage with ViewComponent
|
103
|
+
|
104
|
+
Currently there's a bug in VC resulting in the `capture` helper not working correctly (https://github.com/github/view_component/pull/974). The current workaround is to assign a slot in your component and render the presence list from outside:
|
105
|
+
|
106
|
+
```rb
|
107
|
+
class MyComponent < ViewComponent::Base
|
108
|
+
renders_one :presence_list
|
109
|
+
|
110
|
+
# ...
|
111
|
+
end
|
112
|
+
```
|
113
|
+
|
114
|
+
```erb
|
115
|
+
<%= render MyComponent.new do |c| %>
|
116
|
+
<% c.presence_list do %>
|
117
|
+
<%= cubicle_for @project, current_user do |users| %>
|
118
|
+
...
|
119
|
+
<% end %>
|
120
|
+
<% end %>
|
121
|
+
<% end %>
|
122
|
+
```
|
89
123
|
|
90
124
|
## Contributing
|
91
125
|
|
@@ -130,3 +164,17 @@ yarn install --force
|
|
130
164
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
131
165
|
|
132
166
|
## Contributors
|
167
|
+
|
168
|
+
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
169
|
+
<!-- prettier-ignore-start -->
|
170
|
+
<!-- markdownlint-disable -->
|
171
|
+
<table>
|
172
|
+
<tr>
|
173
|
+
<td align="center"><a href="http://www.minthesize.com"><img src="https://avatars.githubusercontent.com/u/4352208?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Julian Rubisch</b></sub></a><br /><a href="https://github.com/julianrubisch/cubism/commits?author=julianrubisch" title="Code">💻</a></td>
|
174
|
+
</tr>
|
175
|
+
</table>
|
176
|
+
|
177
|
+
<!-- markdownlint-restore -->
|
178
|
+
<!-- prettier-ignore-end -->
|
179
|
+
|
180
|
+
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
@@ -4,7 +4,8 @@ class Cubism::PresenceChannel < ActionCable::Channel::Base
|
|
4
4
|
def subscribed
|
5
5
|
if resource.present?
|
6
6
|
stream_for resource
|
7
|
-
resource.
|
7
|
+
resource.cubicle_element_ids << element_id
|
8
|
+
resource.excluded_user_id_for_element_id[element_id] = user.id if exclude_current_user?
|
8
9
|
else
|
9
10
|
reject
|
10
11
|
end
|
@@ -13,6 +14,16 @@ class Cubism::PresenceChannel < ActionCable::Channel::Base
|
|
13
14
|
def unsubscribed
|
14
15
|
return unless resource.present?
|
15
16
|
|
17
|
+
resource.cubicle_element_ids.remove(element_id)
|
18
|
+
resource.excluded_user_id_for_element_id.delete(element_id)
|
19
|
+
disappear
|
20
|
+
end
|
21
|
+
|
22
|
+
def appear
|
23
|
+
resource.present_users.add(user.id)
|
24
|
+
end
|
25
|
+
|
26
|
+
def disappear
|
16
27
|
resource.present_users.remove(user.id)
|
17
28
|
end
|
18
29
|
|
@@ -26,4 +37,16 @@ class Cubism::PresenceChannel < ActionCable::Channel::Base
|
|
26
37
|
def user
|
27
38
|
GlobalID::Locator.locate_signed(params[:user])
|
28
39
|
end
|
40
|
+
|
41
|
+
def exclude_current_user?
|
42
|
+
params[:exclude_current_user]
|
43
|
+
end
|
44
|
+
|
45
|
+
def element_id
|
46
|
+
params[:element_id]
|
47
|
+
end
|
48
|
+
|
49
|
+
def url
|
50
|
+
params[:url]
|
51
|
+
end
|
29
52
|
end
|
@@ -4,7 +4,7 @@ class Cubism::PresenceChannel < ActionCable::Channel::Base
|
|
4
4
|
def subscribed
|
5
5
|
if resource.present?
|
6
6
|
stream_for resource
|
7
|
-
resource.present_users.add(
|
7
|
+
resource.present_users.add(user.id)
|
8
8
|
else
|
9
9
|
reject
|
10
10
|
end
|
@@ -13,7 +13,7 @@ class Cubism::PresenceChannel < ActionCable::Channel::Base
|
|
13
13
|
def unsubscribed
|
14
14
|
return unless resource.present?
|
15
15
|
|
16
|
-
resource.present_users.remove(
|
16
|
+
resource.present_users.remove(user.id)
|
17
17
|
end
|
18
18
|
|
19
19
|
private
|
@@ -22,4 +22,8 @@ class Cubism::PresenceChannel < ActionCable::Channel::Base
|
|
22
22
|
locator = verified_stream_identifier(params[:identifier])
|
23
23
|
GlobalID::Locator.locate(locator)
|
24
24
|
end
|
25
|
+
|
26
|
+
def user
|
27
|
+
GlobalID::Locator.locate_signed(params[:user])
|
28
|
+
end
|
25
29
|
end
|
@@ -1,11 +1,20 @@
|
|
1
1
|
module CubismHelper
|
2
2
|
include CableReady::StreamIdentifier
|
3
3
|
|
4
|
-
def cubicle_for(resource, user, html_options: {}, &block)
|
5
|
-
|
4
|
+
def cubicle_for(resource, user, html_options: {}, appear_trigger: :connect, disappear_trigger: nil, trigger_root: nil, exclude_current_user: true, &block)
|
5
|
+
key = "#{block.source_location.join(":")}:#{resource.to_gid}:#{user.to_gid}"
|
6
|
+
digested_id = ActiveSupport::Digest.hexdigest(key)
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
Cubism.store[digested_id] = Cubism::BlockStoreItem.new(context: self, block: block.dup)
|
9
|
+
tag.cubicle_element(
|
10
|
+
identifier: signed_stream_identifier(resource.to_gid.to_s),
|
11
|
+
user: user.to_sgid.to_s,
|
12
|
+
"appear-trigger": appear_trigger,
|
13
|
+
"disappear-trigger": disappear_trigger,
|
14
|
+
"trigger-root": trigger_root,
|
15
|
+
id: "cubicle-#{digested_id}",
|
16
|
+
"exclude-current-user": exclude_current_user,
|
17
|
+
**html_options
|
18
|
+
)
|
10
19
|
end
|
11
20
|
end
|
@@ -1,10 +1,23 @@
|
|
1
1
|
module CubismHelper
|
2
2
|
include CableReady::StreamIdentifier
|
3
3
|
|
4
|
-
def cubicle_for(resource, html_options: {}, &block)
|
4
|
+
def cubicle_for(resource, user, html_options: {}, appear_trigger: :connect, disappear_trigger: nil, trigger_root: nil, exclude_current_user: true, &block)
|
5
|
+
key = "#{block.source_location.join(":")}:#{resource.to_gid}:#{user.to_gid}"
|
6
|
+
verifiable_id = CableReady.signed_stream_verifier.generate(key)
|
7
|
+
|
8
|
+
Cubism.store[verifiable_id] = Cubism::BlockStoreItem.new(context: self, block: block.dup)
|
5
9
|
template = capture(&block)
|
6
10
|
|
7
|
-
tag.cubicle_element(
|
11
|
+
tag.cubicle_element(
|
12
|
+
identifier: signed_stream_identifier(resource.to_gid.to_s),
|
13
|
+
user: user.to_sgid.to_s,
|
14
|
+
"appear-trigger": appear_trigger,
|
15
|
+
"disappear-trigger": disappear_trigger,
|
16
|
+
"trigger-root": trigger_root,
|
17
|
+
id: "cubicle-#{verifiable_id}",
|
18
|
+
"exclude-current-user": exclude_current_user,
|
19
|
+
**html_options
|
20
|
+
) do
|
8
21
|
content_tag(:template, template, {slot: "template"})
|
9
22
|
end
|
10
23
|
end
|
@@ -2,10 +2,12 @@ module Cubism::Presence
|
|
2
2
|
extend ActiveSupport::Concern
|
3
3
|
|
4
4
|
included do
|
5
|
-
kredis_set :present_users, after_change: :
|
5
|
+
kredis_set :present_users, after_change: :stream_presence
|
6
|
+
kredis_set :cubicle_element_ids
|
7
|
+
kredis_hash :excluded_user_id_for_element_id
|
6
8
|
end
|
7
9
|
|
8
|
-
def
|
9
|
-
Cubism::
|
10
|
+
def stream_presence
|
11
|
+
Cubism::Broadcaster.new(resource: self).broadcast
|
10
12
|
end
|
11
13
|
end
|
File without changes
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require "cable_ready"
|
2
|
+
|
3
|
+
module Cubism
|
4
|
+
class Broadcaster
|
5
|
+
include CableReady::Broadcaster
|
6
|
+
include CableReady::StreamIdentifier
|
7
|
+
|
8
|
+
attr_reader :resource
|
9
|
+
|
10
|
+
def initialize(resource:)
|
11
|
+
@resource = resource
|
12
|
+
end
|
13
|
+
|
14
|
+
def broadcast
|
15
|
+
resource.cubicle_element_ids.to_a.each do |element_id|
|
16
|
+
/cubicle-(?<block_key>.+)/ =~ element_id
|
17
|
+
block = Cubism.store[block_key].block
|
18
|
+
view_context = Cubism.store[block_key].context
|
19
|
+
html = view_context.capture(users_for(resource, element_id), &block)
|
20
|
+
|
21
|
+
cable_ready[Cubism::PresenceChannel].inner_html(
|
22
|
+
selector: "cubicle-element##{element_id}[identifier='#{signed_stream_identifier(resource.to_global_id.to_s)}']",
|
23
|
+
html: html
|
24
|
+
).broadcast_to(resource)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def users_for(resource, element_id)
|
31
|
+
users = Cubism.user_class.find(resource.present_users.members)
|
32
|
+
users.reject! { |user| user.id == resource.excluded_user_id_for_element_id[element_id].to_i }
|
33
|
+
|
34
|
+
users
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Cubism
|
2
|
+
class Broadcaster
|
3
|
+
include CableReady::Broadcaster
|
4
|
+
include CableReady::StreamIdentifier
|
5
|
+
|
6
|
+
attr_reader :resource
|
7
|
+
|
8
|
+
def initialize(resource:)
|
9
|
+
@resource = resource
|
10
|
+
end
|
11
|
+
|
12
|
+
def broadcast
|
13
|
+
resource.cubicle_element_ids.to_a.each do |element_id|
|
14
|
+
/cubicle-(?<block_key>.+)/ =~ element_id
|
15
|
+
block = Cubism.store[block_key].block
|
16
|
+
view_context = Cubism.store[block_key].context
|
17
|
+
html = view_context.capture(users_for(resource, element_id), &block)
|
18
|
+
|
19
|
+
cable_ready[Cubism::PresenceChannel].inner_html(
|
20
|
+
selector: "cubicle-element##{element_id}[identifier='#{signed_stream_identifier(resource.to_global_id.to_s)}']",
|
21
|
+
html: html
|
22
|
+
).broadcast_to(resource)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def users_for(resource, element_id)
|
29
|
+
users = Cubism.user_class.find(resource.present_users.members)
|
30
|
+
users.reject! { |user| user.id == resource.excluded_user_id_for_element_id[element_id].to_i }
|
31
|
+
|
32
|
+
users
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Cubism
|
2
|
+
class CubicleBlockStore
|
3
|
+
include Singleton
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@blocks = {}
|
7
|
+
end
|
8
|
+
|
9
|
+
def [](key)
|
10
|
+
@blocks[key]
|
11
|
+
end
|
12
|
+
|
13
|
+
def []=(key, value)
|
14
|
+
mutex.synchronize do
|
15
|
+
@blocks[key] = value
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def mutex
|
22
|
+
@mutex ||= Mutex.new
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
BlockStoreItem = Struct.new(:context, :block, keyword_init: true)
|
27
|
+
end
|
File without changes
|
data/lib/cubism/version.rb
CHANGED
data/lib/cubism/version.rb~
CHANGED
data/lib/cubism.rb
CHANGED
@@ -2,7 +2,15 @@ require "kredis"
|
|
2
2
|
|
3
3
|
require "cubism/version"
|
4
4
|
require "cubism/engine"
|
5
|
+
require "cubism/broadcaster"
|
6
|
+
require "cubism/cubicle_block_store"
|
5
7
|
|
6
8
|
module Cubism
|
9
|
+
extend ActiveSupport::Autoload
|
10
|
+
|
11
|
+
autoload :Broadcaster, "cubism/broadcaster"
|
12
|
+
|
7
13
|
mattr_accessor :user_class, instance_writer: false, instance_reader: false
|
14
|
+
|
15
|
+
mattr_reader :store, instance_reader: false, default: Cubism::CubicleBlockStore.instance
|
8
16
|
end
|
data/lib/cubism.rb~
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cubism
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.0.
|
4
|
+
version: 0.1.0.pre4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julian Rubisch
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-12-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -44,14 +44,28 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - '='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 5.0.0.
|
47
|
+
version: 5.0.0.pre8
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 5.0.0.
|
54
|
+
version: 5.0.0.pre8
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: standard
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -81,8 +95,6 @@ files:
|
|
81
95
|
- app/channels/cubism/presence_channel.rb~
|
82
96
|
- app/helpers/cubism_helper.rb
|
83
97
|
- app/helpers/cubism_helper.rb~
|
84
|
-
- app/jobs/cubism/stream_presence_job.rb
|
85
|
-
- app/jobs/cubism/stream_presence_job.rb~
|
86
98
|
- app/models/concerns/cubism/base.rb~
|
87
99
|
- app/models/concerns/cubism/presence.rb
|
88
100
|
- app/models/concerns/cubism/presence.rb~
|
@@ -90,9 +102,15 @@ files:
|
|
90
102
|
- app/models/concerns/cubism/user.rb~
|
91
103
|
- app/models/cubism/base.rb
|
92
104
|
- app/models/cubism/base.rb~
|
105
|
+
- app/models/cubism/current.rb
|
106
|
+
- app/models/cubism/current.rb~
|
93
107
|
- config/routes.rb
|
94
108
|
- lib/cubism.rb
|
95
109
|
- lib/cubism.rb~
|
110
|
+
- lib/cubism/broadcaster.rb
|
111
|
+
- lib/cubism/broadcaster.rb~
|
112
|
+
- lib/cubism/cubicle_block_store.rb
|
113
|
+
- lib/cubism/cubicle_block_store.rb~
|
96
114
|
- lib/cubism/engine.rb
|
97
115
|
- lib/cubism/engine.rb~
|
98
116
|
- lib/cubism/railtie.rb~
|
@@ -1,15 +0,0 @@
|
|
1
|
-
class Cubism::StreamPresenceJob < ApplicationJob
|
2
|
-
include CableReady::Broadcaster
|
3
|
-
include CableReady::StreamIdentifier
|
4
|
-
queue_as :default
|
5
|
-
|
6
|
-
def perform(resource:)
|
7
|
-
cable_ready[Cubism::PresenceChannel].dispatch_event(
|
8
|
-
name: "cubism:update",
|
9
|
-
selector: "cubicle-element[identifier='#{signed_stream_identifier(resource.to_global_id.to_s)}']",
|
10
|
-
detail: {
|
11
|
-
users: Cubism.user_class.find(resource.present_users.members).map { |user| user.slice(user.cubicle_attributes) }.as_json
|
12
|
-
}
|
13
|
-
).broadcast_to(resource)
|
14
|
-
end
|
15
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
class Cubism::StreamPresenceJob < ApplicationJob
|
2
|
-
include CableReady::Broadcaster
|
3
|
-
queue_as :default
|
4
|
-
|
5
|
-
def perform(resource:)
|
6
|
-
cable_ready[Cubism::PresenceChannel].outer_html(
|
7
|
-
selector: dom_id(resource, "cubicle").to_s,
|
8
|
-
html: ApplicationController.render(partial: "shared/presence_indicator", locals: {users: User.where(id: resource.present_users.members)})
|
9
|
-
).broadcast
|
10
|
-
end
|
11
|
-
end
|