All files / components/ContentfulRichText types.ts

0% Statements 0/95
0% Branches 0/1
0% Functions 0/1
0% Lines 0/95

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96                                                                                                                                                                                               
import type { Asset, Entry, ImageWrapper, Contact } from "$lib/services/server/contentful/schema";
import type { PageMetadataMap } from "$lib/loadPageMetadataMap";
import type { Document } from "@contentful/rich-text-types";

type AssetWithMaybeBlurhash = Asset & {
  blurhash?: string | null | undefined;
};

export const renderableAssetBlockRequiredKeys = [
  "url",
  "contentType",
] as const satisfies readonly (keyof AssetWithMaybeBlurhash)[];

type RenderableAssetBlockRequiredKey = (typeof renderableAssetBlockRequiredKeys)[number];

export const renderableAssetBlockOptionalKeys = [
  "title",
  "description",
  "width",
  "height",
  "blurhash",
] as const satisfies readonly (keyof AssetWithMaybeBlurhash)[];

type RenderableAssetBlockOptionalKey = (typeof renderableAssetBlockOptionalKeys)[number];

export const renderableEntryBlockImageWrapperKeys = [
  "internalTitle",
  "altText",
  "linkedImage",
] as const satisfies readonly (keyof ImageWrapper)[];

type RenderableEntryBlockImageWrapperKey = (typeof renderableEntryBlockImageWrapperKeys)[number];

export const renderableEntryBlockContactKeys = [
  "entityName",
  "phoneExt",
  "email",
] as const satisfies readonly (keyof Contact)[];

type RenderableEntryBlockContactKey = (typeof renderableEntryBlockContactKeys)[number];

export type RenderableAssetBlock = { sys: Pick<AssetWithMaybeBlurhash["sys"], "id"> } & Pick<
  AssetWithMaybeBlurhash,
  RenderableAssetBlockRequiredKey
> &
  Partial<Pick<AssetWithMaybeBlurhash, RenderableAssetBlockOptionalKey>>;

type RenderableImageWrapper = Pick<
  ImageWrapper,
  Exclude<RenderableEntryBlockImageWrapperKey, "linkedImage">
> & {
  linkedImage?: RenderableAssetBlock | null | undefined;
};

export type RenderableEntryBlock = { sys: Pick<Entry["sys"], "id">; __typename: string } & Partial<
  Pick<RenderableImageWrapper, RenderableEntryBlockImageWrapperKey> &
    Pick<Contact, RenderableEntryBlockContactKey> & {
      callToActionDestination?: { json: Document; links: Links } | null;
    }
>;

export type RenderableAssetHyperlink = RenderableAssetBlock;
export type RenderableEntryHyperlink = RenderableEntryBlock;

export type Links = {
  assets?: {
    block?: (RenderableAssetBlock | null)[];
    hyperlink?: (RenderableAssetHyperlink | null)[];
  };
  entries?: {
    block?: (RenderableEntryBlock | null)[];
    hyperlink?: (RenderableEntryHyperlink | null)[];
  };
};

export type LinksMap<
  T extends
    | RenderableAssetBlock
    | RenderableAssetHyperlink
    | RenderableEntryBlock
    | RenderableEntryHyperlink,
> = Map<string, T>;

export type LinksContext = {
  pageMetadataMap: PageMetadataMap;
  links: Links;
  linksAssetsMaps: {
    block: LinksMap<RenderableAssetBlock>;
    hyperlink: LinksMap<RenderableAssetHyperlink>;
  };
  linksEntriesMaps: {
    block: LinksMap<RenderableEntryBlock>;
    hyperlink: LinksMap<RenderableEntryHyperlink>;
  };
};