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:
parent
f4f891b035
commit
81c57fd724
1 changed files with 62 additions and 2 deletions
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue