diff --git a/enshi/package-lock.json b/enshi/package-lock.json
index f4e7c72..2b04d15 100644
--- a/enshi/package-lock.json
+++ b/enshi/package-lock.json
@@ -8,7 +8,7 @@
"name": "enshi",
"version": "0.0.0",
"dependencies": {
- "@radix-ui/react-dialog": "^1.1.1",
+ "@radix-ui/react-dialog": "^1.1.2",
"@radix-ui/react-form": "^0.1.0",
"@radix-ui/react-icons": "^1.3.2",
"@radix-ui/react-navigation-menu": "^1.2.1",
@@ -1233,6 +1233,42 @@
}
}
},
+ "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-dialog": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz",
+ "integrity": "sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.0",
+ "@radix-ui/react-dismissable-layer": "1.1.0",
+ "@radix-ui/react-focus-guards": "1.1.0",
+ "@radix-ui/react-focus-scope": "1.1.0",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-portal": "1.1.1",
+ "@radix-ui/react-presence": "1.1.0",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-slot": "1.1.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0",
+ "aria-hidden": "^1.1.1",
+ "react-remove-scroll": "2.5.7"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-arrow": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz",
@@ -1420,25 +1456,25 @@
}
},
"node_modules/@radix-ui/react-dialog": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz",
- "integrity": "sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.2.tgz",
+ "integrity": "sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA==",
"license": "MIT",
"dependencies": {
"@radix-ui/primitive": "1.1.0",
"@radix-ui/react-compose-refs": "1.1.0",
- "@radix-ui/react-context": "1.1.0",
- "@radix-ui/react-dismissable-layer": "1.1.0",
- "@radix-ui/react-focus-guards": "1.1.0",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-dismissable-layer": "1.1.1",
+ "@radix-ui/react-focus-guards": "1.1.1",
"@radix-ui/react-focus-scope": "1.1.0",
"@radix-ui/react-id": "1.1.0",
- "@radix-ui/react-portal": "1.1.1",
- "@radix-ui/react-presence": "1.1.0",
+ "@radix-ui/react-portal": "1.1.2",
+ "@radix-ui/react-presence": "1.1.1",
"@radix-ui/react-primitive": "2.0.0",
"@radix-ui/react-slot": "1.1.0",
"@radix-ui/react-use-controllable-state": "1.1.0",
"aria-hidden": "^1.1.1",
- "react-remove-scroll": "2.5.7"
+ "react-remove-scroll": "2.6.0"
},
"peerDependencies": {
"@types/react": "*",
@@ -1455,6 +1491,158 @@
}
}
},
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-context": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz",
+ "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.1.tgz",
+ "integrity": "sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-callback-ref": "1.1.0",
+ "@radix-ui/react-use-escape-keydown": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-focus-guards": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz",
+ "integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-portal": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.2.tgz",
+ "integrity": "sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-layout-effect": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.1.tgz",
+ "integrity": "sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-use-layout-effect": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dialog/node_modules/react-remove-scroll": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz",
+ "integrity": "sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==",
+ "license": "MIT",
+ "dependencies": {
+ "react-remove-scroll-bar": "^2.3.6",
+ "react-style-singleton": "^2.2.1",
+ "tslib": "^2.1.0",
+ "use-callback-ref": "^1.3.0",
+ "use-sidecar": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dialog/node_modules/react-remove-scroll-bar": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz",
+ "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==",
+ "license": "MIT",
+ "dependencies": {
+ "react-style-singleton": "^2.2.1",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-direction": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz",
@@ -2682,6 +2870,42 @@
}
}
},
+ "node_modules/@radix-ui/themes/node_modules/@radix-ui/react-dialog": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz",
+ "integrity": "sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.0",
+ "@radix-ui/react-dismissable-layer": "1.1.0",
+ "@radix-ui/react-focus-guards": "1.1.0",
+ "@radix-ui/react-focus-scope": "1.1.0",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-portal": "1.1.1",
+ "@radix-ui/react-presence": "1.1.0",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-slot": "1.1.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0",
+ "aria-hidden": "^1.1.1",
+ "react-remove-scroll": "2.5.7"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/themes/node_modules/@radix-ui/react-navigation-menu": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.0.tgz",
diff --git a/enshi/package.json b/enshi/package.json
index 6cc8117..e00dff1 100644
--- a/enshi/package.json
+++ b/enshi/package.json
@@ -10,7 +10,7 @@
"preview": "vite preview"
},
"dependencies": {
- "@radix-ui/react-dialog": "^1.1.1",
+ "@radix-ui/react-dialog": "^1.1.2",
"@radix-ui/react-form": "^0.1.0",
"@radix-ui/react-icons": "^1.3.2",
"@radix-ui/react-navigation-menu": "^1.2.1",
diff --git a/enshi/src/App.tsx b/enshi/src/App.tsx
index b67896c..29bf349 100644
--- a/enshi/src/App.tsx
+++ b/enshi/src/App.tsx
@@ -1,4 +1,4 @@
-import { Theme } from "@radix-ui/themes";
+import { Theme, ThemePanel } from "@radix-ui/themes";
import "@radix-ui/themes/styles.css";
import { QueryClientProvider } from "@tanstack/react-query";
import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
@@ -17,8 +17,8 @@ export default function App() {
- {/* */}
-
+
+
diff --git a/enshi/src/Components/ArticleViewer/ArticleViewer.tsx b/enshi/src/Components/ArticleViewer/ArticleViewer.tsx
index 892920a..9cc5024 100644
--- a/enshi/src/Components/ArticleViewer/ArticleViewer.tsx
+++ b/enshi/src/Components/ArticleViewer/ArticleViewer.tsx
@@ -1,4 +1,14 @@
-import { Box, Container, Flex, Separator, Text } from "@radix-ui/themes";
+import * as Dialog from "@radix-ui/react-dialog";
+import { Cross2Icon } from "@radix-ui/react-icons";
+import {
+ Box,
+ Button,
+ Container,
+ Flex,
+ Select,
+ Separator,
+ Text,
+} from "@radix-ui/themes";
import { useQuery } from "@tanstack/react-query";
import { Interweave } from "interweave";
import { useAtomValue } from "jotai";
@@ -27,6 +37,8 @@ export default function ArticleViewer(props: TArticleViewer) {
return response.data;
},
+ gcTime: 0,
+ refetchOnMount: true,
});
if (isPending) return ;
@@ -40,14 +52,19 @@ export default function ArticleViewer(props: TArticleViewer) {
{data.title}
-
+
-
+
+
+
+
+
+
+
+
+
+
+ Add this post to blog
+
+
+
+
+ {`Add "${data.title}" to blog...`}
+
+
+
+
+
+
+ This
+
+
+ This is
+ updated blog
+
+
+ This another
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/enshi/src/Components/BlogBox/BlogBox.tsx b/enshi/src/Components/BlogBox/BlogBox.tsx
new file mode 100644
index 0000000..ff5788a
--- /dev/null
+++ b/enshi/src/Components/BlogBox/BlogBox.tsx
@@ -0,0 +1,25 @@
+import { Avatar, Card, Flex, Heading } from "@radix-ui/themes";
+import { useNavigate } from "react-router-dom";
+import UserNicknameLink from "../UserNicknameLink/UserNicknameLink";
+
+type TBlogBox = {
+ title?: string;
+ blogId?: string;
+ userId: string;
+};
+
+export default function BlogBox(props: TBlogBox) {
+ const navigate = useNavigate();
+
+ return (
+ navigate(``)}>
+
+ {props?.title || "...No title..."}
+
+
+
+
+
+
+ );
+}
diff --git a/enshi/src/Components/NavBar/NavigationMenu/NavigationMenu.tsx b/enshi/src/Components/NavBar/NavigationMenu/NavigationMenu.tsx
index e82d496..56e8b9a 100644
--- a/enshi/src/Components/NavBar/NavigationMenu/NavigationMenu.tsx
+++ b/enshi/src/Components/NavBar/NavigationMenu/NavigationMenu.tsx
@@ -1,15 +1,19 @@
import * as NavigationMenu from "@radix-ui/react-navigation-menu";
-import { useThemeContext, Button, Heading } from "@radix-ui/themes";
-import { useNavigate, useLocation } from "react-router-dom";
+import { Button, Heading, useThemeContext } from "@radix-ui/themes";
+import { useTranslation } from "react-i18next";
+import { useLocation, useNavigate } from "react-router-dom";
export default function CustomNavigationMenu() {
+
+ const {t} = useTranslation()
+
return (
-
+
-
+
diff --git a/enshi/src/Components/UserNicknameLink/UserNicknameLink.tsx b/enshi/src/Components/UserNicknameLink/UserNicknameLink.tsx
new file mode 100644
index 0000000..05091f5
--- /dev/null
+++ b/enshi/src/Components/UserNicknameLink/UserNicknameLink.tsx
@@ -0,0 +1,33 @@
+import { Skeleton, Text } from "@radix-ui/themes";
+import { useQuery } from "@tanstack/react-query";
+import { Link } from "react-router-dom";
+import { axiosLocalhost } from "../../api/axios/axios";
+
+type TUserNicknameLink = {
+ userId: string;
+};
+
+export default function UserNicknameLink(props: TUserNicknameLink) {
+ const { data, isPending } = useQuery({
+ queryKey: [`userLink${props.userId}`],
+ queryFn: async () => {
+ const response = await axiosLocalhost.get(
+ `/user/${props.userId || 0}`
+ );
+ return response.data as string;
+ },
+ });
+
+ if (isPending)
+ return (
+
+ @Nickname
+
+ );
+
+ return (
+
+ @{data}
+
+ );
+}
diff --git a/enshi/src/Pages/LoginRegisterPage/PostRedactor/PostRedactor.tsx b/enshi/src/Pages/LoginRegisterPage/PostRedactor/PostRedactor.tsx
index c7cafaa..50d1e9b 100644
--- a/enshi/src/Pages/LoginRegisterPage/PostRedactor/PostRedactor.tsx
+++ b/enshi/src/Pages/LoginRegisterPage/PostRedactor/PostRedactor.tsx
@@ -30,7 +30,8 @@ export default function PostRedactor() {
return error;
}
},
- gcTime: Infinity,
+ gcTime: 0,
+ refetchOnMount: true
});
return (
diff --git a/enshi/src/Pages/LoginRegisterPage/PostRedactor/SubmitChangesButton/SubmitChangesButton.tsx b/enshi/src/Pages/LoginRegisterPage/PostRedactor/SubmitChangesButton/SubmitChangesButton.tsx
index 52cddc8..070448d 100644
--- a/enshi/src/Pages/LoginRegisterPage/PostRedactor/SubmitChangesButton/SubmitChangesButton.tsx
+++ b/enshi/src/Pages/LoginRegisterPage/PostRedactor/SubmitChangesButton/SubmitChangesButton.tsx
@@ -4,6 +4,7 @@ import { useState } from "react";
import { useTranslation } from "react-i18next";
import { useNavigate, useParams } from "react-router-dom";
import { axiosLocalhost } from "../../../../api/axios/axios";
+import useToast from "../../../../hooks/useToast";
type TSubmitChangesButton = {
className: string;
@@ -15,6 +16,7 @@ export default function SubmitChangesButton(props: TSubmitChangesButton) {
const { t } = useTranslation();
const [isDisabled, setIsDisabled] = useState(false);
+ const createToast = useToast();
const navigate = useNavigate();
const queryParams = useParams();
@@ -37,6 +39,7 @@ export default function SubmitChangesButton(props: TSubmitChangesButton) {
setIsDisabled(false);
},
onSuccess: () => {
+ createToast({title: "Post has been changed!"})
navigate("/");
},
});
diff --git a/enshi/src/Pages/LoginRegisterPage/RegisterPage/RegisterPage.tsx b/enshi/src/Pages/LoginRegisterPage/RegisterPage/RegisterPage.tsx
index 787d581..4702221 100644
--- a/enshi/src/Pages/LoginRegisterPage/RegisterPage/RegisterPage.tsx
+++ b/enshi/src/Pages/LoginRegisterPage/RegisterPage/RegisterPage.tsx
@@ -5,7 +5,7 @@ import { useMutation } from "@tanstack/react-query";
import { useSetAtom } from "jotai";
import { useState } from "react";
import { useTranslation } from "react-i18next";
-import { useNavigate } from "react-router-dom";
+import { Link, useNavigate } from "react-router-dom";
import { axiosLocalhost } from "../../../api/axios/axios";
import { userAtom } from "../../../AtomStore/AtomStore";
import UseCapsLock from "../../../hooks/useCapsLock";
@@ -244,6 +244,21 @@ export default function RegisterPage() {
{t("submit")}
+
+
+ {t("alreadyRegistered")}{" "}
+
+ {t("logIn")}
+ {" "}
+ {t("now")}
+
+
+
+ {t("byPressingTheButton")}{" "}
+
+ {t("termsOfService")}.
+
+
);
diff --git a/enshi/src/Pages/RandomPostsPage/RandomPostsPage.tsx b/enshi/src/Pages/RandomPostsPage/RandomPostsPage.tsx
index 764b601..605e04f 100644
--- a/enshi/src/Pages/RandomPostsPage/RandomPostsPage.tsx
+++ b/enshi/src/Pages/RandomPostsPage/RandomPostsPage.tsx
@@ -1,6 +1,7 @@
import * as ScrollArea from "@radix-ui/react-scroll-area";
-import { Container } from "@radix-ui/themes";
+import { Container, Flex, Heading, Separator } from "@radix-ui/themes";
import { useQuery } from "@tanstack/react-query";
+import { useTranslation } from "react-i18next";
import { GetRandomPostsRow } from "../../@types/PostTypes";
import { axiosLocalhost } from "../../api/axios/axios";
import PostCard from "./PostCard/PostCard";
@@ -8,6 +9,8 @@ import PostCard from "./PostCard/PostCard";
const LIMIT = 10;
export default function RandomPostsPage() {
+ const {t} = useTranslation()
+
const { data, refetch } = useQuery({
queryKey: ["random_posts_key"],
queryFn: async () => {
@@ -27,30 +30,38 @@ export default function RandomPostsPage() {
return (
<>
-
-
- {data?.map((post, i) => {
- return (
-
-
-
- );
- })}
-
-
-
-
-
-
-
-
-
+
+
+ {t("discover")}
+
+
+
+
+
+
+ {data?.map((post, i) => {
+ return (
+
+
+
+ );
+ })}
+
+
+
+
+ {/*
+
+ */}
+ {/* */}
+
+
>
);
}
diff --git a/enshi/src/Pages/UserBlogsPage/BlogBox/BlogBox.tsx b/enshi/src/Pages/UserBlogsPage/BlogBox/BlogBox.tsx
deleted file mode 100644
index 4c62b4b..0000000
--- a/enshi/src/Pages/UserBlogsPage/BlogBox/BlogBox.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import { Card } from '@radix-ui/themes';
-import { useNavigate } from 'react-router-dom';
-
-type TBlogBox = {
- title?: string;
- blogId?: string;
-}
-
-export default function BlogBox(props: TBlogBox) {
-
- const navigate = useNavigate()
-
- return (
- navigate(``)}
- >
- {props?.title || "...No title..."}
- {props?.blogId || "adqwwd"}
-
- )
-}
diff --git a/enshi/src/Pages/UserBlogsPage/UserBlogsPage.tsx b/enshi/src/Pages/UserBlogsPage/UserBlogsPage.tsx
index 1396ee4..599ae6d 100644
--- a/enshi/src/Pages/UserBlogsPage/UserBlogsPage.tsx
+++ b/enshi/src/Pages/UserBlogsPage/UserBlogsPage.tsx
@@ -1,32 +1,20 @@
-import { Box, Container, Flex } from "@radix-ui/themes";
+import * as Dialog from "@radix-ui/react-dialog";
+import { Cross2Icon, PlusIcon } from "@radix-ui/react-icons";
+import {
+ Box,
+ Button,
+ Container,
+ Flex,
+ Separator,
+ Text,
+} from "@radix-ui/themes";
import { useQuery } from "@tanstack/react-query";
-import { useAtomValue } from "jotai";
-import { userAtom } from "../../AtomStore/AtomStore";
import { axiosLocalhost } from "../../api/axios/axios";
-import BlogBox from "./BlogBox/BlogBox";
+import BlogBox from "../../Components/BlogBox/BlogBox";
+import { JSONWithInt64 } from "../../utils/idnex";
import SkeletonBoxes from "./SkeletonBoxes/SkeletonBoxes";
export default function UserBlogsPage() {
- const user = useAtomValue(userAtom);
-
- const isBigNumber = (num: any) => !Number.isSafeInteger(+num);
-
- const enquoteBigNumber = (jsonString: any, bigNumChecker: any) =>
- jsonString.replaceAll(
- /([:\s\[,]*)(\d+)([\s,\]]*)/g,
- (matchingSubstr: any, prefix: any, bigNum: any, suffix: any) =>
- bigNumChecker(bigNum)
- ? `${prefix}"${bigNum}"${suffix}`
- : matchingSubstr
- );
-
- const parseWithBigInt = (jsonString: any, bigNumChecker: any) =>
- JSON.parse(enquoteBigNumber(jsonString, bigNumChecker), (key, value) =>
- !isNaN(value) && bigNumChecker(value)
- ? BigInt(value).toString()
- : value
- );
-
const { data, isPending, isFetching } = useQuery({
queryKey: ["userBlogs"],
queryFn: async () => {
@@ -34,13 +22,13 @@ export default function UserBlogsPage() {
transformResponse: [(data) => data],
});
- let temp = parseWithBigInt(response.data, isBigNumber);
+ let temp = JSONWithInt64(response.data);
return temp as any[];
},
});
- if (isFetching)
+ if (isPending)
return (
@@ -51,17 +39,86 @@ export default function UserBlogsPage() {
+
+ Your blogs
+
+
+
+
{data
? data?.map((blog: any, b) => {
return (
-
+ <>
+
+ >
);
})
: null}
+
+
+
+
+
+
+
+
+
+ Create blog
+
+
+ Create your new blog.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/enshi/src/locale/en.ts b/enshi/src/locale/en.ts
index 846f98e..caacecb 100644
--- a/enshi/src/locale/en.ts
+++ b/enshi/src/locale/en.ts
@@ -20,10 +20,24 @@ const en = {
registerForm: "Register",
loginForm: "Log in",
+ alreadyRegistered: "Already registered?",
+
suggestRegister: "Don't have an account?",
register: "Register",
now: "now!",
+ logIn: "Log in",
+
+ updatePost: "Update",
+
+ byPressingTheButton: "By pressing the submit button you agree with our",
+ termsOfService: "Terms Of Service",
+
+ discover: "Discover something new...",
+
+ home: "Home",
+ following: "Following",
+
errors: {
enterUsername: "Please enter your username",
enterEmail: "Please enter your email",
diff --git a/enshi/src/locale/ru.ts b/enshi/src/locale/ru.ts
index e5dfbf0..b50c34f 100644
--- a/enshi/src/locale/ru.ts
+++ b/enshi/src/locale/ru.ts
@@ -20,11 +20,26 @@ const ru = {
registerForm: "Регистрация",
loginForm: "Вход",
+
+ alreadyRegistered: "Уже есть аккаунт?",
suggestRegister: "Не зарегистрированы?",
register: "Создайте аккаунт",
now: "сейчас!",
+ logIn: "Войдите",
+
+ byPressingTheButton: "Нажимая `Подтвердить`, вы соглашаетесь с нашими",
+ termsOfService: "Условиями предоставления услуг.",
+
+ updatePost: "Изменить",
+
+ discover: "Найдите что-то новое",
+
+ home: "Главная",
+ following: "Отслеживаемые",
+
+
errors: {
enterUsername: "Это обязательное поле",
enterEmail: "Это обязательное поле",
diff --git a/enshi/src/utils/idnex.ts b/enshi/src/utils/idnex.ts
new file mode 100644
index 0000000..380864c
--- /dev/null
+++ b/enshi/src/utils/idnex.ts
@@ -0,0 +1,19 @@
+const isBigNumber = (num: any) => !Number.isSafeInteger(+num);
+
+const enquoteBigNumber = (jsonString: any, bigNumChecker: any) =>
+ jsonString.replaceAll(
+ /([:\s\[,]*)(\d+)([\s,\]]*)/g,
+ (matchingSubstr: any, prefix: any, bigNum: any, suffix: any) =>
+ bigNumChecker(bigNum)
+ ? `${prefix}"${bigNum}"${suffix}`
+ : matchingSubstr
+ );
+
+const parseWithBigInt = (jsonString: any, bigNumChecker: any) =>
+ JSON.parse(enquoteBigNumber(jsonString, bigNumChecker), (_key, value) =>
+ !isNaN(value) && bigNumChecker(value) ? BigInt(value).toString() : value
+ );
+
+export const JSONWithInt64 = (jsonString: any) => {
+ return parseWithBigInt(jsonString, isBigNumber);
+};
diff --git a/enshi_back/db/go_queries/users_queries.sql.go b/enshi_back/db/go_queries/users_queries.sql.go
index de0e1d3..2660956 100644
--- a/enshi_back/db/go_queries/users_queries.sql.go
+++ b/enshi_back/db/go_queries/users_queries.sql.go
@@ -152,6 +152,17 @@ func (q *Queries) GetUserByUsername(ctx context.Context, username string) (User,
return i, err
}
+const getUserUsernameById = `-- name: GetUserUsernameById :one
+SELECT username FROM users WHERE user_id = $1
+`
+
+func (q *Queries) GetUserUsernameById(ctx context.Context, userID int64) (string, error) {
+ row := q.db.QueryRow(ctx, getUserUsernameById, userID)
+ var username string
+ err := row.Scan(&username)
+ return username, err
+}
+
const updateUserPasswordHash = `-- name: UpdateUserPasswordHash :one
UPDATE public.users
SET "password"=$1
diff --git a/enshi_back/db/queries/users_queries.sql b/enshi_back/db/queries/users_queries.sql
index fcf2f59..1c84a51 100644
--- a/enshi_back/db/queries/users_queries.sql
+++ b/enshi_back/db/queries/users_queries.sql
@@ -4,6 +4,9 @@ SELECT * FROM users;
-- name: GetUserById :one
SELECT * FROM users WHERE user_id = $1;
+-- name: GetUserUsernameById :one
+SELECT username FROM users WHERE user_id = $1;
+
-- name: GetUserByUsername :one
SELECT * FROM users WHERE username = $1;
diff --git a/enshi_back/routes/routesSetup.go b/enshi_back/routes/routesSetup.go
index 7ae9b9c..12afb8b 100644
--- a/enshi_back/routes/routesSetup.go
+++ b/enshi_back/routes/routesSetup.go
@@ -8,6 +8,7 @@ import (
bookmarksroutes "enshi/routes/bookmarksRoutes"
"enshi/routes/postsRoutes"
"enshi/routes/userProfileRoutes"
+ userroutes "enshi/routes/userRoutes"
voteroutes "enshi/routes/voteRoutes"
"net/http"
"strings"
@@ -176,10 +177,16 @@ func SetupRotes(g *gin.Engine) error {
temporal := g.Group("/")
temporal.Use(middleware.AuthMiddleware())
+
temporal.GET(
"/user/blogs",
blogRoutes.GetUserBlogs,
)
+ freeGroup.GET(
+ "/user/:user-id",
+ userroutes.GetUserUsername,
+ )
+
return nil
}
diff --git a/enshi_back/routes/userRoutes/getUser.go b/enshi_back/routes/userRoutes/getUser.go
new file mode 100644
index 0000000..f12bf57
--- /dev/null
+++ b/enshi_back/routes/userRoutes/getUser.go
@@ -0,0 +1,30 @@
+package userroutes
+
+import (
+ "context"
+ rest_api_stuff "enshi/REST_API_stuff"
+ db_repo "enshi/db/go_queries"
+ "enshi/db_connection"
+ "enshi/middleware/getters"
+ "net/http"
+
+ "github.com/gin-gonic/gin"
+)
+
+func GetUserUsername(c *gin.Context) {
+ userId, err := getters.GetInt64Param(c, "user-id")
+ if err != nil {
+ rest_api_stuff.BadRequestAnswer(c, err)
+ }
+
+ userInfo, err := db_repo.New(db_connection.Dbx).GetUserUsernameById(
+ context.Background(),
+ userId,
+ )
+ if err != nil {
+ rest_api_stuff.InternalErrorAnswer(c, err)
+ }
+
+ c.IndentedJSON(http.StatusOK, userInfo)
+
+}