Skip to content

refactor: refresh buttons#3837

Merged
ogzhanolguncu merged 2 commits intomainfrom
refactor-refresh-buttons
Aug 28, 2025
Merged

refactor: refresh buttons#3837
ogzhanolguncu merged 2 commits intomainfrom
refactor-refresh-buttons

Conversation

@ogzhanolguncu
Copy link
Contributor

@ogzhanolguncu ogzhanolguncu commented Aug 22, 2025

What does this PR do?

This PR allows people to refresh on log pages. Previously, it was blocked because we had no way to refresh the list without users first selecting the relative filters, but now thanks to refreshQueryTime we can easily do that.
Fixes #3107

If there is not an issue for this, please create one first. This is used to tracking purposes and also helps use understand why this PR exists

Type of change

  • Bug fix (non-breaking change which fixes an issue)
  • Chore (refactoring code, technical debt, workflow improvements)
  • Enhancement (small improvements)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • This change requires a documentation update

How should this be tested?

  • Pretty much, test every modified refresh.

Checklist

Required

  • Filled out the "How to test" section in this PR
  • Read Contributing Guide
  • Self-reviewed my own code
  • Commented on my code in hard-to-understand areas
  • Ran pnpm build
  • Ran pnpm fmt
  • Checked for warnings, there are none
  • Removed all console.logs
  • Merged the latest changes from main onto my branch with git pull origin main
  • My changes don't cause any responsiveness issues

Appreciated

  • If a UI change was made: Added a screen recording or screenshots to this PR
  • Updated the Unkey Docs if changes were necessary

Summary by CodeRabbit

  • New Features
    • Refresh buttons are now always enabled across Logs, Audit, API Keys, and Rate Limits views.
    • Refresh updates the query time to fetch the latest data immediately, ensuring up-to-date results.
    • Consistent refresh behavior across dashboards for a smoother experience.
    • Streamlined refresh on Rate Limits overview for quicker updates.

@changeset-bot
Copy link

changeset-bot bot commented Aug 22, 2025

⚠️ No Changeset found

Latest commit: 857bbfc

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@vercel
Copy link

vercel bot commented Aug 22, 2025

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

Project Deployment Preview Comments Updated (UTC)
dashboard Ready Ready Preview Comment Aug 22, 2025 2:12pm
1 Skipped Deployment
Project Deployment Preview Comments Updated (UTC)
engineering Ignored Ignored Aug 22, 2025 2:12pm

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Aug 22, 2025

📝 Walkthrough

Walkthrough

Removed filter-based gating from multiple LogsRefresh components so the RefreshButton is always enabled. In several components, integrated useQueryTime to call refreshQueryTime before invalidating queries and refreshing. No exported signatures changed.

Changes

Cohort / File(s) Summary
APIs: Overview & Shared LogsRefresh
apps/dashboard/app/(app)/apis/[apiId]/_overview/.../logs-refresh.tsx, apps/dashboard/app/(app)/apis/_components/.../logs-refresh.tsx
Removed useFilters and hasRelativeFilter logic; RefreshButton now always enabled; retained refresh handler (invalidate relevant api keys/timeseries and router refresh).
APIs: Key Detail LogsRefresh
apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/.../logs-refresh.tsx
Dropped useFilters; button always enabled; refresh handler unchanged (refreshQueryTime where present and api.keys invalidations).
Audit LogsRefresh
apps/dashboard/app/(app)/audit/.../logs-refresh.tsx
Replaced useFilters with useQueryTime; added refreshQueryTime() before audit.logs.invalidate(); button always enabled.
Logs: Global LogsRefresh
apps/dashboard/app/(app)/logs/.../logs-refresh.tsx
Removed useFilters and relative-filter gating; button always enabled; handler unchanged.
Rate Limits: Namespace Overview LogsRefresh
apps/dashboard/app/(app)/ratelimits/[namespaceId]/_overview/.../logs-refresh.tsx
Removed useFilters and invalidations; button always enabled; handler simplified to query-time refresh only.
Rate Limits: Namespace Logs LogsRefresh
apps/dashboard/app/(app)/ratelimits/[namespaceId]/logs/.../logs-refresh.tsx
Removed useFilters; button always enabled; handler still refreshes query time and invalidates ratelimit logs.
Rate Limits: Shared LogsRefresh
apps/dashboard/app/(app)/ratelimits/_components/.../logs-refresh.tsx
Added useQueryTime and refreshQueryTime(); removed filter gating; kept ratelimit timeseries invalidation and router refresh; button always enabled.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant U as User
  participant LR as LogsRefresh Component
  participant QT as QueryTime Provider
  participant Q as Query Cache
  participant R as Router

  U->>LR: Click Refresh
  alt Components using QueryTime
    LR->>QT: refreshQueryTime()
  end
  LR->>Q: invalidate relevant queries
  LR->>R: router.refresh()
  Note right of LR: RefreshButton is always enabled
