exercism/website

View on GitHub
app/helpers/view_components/contributing/header.rb

Summary

Maintainability
A
1 hr
Test Coverage
module ViewComponents
  module Contributing
    class Header < ViewComponent
      TABS = %i[dashboard contributors tasks].freeze

      initialize_with :selected_tab

      def to_s
        guard!

        tag.nav(class: 'c-contributing-header c-header-with-bg') do
          top + nav
        end
      end

      def top
        tag.div(class: 'lg-container top-container') do
          tag.div(class: 'content') do
            graphical_icon("contributing-header") +
              tag.h1("Let’s build the best coding education platform, together") +
              tag.p do
                safe_join(
                  [
                    "Exercism is an ",
                    link_to("open source, not-for-profit project", Exercism::Routes.about_path),
                    " built by people from all backgrounds. With over one hundred dedicated maintainers and thousands of contributors, our goal is to create the best, free, code learning platform on the web." # rubocop:disable Layout/LineLength
                  ]
                )
              end
          end +
            graphical_icon("contributing-header", category: "graphics", css_class: "hidden md:block") +
            tag.div('', class: 'decorations hidden lg:block')
        end
      end

      def nav
        tag.div(class: 'lg-container nav-container', data: { scrollable_container: true }) do
          tag.div(safe_join(tabs), class: 'tabs') +
            link_to(Exercism::Routes.docs_section_path(:building), class: "c-tab-2 guides") do
              graphical_icon(:guides) + tag.span("Contributing Help")
            end
        end
      end

      def tabs
        [
          link_to(
            Exercism::Routes.contributing_root_path,
            class: tab_class(:dashboard),
            data: scroll_into_view(:dashboard)
          ) do
            graphical_icon(:overview) +
              tag.span("Getting Started")
          end,

          link_to(
            Exercism::Routes.contributing_tasks_path,
            class: tab_class(:tasks),
            data: scroll_into_view(:tasks)
          ) do
            graphical_icon(:tasks) +
              tag.span("Explore tasks") +
              tag.span(number_with_delimiter(tasks_size), class: 'count')
          end,

          link_to(
            Exercism::Routes.contributing_contributors_path(period: :week),
            class: tab_class(:contributors),
            data: scroll_into_view(:contributors)
          ) do
            graphical_icon(:contributors) +
              tag.span("Contributors") +
              tag.span(number_with_delimiter(contributors_size), class: 'count')
          end

        ]
      end

      def tab_class(tab)
        "c-tab-2 #{'selected' if tab == selected_tab}"
      end

      def scroll_into_view(tab)
        { scroll_into_view: tab == selected_tab ? ScrollAxis::X : nil }
      end

      def guard!
        raise "Incorrect track nav tab" unless TABS.include?(selected_tab)
      end

      memoize
      def tasks_size
        number_with_delimiter(Github::Task.count)
      end

      memoize
      def contributors_size
        # TODO: (Optional) This might just be too slow to cope with, in which case consider caching it daily
        number_with_delimiter(User::ReputationPeriod.about_everything.forever.any_category.count)
      end
    end
  end
end