@tanstack/cta-ui-base 0.24.1 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,6 +9,7 @@ import AddOnInfoDialog from '../add-on-info-dialog';
9
9
  const addOnTypeLabels = {
10
10
  toolchain: 'Toolchain',
11
11
  'add-on': 'Add-on',
12
+ host: 'Hosting Provider',
12
13
  example: 'Example',
13
14
  };
14
15
  export default function SelectedAddOns() {
@@ -3,5 +3,6 @@ export declare function getAddOnStatus(availableAddOns: Array<AddOnInfo>, chosen
3
3
  [k: string]: {
4
4
  enabled: boolean;
5
5
  selected: boolean;
6
+ isSingleSelect: string | undefined;
6
7
  };
7
8
  };
@@ -5,6 +5,7 @@ export function getAddOnStatus(availableAddOns, chosenAddOns, originalAddOns) {
5
5
  selected: false,
6
6
  enabled: true,
7
7
  dependedUpon: false,
8
+ isSingleSelect: addOn.type === 'host' ? addOn.type : undefined,
8
9
  });
9
10
  }
10
11
  // Guard against cycles in the dependency graph. The results won't be great. But it won't crash.
@@ -54,6 +55,7 @@ export function getAddOnStatus(availableAddOns, chosenAddOns, originalAddOns) {
54
55
  {
55
56
  enabled: addOn.enabled,
56
57
  selected: addOn.selected,
58
+ isSingleSelect: addOn.isSingleSelect,
57
59
  },
58
60
  ]));
59
61
  }
@@ -33,6 +33,7 @@ export declare function useAddOns(): {
33
33
  [k: string]: {
34
34
  enabled: boolean;
35
35
  selected: boolean;
36
+ isSingleSelect: string | undefined;
36
37
  };
37
38
  };
38
39
  };
@@ -105,16 +105,36 @@ export function useAddOns() {
105
105
  const toggleAddOn = useCallback((addOnId) => {
106
106
  if (!ready)
107
107
  return;
108
- if (addOnState[addOnId].enabled) {
109
- if (addOnState[addOnId].selected) {
110
- useMutableAddOns.setState((state) => ({
111
- userSelectedAddOns: state.userSelectedAddOns.filter((addOn) => addOn !== addOnId),
112
- }));
108
+ if (addOnState[addOnId].isSingleSelect) {
109
+ if (!addOnState[addOnId].selected) {
110
+ // Find the currently selected addOn with the same isSingleSelect value and unselect it
111
+ const singleSelectType = addOnState[addOnId].isSingleSelect;
112
+ const currentlySelected = Object.keys(addOnState).find((id) => id !== addOnId &&
113
+ addOnState[id].isSingleSelect === singleSelectType &&
114
+ addOnState[id].selected);
115
+ useMutableAddOns.setState((state) => {
116
+ let newUserSelectedAddOns = state.userSelectedAddOns.filter((id) => id !== currentlySelected);
117
+ if (!newUserSelectedAddOns.includes(addOnId)) {
118
+ newUserSelectedAddOns = [...newUserSelectedAddOns, addOnId];
119
+ }
120
+ return {
121
+ userSelectedAddOns: newUserSelectedAddOns,
122
+ };
123
+ });
113
124
  }
114
- else {
115
- useMutableAddOns.setState((state) => ({
116
- userSelectedAddOns: [...state.userSelectedAddOns, addOnId],
117
- }));
125
+ }
126
+ else {
127
+ if (addOnState[addOnId].enabled) {
128
+ if (addOnState[addOnId].selected) {
129
+ useMutableAddOns.setState((state) => ({
130
+ userSelectedAddOns: state.userSelectedAddOns.filter((addOn) => addOn !== addOnId),
131
+ }));
132
+ }
133
+ else {
134
+ useMutableAddOns.setState((state) => ({
135
+ userSelectedAddOns: [...state.userSelectedAddOns, addOnId],
136
+ }));
137
+ }
118
138
  }
119
139
  }
120
140
  }, [ready, addOnState]);
package/package.json CHANGED
@@ -36,7 +36,7 @@
36
36
  "sonner": "^2.0.3",
37
37
  "tailwind-merge": "^3.0.2",
38
38
  "zustand": "^5.0.3",
39
- "@tanstack/cta-engine": "0.24.1"
39
+ "@tanstack/cta-engine": "0.25.0"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@types/react": "^19.0.8",
@@ -45,6 +45,6 @@
45
45
  "vite-tsconfig-paths": "^5.1.4",
46
46
  "vitest": "^3.1.4"
47
47
  },
48
- "version": "0.24.1",
48
+ "version": "0.25.0",
49
49
  "scripts": {}
50
50
  }
@@ -14,6 +14,7 @@ import type { AddOnInfo } from '../../types'
14
14
  const addOnTypeLabels: Record<string, string> = {
15
15
  toolchain: 'Toolchain',
16
16
  'add-on': 'Add-on',
17
+ host: 'Hosting Provider',
17
18
  example: 'Example',
18
19
  }
19
20
 
@@ -11,6 +11,7 @@ export function getAddOnStatus(
11
11
  enabled: boolean
12
12
  selected: boolean
13
13
  dependedUpon: boolean
14
+ isSingleSelect: string | undefined
14
15
  }
15
16
  >()
16
17
 
@@ -19,6 +20,7 @@ export function getAddOnStatus(
19
20
  selected: false,
20
21
  enabled: true,
21
22
  dependedUpon: false,
23
+ isSingleSelect: addOn.type === 'host' ? addOn.type : undefined,
22
24
  })
23
25
  }
