2024-05-22 08:13:36 -04:00
|
|
|
import _ from 'lodash';
|
2024-05-27 22:16:53 -04:00
|
|
|
import { UserPreferencesUpdateDto } from 'src/dtos/user-preferences.dto';
|
2025-04-28 09:54:51 -04:00
|
|
|
import { UserMetadataKey } from 'src/enum';
|
2025-04-09 11:45:30 -04:00
|
|
|
import { DeepPartial, UserMetadataItem, UserPreferences } from 'src/types';
|
|
|
|
|
import { HumanReadableSize } from 'src/utils/bytes';
|
2024-05-22 08:13:36 -04:00
|
|
|
import { getKeysDeep } from 'src/utils/misc';
|
|
|
|
|
|
2025-04-28 09:54:51 -04:00
|
|
|
const getDefaultPreferences = (): UserPreferences => {
|
2025-04-09 11:45:30 -04:00
|
|
|
return {
|
|
|
|
|
folders: {
|
|
|
|
|
enabled: false,
|
|
|
|
|
sidebarWeb: false,
|
|
|
|
|
},
|
|
|
|
|
memories: {
|
|
|
|
|
enabled: true,
|
|
|
|
|
},
|
|
|
|
|
people: {
|
|
|
|
|
enabled: true,
|
|
|
|
|
sidebarWeb: false,
|
|
|
|
|
},
|
|
|
|
|
sharedLinks: {
|
|
|
|
|
enabled: true,
|
|
|
|
|
sidebarWeb: false,
|
|
|
|
|
},
|
|
|
|
|
ratings: {
|
|
|
|
|
enabled: false,
|
|
|
|
|
},
|
|
|
|
|
tags: {
|
|
|
|
|
enabled: false,
|
|
|
|
|
sidebarWeb: false,
|
|
|
|
|
},
|
|
|
|
|
emailNotifications: {
|
|
|
|
|
enabled: true,
|
|
|
|
|
albumInvite: true,
|
|
|
|
|
albumUpdate: true,
|
|
|
|
|
},
|
|
|
|
|
download: {
|
|
|
|
|
archiveSize: HumanReadableSize.GiB * 4,
|
|
|
|
|
includeEmbeddedVideos: false,
|
|
|
|
|
},
|
|
|
|
|
purchase: {
|
|
|
|
|
showSupportBadge: true,
|
|
|
|
|
hideBuyButtonUntil: new Date(2022, 1, 12).toISOString(),
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
2025-04-28 09:54:51 -04:00
|
|
|
export const getPreferences = (metadata: UserMetadataItem[]): UserPreferences => {
|
|
|
|
|
const preferences = getDefaultPreferences();
|
2025-02-12 15:23:08 -05:00
|
|
|
const item = metadata.find(({ key }) => key === UserMetadataKey.PREFERENCES);
|
2024-05-22 08:13:36 -04:00
|
|
|
const partial = item?.value || {};
|
|
|
|
|
for (const property of getKeysDeep(partial)) {
|
|
|
|
|
_.set(preferences, property, _.get(partial, property));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return preferences;
|
|
|
|
|
};
|
|
|
|
|
|
2025-04-28 09:54:51 -04:00
|
|
|
export const getPreferencesPartial = (newPreferences: UserPreferences) => {
|
|
|
|
|
const defaultPreferences = getDefaultPreferences();
|
2024-05-22 08:13:36 -04:00
|
|
|
const partial: DeepPartial<UserPreferences> = {};
|
|
|
|
|
for (const property of getKeysDeep(defaultPreferences)) {
|
|
|
|
|
const newValue = _.get(newPreferences, property);
|
|
|
|
|
const isEmpty = newValue === undefined || newValue === null || newValue === '';
|
|
|
|
|
const defaultValue = _.get(defaultPreferences, property);
|
|
|
|
|
const isEqual = newValue === defaultValue || _.isEqual(newValue, defaultValue);
|
|
|
|
|
|
|
|
|
|
if (isEmpty || isEqual) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_.set(partial, property, newValue);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return partial;
|
|
|
|
|
};
|
2024-05-27 22:16:53 -04:00
|
|
|
|
2025-02-12 15:23:08 -05:00
|
|
|
export const mergePreferences = (preferences: UserPreferences, dto: UserPreferencesUpdateDto) => {
|
2024-05-27 22:16:53 -04:00
|
|
|
for (const key of getKeysDeep(dto)) {
|
|
|
|
|
_.set(preferences, key, _.get(dto, key));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return preferences;
|
|
|
|
|
};
|