semantic-ui-react#Header TypeScript Examples
The following examples show how to use
semantic-ui-react#Header.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: ErrorPortal.tsx From FLECT_Amazon_Chime_Meeting with Apache License 2.0 | 6 votes |
render() {
const gs = this.props as GlobalState
return (
<Portal onClose={this.handleClose} open={true}>
<Segment
style={{
left: '40%',
position: 'fixed',
top: '50%',
zIndex: 1000,
}}
>
<Header>Error</Header>
<p>
{gs.errorMessage}
</p>
<Button
content='Close Portal'
negative
onClick={this.handleClose}
/>
</Segment>
</Portal>
)
}
Example #2
Source File: page.tsx From website with MIT License | 6 votes |
render() {
const { markdownRemark } = this.props.data;
return (
<Layout narrowLayout={true}>
<Header>{markdownRemark.frontmatter.title}</Header>
<div dangerouslySetInnerHTML={{ __html: markdownRemark.html }} />
</Layout>
);
}
Example #3
Source File: CharacterList.tsx From Riakuto-StartingReact-ja3.1 with Apache License 2.0 | 6 votes |
render(): ReactElement {
const { school, characters } = this.props;
return (
<>
<Header as="h2">{school}</Header>
<Item.Group>
{characters.map((character) => (
<Item key={character.id}>
<Icon name="user circle" size="huge" />
<Item.Content>
<Item.Header>{character.name}</Item.Header>
<Item.Meta>{character.grade}年生</Item.Meta>
<Item.Meta>
{character.height ?? '???'}
cm
</Item.Meta>
</Item.Content>
</Item>
))}
</Item.Group>
</>
);
}
Example #4
Source File: index.tsx From chartsy with GNU General Public License v3.0 | 6 votes |
Nav: React.FC<Props> = ({ collageRef, setShowDrawer }) => {
//@ts-ignore
const { takeScreenshot, isLoading } = useScreenshot({ ref: collageRef });
return (
<nav>
<button onClick={() => setShowDrawer((show) => !show)}>
<Icon name="setting" size="large" />
</button>
<Header as="h4">
<button
onClick={async () => {
let img = await takeScreenshot("png");
let link = document.createElement("a");
link.download = "chartsy.png";
link.href = img as string;
link.click();
}}
>
{isLoading ? "Saving..." : "Save"}
</button>
</Header>
</nav>
);
}
Example #5
Source File: ExampleList.tsx From plugin-vscode with Apache License 2.0 | 6 votes |
public renderColumnItem(column: BallerinaExampleCategory) {
return (
<List verticalAlign="middle" divided relaxed key={column.title} className="examples-block">
<List.Item>
<List.Header>{column.title}</List.Header>
<List animated verticalAlign="middle">
{
column.samples.map((sample) => {
return (
<List.Item className="example" key={sample.url}>
<a
href="#"
onClick={
() => this.props.openSample(sample.url)}
>
{sample.name}
</a>
</List.Item>);
})
}
</List>
</List.Item>
</List>
);
}
Example #6
Source File: ErrorModal.tsx From watchparty with MIT License | 6 votes |
ErrorModal = ({ error }: { error: string }) => {
return (
<Modal inverted basic open>
<Header as="h1" style={{ textAlign: 'center' }}>
{error}
</Header>
<div style={{ display: 'flex', justifyContent: 'center' }}>
<Button
primary
size="huge"
onClick={() => {
window.location.href = '/';
}}
icon
labelPosition="left"
>
<Icon name="home" />
Go to home page
</Button>
</div>
</Modal>
);
}
Example #7
Source File: CharacterList.tsx From Riakuto-StartingReact-ja3.1 with Apache License 2.0 | 6 votes |
CharacterList: VFC<Props> = (props) => {
const { school, characters } = props;
return (
<>
<Header as="h2">{school}</Header>
<Item.Group>
{characters.map((character) => (
<Item key={character.id}>
<Icon name="user circle" size="huge" />
<Item.Content>
<Item.Header>{character.name}</Item.Header>
<Item.Meta>{character.grade}年生</Item.Meta>
<Item.Meta>
{character.height ? character.height : '???'}
cm
</Item.Meta>
</Item.Content>
</Item>
))}
</Item.Group>
</>
);
}
Example #8
Source File: LocalSettings.tsx From watchparty with MIT License | 6 votes |
SettingsModal = ({ trigger }: any) => (
<Modal trigger={trigger} basic closeIcon size="small">
<Header icon="setting" content="Settings" />
<Modal.Content>
<Form>
<TextArea rows={10} id="settings_textarea">
{window.localStorage.getItem('watchparty-setting') ||
JSON.stringify(getDefaultSettings(), null, 2)}
</TextArea>
</Form>
</Modal.Content>
<Modal.Actions>
<Button
color="green"
inverted
onClick={() => {
const newSetting = (document.getElementById(
'settings_textarea'
) as HTMLTextAreaElement)!.value;
try {
validateSettingsString(newSetting);
updateSettings(newSetting);
window.location.reload();
} catch (e) {
alert(e);
}
}}
>
<Icon name="checkmark" />
Save
</Button>
</Modal.Actions>
</Modal>
)
Example #9
Source File: SchoolCharacters.tsx From Riakuto-StartingReact-ja3.1 with Apache License 2.0 | 6 votes |
SchoolCharacters: VFC<Props> = ({
school,
characters,
isLoading = false,
}) => (
<>
<Helmet>
<title>登場人物一覧 | {school}</title>
</Helmet>
<Header as="h2">{school}</Header>
<CharactersList characters={characters} isLoading={isLoading} />
</>
)
Example #10
Source File: crewfullequiptree.tsx From website with MIT License | 5 votes |
render() {
const { crew, items } = this.props;
if (!crew || !this.props.visible) {
return <span />;
}
let { craftCost, demands, factionOnlyTotal, totalChronCost } = calculateCrewDemands(crew, items);
return (
<Modal open={this.props.visible} onClose={() => this.props.onClosed()}>
<Modal.Header>{crew.name}'s expanded equipment recipe trees</Modal.Header>
<Modal.Content scrolling>
<p>
Faction-only items required <b>{factionOnlyTotal}</b>
</p>
<p>
Estimated chroniton cost{' '}
<span style={{ display: 'inline-block' }}>
<img src={`${process.env.GATSBY_ASSETS_URL}atlas/energy_icon.png`} height={14} />
</span>{' '}
<b>{totalChronCost}</b>
<Popup
wide
trigger={<Icon fitted name='help' />}
header={'How is this calculated?'}
content={
<div>
<p>This sums the estimated chroniton cost of each equipment and component in the tree.</p>
<p>It estimates an item's cost by running the formula below for each mission and choosing the cheapest:</p>
<p>
<code>
(6 - PIPS) * 1.8 * <i>mission cost</i>
</code>
</p>
<p>See code for details. Feedback is welcome!</p>
</div>
}
/>
</p>
<p>
Build cost{' '}
<span style={{ display: 'inline-block' }}>
<img src={`${process.env.GATSBY_ASSETS_URL}currency_sc_currency_0.png`} height={16} />
</span>{' '}
<b>{craftCost}</b>
</p>
<Grid columns={3} centered padded>
{demands.map((entry, idx) => (
<Grid.Column key={idx}>
<Popup
trigger={
<Header
style={{ display: 'flex', cursor: 'zoom-in' }}
icon={
<ItemDisplay
src={`${process.env.GATSBY_ASSETS_URL}${entry.equipment.imageUrl}`}
size={48}
maxRarity={entry.equipment.rarity}
rarity={entry.equipment.rarity}
/>
}
content={entry.equipment.name}
subheader={`Need ${entry.count} ${entry.factionOnly ? ' (FACTION)' : ''}`}
/>
}
header={CONFIG.RARITIES[entry.equipment.rarity].name + ' ' + entry.equipment.name}
content={<ItemSources item_sources={entry.equipment.item_sources} />}
on='click'
wide
/>
</Grid.Column>
))}
</Grid>
</Modal.Content>
</Modal>
);
}
Example #11
Source File: ExampleList.tsx From plugin-vscode with Apache License 2.0 | 5 votes |
public render() {
return (
<Grid className="welcome-page" divided>
<Grid.Row className="welcome-navbar" columns={1}>
<Grid.Column>
<Header as="h3" dividing>
Ballerina Examples
</Header>
{this.state && this.state.noSearchReults ?
(<>No search results found!</>) : null
}
{this.state && this.state.samples && this.state.samples.length > 0 ?
(
<Form>
<Form.Field inline>
<Input
ref={(ref) => {
this.searchInput = ref as Input;
}}
loading={!this.state || !this.state.samples}
placeholder="Search"
onChange={(event: React.SyntheticEvent<HTMLInputElement>) => {
this.setState({
searchQuery: event.currentTarget.value,
});
this.onSearchQueryEdit();
}}
className="search-control"
/>
</Form.Field>
</Form>
) : (
<>No Samples found in [BALLERINA_HOME]/examples folder.</>
)
}
</Grid.Column>
</Grid.Row>
<Grid.Row className="welcome-content-wrapper">
<Grid.Column mobile={16} tablet={16} computer={16} className="rightContainer">
<Grid>
{this.state && this.state.samples &&
<Grid.Row columns={4} className="sample-wrapper">
{
this.getColumnContents().map((column, index) => {
return (
<Grid.Column key={index} mobile={16} tablet={8} computer={4}>
{column.map((columnItem) => this.renderColumnItem(columnItem))}
</Grid.Column>
);
})
}
</Grid.Row>
}
</Grid>
</Grid.Column>
</Grid.Row>
</Grid>);
}
Example #12
Source File: crewpage.tsx From website with MIT License | 5 votes |
renderEquipment(crew) {
let options = [];
crew.equipment_slots.forEach(es => {
let equipment = this.state.items.find(item => item.symbol === es.symbol);
if (!equipment) {
console.warn(`Could not find item ${es.symbol}`);
return;
}
options.push({
key: es.symbol + '_' + es.level,
text: `${equipment.name} (level ${es.level})`,
value: es.symbol,
content: (
<Header
icon={
<ItemDisplay
src={`${process.env.GATSBY_ASSETS_URL}${equipment.imageUrl}`}
size={48}
maxRarity={equipment.rarity}
rarity={equipment.rarity}
/>
}
content={equipment.name}
subheader={`Level ${es.level}`}
/>
)
});
});
return (
<Dropdown
selection
fluid
options={options}
placeholder='Choose an equipment to see its details'
onChange={(ev, { value }) => this.setState({ selectedEquipment: value as number })}
/>
);
}
Example #13
Source File: App.tsx From js-examples with MIT License | 5 votes |
render () {
return (
<div className="App">
<Segment.Group style={{ height: "100%" }}>
<Segment clearing className="nav">
<Header className="avatar" as="h2" floated="left" title={this.state.identity ? this.state.identity.toString() : 'identity'}>
{this.state.identity && <Avatar identity={this.state.identity.toString()}/>}
</Header>
<Header className="dropzone-container" as="h2" floated="right" title={'add photo'}>
{!this.state.isLoading && this.renderDropzone()}
</Header>
{this.state.url &&
<a href={this.state.url} target="_blank" rel="noopener noreferrer">
<Button
className="link"
floated="right"
>BUCKET</Button>
</a>
}
{this.state.www &&
<a href={this.state.www} target="_blank" rel="noopener noreferrer">
<Button
className="link"
floated="right"
>WWW</Button>
</a>
}
{this.state.ipns &&
<a href={this.state.ipns} target="_blank" rel="noopener noreferrer">
<Button
className="link"
floated="right"
>IPNS</Button>
</a>
}
</Segment>
<Segment className={ this.state.isLoading ? 'rendering' : 'complete'}>
<Photos photos={this.state.photos}/>
</Segment>
</Segment.Group>
</div>
)
}
Example #14
Source File: voyagecalculator.tsx From website with MIT License | 5 votes |
VoyageMain = (props: VoyageMainProps) => {
const { myCrew, allShips } = props;
const [voyageData, setVoyageData] = useStateWithStorage('tools/voyageData', undefined);
const [voyageConfig, setVoyageConfig] = React.useState(undefined);
const [voyageState, setVoyageState] = React.useState('input'); // input or from voyageData: started, recalled
if (!voyageConfig) {
if (voyageData) {
// Voyage started, config will be full voyage data
if (voyageData.voyage && voyageData.voyage.length > 0) {
setVoyageConfig(voyageData.voyage[0]);
setVoyageState(voyageData.voyage[0].state);
}
// Voyage awaiting input, config will be input parameters only
else {
setVoyageConfig(voyageData.voyage_descriptions[0]);
}
}
else {
// voyageData not found in cache, config will be blank voyage
setVoyageConfig({ skills: {} });
}
return (<></>);
}
return (
<React.Fragment>
{voyageState == 'input' &&
<Grid columns={2} stackable>
<Grid.Column width={14}>
<Card.Group>
<Card>
<Card.Content>
<Image floated='right' src={`${process.env.GATSBY_ASSETS_URL}atlas/icon_${voyageConfig.skills.primary_skill}.png`} style={{ height: '2em' }} />
<Card.Header>{CONFIG.SKILLS[voyageConfig.skills.primary_skill]}</Card.Header>
<p>primary</p>
</Card.Content>
</Card>
<Card>
<Card.Content>
<Image floated='right' src={`${process.env.GATSBY_ASSETS_URL}atlas/icon_${voyageConfig.skills.secondary_skill}.png`} style={{ height: '2em' }} />
<Card.Header>{CONFIG.SKILLS[voyageConfig.skills.secondary_skill]}</Card.Header>
<p>secondary</p>
</Card.Content>
</Card>
<Card>
<Card.Content>
<Card.Header>{allTraits.ship_trait_names[voyageConfig.ship_trait]}</Card.Header>
<p>ship trait</p>
</Card.Content>
</Card>
</Card.Group>
</Grid.Column>
<Grid.Column width={2} textAlign='right'>
<VoyageEditConfigModal voyageConfig={voyageConfig} updateConfig={updateConfig} />
</Grid.Column>
</Grid>
}
{voyageState != 'input' && (<VoyageExisting voyageConfig={voyageConfig} allShips={allShips} useCalc={() => setVoyageState('input')} />)}
{voyageState == 'input' && (<VoyageInput voyageConfig={voyageConfig} myCrew={myCrew} allShips={allShips} useInVoyage={() => setVoyageState(voyageConfig.state)} />)}
</React.Fragment>
);
function updateConfig(voyageConfig: any): void {
setVoyageConfig({...voyageConfig});
// Update stored voyageData with new voyageConfig
setVoyageData({
voyage_descriptions: [{...voyageConfig}],
voyage: []
});
setVoyageState('input');
}
}
Example #15
Source File: Home.tsx From watchparty with MIT License | 4 votes |
Home = ({ user }: { user: firebase.User | undefined }) => {
return (
<div>
<div className={styles.container}>
<Hero
heroText={'Watch videos in-sync with friends far away.'}
subText={'No registration or download required.'}
action={
<div style={{ marginTop: '8px', width: '160px' }}>
<NewRoomButton user={user} />
</div>
}
image={'/screenshot4.png'}
/>
<Divider horizontal>
<Header inverted as="h4">
<Icon name="film" />
Multiple ways to watch
</Header>
</Divider>
<div className={styles.featureSection}>
<Feature
icon="slideshare"
title={`Screensharing`}
text="Share a browser tab or an application."
/>
<Feature
icon="desktop"
title={`VBrowser`}
text="Launch a virtual browser in the cloud that all room members can view and control. No need to worry about slow upload speeds!"
/>
<Feature
icon="file"
title={`File`}
text="Upload and stream your own file."
/>
<Feature
icon="linkify"
title={`URL`}
text="Paste in a URL for everyone to watch from."
/>
<Feature
icon="youtube"
title={`YouTube`}
text="Watch videos in-sync from YouTube."
/>
</div>
<Hero
heroText={'React to moments together.'}
subText={"Find moments of shared joy even when you're apart."}
image={'/screenshot18.png'}
color="green"
/>
<Divider horizontal>
<Header inverted as="h4">
<Icon name="cogs" />
Features
</Header>
</Divider>
<div className={styles.featureSection}>
<Feature
icon="sync"
title="Synchronized"
text="Starts, stops, and seeks are synchronized to everyone, so take those restroom and snack breaks without worrying about falling behind."
/>
<Feature
icon="conversation"
title="Chat"
text="Chat with others in your room. Memes and inside jokes encouraged."
/>
<Feature
icon="video"
title="Video chat"
text="Jump into video chat if there's something that you just can't express with text."
/>
</div>
<Hero
heroText={'Theater mode.'}
subText={
'Bring video and chat front-and-center for minimal distractions.'
}
image={'/screenshot14.png'}
/>
<Divider horizontal />
<div
style={{
padding: '30px',
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
}}
>
<div className={styles.heroText}>Get started!</div>
<div className={styles.featureSection}>
<Step.Group style={{ margin: '8px' }}>
<Step>
<Icon name="certificate" />
<Step.Content>
<Step.Title>1.</Step.Title>
<Step.Description>Make a room</Step.Description>
</Step.Content>
</Step>
<Step>
<Icon name="group" />
<Step.Content>
<Step.Title>2.</Step.Title>
<Step.Description>Share link with friends</Step.Description>
</Step.Content>
</Step>
<Step>
<Icon name="film" />
<Step.Content>
<Step.Title>3.</Step.Title>
<Step.Description>Pick something to watch</Step.Description>
</Step.Content>
</Step>
<Step>
<Icon name="thumbs up outline" />
<Step.Content>
<Step.Title>4.</Step.Title>
<Step.Description>Success!</Step.Description>
</Step.Content>
</Step>
</Step.Group>
</div>
<div style={{ width: '160px' }}>
<NewRoomButton user={user} />
</div>
</div>
</div>
</div>
);
}
Example #16
Source File: playertools.tsx From website with MIT License | 4 votes |
PlayerToolsPanes = (props: PlayerToolsPanesProps) => {
const { playerData, strippedPlayerData, voyageData, eventData, activeCrew, dataSource,
allCrew, allItems, requestShowForm, requestClearData } = props;
const [showIfStale, setShowIfStale] = useStateWithStorage('tools/showStale', true);
const [showShare, setShowShare] = useStateWithStorage(playerData.player.dbid+'/tools/showShare', true, { rememberForever: true, onInitialize: variableReady });
const [profileAutoUpdate, setProfileAutoUpdate] = useStateWithStorage(playerData.player.dbid+'/tools/profileAutoUpdate', false, { rememberForever: true });
const [profileUploaded, setProfileUploaded] = React.useState(false);
const [profileUploading, setProfileUploading] = React.useState(false);
const [profileShared, setProfileShared] = useStateWithStorage('tools/profileShared', false);
const [varsReady, setVarsReady] = React.useState(false);
const [activeTool, setActiveTool] = React.useState('voyage');
React.useEffect(() => {
if (dataSource == 'input' && profileAutoUpdate && !profileUploaded) {
console.log('Uploading profile');
shareProfile();
}
}, [profileAutoUpdate, strippedPlayerData]);
const tools = playerTools;
React.useEffect(() => {
const urlParams = new URLSearchParams(window.location.search);
if (urlParams.has('tool') && tools[urlParams.get('tool')])
setActiveTool(urlParams.get('tool'));
}, [window.location.search]);
const StaleMessage = () => {
const STALETHRESHOLD = 3; // in hours
if (showIfStale && new Date().getTime()-playerData.calc.lastModified.getTime() > STALETHRESHOLD*60*60*1000) {
return (
<Message
warning
icon='clock'
header='Update your player data'
content="It's been a few hours since you last updated your player data. We recommend that you update now to make sure our tools are providing you recent information about your crew."
onDismiss={() => setShowIfStale(false)}
/>
);
}
else {
return (<></>);
}
};
const ShareMessage = () => {
if (!showShare) return (<></>);
// The option to auto-share profile only appears after a profile is uploaded or if previously set to auto-update
const bShowUploaded = profileUploaded || profileAutoUpdate;
return (
<Message icon onDismiss={() => setShowShare(false)}>
<Icon name='share alternate' />
<Message.Content>
<Message.Header>Share your player profile!</Message.Header>
{!bShowUploaded && (
<div>
<p>
Click here to{' '}
<Button size='small' color='green' onClick={() => shareProfile()}>
{profileUploading && <Icon loading name='spinner' />}share your profile
</Button>{' '}
and unlock more tools and export options for items and ships. More details:
</p>
<Message.List>
<Message.Item>
Once shared, the profile will be publicly accessible, will be accessible by your DBID link, and linked on related pages (such as fleet pages & event pages)
</Message.Item>
<Message.Item>
There is no private information included in the player profile; information being shared is limited to:{' '}
<b>captain name, level, vip level, fleet name and role, achievements, completed missions, your crew, items and ships.</b>
</Message.Item>
</Message.List>
</div>
)}
{bShowUploaded && (
<Form.Group>
<p>
Your profile was uploaded. Share the link:{' '}
<a
href={`${process.env.GATSBY_DATACORE_URL}profile/?dbid=${playerData.player.dbid}`}
target='_blank'>{`${process.env.GATSBY_DATACORE_URL}profile/?dbid=${playerData.player.dbid}`}</a>
</p>
<Form.Field
control={Checkbox}
label='Automatically share profile after every import'
checked={profileAutoUpdate}
onChange={(e, { checked }) => setProfileAutoUpdate(checked)}
/>
</Form.Group>
)}
</Message.Content>
</Message>
);
};
if (!varsReady)
return (<PlayerToolsLoading />);
const PlayerLevelProgress = () => {
const endingValue = playerData.player.character.xp_for_next_level - playerData.player.character.xp_for_current_level;
const currentValue = playerData.player.character.xp - playerData.player.character.xp_for_current_level;
const percent = (currentValue / endingValue) * 100;
return (
<Progress
percent={percent.toPrecision(3)}
label={`Level ${playerData.player.character.level}: ${playerData.player.character.xp} / ${playerData.player.character.xp_for_next_level}`}
progress
/>
);
};
return (
<Layout title='Player tools'>
<Header as='h4'>Hello, {playerData.player.character.display_name}</Header>
<PlayerLevelProgress />
<StaleMessage />
<Menu compact stackable>
<Menu.Item>
Last imported: {playerData.calc.lastModified.toLocaleString()}
</Menu.Item>
<Dropdown item text='Profile options'>
<Dropdown.Menu>
<Dropdown.Item onClick={() => requestShowForm(true)}>Update now...</Dropdown.Item>
{!showShare && (<Dropdown.Item onClick={() => setShowShare(true)}>Share profile...</Dropdown.Item>)}
<Dropdown.Item onClick={() => requestClearData()}>Clear player data</Dropdown.Item>
</Dropdown.Menu>
</Dropdown>
<Dropdown item text='Export'>
<Dropdown.Menu>
<Popup basic content='Download crew data as traditional comma delimited CSV file' trigger={
<Dropdown.Item onClick={() => exportCrewTool()} content='Download CSV...' />
} />
<Popup basic content='Copy crew data to clipboard in Google Sheets format' trigger={
<Dropdown.Item onClick={() => exportCrewToClipboard()} content='Copy to clipboard' />
} />
</Dropdown.Menu>
</Dropdown>
</Menu>
<React.Fragment>
<ShareMessage />
<Header as='h3'>{tools[activeTool].title}</Header>
{tools[activeTool].render(props)}
</React.Fragment>
</Layout>
);
function variableReady(keyName: string) {
setVarsReady(true);
}
function shareProfile() {
setProfileUploading(true);
let jsonBody = JSON.stringify({
dbid: playerData.player.dbid,
player_data: strippedPlayerData
});
fetch(`${process.env.GATSBY_DATACORE_URL}api/post_profile`, {
method: 'post',
headers: {
'Content-Type': 'application/json'
},
body: jsonBody
}).then(() => {
if (!profileAutoUpdate) window.open(`${process.env.GATSBY_DATACORE_URL}profile/?dbid=${playerData.player.dbid}`, '_blank');
setProfileUploading(false);
setProfileUploaded(true);
setProfileShared(true);
});
}
function exportCrewTool() {
let text = exportCrew(playerData.player.character.crew.concat(playerData.player.character.unOwnedCrew));
downloadData(`data:text/csv;charset=utf-8,${encodeURIComponent(text)}`, 'crew.csv');
}
function exportCrewToClipboard() {
let text = exportCrew(playerData.player.character.crew.concat(playerData.player.character.unOwnedCrew), '\t');
navigator.clipboard.writeText(text);
}
}
Example #17
Source File: LobbyRoomList.tsx From FLECT_Amazon_Chime_Meeting with Apache License 2.0 | 4 votes |
render() {
const gs = this.props as GlobalState
const props = this.props as any
const appState = props.appState as AppState
const joinedMeetingIds = Object.keys(appState.joinedMeetings)
const meetings = gs.meetings.map((meeting:MeetingInfo)=>{
let joinButton
const currentMeetingId = meeting.meetingId
if(joinedMeetingIds.includes(currentMeetingId)){
joinButton = (
<Button basic color="red" floated='right'
onClick={()=>{
console.log("CLICK LEAVE", meeting.meetingId)
props._leaveMeeting(meeting.meetingId, appState.joinedMeetings[currentMeetingId].meetingSession.configuration.credentials!.attendeeId)
}}
>
leave
<Icon name='chevron left' />
</Button>
)
}else{
joinButton = (
<Button basic color="teal" floated='right'
onClick={()=>{
console.log("CLICK JOIN", meeting.meetingId)
props._joinMeeting(meeting.meetingId, gs)
}}>
join
<Icon name='chevron right' />
</Button>
)
}
return (
<Item>
{/* <Item.Image size='mini' src='/' /> */}
<Item.Content>
<Item.Header>
<Icon name="lock open" />
{meeting.meetingName}
</Item.Header>
<Item.Meta>
<div>
<b>Owner: </b>
{meeting.metaData.UserName}
</div>
<div>
<b>Open Date: </b>
<span>{new Date(Number(meeting.metaData.StartTime)).toLocaleDateString()}</span>
<span>{new Date(Number(meeting.metaData.StartTime)).toLocaleTimeString()}</span>
</div>
</Item.Meta>
<Item.Extra>
{joinButton}
</Item.Extra>
</Item.Content>
</Item>
)
})
return (
<div>
<div>
<Modal dimmer={'blurring'} size={'small'} open={this.state.open} onClose={this.close}>
<Modal.Header>Create New Meeting</Modal.Header>
<Modal.Content>
<Form>
<Form.Field>
<label>Room Name</label>
<input placeholder='name' ref={this.roomNameRef}/>
</Form.Field>
<Form.Field>
<Checkbox label='Use Passcode?(not implement)' checked={this.state.usePasscodeChecked}
onClick={()=>{this.setState({ usePasscodeChecked: !this.state.usePasscodeChecked })}}
/>
<label>Pass Code(not implement)</label>
<input placeholder='pass' ref={this.roomPassCodeRef}/>
</Form.Field>
<Form.Field>
<Checkbox label='Secret?(not implement)' checked={this.state.secretRoomCreateChecked}
onClick={()=>{this.setState({ secretRoomCreateChecked: !this.state.secretRoomCreateChecked })}}
/>
</Form.Field>
</Form>
</Modal.Content>
<Modal.Actions>
<Button negative onClick={this.close}>Cancel</Button>
<Button positive icon='checkmark' labelPosition='right' content='Create' onClick={this.createMeeting}/>
</Modal.Actions>
</Modal>
</div>
<div>
<Segment padded>
<Divider horizontal>
<Header as='h2' textAlign="left">
Lobby
</Header>
</Divider>
<Header as='h3' textAlign="left">
Actions
</Header>
<List link>
<List.Item as='a' active onClick={(e, d)=>{this.show()}}>
<Header as='h5' textAlign={'left'}>
<Icon name="chat" active />New Meeting!
</Header>
</List.Item>
<List.Item as='a' active onClick={()=>{props.refreshRoomList()}}>
<Header as='h5' textAlign={'left'}>
<Icon name="refresh" active />Refresh Meeting List
</Header>
</List.Item>
</List>
<Divider hidden />
<Header as='h3' textAlign="left">
Meetings
</Header>
<div>
<Item.Group >
{meetings}
</Item.Group>
</div>
</Segment>
</div>
</div>
)
}
Example #18
Source File: crewretrieval.tsx From website with MIT License | 4 votes |
PolestarFilterModal = (props: PolestarFilterModalProps) => {
const { ownedPolestars, updateDisableds } = props;
const [modalIsOpen, setModalIsOpen] = React.useState(false);
const [disabledPolestars, setDisabledPolestars] = React.useState(props.disabledPolestars);
// Recalculate combos only when modal gets closed
React.useEffect(() => {
if (!modalIsOpen && JSON.stringify(disabledPolestars) != JSON.stringify(props.disabledPolestars)) {
updateDisableds([...disabledPolestars]);
}
}, [modalIsOpen]);
const rarityIds = [14502, 14504, 14506, 14507, 14509];
const skillIds = [14511, 14512, 14513, 14514, 14515, 14516];
const grouped = [
{
title: "Rarity",
polestars: [],
anyDisabled: false
},
{
title: "Skills",
polestars: [],
anyDisabled: false
},
{
title: "Traits",
polestars: [],
anyDisabled: false
},
];
ownedPolestars.forEach(p => {
let group = 2;
if (rarityIds.indexOf(p.id) !== -1) group = 0;
if (skillIds.indexOf(p.id) !== -1) group = 1;
grouped[group].polestars.push(p);
if (disabledPolestars.indexOf(p.id) !== -1) grouped[group].anyDisabled = true;
});
return (
<Modal
open={modalIsOpen}
onClose={() => setModalIsOpen(false)}
onOpen={() => setModalIsOpen(true)}
trigger={<Button><Icon name='filter' />{ownedPolestars.length-disabledPolestars.length} / {ownedPolestars.length}</Button>}
size='large'
>
<Modal.Header>Filter Owned Polestars</Modal.Header>
<Modal.Content scrolling>
<Grid columns={4} stackable padded>
{createFilterCheckboxes()}
</Grid>
</Modal.Content>
<Modal.Actions>
<Button positive onClick={() => setModalIsOpen(false)}>
Close
</Button>
</Modal.Actions>
</Modal>
);
function filterCheckbox(p: any): JSX.Element {
return (
<Grid.Column key={p.id}>
<Checkbox
toggle
id={`polestar_filter_id_${p.id}`}
label={`${p.short_name} (${p.quantity})`}
checked={disabledPolestars.indexOf(p.id)===-1}
onChange={(e) => checkOne(p.id, e.target.checked)}
/>
</Grid.Column>
)
}
function filterCheckboxGroupHeader(t: string): JSX.Element {
let group = grouped.find(group => group.title === t);
let groupLink = group ? (<Button style={{ marginLeft: '1em' }} size='mini' onClick={() => checkGroup(t, group.anyDisabled)}>{group.anyDisabled ? 'Check' : 'Uncheck'} All</Button>): (<></>);
return (
<Grid.Column largeScreen={16} mobile={4} key={t}>
<strong>{t}</strong> {groupLink}
</Grid.Column>
)
}
function createFilterCheckboxes(): JSX.Element[] {
const checkboxes = [];
grouped.map((group) => {
if(group.polestars.length > 0) {
checkboxes.push(filterCheckboxGroupHeader(group.title));
group.polestars.map((polestar) => {
checkboxes.push(filterCheckbox(polestar));
});
}
});
return checkboxes;
}
function checkOne(id: number, checked: boolean): void {
handleFilterChange(id, checked);
setDisabledPolestars([...disabledPolestars]);
}
function checkGroup(t: string, checkAll: boolean): void {
let group = grouped.find(group => group.title === t);
group.polestars.forEach(p => handleFilterChange(p.id, checkAll));
setDisabledPolestars([...disabledPolestars]);
}
function handleFilterChange(id: number, checked: boolean): void {
if(checked === true && disabledPolestars.indexOf(id) !== -1) {
disabledPolestars.splice(disabledPolestars.indexOf(id), 1);
}
if(checked === false && disabledPolestars.indexOf(id) === -1) {
disabledPolestars.push(id);
}
}
}
Example #19
Source File: SubscribeModal.tsx From watchparty with MIT License | 4 votes |
render() {
if (this.props.isSubscriber) {
this.props.closeSubscribe();
return null;
}
const { closeSubscribe } = this.props;
return (
<Modal open={true} onClose={closeSubscribe as any}>
<Modal.Header>Subscribe to WatchParty Plus</Modal.Header>
<Modal.Content image>
{/* <Image wrapped size='medium' src='https://react.semantic-ui.com/images/avatar/large/rachel.png' /> */}
<Modal.Description>
<div>
Subscriptions help us maintain the service and build new features!
Please consider supporting us if you're enjoying WatchParty.
</div>
<Header>Features</Header>
<Table definition unstackable striped celled>
<Table.Header>
<Table.Row>
<Table.HeaderCell />
<Table.HeaderCell>WatchParty Free</Table.HeaderCell>
<Table.HeaderCell>WatchParty Plus</Table.HeaderCell>
</Table.Row>
</Table.Header>
<Table.Body>
{/* Priority support */}
<Table.Row>
<Table.Cell>
Basic (Synchronized watching, chat, screenshare)
</Table.Cell>
<Table.Cell>
<Icon name="check" />
</Table.Cell>
<Table.Cell>
<Icon name="check" />
</Table.Cell>
</Table.Row>
<Table.Row>
<Table.Cell>VBrowser Access</Table.Cell>
<Table.Cell>When capacity allows</Table.Cell>
<Table.Cell>Anytime</Table.Cell>
</Table.Row>
<Table.Row>
<Table.Cell>VBrowser Resolution</Table.Cell>
<Table.Cell>720p</Table.Cell>
<Table.Cell>1080p</Table.Cell>
</Table.Row>
<Table.Row>
<Table.Cell>VBrowser CPU/RAM</Table.Cell>
<Table.Cell>Standard</Table.Cell>
<Table.Cell>Extra</Table.Cell>
</Table.Row>
<Table.Row>
<Table.Cell>VBrowser Session Length</Table.Cell>
<Table.Cell>3 hours</Table.Cell>
<Table.Cell>24 hours</Table.Cell>
</Table.Row>
<Table.Row>
<Table.Cell>Number of Permanent Rooms</Table.Cell>
<Table.Cell>1</Table.Cell>
<Table.Cell>20</Table.Cell>
</Table.Row>
{/* <Table.Row>
<Table.Cell>Max Room Capacity</Table.Cell>
<Table.Cell>20</Table.Cell>
<Table.Cell>100</Table.Cell>
</Table.Row> */}
<Table.Row>
<Table.Cell>Custom Room URLs</Table.Cell>
<Table.Cell></Table.Cell>
<Table.Cell>
<Icon name="check" />
</Table.Cell>
</Table.Row>
<Table.Row>
<Table.Cell>Discord Subscriber Role (on request)</Table.Cell>
<Table.Cell></Table.Cell>
<Table.Cell>
<Icon name="check" />
</Table.Cell>
</Table.Row>
<Table.Row>
<Table.Cell>Animated Chat Avatar Frame</Table.Cell>
<Table.Cell></Table.Cell>
<Table.Cell>
<Icon name="check" />
</Table.Cell>
</Table.Row>
<Table.Row>
<Table.Cell>Custom Room Title & Description</Table.Cell>
<Table.Cell></Table.Cell>
<Table.Cell>
<Icon name="check" />
</Table.Cell>
</Table.Row>
<Table.Row>
<Table.Cell>Price</Table.Cell>
<Table.Cell>$0 / month</Table.Cell>
<Table.Cell>$5 / month</Table.Cell>
</Table.Row>
</Table.Body>
</Table>
<div style={{ textAlign: 'right' }}>
{/* if user isn't logged in, provide login prompt */}
{this.props.user && this.props.user.email ? (
<Button
icon
labelPosition="left"
color="blue"
size="large"
onClick={this.onSubscribe}
>
<Icon name="cc stripe" />
Subscribe with Stripe
</Button>
) : (
<div>
Please sign in to subscribe: <SignInButton user={undefined} />
</div>
)}
</div>
</Modal.Description>
</Modal.Content>
</Modal>
);
}
Example #20
Source File: citeoptimizer.tsx From website with MIT License | 4 votes |
renderTable(data, training = true) {
const createStateAccessors = (name) => [
this.state[name],
(value) => this.setState((prevState) => { prevState[name] = value; return prevState; })
];
const [paginationPage, setPaginationPage] = createStateAccessors(training ? 'trainingPage' : 'citePage');
const [otherPaginationPage, setOtherPaginationPage] = createStateAccessors(training ? 'citePage' : 'trainingPage');
const [paginationRows, setPaginationRows] = createStateAccessors('paginationRows');
const baseRow = (paginationPage - 1) * paginationRows;
const totalPages = Math.ceil(data.length / paginationRows);
return (
<Table sortable celled selectable striped collapsing unstackable compact="very">
<Table.Header>
<Table.Row>
<Table.HeaderCell>Rank</Table.HeaderCell>
<Table.HeaderCell>Crew</Table.HeaderCell>
<Table.HeaderCell>Rarity</Table.HeaderCell>
<Table.HeaderCell>Final EV</Table.HeaderCell>
{!training &&
<React.Fragment>
<Table.HeaderCell>Remaining EV</Table.HeaderCell>
<Table.HeaderCell>EV Per Citation</Table.HeaderCell>
</React.Fragment>
}
<Table.HeaderCell>Voyages Improved</Table.HeaderCell>
</Table.Row>
</Table.Header>
<Table.Body>
{data.slice(baseRow, baseRow + paginationRows).map((row, idx) => {
const crew = this.props.playerData.player.character.crew.find(c => c.name == row.name);
return (
<Table.Row>
<Table.Cell>{baseRow + idx + 1}</Table.Cell>
<Table.Cell>
<div
style={{
display: 'grid',
gridTemplateColumns: '60px auto',
gridTemplateAreas: `'icon stats' 'icon description'`,
gridGap: '1px'
}}>
<div style={{ gridArea: 'icon' }}>
<img width={48} src={`${process.env.GATSBY_ASSETS_URL}${crew.imageUrlPortrait}`} />
</div>
<div style={{ gridArea: 'stats' }}>
<span style={{ fontWeight: 'bolder', fontSize: '1.25em' }}>{crew.name}</span>
</div>
</div>
</Table.Cell>
<Table.Cell>
<Rating icon='star' rating={crew.rarity} maxRating={crew.max_rarity} size='large' disabled />
</Table.Cell>
<Table.Cell>
{Math.ceil(training ? row.addedEV : row.totalEVContribution)}
</Table.Cell>
{
!training &&
<React.Fragment>
<Table.Cell>
{Math.ceil(row.totalEVRemaining)}
</Table.Cell>
<Table.Cell>
{Math.ceil(row.evPerCitation)}
</Table.Cell>
</React.Fragment>
}
<Table.Cell>
<Popup trigger={<b>{row.voyagesImproved.length}</b>} content={row.voyagesImproved.join(', ')} />
</Table.Cell>
</Table.Row>
);
})}
</Table.Body>
<Table.Footer>
<Table.Row>
<Table.HeaderCell colSpan={9}>
<Pagination
totalPages={totalPages}
activePage={paginationPage}
onPageChange={(event, { activePage }) => setPaginationPage(activePage as number)}
/>
<span style={{ paddingLeft: '2em' }}>
Rows per page:{' '}
<Dropdown
inline
options={pagingOptions}
value={paginationRows}
onChange={(event, { value }) => {
setPaginationPage(1);
setOtherPaginationPage(1);
setPaginationRows(value as number);
}}
/>
</span>
</Table.HeaderCell>
</Table.Row>
</Table.Footer>
</Table>
);
}