import addProjectIcon from "./assets/figma/navigation/add-project.svg"; import bookBookmarkIcon from "./assets/figma/navigation/book-bookmark.svg"; import chopinIcon from "./assets/figma/navigation/chopin.svg"; import collapseIcon from "./assets/figma/navigation/collapse.svg"; import documentActionsIcon from "./assets/figma/navigation/document-actions.svg"; import newDocumentIcon from "./assets/figma/navigation/new-document.svg"; import searchIcon from "./assets/figma/navigation/search.svg"; import sidebarOpenIcon from "./assets/figma/navigation/sidebar-right-3-hide.svg"; import { canEditProject } from "./navigation-model"; import { useState } from "react"; import type * as Api from "./api"; import type { ProjectDocuments } from "./document-actions"; import type { ReactNode, RefObject } from "react"; export const SIDEBAR_MIN = 250; export const SIDEBAR_MAX = 400; export const SIDEBAR_STORAGE_KEY = "chopin:pane:projects"; export function NavigationIcon( { alt = "", className, src }: { alt?: string; className?: string; src: string }, ) { return {alt}; } export function toggleCollapsedProjectIds( ids: ReadonlySet, repositoryId: string, ): Set { let next = new Set(ids); if (next.has(repositoryId)) next.delete(repositoryId); else next.add(repositoryId); return next; } function Project( { creatingProjectIds, currentDocumentId, entry, expanded, onCreateDocument, onLoadMore, onOpenDocument, onRenameDocument, onToggle, }: { creatingProjectIds: ReadonlySet; currentDocumentId?: string; entry: ProjectDocuments; expanded: boolean; onCreateDocument: (project: Api.NavigationProject) => void; onLoadMore: (entry: ProjectDocuments) => void; onOpenDocument: (documentId: string) => void; onRenameDocument: (channel: Api.Channel) => void; onToggle: () => void; }, ) { let { documents, project } = entry; let { channels } = documents; let label = project.repository?.name ?? project.repositoryName; let canEdit = canEditProject(project); let creating = creatingProjectIds.has(project.repositoryId); return (
  • {project.available && canEdit && ( )}
    {expanded && documents.status === "unavailable" && (

    Access unavailable

    )} {expanded && documents.status === "error" && (

    {documents.message}

    )} {expanded && documents.status === "loading" && channels.length === 0 && (

    Loading documents…

    )} {expanded && channels.length > 0 && (
      {channels.map(channel => (
    • {canEdit && ( )}
    • ))}
    )} {expanded && documents.status === "loading" && channels.length > 0 && (

    Loading more…

    )} {expanded && documents.status === "ready" && documents.nextCursor && ( )}
  • ); } export function ProjectSidebar( { accountMenu, canCreateDocument, creatingNewDocument, creatingProjectIds, currentDocumentId, onAccount, onAddProject, onCollapse, onCreateDocument, onLoadMore, onNewDocument, onOpenDocument, onRenameDocument, onSearch, projects, user, }: { accountMenu?: ReactNode; canCreateDocument: boolean; creatingNewDocument: boolean; creatingProjectIds: ReadonlySet; currentDocumentId?: string; onAccount: () => void; onAddProject: () => void; onCollapse: () => void; onCreateDocument: (project: Api.NavigationProject) => void; onLoadMore: (entry: ProjectDocuments) => void; onNewDocument: () => void; onOpenDocument: (documentId: string) => void; onRenameDocument: (channel: Api.Channel) => void; onSearch: () => void; projects: ProjectDocuments[]; user: Api.User; }, ) { let [collapsedProjectIds, setCollapsedProjectIds] = useState>( () => new Set(), ); return ( ); } export function ProjectSidebarExpandButton( { buttonRef, onExpand, }: { buttonRef?: RefObject; onExpand: () => void; }, ) { return ( ); }