Class: Www::ReviewsIo::ReviewListComponent

Inherits:
ApplicationComponent show all
Includes:
Concerns::ReviewsIoSupport
Defined in:
app/components/www/reviews_io/review_list_component.rb

Overview

Full-page review list component with client-side pagination and sorting.
All reviews are loaded upfront and handled by JavaScript.

Usage:
<%= render Www::ReviewsIo::ReviewListComponent.new(
product_line: 'floor-heating'
) %>

<%= render Www::ReviewsIo::ReviewListComponent.new(
skus: ['SKU-001', 'SKU-002'],
reviews_per_page: 10
) %>

With curated tag-based reviews merged in:

<%= render Www::ReviewsIo::ReviewListComponent.new(
product_line: 'infrared-heating-panel',
tags: ['for-infrared-heating-panels-page']
) %>

Constant Summary collapse

REVIEWS_PER_PAGE =

Reviews per page.

15
SORT_OPTIONS =

Available sort options.

{
  'newest' => 'Newest First',
  'oldest' => 'Oldest First',
  'highest' => 'Highest Rated',
  'lowest' => 'Lowest Rated'
}.freeze

Instance Method Summary collapse

Methods inherited from ApplicationComponent

#cms_link, #fetch_or_fallback, #image_asset_tag, #image_tag, #number_to_currency, #number_with_delimiter, #post_path, #post_url, #strip_tags

Constructor Details

#initialize(skus: nil, product_line: nil, tags: nil, reviews_per_page: REVIEWS_PER_PAGE, sort: 'newest', _page: 1) ⇒ void

Parameters:

  • skus (Array<String>, nil) (defaults to: nil)

    restrict reviews to these SKUs

  • product_line (String, nil) (defaults to: nil)

    derive SKUs from a product line slug

  • tags (Array<String>, String, nil) (defaults to: nil)

    merge in reviews tagged with these values

  • reviews_per_page (Integer) (defaults to: REVIEWS_PER_PAGE)

    reviews shown per page

  • sort (String) (defaults to: 'newest')

    default sort key from SORT_OPTIONS

  • _page (Integer) (defaults to: 1)

    unused; kept for backwards compatibility



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'app/components/www/reviews_io/review_list_component.rb', line 45

def initialize(
  skus: nil,
  product_line: nil,
  tags: nil,
  reviews_per_page: REVIEWS_PER_PAGE,
  sort: 'newest',
  _page: 1 # kept for backwards compatibility, ignored
)
  @skus = skus
  @product_line = product_line
  @tags = Array(tags).compact_blank.presence
  @reviews_per_page = reviews_per_page || REVIEWS_PER_PAGE
  @sort = sort
  super()
end

Instance Method Details

#render?Boolean

Returns true when there are SKUs or tags to render reviews for.

Returns:

  • (Boolean)

    true when there are SKUs or tags to render reviews for



62
63
64
# File 'app/components/www/reviews_io/review_list_component.rb', line 62

def render?
  resolved_skus.any? || @tags.present?
end