Sha256: 18eb1109d829502cf319fcdf28b7b0ee805a3bbe2c6da5bdf54c7d8200133ba2

Contents?: true

Size: 1.27 KB

Versions: 1

Compression:

Stored size: 1.27 KB

Contents

module WithPopup
  class Rack

    def initialize(app)
      @app = app
    end

    def call(env)
      @env = env
      @status, @headers, @response = @app.call(env)
      return [@status, @headers, @response] unless need_injection?
      body = inject_js_to_the_response
      clear_param!
      [@status, @headers, [body]]
    end

    private

    def need_injection?
      @status == 200 && html? && popup_param
    end

    def html?
      @headers["Content-Type"].try(:include?, "text/html")
    end

    def popup_param
      session[:_with_popup]
    end

    def session
      @env['rack.session']
    end

    def clear_param!
      session.delete :_with_popup
    end

    def inject_js_to_the_response
      body = @response.try(:body) || @response.first
      js = popup_param == :close ? close_popup_js : reload_popup_js
      body.sub('</body>', js + '</body>')
    end

    def close_popup_js
      <<-JS
        <script type="text/javascript">
          var popup = open('', 'withPopup');
          popup && popup.close();
        </script>
      JS
    end

    def reload_popup_js
      <<-JS
        <script type="text/javascript">
          var popup = open('', 'withPopup');
          popup && (popup.location.href = '#{popup_param}');
        </script>
      JS
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
with_popup-0.1.0 lib/with_popup/rack.rb