b470cb21a1
## Summary This PR upgrades Apollo Client from v3.10.0 to v4 and refactors error handling patterns across the codebase to use a new centralized `useSnackBarOnQueryError` hook. ## Key Changes - **Dependency Update**: Upgraded `@apollo/client` from `^3.10.0` to `^3.11.0` in root package.json - **New Hook**: Added `useSnackBarOnQueryError` hook for centralized Apollo query error handling with snack bar notifications - **Error Handling Refactor**: Updated 100+ files to use the new error handling pattern: - Removed direct `ApolloError` imports where no longer needed - Replaced manual error handling logic with `useSnackBarOnQueryError` hook - Simplified error handling in hooks and components across multiple modules - **GraphQL Codegen**: Updated codegen configuration files to work with Apollo Client v3.11.0 - **Type Definitions**: Added TypeScript declaration file for `apollo-upload-client` module - **Test Updates**: Updated test files to reflect new error handling patterns ## Notable Implementation Details - The new `useSnackBarOnQueryError` hook provides a consistent way to handle Apollo query errors with automatic snack bar notifications - Changes span across multiple feature areas: auth, object records, settings, workflows, billing, and more - All changes maintain backward compatibility while improving code maintainability and reducing duplication - Jest configuration updated to work with the new Apollo Client version https://claude.ai/code/session_019WGZ6Rd7sEHuBg9sTrXRqJ --------- Co-authored-by: Claude <noreply@anthropic.com>
52 lines
1.4 KiB
TypeScript
52 lines
1.4 KiB
TypeScript
import { useCallback } from 'react';
|
|
import { v4 } from 'uuid';
|
|
import { useMutation } from '@apollo/client/react';
|
|
import {
|
|
AnalyticsType,
|
|
type MutationTrackAnalyticsArgs,
|
|
TrackAnalyticsDocument,
|
|
} from '~/generated-metadata/graphql';
|
|
|
|
export const ANALYTICS_COOKIE_NAME = 'analyticsCookie';
|
|
export const getSessionId = (): string => {
|
|
const cookie: { [key: string]: string } = {};
|
|
document.cookie.split(';').forEach((el) => {
|
|
const [key, value] = el.split('=');
|
|
cookie[key.trim()] = value;
|
|
});
|
|
return cookie[ANALYTICS_COOKIE_NAME];
|
|
};
|
|
|
|
export const setSessionId = (domain?: string): void => {
|
|
const sessionId = getSessionId() || v4();
|
|
const baseCookie = `${ANALYTICS_COOKIE_NAME}=${sessionId}; Max-Age=1800; path=/; secure`;
|
|
const cookie = domain ? baseCookie + `; domain=${domain}` : baseCookie;
|
|
|
|
document.cookie = cookie;
|
|
};
|
|
|
|
export const useEventTracker = () => {
|
|
const [createEventMutation] = useMutation(TrackAnalyticsDocument);
|
|
|
|
return useCallback(
|
|
(
|
|
type: AnalyticsType,
|
|
payload: Omit<MutationTrackAnalyticsArgs, 'type'>,
|
|
) => {
|
|
createEventMutation({
|
|
variables: {
|
|
type,
|
|
...payload,
|
|
properties: {
|
|
...payload.properties,
|
|
...(type === AnalyticsType['PAGEVIEW']
|
|
? { sessionId: getSessionId() }
|
|
: {}),
|
|
},
|
|
},
|
|
});
|
|
},
|
|
[createEventMutation],
|
|
);
|
|
};
|