0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-01-27 22:49:56 -05:00

Handled serialisation for settings data

refs https://github.com/TryGhost/Team/issues/3151

Some settings, like twitter and facebook urls, need transformation on save and read as the value shown to user is shown as the full URL while we save only the username for their facebook and twitter accounts.

This change adds a pattern for handling special (de)serialisation for setting keys.
This commit is contained in:
Rishabh 2023-06-01 22:58:45 +05:30
parent f4f891b035
commit 81c57fd724

View file

@ -19,6 +19,63 @@ const SettingsContext = createContext<SettingsContextProps>({
saveSettings: async () => {}
});
function serialiseSettingsData(settings: Setting[]): Setting[] {
return settings.map((setting) => {
if (setting.key === 'facebook' && setting.value) {
const value = setting.value as string;
let [, user] = value.match(/(\S+)/) || [];
return {
key: setting.key,
value: `https://www.facebook.com/${user}`
};
}
if (setting.key === 'twitter' && setting.value) {
const value = setting.value as string;
let [, user] = value.match(/@?([^/]*)/) || [];
return {
key: setting.key,
value: `https://twitter.com/${user}`
};
}
return {
key: setting.key,
value: setting.value
};
});
}
function deserializeSettings(settings: Setting[]): Setting[] {
return settings.map((setting) => {
if (setting.key === 'facebook' && setting.value) {
const deserialized = setting.value as string;
let [, user] = deserialized.match(/(?:https:\/\/)(?:www\.)(?:facebook\.com)\/(?:#!\/)?(\w+\/?\S+)/mi) || [];
return {
key: setting.key,
value: user
};
}
if (setting.key === 'twitter' && setting.value) {
const deserialized = setting.value as string;
let [, user] = deserialized.match(/(?:https:\/\/)(?:twitter\.com)\/(?:#!\/)?@?([^/]*)/) || [];
return {
key: setting.key,
value: `@${user}`
};
}
return {
key: setting.key,
value: setting.value
};
});
}
// Create a Settings Provider component
const SettingsProvider: React.FC<SettingsProviderProps> = ({children}) => {
const {api} = useContext(ServicesContext);
@ -31,7 +88,8 @@ const SettingsProvider: React.FC<SettingsProviderProps> = ({children}) => {
// Make an API call to fetch the settings
const data = await api.settings.browse();
const siteDataRes = await api.site.browse();
setSettings(data.settings);
setSettings(serialiseSettingsData(data.settings));
setSiteData(siteDataRes.site);
} catch (error) {
// Log error in settings API
@ -44,10 +102,12 @@ const SettingsProvider: React.FC<SettingsProviderProps> = ({children}) => {
const saveSettings = useCallback(async (updatedSettings: Setting[]): Promise<void> => {
try {
// handle transformation for settings before save
updatedSettings = deserializeSettings(updatedSettings);
// Make an API call to save the updated settings
const data = await api.settings.edit(updatedSettings);
setSettings(data.settings);
setSettings(serialiseSettingsData(data.settings));
} catch (error) {
// Log error in settings API
}