react-icons/fa#FaLink TypeScript Examples
The following examples show how to use
react-icons/fa#FaLink.
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: Links.tsx From hub with Apache License 2.0 | 6 votes |
ICONS: IconTypeList = {
homepage: TiHome,
source: FaCode,
source_github: FaGithub,
source_gitlab: SiGitlab,
source_gitea: SiGitea,
source_bitbucket: SiBitbucket,
support: BsFlagFill,
default: FaLink,
}
Example #2
Source File: ImageBtn.tsx From hub with Apache License 2.0 | 6 votes |
ImageBtn = (props: Props) => {
const ref = useRef<HTMLDivElement | null>(null);
useEffect(() => {
// Scrolls content into view when a image is active
if (props.isActive && ref && ref.current) {
ref.current.scrollIntoView({ block: 'start', inline: 'nearest', behavior: 'smooth' });
}
}, [props.isActive]);
return (
<div ref={ref} className={`d-flex flex-row align-items-center fw-bold mb-2 ${styles.btnWrapper}`}>
<button
onClick={props.onClick}
className={`btn btn-link text-reset position-absolute lh-1 text-center float-start bg-white ${styles.linkBtn}`}
>
<FaLink />
</button>
<GoPackage />
<div className="ps-2 text-truncate">
<span className={`text-uppercase text-muted me-2 ${styles.tableTitle}`}>Image:</span>
{props.image}
</div>
</div>
);
}
Example #3
Source File: SectionBtn.tsx From hub with Apache License 2.0 | 6 votes |
SectionBtn = (props: Props) => {
const ref = useRef<HTMLDivElement | null>(null);
useEffect(() => {
// Scrolls content into view when a image is active
if (props.visibleSection === props.name && ref && ref.current) {
ref.current.scrollIntoView({ block: 'start', inline: 'nearest', behavior: 'smooth' });
}
}, [props.name, props.visibleSection]);
return (
<div ref={ref} className={`position-relative ${styles.btnWrapper} `}>
<button
onClick={props.onClick}
className={`btn btn-link text-reset position-absolute lh-1 text-center float-start bg-white ${styles.linkBtn} ${styles.inSection}`}
>
<FaLink />
</button>
<div className={`h5 text-dark text-uppercase fw-bold ${props.className}`}>{props.title}</div>
</div>
);
}
Example #4
Source File: TargetImageBtn.tsx From hub with Apache License 2.0 | 6 votes |
TargetImageBtn = (props: Props) => {
const ref = useRef<HTMLDivElement | null>(null);
useEffect(() => {
// Scrolls content into view when a target is active
if (ref && ref.current && !props.hasOnlyOneTarget) {
if (props.isExpanded || (props.isActive && isNull(props.expandedTarget))) {
ref.current.scrollIntoView({ block: 'start', inline: 'nearest', behavior: 'smooth' });
}
}
}, [props.expandedTarget, props.hasOnlyOneTarget, props.isActive, props.isExpanded]);
return (
<div ref={ref} className={`position-relative ${styles.btnWrapper}`}>
<button
onClick={props.onClick}
className={`btn btn-link text-reset position-absolute lh-1 text-center float-start bg-white ${styles.linkBtn} ${styles.inTarget}`}
>
<FaLink />
</button>
<div className="p-1 ps-0">{props.children}</div>
</div>
);
}
Example #5
Source File: InviteMembers.tsx From convoychat with GNU General Public License v3.0 | 4 votes |
InviteMembers: React.FC<IInviteMembers> = ({ roomId }) => {
const [selectedMembers, setSelectedMembers] = useState<any>({});
const { state, dispatch } = useModalContext();
const { register, handleSubmit, errors: formErrors } = useForm<Inputs>();
const onSubmit = async (data: Inputs) => {};
const { data: allUsers } = useListUsersQuery();
const [
createInvitationLink,
{ data: invitationLink },
] = useCreateInvitationLinkMutation({});
const [inviteMembers, { loading: isLoading }] = useInviteMembersMutation();
const toggleMemberSelection = (member: IMember) => {
if (selectedMembers[member.id]) {
let copy = { ...selectedMembers };
delete copy[member.id];
setSelectedMembers({ ...copy });
} else {
setSelectedMembers({ ...selectedMembers, [member.id]: member });
}
};
const closeModal = () => {
dispatch({ type: "CLOSE", modal: "InviteMembers" });
};
useEffect(() => {
if (state.isInviteMembersModalOpen) {
createInvitationLink({ variables: { roomId } });
}
}, [state.isInviteMembersModalOpen, roomId]);
const selectedMembersIds = Object.keys(selectedMembers);
return (
<Modal
closeTimeoutMS={300}
isOpen={state.isInviteMembersModalOpen}
onRequestClose={closeModal}
contentLabel="Create New Room"
className="ModalContent"
overlayClassName="ModalOverlay"
>
<h2>Invite Members</h2>
<small className="textcolor--gray">yeah... yeah spam them</small>
<Spacer gap="huge" />
<Input
type="text"
icon={FaLink}
postfixIcon={FaCopy}
placeholder="invitation link"
defaultValue={invitationLink?.invitation?.link}
onPostfixIconClick={e => copyToClipboard(e.value)}
label={
<span>
Copy Invitation Link{" "}
<span className="textcolor--gray">(expires after 24hours)</span>
</span>
}
/>
<Spacer gap="large" />
<div>
<Input
type="text"
name="username"
label="Find Users"
placeholder="bear grylls"
icon={FaSearch}
errors={formErrors}
inputRef={register({ required: "Username is required" })}
/>
{allUsers && (
<MemberSelector
members={allUsers?.users}
selectedMembers={selectedMembers}
onMemberClick={toggleMemberSelection}
/>
)}
<Spacer gap="xlarge" />
<ButtonGroup gap="medium" float="right">
<Button onClick={closeModal} variant="danger" icon={FaTimes}>
Cancel
</Button>
<Button
icon={FaPaperPlane}
isLoading={isLoading}
disabled={selectedMembersIds.length < 1}
onClick={() => {
inviteMembers({
variables: { roomId, members: selectedMembersIds },
});
}}
>
Invite members ({selectedMembersIds.length})
</Button>
</ButtonGroup>
</div>
</Modal>
);
}
Example #6
Source File: Content.tsx From hub with Apache License 2.0 | 4 votes |
Content = (props: Props) => {
const history = useHistory();
const wrapper = useRef<HTMLDivElement>(null);
const versionsRef = useRef<Array<HTMLDivElement | null>>([]);
const [currentOffsets, setCurrentOffsets] = useState<number[]>([]);
const openPackagePage = (newVersion: string) => {
props.onCloseModal(false);
history.push({
pathname: buildPackageURL(props.normalizedName, props.repository, newVersion, true),
state: { searchUrlReferer: props.searchUrlReferer, fromStarredPage: props.fromStarredPage },
});
};
useLayoutEffect(() => {
const offsets: number[] = versionsRef.current.map((el) => (el ? el.offsetTop : 0));
setCurrentOffsets(offsets);
}, []);
useEffect(() => {
const handleScroll = (e: Event) => {
const scrollYPosition = e.target ? (e.target as HTMLDivElement).scrollTop : 0;
const index = findClosestNumberIndex(currentOffsets, scrollYPosition);
if (index >= 0 && props.activeVersionIndex !== index) {
props.setActiveVersionIndex(index);
}
};
if (wrapper && wrapper.current && currentOffsets.length > 0) {
const element = wrapper.current;
element.addEventListener('scroll', handleScroll, { passive: true });
return () => element.removeEventListener('scroll', handleScroll);
}
}, [currentOffsets, props]);
return (
<>
<div className="flex-grow-1 overflow-auto h-100" ref={wrapper}>
{props.changelog.map((item: ChangeLog, index: number) => {
if (isNull(item.changes) || isUndefined(item.changes)) return null;
const hasBadge = item.changes.some(
(change: Change) =>
change.hasOwnProperty('kind') && !isUndefined(change.kind) && change.kind.toString() !== ''
);
return (
<div
key={`v_${item.version}`}
data-testid="changelogBlock"
className={classnames({
[styles.lastVersion]: index === props.changelog.length - 1,
})}
>
<div
className="d-inline-block d-md-flex flex-row align-items-baseline border-bottom w-100 mb-3 pb-2"
id={`changelog-${index}`}
ref={(el) => (versionsRef.current[index] = el)}
>
<div className={`d-flex flex-row align-items-baseline ${styles.versionWrapper}`}>
<button
className={`btn btn-link btn-sm text-dark text-truncate mb-0 p-0 fs-5 ${styles.btnTitle}`}
onClick={() => openPackagePage(item.version)}
aria-label={`Open version ${item.version}`}
>
{item.version}
</button>
<button
className={`btn btn-link btn-sm text-dark py-0 position-relative ${styles.btnLink}`}
onClick={() => props.updateVersionInQueryString(item.version, index)}
aria-label={`Update active version in querystring to ${item.version}`}
>
<FaLink />
</button>
</div>
{(item.containsSecurityUpdates || item.prerelease) && (
<div className={styles.badgesWrapper}>
{item.prerelease && (
<span className={`badge badge-sm rounded-pill me-2 position-relative border ${styles.badge}`}>
Pre-release
</span>
)}
{item.containsSecurityUpdates && (
<span className={`badge badge-sm rounded-pill me-2 position-relative border ${styles.badge}`}>
Contains security updates
</span>
)}
</div>
)}
{!isFuture(item.ts) && (
<div className="ms-auto ps-0 ps-md-2 text-nowrap">
<small className="text-muted">Released {moment.unix(item.ts).fromNow()}</small>
</div>
)}
</div>
<div className={`d-flex flex-column mb-4 ${styles.list}`}>
{item.changes.map((change: Change, idx: number) => (
<div key={`change_${item.version}_${idx}`} className="mb-1 w-100 d-flex flex-row">
<div className="d-flex align-items-start flex-row w-100">
{change.kind ? (
<div className={`position-relative ${styles.changeBadgeWrapper}`}>
<div
className={classnames(
'd-flex flex-row align-items-center justify-content-center text-uppercase badge rounded-pill me-2 fw-normal px-1 py-0',
styles.changeBadge,
styles[`${change.kind.toString()}ChangeBadge`]
)}
>
<span className={`position-relative ${styles.badgeIcon}`}>
{(() => {
switch (change.kind) {
case ChangeKind.added:
return <TiPlus />;
case ChangeKind.changed:
return <TiArrowSync />;
case ChangeKind.removed:
return <FaTrash />;
case ChangeKind.fixed:
return <FaWrench />;
case ChangeKind.security:
return <MdSecurity />;
case ChangeKind.deprecated:
return <RiTimerFill />;
default:
return <>-</>;
}
})()}
</span>
<span className="d-none d-md-block ms-1">{change.kind.toString()}</span>
</div>
</div>
) : (
<>
{hasBadge ? (
<div className={`position-relative ${styles.changeBadgeWrapper}`}>
<div
className={classnames(
'd-flex flex-row align-items-center justify-content-center text-uppercase badge rounded-pill me-2',
styles.changeBadge
)}
>
-
</div>
</div>
) : (
<div className="me-1 me-md-2">
<BsDot />
</div>
)}
</>
)}
<div className="flex-grow-1">
<div>{change.description}</div>
{!isUndefined(change.links) && (
<div className={`d-flex flex-row ${styles.linksWrapper}`}>
{change.links.map((link: PackageLink, idx: number) => {
return (
<div key={`change_${index}_link${idx}`}>
<ExternalLink
className={`text-muted text-decoration-underline ${styles.link}`}
href={link.url}
label={`Open link ${link.name}`}
>
{link.name}
</ExternalLink>
{idx !== change.links!.length - 1 && <BsDot className="text-muted" />}
</div>
);
})}
</div>
)}
</div>
</div>
</div>
))}
</div>
</div>
);
})}
</div>
</>
);
}
Example #7
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>
)}
</>
);
}