Inline question choices, compact one-click inbox cards, drop snooze

This commit is contained in:
Ian Gulliver
2026-10-14 23:34:39 -07:00
parent 4dc86e5479
commit c7cfad88a1
30 changed files with 1022 additions and 647 deletions
+16 -13
View File
@@ -25,9 +25,6 @@ func (s *Server) ListInbox(w http.ResponseWriter, r *http.Request, params api.Li
if params.State != nil {
f.State = *params.State
}
if params.IncludeSnoozed != nil {
f.IncludeSnoozed = *params.IncludeSnoozed
}
items, err := s.store.ListInbox(r.Context(), f)
if err != nil {
@@ -97,10 +94,9 @@ func (s *Server) RespondInbox(w http.ResponseWriter, r *http.Request) {
ItemId: item.Id,
User: actor(r),
Type: create.Type,
Option: create.Option,
Options: create.Options,
Text: create.Text,
Attachments: attachments,
SnoozeUntil: create.SnoozeUntil,
CreatedAt: time.Now().UTC(),
},
})
@@ -155,8 +151,21 @@ func checkResponse(item api.InboxItem, c api.InboxResponseCreate) (api.InboxStat
if !question {
return bad("only questions have options")
}
if c.Option == nil || !hasOption(item, *c.Option) {
return bad("option must be one of the question's options")
if c.Options == nil || len(*c.Options) == 0 {
return bad("option needs the chosen options")
}
if item.Payload["multiple"] != true && len(*c.Options) != 1 {
return bad("a pick-one question takes exactly one option")
}
seen := map[string]bool{}
for _, o := range *c.Options {
if !hasOption(item, o) {
return bad("%q is not one of the question's options", o)
}
if seen[o] {
return bad("%q chosen twice", o)
}
seen[o] = true
}
if text != "" {
return bad("option takes no text; use other")
@@ -172,12 +181,6 @@ func checkResponse(item api.InboxItem, c api.InboxResponseCreate) (api.InboxStat
}
return api.Answered, nil
case api.Snooze:
if c.SnoozeUntil == nil || !c.SnoozeUntil.After(time.Now()) {
return bad("snooze needs a future snooze_until")
}
return api.Open, nil
case api.Dismiss:
if question {
return bad("questions need an option or other, not a dismissal")