52 lines
2.5 KiB
TypeScript
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,
|
|
};
|
|
}
|