Skip to content

Add weekly recurring scheduled posts - #10025

Open
nickmisasi wants to merge 6 commits into
mainfrom
cursor/weekly-recurring-scheduled-posts-d939
Open

Add weekly recurring scheduled posts#10025
nickmisasi wants to merge 6 commits into
mainfrom
cursor/weekly-recurring-scheduled-posts-d939

Conversation

@nickmisasi

@nickmisasi nickmisasi commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Summary

Mirrors weekly recurring scheduled posts (mattermost/mattermost#37746) into the mobile app. Users can flip a "Repeat weekly" toggle when scheduling or rescheduling a message; the server re-sends the post every week at the same local wall-clock time and advances the series via the existing scheduled_post_updated websocket event.

Data layer

  • ScheduledPost schema v21 adds repeat_type / repeat_timezone columns (+ migration and schema doc bump).
  • ScheduledPostModel.toApi() round-trips the repeat fields and the previously-dropped type field, so rescheduling can no longer silently strip fields from the PUT body.
  • The transformer copies the repeat fields and now overwrites error_code instead of merging it, so a recurring post that fails once and later succeeds clears its error state (previously the error was sticky forever).
  • updateScheduledPost takes an UpdateSchedulingInfo whose type forbids sending repeat_type: 'weekly' without a timezone; omitting the recurrence preserves the existing series.

UI

  • "Repeat weekly" toggle in the schedule-draft bottom sheet and the reschedule screen (pre-checked for an existing weekly post; unchecking converts it to one-time). The recurrence timezone is resolved from the user's timezone (manual > automatic > UTC), matching the webapp.
  • Scheduled-post rows show a "Repeats weekly" tag next to "Send on …" (hidden when the row is in an error state).
  • "Send" is absent for recurring posts (sending now would end or fork the series), and the options-sheet height is derived from the same booleans that drive rendering.

Gating

  • The toggle is offered only when the server sends FeatureFlagRecurringScheduledPosts: 'true' (default-off flag; pre-feature servers never send it) and the draft has no file attachments (the server rejects weekly posts with files, since files are bound to the first post they're attached to). When the toggle can't be offered, rescheduling omits the recurrence fields so an existing series is preserved.

Ticket Link

Mirrors the server/webapp feature in mattermost/mattermost#37746

Checklist

  • Added or updated unit tests (required for all new features)
  • Has UI changes
  • Includes text changes and localization file updates

Device Information

This PR was tested on: iPhone 17 Pro simulator (iOS 26.5), Android emulator (emulator-5554), against a cloud test server running the server-side PR (v11.11.0) with FeatureFlagRecurringScheduledPosts on and off.

Screenshots

iOS Android
Repeat weekly toggle in the schedule sheet image image
"Repeats weekly" tag in the Scheduled tab image
Send option absent for a recurring post image image
Reschedule pre-checked for a weekly post image image
Toggle hidden when the feature flag is off image
Toggle hidden when the draft has attachments image image

Release Note

Added support for weekly recurring scheduled posts. When the server enables the feature, scheduling or rescheduling a message offers a "Repeat weekly" toggle; recurring posts show a "Repeats weekly" tag in the scheduled posts list and cannot be sent immediately.

To show artifacts inline, enable in settings.

Open in Web Open in Cursor 

Matty Code and others added 4 commits August 7, 2026 11:13
Mirrors server support for weekly recurring scheduled posts (mattermost#37746):
- ScheduledPost schema v21 with repeat_type/repeat_timezone columns + migration
- ScheduledPostModel fields, toApi() now round-trips repeat fields and the
  previously-dropped type field (PUT is a full overwrite server-side)
- Transformer copies repeat fields and overwrites error_code instead of
  merging, so a recurring post that recovers clears its error state
- updateScheduledPost takes UpdateSchedulingInfo so reschedule can change
  recurrence; weekly requires a timezone at compile time

Co-authored-by: Nick Misasi <nick13misasi@gmail.com>
Gated on server >= 11.10 (no feature flag; older servers silently ignore
the repeat fields). The scheduled-post options sheet and the reschedule
screen share getScheduledPostRecurrence(), which resolves the recurrence
timezone (manual > automatic > UTC) matching the webapp. Rescheduling a
weekly post pre-checks the toggle; unchecking converts it to one-time.

Co-authored-by: Nick Misasi <nick13misasi@gmail.com>
Scheduled-post rows show an info tag next to the Send on... header when
the post repeats weekly and is not in an error state, matching the webapp.
The Send option is absent for recurring posts (sending now would end or
fork the series), and the options sheet height is now derived from the
same booleans that drive rendering. isRecurringScheduledPost() is the
canonical recurrence predicate in @utils/scheduled_post.

Co-authored-by: Nick Misasi <nick13misasi@gmail.com>
The server PR now gates recurrence behind the default-off
FeatureFlagRecurringScheduledPosts flag (only the off-to-weekly
transition is blocked when disabled) and rejects weekly posts with file
attachments, since files are bound to the first post they are attached
to. Replace the version gate with the flag check and hide the Repeat
weekly toggle when the draft has attachments; when the toggle is not
offered, the reschedule save omits the recurrence fields so an existing
series is preserved.

Co-authored-by: Nick Misasi <nick13misasi@gmail.com>
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Documentation Impact Analysis — updates needed

Documentation Impact Analysis

Overall Assessment: Documentation Updates Recommended

Changes Summary

This PR adds recurring weekly scheduled posts to the Mattermost mobile app, gated behind the FeatureFlagRecurringScheduledPosts feature flag. Users can now toggle "Repeat weekly" when scheduling or rescheduling a post; recurring posts show a "Repeats weekly" badge in the Drafts list, the "Send now" action is suppressed for recurring posts, and posts with file attachments cannot be made recurring.

Documentation Impact Details

Change Type Files Changed Affected Personas Documentation Action Docs Location
New user-facing feature: recurring weekly scheduled posts app/screens/scheduled_post_options/scheduled_post_picker.tsx, app/screens/reschedule_draft/reschedule_draft.tsx End User Document "Repeat weekly" toggle available when scheduling or rescheduling a post (feature-flag gated) docs/source/end-user-guide/collaborate/schedule-messages.rst
New UI element: "Repeats weekly" badge in Drafts list app/components/draft_scheduled_post_header/draft_scheduled_post_header.tsx End User Document the "Repeats weekly" tag that identifies recurring posts in the Scheduled tab docs/source/end-user-guide/collaborate/schedule-messages.rst
Changed behavior: "Send now" hidden for recurring posts app/screens/draft_scheduled_post_options/draft_scheduled_post_options.tsx End User Document that recurring scheduled posts cannot be sent immediately (the "Send now" action is absent) docs/source/end-user-guide/collaborate/schedule-messages.rst
New constraint: recurring posts cannot have file attachments app/screens/scheduled_post_options/scheduled_post_picker.tsx, app/screens/reschedule_draft/reschedule_draft.tsx End User Document that the recurrence toggle is not offered when the draft includes file attachments docs/source/end-user-guide/collaborate/schedule-messages.rst
New i18n strings assets/base/i18n/en.json (keys: scheduled_post.repeat_weekly, scheduled_post.header.repeats_weekly) End User Reflects the new recurring post UI strings — covered by the page update above docs/source/end-user-guide/collaborate/schedule-messages.rst
New feature flag types/api/config.d.ts (FeatureFlagRecurringScheduledPosts), app/queries/servers/scheduled_post.ts System Administrator Note that recurring scheduled posts are controlled by FeatureFlagRecurringScheduledPosts; the feature is off by default and becomes available only when the server sets the flag docs/source/end-user-guide/collaborate/schedule-messages.rst (note box); optionally docs/source/administration-guide/configure/site-configuration-settings.rst if the flag is eventually promoted to a stable config setting

Recommended Actions

  • Update docs/source/end-user-guide/collaborate/schedule-messages.rst — add a subsection (or expand the existing "Mobile" tab) to document the "Repeat weekly" toggle: where it appears (schedule-new and reschedule flows), what it means, the constraint that it is not offered when the draft contains file attachments, and that the "Send now" action is absent for recurring posts
  • Update docs/source/end-user-guide/collaborate/schedule-messages.rst — document the "Repeats weekly" badge that appears on recurring posts in the Drafts Scheduled tab
  • Update docs/source/end-user-guide/collaborate/schedule-messages.rst — add a note that the recurring-post capability requires a server with FeatureFlagRecurringScheduledPosts enabled (the feature is off by default on servers that support it and absent on older servers)

Confidence

High — The PR introduces clearly new user-facing behavior (toggle, badge, suppressed action, attachment constraint) with dedicated i18n strings and a named feature flag. The existing schedule-messages.rst page is the natural home for all of these additions; no new page is needed, only targeted updates to the existing page.

@github-actions github-actions Bot added the Docs/Needed Requires documentation label Aug 7, 2026
@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 00f5f6da-9cc3-415e-80b6-4063cd7feedb

📥 Commits

Reviewing files that changed from the base of the PR and between 80d656a and eeaa70b.

📒 Files selected for processing (1)
  • assets/base/i18n/en.json
🚧 Files skipped from review as they are similar to previous changes (1)
  • assets/base/i18n/en.json

📝 Walkthrough

Walkthrough

The change adds weekly recurring scheduled posts. It updates scheduling and rescheduling flows, persists recurrence type and timezone data, applies a feature flag, and updates scheduled-post actions and header labels.

Changes

Recurring scheduled posts

Layer / File(s) Summary
Recurrence contracts and persistence
types/api/*, types/database/..., app/database/..., docs/database/server/server.md, test/test_helper.ts
Scheduled posts now store repeat_type and repeat_timezone. Database schema version 21, models, transformations, fixtures, and persistence tests support these fields.
Recurrence rules and feature flag
app/utils/scheduled_post/*, app/queries/servers/scheduled_post.*, types/api/config.d.ts
Utilities detect weekly posts and build recurrence data with a resolved timezone or UTC fallback. The feature flag observer reads FeatureFlagRecurringScheduledPosts.
Scheduling picker and navigation
app/components/post_draft/draft_input/*, app/routes/(bottom_sheet)/scheduled_post_options.tsx, app/screens/scheduled_post_options/*, app/utils/post/*, assets/base/i18n/en.json
Draft navigation passes attachment state. The picker shows weekly recurrence only when enabled and no files are attached, then includes recurrence data in the scheduled-post payload.
Rescheduling and remote updates
app/screens/reschedule_draft/*, app/actions/remote/scheduled_post.*, app/client/rest/scheduled_post.test.ts
Rescheduling supports weekly recurrence and tracks time and recurrence changes. Remote updates now accept structured scheduling information and merge it without mutating the normalized post.
Scheduled-post presentation and actions
app/components/draft_scheduled_post*, app/screens/draft_scheduled_post_options/*
Recurring posts display a “Repeats weekly” tag without scheduling errors. Their action sheet hides Send and retains Copy, Reschedule, and Delete.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant DraftInput
  participant ScheduledPostPicker
  participant RescheduledDraft
  participant UpdateScheduledPost
  participant ScheduledPostClient
  DraftInput->>ScheduledPostPicker: pass draft attachment state
  ScheduledPostPicker->>ScheduledPostClient: create scheduled post with recurrence
  RescheduledDraft->>UpdateScheduledPost: send scheduled_at and recurrence
  UpdateScheduledPost->>ScheduledPostClient: submit merged scheduled-post payload
  ScheduledPostClient-->>UpdateScheduledPost: return update result
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 16.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the main change: adding weekly recurring scheduled posts.
Description check ✅ Passed The description directly explains the recurring scheduled-post feature, including data, UI, gating, testing, and release details.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/weekly-recurring-scheduled-posts-d939

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🧹 Nitpick comments (6)
app/screens/draft_scheduled_post_options/index.test.tsx (1)

122-122: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Use the required test-name format.

Rename this test to start with should, for example it('should not render the send option for a recurring scheduled post', ...).

As per coding guidelines, “Use it('should...') test names.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/screens/draft_scheduled_post_options/index.test.tsx` at line 122, Rename
the test case in the recurring scheduled post coverage to use the required
“should” naming convention, changing its description to start with “should not
render...” while preserving the test behavior and assertions.

Source: Coding guidelines

app/components/draft_scheduled_post_header/draft_scheduled_post_header.tsx (1)

5-5: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Use defineMessages() for the new recurrence label.

Replace defineMessage with a defineMessages() object and pass its repeatsWeekly descriptor to Tag. Run npm run i18n-extract and confirm that assets/base/i18n/en.json contains the new message.

As per coding guidelines, “Define new messages with defineMessages() and run npm run i18n-extract to update en.json.”

Proposed change
-import {defineMessage, useIntl} from 'react-intl';
+import {defineMessages, useIntl} from 'react-intl';

-const repeatsWeeklyLabel = defineMessage({
-    id: 'scheduled_post.header.repeats_weekly',
-    defaultMessage: 'Repeats weekly',
+const messages = defineMessages({
+    repeatsWeekly: {
+        id: 'scheduled_post.header.repeats_weekly',
+        defaultMessage: 'Repeats weekly',
+    },
 });

-                            message={repeatsWeeklyLabel}
+                            message={messages.repeatsWeekly}

Also applies to: 42-45, 176-177

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/components/draft_scheduled_post_header/draft_scheduled_post_header.tsx`
at line 5, Replace the standalone defineMessage usage in
DraftScheduledPostHeader with a defineMessages() descriptor object containing
repeatsWeekly, pass that descriptor to Tag, and run npm run i18n-extract so
assets/base/i18n/en.json includes the new message.

Source: Coding guidelines

app/utils/scheduled_post/scheduled_post.test.ts (1)

347-369: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Test the automatic-timezone weekly path.

Line 349 passes an automatic timezone only when recurrence is disabled. That path does not call getTimezone(). Add a weekly case that expects America/New_York when useAutomaticTimezone is true. A regression in automatic timezone selection can otherwise pass these tests.

As per coding guidelines, test actual implementation behavior.

Proposed test
+    it('should use the automatic timezone when enabled', () => {
+        expect(getScheduledPostRecurrence(true, {useAutomaticTimezone: true, automaticTimezone: 'America/New_York', manualTimezone: 'Asia/Tokyo'})).toEqual({
+            repeat_type: 'weekly',
+            repeat_timezone: 'America/New_York',
+        });
+    });
+
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/utils/scheduled_post/scheduled_post.test.ts` around lines 347 - 369,
Extend the getScheduledPostRecurrence tests with an enabled-weekly case using
useAutomaticTimezone: true and automaticTimezone: 'America/New_York', asserting
repeat_type 'weekly' and repeat_timezone 'America/New_York'. Keep the existing
disabled-recurrence and manual-timezone cases unchanged.

Source: Coding guidelines

app/utils/scheduled_post/index.ts (1)

4-4: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Use defineMessages() for the new label.

Line 81 defines a new message with defineMessage(). Define it with defineMessages() and retain the exported repeatWeeklyLabel binding. Run npm run i18n-extract after the change.

As per coding guidelines, define new messages with defineMessages() and run npm run i18n-extract.

Proposed change
-import {defineMessage, defineMessages, type IntlShape} from 'react-intl';
+import {defineMessages, type IntlShape} from 'react-intl';
 
-export const repeatWeeklyLabel = defineMessage({
-    id: 'scheduled_post.repeat_weekly',
-    defaultMessage: 'Repeat weekly',
+export const {repeatWeekly: repeatWeeklyLabel} = defineMessages({
+    repeatWeekly: {
+        id: 'scheduled_post.repeat_weekly',
+        defaultMessage: 'Repeat weekly',
+    },
 });

Also applies to: 81-84

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/utils/scheduled_post/index.ts` at line 4, Update the new label definition
near the exported repeatWeeklyLabel binding to use defineMessages() instead of
defineMessage(), while retaining the repeatWeeklyLabel export and its existing
message metadata. Run npm run i18n-extract after making the change.

Source: Coding guidelines

app/database/operator/server_data_operator/transformers/post.ts (1)

199-199: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Use a nullish fallback for raw.type.

Replace || with ?? for this fallback. This follows the TypeScript guideline and preserves the intended absent-value semantics.

Proposed change
-        scheduledPost.type = raw.type || '';
+        scheduledPost.type = raw.type ?? '';
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/database/operator/server_data_operator/transformers/post.ts` at line 199,
Update the assignment to scheduledPost.type in the post transformer to use a
nullish fallback with raw.type, replacing the current truthiness-based fallback
while retaining the empty-string default for null or undefined values.

Source: Coding guidelines

app/screens/scheduled_post_options/scheduled_post_picker.test.tsx (1)

185-206: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Use the required timer helper.

Replace jest.runAllTimers() with advanceTimers(). Configure fake timers with doNotFake: ['nextTick'] for this timer test.

As per coding guidelines, “Use jest.useFakeTimers({doNotFake: ['nextTick']}) and advanceTimers() for timer tests.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/screens/scheduled_post_options/scheduled_post_picker.test.tsx` around
lines 185 - 206, Update the timer setup for the scheduled post picker tests
around scheduleAtMondayWithRepeatWeekly to use jest.useFakeTimers({doNotFake:
['nextTick']}) and replace jest.runAllTimers() with the required advanceTimers()
helper.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@app/actions/remote/scheduled_post.test.ts`:
- Around line 277-301: Remove the isScheduledPostModel mock from the scheduled
post integration test and leave the real predicate active. Keep the
operator.handleScheduledPosts() setup and updateScheduledPost assertions
unchanged so the test validates the actual model-to-API path.

In `@app/components/post_draft/draft_input/draft_input.test.tsx`:
- Line 175: Rename the test case near “tells the scheduled post options when the
draft has attachments” to use the required `it('should...')` naming format while
preserving its existing behavior and assertions.

In `@app/screens/draft_scheduled_post_options/index.test.tsx`:
- Around line 57-67: Update the test setup around setupServerDatabase and the
scheduled-post inserts to initialize a fresh in-memory LokiJS database in
beforeEach with autosave disabled, recreate the recurring fixture for every
test, and destroy the server database in afterEach so records and observer state
cannot leak between tests.

In `@app/screens/scheduled_post_options/scheduled_post_picker.test.tsx`:
- Around line 183-201: Update the recurrence toggle queries in
app/screens/scheduled_post_options/scheduled_post_picker.test.tsx lines 183-201
and app/screens/reschedule_draft/reschedule_draft.test.tsx lines 436-449 to use
PickerOption’s emitted ID format,
post_priority_picker_item.repeat_weekly.toggled.<state>.button, instead of the
supplied scheduled_post_options.repeat_weekly ID. Preserve each test’s expected
toggle state.

In `@app/screens/scheduled_post_options/scheduled_post_picker.tsx`:
- Around line 85-86: Update the scheduling payload construction around
getScheduledPostRecurrence to pass offerRepeatWeekly && repeatWeekly, ensuring
recurrence remains disabled if the feature gate changes while the sheet is open.
Add a test covering selecting the weekly toggle, then disabling recurrence
before submission, and verify the payload does not request weekly recurrence.

---

Nitpick comments:
In `@app/components/draft_scheduled_post_header/draft_scheduled_post_header.tsx`:
- Line 5: Replace the standalone defineMessage usage in DraftScheduledPostHeader
with a defineMessages() descriptor object containing repeatsWeekly, pass that
descriptor to Tag, and run npm run i18n-extract so assets/base/i18n/en.json
includes the new message.

In `@app/database/operator/server_data_operator/transformers/post.ts`:
- Line 199: Update the assignment to scheduledPost.type in the post transformer
to use a nullish fallback with raw.type, replacing the current truthiness-based
fallback while retaining the empty-string default for null or undefined values.

In `@app/screens/draft_scheduled_post_options/index.test.tsx`:
- Line 122: Rename the test case in the recurring scheduled post coverage to use
the required “should” naming convention, changing its description to start with
“should not render...” while preserving the test behavior and assertions.

In `@app/screens/scheduled_post_options/scheduled_post_picker.test.tsx`:
- Around line 185-206: Update the timer setup for the scheduled post picker
tests around scheduleAtMondayWithRepeatWeekly to use
jest.useFakeTimers({doNotFake: ['nextTick']}) and replace jest.runAllTimers()
with the required advanceTimers() helper.

In `@app/utils/scheduled_post/index.ts`:
- Line 4: Update the new label definition near the exported repeatWeeklyLabel
binding to use defineMessages() instead of defineMessage(), while retaining the
repeatWeeklyLabel export and its existing message metadata. Run npm run
i18n-extract after making the change.

In `@app/utils/scheduled_post/scheduled_post.test.ts`:
- Around line 347-369: Extend the getScheduledPostRecurrence tests with an
enabled-weekly case using useAutomaticTimezone: true and automaticTimezone:
'America/New_York', asserting repeat_type 'weekly' and repeat_timezone
'America/New_York'. Keep the existing disabled-recurrence and manual-timezone
cases unchanged.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: de6a8ea4-c9e8-430f-9747-c8a0a4867779

📥 Commits

Reviewing files that changed from the base of the PR and between 06ed862 and eaed9ea.

📒 Files selected for processing (39)
  • app/actions/remote/scheduled_post.test.ts
  • app/actions/remote/scheduled_post.ts
  • app/client/rest/scheduled_post.test.ts
  • app/components/draft_scheduled_post/draft_scheduled_post.test.tsx
  • app/components/draft_scheduled_post/draft_scheduled_post.tsx
  • app/components/draft_scheduled_post_header/draft_scheduled_post_header.test.tsx
  • app/components/draft_scheduled_post_header/draft_scheduled_post_header.tsx
  • app/components/post_draft/draft_input/draft_input.test.tsx
  • app/components/post_draft/draft_input/draft_input.tsx
  • app/database/migration/server/index.ts
  • app/database/models/server/scheduled_post.ts
  • app/database/operator/server_data_operator/transformers/post.test.ts
  • app/database/operator/server_data_operator/transformers/post.ts
  • app/database/schema/server/index.ts
  • app/database/schema/server/table_schemas/scheduled_post.ts
  • app/database/schema/server/test.ts
  • app/queries/servers/scheduled_post.test.ts
  • app/queries/servers/scheduled_post.ts
  • app/routes/(bottom_sheet)/scheduled_post_options.tsx
  • app/screens/draft_scheduled_post_options/draft_scheduled_post_options.tsx
  • app/screens/draft_scheduled_post_options/index.test.tsx
  • app/screens/reschedule_draft/index.tsx
  • app/screens/reschedule_draft/indext.test.tsx
  • app/screens/reschedule_draft/reschedule_draft.test.tsx
  • app/screens/reschedule_draft/reschedule_draft.tsx
  • app/screens/scheduled_post_options/index.test.tsx
  • app/screens/scheduled_post_options/index.ts
  • app/screens/scheduled_post_options/scheduled_post_picker.test.tsx
  • app/screens/scheduled_post_options/scheduled_post_picker.tsx
  • app/utils/post/index.test.ts
  • app/utils/post/index.ts
  • app/utils/scheduled_post/index.ts
  • app/utils/scheduled_post/scheduled_post.test.ts
  • assets/base/i18n/en.json
  • docs/database/server/server.md
  • test/test_helper.ts
  • types/api/config.d.ts
  • types/api/scheduled_post.d.ts
  • types/database/models/servers/scheduled_post.ts

Comment thread app/actions/remote/scheduled_post.test.ts
Comment thread app/components/post_draft/draft_input/draft_input.test.tsx Outdated
Comment thread app/screens/draft_scheduled_post_options/index.test.tsx
Comment thread app/screens/scheduled_post_options/scheduled_post_picker.test.tsx
Comment thread app/screens/scheduled_post_options/scheduled_post_picker.tsx
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown

Coverage Comparison Report

Generated on August 07, 2026 at 20:19:11 UTC

+-----------------+------------+------------+-----------+
| Metric          | Main       | This PR    | Diff      |
+-----------------+------------+------------+-----------+
| Lines           |     88.37% |     88.35% |    -0.02% |
| Statements      |     88.23% |     88.21% |    -0.02% |
| Branches        |     77.27% |     77.29% |     0.02% |
| Functions       |     87.67% |     87.66% |    -0.01% |
+-----------------+------------+------------+-----------+
| Total           |     85.38% |     85.37% |    -0.01% |
+-----------------+------------+------------+-----------+

- Gate the picker's recurrence payload on the toggle actually being
  offered, closing a race where the feature flag flips off while the
  sheet is open; add a regression test
- Use the real isScheduledPostModel predicate in the model round-trip
  test instead of mocking it
- Cover the automatic-timezone branch of getScheduledPostRecurrence
- Align new picker tests with the advanceTimers helper, use nullish
  coalescing for raw.type, and fix test names to the should... format

Co-authored-by: Nick Misasi <nick13misasi@gmail.com>
@mattermost-build mattermost-build added the E2E/Run Triggers E2E tests on both iOS and Android via Matterwick label Aug 7, 2026
@mattermost-build mattermost-build removed the E2E/Run Triggers E2E tests on both iOS and Android via Matterwick label Aug 7, 2026
…ng-scheduled-posts-d939

Co-authored-by: Nick Misasi <nick13misasi@gmail.com>
@mattermost-build mattermost-build added E2E/Run Triggers E2E tests on both iOS and Android via Matterwick and removed E2E/Run Triggers E2E tests on both iOS and Android via Matterwick labels Aug 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Docs/Needed Requires documentation release-note

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants