feat(app): show goals on tasks and unify bottom nav#4475
Conversation
There was a problem hiding this comment.
Code Review
This pull request adds a swipe-right-to-indent feature for top-level tasks on mobile. The implementation correctly uses a Dismissible widget with a confirmDismiss callback to handle the new gesture without dismissing the item. My review found one area for improvement: there is a redundant conditional check in the onDismissed callback. Since onDismissed is only triggered for directions where confirmDismiss returns true, the check is unnecessary and can be removed to make the code cleaner and more robust.
| if (direction == DismissDirection.endToStart) { | ||
| _deleteTask(item); | ||
| } |
There was a problem hiding this comment.
The if (direction == DismissDirection.endToStart) check is redundant. The onDismissed callback is only triggered when confirmDismiss returns true. In your implementation, this only happens for the endToStart direction because confirmDismiss returns false for startToEnd. Therefore, onDismissed will not be called for the startToEnd direction. You can safely remove the conditional check to make the code cleaner and more robust against future changes to confirmDismiss.
_deleteTask(item);## Summary
- Add 2-hour TTL caching for chat tools manifest fetching to reduce
external API calls
- Add `POST /v1/apps/{app_id}/refresh-manifest` endpoint for manual
cache bypass
- Add refresh button in the manage app screen (only visible for apps
with manifest URL)
Replaces #4476 (rebased and conflict-resolved against current main; the
UI changes from that PR were already merged via #4475).
## Changes
### Backend
- `backend/utils/apps.py`: Added `force_refresh` param and Redis caching
with 2h TTL to `fetch_app_chat_tools_from_manifest()`
- `backend/routers/apps.py`: New `refresh-manifest` endpoint with
ownership validation, manifest fetching, and cache invalidation
### Flutter
- `app/lib/backend/http/api/apps.dart`: Added
`refreshAppManifestServer()` API call
- `app/lib/pages/apps/providers/add_app_provider.dart`: Added
`refreshManifest()` method with loading state
- `app/lib/pages/apps/update_app.dart`: Added refresh icon button in
AppBar (conditional on external integration + manifest URL)
## Test plan
- [ ] Verify manifest caching works (second fetch should hit cache)
- [ ] Verify force refresh bypasses cache
- [ ] Verify refresh button appears only for apps with external
integration + manifest URL
- [ ] Verify loading indicator shows during refresh
- [ ] Verify success/error feedback
🤖 Generated with [Claude Code](https://claude.com/claude-code)
## Summary
- Add 2-hour TTL caching for chat tools manifest fetching to reduce
external API calls
- Add `POST /v1/apps/{app_id}/refresh-manifest` endpoint for manual
cache bypass
- Add refresh button in the manage app screen (only visible for apps
with manifest URL)
Replaces BasedHardware#4476 (rebased and conflict-resolved against current main; the
UI changes from that PR were already merged via BasedHardware#4475).
## Changes
### Backend
- `backend/utils/apps.py`: Added `force_refresh` param and Redis caching
with 2h TTL to `fetch_app_chat_tools_from_manifest()`
- `backend/routers/apps.py`: New `refresh-manifest` endpoint with
ownership validation, manifest fetching, and cache invalidation
### Flutter
- `app/lib/backend/http/api/apps.dart`: Added
`refreshAppManifestServer()` API call
- `app/lib/pages/apps/providers/add_app_provider.dart`: Added
`refreshManifest()` method with loading state
- `app/lib/pages/apps/update_app.dart`: Added refresh icon button in
AppBar (conditional on external integration + manifest URL)
## Test plan
- [ ] Verify manifest caching works (second fetch should hit cache)
- [ ] Verify force refresh bypasses cache
- [ ] Verify refresh button appears only for apps with external
integration + manifest URL
- [ ] Verify loading indicator shows during refresh
- [ ] Verify success/error feedback
🤖 Generated with [Claude Code](https://claude.com/claude-code)
* fix(app): add swipe-right indent for tasks * feat(app): unify task goals and chat nav
## Summary
- Add 2-hour TTL caching for chat tools manifest fetching to reduce
external API calls
- Add `POST /v1/apps/{app_id}/refresh-manifest` endpoint for manual
cache bypass
- Add refresh button in the manage app screen (only visible for apps
with manifest URL)
Replaces BasedHardware#4476 (rebased and conflict-resolved against current main; the
UI changes from that PR were already merged via BasedHardware#4475).
## Changes
### Backend
- `backend/utils/apps.py`: Added `force_refresh` param and Redis caching
with 2h TTL to `fetch_app_chat_tools_from_manifest()`
- `backend/routers/apps.py`: New `refresh-manifest` endpoint with
ownership validation, manifest fetching, and cache invalidation
### Flutter
- `app/lib/backend/http/api/apps.dart`: Added
`refreshAppManifestServer()` API call
- `app/lib/pages/apps/providers/add_app_provider.dart`: Added
`refreshManifest()` method with loading state
- `app/lib/pages/apps/update_app.dart`: Added refresh icon button in
AppBar (conditional on external integration + manifest URL)
## Test plan
- [ ] Verify manifest caching works (second fetch should hit cache)
- [ ] Verify force refresh bypasses cache
- [ ] Verify refresh button appears only for apps with external
integration + manifest URL
- [ ] Verify loading indicator shows during refresh
- [ ] Verify success/error feedback
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Summary
BottomNavBarwidget and reuse it on home + chatTest plan