Skip to content

Optimizing API calls and adding cache #94

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 0 commits into from

Conversation

vedansh-5
Copy link
Contributor

@vedansh-5 vedansh-5 commented May 28, 2025

Description

Optimized GitHub data fetching by implementing persistent caching, debouncing bursts of API calls, and enabling parallel API requests. These improvements significantly reduce redundant network traffic and enhance performance. The codebase has also been modernized with native fetch, async/await, and cleaner variable declarations, along with minor UI enhancements.
Fixes #104
Key Features

Persistent Caching: Added a client-side cache layer with TTL and state restoration to avoid redundant API calls.

Debouncing & Queuing: Prevents API spamming by intelligently delaying burst requests.

Parallel Fetching: Fetches issues, PR reviews, and user data concurrently to reduce wait times.

Enhancements

Migrated from jQuery AJAX to native fetch using Promise.all and async/await.

Refactored variable declarations using let and const for cleaner, safer code.

Introduced debug logging for cache and network operations.

Summary by Sourcery

Optimize GitHub data fetching by adding a persistent cache layer, debouncing burst requests, and parallelizing API calls, while modernizing code with fetch, async/await, and variable declaration refactoring plus UI toggle styling enhancements.

New Features:

  • Introduce persistent client-side caching for GitHub API data with TTL and storage restoration
  • Implement request debouncing, queuing, and parallel fetching of GitHub issues, PR reviews, and user data

Enhancements:

  • Migrate from jQuery AJAX to native fetch with Promise.all and modern async/await patterns
  • Refactor codebase to use let/const declarations and add debug logging for cache and fetch operations
  • Add CSS classes for selected/unselected toggle labels with smooth transition effects

Copy link
Contributor

sourcery-ai bot commented May 28, 2025

Reviewer's Guide

This PR enhances performance of GitHub data fetching by introducing a client-side cache with persistence and TTL, debouncing and queuing of API calls to prevent bursts, and parallelizing data fetches; it also modernizes the codebase with native fetch, ES6 syntax, debug logging, and UI styling improvements.

Class Diagram of the New Caching System in scrumHelper.js

classDiagram
    class githubCache {
      <<JavaScript Object>>
      +data: object
      +cacheKey: string
      +timestamp: number
      +ttl: number
      +fetching: boolean
      +queue: object[]
      +errors: object
      +errorTTL: number
      +MAX_CACHE_SIZE: number
    }

    class CacheController {
      <<Conceptual Grouping of Functions>>
      #githubCache: githubCache
      +fetchGithubData(): Promise~void~
      +saveToStorage(dataToSave: object): Promise~boolean~
      +loadFromStorage(): Promise~boolean~
      +updateCache(dataToUpdate: object): void
      +processGithubData(dataToProcess: object): void
      +verifyCacheStatus(): void
      +getChromeData(): void
      +log(...args): void
      +logError(...args): void
    }

    CacheController ..> githubCache : manages and uses
    CacheController ..> chrome.storage.local : interacts via save/load
Loading

File-Level Changes

Change Details Files
Introduce a persistent TTL cache for GitHub data
  • Added global githubCache object with data, cacheKey, timestamp, ttl, queue, and error tracking
  • Implemented saveToStorage and loadFromStorage functions using chrome.storage.local
  • Invalidate cache on key mismatch and update timestamp on cache writes
src/scripts/scrumHelper.js
Debounce and queue concurrent API requests
  • Throttle requests with a 500ms delay before fetching
  • Use fetching flag and queue array to buffer overlapping calls
  • Resolve or reject queued promises once fetch completes
src/scripts/scrumHelper.js
Parallelize data fetching with async/await and Promise.all
  • Construct issue, PR, and user URLs dynamically with template strings
  • Fetch issues, PR reviews, and user data concurrently
  • Process and cache all three responses together
