react-icons/fa#FaCaretDown TypeScript Examples
The following examples show how to use
react-icons/fa#FaCaretDown.
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: ExpandableList.tsx From hub with Apache License 2.0 | 5 votes |
ExpandableList = (props: Props) => {
const [open, setOpenStatus] = useState(props.open || false);
const numVisibleItems = props.visibleItems || DEFAULT_VISIBLE_ITEMS;
const list = props.items.slice(0, open ? props.items.length : numVisibleItems);
const onBtnClick = () => {
if (!isUndefined(props.onBtnClick)) {
props.onBtnClick(!open);
}
setOpenStatus(!open);
};
useEffect(() => {
if (!isUndefined(props.open) && open !== props.open) {
setOpenStatus(props.open);
}
}, [props.open]); /* eslint-disable-line react-hooks/exhaustive-deps */
useEffect(() => {
if (props.forceCollapseList && open) {
setOpenStatus(!open);
}
}, [props.forceCollapseList]); /* eslint-disable-line react-hooks/exhaustive-deps */
return (
<>
{list}
{props.items.length > numVisibleItems && (
<button data-testid="expandableListBtn" className="btn btn-link btn-sm p-0" onClick={() => onBtnClick()}>
{open ? (
<div className="d-flex align-items-center">
<FaCaretUp className="me-1" />
Show less...
</div>
) : (
<div className="d-flex align-items-center">
<FaCaretDown className="me-1" />
Show more...
</div>
)}
</button>
)}
</>
);
}
Example #2
Source File: GuestDropdown.tsx From hub with Apache License 2.0 | 5 votes |
GuestDropdown = () => {
const [openStatus, setOpenStatus] = useState(false);
const ref = useRef(null);
useOutsideClick([ref], openStatus, () => setOpenStatus(false));
return (
<div className="btn-group">
<button
className={`btn p-0 position-relative ${styles.btn}`}
type="button"
onClick={() => setOpenStatus(true)}
aria-label="Guest dropdown button"
aria-expanded={openStatus}
>
<div className="d-flex flex-row align-items-center justify-content-center">
<div
className={classnames(
'rounded-circle d-flex align-items-center justify-content-center textLight border border-2 overflow-hidden lh-1 fs-5',
styles.imageWrapper,
styles.iconWrapper
)}
>
<FaCog data-testid="settingsIcon" className="rounded-circle" />
</div>
<small className="ms-1 textLight">
<FaCaretDown />
</small>
</div>
</button>
<div
role="menu"
ref={ref}
className={classnames('dropdown-menu dropdown-menu-end', styles.dropdown, { show: openStatus })}
>
<div className={`dropdown-arrow ${styles.arrow}`} />
<div className="my-3">
<ThemeMode device="desktop" onSelection={() => setOpenStatus(false)} />
</div>
</div>
</div>
);
}
Example #3
Source File: index.tsx From netflix-clone with GNU General Public License v3.0 | 5 votes |
NavBar: React.FC = () => {
const [isBlack, setIsBlack] = useState(false);
useEffect(() => {
window.addEventListener('scroll', () => setIsBlack(window.scrollY > 10));
// Executa quando a pagina for desconstruida
return () => {
window.removeEventListener('scroll', () =>
setIsBlack(window.scrollY > 10),
);
};
}, []);
return (
<Container isBlack={isBlack}>
<RoutesMenu>
<img src={LogoNetflix} alt="dahdjahdkja" />
<ul>
<li style={{ fontWeight: 'bold' }}>Inicio</li>
<li>Series</li>
<li>Filmes</li>
<li>Mais Recentes</li>
<li>Minha Lista</li>
</ul>
</RoutesMenu>
<Profile>
<FaSearch />
<FaGift />
<FaBell />
<button type="button">
<img
src="https://occ-0-761-185.1.nflxso.net/dnm/api/v6/Z-WHgqd_TeJxSuha8aZ5WpyLcX8/AAAABR8DzEDMx6x6rgkSexM2EYh44oQISc8fyEFr6WnraR9_HyniHFDRbXRrElpLThfL9OYFOueAItK7VIEb2xH7AqA.png?r=c71"
alt="imagem profile usuario"
/>
<FaCaretDown />
</button>
</Profile>
</Container>
);
}
Example #4
Source File: UserContext.tsx From hub with Apache License 2.0 | 4 votes |
UserContext = () => {
const { ctx, dispatch } = useContext(AppCtx);
const [organizations, setOrganizations] = useState<Organization[] | null>(null);
const [isLoading, setIsLoading] = useState<boolean>(false);
const alias = ctx.user!.alias;
const [openStatus, setOpenStatus] = useState(false);
const ref = useRef(null);
useOutsideClick([ref], openStatus, () => setOpenStatus(false));
const handleChange = (value: string | Organization): void => {
if (isString(value)) {
authorizer.updateCtx();
dispatch(unselectOrg());
} else {
authorizer.updateCtx(value.name);
dispatch(updateOrg(value.name));
}
setOpenStatus(false);
};
async function fetchOrganizations() {
try {
setIsLoading(true);
const allOrganizations = await API.getAllUserOrganizations();
const confirmedOrganizations = allOrganizations.filter((org: Organization) => org.confirmed);
if (ctx.prefs.controlPanel.selectedOrg) {
const selectedOrg = confirmedOrganizations.find(
(org: Organization) => org.name === ctx.prefs.controlPanel.selectedOrg
);
if (isUndefined(selectedOrg)) {
dispatch(unselectOrg());
} else {
authorizer.updateCtx(ctx.prefs.controlPanel.selectedOrg);
}
}
setOrganizations(confirmedOrganizations);
setIsLoading(false);
} catch (err: any) {
setIsLoading(false);
if (err.kind !== ErrorKind.Unauthorized) {
setOrganizations([]);
}
}
}
useEffect(() => {
fetchOrganizations();
authorizer.init(ctx.prefs.controlPanel.selectedOrg);
}, []); /* eslint-disable-line react-hooks/exhaustive-deps */
return (
<div className={`position-relative ${styles.ctxWrapper}`}>
<div className="d-flex flex-column">
<small className={`text-uppercase text-muted ${styles.legendCtx}`}>Control panel context</small>
<div className="d-flex flex-row align-items-center">
<button
className={`btn btn-primary rounded-pill btn-sm pe-3 position-relative lh-1 ${styles.ctxBtn}`}
type="button"
onClick={() => {
fetchOrganizations();
setOpenStatus(true);
}}
aria-label="Open context"
aria-expanded={openStatus}
>
<div className="d-flex flex-row align-items-center">
{!isUndefined(ctx.prefs.controlPanel.selectedOrg) ? (
<>
<div className={`badge bg-light text-dark rounded-pill me-2 p-0 ${styles.badgeIcon}`}>
<MdBusiness />
</div>
<div className={`flex-grow-1 text-start me-1 text-truncate ${styles.badgeContent}`}>
{ctx.prefs.controlPanel.selectedOrg}
</div>
</>
) : (
<>
<div className={`badge bg-light text-dark rounded-pill me-2 p-0 ${styles.badgeIcon}`}>
<FaUser />
</div>
<div className={`flex-grow-1 text-start me-1 text-truncate ${styles.badgeContent}`}>{alias}</div>
</>
)}
</div>
<div className={`position-absolute textLight ${styles.caret}`}>
<FaCaretDown />
</div>
</button>
</div>
{isLoading && (
<div className={`position-absolute text-secondary ${styles.loading}`} role="status">
<span className="spinner-border spinner-border-sm" />
</div>
)}
</div>
<div
ref={ref}
role="menu"
className={classnames('dropdown-menu dropdown-menu-end', styles.dropdown, { show: openStatus })}
>
<div className={`dropdown-arrow ${styles.arrow}`} />
<button className="dropdown-item mw-100" onClick={() => handleChange(alias)} aria-label="Activate user context">
<div className="d-flex flex-row align-items-center text-truncate">
<FaUser className={`me-2 ${styles.icon}`} />
<div className="flex-grow-1 text-truncate">{alias}</div>
{isUndefined(ctx.prefs.controlPanel.selectedOrg) && (
<GoCheck className={`ms-2 text-success ${styles.icon}`} />
)}
</div>
</button>
{organizations && (
<>
{organizations.map((org: Organization) => (
<button
key={`opt_${org.name}`}
className="dropdown-item"
onClick={() => handleChange(org)}
aria-label={`Activate org ${org.name} context`}
>
<div className="d-flex flex-row align-items-center text-truncate">
<MdBusiness className={`me-2 ${styles.icon}`} />
<div className="flex-grow-1 text-truncate">{org.name}</div>
{!isUndefined(ctx.prefs.controlPanel.selectedOrg) &&
org.name === ctx.prefs.controlPanel.selectedOrg && (
<GoCheck className={`ms-2 text-success ${styles.icon}`} />
)}
</div>
</button>
))}
</>
)}
</div>
</div>
);
}
Example #5
Source File: UserAuthDropdown.tsx From hub with Apache License 2.0 | 4 votes |
UserAuthDropdown = (props: Props) => {
const { ctx } = useContext(AppCtx);
const [openStatus, setOpenStatus] = useState(false);
const ref = useRef(null);
useOutsideClick([ref], openStatus, () => setOpenStatus(false));
return (
<div className="btn-group">
<button
className={`btn p-0 position-relative ${styles.btn}`}
type="button"
onClick={() => setOpenStatus(true)}
aria-label="Open menu"
>
<div className="d-flex flex-row align-items-center justify-content-center">
<div
className={classnames(
'rounded-circle d-flex align-items-center justify-content-center textLight userAuth overflow-hidden position-relative border border-2 overflow-hidden lh-1 fs-5 bg-white',
styles.imageWrapper,
{ [styles.iconWrapper]: isUndefined(ctx.user!.profileImageId) || isNull(ctx.user!.profileImageId) }
)}
>
{ctx.user && ctx.user.profileImageId ? (
<Image
imageId={ctx.user.profileImageId}
alt="User profile"
className="mw-100 h-auto"
classNameForSquare={`position-absolute top-0 start-0 w-100 h-100 ${styles.imageAsBg}`}
/>
) : (
<FaUser data-testid="profileIcon" className="rounded-circle" />
)}
</div>
<small className="ms-1 textLight">
<FaCaretDown />
</small>
</div>
</button>
<div ref={ref} className={classnames('dropdown-menu dropdown-menu-end', styles.dropdown, { show: openStatus })}>
<div className={`dropdown-arrow ${styles.arrow}`} />
<p className={`mt-2 mb-0 text-break ${styles.signedInText}`}>
Signed in as <span className="fw-bold">{ctx.user!.alias}</span>
</p>
<div className="dropdown-divider my-3" />
<ThemeMode device="desktop" onSelection={() => setOpenStatus(false)} />
<div className="dropdown-divider my-3" />
<Link
className="dropdown-item"
to={{
pathname: '/packages/starred',
}}
onClick={() => setOpenStatus(false)}
>
<div className="d-flex align-items-center">
<FaStar className="me-2" />
<div>Starred packages</div>
</div>
</Link>
<Link
className="dropdown-item"
to={{
pathname: '/control-panel',
}}
onClick={() => setOpenStatus(false)}
>
<div className="d-flex align-items-center">
<FaCog className="me-2" />
<div>Control Panel</div>
</div>
</Link>
<LogOut className="mb-2" onSuccess={() => setOpenStatus(false)} privateRoute={props.privateRoute} />
</div>
</div>
);
}
Example #6
Source File: Cell.tsx From hub with Apache License 2.0 | 4 votes |
SecurityCell = (props: Props) => {
const ref = useRef<HTMLTableRowElement>(null);
const getMainReference = (): JSX.Element | null => {
if (isUndefined(props.vulnerability.References) || props.vulnerability.References.length === 0) {
return null;
}
let reference = props.vulnerability.References.find((ref: string) =>
ref.includes(props.vulnerability.VulnerabilityID)
);
if (isUndefined(reference)) {
reference = props.vulnerability.References[0];
}
return (
<ExternalLink
href={reference}
className={`ms-2 text-dark position-relative ${styles.link}`}
label={`Link to ${props.vulnerability.VulnerabilityID} vulnerability`}
>
<small>
<FaLink />
</small>
</ExternalLink>
);
};
const severity: VulnerabilitySeverity = props.vulnerability.Severity.toLowerCase() as VulnerabilitySeverity;
useEffect(() => {
// Scrolls content into view when a vulnerability is expanded
if (props.isExpanded && ref && ref.current) {
ref.current.scrollIntoView({ block: 'start', inline: 'nearest', behavior: 'smooth' });
}
}, [props.isExpanded]);
return (
<>
<tr
data-testid="vulnerabilityCell"
className={styles.clickableCell}
onClick={() => props.setVisibleVulnerability(!props.isExpanded ? props.name : undefined)}
ref={ref}
>
<td className="align-middle text-primary">{props.isExpanded ? <FaCaretDown /> : <FaCaretRight />}</td>
<td className="align-middle text-nowrap pe-3">
{props.vulnerability.VulnerabilityID}
{getMainReference()}
</td>
<td className="align-middle text-nowrap text-uppercase pe-3">
<div className="d-flex flex-row align-items-center">
<span
data-testid="severityBadge"
className={`badge p-2 me-2 ${styles.badge}`}
style={{
backgroundColor: SEVERITY_RATING[severity]!.color,
}}
>
{' '}
</span>
<small>{props.vulnerability.Severity}</small>
</div>
</td>
<td className="align-middle text-nowrap pe-3 w-25">
<div className={`d-table w-100 ${styles.wrapperCell}`}>
<div className="text-truncate">{props.vulnerability.PkgName}</div>
</div>
</td>
<td className="align-middle text-nowrap pe-3 w-25">
<div className={`d-table w-100 ${styles.wrapperCell}`}>
<div className="text-truncate">{props.vulnerability.InstalledVersion}</div>
</div>
</td>
<td className="align-middle text-nowrap pe-3 w-25" data-testid="fixedVersionCell">
{props.vulnerability.FixedVersion ? (
<div className={`d-table w-100 ${styles.wrapperCell}`}>
<div className="text-truncate">{JSON.parse(`"${props.vulnerability.FixedVersion}"`)}</div>
</div>
) : (
<span className="text-muted">-</span>
)}
</td>
</tr>
{props.isExpanded && (
<tr data-testid="vulnerabilityDetail" className={styles.noClickableCell}>
<td colSpan={6}>
<div className="m-3">
{isUndefined(props.vulnerability.title) && isUndefined(props.vulnerability.Description) ? (
<div className="fst-italic">Any information about this vulnerability</div>
) : (
<>
<div className="h6">{props.vulnerability.Title}</div>
{props.vulnerability.Description && (
<p className="text-muted mb-1">{props.vulnerability.Description}</p>
)}
<div className="d-flex flex-column text-end">
{!isUndefined(props.vulnerability.LastModifiedDate) &&
!isFuture(props.vulnerability.LastModifiedDate, false) && (
<small className="fst-italic">
Updated {moment(props.vulnerability.LastModifiedDate).fromNow()}
</small>
)}
</div>
{props.vulnerability.CVSS && (
<CVSSVector
source={props.vulnerability.SeveritySource}
severity={severity}
CVSS={props.vulnerability.CVSS || {}}
/>
)}
</>
)}
</div>
</td>
</tr>
)}
</>
);
}
Example #7
Source File: Table.tsx From hub with Apache License 2.0 | 4 votes |
SecurityTable = (props: Props) => {
const [visibleVulnerability, setVisibleVulnerability] = useState<string | undefined>();
const getEmptyMessage = (): JSX.Element => <span className="fst-italic text-muted">No vulnerabilities found</span>;
const getTargetName = (target: string): string => {
return getTextBetweenParenthesis(target) || target;
};
const isActiveImage = isNull(props.visibleTarget) ? props.visibleImage === props.image : false;
return (
<div className="my-1">
<ImageBtn
image={props.image}
isActive={isActiveImage}
onClick={() => {
if (!isActiveImage) {
props.setVisibleImage(props.image);
props.setVisibleTarget(null);
props.setExpandedTarget(null);
}
}}
/>
<div data-testid="securityReportInfo">
{isNull(props.reports) ? (
<div className="ms-4 mb-4">{getEmptyMessage()}</div>
) : (
<>
{props.reports.map((item: SecurityReportResult, index: number) => {
const targetImageName = `${props.image}_${item.Target}`;
const { list, summary } = formatSecurityReport(item.Vulnerabilities);
const visibleVulnerabilities = slice(list, 0, MAX_VULNERABILITY_NUMBER);
const isActive = !isNull(props.visibleTarget)
? targetImageName === `${props.visibleImage}_${props.visibleTarget}`
: false;
const isExpanded = props.expandedTarget === targetImageName;
const isLastTarget = props.lastReport && index === props.reports.length - 1;
return (
<Fragment key={`table_${targetImageName}`}>
<div
className="ms-4"
style={{
minHeight: isLastTarget && !isUndefined(props.contentHeight) ? props.contentHeight + 40 : 'auto',
}}
>
<TargetImageBtn
isActive={isActive}
isExpanded={isExpanded}
expandedTarget={props.expandedTarget}
onClick={() => {
props.setVisibleImage(props.image);
props.setVisibleTarget(item.Target);
props.setExpandedTarget(null);
}}
hasOnlyOneTarget={props.hasOnlyOneTarget}
>
<div className="d-flex flex-row align-items-center mb-2">
{isExpanded ? <FaCaretDown /> : <FaCaretRight />}
<div
data-testid="targetTitle"
className={`${styles.tableTitle} fw-bold me-3 ms-1 text-truncate`}
>
<span className="text-uppercase text-muted me-2">Target:</span>
<span className="fw-bold">{getTargetName(item.Target)}</span>
</div>
<div className={`${styles.tableTitle} d-flex flex-row align-items-center fw-bold text-nowrap`}>
<span className="text-uppercase text-muted">Rating:</span>
<SecurityRating
summary={summary}
className={`ms-2 ${styles.securityRatingBadge}`}
onlyBadge
/>
</div>
{visibleVulnerabilities.length > 0 && (
<button
className={`btn badge bg-secondary ms-3 ${styles.badge}`}
onClick={() => props.setExpandedTarget(isExpanded ? null : targetImageName)}
aria-label={`${isExpanded ? 'Close' : 'Open'} target image vulnerabilities`}
>
{isExpanded ? 'Hide' : 'Show'} vulnerabilities
</button>
)}
</div>
</TargetImageBtn>
{isExpanded && (
<div className="w-100 overflow-auto mb-2">
<table className={`table table-sm table-hover ${styles.table}`}>
<thead>
<tr className="text-uppercase text-muted">
<th scope="col" className={`border-top-0 ${styles.fitCell}`} />
<th scope="col" className="border-top-0">
ID
</th>
<th scope="col" className="border-top-0">
Severity
</th>
<th scope="col" className="border-top-0">
Package
</th>
<th scope="col" className="border-top-0">
Version
</th>
<th scope="col" className="border-top-0 text-nowrap">
Fixed in
</th>
</tr>
</thead>
<tbody className="bg-white">
{visibleVulnerabilities.map((item: Vulnerability, index: number) => {
const vulnerabilityName = `${item.VulnerabilityID}_${index}`;
return (
<SecurityCell
name={vulnerabilityName}
vulnerability={item}
key={`cell_${item.PkgName}_${item.VulnerabilityID}`}
isExpanded={visibleVulnerability === vulnerabilityName}
setVisibleVulnerability={setVisibleVulnerability}
/>
);
})}
{list.length > visibleVulnerabilities.length && (
<tr>
<td colSpan={6} className="align-middle text-end pt-3">
<span className="text-muted fst-italic">
Displaying only the first {MAX_VULNERABILITY_NUMBER} entries
</span>
</td>
</tr>
)}
</tbody>
</table>
</div>
)}
</div>
</Fragment>
);
})}
</>
)}
</div>
</div>
);
}