pgadmin4/web/pgadmin/settings/static/ApplicationStateProvider.jsx

118 lines
3.9 KiB
JavaScript

/////////////////////////////////////////////////////////////
//
// pgAdmin 4 - PostgreSQL Tools
//
// Copyright (C) 2013 - 2025, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
import React, { useContext, useMemo } from 'react';
import PropTypes from 'prop-types';
import getApiInstance from '../../static/js/api_instance';
import url_for from 'sources/url_for';
import { getBrowser } from '../../static/js/utils';
import usePreferences from '../../preferences/static/js/store';
import pgAdmin from 'sources/pgadmin';
import { TOOLS_SUPPORTING_RESTORE } from '../../browser/static/js/constants';
import gettext from 'sources/gettext';
const ApplicationStateContext = React.createContext();
export const useApplicationState = ()=>useContext(ApplicationStateContext);
export function ApplicationStateProvider({children}){
const preferencesStore = usePreferences();
const saveAppState = preferencesStore?.getPreferencesForModule('misc')?.save_app_state;
const openNewTab = preferencesStore?.getPreferencesForModule('browser')?.new_browser_tab_open;
const saveToolData = (toolName, connectionInfo, transId, toolData) =>{
let data = {
'tool_name': toolName,
'connection_info': connectionInfo,
'trans_id': transId,
'tool_data': toolData
};
getApiInstance({'Content-Encoding': 'gzip'}).post(
url_for('settings.save_application_state'),
JSON.stringify(data),
).catch((error)=>{console.error(error);});
};
const isSaveToolDataEnabled = (toolName)=>{
let toolMapping = {'sqleditor': 'qt', 'schema_diff': 'schema_diff', 'psql': 'psql_tool', 'ERD': 'erd_tool'};
if(openNewTab?.includes(toolMapping[toolName])){
return saveAppState && getBrowser().name == 'Electron';
}
return saveAppState;
};
async function getToolContent(transId) {
try {
const res = await getApiInstance({'Content-Encoding': 'gzip'}).get(
url_for('settings.get_tool_data', {
'trans_id': transId,
})
);
if (!res?.data?.success) {
console.warn('Unable to retrieve tool content.');
return null;
}
const toolData = res.data.data.result;
const connectionInfo = toolData?.connection_info;
const toolContent = JSON.parse(toolData.tool_data);
let loadFile = false;
let fileName = null;
if(connectionInfo?.open_file_name){
fileName = connectionInfo.open_file_name;
if(connectionInfo.is_editor_dirty){
if(connectionInfo.external_file_changes){
// file has external chages
return {loadFile: loadFile, fileName: fileName, data: toolContent, modifiedExternally: true};
}
}else if(connectionInfo.file_deleted){
return {loadFile: loadFile, fileName: null, data: toolContent};
}else{
loadFile = true;
return {loadFile: loadFile, fileName: fileName, data: null};
}
}
return {loadFile: loadFile, fileName: fileName, data: toolContent};
} catch (error) {
let errorMsg = gettext(error?.response?.data?.errormsg || error);
console.warn(errorMsg);
return null;
}
}
const deleteToolData = (panelId)=>{
if (saveAppState && TOOLS_SUPPORTING_RESTORE.includes(panelId.split('_')[0])){
getApiInstance().delete(
url_for('settings.delete_application_state'), {data:{'panelId': panelId}}
).then(()=> { /* Sonar Qube */}).catch(function(error) {
pgAdmin.Browser.notifier.pgRespErrorNotify(error);
});
}
};
const value = useMemo(()=>({
saveToolData,
isSaveToolDataEnabled,
deleteToolData,
getToolContent
}), []);
return <ApplicationStateContext.Provider value={value}>
{children}
</ApplicationStateContext.Provider>;
}
ApplicationStateProvider.propTypes = {
children: PropTypes.object,
};