src/scripts/scrumHelper.js
Migrate from jQuery AJAX to native fetch and modernize syntax
  • Replaced $.ajax calls with fetch and async/await
  • Converted var declarations to let/const and used template literals
  • Refactored callback flows into async functions
src/scripts/scrumHelper.js
src/scripts/main.js
Add configurable debug logging and error handling
  • Introduced DEBUG flag with log and logError wrappers
  • Log key cache events, fetch status, and storage operations
  • Catch fetch errors and propagate to queued requests
src/scripts/scrumHelper.js
Enhance UI toggle styling and configuration behavior
  • Added .selectedLabel and .unselectedLabel CSS classes with transitions
  • Update main.js to toggle label classes on configuration elements
  • Sync toggle state changes to chrome.storage.local
src/index.css
src/scripts/main.js

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@vedansh-5 vedansh-5 self-assigned this May 28, 2025
Copy link
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

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

Hey @vedansh-5 - I've reviewed your changes and found some issues that need to be addressed.

Blocking issues:

  • Incorrect storage API method and undefined variable (link)

General comments:

  • Replace the call to chrome.storage.local.setAttribute with chrome.storage.local.set, since setAttribute is not a valid API and will prevent your cache from persisting.
  • Remove the duplicated declaration of let refreshButton_Placed inside allIncluded which shadows the global variable and may lead to unexpected behavior.
  • Make the DEBUG flag configurable (e.g. via environment or options) so you can disable verbose logging in production and avoid performance overhead.
Here's what I looked at during the review
  • 🔴 General issues: 1 blocking issue, 5 other issues
  • 🟢 Security: all looks good
  • 🟢 Testing: all looks good
  • 🟢 Documentation: all looks good

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

@vedansh-5
Copy link
Contributor Author

caching.mp4

image
I have successfully added the feature of caching of data in between API calls, as can be seen in the video, API calls are not being made to GitHub API and the data stored in cache is being used. This PR is not ready to be merged yet, I still have to add a component in UI using which we can manually trigger fetching of the data, TTL is set to 10 minutes.
@Preeti9764 : Could you take a look whenever you have some time.

@vedansh-5
Copy link
Contributor Author

@sourcery-ai review

Copy link
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

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

Hey @vedansh-5 - I've reviewed your changes - here's some feedback:

  • Extract the duplicated date‐formatting logic and cache/fetch utilities into shared modules to DRY up both main.js and scrumHelper.js.
  • Clean up leftover commented-out code and debug scaffolding (e.g. remove console.log blocks and fix the console.wanr typo) before merging.
  • Consider moving the GitHub cache/debounce/queue logic into its own service layer to simplify error handling and make the core script more maintainable.
Here's what I looked at during the review
  • 🟢 General issues: all looks good
  • 🟢 Security: all looks good
  • 🟢 Testing: all looks good
  • 🟢 Documentation: all looks good

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