Loading

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Assessment against linked issues

Objective Addressed Explanation
Fix refresh button initially disabled despite default relative time [#3107]

Possibly related PRs

Suggested labels

Bug

Suggested reviewers

  • chronark
  • perkinsjr
  • mcstepp

Tip

🔌 Remote MCP (Model Context Protocol) integration is now available!

Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats.

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch refactor-refresh-buttons

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

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

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@ogzhanolguncu ogzhanolguncu marked this pull request as ready for review August 22, 2025 14:11
@vercel vercel bot temporarily deployed to Preview – dashboard August 22, 2025 14:12 Inactive
@github-actions
Copy link
Contributor

Thank you for following the naming conventions for pull request titles! 🙏

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (6)
apps/dashboard/app/(app)/logs/components/controls/components/logs-refresh.tsx (2)

11-15: Return a Promise from onRefresh (await query-time + invalidations) to avoid UI races

If RefreshButton shows a loading state based on a Promise, returning/awaiting here prevents stale flashes and batches invalidations predictably.

Apply:

-  const handleRefresh = () => {
-    refreshQueryTime();
-    logs.queryLogs.invalidate();
-    logs.queryTimeseries.invalidate();
-  };
+  const handleRefresh = async () => {
+    // Support both sync/async implementations
+    await Promise.resolve(refreshQueryTime());
+    await Promise.all([
+      logs.queryLogs.invalidate(),
+      logs.queryTimeseries.invalidate(),
+    ]);
+  };

7-15: Optional: memoize handler to reduce re-renders downstream

If RefreshButton or siblings are memoized, consider useCallback for handleRefresh to stabilize the prop.

+import { useCallback } from "react";
...
-  const handleRefresh = async () => {
+  const handleRefresh = useCallback(async () => {
     await Promise.resolve(refreshQueryTime());
     await Promise.all([
       logs.queryLogs.invalidate(),
       logs.queryTimeseries.invalidate(),
     ]);
-  };
+  }, [refreshQueryTime, logs]);
apps/dashboard/app/(app)/ratelimits/[namespaceId]/_overview/components/controls/components/logs-refresh.tsx (1)

9-14: Make refresh flow async and batch invalidations

Awaiting both the query-time tick and invalidations improves determinism and user feedback.

-  const handleRefresh = () => {
-    refreshQueryTime();
-    ratelimit.overview.logs.query.invalidate();
-    ratelimit.overview.logs.queryRatelimitLatencyTimeseries.invalidate();
-    ratelimit.logs.queryRatelimitTimeseries.invalidate();
-  };
+  const handleRefresh = async () => {
+    await Promise.resolve(refreshQueryTime());
+    await Promise.all([
+      ratelimit.overview.logs.query.invalidate(),
+      ratelimit.overview.logs.queryRatelimitLatencyTimeseries.invalidate(),
+      ratelimit.logs.queryRatelimitTimeseries.invalidate(),
+    ]);
+  };
apps/dashboard/app/(app)/ratelimits/[namespaceId]/logs/components/controls/components/logs-refresh.tsx (1)

11-15: Async onRefresh + Promise.all for consistent refresh UX

Same rationale as other files: return a Promise to the button and avoid interleaving state updates.

-  const handleRefresh = () => {
-    refreshQueryTime();
-    ratelimit.logs.query.invalidate();
-    ratelimit.logs.queryRatelimitTimeseries.invalidate();
-  };
+  const handleRefresh = async () => {
+    await Promise.resolve(refreshQueryTime());
+    await Promise.all([
+      ratelimit.logs.query.invalidate(),
+      ratelimit.logs.queryRatelimitTimeseries.invalidate(),
+    ]);
+  };
apps/dashboard/app/(app)/apis/[apiId]/_overview/components/controls/components/logs-refresh.tsx (1)

9-14: Await query-time tick and API invalidations

Prevents stale flashes and lets the button reflect an in-progress state.

-  const handleRefresh = () => {
-    refreshQueryTime();
-    api.keys.query.invalidate();
-    api.keys.timeseries.invalidate();
-    api.keys.activeKeysTimeseries.invalidate();
-  };
+  const handleRefresh = async () => {
+    await Promise.resolve(refreshQueryTime());
+    await Promise.all([
+      api.keys.query.invalidate(),
+      api.keys.timeseries.invalidate(),
+      api.keys.activeKeysTimeseries.invalidate(),
+    ]);
+  };
apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/components/controls/components/logs-refresh.tsx (1)

9-14: Convert to async and batch invalidations

Same change suggested elsewhere for consistency and to support loading states.

-  const handleRefresh = () => {
-    refreshQueryTime();
-    api.keys.query.invalidate();
-    api.keys.timeseries.invalidate();
-    api.keys.activeKeysTimeseries.invalidate();
-  };
+  const handleRefresh = async () => {
+    await Promise.resolve(refreshQueryTime());
+    await Promise.all([
+      api.keys.query.invalidate(),
+      api.keys.timeseries.invalidate(),
+      api.keys.activeKeysTimeseries.invalidate(),
+    ]);
+  };
📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 1cc6af7 and 857bbfc.

📒 Files selected for processing (8)
  • apps/dashboard/app/(app)/apis/[apiId]/_overview/components/controls/components/logs-refresh.tsx (1 hunks)
  • apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/components/controls/components/logs-refresh.tsx (1 hunks)
  • apps/dashboard/app/(app)/apis/_components/controls/components/logs-refresh.tsx (1 hunks)
  • apps/dashboard/app/(app)/audit/components/controls/components/logs-refresh.tsx (1 hunks)
  • apps/dashboard/app/(app)/logs/components/controls/components/logs-refresh.tsx (1 hunks)
  • apps/dashboard/app/(app)/ratelimits/[namespaceId]/_overview/components/controls/components/logs-refresh.tsx (1 hunks)
  • apps/dashboard/app/(app)/ratelimits/[namespaceId]/logs/components/controls/components/logs-refresh.tsx (1 hunks)
  • apps/dashboard/app/(app)/ratelimits/_components/controls/components/logs-refresh.tsx (1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{js,jsx,ts,tsx}: Use Biome for formatting and linting in TypeScript/JavaScript projects
Prefer named exports over default exports in TypeScript/JavaScript, except for Next.js pages

Files:

  • apps/dashboard/app/(app)/ratelimits/_components/controls/components/logs-refresh.tsx
  • apps/dashboard/app/(app)/audit/components/controls/components/logs-refresh.tsx
  • apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/components/controls/components/logs-refresh.tsx
  • apps/dashboard/app/(app)/apis/[apiId]/_overview/components/controls/components/logs-refresh.tsx
  • apps/dashboard/app/(app)/apis/_components/controls/components/logs-refresh.tsx
  • apps/dashboard/app/(app)/logs/components/controls/components/logs-refresh.tsx
  • apps/dashboard/app/(app)/ratelimits/[namespaceId]/logs/components/controls/components/logs-refresh.tsx
  • apps/dashboard/app/(app)/ratelimits/[namespaceId]/_overview/components/controls/components/logs-refresh.tsx
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx}: Follow strict TypeScript configuration
Use Zod for runtime validation in TypeScript projects

Files:

  • apps/dashboard/app/(app)/ratelimits/_components/controls/components/logs-refresh.tsx
  • apps/dashboard/app/(app)/audit/components/controls/components/logs-refresh.tsx
  • apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/components/controls/components/logs-refresh.tsx
  • apps/dashboard/app/(app)/apis/[apiId]/_overview/components/controls/components/logs-refresh.tsx
  • apps/dashboard/app/(app)/apis/_components/controls/components/logs-refresh.tsx
  • apps/dashboard/app/(app)/logs/components/controls/components/logs-refresh.tsx
  • apps/dashboard/app/(app)/ratelimits/[namespaceId]/logs/components/controls/components/logs-refresh.tsx
  • apps/dashboard/app/(app)/ratelimits/[namespaceId]/_overview/components/controls/components/logs-refresh.tsx
🧠 Learnings (2)
📚 Learning: 2025-06-24T13:29:10.129Z
Learnt from: ogzhanolguncu
PR: unkeyed/unkey#3401
File: apps/dashboard/app/(app)/logs/filters.query-params.ts:10-0
Timestamp: 2025-06-24T13:29:10.129Z
Learning: The `buildQueryParams` function in `apps/dashboard/app/(app)/logs/filters.query-params.ts` calls `useFilters()` hook inside it, but this is valid because the function is only called from within other React hooks, maintaining the Rules of Hooks compliance.

Applied to files:

  • apps/dashboard/app/(app)/ratelimits/_components/controls/components/logs-refresh.tsx
  • apps/dashboard/app/(app)/audit/components/controls/components/logs-refresh.tsx
  • apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/components/controls/components/logs-refresh.tsx
  • apps/dashboard/app/(app)/apis/[apiId]/_overview/components/controls/components/logs-refresh.tsx
  • apps/dashboard/app/(app)/apis/_components/controls/components/logs-refresh.tsx
  • apps/dashboard/app/(app)/logs/components/controls/components/logs-refresh.tsx
  • apps/dashboard/app/(app)/ratelimits/[namespaceId]/logs/components/controls/components/logs-refresh.tsx
  • apps/dashboard/app/(app)/ratelimits/[namespaceId]/_overview/components/controls/components/logs-refresh.tsx
📚 Learning: 2024-10-23T16:21:47.395Z
Learnt from: p6l-richard
PR: unkeyed/unkey#2085
File: apps/www/components/glossary/search.tsx:16-20
Timestamp: 2024-10-23T16:21:47.395Z
Learning: For the `FilterableCommand` component in `apps/www/components/glossary/search.tsx`, refactoring type definitions into an interface is not necessary at this time.

Applied to files:

  • apps/dashboard/app/(app)/logs/components/controls/components/logs-refresh.tsx
🧬 Code graph analysis (3)
apps/dashboard/app/(app)/ratelimits/_components/controls/components/logs-refresh.tsx (3)
apps/dashboard/app/(app)/ratelimits/[namespaceId]/_overview/components/controls/components/logs-refresh.tsx (1)
  • LogsRefresh (5-17)
apps/dashboard/app/(app)/ratelimits/[namespaceId]/logs/components/controls/components/logs-refresh.tsx (1)
  • LogsRefresh (6-20)
apps/dashboard/providers/query-time-provider.tsx (2)
  • useQueryTime (74-80)
  • refreshQueryTime (8-12)
apps/dashboard/app/(app)/audit/components/controls/components/logs-refresh.tsx (2)
apps/dashboard/app/(app)/logs/components/controls/components/logs-refresh.tsx (1)
  • LogsRefresh (6-20)
apps/dashboard/providers/query-time-provider.tsx (2)
  • useQueryTime (74-80)
  • refreshQueryTime (8-12)
apps/dashboard/app/(app)/apis/[apiId]/_overview/components/controls/components/logs-refresh.tsx (1)
internal/ui/src/components/buttons/refresh-button.tsx (1)
  • RefreshButton (80-80)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Test Go API Local / Test
  • GitHub Check: Test API / API Test Local
  • GitHub Check: Build / Build
🔇 Additional comments (16)
apps/dashboard/app/(app)/logs/components/controls/components/logs-refresh.tsx (1)

18-18: Always-enabled RefreshButton fixes #3107’s disabled-on-load bug

Making isEnabled unconditional aligns with the objective to allow refresh on initial load without re-selecting relative filters. Good call.

apps/dashboard/app/(app)/ratelimits/[namespaceId]/_overview/components/controls/components/logs-refresh.tsx (2)

16-16: Always-enabled RefreshButton: aligned with PR goal

Un-gating via isEnabled ensures refresh is usable on first load. Matches the bugfix intent.


1-17: AI summary inconsistency: this file still invalidates TRPC queries

The summary claims “refresh handler simplified to trigger a query-time refresh only,” but the code also invalidates three ratelimit queries. Summary should be corrected for traceability.

apps/dashboard/app/(app)/ratelimits/[namespaceId]/logs/components/controls/components/logs-refresh.tsx (2)

18-18: Un-gated refresh with live toggle is correct for logs UX

Always-enabled plus isLive/toggleLive wiring makes sense and keeps the live mode control discoverable.


7-8: Optional: disable manual refresh while live is on (if not already handled in RefreshButton)

If RefreshButton doesn’t internally gate manual refresh during live mode, consider passing a computed isEnabled={!isLive} to prevent redundant requests. If it already handles this, ignore.

apps/dashboard/app/(app)/apis/[apiId]/_overview/components/controls/components/logs-refresh.tsx (1)

16-16: RefreshButton always enabled: consistent with pattern across pages

Matches the standardized approach in this PR.

apps/dashboard/app/(app)/apis/[apiId]/keys/[keyAuthId]/[keyId]/components/controls/components/logs-refresh.tsx (1)

16-16: Always-enabled refresh: aligns with fix for disabled initial state

Consistent with the rest of the PR—good.

apps/dashboard/app/(app)/apis/_components/controls/components/logs-refresh.tsx (1)

14-14: LGTM: Refresh button now always enabled as intended.

The change successfully addresses the issue where the refresh button was initially disabled. The hardcoded isEnabled prop ensures the button is always interactive, aligning with the PR objective to fix the disabled state issue.

apps/dashboard/app/(app)/audit/components/controls/components/logs-refresh.tsx (4)

2-2: LGTM: Added useQueryTime for consistent refresh behavior.

The import of useQueryTime enables the component to synchronize query time state across components, which is essential for proper refresh functionality.


7-7: LGTM: Hook usage follows React patterns correctly.

The destructuring of refreshQueryTime from the useQueryTime hook is implemented correctly and follows React hook conventions.


9-12: LGTM: Enhanced refresh logic with query time synchronization.

The addition of refreshQueryTime() before cache invalidation ensures that the query time state is updated consistently across all components that depend on it. This provides a more reliable refresh experience.


14-14: LGTM: Refresh button now always enabled.

The hardcoded isEnabled prop ensures the refresh button is always interactive, which directly addresses the core issue described in the PR objectives where the button was initially disabled despite having default relative time filters.

apps/dashboard/app/(app)/ratelimits/_components/controls/components/logs-refresh.tsx (4)

2-2: LGTM: Consistent implementation with query time provider.

The import of useQueryTime aligns with the pattern established across other LogsRefresh components in this PR, ensuring consistent refresh behavior across the application.


7-7: LGTM: Proper hook usage pattern.

The destructuring of refreshQueryTime follows the established pattern seen in other components like apps/dashboard/app/(app)/ratelimits/[namespaceId]/_overview/components/controls/components/logs-refresh.tsx (Lines 4-16).


11-15: LGTM: Complete refresh flow implementation.

The refresh sequence correctly:

  1. Updates query time state via refreshQueryTime()
  2. Invalidates specific cache entries for ratelimit data
  3. Triggers router refresh

This follows the same pattern as other LogsRefresh components and ensures comprehensive data refresh.


17-17: LGTM: Addresses the core issue with always-enabled refresh button.

The hardcoded isEnabled prop successfully resolves the reported issue where refresh buttons were initially disabled even with default relative time selections. This change ensures consistent user experience across all log pages.

@chronark
Copy link
Collaborator

@mcstepp @perkinsjr we need a 2nd review

@chronark chronark added this pull request to the merge queue Aug 27, 2025
@graphite-app
Copy link

graphite-app bot commented Aug 27, 2025

Video gif. A toddler grins wide, raising their hand and giving an exuberant thumbs up at us. Their nose krinkles under their big smile.  (Added via Giphy)

@graphite-app
Copy link

graphite-app bot commented Aug 27, 2025

Graphite Automations

"Post a GIF when PR approved" took an action on this PR • (08/27/25)

1 gif was posted to this PR based on Andreas Thomas's automation.

@github-merge-queue github-merge-queue bot removed this pull request from the merge queue due to failed status checks Aug 27, 2025
@ogzhanolguncu ogzhanolguncu added this pull request to the merge queue Aug 28, 2025
Merged via the queue into main with commit 96e347e Aug 28, 2025
24 checks passed
@ogzhanolguncu ogzhanolguncu deleted the refactor-refresh-buttons branch August 28, 2025 11:51
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.

bug: refresh button is initially disabled even with default relative time

3 participants