57 lines
1.2 KiB
Ruby
57 lines
1.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# @param type [String] Classic notification type `error`, `alert` and `info` + custom `success`
|
|
# @param data [String, Hash] `String` for backward compatibility,
|
|
# `Hash` for the new functionality `{title: '', body: '', timeout: 5, countdown: false, action: { url: '', method: '', name: ''}}`.
|
|
# The `title` attribute for `Hash` is mandatory.
|
|
class NotificationComponent < ViewComponent::Base
|
|
def initialize(type:, data:)
|
|
@type = type
|
|
@data = prepare_data(data)
|
|
@icon_name = icon_name
|
|
@icon_color_class = icon_color_class
|
|
|
|
@data[:timeout] ||= 5
|
|
@data[:action][:method] ||= "get" if @data[:action]
|
|
end
|
|
|
|
private
|
|
|
|
def prepare_data(data)
|
|
case data
|
|
when Hash
|
|
data
|
|
else
|
|
{ title: data }
|
|
end
|
|
end
|
|
|
|
def icon_name
|
|
case @type
|
|
when 'success'
|
|
'check-circle'
|
|
when 'error'
|
|
'alert-octagon'
|
|
when 'alert'
|
|
'alert-octagon'
|
|
when 'warning'
|
|
'alert-octagon'
|
|
else
|
|
'info'
|
|
end
|
|
end
|
|
|
|
def icon_color_class
|
|
case @type
|
|
when 'success'
|
|
'text-emerald-500'
|
|
when 'error'
|
|
'text-rose-600'
|
|
when 'alert'
|
|
'text-rose-600'
|
|
else
|
|
'text-gray-400'
|
|
end
|
|
end
|
|
end
|