Skip to content

Commit 54e661f

Browse files
committed
Add tracking info to timeline
1 parent 65cad08 commit 54e661f

File tree

3 files changed

+64
-0
lines changed

3 files changed

+64
-0
lines changed

app/models/package.rb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,38 @@ class Package < ApplicationRecord
3636
free_stickers: 3,
3737
other: 4
3838
}
39+
40+
PACKAGE_TYPE_LABELS = {
41+
"hackpad_kit" => "Hackpad Parts Kit",
42+
"blinky_kit" => "Blinky Parts Kit",
43+
"soldering_iron" => "Soldering Iron",
44+
"free_stickers" => "Free Stickers",
45+
"other" => "Other"
46+
}.freeze
47+
48+
def package_type_label
49+
PACKAGE_TYPE_LABELS[package_type] || package_type&.titleize
50+
end
51+
52+
def fulfillment_type
53+
case package_type
54+
when "hackpad_kit", "blinky_kit", "soldering_iron"
55+
"Hack Club HQ in Vermont, USA"
56+
when "free_stickers"
57+
"Hack Club Warehouse in Vermont, USA"
58+
else
59+
nil
60+
end
61+
end
62+
63+
def tracking_link
64+
case service
65+
when "Pirate Ship Simple Export Rate"
66+
"https://a1.asendiausa.com/tracking/?trackingnumber=#{tracking_number}"
67+
when "Ground Advantage"
68+
"https://tools.usps.com/go/TrackConfirmAction.action?tLabels=#{tracking_number}"
69+
else
70+
nil
71+
end
72+
end
3973
end

app/models/project.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,7 @@ def generate_timeline(reverse: false)
332332
refs.concat(timeline_kudo_refs_cached)
333333
refs.concat(timeline_ship_refs_cached)
334334
refs.concat(timeline_review_refs_cached)
335+
refs.concat(timeline_package_sent_refs_cached)
335336

336337
timeline = hydrate_timeline_refs(refs)
337338
sorted = timeline.sort_by { |e| e[:date] }
@@ -379,6 +380,18 @@ def timeline_review_refs_cached
379380
design_refs + build_refs
380381
end
381382

383+
def timeline_package_sent_refs_cached
384+
return [] unless ysws == "hackpad"
385+
386+
cache_key = [ "project_timeline", id, "package_sent", user_id, user.packages.maximum(:updated_at)&.to_f, user.packages.count ]
387+
Rails.cache.fetch(cache_key) do
388+
package = user.packages.find_by(package_type: :hackpad_kit, sent_at: ..Time.current)
389+
return [] unless package&.sent_at
390+
391+
[ { type: :package_sent, id: package.id, date: package.sent_at } ]
392+
end
393+
end
394+
382395
def design_review_eta
383396
return nil unless design_pending?
384397

@@ -1117,12 +1130,14 @@ def build_build_review_refs
11171130
def hydrate_timeline_refs(refs)
11181131
journal_ids = refs.select { |r| r[:type] == :journal }.pluck(:id)
11191132
kudo_ids = refs.select { |r| r[:type] == :kudo }.pluck(:id)
1133+
package_ids = refs.select { |r| r[:type] == :package_sent }.pluck(:id)
11201134
user_ids = refs.flat_map { |r| [ r[:user_id], r.dig(:reviews)&.pluck(:user_id) ] }
11211135
.flatten.compact.uniq
11221136
.select { |uid| uid.to_s.match?(/\A\d+\z/) }
11231137

11241138
journals_by_id = JournalEntry.where(id: journal_ids).includes(:user).index_by(&:id)
11251139
kudos_by_id = Kudo.where(id: kudo_ids).includes(:user).index_by(&:id)
1140+
packages_by_id = Package.where(id: package_ids).index_by(&:id)
11261141
users_by_id = User.where(id: user_ids).index_by { |u| u.id.to_s }
11271142

11281143
refs.filter_map do |ref|
@@ -1135,6 +1150,10 @@ def hydrate_timeline_refs(refs)
11351150
kudo = kudos_by_id[ref[:id]]
11361151
next nil unless kudo
11371152
ref.merge(kudo: kudo)
1153+
when :package_sent
1154+
package = packages_by_id[ref[:id]]
1155+
next nil unless package
1156+
ref.merge(package: package)
11381157
when :ship, :return_design, :reject_design, :return_build, :reject_build
11391158
ref.merge(user: users_by_id[ref[:user_id].to_s])
11401159
when :approve_design, :approve_build
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<% if current_user.present? && current_user == project.user %>
2+
<%= render "timeline_event_card" do %>
3+
<% package = event[:package] %>
4+
<div class="flex space-x-4">
5+
<p class="grow">A <strong><%= package.package_type_label %></strong> was shipped to you <%= c_time_ago_in_words(event[:date]) %> ago <%= package.fulfillment_type.present? ? "from #{package.fulfillment_type}" : "" %></p>
6+
</div>
7+
<div>
8+
<p>Tracking Number: <% if package.tracking_link.present? %><a href="<%= package.tracking_link %>" target="_blank" rel="noopener noreferrer" class="underline decoration-white/30 underline-offset-2 text-bp-warning hover:decoration-white"><%= package.tracking_number %></a><% else %><%= package.tracking_number %><% end %></p>
9+
</div>
10+
<% end %>
11+
<% end %>

0 commit comments

Comments
 (0)