Files
flipper/desktop/plugins/public/sandbox/index.tsx
Pascal Hartig 47099cfd31 Fix Flipper lints #16
Summary: Larger list of fixes. Adding another package to the flipper export is a bit nasty but it unblocks us for now and centralises `remote` access which seems like a win for FAAS.

Reviewed By: mweststrate

Differential Revision: D30785421

fbshipit-source-id: 931297e8566b5d8a213b69ae87d0cda7648b3ed4
2021-09-08 08:44:19 -07:00

151 lines
3.5 KiB
TypeScript

/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/
import {
FlipperPlugin,
FlexColumn,
ButtonGroup,
Button,
styled,
colors,
} from 'flipper';
import React, {ChangeEvent} from 'react';
export type Sandbox = {
name: string;
value: string;
};
type SandboxState = {
sandboxes: Array<Sandbox>;
customSandbox: string;
showFeedback: boolean;
};
const BigButton = styled(Button)({
flexGrow: 1,
fontSize: 24,
padding: 20,
});
const ButtonContainer = styled(FlexColumn)({
alignItems: 'center',
padding: 20,
});
export default class SandboxView extends FlipperPlugin<
SandboxState,
any,
unknown
> {
state: SandboxState = {
sandboxes: [],
customSandbox: '',
showFeedback: false,
};
static TextInput = styled.input({
border: `1px solid ${colors.light10}`,
fontSize: '1em',
padding: '0 5px',
borderRight: 0,
borderTopLeftRadius: 4,
borderBottomLeftRadius: 4,
flexGrow: 1,
});
static FeedbackMessage = styled.span({
fontSize: '1.2em',
paddingTop: '10px',
color: 'green',
});
static TextInputLayout = styled(FlexColumn)({
float: 'left',
justifyContent: 'center',
flexGrow: 1,
borderRadius: 4,
marginRight: 15,
marginTop: 15,
marginLeft: 15,
});
init() {
if (!this.client.isConnected) {
return;
}
this.client
.call('getSandbox', {})
.then((results: Array<Sandbox>) => {
this.setState({sandboxes: results});
})
.catch((e) => console.error('[sandbox] getSandbox call failed:', e));
}
onSendSandboxEnvironment = (sandbox: string) => {
this.client
.call('setSandbox', {
sandbox: sandbox,
})
.then((result: {result: boolean}) => {
setTimeout(() => {
this.setState({showFeedback: false});
}, 3000);
this.setState({showFeedback: result.result});
})
.catch((e) => console.error('[sandbox] setSandbox call failed:', e));
};
onChangeSandbox = (e: ChangeEvent<HTMLInputElement>) => {
this.setState({customSandbox: e.target.value});
};
render() {
return (
<FlexColumn>
<SandboxView.TextInputLayout>
<ButtonGroup>
<SandboxView.TextInput
type="text"
placeholder="Sandbox URL (e.g. unixname.sb.facebook.com)"
key="sandbox-url"
onChange={this.onChangeSandbox}
onKeyPress={(event) => {
if (event.key === 'Enter') {
this.onSendSandboxEnvironment(this.state.customSandbox);
}
}}
/>
<Button
key="sandbox-send"
icon="download"
onClick={() =>
this.onSendSandboxEnvironment(this.state.customSandbox)
}
disabled={this.state.customSandbox == null}
/>
</ButtonGroup>
<SandboxView.FeedbackMessage
hidden={this.state.showFeedback == false}>
Success!
</SandboxView.FeedbackMessage>
</SandboxView.TextInputLayout>
{this.state.sandboxes.map((sandbox) => (
<ButtonContainer key={sandbox.value}>
<BigButton
onClick={() => this.onSendSandboxEnvironment(sandbox.value)}>
{sandbox.name}
</BigButton>
</ButtonContainer>
))}
</FlexColumn>
);
}
}