diff options
Diffstat (limited to 'apps/settings/src/utils/appDiscoverParser.ts')
-rw-r--r-- | apps/settings/src/utils/appDiscoverParser.ts | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/apps/settings/src/utils/appDiscoverParser.ts b/apps/settings/src/utils/appDiscoverParser.ts new file mode 100644 index 00000000000..1be44f01068 --- /dev/null +++ b/apps/settings/src/utils/appDiscoverParser.ts @@ -0,0 +1,48 @@ +/** + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import type { IAppDiscoverCarousel, IAppDiscoverElement, IAppDiscoverElements, IAppDiscoverPost, IAppDiscoverShowcase } from '../constants/AppDiscoverTypes.ts' + +/** + * Helper to transform the JSON API results to proper frontend objects (app discover section elements) + * + * @param element The JSON API element to transform + */ +export const parseApiResponse = (element: Record<string, unknown>): IAppDiscoverElements => { + const appElement = { ...element } + if (appElement.date) { + appElement.date = Date.parse(appElement.date as string) + } + if (appElement.expiryDate) { + appElement.expiryDate = Date.parse(appElement.expiryDate as string) + } + + if (appElement.type === 'post') { + return appElement as unknown as IAppDiscoverPost + } else if (appElement.type === 'showcase') { + return appElement as unknown as IAppDiscoverShowcase + } else if (appElement.type === 'carousel') { + return appElement as unknown as IAppDiscoverCarousel + } + throw new Error(`Invalid argument, app discover element with type ${element.type ?? 'unknown'} is unknown`) +} + +/** + * Filter outdated or upcoming elements + * @param element Element to check + */ +export const filterElements = (element: IAppDiscoverElement) => { + const now = Date.now() + // Element not yet published + if (element.date && element.date > now) { + return false + } + + // Element expired + if (element.expiryDate && element.expiryDate < now) { + return false + } + return true +} |