Skip to content

OUT-3982 | Editor: Studio app toggles in Actions sidebar + preview rows - #224

Merged
arpandhakal merged 3 commits into
arpandhakal/out-3981-client-ui-dynamic-studio-app-rows-in-your-actionsfrom
arpandhakal/out-3982-editor-studio-app-toggles-in-actions-sidebar-preview-rows
Jul 27, 2026
Merged

OUT-3982 | Editor: Studio app toggles in Actions sidebar + preview rows#224
arpandhakal merged 3 commits into
arpandhakal/out-3981-client-ui-dynamic-studio-app-rows-in-your-actionsfrom
arpandhakal/out-3982-editor-studio-app-toggles-in-actions-sidebar-preview-rows

Conversation

@arpandhakal

Copy link
Copy Markdown
Collaborator

Changes

Lets internal users control each Studio app's presence in "Your Actions" from the existing Actions sidebar panel. Apps appear in the toggle list automatically once installed and registered (default on, zero setup), and can be dragged into any order alongside the built-in rows.

  • useActions — merges dynamic apps (from OUT-3979 discovery) into the toggle list. App toggles are keyed by appId; checked = !hiddenAppIds.includes(appId); flipping mutates actions.hiddenAppIds (OUT-3978 deny-list) and saves via the existing "Save Changes" flow (useAppControls dirty-check already covers hiddenAppIds).
  • Unified drag-and-drop — built-ins and Studio-app rows now form a single sortable list. actions.order holds a mix of ActionKeys and appIds; items absent from it fall to the end until positioned. useEnabledActions renders the client card in the same unified order. (Supersedes the ticket's v1 "apps last, non-draggable" note per follow-up discussion.)
  • Removed the interim non-draggable AppToggleItem; ActionItem's icon widened from the 4-value ActionItemIcon to IconType so app icons render. Dropped the now-unused ActionItemIcon type.
  • Editor preview — dynamic rows render regardless of count (like built-ins) with the {{N}} placeholder chip via HandleBarTemplate; client/preview still resolves the real unread count and hides at 0.
  • Tasks de-duplication — Tasks already renders as a built-in row, so its install (appId === TASKS_APP_ID) is excluded from actionable-installs discovery. Fixed server-side so both the sidebar and the rendered card are covered from one source.
  • Discovery hardening — the per-install notification-settings fan-out now runs through mapWithConcurrency (limit 5) instead of Promise.all, avoiding a burst of TLS connections that tripped undici connect timeouts in dev. Added logger.info for both the raw platform installs and the final actionable list to aid debugging.
  • pnpm typecheck and pnpm lint pass.

Testing Criteria

  • As an internal user, install + register a Studio app → it appears in the Actions sidebar toggle list, default on, with no migration/setup.
  • Toggling an app off removes its rows from Your Actions for clients in the workspace; toggling on restores it.
  • Drag to reorder — built-in and dynamic rows can be freely interleaved; order persists after Save and is reflected in the client/preview card.
  • Editor preview shows every enabled app row regardless of count, with the {{N}} chip; client view shows the resolved count and hides rows at 0.
  • The Tasks app renders once (built-in only), never as a duplicate dynamic row.
  • Uninstall → app drops off the list with no cleanup. Reinstall → previous on/off choice restored (hide state keyed by appId).
  • Loom video: TODO

Notes

  • Stacked on OUT-3981 (base branch) → OUT-3980OUT-3979 (merged). Merge order: 3980 → 3981 → 3982 into feature/studio-apps-action.
  • TASKS_APP_ID is the Tasks app's appId; the built-in Tasks row identifies itself by the same value (/api/workspace/tasks-app-idgetAppId(TASKS_APP_ID)), so excluding it from discovery is exact.
  • Separate task-like apps with their own appId (e.g. a future "Tasks Beta") still surface as their own dynamic rows — only the canonical Tasks app is de-duped.

Impact & Surface Area of Change

  • useActions and useEnabledActions now depend on useInstalledApps (workspace-scoped React Query) and share the order array across built-in keys and appIds. Worth a regression check on drag-reorder + Save for the built-in-only case (no installed apps).
  • ActionItem's icon prop widened to IconType — verify built-in action icons still render.
  • Server discovery: mapWithConcurrency replaces Promise.all in getActionableInstalls; behavior identical apart from bounded concurrency.
  • Regression check on the "Your Actions" card across all three surfaces (editor, preview, client/readonly).

🤖 Generated with Claude Code

arpandhakal and others added 2 commits July 24, 2026 14:01
Internal users control each Studio app's presence in Your Actions from
the existing Actions sidebar panel. Apps appear automatically once
installed and registered, defaulted to on.

- useActions merges dynamic apps (keyed by appId) after built-ins;
  toggle checked = !hiddenAppIds.includes(appId); flipping mutates
  actions.hiddenAppIds, saved via the existing Save Changes flow.
- AppToggleItem renders a non-draggable toggle row (Studio-app rows are
  excluded from dnd reorder in v1).
- Editor preview now shows every enabled dynamic row regardless of
  count, matching built-in behavior, with the {{N}} placeholder chip.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Built-ins and dynamic Studio-app rows now share one drag-orderable list
  in the Actions sidebar; `order` holds a mix of ActionKeys and appIds, and
  useEnabledActions renders in that unified order (drops the v1 "apps last,
  non-draggable" restriction). Removes AppToggleItem; ActionItem icon widened
  to IconType.
- Exclude the Tasks app (appId === TASKS_APP_ID) from actionable-installs
  discovery so it doesn't duplicate the built-in Tasks row.
- Fan out notification-settings via mapWithConcurrency (limit 5) instead of
  Promise.all, avoiding a TLS-connection burst that tripped undici connect
  timeouts in dev.
- Log both the raw platform installs and the final actionable list to aid
  debugging why an app does/doesn't surface.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@linear-code

linear-code Bot commented Jul 24, 2026

Copy link
Copy Markdown

OUT-3982

@vercel

vercel Bot commented Jul 24, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
client-home-v3 Ready Ready Preview, Comment Jul 24, 2026 9:50am

Request Review

@greptile-apps

greptile-apps Bot commented Jul 24, 2026

Copy link
Copy Markdown

Greptile Summary

Updates Studio app actions and completes the prior logging fix.

  • Adds dynamic Studio apps to the unified toggle and drag-order list.
  • Renders dynamic editor placeholders while filtering zero-count rows on client and preview surfaces.
  • Excludes the canonical Tasks app and bounds notification-settings request concurrency.
  • Removes the previously flagged install-inventory and actionable-list info logging.

Confidence Score: 5/5

The PR appears safe to merge.

No blocking failures remain in the prior-thread logging fix.

Important Files Changed

Filename Overview
src/features/installed-apps/lib/installed-apps.service.ts Filters the Tasks install, bounds notification-settings requests, and fully removes the previously flagged metadata-rich info logs.
src/features/editor/components/Sidebar/Actions/useActions.tsx Integrates installed Studio apps into the existing toggle and drag-order controls.
src/features/settings/hooks/useEnabledActions.ts Produces one ordered sequence containing enabled built-in and dynamic actions.
src/features/action-items/components/actions-card.tsx Aligns dynamic-row visibility with the existing editor versus client and preview behavior.
src/utils/array.ts Adds an order-preserving bounded-concurrency async mapping utility.

Reviews (2): Last reviewed commit: "chore(OUT-3982): remove discovery debug ..." | Re-trigger Greptile

Comment thread src/features/installed-apps/lib/installed-apps.service.ts Outdated
Drop the temporary logger.info calls for the raw platform installs and the
final actionable list; keep the error log for failed notification-settings
fetches.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@arpandhakal

Copy link
Copy Markdown
Collaborator Author

@greptile please re review

@SandipBajracharya SandipBajracharya left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

lgtm

@arpandhakal
arpandhakal merged commit 69d33d8 into arpandhakal/out-3981-client-ui-dynamic-studio-app-rows-in-your-actions Jul 27, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants