Skip to content

Commit 8ec510c

Browse files
authored
Merge pull request #662 from n4ze3m/next
v1.5.23
2 parents efe7835 + abaa160 commit 8ec510c

30 files changed

+685
-171
lines changed

bun.lockb

8 Bytes
Binary file not shown.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
"mermaid": "^11.4.1",
5555
"ml-distance": "^4.0.1",
5656
"openai": "^4.95.1",
57+
"pa-tesseract.js": "^5.1.1",
5758
"pdfjs-dist": "4.0.379",
5859
"property-information": "^6.4.1",
5960
"pubsub-js": "^1.9.4",
@@ -69,7 +70,6 @@
6970
"rehype-mathjax": "4.0.3",
7071
"remark-gfm": "3.0.1",
7172
"remark-math": "5.1.1",
72-
"tesseract.js": "^5.1.1",
7373
"turndown": "^7.1.3",
7474
"unist-util-visit": "^5.0.0",
7575
"yt-transcript": "^0.0.2",

src/assets/locale/en/settings.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@
6565
},
6666
"pasteLargeTextAsFile": {
6767
"label": "Paste Large Text as File"
68+
},
69+
"ocrLanguage": {
70+
"label": "Default OCR Language",
71+
"placeholder": "Select an OCR language"
6872
}
6973
},
7074
"sidepanelRag": {

src/components/Common/ModelSelect.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@ import { fetchChatModels } from "@/services/ollama"
77
import { useMessage } from "@/hooks/useMessage"
88
import { ProviderIcons } from "./ProviderIcon"
99

10-
export const ModelSelect: React.FC = () => {
10+
type Props = {
11+
iconClassName?: string
12+
}
13+
14+
export const ModelSelect: React.FC<Props> = ({iconClassName = "size-5"}) => {
1115
const { t } = useTranslation("common")
1216
const { setSelectedModel, selectedModel } = useMessage()
1317
const { data } = useQuery({
@@ -60,7 +64,7 @@ export const ModelSelect: React.FC = () => {
6064
trigger={["click"]}>
6165
<Tooltip title={t("selectAModel")}>
6266
<button type="button" className="dark:text-gray-300">
63-
<LucideBrain className="h-5 w-5" />
67+
<LucideBrain className={iconClassName} />
6468
</button>
6569
</Tooltip>
6670
</Dropdown>

src/components/Common/Playground/Message.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ type Props = {
5959
documents?: ChatDocuments
6060
actionInfo?: string | null
6161
onNewBranch?: () => void
62+
temporaryChat?: boolean
6263
}
6364

6465
export const PlaygroundMessage = (props: Props) => {
@@ -411,7 +412,7 @@ export const PlaygroundMessage = (props: Props) => {
411412
</Tooltip>
412413
)}
413414

414-
{props?.onNewBranch && (
415+
{props?.onNewBranch && !props?.temporaryChat && (
415416
<Tooltip title={t("newBranch")}>
416417
<button
417418
aria-label={t("newBranch")}

src/components/Common/PromptSelect.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ type Props = {
1010
setSelectedQuickPrompt: (prompt: string | undefined) => void
1111
selectedSystemPrompt: string | undefined
1212
className?: string
13+
iconClassName?: string
1314
}
1415

1516
export const PromptSelect: React.FC<Props> = ({
1617
setSelectedQuickPrompt,
1718
setSelectedSystemPrompt,
1819
selectedSystemPrompt,
19-
className = "dark:text-gray-300"
20+
className = "dark:text-gray-300",
21+
iconClassName = "size-5"
2022
}) => {
2123
const { t } = useTranslation("option")
2224

@@ -87,7 +89,7 @@ export const PromptSelect: React.FC<Props> = ({
8789
trigger={["click"]}>
8890
<Tooltip title={t("selectAPrompt")}>
8991
<button type="button" className={className}>
90-
<BookIcon className="h-5 w-5" />
92+
<BookIcon className={iconClassName} />
9193
</button>
9294
</Tooltip>
9395
</Dropdown>

src/components/Common/Settings/CurrentChatModelSettings.tsx

Lines changed: 54 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,33 +12,38 @@ import {
1212
Input,
1313
InputNumber,
1414
Modal,
15+
Select,
1516
Skeleton,
1617
Switch
1718
} from "antd"
1819
import React, { useCallback } from "react"
1920
import { useTranslation } from "react-i18next"
2021
import { SaveButton } from "../SaveButton"
22+
import { getOCRLanguage } from "@/services/ocr"
23+
import { ocrLanguages } from "@/data/ocr-language"
2124

2225
type Props = {
2326
open: boolean
2427
setOpen: (open: boolean) => void
2528
useDrawer?: boolean
29+
isOCREnabled?: boolean
2630
}
2731

2832
export const CurrentChatModelSettings = ({
2933
open,
3034
setOpen,
31-
useDrawer
35+
useDrawer,
36+
isOCREnabled
3237
}: Props) => {
3338
const { t } = useTranslation("common")
3439
const [form] = Form.useForm()
3540
const cUserSettings = useStoreChatModelSettings()
36-
const {
37-
selectedSystemPrompt,
38-
uploadedFiles,
39-
removeUploadedFile,
41+
const {
42+
selectedSystemPrompt,
43+
uploadedFiles,
44+
removeUploadedFile,
4045
fileRetrievalEnabled,
41-
setFileRetrievalEnabled
46+
setFileRetrievalEnabled
4247
} = useMessageOption()
4348

4449
const savePrompt = useCallback(
@@ -51,7 +56,7 @@ export const CurrentChatModelSettings = ({
5156
const saveSettings = useCallback(
5257
(values: any) => {
5358
Object.entries(values).forEach(([key, value]) => {
54-
if (key !== "systemPrompt") {
59+
if (key !== "systemPrompt" && key !== "ocrLanguage") {
5560
cUserSettings.setX(key, value)
5661
}
5762
})
@@ -64,6 +69,11 @@ export const CurrentChatModelSettings = ({
6469
queryFn: async () => {
6570
const data = await getAllModelSettings()
6671

72+
const ocrLang = await getOCRLanguage()
73+
74+
if (isOCREnabled) {
75+
cUserSettings.setOcrLanguage(ocrLang)
76+
}
6777
let tempSystemPrompt = ""
6878

6979
// i hate this method but i need this feature so badly that i need to do this
@@ -128,6 +138,33 @@ export const CurrentChatModelSettings = ({
128138
<Divider />
129139
</>
130140
)}
141+
142+
{isOCREnabled && (
143+
<div className="flex flex-col space-y-2 mb-3">
144+
<span className="text-gray-700 dark:text-neutral-50">
145+
OCR Language
146+
</span>
147+
148+
<Select
149+
showSearch
150+
style={{ width: "100%" }}
151+
options={ocrLanguages}
152+
value={cUserSettings.ocrLanguage}
153+
filterOption={(input, option) =>
154+
option!.label.toLowerCase().indexOf(input.toLowerCase()) >=
155+
0 ||
156+
option!.value.toLowerCase().indexOf(input.toLowerCase()) >=
157+
0
158+
}
159+
onChange={(value) => {
160+
cUserSettings.setOcrLanguage(value)
161+
}}
162+
/>
163+
<Divider />
164+
165+
</div>
166+
)}
167+
131168
<Form.Item
132169
name="keepAlive"
133170
help={t("modelSettings.form.keepAlive.help")}
@@ -214,10 +251,16 @@ export const CurrentChatModelSettings = ({
214251
<span>{(file.size / 1024).toFixed(1)} KB</span>
215252
{fileRetrievalEnabled && (
216253
<span className="flex items-center gap-1">
217-
<span className={`inline-block w-2 h-2 rounded-full ${
218-
file.processed ? 'bg-green-500' : 'bg-yellow-500'
219-
}`} />
220-
{file.processed ? 'Processed' : 'Processing...'}
254+
<span
255+
className={`inline-block w-2 h-2 rounded-full ${
256+
file.processed
257+
? "bg-green-500"
258+
: "bg-yellow-500"
259+
}`}
260+
/>
261+
{file.processed
262+
? "Processed"
263+
: "Processing..."}
221264
</span>
222265
)}
223266
</div>

src/components/Layouts/Header.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export const Header: React.FC<Props> = ({
5959
queryKey: ["fetchModel"],
6060
queryFn: () => fetchChatModels({ returnEmpty: true }),
6161
refetchIntervalInBackground: false,
62-
staleTime: 1000 * 60 *1,
62+
staleTime: 1000 * 60 * 1
6363
})
6464

6565
const { data: prompts, isLoading: isPromptLoading } = useQuery({
@@ -90,9 +90,8 @@ export const Header: React.FC<Props> = ({
9090

9191
return (
9292
<div
93-
className={`absolute top-0 z-10 flex h-14 w-full flex-row items-center justify-center p-3 overflow-x-auto lg:overflow-x-visible bg-gray-50 border-b dark:bg-[#171717] dark:border-gray-600 ${
94-
temporaryChat && "!bg-gray-200 dark:!bg-black"
95-
}`}>
93+
data-istemporary-chat={temporaryChat}
94+
className={`absolute top-0 z-10 flex h-14 w-full flex-row items-center justify-center p-3 overflow-x-auto lg:overflow-x-visible bg-gray-50 border-b dark:bg-[#171717] dark:border-gray-600 data-[istemporary-chat='true']:bg-gray-200 data-[istemporary-chat='true']:dark:bg-black`}>
9695
<div className="flex gap-2 items-center">
9796
{pathname !== "/" && (
9897
<div>

src/components/Layouts/Layout.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ export default function OptionLayout({
3333
setSelectedModel,
3434
temporaryChat,
3535
setSelectedSystemPrompt,
36-
setContextFiles
36+
setContextFiles,
37+
useOCR
3738
} = useMessageOption()
3839
const queryClient = useQueryClient()
3940
const { setSystemPrompt } = useStoreChatModelSettings()
@@ -115,6 +116,7 @@ export default function OptionLayout({
115116
open={openModelSettings}
116117
setOpen={setOpenModelSettings}
117118
useDrawer
119+
isOCREnabled={useOCR}
118120
/>
119121
</main>
120122
</div>

src/components/Layouts/NewChat.tsx

Lines changed: 17 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { SquarePen, MoreHorizontal, TimerReset } from "lucide-react"
1+
import { SquarePen } from "lucide-react"
22
import { useTranslation } from "react-i18next"
3-
import { Dropdown, Switch } from "antd"
4-
import type { MenuProps } from "antd"
3+
import { Tooltip } from "antd"
54
import { useMessageOption } from "@/hooks/useMessageOption"
5+
import { BsIncognito } from "react-icons/bs"
66

77
type Props = {
88
clearChat: () => void
@@ -13,43 +13,28 @@ export const NewChat: React.FC<Props> = ({ clearChat }) => {
1313

1414
const { temporaryChat, setTemporaryChat, messages } = useMessageOption()
1515

16-
const items: MenuProps["items"] = [
17-
{
18-
key: "1",
19-
label: (
20-
<label className="flex items-center gap-6 justify-between px-1 py-0.5 cursor-pointer w-full">
21-
<div className="flex items-center gap-2">
22-
<TimerReset className="h-4 w-4 text-gray-600" />
23-
<span>{t("temporaryChat")}</span>
24-
</div>
25-
<Switch
26-
checked={temporaryChat}
27-
onChange={(checked) => {
28-
setTemporaryChat(checked)
29-
// just like chatgpt
30-
if (messages.length > 0) {
31-
clearChat()
32-
}
33-
}}
34-
size="small"
35-
/>
36-
</label>
37-
)
38-
}
39-
]
4016
return (
4117
<div className="flex items-center justify-between">
4218
<button
4319
onClick={clearChat}
4420
className="inline-flex dark:bg-transparent bg-white items-center rounded-s-lg rounded-e-none border dark:border-gray-700 bg-transparent px-3 py-2.5 pe-6 text-xs lg:text-sm font-medium leading-4 text-gray-800 dark:text-white disabled:opacity-50 ease-in-out transition-colors duration-200 hover:bg-gray-100 dark:hover:bg-gray-800 dark:hover:text-white">
4521
<SquarePen className="size-4 sm:size-5" />
4622
<span className="truncate ms-3 hidden sm:inline">{t("newChat")}</span>
47-
</button>{" "}
48-
<Dropdown menu={{ items }} trigger={["click"]}>
49-
<button className="inline-flex dark:bg-transparent bg-white items-center rounded-lg border-s-0 rounded-s-none border dark:border-gray-700 bg-transparent px-3 py-2.5 text-xs lg:text-sm font-medium leading-4 text-gray-800 dark:text-white disabled:opacity-50 ease-in-out transition-colors duration-200 hover:bg-gray-100 dark:hover:bg-gray-800 dark:hover:text-white">
50-
<MoreHorizontal className="size-4 sm:size-5 text-gray-600 dark:text-gray-400" />
23+
</button>
24+
<Tooltip title={t("temporaryChat")}>
25+
<button
26+
data-istemporary-chat={temporaryChat}
27+
onClick={() => {
28+
setTemporaryChat(!temporaryChat)
29+
if (messages.length > 0) {
30+
clearChat()
31+
}
32+
}}
33+
className="inline-flex dark:bg-transparent bg-white items-center rounded-lg border-s-0 rounded-s-none border dark:border-gray-700 bg-transparent px-3 py-2.5 text-xs lg:text-sm font-medium leading-4 text-gray-800 dark:text-white disabled:opacity-50 ease-in-out transition-colors duration-200 hover:bg-gray-100 dark:hover:bg-gray-800 dark:hover:text-white data-[istemporary-chat='true']:bg-gray-100 data-[istemporary-chat='true']:dark:bg-gray-800">
34+
<BsIncognito className="size-4 sm:size-5 text-gray-500 dark:text-gray-400" />
5135
</button>
52-
</Dropdown>
36+
</Tooltip>
37+
{/* </Dropdown> */}
5338
</div>
5439
)
5540
}

0 commit comments

Comments
 (0)