Copilot/setup sentry nextjs (#58)

* Revise portfolio: warm brown theme, elegant typography, optimized analytics tracking (#55)

* Initial plan

* Update color theme to warm brown and off-white, add elegant fonts, fix analytics tracking

Co-authored-by: denshooter <44590296+denshooter@users.noreply.github.com>

* Fix 404 page integration with warm theme, update admin console colors, fix font loading

Co-authored-by: denshooter <44590296+denshooter@users.noreply.github.com>

* Address code review feedback: fix navigation, add utils, improve tracking

Co-authored-by: denshooter <44590296+denshooter@users.noreply.github.com>

* Fix accessibility and memory leak issues from code review

Co-authored-by: denshooter <44590296+denshooter@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: denshooter <44590296+denshooter@users.noreply.github.com>

* chore: Code cleanup, add Sentry.io monitoring, and documentation (#56)

* Initial plan

* Remove unused code and clean up console statements

Co-authored-by: denshooter <44590296+denshooter@users.noreply.github.com>

* Remove unused components and fix type issues

Co-authored-by: denshooter <44590296+denshooter@users.noreply.github.com>

* Wrap console.warn in development check

Co-authored-by: denshooter <44590296+denshooter@users.noreply.github.com>

* Integrate Sentry.io monitoring and add text editing documentation

Co-authored-by: denshooter <44590296+denshooter@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: denshooter <44590296+denshooter@users.noreply.github.com>

* Initial plan

* feat: Add Sentry configuration files and example pages

- Add sentry.server.config.ts and sentry.edge.config.ts
- Update instrumentation.ts with onRequestError export
- Update instrumentation-client.ts with onRouterTransitionStart export
- Update global-error.tsx to capture exceptions with Sentry
- Create Sentry example page at app/sentry-example-page/page.tsx
- Create Sentry example API route at app/api/sentry-example-api/route.ts

Co-authored-by: denshooter <44590296+denshooter@users.noreply.github.com>

* feat: Update middleware to allow Sentry example page and fix deprecated API

- Update middleware to exclude /sentry-example-page from locale routing
- Remove deprecated startTransaction API from Sentry example page
- Use consistent DSN configuration with fallback values

Co-authored-by: denshooter <44590296+denshooter@users.noreply.github.com>

* refactor: Improve Sentry configuration with environment-based sampling

- Add comments explaining DSN fallback values
- Use environment-based tracesSampleRate (10% in production, 100% in dev)
- Address code review feedback for production-safe configuration

Co-authored-by: denshooter <44590296+denshooter@users.noreply.github.com>

---------

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
This commit is contained in:
denshooter
2026-01-22 10:05:43 +01:00
committed by GitHub
parent 33f6d47b3e
commit 377631ee50
33 changed files with 3219 additions and 539 deletions

View File

@@ -60,18 +60,10 @@ export const apiCache = {
},
async invalidateAll() {
// Invalidate all project lists
await this.invalidateAllProjectLists();
// Clear all project caches
const keys = await this.getAllProjectKeys();
for (const key of keys) {
await cache.del(key);
}
},
async getAllProjectKeys() {
// This would need to be implemented with Redis SCAN
// For now, we'll use a simple approach
return [];
// Note: Individual project caches are invalidated via invalidateProject()
// when specific projects are updated
}
};

View File

@@ -19,7 +19,6 @@ export async function generateUniqueSlug(opts: {
for (let i = 0; i < maxAttempts; i++) {
// First try the base, then base-2, base-3, ...
candidate = i === 0 ? normalizedBase : `${normalizedBase}-${i + 1}`;
// eslint-disable-next-line no-await-in-loop
const taken = await opts.isTaken(candidate);
if (!taken) return candidate;
}

33
lib/utils.ts Normal file
View File

@@ -0,0 +1,33 @@
/**
* Utility functions for the application
*/
/**
* Debounce helper to prevent duplicate function calls
* @param func - The function to debounce
* @param delay - The delay in milliseconds
* @returns A debounced version of the function with a cleanup method
*/
export const debounce = <T extends (...args: unknown[]) => void>(
func: T,
delay: number
): (((...args: Parameters<T>) => void) & { cancel: () => void }) => {
let timeoutId: NodeJS.Timeout | undefined;
const debounced = (...args: Parameters<T>) => {
if (timeoutId !== undefined) {
clearTimeout(timeoutId);
}
timeoutId = setTimeout(() => func(...args), delay);
};
// Add cancel method to clear pending timeouts
debounced.cancel = () => {
if (timeoutId !== undefined) {
clearTimeout(timeoutId);
timeoutId = undefined;
}
};
return debounced;
};