hanami/lib/hanami/extensions/view/context.rb

108 lines
2.4 KiB
Ruby

# frozen_string_literal: true
require "hanami/view"
require "hanami/view/context"
require_relative "../../errors"
require_relative "../../slice_configurable"
require_relative "slice_configured_context"
module Hanami
module Extensions
module View
# View context for views in Hanami apps.
#
# This is NOT RELEASED as of 2.0.0.
#
# @api private
module Context
def self.included(context_class)
super
context_class.extend(Hanami::SliceConfigurable)
context_class.extend(ClassMethods)
context_class.prepend(InstanceMethods)
end
module ClassMethods
def configure_for_slice(slice)
extend SliceConfiguredContext.new(slice)
end
end
module InstanceMethods
# @see SliceConfiguredContext#define_new
def initialize(**kwargs)
defaults = {content: {}}
super(**kwargs, **defaults)
end
def inflector
_options.fetch(:inflector)
end
def routes
_options.fetch(:routes)
end
def settings
_options.fetch(:settings)
end
def assets
unless _options[:assets]
raise Hanami::ComponentLoadError, "hanami-assets gem is required to access assets"
end
_options[:assets]
end
def content_for(key, value = nil, &block)
content = _options[:content]
output = nil
if block
content[key] = yield
elsif value
content[key] = value
else
output = content[key]
end
output
end
def current_path
request.fullpath
end
def csrf_token
request.session[Hanami::Action::CSRFProtection::CSRF_TOKEN]
end
def request
_options.fetch(:request)
end
def session
request.session
end
def flash
response.flash
end
private
# TODO: create `Request#flash` so we no longer need the `response`
def response
_options.fetch(:response)
end
end
end
end
end
end
Hanami::View::Context.include(Hanami::Extensions::View::Context)