사용자 삭제 기능 추가

- 헤더 오른쪽 버튼 시스템 구현
  - ContextType에 setOnRightClick 추가
  - useSetOnRightClick 훅 추가
  - HeaderNavigationProps에 onRightClick 추가
  - HeaderType.LeftArrow에 오른쪽 삭제 버튼 렌더링

- 사용자 삭제 API 및 타입 추가
  - UserDeleteParams, UserDeleteResponse 인터페이스 추가
  - use-user-delete-mutation 훅 생성
  - API_URL_USER.deleteUser() 엔드포인트 사용

- 사용자 설정 페이지에서 삭제 기능 구현
  - 현재 로그인한 사용자가 아닐 경우에만 삭제 버튼 표시
  - showConfirm 다이얼로그로 삭제 확인
  - 삭제 성공 시 토스트 메시지 표시 및 목록 페이지로 이동
  - 목록 페이지에서 refresh 상태로 자동 갱신

- showConfirm 위젯 추가
  - Promise 기반의 확인 다이얼로그
  - 취소/확인 버튼 지원
  - 다국어 지원 (common.cancel, common.confirm)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Jay Sheen
2025-11-14 18:22:22 +09:00
parent c6d22e9856
commit f7db3236e8
9 changed files with 188 additions and 13 deletions

View File

@@ -0,0 +1,65 @@
import axios from 'axios';
import { API_URL_USER } from '@/shared/api/api-url-user';
import { NiceAxiosError } from '@/shared/@types/error';
import {
UserDeleteParams,
UserDeleteResponse
} from '../model/types';
interface UserDeleteMutationResponse {
status: boolean;
data?: UserDeleteResponse;
error?: {
root: string;
errKey: string;
code: string;
message: string;
timestamp: string;
details: Record<string, string>;
};
}
import {
useMutation,
UseMutationOptions
} from '@tanstack/react-query';
import { getHeaderUserAgent } from '@/shared/constants/url';
export const userDelete = async (params: UserDeleteParams): Promise<UserDeleteMutationResponse> => {
let headerOptions = {
menuId: 45,
apiType: 'DELETE'
};
let options = {
headers: {
'X-User-Agent': getHeaderUserAgent(headerOptions)
}
};
try {
const response = await axios.post<UserDeleteResponse>(API_URL_USER.deleteUser(), params, options);
return { status: true, data: response.data };
} catch (error: any) {
return {
status: false,
error: {
root: 'USER_DELETE',
errKey: error.response?.data?.errKey || 'UNKNOWN_ERROR',
code: error.response?.status?.toString() || '500',
message: error.response?.data?.message || error.message || 'Unknown error',
timestamp: new Date().toISOString(),
details: error.response?.data?.details || {}
}
};
}
};
export const useUserDeleteMutation = (options?: UseMutationOptions<UserDeleteMutationResponse, NiceAxiosError, UserDeleteParams>) => {
const mutation = useMutation<UserDeleteMutationResponse, NiceAxiosError, UserDeleteParams>({
...options,
mutationFn: (params: UserDeleteParams) => userDelete(params),
});
return {
...mutation,
};
};

View File

@@ -219,6 +219,16 @@ export interface UserCreateResponse {
user: UserData;
};
export interface UserDeleteParams {
mid: string;
usrid: string;
};
export interface UserDeleteResponse {
status: boolean;
error?: ErrorResponse;
};
export interface AuthMethodItem {
usrid: string;
systemAdminClassId: string;