- Notifications
You must be signed in to change notification settings - Fork 440
/
Copy pathselect-board-components.tsx
109 lines (98 loc) · 2.9 KB
/
select-board-components.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import{nls}from'@theia/core/lib/common';
importReactfrom'@theia/core/shared/react';
import{
boardListItemEquals,
typeBoardList,
typeBoardListItemWithBoard,
}from'../../../common/protocol/board-list';
import{ArduinoSelect}from'../../widgets/arduino-select';
exporttypeBoardOptionValue=BoardListItemWithBoard;
typeBoardOption={value: BoardOptionValue|undefined;label: string};
exportconstSelectBoardComponent=({
boardList,
updatableFqbns,
onItemSelect,
selectedItem,
busy,
}: {
boardList: BoardList;
updatableFqbns: string[];
onItemSelect: (item: BoardOptionValue|null)=>void;
selectedItem: BoardOptionValue|null;
busy: boolean;
}): React.ReactElement=>{
const[selectOptions,setSelectOptions]=React.useState<BoardOption[]>([]);
const[selectItemPlaceholder,setSelectBoardPlaceholder]=React.useState('');
constselectOption=React.useCallback(
(boardOpt: BoardOption|null)=>{
onItemSelect(boardOpt?.value??null);
},
[onItemSelect]
);
React.useEffect(()=>{
// if there is activity going on, skip updating the boards (avoid flickering)
if(busy){
return;
}
letplaceholderTxt=nls.localize(
'arduino/certificate/selectBoard',
'Select a board...'
);
constupdatableBoards=boardList.boards.filter((item)=>{
constfqbn=item.board.fqbn;
returnfqbn&&updatableFqbns.includes(fqbn);
});
letselBoard=-1;
constboardOptions: BoardOption[]=updatableBoards.map((item,i)=>{
if(selectedItem===item){
selBoard=i;
}
return{
label: nls.localize(
'arduino/certificate/boardAtPort',
'{0} at {1}',
item.board.name,
item.port.address??''
),
value: item,
};
});
if(boardOptions.length===0){
placeholderTxt=nls.localize(
'arduino/certificate/noSupportedBoardConnected',
'No supported board connected'
);
}
setSelectBoardPlaceholder(placeholderTxt);
setSelectOptions(boardOptions);
if(selectedItem){
selBoard=updatableBoards.findIndex((board)=>
boardListItemEquals(board,selectedItem)
);
}
selectOption(boardOptions[selBoard]||null);
},[busy,boardList,selectOption,updatableFqbns,selectedItem]);
return(
<ArduinoSelect
id="board-select"
menuPosition="fixed"
isDisabled={selectOptions.length===0||busy}
placeholder={selectItemPlaceholder}
options={selectOptions}
value={
(selectedItem&&{
value: selectedItem,
label: nls.localize(
'arduino/certificate/boardAtPort',
'{0} at {1}',
selectedItem.board.name,
selectedItem.port.address??''
),
})||
null
}
tabSelectsValue={false}
onChange={selectOption}
/>
);
};