103 lines
2.3 KiB
TypeScript
103 lines
2.3 KiB
TypeScript
import { gql } from 'graphql-request'
|
|
import useSWR from 'swr'
|
|
import { publicGqlFetcher } from '../networkHelpers'
|
|
|
|
export type DigestChannel = 'push' | 'email' | 'library'
|
|
|
|
export type UserPersonalizationResult = {
|
|
mutate: () => void
|
|
isLoading: boolean
|
|
userPersonalization?: UserPersonalization
|
|
}
|
|
|
|
type Response = {
|
|
getUserPersonalization?: Result
|
|
}
|
|
|
|
type Result = {
|
|
userPersonalization?: UserPersonalization
|
|
errorCodes?: string[]
|
|
}
|
|
|
|
export type UserPersonalization = {
|
|
digestConfig?: DigestConfig
|
|
}
|
|
export type DigestConfig = {
|
|
channels?: DigestChannel[]
|
|
}
|
|
|
|
export function isDigestConfig(obj: any): obj is DigestConfig {
|
|
const validChannels = ['push', 'email', 'library'] as const
|
|
|
|
function isValidChannel(channel: any): channel is DigestChannel {
|
|
return validChannels.includes(channel)
|
|
}
|
|
|
|
if (typeof obj !== 'object' || obj === null) {
|
|
return false
|
|
}
|
|
|
|
if ('channels' in obj) {
|
|
const { channels } = obj
|
|
if (!Array.isArray(channels)) {
|
|
return false
|
|
}
|
|
for (const channel of channels) {
|
|
if (!isValidChannel(channel)) {
|
|
return false
|
|
}
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
export function useGetUserPersonalization(): UserPersonalizationResult {
|
|
const query = gql`
|
|
query UserPersonalization {
|
|
getUserPersonalization {
|
|
... on GetUserPersonalizationSuccess {
|
|
userPersonalization {
|
|
digestConfig
|
|
}
|
|
}
|
|
... on GetUserPersonalizationError {
|
|
errorCodes
|
|
}
|
|
}
|
|
}
|
|
`
|
|
|
|
const { data, error, mutate } = useSWR(query, publicGqlFetcher)
|
|
const response = data as Response | undefined
|
|
console.log(
|
|
'useGetUserPersonalization:data: ',
|
|
response?.getUserPersonalization?.userPersonalization,
|
|
'data',
|
|
data
|
|
)
|
|
|
|
if (
|
|
!response ||
|
|
!response.getUserPersonalization ||
|
|
response.getUserPersonalization?.errorCodes ||
|
|
!response.getUserPersonalization?.userPersonalization ||
|
|
!isDigestConfig(
|
|
response.getUserPersonalization?.userPersonalization.digestConfig
|
|
)
|
|
) {
|
|
console.log('invalid digest config')
|
|
return {
|
|
mutate,
|
|
isLoading: false,
|
|
userPersonalization: undefined,
|
|
}
|
|
}
|
|
|
|
return {
|
|
mutate,
|
|
userPersonalization: response.getUserPersonalization?.userPersonalization,
|
|
isLoading: !error && !data,
|
|
}
|
|
}
|