@@ -56,7 +56,7 @@ export default function PackageView() {
5656 } ;
5757
5858 load ( ) ;
59- } , [ packageInfo . gitPackages , packageInfo . localPackages ] ) ;
59+ } , [ ] ) ;
6060
6161 const validPackages = useMemo ( ( ) => {
6262 const packages : CategoryPackage [ ] = ( corePackages . value . value ?? [ ] )
@@ -149,23 +149,24 @@ export default function PackageView() {
149149 load ( ) ;
150150 } , [ ] ) ;
151151
152- function selectPackage ( name : string , version ?: string ) {
152+ function selectPackage ( package_ : CategoryPackage , version ?: string ) {
153153 const packages = packageInfo . selectedPackages ;
154- const filtered = packages . filter ( ( y ) => y . name !== name ) ;
155- 156154 newProjectContext . dispatch ( {
157155 type : "set_selected_packages" ,
158- packages : [ ...filtered , { name, version } ] ,
156+ packages : [
157+ ...packages ,
158+ { name : package_ . package_ . name , version : version } ,
159+ ] ,
159160 } ) ;
160161 }
161162
162- function removePackage ( name : string , version : string ) {
163+ function removePackage ( package_ : CategoryPackage , version : string ) {
163164 const packages = packageInfo . selectedPackages ;
164- const filtered = packages . filter ( ( y ) => y . name !== name ) ;
165- 166165 newProjectContext . dispatch ( {
167166 type : "set_selected_packages" ,
168- packages : filtered ,
167+ packages : packages . filter (
168+ ( x ) => ! ( x . name === package_ . package_ . name && x . version === version )
169+ ) ,
169170 } ) ;
170171 }
171172
@@ -197,12 +198,11 @@ export default function PackageView() {
197198 } ) ;
198199 }
199200
200- function togglePackage ( name : string , version : string ) {
201- const selected = packageInfo . selectedPackages ;
202- if ( selected . find ( ( x ) => x . name === name ) ) {
203- removePackage ( name , version ) ;
201+ function togglePackage ( package_ : CategoryPackage , version : string ) {
202+ if ( isSelected ( package_ , version ) ) {
203+ removePackage ( package_ , version ) ;
204204 } else {
205- selectPackage ( name , version ) ;
205+ selectPackage ( package_ , version ) ;
206206 }
207207 }
208208
@@ -232,6 +232,48 @@ export default function PackageView() {
232232 }
233233 }
234234
235+ function getValidPackageMatches ( package_ : CategoryPackage ) {
236+ const matches = queriedPackages . filter (
237+ ( x ) => x . package_ . name === package_ . package_ . name
238+ ) ;
239+ 240+ return matches ;
241+ }
242+ 243+ function getValidSelectedPackageMatches ( package_ : CategoryPackage ) {
244+ const matches = getValidPackageMatches ( package_ ) . filter ( ( x ) =>
245+ newProjectContext . state . packageInfo . selectedPackages . some (
246+ ( y ) => y . name === x . package_ . name
247+ )
248+ ) ;
249+ 250+ return matches ;
251+ }
252+ 253+ const isSelected = ( package_ : CategoryPackage , version ?: string ) => {
254+ const matches = getValidSelectedPackageMatches ( package_ ) ;
255+ version = version || package_ . package_ . version ;
256+ 257+ if ( matches . length === 0 ) return false ;
258+ if ( matches . length === 1 ) {
259+ return true ;
260+ }
261+ 262+ const selected = newProjectContext . state . packageInfo . selectedPackages ;
263+ for ( const x of matches ) {
264+ if (
265+ x . package_ . version === version &&
266+ selected . some (
267+ ( y ) => y . name === x . package_ . name && y . version === x . package_ . version
268+ )
269+ ) {
270+ return true ;
271+ }
272+ }
273+ 274+ return false ;
275+ } ;
276+ 235277 return (
236278 < div className = "flex h-full" >
237279 < Sidebar
@@ -291,22 +333,19 @@ export default function PackageView() {
291333 const existingPackage = packageInfo . templatePackages . find (
292334 ( y ) => y . name === x . package_ . name
293335 ) ;
294- const isSelected = packageInfo . selectedPackages . some (
295- ( y ) => y . name === x . package_ . name
296- ) ;
297- 336+ const selected = isSelected ( x ) ;
298337 return (
299338 < Package
300339 key = { i }
301340 package_ = { x }
302341 onClick = { ( ) =>
303342 togglePackage (
304- x . package_ . name ,
343+ x ,
305344 existingPackage ?. version ?? x . package_ . version
306345 )
307346 }
308347 destroyPackage = { destroyPackage }
309- selected = { isSelected }
348+ selected = { selected }
310349 otherVersion = { existingPackage ?. version }
311350 />
312351 ) ;
@@ -319,7 +358,7 @@ export default function PackageView() {
319358}
320359
321360function GitAdd ( props : {
322- selectPackage : ( name : string , version ?: string ) => void ;
361+ selectPackage : ( package_ : CategoryPackage , version ?: string ) => void ;
323362} ) {
324363 const newProjectContext = useContext ( NewProjectContext . Context ) ;
325364 const gitPackageJson = useBetterState ( "" ) ;
@@ -360,7 +399,20 @@ function GitAdd(props: {
360399 gitPackageId . set ( "" ) ;
361400 gitPackageUrl . set ( "" ) ;
362401
363- props . selectPackage ( gitPackageId . value , gitPackageUrl . value ) ;
402+ props . selectPackage (
403+ {
404+ package_ : {
405+ name : gitPackageId . value ,
406+ version : gitPackageUrl . value ,
407+ type : TauriTypes . PackageType . Git ,
408+ isFile : false ,
409+ isDiscoverable : true ,
410+ } ,
411+ category : "Git" ,
412+ inPackage : false ,
413+ } ,
414+ gitPackageUrl . value
415+ ) ;
364416 } else {
365417 if ( gitPackageJson . value === "" ) return ;
366418
@@ -381,13 +433,15 @@ function GitAdd(props: {
381433 return ;
382434 }
383435
384- await TauriRouter . add_git_package_to_cache ( {
436+ const package_ = {
385437 name,
386438 version,
387439 isFile : false ,
388440 isDiscoverable : true ,
389441 type : TauriTypes . PackageType . Git ,
390- } ) ;
442+ } ;
443+ 444+ await TauriRouter . add_git_package_to_cache ( package_ ) ;
391445
392446 newProjectContext . dispatch ( {
393447 type : "add_git_package" ,
@@ -397,7 +451,14 @@ function GitAdd(props: {
397451 } ,
398452 } ) ;
399453
400- props . selectPackage ( name , version ) ;
454+ props . selectPackage (
455+ {
456+ package_,
457+ category : "Git" ,
458+ inPackage : false ,
459+ } ,
460+ version
461+ ) ;
401462
402463 gitPackageJson . set ( "" ) ;
403464 } catch ( e ) {
@@ -490,7 +551,7 @@ function GitAdd(props: {
490551}
491552
492553function LocalAdd ( props : {
493- selectPackage : ( name : string , version ?: string ) => void ;
554+ selectPackage : ( package_ : CategoryPackage , version ?: string ) => void ;
494555} ) {
495556 const newProjectContext = useContext ( NewProjectContext . Context ) ;
496557 const localPackage = useBetterState ( "" ) ;
@@ -522,7 +583,20 @@ function LocalAdd(props: {
522583 } ,
523584 } ) ;
524585
525- props . selectPackage ( localPackage . value , undefined ) ;
586+ props . selectPackage (
587+ {
588+ package_ : {
589+ name : localPackage . value ,
590+ version : "" ,
591+ type : TauriTypes . PackageType . Local ,
592+ isFile : false ,
593+ isDiscoverable : true ,
594+ } ,
595+ category : "Local" ,
596+ inPackage : false ,
597+ } ,
598+ undefined
599+ ) ;
526600
527601 localPackage . set ( "" ) ;
528602 }
0 commit comments