[251025] feat: usePanelHistory

🕐 커밋 시간: 2025. 10. 25. 05:33:22

📊 변경 통계:
  • 총 파일: 8개
  • 추가: +83줄
  • 삭제: -217줄

📁 추가된 파일:
  + com.twin.app.shoptime/src/actions/panelHistoryActions.js
  + com.twin.app.shoptime/src/hooks/usePanelHistory/index.js
  + com.twin.app.shoptime/src/hooks/usePanelHistory/usePanelHistory.js
  + com.twin.app.shoptime/src/middleware/panelHistoryMiddleware.js
  + com.twin.app.shoptime/src/reducers/panelHistoryReducer.js

📝 수정된 파일:
  ~ com.twin.app.shoptime/package-lock.json
  ~ com.twin.app.shoptime/src/actions/actionTypes.js
  ~ com.twin.app.shoptime/src/store/store.js

🔧 함수 변경 내용:
  📄 com.twin.app.shoptime/src/reducers/panelHistoryReducer.js (javascript):
     Added: enqueuePanel()

🔧 주요 변경 내용:
  • 타입 시스템 안정성 강화
  • 핵심 비즈니스 로직 개선

Performance: 코드 최적화로 성능 개선 기대
This commit is contained in:
2025-10-25 05:33:22 +00:00
parent f03e78932c
commit d09a59a86e
8 changed files with 555 additions and 222 deletions

View File

@@ -0,0 +1,83 @@
/**
* src/middleware/panelHistoryMiddleware.js
* Panel history 자동 추적 middleware
*
* Panel action (PUSH, POP, UPDATE, RESET)을 감지하고
* 자동으로 panel history에 기록합니다.
*/
import { types } from '../actions/actionTypes';
import { enqueuePanelHistory, clearPanelHistory } from '../actions/panelHistoryActions';
/**
* Panel history middleware
* 모든 panel action을 감지하여 panelHistory reducer로 자동 기록
*
* @param {Object} store - Redux store
* @returns {Function} middleware function
*/
export const panelHistoryMiddleware = (store) => (next) => (action) => {
// 원래 액션 실행
const result = next(action);
// Panel action 후 history 업데이트
const state = store.getState();
const panels = state.panels?.panels || [];
try {
switch (action.type) {
// PUSH_PANEL: 새 panel 추가
case types.PUSH_PANEL: {
if (action.payload) {
const { name: panelName, panelInfo = {} } = action.payload;
if (panelName) {
store.dispatch(enqueuePanelHistory(panelName, panelInfo, 'PUSH'));
}
}
break;
}
// POP_PANEL: panel 제거 후 이전 panel 기록
case types.POP_PANEL: {
// POP 후 top panel을 기록 (이전 패널로 돌아감)
if (panels.length > 0) {
const topPanel = panels[panels.length - 1];
if (topPanel && topPanel.name) {
store.dispatch(enqueuePanelHistory(topPanel.name, topPanel.panelInfo || {}, 'POP'));
}
}
break;
}
// UPDATE_PANEL: panel 정보 업데이트 기록
case types.UPDATE_PANEL: {
if (action.payload) {
const { name: panelName, panelInfo = {} } = action.payload;
if (panelName) {
store.dispatch(enqueuePanelHistory(panelName, panelInfo, 'UPDATE'));
}
}
break;
}
// RESET_PANELS: 히스토리 초기화
case types.RESET_PANELS: {
store.dispatch(clearPanelHistory());
break;
}
default:
// Other actions are ignored
break;
}
} catch (error) {
console.error('[panelHistoryMiddleware] 오류:', error);
// Middleware 오류가 앱 전체에 영향 주지 않도록 처리
}
return result;
};
export default panelHistoryMiddleware;