app/pb_kits/playbook/pb_icon/icon.rb



# frozen_string_literal: true

# rubocop:disable Style/StringConcatenation, Style/HashLikeCase

require "open-uri"

module Playbook
  module PbIcon
    class Icon < Playbook::KitBase
      prop :border, type: Playbook::Props::Boolean,
                    default: false
      prop :fixed_width, type: Playbook::Props::Boolean,
                         default: false
      prop :flip, type: Playbook::Props::Enum,
                  values: ["horizontal", "vertical", "both", nil],
                  default: nil
      prop :icon
      prop :custom_icon, type: Playbook::Props::String,
                         default: nil
      prop :inverse, type: Playbook::Props::Boolean,
                     default: false
      prop :list_item, type: Playbook::Props::Boolean,
                       default: false
      prop :pull, type: Playbook::Props::Enum,
                  values: ["left", "right", nil],
                  default: nil
      prop :pulse, type: Playbook::Props::Boolean,
                   default: false
      prop :rotation, type: Playbook::Props::Enum,
                      values: [90, 180, 270, nil],
                      default: nil
      prop :size, type: Playbook::Props::Enum,
                  values: ["lg", "xs", "sm", "1x", "2x", "3x", "4x", "5x", "6x", "7x", "8x", "9x", "10x", nil],
                  default: nil
      prop :spin, type: Playbook::Props::Boolean,
                  default: false

      def classname
        generate_classname(
          "pb_icon_kit",
          "far",
          icon_class,
          border_class,
          fixed_width_class,
          flip_class,
          inverse_class,
          list_item_class,
          pull_class,
          pulse_class,
          rotation_class,
          size_class,
          spin_class,
          separator: " "
        )
      end

      def custom_icon_classname
        generate_classname(
          "pb_icon_kit",
          border_class,
          fixed_width_class,
          flip_class,
          inverse_class,
          list_item_class,
          pull_class,
          pulse_class,
          rotation_class,
          size_class,
          spin_class,
          separator: " "
        )
      end

      def render_svg(path)
        if File.extname(path) == ".svg"
          doc = Nokogiri::XML(URI.open(path)) # rubocop:disable Security/Open
          svg = doc.at_css "svg"
          svg["class"] = "pb_custom_icon " + object.custom_icon_classname
          raw doc
        else
          raise("Custom icon must be an svg. Please check your path and file type.")
        end
      end

    private

      def border_class
        border ? "fa-border" : nil
      end

      def fixed_width_class
        fixed_width ? "fa-fw" : nil
      end

      def icon_class
        icon ? "fa-#{icon}" : nil
      end

      def inverse_class
        inverse ? "fa-inverse" : nil
      end

      def list_item_class
        list_item ? "fa-li" : nil
      end

      def flip_class
        case flip
        when "horizontal"
          "fa-flip-horizontal"
        when "vertical"
          "fa-flip-vertical"
        when "both"
          "fa-flip-horizontal fa-flip-vertical"
        end
      end

      def pull_class
        pull ? "fa-pull-#{pull}" : nil
      end

      def pulse_class
        pulse ? "fa-pulse" : nil
      end

      def rotation_class
        rotation ? "fa-rotate-#{rotation}" : nil
      end

      def size_class
        size ? "fa-#{size}" : nil
      end

      def spin_class
        spin ? "fa-spin" : nil
      end
    end
  end
end

# rubocop:enable Style/StringConcatenation, Style/HashLikeCase