SPMS_WEB/react/src/hooks/useShake.ts
SEAN 9db9d87dea feat: 서비스 관리 페이지 구현 (#14)
- 서비스 목록 페이지 (검색/필터/페이지네이션, 행 클릭 → 상세)
- 서비스 상세 페이지 (헤더카드/통계/플랫폼 관리 모달)
- 서비스 등록 페이지 (서비스명/플랫폼 선택/설명/관련링크)
- 서비스 수정 페이지 (상태 토글/메타정보/저장 확인 모달)
- 공통 훅 추출 (useShake, useBreadcrumbBack)
- 브레드크럼 동적 경로 지원 (/services/:id, /services/:id/edit)
- 인증 페이지 useShake 공통 훅 리팩터링

Closes #14
2026-02-27 13:53:56 +09:00

25 lines
831 B
TypeScript

import { useState, useCallback } from "react";
/**
* 필드 에러 시 shake 애니메이션을 트리거하는 공통 훅.
* - `shaking` : 현재 흔들리고 있는 필드 이름 Set
* - `triggerShake` : 필드 이름 배열을 받아 0.4초 동안 shake 활성화
* - `cls` : 필드 이름을 받아 "animate-shake" 또는 "" 반환 (className에 바로 사용)
*/
export default function useShake() {
const [shaking, setShaking] = useState<Set<string>>(new Set());
const triggerShake = useCallback((fields: string[]) => {
setShaking(new Set(fields));
setTimeout(() => setShaking(new Set()), 400);
}, []);
/** className 헬퍼 */
const cls = useCallback(
(field: string) => (shaking.has(field) ? "animate-shake" : ""),
[shaking],
);
return { shaking, triggerShake, cls } as const;
}