회사관리, 메뉴관리 수정,삭제 기능
This commit is contained in:
@@ -38,14 +38,19 @@ export const useCompanyManagement = () => {
|
||||
setError(null);
|
||||
|
||||
try {
|
||||
// 실제 데이터베이스에서 회사 목록 조회
|
||||
const searchParams = {
|
||||
company_name: searchFilter.company_name,
|
||||
status: searchFilter.status === "all" ? undefined : searchFilter.status,
|
||||
};
|
||||
|
||||
// 더미 데이터 대신 실제 API 호출
|
||||
const data = await companyAPI.getList(searchParams);
|
||||
setCompanies(data);
|
||||
|
||||
console.log("✅ 실제 DB에서 회사 목록 조회 성공:", data.length, "개");
|
||||
} catch (err) {
|
||||
console.error("❌ 회사 목록 조회 실패:", err);
|
||||
setError(err instanceof Error ? err.message : "회사 목록 조회에 실패했습니다.");
|
||||
setCompanies([]);
|
||||
} finally {
|
||||
|
||||
@@ -1,38 +1,36 @@
|
||||
import { useState, useEffect } from "react";
|
||||
import { setTranslationCache } from "@/lib/utils/multilang";
|
||||
import { apiClient } from "@/lib/api/client";
|
||||
|
||||
interface UseMultiLangOptions {
|
||||
companyCode?: string;
|
||||
defaultLang?: string;
|
||||
}
|
||||
|
||||
// 전역 언어 상태 관리
|
||||
// 전역 언어 상태 (다른 컴포넌트에서 접근 가능)
|
||||
let globalUserLang = "KR";
|
||||
let globalChangeLangCallback: ((lang: string) => void) | null = null;
|
||||
|
||||
export function useMultiLang(options: UseMultiLangOptions = {}) {
|
||||
const { companyCode = "ILSHIN", defaultLang = "KR" } = options;
|
||||
const [userLang, setUserLang] = useState(globalUserLang || defaultLang);
|
||||
export const useMultiLang = (options: { companyCode?: string } = {}) => {
|
||||
const [userLang, setUserLang] = useState<string>("KR");
|
||||
const companyCode = options.companyCode || "*";
|
||||
|
||||
// 전역 언어 상태 업데이트
|
||||
// 전역 언어 상태 동기화
|
||||
useEffect(() => {
|
||||
globalUserLang = userLang;
|
||||
// window 객체에 전역 언어 상태 저장 (API 클라이언트에서 접근용)
|
||||
if (typeof window !== "undefined") {
|
||||
(window as any).__GLOBAL_USER_LANG = userLang;
|
||||
console.log("전역 언어 상태 설정:", userLang);
|
||||
if (globalUserLang !== userLang) {
|
||||
setUserLang(globalUserLang);
|
||||
}
|
||||
}, [globalUserLang]);
|
||||
|
||||
// 언어 변경 시 전역 콜백 호출
|
||||
useEffect(() => {
|
||||
if (globalChangeLangCallback) {
|
||||
globalChangeLangCallback(userLang);
|
||||
}
|
||||
}, [userLang]);
|
||||
|
||||
// API 기본 URL 설정
|
||||
const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:8080";
|
||||
|
||||
// 브라우저 언어 감지
|
||||
// 사용자 로케일 조회 (한 번만 실행)
|
||||
useEffect(() => {
|
||||
// 이미 로케일이 설정되어 있으면 중복 호출 방지
|
||||
if (globalUserLang && globalUserLang !== "KR") {
|
||||
setUserLang(globalUserLang);
|
||||
return;
|
||||
}
|
||||
|
||||
const fetchUserLocale = async () => {
|
||||
try {
|
||||
console.log("🔍 사용자 로케일 조회 시작");
|
||||
@@ -42,47 +40,31 @@ export function useMultiLang(options: UseMultiLangOptions = {}) {
|
||||
const userLocale = response.data.data;
|
||||
console.log("✅ 사용자 로케일 조회 성공:", userLocale);
|
||||
|
||||
// 사용자 로케일을 데이터베이스 언어 코드로 매핑
|
||||
const langMapping: Record<string, string> = {
|
||||
ko: "KR",
|
||||
en: "US",
|
||||
ja: "JP",
|
||||
zh: "CN",
|
||||
};
|
||||
|
||||
const mappedLang = langMapping[userLocale] || userLocale;
|
||||
console.log("🔄 언어 매핑:", userLocale, "->", mappedLang);
|
||||
setUserLang(mappedLang);
|
||||
// 데이터베이스의 locale 값을 그대로 사용 (매핑 없음)
|
||||
setUserLang(userLocale);
|
||||
globalUserLang = userLocale; // 전역 상태도 업데이트
|
||||
return;
|
||||
}
|
||||
|
||||
// API 호출 실패 시 브라우저 언어 사용
|
||||
console.warn("⚠️ 사용자 로케일 조회 실패, 브라우저 언어 사용");
|
||||
const browserLang = navigator.language.split("-")[0];
|
||||
const langMapping: Record<string, string> = {
|
||||
ko: "KR",
|
||||
en: "US",
|
||||
ja: "JP",
|
||||
zh: "CN",
|
||||
};
|
||||
|
||||
if (langMapping[browserLang]) {
|
||||
setUserLang(langMapping[browserLang]);
|
||||
// 브라우저 언어를 그대로 사용 (매핑 없음)
|
||||
if (["ko", "en", "ja", "zh"].includes(browserLang)) {
|
||||
setUserLang(browserLang);
|
||||
globalUserLang = browserLang;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("❌ 사용자 로케일 조회 중 오류:", error);
|
||||
|
||||
// 오류 시 브라우저 언어 사용
|
||||
const browserLang = navigator.language.split("-")[0];
|
||||
const langMapping: Record<string, string> = {
|
||||
ko: "KR",
|
||||
en: "US",
|
||||
ja: "JP",
|
||||
zh: "CN",
|
||||
};
|
||||
|
||||
if (langMapping[browserLang]) {
|
||||
setUserLang(langMapping[browserLang]);
|
||||
// 브라우저 언어를 그대로 사용 (매핑 없음)
|
||||
if (["ko", "en", "ja", "zh"].includes(browserLang)) {
|
||||
setUserLang(browserLang);
|
||||
globalUserLang = browserLang;
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -90,42 +72,69 @@ export function useMultiLang(options: UseMultiLangOptions = {}) {
|
||||
fetchUserLocale();
|
||||
}, []);
|
||||
|
||||
// 다국어 텍스트 가져오기
|
||||
// 다국어 텍스트 가져오기 (배치 조회 방식)
|
||||
const getText = async (menuCode: string, langKey: string, fallback?: string): Promise<string> => {
|
||||
console.log(`🔍 다국어 텍스트 요청:`, { menuCode, langKey, userLang, companyCode });
|
||||
console.log(`🔍 다국어 텍스트 요청 (배치 방식):`, { menuCode, langKey, userLang, companyCode });
|
||||
|
||||
try {
|
||||
const url = `/multilang/user-text/${companyCode}/${menuCode}/${langKey}?userLang=${userLang}`;
|
||||
console.log(`📡 API 요청 URL:`, url);
|
||||
// 배치 조회 API 사용
|
||||
const response = await apiClient.post(
|
||||
"/multilang/batch",
|
||||
{
|
||||
langKeys: [langKey],
|
||||
},
|
||||
{
|
||||
params: {
|
||||
companyCode,
|
||||
menuCode,
|
||||
userLang,
|
||||
},
|
||||
},
|
||||
);
|
||||
|
||||
const response = await apiClient.get(url);
|
||||
console.log(`📡 배치 API 응답 상태:`, response.status, response.statusText);
|
||||
|
||||
console.log(`📡 API 응답 상태:`, response.status, response.statusText);
|
||||
|
||||
if (response.data.success && response.data.data) {
|
||||
// 개별 번역 텍스트를 캐시에 저장
|
||||
if (response.data.success && response.data.data && response.data.data[langKey]) {
|
||||
// 번역 텍스트를 캐시에 저장
|
||||
const cacheKey = `${menuCode}.${langKey}`;
|
||||
const currentCache = (window as any).__TRANSLATION_CACHE || {};
|
||||
currentCache[cacheKey] = response.data.data;
|
||||
currentCache[cacheKey] = response.data.data[langKey];
|
||||
(window as any).__TRANSLATION_CACHE = currentCache;
|
||||
|
||||
return response.data.data;
|
||||
return response.data.data[langKey];
|
||||
}
|
||||
|
||||
// 실패 시 fallback 또는 키 반환
|
||||
console.log(`🔄 API 성공했지만 데이터 없음, fallback 반환:`, fallback || langKey);
|
||||
console.log(`🔄 배치 API 성공했지만 데이터 없음, fallback 반환:`, fallback || langKey);
|
||||
return fallback || langKey;
|
||||
} catch (error) {
|
||||
console.error("❌ 다국어 텍스트 조회 실패:", error);
|
||||
console.error("❌ 다국어 텍스트 배치 조회 실패:", error);
|
||||
console.log(`🔄 에러 시 fallback 반환:`, fallback || langKey);
|
||||
return fallback || langKey;
|
||||
}
|
||||
};
|
||||
|
||||
// 언어 변경
|
||||
const changeLang = (newLang: string) => {
|
||||
setUserLang(newLang);
|
||||
globalUserLang = newLang;
|
||||
const changeLang = async (newLang: string) => {
|
||||
try {
|
||||
// 백엔드에 사용자 로케일 설정 요청
|
||||
const response = await apiClient.post("/admin/user-locale", {
|
||||
locale: newLang,
|
||||
});
|
||||
|
||||
if (response.data.success) {
|
||||
setUserLang(newLang);
|
||||
globalUserLang = newLang;
|
||||
console.log("✅ 사용자 로케일 변경 성공:", newLang);
|
||||
} else {
|
||||
console.error("❌ 사용자 로케일 변경 실패:", response.data.message);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("❌ 사용자 로케일 변경 중 오류:", error);
|
||||
// 오류 시에도 로컬 상태는 변경
|
||||
setUserLang(newLang);
|
||||
globalUserLang = newLang;
|
||||
}
|
||||
};
|
||||
|
||||
// 전역 언어 상태 접근자
|
||||
@@ -142,4 +151,4 @@ export function useMultiLang(options: UseMultiLangOptions = {}) {
|
||||
getGlobalUserLang,
|
||||
setGlobalChangeLangCallback,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user