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.find(&:default?)
23	end
24
25	def default_payment_method_index
26		@methods.index(&:default?)&.to_s
27	end
28
29	def to_options
30		@methods.map.with_index do |method, idx|
31			{
32				value: idx.to_s,
33				label: "#{method.card_type} #{method.last_4}"
34			}
35		end
36	end
37
38	def to_list_single(**kwargs)
39		{
40			var: "payment_method",
41			type: "list-single",
42			label: "Credit card to pay with",
43			required: true,
44			value: default_payment_method_index,
45			options: to_options
46		}.merge(kwargs)
47	end
48
49	def empty?
50		false
51	end
52
53	def to_a
54		@methods
55	end
56
57	class Empty < PaymentMethods
58		def initialize; end
59
60		def default_payment_method; end
61
62		def to_list_single(*)
63			raise "No payment methods available"
64		end
65
66		def empty?
67			true
68		end
69
70		def to_a
71			[]
72		end
73	end
74end