fix: drop redundant blue state-notice on offer page; default 48h → 72h

Two cleanups:

1. The orphaned blue "Waiting on the other party to respond" stripe
   (alert-info-bg) appeared between the offer header and the
   "Waiting on the other party · They have in X to respond" well
   below — identical copy, twice. Same pattern as the previously
   removed green "Offer accepted" banner. Dropping both the can_act
   ("It's your turn — accept, counter, or decline below") and
   is_open branches of the state-notice. The "Your turn" section
   heading and the waiting well right below already carry the
   message, with the live countdown that the alert lacked.

   Kept: DECLINED, WITHDRAWN, EXPIRED, PAID — those have no
   follow-on action block, so the alert is the only signal.

2. DEFAULT_OFFER_EXPIRATION_HOURS 48 → 72 (3 days). Fox: 48h still
   too tight for sellers checking shop mail intermittently. 7 days
   was too generous, 48 hours was on the strict side. 72 hours
   covers a long weekend.

Per-shop overrides are unchanged — operators tweak
offer_expiration_hours via offer-settings on /s/<shop>/settings.
This commit is contained in:
russell@unturf.com 2026-05-14 16:26:23 -04:00
parent 547cc14589
commit 5f735ee1d3
No known key found for this signature in database
4 changed files with 9 additions and 11 deletions

View file

@ -104,7 +104,7 @@ OFFER_EVENT_INT_TO_HUMAN = {
# Defaults — shop settings override these per-shop.
DEFAULT_OFFER_EXPIRATION_HOURS = 48 # 2 days, pre-acceptance window
DEFAULT_OFFER_EXPIRATION_HOURS = 72 # 3 days, pre-acceptance window
DEFAULT_OFFER_MAX_ROUNDS = 3
DEFAULT_OFFER_AUTO_ACCEPT_PCT = 95
DEFAULT_OFFER_AUTO_DECLINE_PCT = 50

View file

@ -200,7 +200,7 @@ class Shop(RBase, Base):
BigInteger, nullable=False, default=50, server_default="50"
)
offer_expiration_hours = Column(
BigInteger, nullable=False, default=48, server_default="48"
BigInteger, nullable=False, default=72, server_default="72"
)
offer_max_rounds = Column(
BigInteger, nullable=False, default=3, server_default="3"

View file

@ -44,15 +44,13 @@
<div class="alert alert-success offer-state-notice" name="alert">
<p class="alert-message">Paid &mdash; this offer is complete.</p>
</div>
{% elif can_act %}
<div class="alert alert-info offer-state-notice" name="alert">
<p class="alert-message">It's your turn &mdash; accept, counter, or decline below.</p>
</div>
{% elif is_open %}
<div class="alert alert-info offer-state-notice" name="alert">
<p class="alert-message">Waiting on the other party to respond.</p>
</div>
{% endif %}
{# can_act / is_open notices intentionally absent — the "Your turn"
and "Waiting on the other party · they have X to respond" wells
render directly below and carry the same copy. Same pattern as
the dropped accepted-banner — when there's a follow-on action
block carrying the message, the alert stripe just orphans a
band of color in the middle of the page. #}
{% if can_act %}
<section class="offer-actions well">

View file

@ -4577,7 +4577,7 @@ class TestPricingModePersistence(DatabaseIntegrationTests):
fetched = self.dbsession.query(Shop).get(shop_id)
self.assertEqual(fetched.offer_auto_accept_threshold_pct, 95)
self.assertEqual(fetched.offer_auto_decline_threshold_pct, 50)
self.assertEqual(fetched.offer_expiration_hours, 48)
self.assertEqual(fetched.offer_expiration_hours, 72)
self.assertEqual(fetched.offer_max_rounds, 3)
self.assertEqual(fetched.offer_min_buyer_account_age_hours, 0)
# Booleans/nullable: offer_enabled defaults None (no server_default set)