feat: auth & admin
This commit is contained in:
@@ -15,13 +15,13 @@ Use `requestIdleCallback()` to schedule non-critical work during browser idle pe
|
||||
|
||||
```typescript
|
||||
function handleSearch(query: string) {
|
||||
const results = searchItems(query)
|
||||
setResults(results)
|
||||
const results = searchItems(query);
|
||||
setResults(results);
|
||||
|
||||
// These block the main thread immediately
|
||||
analytics.track('search', { query })
|
||||
saveToRecentSearches(query)
|
||||
prefetchTopResults(results.slice(0, 3))
|
||||
analytics.track('search', { query });
|
||||
saveToRecentSearches(query);
|
||||
prefetchTopResults(results.slice(0, 3));
|
||||
}
|
||||
```
|
||||
|
||||
@@ -29,21 +29,21 @@ function handleSearch(query: string) {
|
||||
|
||||
```typescript
|
||||
function handleSearch(query: string) {
|
||||
const results = searchItems(query)
|
||||
setResults(results)
|
||||
const results = searchItems(query);
|
||||
setResults(results);
|
||||
|
||||
// Defer non-critical work to idle periods
|
||||
requestIdleCallback(() => {
|
||||
analytics.track('search', { query })
|
||||
})
|
||||
analytics.track('search', { query });
|
||||
});
|
||||
|
||||
requestIdleCallback(() => {
|
||||
saveToRecentSearches(query)
|
||||
})
|
||||
saveToRecentSearches(query);
|
||||
});
|
||||
|
||||
requestIdleCallback(() => {
|
||||
prefetchTopResults(results.slice(0, 3))
|
||||
})
|
||||
prefetchTopResults(results.slice(0, 3));
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
@@ -53,41 +53,42 @@ function handleSearch(query: string) {
|
||||
// Ensure analytics fires within 2 seconds even if browser stays busy
|
||||
requestIdleCallback(
|
||||
() => analytics.track('page_view', { path: location.pathname }),
|
||||
{ timeout: 2000 }
|
||||
)
|
||||
{ timeout: 2000 },
|
||||
);
|
||||
```
|
||||
|
||||
**Chunking large tasks:**
|
||||
|
||||
```typescript
|
||||
function processLargeDataset(items: Item[]) {
|
||||
let index = 0
|
||||
let index = 0;
|
||||
|
||||
function processChunk(deadline: IdleDeadline) {
|
||||
// Process items while we have idle time (aim for <50ms chunks)
|
||||
while (index < items.length && deadline.timeRemaining() > 0) {
|
||||
processItem(items[index])
|
||||
index++
|
||||
processItem(items[index]);
|
||||
index++;
|
||||
}
|
||||
|
||||
// Schedule next chunk if more items remain
|
||||
if (index < items.length) {
|
||||
requestIdleCallback(processChunk)
|
||||
requestIdleCallback(processChunk);
|
||||
}
|
||||
}
|
||||
|
||||
requestIdleCallback(processChunk)
|
||||
requestIdleCallback(processChunk);
|
||||
}
|
||||
```
|
||||
|
||||
**With fallback for unsupported browsers:**
|
||||
|
||||
```typescript
|
||||
const scheduleIdleWork = window.requestIdleCallback ?? ((cb: () => void) => setTimeout(cb, 1))
|
||||
const scheduleIdleWork =
|
||||
window.requestIdleCallback ?? ((cb: () => void) => setTimeout(cb, 1));
|
||||
|
||||
scheduleIdleWork(() => {
|
||||
// Non-critical work
|
||||
})
|
||||
});
|
||||
```
|
||||
|
||||
**When to use:**
|
||||
|
||||
Reference in New Issue
Block a user