aboutsummaryrefslogtreecommitdiffstats
path: root/apps/settings/src/utils/appDiscoverParser.ts
diff options
context:
space:
mode:
Diffstat (limited to 'apps/settings/src/utils/appDiscoverParser.ts')
-rw-r--r--apps/settings/src/utils/appDiscoverParser.ts48
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
+}