File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
'use client';
import { useRouter } from 'next/navigation';
import { FoxButton } from '@fox/core/components/fox-button';
import { FoxButtonGroup } from '@fox/core/components/fox-button-group';
import { useBlockingAction } from '@/app/_hooks/use-blocking-action';
import { useFeedback } from '@/app/_hooks/use-feedback';
import type { MerchantDetailSummary } from '@/lib/domain/merchant-detail';
import { merchantDetailPath } from '@/lib/domain/merchant-detail-query';
import {
deleteMerchantDetailAction,
updateMerchantDetailVisibilityAction,
} from '../_actions';
interface MerchantDetailRowActionsProps {
row: MerchantDetailSummary;
}
/**
* 기획 BO-MAL-001 관리 열 — [수정] [비활성|노출] [삭제]. 상세가 없는 가맹점은 [상세 등록]
* 하나뿐이다(상세는 기존 가맹점에만 붙는다 — 사용자 확정).
*/
export function MerchantDetailRowActions({ row }: MerchantDetailRowActionsProps) {
const router = useRouter();
const { showAlert, hideAlert, showToast } = useFeedback();
const [isBusy, startAction] = useBlockingAction();
function toggleVisibility() {
const next = row.isVisible === false;
startAction(async () => {
const result = await updateMerchantDetailVisibilityAction(row.id, next);
showToast(
result.status === 'error'
? { variant: 'danger', message: result.message }
: { variant: 'success', message: next ? '노출로 바꿨습니다.' : '비활성으로 바꿨습니다.' }
);
});
}
function runDelete() {
hideAlert();
startAction(async () => {
const result = await deleteMerchantDetailAction(row.id);
showToast(
result.status === 'error'
? { variant: 'danger', message: result.message }
: { variant: 'success', message: '삭제했습니다.' }
);
});
}
function confirmDelete() {
showAlert({
variant: 'danger',
title: '가맹몰 상세를 삭제하시겠습니까?',
message: `"${row.name}"의 상세 정보를 삭제합니다. 삭제 후에는 되돌릴 수 없습니다.`,
actions: (
<FoxButtonGroup size="md">
<FoxButton type="default" size="md" label="취소" onAction={hideAlert} />
<FoxButton type="primary" size="md" label="삭제" onAction={runDelete} />
</FoxButtonGroup>
),
});
}
if (!row.hasDetail) {
return (
<FoxButtonGroup size="sm" align="center">
<FoxButton
type="secondary"
size="sm"
label="상세 등록"
onAction={() => router.push(merchantDetailPath(row.id))}
/>
</FoxButtonGroup>
);
}
return (
<FoxButtonGroup size="sm" align="center">
<FoxButton
type="default"
size="sm"
label="수정"
onAction={() => router.push(merchantDetailPath(row.id))}
/>
<FoxButton
type="default"
size="sm"
label={row.isVisible === false ? '노출' : '비활성'}
disabled={isBusy}
onAction={toggleVisibility}
/>
<FoxButton
type="default"
size="sm"
label="삭제"
disabled={isBusy}
onAction={confirmDelete}
/>
</FoxButtonGroup>
);
}