From a49008e02dae997171c1b5ab6e1134b31ff4a288 Mon Sep 17 00:00:00 2001 From: Faisal Amir Date: Sat, 6 Sep 2025 21:48:09 +0700 Subject: [PATCH 1/2] enhancement: responsive dialog modals --- web-app/src/containers/LeftPanel.tsx | 109 +++-------- web-app/src/containers/ThreadContent.tsx | 173 ++---------------- web-app/src/containers/ThreadList.tsx | 138 ++------------ web-app/src/containers/ToolCallBlock.tsx | 41 +---- web-app/src/containers/TrustedHostsInput.tsx | 2 +- .../containers/dialogs/AddProviderDialog.tsx | 105 +++++++++++ .../dialogs/ChangeDataFolderLocation.tsx | 2 +- .../dialogs/DeleteAllThreadsDialog.tsx | 103 +++++++++++ .../dialogs/DeleteAssistantDialog.tsx | 78 ++++++++ .../dialogs/DeleteMessageDialog.tsx | 91 +++++++++ .../src/containers/dialogs/DeleteModel.tsx | 50 ++--- .../containers/dialogs/DeleteThreadDialog.tsx | 103 +++++++++++ .../containers/dialogs/EditMessageDialog.tsx | 111 +++++++++++ .../containers/dialogs/FactoryResetDialog.tsx | 80 ++++++++ web-app/src/containers/dialogs/ImageModal.tsx | 40 ++++ .../dialogs/MessageMetadataDialog.tsx | 71 +++++++ .../containers/dialogs/RenameThreadDialog.tsx | 112 ++++++++++++ web-app/src/containers/dialogs/index.ts | 9 + web-app/src/routes/assistant.tsx | 39 +--- web-app/src/routes/settings/general.tsx | 53 +----- .../src/routes/settings/providers/index.tsx | 131 +++++-------- 21 files changed, 1045 insertions(+), 596 deletions(-) create mode 100644 web-app/src/containers/dialogs/AddProviderDialog.tsx create mode 100644 web-app/src/containers/dialogs/DeleteAllThreadsDialog.tsx create mode 100644 web-app/src/containers/dialogs/DeleteAssistantDialog.tsx create mode 100644 web-app/src/containers/dialogs/DeleteMessageDialog.tsx create mode 100644 web-app/src/containers/dialogs/DeleteThreadDialog.tsx create mode 100644 web-app/src/containers/dialogs/EditMessageDialog.tsx create mode 100644 web-app/src/containers/dialogs/FactoryResetDialog.tsx create mode 100644 web-app/src/containers/dialogs/ImageModal.tsx create mode 100644 web-app/src/containers/dialogs/MessageMetadataDialog.tsx create mode 100644 web-app/src/containers/dialogs/RenameThreadDialog.tsx create mode 100644 web-app/src/containers/dialogs/index.ts diff --git a/web-app/src/containers/LeftPanel.tsx b/web-app/src/containers/LeftPanel.tsx index b019d318e..2f4ce9ecc 100644 --- a/web-app/src/containers/LeftPanel.tsx +++ b/web-app/src/containers/LeftPanel.tsx @@ -1,4 +1,4 @@ -import { Link, useNavigate, useRouterState } from '@tanstack/react-router' +import { Link, useRouterState } from '@tanstack/react-router' import { useLeftPanel } from '@/hooks/useLeftPanel' import { cn } from '@/lib/utils' import { @@ -6,7 +6,6 @@ import { IconDots, IconCirclePlusFilled, IconSettingsFilled, - IconTrash, IconStar, IconMessageFilled, IconAppsFilled, @@ -27,17 +26,6 @@ import { useThreads } from '@/hooks/useThreads' import { useTranslation } from '@/i18n/react-i18next-compat' import { useMemo, useState, useEffect, useRef } from 'react' -import { - Dialog, - DialogClose, - DialogContent, - DialogDescription, - DialogFooter, - DialogHeader, - DialogTitle, - DialogTrigger, -} from '@/components/ui/dialog' -import { Button } from '@/components/ui/button' import { toast } from 'sonner' import { DownloadManagement } from '@/containers/DownloadManegement' import { useSmallScreen } from '@/hooks/useMediaQuery' @@ -45,6 +33,7 @@ import { useClickOutside } from '@/hooks/useClickOutside' import { useDownloadStore } from '@/hooks/useDownloadStore' import { PlatformFeatures } from '@/lib/platform/const' import { PlatformFeature } from '@/lib/platform/types' +import { DeleteAllThreadsDialog } from '@/containers/dialogs' const mainMenus = [ { @@ -76,7 +65,6 @@ const mainMenus = [ const LeftPanel = () => { const { open, setLeftPanel } = useLeftPanel() const { t } = useTranslation() - const navigate = useNavigate() const [searchTerm, setSearchTerm] = useState('') const isSmallScreen = useSmallScreen() @@ -362,80 +350,25 @@ const LeftPanel = () => { {t('common:recents')}
- - - - - - - - e.preventDefault()} - > - - {t('common:deleteAll')} - - - - - - {t('common:dialogs.deleteAllThreads.title')} - - - {t( - 'common:dialogs.deleteAllThreads.description' - )} - - - - - - - - - - - - + + + + + + + +
)} diff --git a/web-app/src/containers/ThreadContent.tsx b/web-app/src/containers/ThreadContent.tsx index fc7306142..0316ee764 100644 --- a/web-app/src/containers/ThreadContent.tsx +++ b/web-app/src/containers/ThreadContent.tsx @@ -2,14 +2,7 @@ import { ThreadMessage } from '@janhq/core' import { RenderMarkdown } from './RenderMarkdown' import React, { Fragment, memo, useCallback, useMemo, useState } from 'react' -import { - IconCopy, - IconCopyCheck, - IconRefresh, - IconTrash, - IconPencil, - IconInfoCircle, -} from '@tabler/icons-react' +import { IconCopy, IconCopyCheck, IconRefresh } from '@tabler/icons-react' import { useAppState } from '@/hooks/useAppState' import { cn } from '@/lib/utils' import { useMessages } from '@/hooks/useMessages' @@ -17,16 +10,10 @@ import ThinkingBlock from '@/containers/ThinkingBlock' import ToolCallBlock from '@/containers/ToolCallBlock' import { useChat } from '@/hooks/useChat' import { - Dialog, - DialogClose, - DialogContent, - DialogFooter, - DialogHeader, - DialogTitle, - DialogTrigger, -} from '@/components/ui/dialog' -import { Button } from '@/components/ui/button' -import { Textarea } from '@/components/ui/textarea' + EditMessageDialog, + MessageMetadataDialog, + DeleteMessageDialog, +} from '@/containers/dialogs' import { Tooltip, TooltipContent, @@ -37,8 +24,6 @@ import { AvatarEmoji } from '@/containers/AvatarEmoji' import TokenSpeedIndicator from '@/containers/TokenSpeedIndicator' -import CodeEditor from '@uiw/react-textarea-code-editor' -import '@uiw/react-textarea-code-editor/dist.css' import { useTranslation } from '@/i18n/react-i18next-compat' import { useModelProvider } from '@/hooks/useModelProvider' @@ -76,69 +61,6 @@ const CopyButton = ({ text }: { text: string }) => { ) } -const EditDialog = ({ - message, - setMessage, -}: { - message: string - setMessage: (message: string) => void -}) => { - const { t } = useTranslation() - const [draft, setDraft] = useState(message) - - const handleSave = () => { - if (draft !== message) { - setMessage(draft) - } - } - - return ( - - - - -
- -
-
- -

{t('edit')}

-
-
-
- - - {t('common:dialogs.editMessage.title')} -