olehmell/subsocial-sdk

View on GitHub
packages/api/src/filters/visibility-filter.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { Space, Post } from '@subsocial/definitions/interfaces'
import { Visibility } from './types'

type StructWithHidden = Space | Post

export const isHidden = (struct?: StructWithHidden) => !struct || struct.hidden.valueOf()
export const isVisible = (struct?: StructWithHidden): struct is StructWithHidden => !isHidden(struct)

export const isEmptyContent = (struct?: StructWithHidden) => !struct || struct.content.isNone || struct.content.isEmpty

export const isUnlisted = (struct?: StructWithHidden) => isHidden(struct) || isEmptyContent(struct)
export const isPublic = (struct?: StructWithHidden): struct is StructWithHidden => !isUnlisted(struct)

export function visibilityFilter<T extends StructWithHidden> (structs: T[], filter?: Visibility): T[] {

  switch (filter) {
    case 'onlyVisible': return structs.filter(isVisible)
    case 'onlyHidden': return structs.filter(isHidden)
    case 'onlyPublic': return structs.filter(isPublic)
    case 'onlyUnlisted': return structs.filter(isUnlisted)
    default: return structs
  }

}