decko-commons/decko

View on GitHub
card/lib/card/env/location_history.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
class Card
  module Env
    # session history helpers: we keep a history stack so that in the case of
    # card removal we can crawl back up to the last un-removed location
    module LocationHistory
      def location_history
        session[:history] ||= [Env::Location.card_path("")]
        session[:history].shift if session[:history].size > 5
        session[:history]
      end

      def save_location card
        return unless save_location?(card)

        discard_locations_for card
        session[:previous_location] =
          Env::Location.card_path card.name.url_key
        location_history.push previous_location
      end

      def save_location? card
        !Env.ajax? && Env.html? && card.known? && (card.codename != :signin)
      end

      def previous_location
        return unless location_history

        session[:previous_location] ||= location_history.last
      end

      def discard_locations_for card
        # quoting necessary because cards have things like "+*" in the names..
        session[:history] = location_history.reject do |loc|
          if (url_key = url_key_for_location(loc))
            url_key.to_name.key == card.key
          end
        end.compact
        session[:previous_location] = nil
      end

      def save_interrupted_action uri
        session[:interrupted_action] = uri
      end

      def interrupted_action
        session.delete :interrupted_action
      end

      def url_key_for_location location
        %r{/([^/]*$)} =~ location ? Regexp.last_match[1] : nil
      end
    end
  end
end