in space-slack-sync/client/src/app/components/mainPage.tsx [26:143]
export default function MainPage(props: MainPageProps) {
let [readyToSync, setReadyToSync] = useState<boolean>(syncChannels.readyToSync());
let [channels, setChannels] = useState<SyncedChannelInfo[]>(syncedChannels.getSyncedChannels());
let [selectedSlackChannel, setSelectedSlackChannel] = useState<ChannelSelectOption | null>(null);
let [selectedSpaceChannel, setSelectedSpaceChannel] = useState<ChannelSelectOption | null>(null);
return <>
<div className="mainPage">
<UnapprovedPermissionsWarning/>
<table className="mainPageTable">
<colgroup>
<col span={1} style={{width: '45%'}}></col>
<col span={1} style={{width: '45%'}}></col>
<col span={1} style={{width: '10%'}}></col>
</colgroup>
<tbody>
<tr>
<td className="mainPageTd">
<LogoWithNameAndHost
renderLogo={() => (<Icon name="slack"/>)}
name={props.slackWorkspace.name}
host={`${props.slackWorkspace.domain}.slack.com`}
/>
</td>
<td className="mainPageTd">
<LogoWithNameAndHost
renderLogo={() => (<Icon name="space"/>)}
name={spaceOrg.getOrgName()}
host={spaceAuth.getSpaceDomain()}
/>
</td>
<td className="mainPageTd">
</td>
</tr>
<tr>
<td className="mainPageTd">
<div className="pickChannelSpan">{"Pick a Slack channel"}</div>
</td>
<td className="mainPageTd">
<div className="pickChannelSpan">{"Pick a Space channel"}</div>
</td>
<td className="mainPageTd">
</td>
</tr>
<tr>
<td className="mainPageTd selectRowTd">
<ChannelSelectField
defaultOptions={slackChannels.getDefaultChannelsAsSelectOptions()}
loadOptions={slackChannels.loadChannelsAsSelectOptions}
onChange={(selectedOption) => {
setSelectedSlackChannel(selectedOption);
if (selectedOption != null) {
syncChannels.setSlackChannelToSync(selectedOption.value);
}
setReadyToSync(syncChannels.readyToSync());
}}
value={selectedSlackChannel}
/>
</td>
<td className="mainPageTd selectRowTd">
<ChannelSelectField
defaultOptions={spaceChannels.getDefaultChannelsAsSelectOptions()}
loadOptions={spaceChannels.loadChannelsAsSelectOptions}
onChange={(selectedOption) => {
setSelectedSpaceChannel(selectedOption);
if (selectedOption != null) {
syncChannels.setSpaceChannelToSync(selectedOption.value);
}
setReadyToSync(syncChannels.readyToSync());
}}
value={selectedSpaceChannel}
/>
</td>
<td className="mainPageTd selectRowTd">
<Button
buttonText="Create tunnel"
isDisabled={!readyToSync}
actionHandler={() => {
if (selectedSpaceChannel !== null && selectedSlackChannel !== null) {
const newChannel: SyncedChannelInfo = {
// optimistic update
channelNameInSpace: selectedSpaceChannel.label,
channelNameInSlack: selectedSlackChannel.label,
spaceChannelId: selectedSpaceChannel.value,
spaceChannelIconUrl: selectedSpaceChannel.icon,
slackTeamId: props.slackWorkspace.id,
slackChannelId: selectedSlackChannel.value,
isMemberInSlackChannel: true,
isAuthorizedInSpaceChannel: true,
userIsAdminInSpaceChannel: false,
isNewChannelForOptimisticUpdate: true,
};
setChannels([...channels, newChannel]);
syncChannels.startSync(setChannels);
setSelectedSlackChannel(null);
setSelectedSpaceChannel(null);
}
}}
/>
</td>
</tr>
<SyncedChannels
channels={channels}
onRemoveChannel={(channelToRemove) => {
setChannels(channels.filter((channel) => channel.spaceChannelId !== channelToRemove.spaceChannelId));
syncChannels.removeChannelFromSync(channelToRemove, setChannels);
}}
reloadSyncedChannels={() => {
syncedChannels.refreshSyncedChannels(setChannels);
}}
/>
</tbody>
</table>
</div>
</>
}