Module: ActiveAdmin::Chat::Extensions::Application

Defined in:
lib/active_admin/chat/extensions/application.rb

Instance Method Summary collapse

Instance Method Details

#register_chat(name, options = {}, &block) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/active_admin/chat/extensions/application.rb', line 5

def register_chat(name, options = {}, &block)
  setup_page_configs(name, options[:namespace])

  register_page name, options do
    content do
      render 'active_admin/chat/chat'
    end

    controller do
      layout 'active_admin', only: :show
      helper_method :messages, :active_conversation, :conversations

      def show
        respond_to do |format|
          format.html { render 'active_admin/chat/show' }
          format.json do
            render json: ActiveAdmin::Chat::MessagePresenter.all(messages)
          end
        end
      end

      def create
        conversation =
          ActiveAdmin::Chat.conversation_klass
                           .find_or_create_by!(
                             "#{user_relation_name_id}": params[:"#{user_relation_name_id}"]
                           )
        redirect_to action: 'show', id: conversation
      end

      def active_conversation
        @active_conversation ||= ActiveAdmin::Chat.conversation_klass.find_by(
          id: params[:id]
        )
      end

      def conversations
        @conversations ||= ActiveAdmin::Chat.conversation_klass
                                            .includes(ActiveAdmin::Chat.user_relation_name)
      end

      def messages
        return [] unless active_conversation

        page_messages = active_conversation.public_send(
          ActiveAdmin::Chat.message_relation_name.pluralize
        ).includes(:sender).order(created_at: :desc)

        if params[:created_at].present?
          page_messages = page_messages.where('created_at < ?',
                                              DateTime.parse(params[:created_at]))
        end
        page_messages.limit(ActiveAdmin::Chat.messages_per_page).reverse
      end

      private

      def user_relation_name_id
        "#{ActiveAdmin::Chat.user_relation_name}_id"
      end
    end

    # customize default chat
    instance_eval(&block)
  end
end