@@ -9,21 +9,37 @@ import { SelectField, TextArea, TextField } from "../../ui/Field";
99import { notifyError } from "../../ui/toast" ;
1010import { useCatalog } from "../catalog/useCatalog" ;
1111import { addTemplateBots } from "./addTemplateBots" ;
12+ import { CrewColorField } from "./CrewColorField" ;
1213import type { CrewTemplate } from "./crewTemplates" ;
1314import { PickedTemplate , TemplatePicker } from "./TemplatePicker" ;
1415import { WorkFolderField } from "./WorkFolderField" ;
1516
1617const MODELS : BotModel [ ] = [ "default" , "fable" , "opus" , "sonnet" , "haiku" ] ;
1718
18- /** Creates a crew with its chief, or renames `crew`. */
19- export function CrewDialog ( { crew, onClose } : { crew ?: Crew ; onClose ( ) : void } ) {
19+ /**
20+ * Creates a crew with its chief, or renames `crew`. `start` opens a new crew
21+ * already on that template, as when the owner taps an idea on the welcome
22+ * screen.
23+ */
24+ export function CrewDialog ( {
25+ crew,
26+ start,
27+ onClose,
28+ } : {
29+ crew ?: Crew ;
30+ start ?: CrewTemplate | undefined ;
31+ onClose ( ) : void ;
32+ } ) {
2033 const t = useT ( ) ;
2134 const api = useApi ( ) ;
2235 const putCrew = useApp ( ( state ) => state . putCrew ) ;
2336 const selectCrew = useApp ( ( state ) => state . selectCrew ) ;
24- const [ name , setName ] = useState ( crew ?. name ?? "" ) ;
37+ const [ name , setName ] = useState (
38+ crew ?. name ?? ( start ? t . crewTemplates . items [ start . id ] . name : "" ) ,
39+ ) ;
40+ const [ color , setColor ] = useState < string | null > ( crew ?. color ?? null ) ;
2541 const [ folder , setFolder ] = useState < string | null > ( null ) ;
26- const [ goal , setGoal ] = useState ( "" ) ;
42+ const [ goal , setGoal ] = useState ( start ? t . crewTemplates . items [ start . id ] . goal : "" ) ;
2743 const [ chiefModel , setChiefModel ] = useState < BotModel > ( "default" ) ;
2844 const selectBot = useApp ( ( state ) => state . selectBot ) ;
2945 const putBot = useApp ( ( state ) => state . putBot ) ;
@@ -32,7 +48,7 @@ export function CrewDialog({ crew, onClose }: { crew?: Crew; onClose(): void })
3248 // A new crew starts from a template (spec 29.1) when the catalog loaded:
3349 // `undefined` is the list of templates, `null` an empty crew.
3450 const { roles, failed : catalogFailed } = useCatalog ( ! crew ) ;
35- const [ template , setTemplate ] = useState < CrewTemplate | null | undefined > ( undefined ) ;
51+ const [ template , setTemplate ] = useState < CrewTemplate | null | undefined > ( start ) ;
3652 const loading = ! crew && roles === null && ! catalogFailed ;
3753 const choosing = ! crew && template === undefined && roles !== null ;
3854
@@ -49,7 +65,7 @@ export function CrewDialog({ crew, onClose }: { crew?: Crew; onClose(): void })
4965 setError ( null ) ;
5066 try {
5167 const d = t . crews . dialog ;
52- const saved = crew
68+ let saved = crew
5369 ? await api . call ( "crews.rename" , { crewId : crew . id , name } )
5470 : await api . call ( "crews.create" , {
5571 name,
@@ -62,6 +78,9 @@ export function CrewDialog({ crew, onClose }: { crew?: Crew; onClose(): void })
6278 ...( chiefModel !== "default" && { model : chiefModel } ) ,
6379 } ,
6480 } ) ;
81+ if ( crew && color !== crew . color ) {
82+ saved = await api . call ( "crews.setColor" , { crewId : crew . id , color } ) ;
83+ }
6584 putCrew ( saved ) ;
6685 if ( ! crew ) {
6786 selectCrew ( saved . id ) ;
@@ -134,6 +153,7 @@ export function CrewDialog({ crew, onClose }: { crew?: Crew; onClose(): void })
134153 autoFocus
135154 required
136155 />
156+ { crew && < CrewColorField value = { color } onChange = { setColor } /> }
137157 { ! crew && (
138158 < >
139159 < TextArea
0 commit comments