]> git.openstreetmap.org Git - rails.git/blob - app/helpers/banner_helper.rb
Merge pull request #5932 from tomhughes/frozen-strings
[rails.git] / app / helpers / banner_helper.rb
1 # frozen_string_literal: true
2
3 module BannerHelper
4   def active_banners
5     BANNERS.reject do |_k, v|
6       begin
7         startdate = v[:startdate] && Date.parse(v[:startdate])
8       rescue StandardError
9         startdate = nil
10       end
11
12       begin
13         enddate = v[:enddate] && Date.parse(v[:enddate])
14       rescue StandardError
15         enddate = nil
16       end
17
18       startdate&.future? || enddate&.past?
19     end
20   end
21
22   # returns the least recently seen banner that is not hidden
23   def next_banner
24     banners = active_banners
25     banner_key = nil
26     cookie_key = nil
27     min_index = 9999
28     min_date = Date.new(9999, 1, 1)
29
30     banners.each do |k, v|
31       ckey = banner_cookie(v[:id]).to_sym
32       cval = cookies[ckey] || 0
33       next if cval == "hide"
34
35       # rotate all banner queue positions
36       index = cval.to_i
37       cookies[ckey] = index - 1 if index.positive?
38
39       # pick banner with minimum queue position
40       next if index > min_index
41
42       # or if equal queue position, pick banner with soonest end date (i.e. next expiring)
43       end_date = Date.parse(v[:enddate])
44       next if index == min_index && end_date > min_date
45
46       banner_key = k
47       cookie_key = ckey
48       min_index = index
49       min_date = end_date
50     end
51
52     unless banner_key.nil?
53       cookies[cookie_key] = banners.length # bump to end of queue
54       banners[banner_key]
55     end
56   end
57
58   def banner_cookie(key)
59     "_osm_banner_#{key}"
60   end
61 end