/**
|
* 案件数据全局Context
|
* 提供案件数据的全局状态管理和localStorage持久化
|
*/
|
|
import React, { createContext, useContext, useState, useEffect } from 'react';
|
import { message } from 'antd';
|
import ProcessAPIService from '../services/ProcessAPIService';
|
import { getMergedParams } from '../utils/urlParams';
|
|
// 创建Context
|
const CaseDataContext = createContext(null);
|
|
// localStorage键名
|
const STORAGE_KEY = 'case_data_timeline';
|
|
/**
|
* CaseDataProvider组件
|
* 包裹需要访问案件数据的组件树
|
*/
|
export const CaseDataProvider = ({ children }) => {
|
const [caseData, setCaseData] = useState(null);
|
const [loading, setLoading] = useState(false);
|
const [error, setError] = useState(null);
|
|
/**
|
* 从localStorage读取数据
|
*/
|
const loadFromStorage = () => {
|
try {
|
const stored = localStorage.getItem(STORAGE_KEY);
|
if (stored) {
|
return JSON.parse(stored);
|
}
|
} catch (err) {
|
console.error('Failed to load data from localStorage:', err);
|
}
|
return null;
|
};
|
|
/**
|
* 保存数据到localStorage
|
*/
|
const saveToStorage = (data) => {
|
try {
|
localStorage.setItem(STORAGE_KEY, JSON.stringify(data));
|
} catch (err) {
|
console.error('Failed to save data to localStorage:', err);
|
}
|
};
|
|
/**
|
* 加载案件数据
|
*/
|
const loadCaseData = async (forceRefresh = false) => {
|
// 如果不是强制刷新,先尝试从localStorage读取
|
if (!forceRefresh) {
|
const cachedData = loadFromStorage();
|
if (cachedData) {
|
setCaseData(cachedData);
|
console.log('Loaded case data from localStorage');
|
}
|
}
|
|
setLoading(true);
|
setError(null);
|
|
try {
|
// 获取URL参数(合并默认值)
|
const params = getMergedParams();
|
|
console.log('Loading case data with params:', params);
|
|
// 调用API获取数据
|
const response = await ProcessAPIService.getCaseProcessInfo(
|
params.caseId,
|
{
|
caseTypeFirst: params.caseTypeFirst,
|
platform_code: params.platform_code
|
}
|
);
|
|
// 提取timeline数据
|
const timelineData = response.timeline || response.data?.timeline || response;
|
|
// 更新状态
|
setCaseData(timelineData);
|
|
// 保存到localStorage
|
saveToStorage(timelineData);
|
|
console.log('Case data loaded successfully:', timelineData);
|
} catch (err) {
|
console.error('Failed to load case data:', err);
|
setError(err.message || '加载案件数据失败');
|
|
// 显示错误提示
|
message.error('加载案件数据失败,请稍后重试');
|
|
// 如果localStorage有数据,尝试使用缓存
|
const cachedData = loadFromStorage();
|
if (cachedData && !forceRefresh) {
|
message.warning('已加载历史数据');
|
setCaseData(cachedData);
|
}
|
} finally {
|
setLoading(false);
|
}
|
};
|
|
/**
|
* 刷新数据(强制从API获取)
|
*/
|
const refreshData = () => {
|
loadCaseData(true);
|
};
|
|
/**
|
* 组件挂载时加载数据
|
*/
|
useEffect(() => {
|
loadCaseData();
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
}, []); // 只在挂载时执行一次
|
|
// 提供的值
|
const value = {
|
caseData,
|
loading,
|
error,
|
refreshData,
|
loadCaseData
|
};
|
|
return (
|
<CaseDataContext.Provider value={value}>
|
{children}
|
</CaseDataContext.Provider>
|
);
|
};
|
|
/**
|
* 自定义Hook:使用案件数据
|
* @returns {Object} { caseData, loading, error, refreshData, loadCaseData }
|
*/
|
export const useCaseData = () => {
|
const context = useContext(CaseDataContext);
|
|
if (!context) {
|
throw new Error('useCaseData must be used within CaseDataProvider');
|
}
|
|
return context;
|
};
|
|
export default CaseDataContext;
|