24
26
 
@@ -75,6 +77,7 @@ export function getAddOnStatus(
75
77
  {
76
78
  enabled: addOn.enabled,
77
79
  selected: addOn.selected,
80
+ isSingleSelect: addOn.isSingleSelect,
78
81
  },
79
82
  ]),
80
83
  )
@@ -140,17 +140,42 @@ export function useAddOns() {
140
140
  const toggleAddOn = useCallback(
141
141
  (addOnId: string) => {
142
142
  if (!ready) return
143
- if (addOnState[addOnId].enabled) {
144
- if (addOnState[addOnId].selected) {
145
- useMutableAddOns.setState((state) => ({
146
- userSelectedAddOns: state.userSelectedAddOns.filter(
147
- (addOn) => addOn !== addOnId,
148
- ),
149
- }))
150
- } else {
151
- useMutableAddOns.setState((state) => ({
152
- userSelectedAddOns: [...state.userSelectedAddOns, addOnId],
153
- }))
143
+
144
+ if (addOnState[addOnId].isSingleSelect) {
145
+ if (!addOnState[addOnId].selected) {
146
+ // Find the currently selected addOn with the same isSingleSelect value and unselect it
147
+ const singleSelectType = addOnState[addOnId].isSingleSelect
148
+ const currentlySelected = Object.keys(addOnState).find(
149
+ (id) =>
150
+ id !== addOnId &&
151
+ addOnState[id].isSingleSelect === singleSelectType &&
152
+ addOnState[id].selected,
153
+ )
154
+ useMutableAddOns.setState((state) => {
155
+ let newUserSelectedAddOns = state.userSelectedAddOns.filter(
156
+ (id) => id !== currentlySelected, // remove the previously selected one
157
+ )
158
+ if (!newUserSelectedAddOns.includes(addOnId)) {
159
+ newUserSelectedAddOns = [...newUserSelectedAddOns, addOnId]
160
+ }
161
+ return {
162
+ userSelectedAddOns: newUserSelectedAddOns,
163
+ }
164
+ })
165
+ }
166
+ } else {
167
+ if (addOnState[addOnId].enabled) {
168
+ if (addOnState[addOnId].selected) {
169
+ useMutableAddOns.setState((state) => ({
170
+ userSelectedAddOns: state.userSelectedAddOns.filter(
171
+ (addOn) => addOn !== addOnId,
172
+ ),
173
+ }))
174
+ } else {
175
+ useMutableAddOns.setState((state) => ({
176
+ userSelectedAddOns: [...state.userSelectedAddOns, addOnId],
177
+ }))
178
+ }
154
179
  }
155
180
  }
156
181
  },
package/src/types.d.ts CHANGED
@@ -32,7 +32,7 @@ export type AddOnInfo = {
32
32
  id: string
33
33
  name: string
34
34
  description: string
35
- type: 'add-on' | 'example' | 'starter' | 'toolchain'
35
+ type: 'add-on' | 'example' | 'starter' | 'toolchain' | 'host'
36
36
  modes: Array<string>
37
37
  smallLogo?: string
38
38
  logo?: string