-
-
Notifications
You must be signed in to change notification settings - Fork 424
Expand file tree
/
Copy pathusePackageSelection.ts
More file actions
77 lines (66 loc) · 2.08 KB
/
usePackageSelection.ts
File metadata and controls
77 lines (66 loc) · 2.08 KB
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
export const MAX_PACKAGE_SELECTION = 10
export function usePackageSelection() {
const selectedPackagesParam = useRouteQuery<string>('selection', '', { mode: 'replace' })
const showSelectionViewParam = useRouteQuery<string>('view', '', { mode: 'push' })
// Parse URL param into array of package names
const selectedPackages = computed<string[]>({
get() {
const raw = selectedPackagesParam.value
if (!raw) return []
return raw
.split(',')
.map(p => p.trim())
.filter(Boolean)
.slice(0, MAX_PACKAGE_SELECTION)
},
set(pkgs: string[]) {
// Ensure all items are strings before joining
const validPkgs = (Array.isArray(pkgs) ? pkgs : []).map(p => p.trim()).filter(Boolean)
selectedPackagesParam.value = validPkgs.length > 0 ? validPkgs.join(',') : ''
},
})
const canSelectMore = computed(() => selectedPackages.value.length < MAX_PACKAGE_SELECTION)
const showSelectionView = computed<boolean>({
get() {
return showSelectionViewParam.value === 'selection'
},
set(isOpen: boolean) {
showSelectionViewParam.value = isOpen ? 'selection' : ''
},
})
function closeSelectionView() {
showSelectionView.value = false
}
function isPackageSelected(packageName: string): boolean {
return selectedPackages.value.includes(packageName.trim())
}
function togglePackageSelection(packageName: string) {
const safeName = packageName.trim()
if (!safeName) return
const pkgs = [...selectedPackages.value]
const idx = pkgs.indexOf(safeName)
if (idx !== -1) {
pkgs.splice(idx, 1)
} else {
if (pkgs.length < MAX_PACKAGE_SELECTION) pkgs.push(safeName)
}
selectedPackages.value = pkgs
}
function clearSelectedPackages() {
selectedPackages.value = []
}
function openSelectionView() {
showSelectionView.value = true
}
return {
selectedPackages,
selectedPackagesParam,
showSelectionView,
canSelectMore,
clearSelectedPackages,
isPackageSelected,
togglePackageSelection,
closeSelectionView,
openSelectionView,
}
}