chrome.storage.local.set({ enableToggle: value });
}
function handleStartingDateChange() {
var value = startingDateElement.value;
let value = startingDateElement.value;
Copy link
Contributor

Choose a reason for hiding this comment

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

suggestion (code-quality): Prefer object destructuring when accessing and using properties. (use-object-destructuring)

Suggested change
let value = startingDateElement.value;
let {value} = startingDateElement;


ExplanationObject destructuring can often remove an unnecessary temporary reference, as well as making your code more succinct.

From the Airbnb Javascript Style Guide

chrome.storage.local.set({ startingDate: value });
}
function handleEndingDateChange() {
var value = endingDateElement.value;
let value = endingDateElement.value;
Copy link
Contributor

Choose a reason for hiding this comment

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

suggestion (code-quality): Prefer object destructuring when accessing and using properties. (use-object-destructuring)

Suggested change
let value = endingDateElement.value;
let {value} = endingDateElement;


ExplanationObject destructuring can often remove an unnecessary temporary reference, as well as making your code more succinct.

From the Airbnb Javascript Style Guide

@@ -136,20 +142,30 @@ function getToday() {
}

function handleGithubUsernameChange() {
var value = githubUsernameElement.value;
let value = githubUsernameElement.value;
Copy link
Contributor

Choose a reason for hiding this comment

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

suggestion (code-quality): Prefer object destructuring when accessing and using properties. (use-object-destructuring)

Suggested change
let value = githubUsernameElement.value;
let {value} = githubUsernameElement;


ExplanationObject destructuring can often remove an unnecessary temporary reference, as well as making your code more succinct.

From the Airbnb Javascript Style Guide

chrome.storage.local.set({ githubUsername: value });
}
function handleProjectNameChange() {
var value = projectNameElement.value;
let value = projectNameElement.value;
Copy link
Contributor

Choose a reason for hiding this comment

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

suggestion (code-quality): Prefer object destructuring when accessing and using properties. (use-object-destructuring)

Suggested change
let value = projectNameElement.value;
let {value} = projectNameElement;


ExplanationObject destructuring can often remove an unnecessary temporary reference, as well as making your code more succinct.

From the Airbnb Javascript Style Guide

function handleUserReasonChange() {
var value = userReasonElement.value;
let value = userReasonElement.value;
Copy link
Contributor

Choose a reason for hiding this comment

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

suggestion (code-quality): Prefer object destructuring when accessing and using properties. (use-object-destructuring)

Suggested change
let value = userReasonElement.value;
let {value} = userReasonElement;


ExplanationObject destructuring can often remove an unnecessary temporary reference, as well as making your code more succinct.

From the Airbnb Javascript Style Guide

var title = item.title;
var number = item.number;
var li = '';
let items = githubIssuesData.items;
Copy link
Contributor

Choose a reason for hiding this comment

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

suggestion (code-quality): Prefer object destructuring when accessing and using properties. (use-object-destructuring)

Suggested change
let items = githubIssuesData.items;
let {items} = githubIssuesData;


ExplanationObject destructuring can often remove an unnecessary temporary reference, as well as making your code more succinct.

From the Airbnb Javascript Style Guide

}
for (let i = 0; i < items.length; i++) {
let item = items[i];
let html_url = item.html_url;
Copy link
Contributor

Choose a reason for hiding this comment

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

suggestion (code-quality): Prefer object destructuring when accessing and using properties. (use-object-destructuring)

Suggested change
let html_url = item.html_url;
let {html_url} = item;


ExplanationObject destructuring can often remove an unnecessary temporary reference, as well as making your code more succinct.

From the Airbnb Javascript Style Guide

for (let i = 0; i < items.length; i++) {
let item = items[i];
let html_url = item.html_url;
let repository_url = item.repository_url;
Copy link
Contributor

Choose a reason for hiding this comment

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

suggestion (code-quality): Prefer object destructuring when accessing and using properties. (use-object-destructuring)

Suggested change
let repository_url = item.repository_url;
let {repository_url} = item;


ExplanationObject destructuring can often remove an unnecessary temporary reference, as well as making your code more succinct.

From the Airbnb Javascript Style Guide

let html_url = item.html_url;
let repository_url = item.repository_url;
let project = repository_url.substr(repository_url.lastIndexOf('/') + 1);
let title = item.title;
Copy link
Contributor

Choose a reason for hiding this comment

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

suggestion (code-quality): Prefer object destructuring when accessing and using properties. (use-object-destructuring)

Suggested change
let title = item.title;
let {title} = item;


ExplanationObject destructuring can often remove an unnecessary temporary reference, as well as making your code more succinct.

From the Airbnb Javascript Style Guide

let repository_url = item.repository_url;
let project = repository_url.substr(repository_url.lastIndexOf('/') + 1);
let title = item.title;
let number = item.number;
Copy link
Contributor

Choose a reason for hiding this comment

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

suggestion (code-quality): Prefer object destructuring when accessing and using properties. (use-object-destructuring)

Suggested change
let number = item.number;
let {number} = item;


ExplanationObject destructuring can often remove an unnecessary temporary reference, as well as making your code more succinct.

From the Airbnb Javascript Style Guide

@hpdang
Copy link
Member

hpdang commented May 30, 2025

when testing this PR locally, I get the following error in the console:

popup.html:1 Error handling response: ReferenceError: labelElement is not defined
at handleLastWeekContributionChange (chrome-extension://habmeegbbkhocamkcglcopcdehmenaah/scripts/main.js:107:4)
at handleGsocClick (chrome-extension://habmeegbbkhocamkcglcopcdehmenaah/scripts/main.js:185:2)
at chrome-extension://habmeegbbkhocamkcglcopcdehmenaah/scripts/main.js:65:5
main.js:107 Uncaught ReferenceError: labelElement is not defined
at handleLastWeekContributionChange (main.js:107:4)
at HTMLAnchorElement.handleGsocClick (main.js:185:2)

@vedansh-5
Copy link
Contributor Author

when testing this PR locally, I get the following error in the console:

popup.html:1 Error handling response: ReferenceError: labelElement is not defined at handleLastWeekContributionChange (chrome-extension://habmeegbbkhocamkcglcopcdehmenaah/scripts/main.js:107:4) at handleGsocClick (chrome-extension://habmeegbbkhocamkcglcopcdehmenaah/scripts/main.js:185:2) at chrome-extension://habmeegbbkhocamkcglcopcdehmenaah/scripts/main.js:65:5 main.js:107 Uncaught ReferenceError: labelElement is not defined at handleLastWeekContributionChange (main.js:107:4) at HTMLAnchorElement.handleGsocClick (main.js:185:2)

Thanks for pointing this out, this is a rebase discrepancy, I've fixed the labelElement definition, will commit along with other enhancements in the pr.

@vedansh-5
Copy link
Contributor Author

@hpdang @mariobehling Please take a look whenever you have some time, with the latest changes optimization of API requests and content caching along with API debouncing is successfully implemented.
I could use another pair of eyes to skim through the code @Preeti9764
Thanks!

Copy link
Contributor

@Preeti9764 Preeti9764 left a comment

Choose a reason for hiding this comment

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

Could you please confirm if the 'Refresh Data (bypass cache)' button is successfully clearing the cached GitHub data and triggering fresh API calls? Also, is the cache properly repopulated after the reload?

@vedansh-5
Copy link
Contributor Author

Could you please confirm if the 'Refresh Data (bypass cache)' button is successfully clearing the cached GitHub data and triggering fresh API calls? Also, is the cache properly repopulated after the reload?

Yes it clears the data, and populates it after reload.

@vedansh-5
Copy link
Contributor Author

vedansh-5 commented May 31, 2025

Could you please confirm if the 'Refresh Data (bypass cache)' button is successfully clearing the cached GitHub data and triggering fresh API calls? Also, is the cache properly repopulated after the reload?

Yes it clears the data, and populates it after reload.

I have checked it extensively. Did you locally try the extension, there's a DEBUG variable in ScrumHelper.js which is now set to false, you can set it to true to get a clearer picture.
Thanks!

@vedansh-5
Copy link
Contributor Author

@Preeti9764 Does the PR looks good to merge?

@Preeti9764
Copy link
Contributor

I have checked it extensively. Did you locally try the extension, there's a DEBUG variable in ScrumHelper.js which is now set to false, you can set it to true to get a clearer picture. Thanks!

Yes , i locally tested it but i could not find the reviewed pr in scrum generated. can you please check this once. Other things are working fine as far i have checked.

@vedansh-5
Copy link
Contributor Author

I have checked it extensively. Did you locally try the extension, there's a DEBUG variable in ScrumHelper.js which is now set to false, you can set it to true to get a clearer picture. Thanks!

Yes , i locally tested it but i could not find the reviewed pr in scrum generated. can you please check this once. Other things are working fine as far i have checked.

image

I generated this rn.

@Preeti9764
Copy link
Contributor

Screenshot 2025-06-01 214339
After making changes of this pr the reviewed prs are not visible in the left one .
@vedansh-5 Please look this once.

@vedansh-5
Copy link
Contributor Author

Screenshot 2025-06-01 214339 After making changes of this pr the reviewed prs are not visible in the left one . @vedansh-5 Please look this once.

Thanks for pointing this out, I'll look for the cause and fix it.

@vedansh-5
Copy link
Contributor Author

vedansh-5 commented Jun 5, 2025

@Preeti9764 I made changes in the code and its now injecting the reviewed PRs, can you check if its working for you or not.
Once you confirm I'll move onto resolving the conflicts.
Thanks!
image

@Preeti9764
Copy link
Contributor

@Preeti9764 I made changes in the code and its now injecting the reviewed PRs, can you check if its working for you or not.

yes, i checked it the issue of reviewed pr is not there any more...but i found the code currently performs repetitive DOM queries without any caching mechanism. Can you look at that .

@vedansh-5
Copy link
Contributor Author

@Preeti9764 I made changes in the code and its now injecting the reviewed PRs, can you check if its working for you or not.

yes, i checked it the issue of reviewed pr is not there any more...but i found the code currently performs repetitive DOM queries without any caching mechanism. Can you look at that .

Caching is implemented, could you please tell what observations of yours make you say this?

@vedansh-5
Copy link
Contributor Author

vedansh-5 commented Jun 6, 2025

@Preeti9764 I made changes in the code and its now injecting the reviewed PRs, can you check if its working for you or not.

yes, i checked it the issue of reviewed pr is not there any more...but i found the code currently performs repetitive DOM queries without any caching mechanism. Can you look at that .

caching.mp4

As can be seen in this video, fetch requests are made only for the first time and not after that. It would be better if you share your network logs for the same to confirm the issue. Thanks!

@Preeti9764
Copy link
Contributor

@Preeti9764 I made changes in the code and its now injecting the reviewed PRs, can you check if its working for you or not.

yes, i checked it the issue of reviewed pr is not there any more...but i found the code currently performs repetitive DOM queries without any caching mechanism. Can you look at that .

Caching is implemented, could you please tell what observations of yours make you say this?

The Dom queries are repeative, which are not good for performance optimisation .

@vedansh-5
Copy link
Contributor Author

vedansh-5 commented Jun 6, 2025

@Preeti9764 I made changes in the code and its now injecting the reviewed PRs, can you check if its working for you or not.

yes, i checked it the issue of reviewed pr is not there any more...but i found the code currently performs repetitive DOM queries without any caching mechanism. Can you look at that .

Caching is implemented, could you please tell what observations of yours make you say this?

The Dom queries are repeative, which are not good for performance optimisation .

Your previous comment was misleading, stating caching is not implemented. Also could you please share your logs for the repetitive DOM queries, given the behavior of extension, they should be justified :)

@Preeti9764
Copy link
Contributor

Your previous comment was misleading, stating caching is not implemented. Also could you please share your logs for the repetitive DOM queries, given the behavior of extension, they should be justified :)

I apologize if my comment about caching wasn't clear enough. Let me clarify my observation:
Every time getEditorElements() method is called, it:
Searches the entire DOM tree
Creates new element references
I was talking about caching not implemented in this part. Thanks!

@vedansh-5
Copy link
Contributor Author

Your previous comment was misleading, stating caching is not implemented. Also could you please share your logs for the repetitive DOM queries, given the behavior of extension, they should be justified :)

I apologize if my comment about caching wasn't clear enough. Let me clarify my observation: Every time getEditorElements() method is called, it: Searches the entire DOM tree Creates new element references I was talking about caching not implemented in this part. Thanks!

Appreciate your point, although it has minimal effect on the speed but this might cause memory leaks in some cases. I will push changes for it soon. ☺️

@vedansh-5
Copy link
Contributor Author

Hello @Preeti9764 after the rebase content is not being injected in popup, Could you please take a look what's wrong? Thanks

@vedansh-5 vedansh-5 mentioned this pull request Jun 10, 2025
@vedansh-5
Copy link
Contributor Author

@hpdang
I have resolved the errors in this PR and is ready to be merged with all the functionalities intact. However this PR will need changes when the #83 will be merged. As soon as new UI pr is merged I will start working towards resolving the conflicts for this PR to successfully implement caching and bypass cache into the new UI.

@Preeti9764
Copy link
Contributor

Hello @Preeti9764 after the rebase content is not being injected in popup, Could you please take a look what's wrong? Thanks

Hey , I have checked this ,the issue which i found is every line of scrum is coming twice .
image
this is beacause you may have called a function twice.

@Preeti9764
Copy link
Contributor

Preeti9764 commented Jun 10, 2025

I found that- writeGithubIssuesPrs(),writeGithubPrsReviews() are called twice, which causes this issue firstly in the function processGithubData() and in intervals also, which mostly causes this issue. I have made changes in the scrumHelper.js file that resolve this. Have and look for a reference and edit that file. I have sent you personally.

@vedansh-5
Copy link
Contributor Author

vedansh-5 commented Jun 10, 2025 via email

@Preeti9764 Preeti9764 mentioned this pull request Jun 11, 2025
3 tasks
@vedansh-5
Copy link
Contributor Author

@hpdang @Preeti9764 I have rebased this PR and made changes in the UI accordingly, please take a look whenever you can.
This pr is now ready to be merged. Thanks!

@hpdang
Copy link
Member

hpdang commented Jun 11, 2025

@vedansh-5 Why do you want to put the Refresh Data (bypass cache) on the UI? What kind of behavior you expect from the user?

@vedansh-5
Copy link
Contributor Author

vedansh-5 commented Jun 11, 2025

@vedansh-5 Why do you want to put the Refresh Data (bypass cache) on the UI? What kind of behavior you expect from the user?

I have added the Refresh Data(bypass cache) button on the UI to support edge cases where users suspect outdated or incorrect data.
TTL is of 10 minutes, if a user fetched the data a few mins ago and then pushed new code or reviewed a PR they can trigger a manual fetch of data.

@hpdang
Copy link
Member

hpdang commented Jun 11, 2025

I am not sure if that is a good idea, it is too dominant while is not a core feature. When I clicked on it, it shows Fail to Refresh. And it will raise unnecessary question to a new user. They will ask themselves, what it is for.

@vedansh-5
Copy link
Contributor Author

I am not sure if that is a good idea, it is too dominant while is not a core feature. When I clicked on it, it shows Fail to Refresh. And it will raise unnecessary question to a new user. They will ask themselves, what it is for.

I can remove the button and decrease the TTL to 5 mins. How does it sound to you?

@vedansh-5
Copy link
Contributor Author

I am not sure if that is a good idea, it is too dominant while is not a core feature. When I clicked on it, it shows Fail to Refresh. And it will raise unnecessary question to a new user. They will ask themselves, what it is for.

I can remove the button and decrease the TTL to 5 mins. How does it sound to you?

I see a scoping error, let me fix it, maybe then we can keep it. Thanks.

@vedansh-5
Copy link
Contributor Author

@hpdang
image
I have moved the button down, after generate and copy button, users won't see it firsthand and wonder what's in it for them. Also I have added a note below it.
The fail to refresh issue is solved too. Thanks for pointing this out.

@vedansh-5
Copy link
Contributor Author

I have resolved the conflicts.

@vedansh-5
Copy link
Contributor Author

@hpdang could you please take a look whenever you have some time? Thanks!

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.

Optimize API calls and implement caching
3 participants