packages feed

espial-0.0.26: frontend/src/types.ts

export type BookmarkId = number;
export type TagId = number;

export type Bookmark = {
  url: string;
  title: string;
  description: string;
  tags: string;
  private: boolean;
  toread: boolean;
  bid: BookmarkId;
  slug: string;
  selected: boolean;
  time: string;
  archiveUrl: string | null;
};

export type NoteId = number;
export type NoteSlug = string;

export type Note = {
  id: NoteId;
  slug: NoteSlug;
  title: string;
  text: string;
  length: number;
  isMarkdown: boolean;
  shared: boolean;
  created: string;
  updated: string;
};

export type AccountSettings = {
  archiveDefault: boolean;
  privateDefault: boolean;
  suggestTags: boolean;
  privacyLock: boolean;
};

export type TagCloudMode = {
  mode: string;
  value: unknown;
  expanded: boolean;
};

export type TagCloud = Record<string, number>;

export type TSuggestion = {
  term: string;
  count: number;
};

export type TagSuggestionRequest = {
  query: string;
  currentTags: string[];
};

export type TagSuggestionResponse = {
  suggestions: TSuggestion[];
};

export type TagCloudModeF =
  | { kind: 'top'; expanded: boolean; value: number }
  | { kind: 'lowerBound'; expanded: boolean; value: number }
  | { kind: 'related'; expanded: boolean; value: string[] }
  | { kind: 'none' };

export function tagCloudModeToF(mode: TagCloudMode): TagCloudModeF {
  switch (mode.mode) {
    case 'top': {
      const n = typeof mode.value === 'number' ? mode.value : Number(mode.value);
      return Number.isFinite(n)
        ? { kind: 'top', expanded: mode.expanded, value: n }
        : { kind: 'none' };
    }
    case 'lowerBound': {
      const n = typeof mode.value === 'number' ? mode.value : Number(mode.value);
      return Number.isFinite(n)
        ? { kind: 'lowerBound', expanded: mode.expanded, value: n }
        : { kind: 'none' };
    }
    case 'related': {
      const s = typeof mode.value === 'string' ? mode.value : '';
      const tags = s ? s.split(' ') : [];
      return { kind: 'related', expanded: mode.expanded, value: tags };
    }
    default:
      return { kind: 'none' };
  }
}

export function tagCloudModeFromF(mode: TagCloudModeF): TagCloudMode {
  switch (mode.kind) {
    case 'top':
      return { mode: 'top', value: mode.value, expanded: mode.expanded };
    case 'lowerBound':
      return { mode: 'lowerBound', value: mode.value, expanded: mode.expanded };
    case 'related':
      return { mode: 'related', value: mode.value.join(' '), expanded: mode.expanded };
    case 'none':
      return { mode: 'none', value: '', expanded: false };
  }
}

export function isExpanded(mode: TagCloudModeF): boolean {
  return mode.kind === 'none' ? false : mode.expanded;
}

export function isRelated(mode: TagCloudModeF): boolean {
  return mode.kind === 'related';
}

export function setExpanded(mode: TagCloudModeF, expanded: boolean): TagCloudModeF {
  return mode.kind === 'none' ? mode : { ...mode, expanded };
}

export function showMode(mode: TagCloudModeF): string {
  switch (mode.kind) {
    case 'top':
      return 'top';
    case 'lowerBound':
      return 'lowerBound';
    case 'related':
      return 'related';
    case 'none':
      return '';
  }
}