o2o-negosium-original/negodata/front/src/features/settings/useCompanySettings.ts

52 lines
2.5 KiB
TypeScript

import { useQueryClient } from '@tanstack/react-query';
import { useGetSettings, updateSettings, getGetSettingsQueryKey } from '@/api/generated/company-settings/company-settings';
import { LABEL_DEFAULTS, DEFAULT_VAT_MODE, type CompanySettings, type VatMode } from './catalog';
// 회사 커스터마이징 설정 조회 + 저장.
// 조회는 전 유저(브랜딩/라벨 렌더용), 저장은 백엔드가 OWNER 로 게이트한다.
export function useCompanySettings() {
const queryClient = useQueryClient();
const query = useGetSettings({ query: { staleTime: 5 * 60 * 1000 } });
const settings: CompanySettings = (query.data?.settings as CompanySettings) ?? {};
const save = async (next: CompanySettings) => {
const res = await updateSettings({ settings: next as Record<string, unknown> });
if (res.result?.success === false) throw new Error(res.result.desc || '설정 저장에 실패했습니다.');
await queryClient.invalidateQueries({ queryKey: getGetSettingsQueryKey() });
};
return { settings, isLoading: query.isLoading, save };
}
// 용어 라벨 헬퍼. label('item.price') → 회사 설정 용어, 없으면 카탈로그 기본값.
export function useLabels() {
const { settings } = useCompanySettings();
const overrides = settings.labels ?? {};
return (key: string): string => overrides[key] || LABEL_DEFAULTS[key] || key;
}
// 숨김필드 헬퍼. isHidden('made_in') → 이 회사에서 감출 필드인지.
// 부가세 전체 통일(features.vat_mode) 회사는 상품별 VAT 입력이 무의미하므로 vat_yn 을 숨김으로 친다 —
// 상품 폼·엑셀 양식·데이터 내보내기가 이 헬퍼 하나를 읽어 함께 사라진다.
export function useHiddenFields() {
const { settings } = useCompanySettings();
const hidden = settings.hidden_fields ?? [];
const vatUnified = settings.features?.vat_mode === 'unified_excluded';
return (key: string): boolean => hidden.includes(key) || (vatUnified && key === 'vat_yn');
}
// 부가세 관리 모드 헬퍼. 미설정이면 상품별(per_item).
export function useVatMode(): VatMode {
const { settings } = useCompanySettings();
return settings.features?.vat_mode ?? DEFAULT_VAT_MODE;
}
// 브랜딩 헬퍼. 서비스명·로고 — 미설정 시 기본 브랜드(NegoData). 색은 회사별 커스텀 없이 솔루션 고정.
export function useBranding() {
const { settings } = useCompanySettings();
return {
serviceName: settings.branding?.service_name || 'NegoData',
logoUrl: settings.branding?.logo_url || null,
};
}