react-icons/fi#FiTrash2 TypeScript Examples
The following examples show how to use
react-icons/fi#FiTrash2.
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: RangeSelector.tsx From HoldemSolver with MIT License | 4 votes |
function RangeSelector(props: Props): React.ReactElement {
const {
handRange,
setComboActive,
setComboInactive,
setSuitComboActive,
setSuitComboInactive,
setRange,
setRangePairs,
setRangeBroadway,
setRangeAll,
clearRange,
activeCombo,
className = '',
} = props;
function setRangeText(rangeStr: string) {
setRange(HandRange.fromString(rangeStr));
}
const comboCount = handRange.comboCount();
const comboStates = handRange.comboStates();
const rangeStr = handRange.toString();
const suitCombos = new Array(16).fill(0).map((_, i) => <SuitCombo key={`${activeCombo}-${i}`} comboIndex={activeCombo} suitIndex={i}/>);
const suitStates = handRange.comboState(activeCombo);
return (
<RangeSelectorStyle className={className}>
<div className="range-selector-top-bar">
<div className="range-selector-top-bar-left">
<div className="range-title">
<h2>Raise first in</h2>
<FiEdit2/>
</div>
<div className="range-pos-game">
<span>6-MAX CASH</span>
<span>UTG+1</span>
</div>
</div>
<div className="range-selector-top-bar-right">
<Button onClick={() => {}} icon={<FiTrash2/>}>
Delete
</Button>
<Button onClick={() => {}} icon={<FiSave/>}>
Save
</Button>
</div>
</div>
<Matrix
elements={COMBO_NAMES}
states={comboStates}
onSelectElement={setComboActive}
onDeselectElement={setComboInactive}
rows={13}
cols={13}
className="range-selector-matrix"
/>
<div className="range-selector-bottom-bar">
<div className="range-selector-controls">
<div className="combo-count">
<span className="combo-count-selected">{comboCount}</span>/1326 combos selected{' '}
<span className="combo-count-selected">({((comboCount * 100) / 1326).toPrecision(3)}%)</span>
</div>
<div className="range-selector-controls-buttons">
<div className="range-selector-control-btn" onClick={setRangeAll}>
All
</div>
<div className="range-selector-control-btn" onClick={setRangePairs}>
Pairs
</div>
<div className="range-selector-control-btn" onClick={setRangeBroadway}>
Broadway
</div>
<div className="range-selector-control-btn range-selector-clear-btn" onClick={clearRange}>
Clear
</div>
</div>
<TextArea
rows={4}
cols={4}
className="range-selector-text-area"
placeholder="Enter range e.g. (QQ+,AK)"
onChange={setRangeText}
value={rangeStr}
/>
</div>
<Matrix
className="range-selector-suit-matrix"
onSelectElement={setSuitComboActive}
onDeselectElement={setSuitComboInactive}
elements={suitCombos}
states={suitStates}
rows={4}
cols={4}
/>
</div>
</RangeSelectorStyle>
);
}
Example #2
Source File: AppDomains.tsx From ledokku with MIT License | 4 votes |
AppDomains = ({ appId }: AppDomainProps) => {
const toast = useToast();
const { data, loading /* error */ } = useAppByIdQuery({
variables: {
appId,
},
ssr: false,
skip: !appId,
});
const {
data: domainsData,
loading: domainsDataLoading,
refetch: appDomainsRefetch,
} = useDomainsQuery({
variables: {
appId,
},
});
const [
removeDomainMutation,
{ loading: removeDomainMutationLoading },
] = useRemoveDomainMutation();
const handleRemoveDomain = async (domain: string) => {
try {
await removeDomainMutation({
variables: {
input: {
appId,
domainName: domain,
},
},
refetchQueries: [{ query: DomainsDocument, variables: { appId } }],
});
toast.success('Domain removed successfully');
} catch (error) {
toast.error(error.message);
}
};
if (!data) {
return null;
}
// // TODO display error
if (loading) {
// TODO nice loading
return <p>Loading...</p>;
}
const { app } = data;
if (!app) {
// TODO nice 404
return <p>App not found.</p>;
}
return (
<>
<Box py="5">
<Heading as="h2" size="md">
Domain management
</Heading>
<Text fontSize="sm" color="gray.400">
List of domains you have added to {app.name} app
</Text>
</Box>
<Grid templateColumns={{ sm: 'repeat(1, 1fr)', md: 'repeat(3, 1fr)' }}>
<GridItem colSpan={2}>
<Box mb="8">
{domainsDataLoading ? <Spinner /> : null}
{domainsData?.domains.domains.length === 0 ? (
<Text fontSize="sm" color="gray.400">
Currently you haven't added any custom domains to your app
</Text>
) : null}
{domainsData?.domains.domains.map((domain: any) => (
<Flex
key={domain}
justifyContent="space-between"
alignItems="center"
>
<Link
href={`http://${domain}`}
isExternal
display="flex"
alignItems="center"
>
{domain} <Icon as={FiExternalLink} mx="2" />
</Link>
<IconButton
aria-label="Delete"
variant="ghost"
colorScheme="red"
icon={<FiTrash2 />}
disabled={removeDomainMutationLoading}
onClick={() => handleRemoveDomain(domain)}
/>
</Flex>
))}
</Box>
<AddAppDomain appId={appId} appDomainsRefetch={appDomainsRefetch} />
</GridItem>
</Grid>
</>
);
}
Example #3
Source File: env.tsx From ledokku with MIT License | 4 votes |
EnvForm = ({ name, value, appId, isNewVar }: EnvFormProps) => {
const [inputType, setInputType] = useState('password');
const toast = useToast();
const [
setEnvVarMutation,
{ loading: setEnvVarLoading },
] = useSetEnvVarMutation();
const [
unsetEnvVarMutation,
{ loading: unsetEnvVarLoading },
] = useUnsetEnvVarMutation();
const handleDeleteEnvVar = async (event: any) => {
event.preventDefault();
try {
await unsetEnvVarMutation({
variables: { key: name, appId },
refetchQueries: [{ query: EnvVarsDocument, variables: { appId } }],
});
} catch (error) {
toast.error(error.message);
}
};
const formik = useFormik<{ name: string; value: string }>({
initialValues: {
name,
value,
},
onSubmit: async (values) => {
// TODO validate values
try {
await setEnvVarMutation({
variables: { key: values.name, value: values.value, appId },
refetchQueries: [{ query: EnvVarsDocument, variables: { appId } }],
});
if (isNewVar) {
formik.resetForm();
}
toast.success('Environment variable set successfully');
} catch (error) {
toast.error(error.message);
}
},
});
return (
//TODO Handle visual feedback on changing env
//TODO Provide infos about env vars
<form onSubmit={formik.handleSubmit} autoComplete="off">
<Grid
templateColumns={{ sm: 'repeat(1, 1fr)', md: 'repeat(3, 1fr)' }}
gap="3"
mt="3"
>
<GridItem>
<Input
autoComplete="off"
id={isNewVar ? 'newVarName' : name}
name="name"
placeholder="Name"
key={name}
value={formik.values.name}
onChange={formik.handleChange}
/>
</GridItem>
<GridItem>
<Input
autoComplete="off"
onMouseEnter={() => setInputType('text')}
onMouseLeave={() => setInputType('password')}
onFocus={() => setInputType('text')}
onBlur={() => setInputType('password')}
id={isNewVar ? 'newVarValue' : value}
name="value"
placeholder="Value"
key={value}
value={formik.values.value}
onChange={formik.handleChange}
type={inputType}
/>
</GridItem>
<GridItem display="flex">
<Button isLoading={setEnvVarLoading} type="submit">
{isNewVar ? 'Add' : 'Save'}
</Button>
{!isNewVar && (
<IconButton
aria-label="Delete"
variant="outline"
ml="3"
icon={<FiTrash2 />}
isLoading={unsetEnvVarLoading}
onClick={handleDeleteEnvVar}
/>
)}
</GridItem>
</Grid>
</form>
);
}
Example #4
Source File: Inspector.tsx From openchakra with MIT License | 4 votes |
Inspector = () => {
const dispatch = useDispatch()
const component = useSelector(getSelectedComponent)
const { isOpen, onOpen, onClose } = useDisclosure()
const [componentName, onChangeComponentName] = useState('')
const componentsNames = useSelector(getComponentNames)
const { clearActiveProps } = useInspectorUpdate()
const saveComponent = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault()
dispatch.components.setComponentName({
componentId: component.id,
name: componentName,
})
onClose()
onChangeComponentName('')
}
const isValidComponentName = useMemo(() => {
return (
!!componentName.match(/^[A-Z]\w*$/g) &&
!componentsNames.includes(componentName) &&
// @ts-ignore
!componentsList.includes(componentName)
)
}, [componentName, componentsNames])
const { type, rootParentType, id, children } = component
const isRoot = id === 'root'
const parentIsRoot = component.parent === 'root'
const docType = rootParentType || type
const componentHasChildren = children.length > 0
useEffect(() => {
clearActiveProps()
}, [clearActiveProps])
return (
<>
<Box bg="white">
<Box
fontWeight="semibold"
fontSize="md"
color="yellow.900"
py={2}
px={2}
boxShadow="sm"
bg="yellow.100"
display="flex"
justifyContent="space-between"
flexDir="column"
>
{isRoot ? 'Document' : type}
{!!component.componentName && (
<Text fontSize="xs" fontWeight="light">
{component.componentName}
</Text>
)}
</Box>
{!isRoot && (
<Stack
direction="row"
py={2}
spacing={2}
align="center"
zIndex={99}
px={2}
flexWrap="wrap"
justify="flex-end"
>
<CodeActionButton />
{!component.componentName && (
<ActionButton
label="Name component"
icon={<EditIcon path="" />}
onClick={onOpen}
/>
)}
<ActionButton
label="Duplicate"
onClick={() => dispatch.components.duplicate()}
icon={<CopyIcon path="" />}
/>
<ActionButton
label="Reset props"
icon={<IoMdRefresh />}
onClick={() => dispatch.components.resetProps(component.id)}
/>
<ActionButton
label="Chakra UI Doc"
as={Link}
onClick={() => {
window.open(
`https://chakra-ui.com/${docType.toLowerCase()}`,
'_blank',
)
}}
icon={<GoRepo />}
/>
<ActionButton
bg="red.500"
label="Remove"
onClick={() => dispatch.components.deleteComponent(component.id)}
icon={<FiTrash2 />}
/>
</Stack>
)}
</Box>
<Box pb={1} bg="white" px={3}>
<Panels component={component} isRoot={isRoot} />
</Box>
<StylesPanel
isRoot={isRoot}
showChildren={componentHasChildren}
parentIsRoot={parentIsRoot}
/>
<Modal onClose={onClose} isOpen={isOpen} isCentered>
<ModalOverlay>
<ModalContent>
<form onSubmit={saveComponent}>
<ModalHeader>Save this component</ModalHeader>
<ModalCloseButton />
<ModalBody>
<FormControl isInvalid={!isValidComponentName}>
<FormLabel>Component name</FormLabel>
<Input
size="md"
autoFocus
variant="outline"
isFullWidth
focusBorderColor="blue.500"
errorBorderColor="red.500"
value={componentName}
onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
onChangeComponentName(e.target.value)
}
/>
{!isValidComponentName && (
<FormErrorMessage>
Component name must start with a capital character and
must not contain space or special character, and name
should not be already taken (including existing chakra-ui
components).
</FormErrorMessage>
)}
<FormHelperText>
This will name your component that you will see in the code
panel as a separated component.
</FormHelperText>
</FormControl>
</ModalBody>
<ModalFooter>
<Button
colorScheme="blue"
mr={3}
type="submit"
isDisabled={!isValidComponentName}
>
Save
</Button>
<Button onClick={onClose}>Cancel</Button>
</ModalFooter>
</form>
</ModalContent>
</ModalOverlay>
</Modal>
</>
)
}