| 
                        123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 | 
                        - import type { FC } from 'react'
 - import { useState } from 'react'
 - import type {
 -   DefaultModel,
 -   Model,
 -   ModelItem,
 - } from '../declarations'
 - import { useCurrentProviderAndModel } from '../hooks'
 - import ModelTrigger from './model-trigger'
 - import EmptyTrigger from './empty-trigger'
 - import DeprecatedModelTrigger from './deprecated-model-trigger'
 - import Popup from './popup'
 - import {
 -   PortalToFollowElem,
 -   PortalToFollowElemContent,
 -   PortalToFollowElemTrigger,
 - } from '@/app/components/base/portal-to-follow-elem'
 - 
 - type ModelSelectorProps = {
 -   defaultModel?: DefaultModel
 -   modelList: Model[]
 -   triggerClassName?: string
 -   popupClassName?: string
 -   onSelect?: (model: DefaultModel) => void
 -   readonly?: boolean
 - }
 - const ModelSelector: FC<ModelSelectorProps> = ({
 -   defaultModel,
 -   modelList,
 -   triggerClassName,
 -   popupClassName,
 -   onSelect,
 -   readonly,
 - }) => {
 -   const [open, setOpen] = useState(false)
 -   const {
 -     currentProvider,
 -     currentModel,
 -   } = useCurrentProviderAndModel(
 -     modelList,
 -     defaultModel,
 -   )
 - 
 -   const handleSelect = (provider: string, model: ModelItem) => {
 -     setOpen(false)
 - 
 -     if (onSelect)
 -       onSelect({ provider, model: model.model })
 -   }
 - 
 -   const handleToggle = () => {
 -     if (readonly)
 -       return
 - 
 -     setOpen(v => !v)
 -   }
 - 
 -   return (
 -     <PortalToFollowElem
 -       open={open}
 -       onOpenChange={setOpen}
 -       placement='bottom-start'
 -       offset={4}
 -     >
 -       <div className='relative'>
 -         <PortalToFollowElemTrigger
 -           onClick={handleToggle}
 -           className='block'
 -         >
 -           {
 -             currentModel && currentProvider && (
 -               <ModelTrigger
 -                 open={open}
 -                 provider={currentProvider}
 -                 model={currentModel}
 -                 className={triggerClassName}
 -               />
 -             )
 -           }
 -           {
 -             !currentModel && defaultModel && (
 -               <DeprecatedModelTrigger
 -                 modelName={defaultModel?.model || ''}
 -                 providerName={defaultModel?.provider || ''}
 -                 className={triggerClassName}
 -               />
 -             )
 -           }
 -           {
 -             !defaultModel && (
 -               <EmptyTrigger
 -                 open={open}
 -                 className={triggerClassName}
 -               />
 -             )
 -           }
 -         </PortalToFollowElemTrigger>
 -         <PortalToFollowElemContent className={`z-[60] ${popupClassName}`}>
 -           <Popup
 -             defaultModel={defaultModel}
 -             modelList={modelList}
 -             onSelect={handleSelect}
 -           />
 -         </PortalToFollowElemContent>
 -       </div>
 -     </PortalToFollowElem>
 -   )
 - }
 - 
 - export default ModelSelector
 
 
  |