require "active_support/json" require "active_support/core_ext/hash/indifferent_access" module IntercomRails # Helper methods for generating Intercom javascript script tags. module ScriptTagHelper # @param user_details [Hash] a customizable hash of user details # @param options [Hash] an optional hash for secure mode and widget customisation # @option user_details [String] :app_id Your application id (get it here) # @option user_details [String] :user_id unique id of this user within your application # @option user_details [String] :email email address for this user # @option user_details [String] :name the users name, _optional_ but useful for identify people in the Intercom App. # @option user_details [Hash] :custom_data custom attributes you'd like saved for this user on Intercom. See # @option options [String] :activator a css selector for an element which when clicked should show the Intercom widget # @return [String] Intercom script tag # @example basic example # <%= intercom_script_tag({ :app_id => "your-app-id", # :user_id => current_user.id, # :email => current_user.email, # :custom_data => { :plan => current_user.plan.name }, # :name => current_user.name } # ) %> # @example with widget activator for launching then widget when an element matching the css selector '#Intercom' is clicked. # <%= intercom_script_tag({ :app_id => "your-app-id", # :user_id => current_user.id, # :email => current_user.email, # :custom_data => { :plan => current_user.plan.name }, # :name => current_user.name } # {:activator => "#Intercom"} # ) %> def intercom_script_tag(user_details, options={}) if options[:secret] secret_string = "#{options[:secret]}#{user_details[:id].blank? ? user_details[:email] : user_details[:id]}" user_details[:user_hash] = Digest::SHA1.hexdigest(secret_string) end intercom_settings = user_details.merge({:widget => options[:widget]}).with_indifferent_access intercom_settings_with_dates_as_timestamps = convert_dates_to_unix_timestamps(intercom_settings) intercom_settings_with_dates_as_timestamps.reject! { |key, value| %w(email name user_id).include?(key.to_s) && value.nil? } intercom_script = <<-INTERCOM_SCRIPT INTERCOM_SCRIPT intercom_script.respond_to?(:html_safe) ? intercom_script.html_safe : intercom_script end private def convert_dates_to_unix_timestamps(object) return Hash[object.map { |k, v| [k, convert_dates_to_unix_timestamps(v)] }] if object.is_a?(Hash) return object.strftime('%s').to_i if object.respond_to?(:strftime) object end end end