aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files/src/store/viewConfig.ts
blob: a902cedb6fa65917cb51ad2ff4a1ed27f4b3fae8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/**
 * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
 * SPDX-License-Identifier: AGPL-3.0-or-later
 */
import type { ViewConfigs, ViewId, ViewConfig } from '../types'

import { getCurrentUser } from '@nextcloud/auth'
import { emit, subscribe } from '@nextcloud/event-bus'
import { loadState } from '@nextcloud/initial-state'
import { generateUrl } from '@nextcloud/router'
import { defineStore } from 'pinia'
import { ref, set } from 'vue'
import axios from '@nextcloud/axios'

const initialViewConfig = loadState('files', 'viewConfigs', {}) as ViewConfigs

export const useViewConfigStore = defineStore('viewconfig', () => {

	const viewConfigs = ref({ ...initialViewConfig })

	/**
	 * Get the config for a specific view
	 * @param viewid Id of the view to fet the config for
	 */
	function getConfig(viewid: ViewId): ViewConfig {
		return viewConfigs.value[viewid] || {}
	}

	/**
	 * Update the view config local store
	 * @param viewId The id of the view to update
	 * @param key The config key to update
	 * @param value The new value
	 */
	function onUpdate(viewId: ViewId, key: string, value: string | number | boolean): void {
		if (!(viewId in viewConfigs.value)) {
			set(viewConfigs.value, viewId, {})
		}
		set(viewConfigs.value[viewId], key, value)
	}

	/**
	 * Update the view config local store AND on server side
	 * @param view Id of the view to update
	 * @param key Config key to update
	 * @param value New value
	 */
	async function update(view: ViewId, key: string, value: string | number | boolean): Promise<void> {
		if (getCurrentUser() !== null) {
			await axios.put(generateUrl('/apps/files/api/v1/views'), {
				value,
				view,
				key,
			})
		}

		emit('files:view-config:updated', { view, key, value })
	}

	/**
	 * Set the sorting key AND sort by ASC
	 * The key param must be a valid key of a File object
	 * If not found, will be searched within the File attributes
	 * @param key Key to sort by
	 * @param view View to set the sorting key for
	 */
	function setSortingBy(key = 'basename', view = 'files'): void {
		// Save new config
		update(view, 'sorting_mode', key)
		update(view, 'sorting_direction', 'asc')
	}

	/**
	 * Toggle the sorting direction
	 * @param viewId id of the view to set the sorting order for
	 */
	function toggleSortingDirection(viewId = 'files'): void {
		const config = viewConfigs.value[viewId] || { sorting_direction: 'asc' }
		const newDirection = config.sorting_direction === 'asc' ? 'desc' : 'asc'

		// Save new config
		update(viewId, 'sorting_direction', newDirection)
	}

	// Initialize event listener
	subscribe('files:view-config:updated', ({ view, key, value }) => onUpdate(view, key, value))

	return {
		viewConfigs,

		getConfig,
		setSortingBy,
		toggleSortingDirection,
		update,
	}
})