@@ -3,6 +3,7 @@ import type {
33 ModelSelection ,
44 ServerConfig as T3ServerConfig ,
55} from "@t3tools/contracts" ;
6+ import type { MenuAction } from "@react-native-menu/menu" ;
67import {
78 buildProviderOptionSelectionsFromDescriptors ,
89 getProviderOptionDescriptors ,
@@ -16,6 +17,7 @@ export type ModelOption = {
1617 readonly providerLabel : string ;
1718 readonly providerDriver : string ;
1819 readonly isDefault : boolean ;
20+ readonly isLegacy : boolean ;
1921 readonly capabilities : ModelCapabilities | null ;
2022 readonly selection : ModelSelection ;
2123} ;
@@ -105,6 +107,7 @@ export function buildModelOptions(
105107 providerLabel,
106108 providerDriver : provider . driver ,
107109 isDefault : model . isDefault === true ,
110+ isLegacy : model . isLegacy === true ,
108111 capabilities : model . capabilities ,
109112 selection : normalizeSelectionOptions (
110113 {
@@ -135,6 +138,7 @@ export function buildModelOptions(
135138 providerLabel,
136139 providerDriver : fallbackModelSelection . instanceId ,
137140 isDefault : false ,
141+ isLegacy : false ,
138142 capabilities : null ,
139143 selection : fallbackModelSelection ,
140144 } ) ;
@@ -164,3 +168,53 @@ export function groupByProvider(options: ReadonlyArray<ModelOption>): ReadonlyAr
164168 models : group . models ,
165169 } ) ) ;
166170}
171+
172+ function modelMenuAction ( option : ModelOption , selectedModel : ModelSelection | null ) : MenuAction {
173+ return {
174+ id : `model:${ option . key } ` ,
175+ title : option . label ,
176+ state :
177+ option . selection . instanceId === selectedModel ?. instanceId &&
178+ option . selection . model === selectedModel . model
179+ ? "on"
180+ : undefined ,
181+ } ;
182+ }
183+
184+ export function buildModelMenuActions (
185+ groups : ReadonlyArray < ProviderGroup > ,
186+ selectedModel : ModelSelection | null ,
187+ ) : MenuAction [ ] {
188+ return groups . flatMap ( ( group ) => {
189+ const currentModels = group . models . filter ( ( model ) => ! model . isLegacy ) ;
190+ const legacyModels = group . models . filter ( ( model ) => model . isLegacy ) ;
191+ const selected = group . models . find (
192+ ( model ) =>
193+ model . selection . instanceId === selectedModel ?. instanceId &&
194+ model . selection . model === selectedModel . model ,
195+ ) ;
196+
197+ return [
198+ ...( currentModels . length > 0
199+ ? [
200+ {
201+ id : `provider:${ group . providerKey } ` ,
202+ title : group . providerLabel ,
203+ subtitle : selected && ! selected . isLegacy ? selected . label : undefined ,
204+ subactions : currentModels . map ( ( option ) => modelMenuAction ( option , selectedModel ) ) ,
205+ } ,
206+ ]
207+ : [ ] ) ,
208+ ...( legacyModels . length > 0
209+ ? [
210+ {
211+ id : `legacy-models:${ group . providerKey } ` ,
212+ title : `${ group . providerLabel } legacy models` ,
213+ subtitle : selected ?. isLegacy ? selected . label : undefined ,
214+ subactions : legacyModels . map ( ( option ) => modelMenuAction ( option , selectedModel ) ) ,
215+ } ,
216+ ]
217+ : [ ] ) ,
218+ ] ;
219+ } ) ;
220+ }
0 commit comments