packages feed

espial-0.0.26: frontend/src/index.tsx

import { createRoot } from 'react-dom/client';

import { logout } from './api';
import { AccountSettingsView } from './components/AccountSettings';
import { AddForm } from './components/AddForm';
import { BList } from './components/BList';
import { NList } from './components/NList';
import { NNote } from './components/NNote';
import { TagCloud } from './components/TagCloud';
import type { AccountSettings, Bookmark, Note, TagCloudMode } from './types';
import { tagCloudModeToF } from './types';

function selectEl(selector: string): Element | null {
  return document.querySelector(selector);
}

function viewRendered(): void {
  const el = document.querySelector('#content');
  if (el) el.setAttribute('view-rendered', '');
}

export const logoutE = (e: Event) => () => {
  e.preventDefault();
  void logout();
};

export const renderBookmarks = (renderElSelector: string) => (bmarks: Bookmark[]) => () => {
  const el = selectEl(renderElSelector);
  if (!el) return;
  createRoot(el).render(<BList initial={bmarks} />);
  viewRendered();
};

export const renderTagCloud = (renderElSelector: string) => (tagCloudMode: TagCloudMode) => () => {
  const el = selectEl(renderElSelector);
  if (!el) return;
  createRoot(el).render(<TagCloud initialMode={tagCloudModeToF(tagCloudMode)} />);
};

export const renderAddForm = (renderElSelector: string) => (bmark: Bookmark) => () => {
  const el = selectEl(renderElSelector);
  if (!el) return;
  createRoot(el).render(<AddForm initial={bmark} />);
  viewRendered();
};

export const renderNotes = (renderElSelector: string) => (notes: Note[]) => () => {
  const el = selectEl(renderElSelector);
  if (!el) return;
  createRoot(el).render(<NList initial={notes} />);
  viewRendered();
};

export const renderNote = (renderElSelector: string) => (note: Note) => () => {
  const el = selectEl(renderElSelector);
  if (!el) return;
  createRoot(el).render(<NNote initial={note} />);
  viewRendered();
};

export const renderAccountSettings =
  (renderElSelector: string) => (accountSettings: AccountSettings) => () => {
    const el = selectEl(renderElSelector);
    if (!el) return;
    createRoot(el).render(<AccountSettingsView initial={accountSettings} />);
    viewRendered();
  };