diff --git a/apps/common/features/app/(with-base-layout)/layout.tsx b/apps/common/features/app/(with-base-layout)/layout.tsx
index d6250a6e9..bb1b7c0ba 100644
--- a/apps/common/features/app/(with-base-layout)/layout.tsx
+++ b/apps/common/features/app/(with-base-layout)/layout.tsx
@@ -2,8 +2,8 @@
import { usePathname, useRouter } from "next/navigation";
import { useQueryClient } from "@tanstack/react-query";
-import type { MenuItem } from "@common/components/api";
-import { BaseLayout } from "@common/components/ui";
+import { BaseLayout } from "@common/components";
+import type { MenuItem } from "@/entities/menu";
import { useMenuStore } from "@/shared/lib";
export default function WithBaseLayout({
diff --git a/apps/common/features/package.json b/apps/common/features/package.json
index a0a89ebae..8423560be 100644
--- a/apps/common/features/package.json
+++ b/apps/common/features/package.json
@@ -11,6 +11,8 @@
"dependencies": {
"@common/assets": "workspace:*",
"@common/components": "workspace:*",
+ "@common/config": "workspace:*",
+ "@common/network": "workspace:*",
"@frontend-opensource/use-react-hooks": "^1.1.4",
"@hookform/resolvers": "^4.1.3",
"@minoru/react-dnd-treeview": "^3.5.0",
diff --git a/apps/common/features/src/app/providers/app-provider.tsx b/apps/common/features/src/app/providers/app-provider.tsx
index 6fd488b90..eaf0463a3 100644
--- a/apps/common/features/src/app/providers/app-provider.tsx
+++ b/apps/common/features/src/app/providers/app-provider.tsx
@@ -2,23 +2,24 @@
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { ConfirmProvider } from "@frontend-opensource/use-react-hooks";
-import { AuthWrapper } from "@/entities/auth";
import { MenuWrapper } from "@/entities/menu";
import { StoreProvider } from "@/shared/providers";
import { AlertDialog } from "@/shared/ui/alert-dialog";
import { ConfirmDialog } from "@/shared/ui/confirm-dialog";
+import { initializeNextClientConfig } from "@common/config";
const AppProvider = ({ children }: Readonly<{ children: React.ReactNode }>) => {
const queryClient = new QueryClient();
+
+ initializeNextClientConfig();
+
return (
-
- {children}
-
-
-
+ {children}
+
+
diff --git a/apps/common/features/src/entities/auth/index.ts b/apps/common/features/src/entities/auth/index.ts
index 97e142225..8c7981ac9 100644
--- a/apps/common/features/src/entities/auth/index.ts
+++ b/apps/common/features/src/entities/auth/index.ts
@@ -1,2 +1 @@
export { LoginApi } from "./api/login-service";
-export { AuthWrapper } from "./lib/auth-wrapper";
diff --git a/apps/common/features/src/entities/auth/lib/auth-wrapper.tsx b/apps/common/features/src/entities/auth/lib/auth-wrapper.tsx
deleted file mode 100644
index 705c03231..000000000
--- a/apps/common/features/src/entities/auth/lib/auth-wrapper.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-"use client";
-
-import { useEffect } from "react";
-import { useRouter } from "next/navigation";
-import { client } from "@/shared/api";
-import type { IUserInfo } from "@/shared/store";
-import { getCookie, useUserStore } from "@/shared/lib";
-import { ENDPOINT, AUTH_USER_ID } from "@/shared/config";
-import { LoginApi } from "../api/login-service";
-
-const AuthWrapper = ({ children }: { children: React.ReactNode }) => {
- const router = useRouter();
- const { userInfo, setUserInfo } = useUserStore((state) => state);
-
- async function authCheck() {
- const userId = getCookie(AUTH_USER_ID);
- if (!userId) {
- throw new Error("Missing required authentication tokens");
- }
-
- const response = await client.get(
- `${ENDPOINT.USER_SERVICE.USERS}/${userId}`,
- );
- if (!userInfo) setUserInfo(response.data);
- }
-
- useEffect(() => {
- (async () => {
- try {
- await authCheck();
- } catch (error) {
- console.error(error);
-
- try {
- await LoginApi.silentRefresh();
- await authCheck();
- } catch (refreshError) {
- console.error("Token refresh failed:", refreshError);
- setUserInfo(null);
- router.push("/auth/login");
- }
- }
- })();
- }, []);
-
- return <>{children}>;
-};
-
-export { AuthWrapper };
diff --git a/apps/common/features/src/entities/menu-authority/model/menu-authority-table-columns.tsx b/apps/common/features/src/entities/menu-authority/model/menu-authority-table-columns.tsx
index b70731542..6969a85e9 100644
--- a/apps/common/features/src/entities/menu-authority/model/menu-authority-table-columns.tsx
+++ b/apps/common/features/src/entities/menu-authority/model/menu-authority-table-columns.tsx
@@ -1,6 +1,6 @@
import type { ColumnDef } from "@tanstack/react-table";
import type { UseFormReturn } from "react-hook-form";
-import { Checkbox } from "@common/components/ui";
+import { Checkbox } from "@common/components";
import type {
MenuAuthority,
MenuAuthorityFormData,
diff --git a/apps/common/features/src/entities/menu-authority/ui/management-authority-dialog.tsx b/apps/common/features/src/entities/menu-authority/ui/management-authority-dialog.tsx
index ea5bbb788..a6d4d2128 100644
--- a/apps/common/features/src/entities/menu-authority/ui/management-authority-dialog.tsx
+++ b/apps/common/features/src/entities/menu-authority/ui/management-authority-dialog.tsx
@@ -13,7 +13,7 @@ import {
DialogHeader,
DialogTitle,
DialogTrigger,
-} from "@common/components/ui";
+} from "@common/components";
import { ENDPOINT } from "@/shared/config";
import { useAlertStore } from "@/shared/lib/use-alert-store";
import {
diff --git a/apps/common/features/src/entities/menu/api/menu-service.ts b/apps/common/features/src/entities/menu/api/menu-service.ts
index b6c1510cd..4424f8d37 100644
--- a/apps/common/features/src/entities/menu/api/menu-service.ts
+++ b/apps/common/features/src/entities/menu/api/menu-service.ts
@@ -1,4 +1,4 @@
-import { client } from "@common/components/api";
+import { client } from "@/shared/api";
import { ENDPOINT } from "@/shared/config";
import type { MenuItem, MenuService } from "../model/menu-interface";
diff --git a/apps/common/features/src/entities/menu/index.ts b/apps/common/features/src/entities/menu/index.ts
index 1fa9dd218..04f63e38b 100644
--- a/apps/common/features/src/entities/menu/index.ts
+++ b/apps/common/features/src/entities/menu/index.ts
@@ -1 +1,2 @@
export { MenuWrapper } from "./lib/menu-wrapper";
+export type { MenuItem } from "./model/menu-interface";
diff --git a/apps/common/features/src/entities/posting/ui/posting-dialog.tsx b/apps/common/features/src/entities/posting/ui/posting-dialog.tsx
index c461bcda9..bbddf9778 100644
--- a/apps/common/features/src/entities/posting/ui/posting-dialog.tsx
+++ b/apps/common/features/src/entities/posting/ui/posting-dialog.tsx
@@ -23,8 +23,8 @@ import {
DateRangePicker,
DialogClose,
DialogFooter,
-} from "@common/components/ui";
-import { cn } from "@common/components/lib";
+ cn,
+} from "@common/components";
import { CodeSelect } from "@/entities/code/@x/posting";
import { SiteApi, type Site } from "@/entities/site/@x/posting";
import type { PageableList } from "@/shared/model";
diff --git a/apps/common/features/src/pages/notice/model/notice-table-columns.tsx b/apps/common/features/src/pages/notice/model/notice-table-columns.tsx
index b327b2add..f6036f050 100644
--- a/apps/common/features/src/pages/notice/model/notice-table-columns.tsx
+++ b/apps/common/features/src/pages/notice/model/notice-table-columns.tsx
@@ -1,7 +1,7 @@
import dayjs from "dayjs";
import type { ColumnDef } from "@tanstack/react-table";
import type { Post } from "@/entities/post";
-import { Badge, Button } from "@common/components/ui";
+import { Badge, Button } from "@common/components";
export const columns: ColumnDef[] = [
{
diff --git a/apps/common/features/src/pages/notice/ui/notice-page.tsx b/apps/common/features/src/pages/notice/ui/notice-page.tsx
index fdf28c2ee..ceb63ec6a 100644
--- a/apps/common/features/src/pages/notice/ui/notice-page.tsx
+++ b/apps/common/features/src/pages/notice/ui/notice-page.tsx
@@ -19,7 +19,7 @@ import {
SelectItem,
SelectTrigger,
SelectValue,
-} from "@common/components/ui";
+} from "@common/components";
import { PostApi, type Post, type PostParams } from "@/entities/post";
import { ENDPOINT } from "@/shared/config";
import { columns } from "../model/notice-table-columns";
diff --git a/apps/common/features/src/shared/store/menu-store.ts b/apps/common/features/src/shared/store/menu-store.ts
index f0c6340c9..9aec06603 100644
--- a/apps/common/features/src/shared/store/menu-store.ts
+++ b/apps/common/features/src/shared/store/menu-store.ts
@@ -1,5 +1,5 @@
import { createStore } from "zustand/vanilla";
-import type { MenuItem } from "@common/components/api";
+import type { MenuItem } from "@/entities/menu";
export type MenuState = {
currentMenuInfo: MenuItem | null;
diff --git a/apps/common/features/src/shared/ui/alert-dialog.tsx b/apps/common/features/src/shared/ui/alert-dialog.tsx
index 728276713..012d4ab86 100644
--- a/apps/common/features/src/shared/ui/alert-dialog.tsx
+++ b/apps/common/features/src/shared/ui/alert-dialog.tsx
@@ -4,7 +4,7 @@ import {
DialogFooter,
DialogClose,
Button,
-} from "@common/components/ui";
+} from "@common/components";
import { useAlertStore } from "../lib/use-alert-store";
function AlertDialog() {
diff --git a/apps/common/features/src/shared/ui/confirm-dialog.tsx b/apps/common/features/src/shared/ui/confirm-dialog.tsx
index b4e25be1a..6a4996bfb 100644
--- a/apps/common/features/src/shared/ui/confirm-dialog.tsx
+++ b/apps/common/features/src/shared/ui/confirm-dialog.tsx
@@ -6,7 +6,7 @@ import {
DialogClose,
Button,
type ButtonProps,
-} from "@common/components/ui";
+} from "@common/components";
type ConfirmDialogProps = {
isOpen?: boolean;
diff --git a/apps/common/features/src/shared/ui/form.tsx b/apps/common/features/src/shared/ui/form.tsx
index bd579d263..f88fdf80d 100644
--- a/apps/common/features/src/shared/ui/form.tsx
+++ b/apps/common/features/src/shared/ui/form.tsx
@@ -9,7 +9,7 @@ import {
type FieldPath,
type FieldValues,
} from "react-hook-form";
-import { cn, Label } from "@common/components";
+import { Label, cn } from "@common/components";
const Form = FormProvider;
diff --git a/apps/common/features/src/shared/ui/skeleton-page.tsx b/apps/common/features/src/shared/ui/skeleton-page.tsx
index fca5c8e76..cf788aca2 100644
--- a/apps/common/features/src/shared/ui/skeleton-page.tsx
+++ b/apps/common/features/src/shared/ui/skeleton-page.tsx
@@ -1,4 +1,6 @@
-import { Skeleton } from "@common/components/ui/skeleton";
+"use client";
+
+import { Skeleton } from "@common/components";
function SkeletonPage() {
return (
diff --git a/apps/common/features/src/widgets/dnd-tree/ui/custom-node.tsx b/apps/common/features/src/widgets/dnd-tree/ui/custom-node.tsx
index 4c1d04d04..1176711f5 100644
--- a/apps/common/features/src/widgets/dnd-tree/ui/custom-node.tsx
+++ b/apps/common/features/src/widgets/dnd-tree/ui/custom-node.tsx
@@ -1,7 +1,6 @@
import { useEffect, useState } from "react";
import type { NodeModel, TreeMethods } from "@minoru/react-dnd-treeview";
-import { Button } from "@common/components/ui";
-import { cn } from "@common/components/lib";
+import { Button, cn } from "@common/components";
import { EditableNode } from "./editable-node";
interface TreeData extends Record {
@@ -68,7 +67,9 @@ function CustomNode({
{editMode ? (
setNodeName(e.target.value)}
+ onChange={(e: React.ChangeEvent) =>
+ setNodeName(e.target.value)
+ }
onSave={handleSave}
onCancel={handleCancel}
/>
diff --git a/apps/common/features/src/widgets/dnd-tree/ui/dnd-tree.tsx b/apps/common/features/src/widgets/dnd-tree/ui/dnd-tree.tsx
index 32e4c32a7..b1509006e 100644
--- a/apps/common/features/src/widgets/dnd-tree/ui/dnd-tree.tsx
+++ b/apps/common/features/src/widgets/dnd-tree/ui/dnd-tree.tsx
@@ -11,8 +11,7 @@ import {
type DropOptions,
type Classes,
} from "@minoru/react-dnd-treeview";
-import { Button } from "@common/components/ui";
-import { cn } from "@common/components/lib";
+import { Button, cn } from "@common/components";
import { CustomNode } from "./custom-node";
interface TreeData extends Record {
diff --git a/apps/common/features/src/widgets/dnd-tree/ui/editable-node.tsx b/apps/common/features/src/widgets/dnd-tree/ui/editable-node.tsx
index 9ada835e2..f2274f4d8 100644
--- a/apps/common/features/src/widgets/dnd-tree/ui/editable-node.tsx
+++ b/apps/common/features/src/widgets/dnd-tree/ui/editable-node.tsx
@@ -1,5 +1,5 @@
import type { ComponentProps } from "react";
-import { Button, Input } from "@common/components/ui";
+import { Button, Input } from "@common/components";
type EditableNodeProps = {
depth?: number;
diff --git a/apps/common/features/src/widgets/form-wrapper/ui/form-wrapper.tsx b/apps/common/features/src/widgets/form-wrapper/ui/form-wrapper.tsx
index 071b299ee..caba0b595 100644
--- a/apps/common/features/src/widgets/form-wrapper/ui/form-wrapper.tsx
+++ b/apps/common/features/src/widgets/form-wrapper/ui/form-wrapper.tsx
@@ -1,7 +1,7 @@
import { useRouter } from "next/navigation";
import { useConfirm } from "@frontend-opensource/use-react-hooks";
import { type FieldValues, type UseFormReturn } from "react-hook-form";
-import { Button } from "@common/components/ui";
+import { Button } from "@common/components";
import { Form } from "@/shared/ui/form";
type FormWrapperProps = {
diff --git a/apps/common/features/src/widgets/post/ui/post-action.tsx b/apps/common/features/src/widgets/post/ui/post-action.tsx
index 9a4d93de3..3756fd1aa 100644
--- a/apps/common/features/src/widgets/post/ui/post-action.tsx
+++ b/apps/common/features/src/widgets/post/ui/post-action.tsx
@@ -1,7 +1,7 @@
import { useRouter } from "next/navigation";
import { useMutation } from "@tanstack/react-query";
import { useConfirm } from "@frontend-opensource/use-react-hooks";
-import { Button } from "@common/components/ui";
+import { Button } from "@common/components";
import { PostApi } from "@/entities/post";
type PostActionProps = {
diff --git a/apps/common/features/tsconfig.json b/apps/common/features/tsconfig.json
index 60991f388..f0333a1b7 100644
--- a/apps/common/features/tsconfig.json
+++ b/apps/common/features/tsconfig.json
@@ -25,9 +25,9 @@
"baseUrl": "./src",
"paths": {
"@/*": ["./*"],
- "@common/components/*": ["../../../../packages/common/components/src/*"],
- "@common/components": ["../../../../packages/common/components/src"],
- "@common/network/*": ["../../../../packages/common/network/*"],
+ "@common/assets": ["../../../../packages/common/assets/dist/"],
+ "@common/components": ["../../../../packages/common/components/dist/"],
+ "@common/config": ["../../../../packages/common/config/dist/"],
"@common/network": ["../../../../packages/common/network/"]
}
},
diff --git a/apps/cs/src/entities/menu/api/menu-service.ts b/apps/cs/src/entities/menu/api/menu-service.ts
index b6c1510cd..4424f8d37 100644
--- a/apps/cs/src/entities/menu/api/menu-service.ts
+++ b/apps/cs/src/entities/menu/api/menu-service.ts
@@ -1,4 +1,4 @@
-import { client } from "@common/components/api";
+import { client } from "@/shared/api";
import { ENDPOINT } from "@/shared/config";
import type { MenuItem, MenuService } from "../model/menu-interface";
diff --git a/packages/common/components/.storybook/preview.ts b/packages/common/components/.storybook/preview.ts
new file mode 100644
index 000000000..0519ecba6
--- /dev/null
+++ b/packages/common/components/.storybook/preview.ts
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/common/components/package.json b/packages/common/components/package.json
index cab68595e..c9c3374e2 100644
--- a/packages/common/components/package.json
+++ b/packages/common/components/package.json
@@ -26,6 +26,7 @@
},
"dependencies": {
"@common/assets": "workspace:*",
+ "@common/config": "workspace:*",
"@frontend-opensource/use-react-hooks": "^1.1.4",
"@minoru/react-dnd-treeview": "^3.5.0",
"@radix-ui/react-accordion": "^1.2.3",
diff --git a/packages/common/components/src/api/client.ts b/packages/common/components/src/api/client.ts
index 231887202..0226a4f9a 100644
--- a/packages/common/components/src/api/client.ts
+++ b/packages/common/components/src/api/client.ts
@@ -1,7 +1,15 @@
import { Client } from "@common/network";
-import { BASE_URL, SITE_ID } from "../config";
+import { getConfig } from "@common/config";
-export const client = Client.getInstance({
- baseURL: BASE_URL,
- siteId: SITE_ID,
-});
+const getClientInstance = () => {
+ const config = getConfig();
+ const { PROXY_HOST, SITE_ID } = config;
+ const BASE_URL = `${PROXY_HOST}/server`;
+
+ return Client.getInstance({
+ baseURL: BASE_URL,
+ siteId: SITE_ID ?? "",
+ });
+};
+
+export const getApiClient = () => getClientInstance();
diff --git a/packages/common/components/src/api/menu.ts b/packages/common/components/src/api/menu.ts
index 4855718a2..bd8fe1599 100644
--- a/packages/common/components/src/api/menu.ts
+++ b/packages/common/components/src/api/menu.ts
@@ -1,4 +1,4 @@
-import { client } from "./client";
+import { getApiClient } from "./client";
import { ENDPOINT } from "../config";
export interface MenuItem {
@@ -21,6 +21,8 @@ export interface MenuItem {
requiredUrlPath: boolean;
}
+const client = getApiClient();
+
export const getMenuList = async (siteId: string) => {
const response = await client.get