Add pull-to-refresh to the article list

Open Beginner friendly
#95 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
1/5
Estimated time
Under an hour
Newbie friendliness
88/100
Issue type
Feature
Clarity
Clearly specified
Activity status
Quiet
Tech stack
swift
Domain
mobile

Research direction

Start with Today/Views/TodayView.swift and compare the existing sync-button pattern in Today/Views/FeedListView.swift. Use Today/Services/FeedManager.swift to confirm the sync entry point, then verify the iOS refresh gesture, loading indicator, list updates, macOS build, and existing filtering, search, and category behavior.

Written by the indexing model from the issue text.

Description

agent-ready complexity:low

Summary

Add pull-to-refresh gesture to the article list in TodayView so users can manually trigger a feed sync without navigating to the Feeds tab.

Context

Currently, users who want to sync their feeds must go to the Feeds tab and tap the sync button. The article list in TodayView has no way to trigger a refresh. Pull-to-refresh is a standard iOS pattern that users expect in any scrollable content list, and the sync infrastructure already exists — it just needs to be wired up.

Acceptance Criteria

  • Pulling down on the article list in TodayView triggers a feed sync
  • A loading indicator is visible while the sync is in progress
  • The list updates automatically when new articles arrive (already handled by @Query)
  • Works on iOS and does not break macOS layout
  • No regressions to existing filtering, search, or category selection

Scope

In scope:

  • Add .refreshable modifier to the List in TodayView
  • Call FeedManager.syncAllFeeds() from the refresh action

Out of scope:

  • Changes to sync frequency or background fetch logic
  • Adding pull-to-refresh to any other view
  • Changing the sync behavior itself

Technical Notes

Key files:

  • Today/Views/TodayView.swift — main article list, add .refreshable here
  • Today/Services/FeedManager.swiftsyncAllFeeds() is the method to call
  • Today/Views/FeedListView.swift — reference for how sync is currently triggered via button

Patterns to follow:

  • FeedListView.swift calls feedManager.syncAllFeeds() for the sync button — use the same call
  • SwiftUI .refreshable { await ... } modifier works on List
  • .refreshable is iOS-only — wrap in #if os(iOS) to avoid macOS build errors

Complexity

  • complexity:low — Single file, obvious pattern, quick fix
  • complexity:medium — Multiple files, follows established patterns
  • complexity:high — Architectural decisions, new patterns, needs planning phase

Agent Readiness

  • Scope is bounded (can be done in one PR)
  • Success criteria are measurable
  • Context explains the "why"
  • Patterns are linked, not assumed
  • No external blockers (APIs available, dependencies installed)
  • Complexity is appropriate for agent execution
Dominant language
Swift
Stars
21
Forks
2
PR merge metrics
No merged PRs in 30d

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from whyisjake/today

All issues in whyisjake/today

Similar issues

More Swift issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.