payment_methods.rb

 1# frozen_string_literal: true
 2
 3class PaymentMethods
 4	def self.for_braintree_customer(braintree_customer)
 5		methods = braintree_customer.payment_methods
 6		if methods.empty?
 7			Empty.new
 8		else
 9			new(methods)
10		end
11	end
12
13	def initialize(methods)
14		@methods = methods
15	end
16
17	def fetch(idx)
18		@methods.fetch(idx)
19	end
20
21	def default_payment_method
22		@methods.index(&:default?)&.to_s
23	end
24
25	def to_options
26		@methods.map.with_index do |method, idx|
27			{
28				value: idx.to_s,
29				label: "#{method.card_type} #{method.last_4}"
30			}
31		end
32	end
33
34	def to_list_single(**kwargs)
35		{
36			var: "payment_method",
37			type: "list-single",
38			label: "Credit card to pay with",
39			required: true,
40			value: default_payment_method,
41			options: to_options
42		}.merge(kwargs)
43	end
44
45	class Empty
46		def default_payment_method; end
47
48		def to_list_single(*)
49			raise "No payment methods available"
50		end
51	end
52end