# Notifications screen - Mon+Tues 12th-13th Sept, 2020 On Monday, I completed the notifications preferences page where users can enable or disable push notifications. I abstracted each `Preference` into its own component taking the following props: ```typescript= interface PreferenceProps { label: string value: boolean onChange: (value: boolean) => void loading: boolean variant?: 'parent' | 'child' } ``` On Tuesday, I stated creating an "Alert" page that will show a notification feed. In another project, I upgraded Apollo Client to v3. As we have so many existing cache update functions, resolvers, etc written for Apollo Client 2, it is important to maintain backwards compatibility. Apollo's `writeData` type has been removed in 3, so I tried to use [decleration merging](https://www.typescriptlang.org/docs/handbook/declaration-merging.html) to augment the `@apollo/client` types. This is something I've previously done with C+, but it was not so smooth with this project, perhaps because this is part of a monorepo? ```typescript= import { Cache, DataProxy, DocumentNode, Reference, StoreObject, Transaction } from '@apollo/client' declare module '@apollo/client' { export declare abstract class ApolloCache<TSerialized> implements DataProxy { abstract read<T, TVariables = any>(query: Cache.ReadOptions<TVariables>): T | null abstract write<TResult = any, TVariables = any>( write: Cache.WriteOptions<TResult, TVariables> ): Reference | undefined abstract diff<T>(query: Cache.DiffOptions): Cache.DiffResult<T> abstract watch(watch: Cache.WatchOptions): () => void abstract reset(): Promise<void> abstract evict(options: Cache.EvictOptions): boolean abstract restore(serializedState: TSerialized): ApolloCache<TSerialized> abstract extract(optimistic?: boolean): TSerialized abstract removeOptimistic(id: string): void abstract performTransaction(transaction: Transaction<TSerialized>, optimisticId?: string | null): void recordOptimisticTransaction(transaction: Transaction<TSerialized>, optimisticId: string): void transformDocument(document: DocumentNode): DocumentNode identify(object: StoreObject | Reference): string | undefined gc(): string[] modify(options: Cache.ModifyOptions): boolean transformForLink(document: DocumentNode): DocumentNode readQuery<QueryType, TVariables = any>( options: DataProxy.Query<TVariables>, optimistic?: boolean ): QueryType | null private getFragmentDoc readFragment<FragmentType, TVariables = any>( options: DataProxy.Fragment<TVariables>, optimistic?: boolean ): FragmentType | null writeQuery<TData = any, TVariables = any>( options: Cache.WriteQueryOptions<TData, TVariables> ): Reference | undefined writeFragment<TData = any, TVariables = any>( options: Cache.WriteFragmentOptions<TData, TVariables> ): Reference | undefined /** done to maintain backwards compatibility with Apollo Client 2. DO NOT USE writeData */ writeData: (args: any) => void } } ``` ###### tags: `programmingjournal` `2020` `C+` `apolloclient` `declerationmerging` `notifications`