feat: Sight Page update

This commit is contained in:
2025-06-01 23:18:21 +03:00
parent 87386c6a73
commit a8777a974a
26 changed files with 3460 additions and 727 deletions

View File

@@ -1,4 +1,4 @@
import { articlesStore } from "@shared";
import { articlesStore, authInstance, languageStore } from "@shared";
import { observer } from "mobx-react-lite";
import { useEffect, useState } from "react";
import {
@@ -22,8 +22,13 @@ import { ReactMarkdownComponent } from "@widgets";
interface SelectArticleModalProps {
open: boolean;
onClose: () => void;
onSelectArticle: (articleId: string) => void;
linkedArticleIds?: string[]; // Add optional prop for linked articles
onSelectArticle: (
articleId: number,
heading: string,
body: string,
media: { id: string; media_type: number; filename: string }[]
) => void;
linkedArticleIds?: number[]; // Add optional prop for linked articles
}
export const SelectArticleModal = observer(
@@ -35,7 +40,7 @@ export const SelectArticleModal = observer(
}: SelectArticleModalProps) => {
const { articles, getArticle, getArticleMedia } = articlesStore;
const [searchQuery, setSearchQuery] = useState("");
const [selectedArticleId, setSelectedArticleId] = useState<string | null>(
const [selectedArticleId, setSelectedArticleId] = useState<number | null>(
null
);
const [isLoading, setIsLoading] = useState(false);
@@ -50,12 +55,21 @@ export const SelectArticleModal = observer(
}, [open]);
useEffect(() => {
const handleKeyPress = (event: KeyboardEvent) => {
const handleKeyPress = async (event: KeyboardEvent) => {
if (event.key.toLowerCase() === "enter") {
event.preventDefault();
if (selectedArticleId) {
onSelectArticle(selectedArticleId);
const media = await authInstance.get(
`/article/${selectedArticleId}/media`
);
onSelectArticle(
selectedArticleId,
articlesStore.articleData?.heading || "",
articlesStore.articleData?.body || "",
media.data || []
);
onClose();
setSelectedArticleId(null);
}
}
};
@@ -66,9 +80,7 @@ export const SelectArticleModal = observer(
};
}, [selectedArticleId, onSelectArticle, onClose]);
const handleArticleClick = async (articleId: string) => {
if (selectedArticleId === articleId) return;
const handleArticleClick = async (articleId: number) => {
setSelectedArticleId(articleId);
setIsLoading(true);
@@ -86,14 +98,13 @@ export const SelectArticleModal = observer(
setIsLoading(false);
}
};
// @ts-ignore
const filteredArticles = articles
// @ts-ignore
.filter((article) => !linkedArticleIds.includes(article.id))
// @ts-ignore
.filter((article) =>
article.service_name.toLowerCase().includes(searchQuery.toLowerCase())
);
const filteredArticles = articles[languageStore.language].filter(
(article) => !linkedArticleIds.includes(article.id)
);
// .filter((article) =>
// article.service_name.toLowerCase().includes(searchQuery.toLowerCase())
// );
const token = localStorage.getItem("token");
return (
@@ -150,7 +161,17 @@ export const SelectArticleModal = observer(
<ListItemButton
key={article.id}
onClick={() => handleArticleClick(article.id)}
onDoubleClick={() => onSelectArticle(article.id)}
onDoubleClick={async () => {
const media = await authInstance.get(
`/article/${article.id}/media`
);
onSelectArticle(
article.id,
article.heading,
article.body,
media.data
);
}}
selected={selectedArticleId === article.id}
disabled={isLoading}
sx={{
@@ -288,9 +309,22 @@ export const SelectArticleModal = observer(
<Button onClick={onClose}>Отмена</Button>
<Button
variant="contained"
onClick={() =>
selectedArticleId && onSelectArticle(selectedArticleId)
}
onClick={async () => {
if (selectedArticleId) {
const media = await authInstance.get(
`/article/${selectedArticleId}/media`
);
onSelectArticle(
selectedArticleId,
articlesStore.articleData?.heading || "",
articlesStore.articleData?.body || "",
media.data
);
onClose();
setSelectedArticleId(null);
}
}}
disabled={!selectedArticleId || isLoading}
>
Выбрать