mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-04-26 01:06:23 +02:00
refactor: move pure utility functions out of UI components (#1194)
This commit is contained in:
parent
e1e4bb4706
commit
d37417cbe9
10 changed files with 55 additions and 51 deletions
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
import { Search, Unplug } from "lucide-react";
|
import { Search, Unplug } from "lucide-react";
|
||||||
import type { FC } from "react";
|
import type { FC } from "react";
|
||||||
import { getDocumentTypeLabel } from "@/components/documents/DocumentTypeIcon";
|
import { getDocumentTypeLabel } from "@/lib/documents/document-type-labels";
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
import { Spinner } from "@/components/ui/spinner";
|
import { Spinner } from "@/components/ui/spinner";
|
||||||
import { TabsContent } from "@/components/ui/tabs";
|
import { TabsContent } from "@/components/ui/tabs";
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,7 @@ import {
|
||||||
} from "@/components/assistant-ui/inline-mention-editor";
|
} from "@/components/assistant-ui/inline-mention-editor";
|
||||||
import { TooltipIconButton } from "@/components/assistant-ui/tooltip-icon-button";
|
import { TooltipIconButton } from "@/components/assistant-ui/tooltip-icon-button";
|
||||||
import { UserMessage } from "@/components/assistant-ui/user-message";
|
import { UserMessage } from "@/components/assistant-ui/user-message";
|
||||||
import { SLIDEOUT_PANEL_OPENED_EVENT } from "@/components/layout/ui/sidebar/SidebarSlideOutPanel";
|
import { SLIDEOUT_PANEL_OPENED_EVENT } from "@/lib/layout-events";
|
||||||
import {
|
import {
|
||||||
DocumentMentionPicker,
|
DocumentMentionPicker,
|
||||||
type DocumentMentionPickerRef,
|
type DocumentMentionPickerRef,
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ import { Button } from "@/components/ui/button";
|
||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { CommentComposer } from "../comment-composer/comment-composer";
|
import { CommentComposer } from "../comment-composer/comment-composer";
|
||||||
import { CommentActions } from "./comment-actions";
|
import { CommentActions } from "./comment-actions";
|
||||||
|
import { convertRenderedToDisplay } from "@/lib/comments/utils";
|
||||||
import type { CommentItemProps } from "./types";
|
import type { CommentItemProps } from "./types";
|
||||||
|
|
||||||
function getInitials(name: string | null, email: string): string {
|
function getInitials(name: string | null, email: string): string {
|
||||||
|
|
@ -69,10 +70,6 @@ function formatTimestamp(dateString: string): string {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function convertRenderedToDisplay(contentRendered: string): string {
|
|
||||||
// Convert @{DisplayName} format to @DisplayName for editing
|
|
||||||
return contentRendered.replace(/@\{([^}]+)\}/g, "@$1");
|
|
||||||
}
|
|
||||||
|
|
||||||
function renderMentions(content: string): React.ReactNode {
|
function renderMentions(content: string): React.ReactNode {
|
||||||
// Match @{DisplayName} format from backend
|
// Match @{DisplayName} format from backend
|
||||||
|
|
|
||||||
|
|
@ -4,52 +4,12 @@ import type React from "react";
|
||||||
import { useEffect, useRef, useState } from "react";
|
import { useEffect, useRef, useState } from "react";
|
||||||
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
|
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
|
||||||
import { getConnectorIcon } from "@/contracts/enums/connectorIcons";
|
import { getConnectorIcon } from "@/contracts/enums/connectorIcons";
|
||||||
|
import { getDocumentTypeLabel } from "@/lib/documents/document-type-labels";
|
||||||
|
|
||||||
export function getDocumentTypeIcon(type: string, className?: string): React.ReactNode {
|
export function getDocumentTypeIcon(type: string, className?: string): React.ReactNode {
|
||||||
return getConnectorIcon(type, className);
|
return getConnectorIcon(type, className);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getDocumentTypeLabel(type: string): string {
|
|
||||||
const labelMap: Record<string, string> = {
|
|
||||||
EXTENSION: "Extension",
|
|
||||||
CRAWLED_URL: "Web Page",
|
|
||||||
FILE: "File",
|
|
||||||
SLACK_CONNECTOR: "Slack",
|
|
||||||
TEAMS_CONNECTOR: "Microsoft Teams",
|
|
||||||
ONEDRIVE_FILE: "OneDrive",
|
|
||||||
DROPBOX_FILE: "Dropbox",
|
|
||||||
NOTION_CONNECTOR: "Notion",
|
|
||||||
YOUTUBE_VIDEO: "YouTube Video",
|
|
||||||
GITHUB_CONNECTOR: "GitHub",
|
|
||||||
LINEAR_CONNECTOR: "Linear",
|
|
||||||
DISCORD_CONNECTOR: "Discord",
|
|
||||||
JIRA_CONNECTOR: "Jira",
|
|
||||||
CONFLUENCE_CONNECTOR: "Confluence",
|
|
||||||
CLICKUP_CONNECTOR: "ClickUp",
|
|
||||||
GOOGLE_CALENDAR_CONNECTOR: "Google Calendar",
|
|
||||||
GOOGLE_GMAIL_CONNECTOR: "Gmail",
|
|
||||||
GOOGLE_DRIVE_FILE: "Google Drive",
|
|
||||||
AIRTABLE_CONNECTOR: "Airtable",
|
|
||||||
LUMA_CONNECTOR: "Luma",
|
|
||||||
ELASTICSEARCH_CONNECTOR: "Elasticsearch",
|
|
||||||
BOOKSTACK_CONNECTOR: "BookStack",
|
|
||||||
CIRCLEBACK: "Circleback",
|
|
||||||
OBSIDIAN_CONNECTOR: "Obsidian",
|
|
||||||
LOCAL_FOLDER_FILE: "Local Folder",
|
|
||||||
SURFSENSE_DOCS: "SurfSense Docs",
|
|
||||||
NOTE: "Note",
|
|
||||||
COMPOSIO_GOOGLE_DRIVE_CONNECTOR: "Composio Google Drive",
|
|
||||||
COMPOSIO_GMAIL_CONNECTOR: "Composio Gmail",
|
|
||||||
COMPOSIO_GOOGLE_CALENDAR_CONNECTOR: "Composio Google Calendar",
|
|
||||||
};
|
|
||||||
return (
|
|
||||||
labelMap[type] ||
|
|
||||||
type
|
|
||||||
.split("_")
|
|
||||||
.map((word) => word.charAt(0) + word.slice(1).toLowerCase())
|
|
||||||
.join(" ")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function DocumentTypeChip({ type, className }: { type: string; className?: string }) {
|
export function DocumentTypeChip({ type, className }: { type: string; className?: string }) {
|
||||||
const icon = getDocumentTypeIcon(type, "h-4 w-4");
|
const icon = getDocumentTypeIcon(type, "h-4 w-4");
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,8 @@ import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover
|
||||||
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group";
|
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group";
|
||||||
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
|
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
|
||||||
import type { DocumentTypeEnum } from "@/contracts/types/document.types";
|
import type { DocumentTypeEnum } from "@/contracts/types/document.types";
|
||||||
import { getDocumentTypeIcon, getDocumentTypeLabel } from "./DocumentTypeIcon";
|
import { getDocumentTypeIcon } from "./DocumentTypeIcon";
|
||||||
|
import { getDocumentTypeLabel } from "@/lib/documents/document-type-labels";
|
||||||
|
|
||||||
export function DocumentsFilters({
|
export function DocumentsFilters({
|
||||||
typeCounts: typeCountsRecord,
|
typeCounts: typeCountsRecord,
|
||||||
|
|
|
||||||
|
|
@ -22,8 +22,8 @@ import { useParams, useRouter } from "next/navigation";
|
||||||
import { useTranslations } from "next-intl";
|
import { useTranslations } from "next-intl";
|
||||||
import { useCallback, useDeferredValue, useEffect, useMemo, useRef, useState } from "react";
|
import { useCallback, useDeferredValue, useEffect, useMemo, useRef, useState } from "react";
|
||||||
import { setTargetCommentIdAtom } from "@/atoms/chat/current-thread.atom";
|
import { setTargetCommentIdAtom } from "@/atoms/chat/current-thread.atom";
|
||||||
import { convertRenderedToDisplay } from "@/components/chat-comments/comment-item/comment-item";
|
import { convertRenderedToDisplay } from "@/lib/comments/utils";
|
||||||
import { getDocumentTypeLabel } from "@/components/documents/DocumentTypeIcon";
|
import { getDocumentTypeLabel } from "@/lib/documents/document-type-labels";
|
||||||
import { Tabs, TabsList, TabsTrigger } from "@/components/ui/animated-tabs";
|
import { Tabs, TabsList, TabsTrigger } from "@/components/ui/animated-tabs";
|
||||||
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
|
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@
|
||||||
import { AnimatePresence, motion } from "motion/react";
|
import { AnimatePresence, motion } from "motion/react";
|
||||||
import { useCallback, useEffect } from "react";
|
import { useCallback, useEffect } from "react";
|
||||||
import { useMediaQuery } from "@/hooks/use-media-query";
|
import { useMediaQuery } from "@/hooks/use-media-query";
|
||||||
|
import { SLIDEOUT_PANEL_OPENED_EVENT } from "@/lib/layout-events";
|
||||||
|
|
||||||
export const SLIDEOUT_PANEL_OPENED_EVENT = "slideout-panel-opened";
|
|
||||||
|
|
||||||
interface SidebarSlideOutPanelProps {
|
interface SidebarSlideOutPanelProps {
|
||||||
open: boolean;
|
open: boolean;
|
||||||
|
|
|
||||||
4
surfsense_web/lib/comments/utils.ts
Normal file
4
surfsense_web/lib/comments/utils.ts
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
export function convertRenderedToDisplay(contentRendered: string): string {
|
||||||
|
// Convert @{DisplayName} format to @DisplayName for editing
|
||||||
|
return contentRendered.replace(/@\{([^}]+)\}/g, "@$1");
|
||||||
|
}
|
||||||
41
surfsense_web/lib/documents/document-type-labels.ts
Normal file
41
surfsense_web/lib/documents/document-type-labels.ts
Normal file
|
|
@ -0,0 +1,41 @@
|
||||||
|
export function getDocumentTypeLabel(type: string): string {
|
||||||
|
const labelMap: Record<string, string> = {
|
||||||
|
EXTENSION: "Extension",
|
||||||
|
CRAWLED_URL: "Web Page",
|
||||||
|
FILE: "File",
|
||||||
|
SLACK_CONNECTOR: "Slack",
|
||||||
|
TEAMS_CONNECTOR: "Microsoft Teams",
|
||||||
|
ONEDRIVE_FILE: "OneDrive",
|
||||||
|
DROPBOX_FILE: "Dropbox",
|
||||||
|
NOTION_CONNECTOR: "Notion",
|
||||||
|
YOUTUBE_VIDEO: "YouTube Video",
|
||||||
|
GITHUB_CONNECTOR: "GitHub",
|
||||||
|
LINEAR_CONNECTOR: "Linear",
|
||||||
|
DISCORD_CONNECTOR: "Discord",
|
||||||
|
JIRA_CONNECTOR: "Jira",
|
||||||
|
CONFLUENCE_CONNECTOR: "Confluence",
|
||||||
|
CLICKUP_CONNECTOR: "ClickUp",
|
||||||
|
GOOGLE_CALENDAR_CONNECTOR: "Google Calendar",
|
||||||
|
GOOGLE_GMAIL_CONNECTOR: "Gmail",
|
||||||
|
GOOGLE_DRIVE_FILE: "Google Drive",
|
||||||
|
AIRTABLE_CONNECTOR: "Airtable",
|
||||||
|
LUMA_CONNECTOR: "Luma",
|
||||||
|
ELASTICSEARCH_CONNECTOR: "Elasticsearch",
|
||||||
|
BOOKSTACK_CONNECTOR: "BookStack",
|
||||||
|
CIRCLEBACK: "Circleback",
|
||||||
|
OBSIDIAN_CONNECTOR: "Obsidian",
|
||||||
|
LOCAL_FOLDER_FILE: "Local Folder",
|
||||||
|
SURFSENSE_DOCS: "SurfSense Docs",
|
||||||
|
NOTE: "Note",
|
||||||
|
COMPOSIO_GOOGLE_DRIVE_CONNECTOR: "Composio Google Drive",
|
||||||
|
COMPOSIO_GMAIL_CONNECTOR: "Composio Gmail",
|
||||||
|
COMPOSIO_GOOGLE_CALENDAR_CONNECTOR: "Composio Google Calendar",
|
||||||
|
};
|
||||||
|
return (
|
||||||
|
labelMap[type] ||
|
||||||
|
type
|
||||||
|
.split("_")
|
||||||
|
.map((word) => word.charAt(0) + word.slice(1).toLowerCase())
|
||||||
|
.join(" ")
|
||||||
|
);
|
||||||
|
}
|
||||||
1
surfsense_web/lib/layout-events.ts
Normal file
1
surfsense_web/lib/layout-events.ts
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
export const SLIDEOUT_PANEL_OPENED_EVENT = "slideout-panel-opened";
|
||||||
Loading…
Add table
Add a link
Reference in a new issue