Skip to content

feat(scheduled): edit a queued post content and destinations, not just its time #55

Description

@Adron

Summary

macOS can cancel and reschedule a queued post. The web can edit its content and its destinations too. And the schedule dialog itself differs: the web picks per-network destinations at schedule time, the Mac does not.

What the web does (/help/messages ▸ Scheduled posts)

Scheduling flow:

Open the advanced options (gear icon) … Click the calendar icon … Pick a date and time in the future. The dialog also shows a checkbox for each connected cross-post account (Mastodon, Bluesky, LinkedIn, X/Twitter) so you can choose which networks receive the post when it goes live. … A note below the compose button shows the scheduled date and time. To cancel scheduling and post immediately instead, click the displayed date.

Managing them:

Each scheduled post shows its content, scheduled time, and the destinations selected. Click the edit icon to change the time, the message content, or which networks will receive the post. If LinkedIn is selected, the same LinkedIn destination picker from the compose box appears here. To cancel a scheduled post, open it and delete it.

What macOS ships today

ScheduledPostsViewModel (App/Features/Scheduled/ScheduledPostsViewModel.swift) exposes:

  • load()
  • cancel(post:)
  • reschedule(post:to:)

No content edit. No destination edit. No destination display.

The composer (ComposerWindowView.swift:298 scheduleSection, :161 crossPostSection) has schedule and cross-post as two independent sections rather than the web's combined schedule-with-destinations dialog. Verify whether cross-post selections made in the composer are actually carried onto a scheduled post — if they are dropped, that is a second defect hiding inside this one and should be called out in the PR.

Division of labor

Kit

Domain

  • Extend the scheduled-post model to carry its selected destinations.
  • A single updateScheduled(...) covering time, content, and destinations, replacing the narrow reschedule.
  • Reuse the existing LinkedIn posting-target projection so the destination picker is the same code in both places.

App

  • Composer: fold the per-network checkboxes into the schedule dialog, matching the web, and keep the "click the date to post now instead" affordance.
  • ScheduledPostsRootView: show each post's destinations; an edit sheet covering time, content, and destinations, including the LinkedIn destination picker.
  • Keep cancel/delete as-is.

Tests

  • happy — edit content, time, and destinations on a queued post; all three persist
  • invalid — reschedule into the past → rejected client-side with a clear message
  • upstream-failure — update rejected → the sheet keeps the user's edits and surfaces the error
  • boundary — a post scheduled with zero destinations; one with every network selected; editing a post seconds before it fires

Acceptance criteria

  • Everything the web lets you change about a queued post can be changed on the Mac.
  • A scheduled post's destinations are visible without opening an editor.
  • Full E2E gate green.

Notes

New finding from the 2026-09-07 parity sweep. Size S–M. Touches the same LinkedIn destination model as the Integrations and Organizations issues — sequence it after at least one of them so the projection exists.

Activity

  1. added
    enhancementNew feature or request
    parityWeb-parity gap with the InterlinedList web app
    on Sep 7, 2026
  2. Adron commented on Sep 13, 2026

    @Adron
    MemberAuthor

    Re-scoped 2026-09-13

    PR #71 (merged to dev as 6f9a99d) shipped the buildable half: a queued post's destinations are now shown, and its time can be edited. It also fixed a defect found on the way — the optimistic reschedule copy was hand-built and dropped crossPostResults, crossPostLocations and linkPreviews, so rescheduling visibly wiped a row's previews and cross-post pills until the next refresh.

    This issue cannot be closed as originally written, and the reason is upstream.

    The acceptance criterion was "everything the web lets you change about a queued post can be changed on the Mac." That is now met — in the only sense available:

    • The deployed web client issues no PATCH /api/messages/{id} anywhere in its bundles. Its only PATCHes are /api/user/update and /api/notifications/*.
    • The scheduled-post content/destination editor described on the help page is not shipped on the web either.

    So editing a queued post's content and destinations is an upstream API gap, not a macOS one. Filed as its own upstream request; this issue now tracks only the macOS side, which is complete.

    Remaining macOS scope: none. This stays open purely as the anchor for the upstream ask and should close when that lands or is declined.

    One adjacent gap was found and is tracked separately: the web's create body sends linkedInTargets and linkedInLinkAsFirstComment, and CreateMessageRequest models neither.

  3. added
    blockedCannot proceed — backend-gated or spike-first
    on Sep 13, 2026
  4. Adron commented on Sep 15, 2026

    @Adron
    MemberAuthor

    Closing: the macOS side is complete, and the remainder is not a macOS issue.

    Per the 2026-09-13 re-scope on this thread, PR #71 shipped everything that is buildable — a queued post's destinations are shown and its time can be edited — and also fixed a defect found on the way (the optimistic reschedule copy dropped crossPostResults, crossPostLocations and linkPreviews, so rescheduling visibly wiped a row's previews until the next refresh).

    Editing a queued post's content and destinations is an upstream gap:

    • the deployed web client issues *no PATCH /api/messages/{id} anywhere in its bundles*
    • the scheduled-post content editor described on the help page is not shipped on the web either

    That ask is tracked by #74, which is the right anchor for it — keeping this one open as a second anchor for the same upstream request just means two issues describing one wait.

    The adjacent gap found during the re-scope (linkedInTargets / linkedInLinkAsFirstComment missing from CreateMessageRequest) is tracked separately as #79.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    blockedCannot proceed — backend-gated or spike-firstenhancementNew feature or requestparityWeb-parity gap with the InterlinedList web app

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions