react-icons/fi#FiDownload JavaScript Examples
The following examples show how to use
react-icons/fi#FiDownload.
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: GenericExport.js From winstall with GNU General Public License v3.0 | 5 votes |
GenericExport = ({ fileContent, displayedCommand, fileExtension, prioritiseDownload=false, tip }) => {
const [copyText, setCopyText] = useState("Copy to clipboard");
const [textboxContent, setTextboxContent] = useState();
const [downloadId, setDownloadId] = useState(Math.floor(1000 + Math.random() * 9000));
useEffect(() => {
setCopyText("Copy to clipboard");
setTextboxContent(displayedCommand ? displayedCommand.replace("$fileName", `winstall-${downloadId}.json`) : fileContent);
}, [fileContent, displayedCommand, downloadId])
return (
<div className={styles.generate}>
<textarea
value={ textboxContent }
readOnly
onFocus={(e) => e.target.select()}
onClick={(e) => e.target.select()}
spellCheck={false}
data-gramm_editor={false} // disable grammarly from showing up
/>
{ tip && (
<div className={styles.tipContainer}>
<FiInfo/>
<p>{tip}</p>
</div>
)}
<div className={`box`}>
{ !prioritiseDownload && (
<button className={`button accent`} onClick={() => handleCopy(textboxContent, setCopyText)}>
<FiCopy />
{copyText}
</button>
)}
<button className={`button dl ${prioritiseDownload ? 'accent' : ''}`} onClick={() => {
handleDownload(fileContent, fileExtension, downloadId);
setDownloadId(Math.floor(1000 + Math.random() * 9000));
if(prioritiseDownload){
handleCopy(textboxContent);
}
}}>
<FiDownload />
Download {fileExtension} {prioritiseDownload ? " + Copy to clipboard" : ""}
</button>
</div>
</div>
)
}
Example #2
Source File: downloads.js From velocitypowered.com with MIT License | 5 votes |
export default function Sponsors() {
return (
<>
<Seo title="Downloads" />
<DownloadsJumbotron>
<ImploreDownload>
<h1>Download Velocity</h1>
<p>Ready to experience Velocity? Download the latest stable version or the latest development version:</p>
</ImploreDownload>
<ButtonSection>
<MainPageButton icon={<FiDownload size={"36px"}/>}
title={`Stable (Velocity ${LATEST})`}
subtitle={'Recommended for most users'}
link={`https://api.papermc.io/v2/projects/velocity/versions/${LATEST}/builds/${LATEST_BUILD}/downloads/velocity-${LATEST}-${LATEST_BUILD}.jar`} />
<MainPageButton icon={<FiDownload size={"36px"}/>}
title={`Development (Velocity 3.x.x)`}
subtitle={'Bleeding edge bug fixes and improvements'}
link={`https://papermc.io/downloads#Velocity`} />
</ButtonSection>
</DownloadsJumbotron>
<DownloadsContainer>
<h2>After you download Velocity...</h2>
<p>We're so glad you're on board. Here's a few things you'll want to do:</p>
<h3>Get Velocity set up</h3>
<p>Check out our <Link to={"/wiki/users/getting-started/"}>wiki on how get started</Link> with Velocity.</p>
<h3>Join our welcoming community</h3>
<p>
We're on <a href={"https://discord.gg/papermc"}>Discord</a>, <a href={"https://github.com/PaperMC/Velocity"}>GitHub</a>,
and <a href={"https://forums.papermc.io/"}>our forums</a>.
</p>
<h3>Stuck?</h3>
<p>
Check out our extensive <Link to={"/wiki/"}>wiki</Link> — often the answer will be there. Otherwise come
ask us on <a href={"https://discord.gg/papermc"}>Discord</a> and we'll be able to help.
</p>
<h2>Unsupported versions</h2>
<Caution>
The Velocity 1.x.x series is no longer supported. In addition, due to the
<a href="https://www.lunasec.io/docs/blog/log4j-zero-day/">Log4Shell</a> security
vulnerability they are also <em>unsafe to run</em>. These builds are for archival and historical purposes only.
</Caution>
<h3>Velocity 1.1.9</h3>
<div style={{ display: 'flex', marginTop: '1rem' }}>
<MainPageButton icon={<FiDownload size={"16px"}/>}
title={"Velocity 1.1.9"}
link={`https://api.papermc.io/v2/projects/velocity/versions/1.1.9/builds/447/downloads/velocity-1.1.9-447.jar`}
demoted={true} />
</div>
<h3>Velocity 1.0.10</h3>
<div style={{ display: 'flex', marginTop: '1rem' }}>
<MainPageButton icon={<FiDownload size={"16px"}/>}
title={"Velocity 1.0.10"}
link={`https://api.papermc.io/v2/projects/velocity/versions/1.0.10/builds/245/downloads/velocity-1.0.10-245.jar`}
demoted={true} />
</div>
</DownloadsContainer>
</>
)
}
Example #3
Source File: index.js From velocitypowered.com with MIT License | 5 votes |
export default function Home() {
return (
<>
<Seo title="Welcome to Velocity" />
<Jumbotron>
<JumbotronLogo>
<VelocityLogo />
<div>
<h1>Velocity</h1>
<p>The modern, next-generation Minecraft server proxy.</p>
<ButtonSection>
<MainPageButton icon={<FiDownload size={"32px"}/>} title={"Download Now"} link={"/downloads"} />
<MainPageButton icon={<FiBook size={"32px"}/>} title={"Learn More"} link={"/wiki"} />
</ButtonSection>
</div>
</JumbotronLogo>
</Jumbotron>
<Explainer>
<ExplainerSection>
<ExplainerTidbit>
<h2>Meet Velocity.</h2>
<p>
Velocity is a next-generation Minecraft proxy focused on scalability and flexibility. It allows server owners to link together multiple Minecraft servers so they may appear as one.
</p>
</ExplainerTidbit>
<ExplainerTidbit>
<h2>Blazing fast, extensible, and secure — choose three.</h2>
<p>
Velocity is blazing fast. Fast logins, fast server switches, optimizations to get the most from your server's hardware, and a focus on security means you can finally have plugins, a highly optimized proxy resilient to attacks, and protection against your backend servers being accessed by malicious users — no compromises required.
</p>
</ExplainerTidbit>
<ExplainerTidbit>
<h2>Always there for you.</h2>
<p>
Velocity powers some of the world's largest Minecraft networks along with numerous small networks. Velocity can scale to thousands of players per proxy instance. Best of all, it works with Paper, Sponge, Forge, Fabric, and all versions of Minecraft from 1.7.2 to 1.18.1.
</p>
</ExplainerTidbit>
</ExplainerSection>
</Explainer>
</>
)
}
Example #4
Source File: ContextMenu.js From sailplane-web with GNU General Public License v3.0 | 5 votes |
ContextMenu = () => {
return (
<>
<Menu id={'menu-id'}>
<Item
className={'MenuItem'}
onClick={(obj) => obj.props.handleDownload()}>
<FiDownload size={16} style={styles.icon} />
<span style={{...styles.menuItem}}>Download</span>
</Item>
<Item className={'MenuItem'} onClick={(obj) => obj.props.handleEdit()}>
<FiEdit size={16} style={styles.icon} />
<span style={{...styles.menuItem}}>Rename</span>
</Item>
<Item className={'MenuItem'} onClick={(obj) => obj.props.handleShare()}>
<FiShare2 size={16} style={styles.icon} />
<span style={{...styles.menuItem}}>Share</span>
</Item>
<Separator />
<Item
className={'MenuItem delete'}
onClick={(obj) => obj.props.handleDelete()}>
<FiTrash size={16} style={styles.icon} />
<span style={{...styles.menuItem}}>Delete</span>
</Item>
</Menu>
<Menu id={'menu-id-no-share'}>
<Item className={'MenuItem'} onClick={(obj) => obj.props.handleDownload()}>
<FiDownload size={16} style={styles.icon} />
<span style={{...styles.menuItem}}>Download</span>
</Item>
<Item className={'MenuItem'} onClick={(obj) => obj.props.handleEdit()}>
<FiEdit size={16} style={styles.icon} />
<span style={{...styles.menuItem}}>Rename</span>
</Item>
<Separator />
<Item className={'MenuItem delete'} onClick={(obj) => obj.props.handleDelete()}>
<FiTrash size={16} style={styles.icon} />
<span style={{...styles.menuItem}}>Delete</span>
</Item>
</Menu>
</>
);
}
Example #5
Source File: SingleApp.js From winstall with GNU General Public License v3.0 | 4 votes |
SingleApp = ({ app, all, onVersionChange = false, large = false, showTime = false, pack = false, displaySelect = true, preventGlobalSelect, hideBorder=false, preSelected=false}) => {
const [selected, setSelected] = useState(false);
const { selectedApps, setSelectedApps } = useContext(SelectedContext);
const [version, setVersion] = useState(app.latestVersion);
if (!app.selectedVersion) app.selectedVersion = version;
if (app.versions.length > 1) {
app.versions = app.versions.sort((a, b) =>
compareVersion(b.version, a.version)
);
// make sure latest version is sorted
app.latestVersion = app.versions[0].version;
}
useEffect(() => {
if(preSelected){
setSelected(true);
return;
}
let found = selectedApps.find((a) => a._id === app._id);
if (!found){
if(selected){
setSelected(false);
}
return;
};
if (found.selectedVersion !== app.latestVersion) {
setVersion(found.selectedVersion);
}
setSelected(true);
}, [selectedApps, app._id]);
let handleAppSelect = () => {
if (preventGlobalSelect) {
preventGlobalSelect(app, !selected);
setSelected(!selected);
return;
}
let found = selectedApps.findIndex((a) => a._id === app._id);
if (found !== -1) {
let updatedSelectedApps = selectedApps.filter(
(a, index) => index !== found
);
setSelectedApps(updatedSelectedApps);
setSelected(false);
} else if(app){
setSelected(true);
if (all) {
app = all.find((i) => app._id == i._id);
setSelectedApps([...selectedApps, app]);
} else {
setSelectedApps([...selectedApps, app]);
}
}
};
if (!app && !app.img || !app.name) return <></>;
let VersionSelector = () => {
return (
<div className={styles.versions}>
<select
className={styles.versionSelector}
value={version}
onClick={(e) => e.stopPropagation()}
id="v-selector"
name="Select app version"
onChange={(e) => {
setVersion(e.target.value);
app.selectedVersion = e.target.value;
if (selected) {
let found = selectedApps.find((a) => a._id === app._id);
found.selectedVersion = e.target.value;
if(onVersionChange) onVersionChange();
}
}}
>
{app.versions.map((v) => {
return (
<option key={v.version} value={v.version}>
v{v.version}
</option>
);
})}
</select>
<FiChevronDown/>
{app.versions.length > 1 && (
<span>
<label htmlFor="v-selector">
({app.versions.length - 1} other{" "}
{app.versions.length - 1 > 1 ? "versions" : "version"} available)
</label>
</span>
)}
</div>
);
};
const handleShare = () => {
const link = `https://twitter.com/intent/tweet?text=${encodeURIComponent(`Checkout ${app.name} by ${app.publisher} on @winstallHQ:`)}&url=${encodeURIComponent(`https://winstall.app/apps/${app._id}`)}`
window.open(link)
}
return (
<li
key={app._id}
// onClick={handleAppSelect}
className={`${hideBorder ? styles.noBorder: "" }${large ? styles.large : ""} ${pack ? styles.pack : ""} ${styles.single} ${
selected ? styles.selected : ""
}`}
>
<div className={styles.info}>
<h3>
{large ? (
<>
<AppIcon id={app._id} name={app.name} icon={app.icon} />
{app.name}
</>
) : (
<Link href="/apps/[id]" as={`/apps/${app._id}`} prefetch={false}>
<a>
<AppIcon id={app._id} name={app.name} icon={app.icon} />
<p>{app.name}</p>
</a>
</Link>
)}
{displaySelect && (
<button
className={styles.selectApp}
onClick={handleAppSelect}
aria-label={selected ? "Unselect app" : "Select app"}
>
<FiPlus />
</button>
)}
</h3>
{!pack && <Description desc={app.desc} id={app._id} full={large} />}
</div>
{large && <Copy id={app._id} version={version} latestVersion={app.latestVersion} />}
<ul className={styles.metaData}>
{!large && (
<li>
<Link href="/apps/[id]" as={`/apps/${app._id}`} prefetch={false}>
<a>
<FiInfo />
View App
</a>
</Link>
</li>
)}
{(showTime || large) && (
<li>
<FiClock />
<span>Last updated {timeAgo(app.updatedAt)}</span>
</li>
)}
{!pack && (
<li className={app.versions.length > 1 ? styles.hover : ""}>
<FiPackage />
{app.versions.length > 1 ? (
<VersionSelector />
) : (
<span>v{app.selectedVersion}</span>
)}
</li>
)}
<li>
<Link href={`/apps?q=${`publisher: ${app.publisher}`}`}>
<a>
<FiCode />
Other apps by {app.publisher}
</a>
</Link>
</li>
{app.homepage && large && (
<li>
<a
href={`${app.homepage}?ref=winstall`}
target="_blank"
rel="noopener noreferrer"
onClick={(e) => e.stopPropagation()}
>
<FiExternalLink />
View Site
</a>
</li>
)}
{!pack && (
<li>
<a
href={`${
app.versions.find((i) => i.version === app.selectedVersion)
.installers[0]
}`}
onClick={(e) => e.stopPropagation()}
>
<FiDownload />
Download{" "}
{app.versions[0].installerType
? `(.${app.versions[0].installerType.toLowerCase()})`
: ""}
</a>
</li>
)}
{large && <ExtraMetadata app={app} />}
</ul>
{large && app.tags && app.tags.length > 1 && <Tags tags={app.tags} />}
{large && (
<div className={styles.largeAppButtons}>
<button className={styles.selectApp} onClick={handleAppSelect}>
<FiPlus />
{selected ? "Unselect" : "Select"} app
</button>
<button className={`button ${styles.shareApp}`} onClick={handleShare}>
<FiShare2 />
Share
</button>
</div>
)}
</li>
);
}
Example #6
Source File: FileItem.js From sailplane-web with GNU General Public License v3.0 | 4 votes |
export function FileItem({
data,
sharedFs,
setCurrentDirectory,
ipfs,
isParent,
snapshot,
forceIcon,
onIconClicked,
readOnly,
}) {
const {path, type} = data;
const pathSplit = path.split('/');
const name = pathSplit[pathSplit.length - 1];
const mtime = sharedFs && sharedFs.current.fs.read(path)?.mtime;
const [hoverRef, isHovered] = useHover();
const [CID, setCID] = useState(null);
const [fileInfo, setFileInfo] = useState(null);
const [editMode, setEditMode] = useState(false);
const [mobileActionsVisible, setMobileActionsVisible] = useState(false);
const [fileBlob, setFileBlob] = useState(null);
const [doubleClickRef] = useDoubleClick(() => setEditMode(true));
const parentPath = pathSplit.slice(0, pathSplit.length - 1).join('/');
const fileExtension = filenameExt(name);
const isSmallScreen = useIsSmallScreen();
const contextID = `menu-id`;
const contextNoShareID = `menu-id-no-share`;
const exists = sharedFs && sharedFs.current.fs.exists(path);
const isTouchDevice = !hasMouse;
const isUnsharable = sharedFs?.current.encrypted && type === 'dir';
const hasWrite = sharedFs && doesUserHaveWriteInInstance(sharedFs.current);
const styles = {
paddingContainer: {
paddingTop: 3,
paddingBottom: 3,
},
outer: {
borderRadius: 4,
color: primary5,
fontSize: 14,
padding: 7,
marginBottom: 8,
fontFamily: 'Open Sans',
userSelect: 'none',
},
container: {
display: 'flex',
flexDirection: 'row',
flexWrap: isSmallScreen ? 'wrap' : 'nowrap',
justifyContent: 'space-between',
cursor: 'pointer',
},
flexItem: {
width: '100%',
display: 'flex',
flexDirection: 'row',
justifyContent: 'flex-start',
alignItems: 'center',
flexGrow: 2,
marginBottom: isSmallScreen ? 10 : 0,
},
icon: {
marginRight: 4,
width: 30,
flexShrink: 0,
},
tools: {
display: isTouchDevice ? 'none' : 'flex',
justifyContent: 'flex-end',
width: '100%',
opacity: (isHovered || fileBlob) && !isParent ? 1 : 0,
pointerEvents: (isHovered || fileBlob) && !isParent ? null : 'none',
fontSize: 14,
marginLeft: 0,
},
filename: {
textAlign: 'left',
whiteSpace: 'nowrap',
textOverflow: 'ellipsis',
overflow: 'hidden',
},
};
const dispatch = useDispatch();
const InputComponent = useTextInput(
editMode,
(editNameValue) => rename(editNameValue),
() => setEditMode(false),
name,
{
placeholder: '',
},
);
const iconComponent = forceIcon ? forceIcon : getIconForPath(type, name);
const getCID = async () => {
let tmpCID;
if (data.cid) {
tmpCID = data.cid;
} else if (exists) {
tmpCID = await sharedFs.current.read(path);
}
const tmpFileInfo = await getFileInfoFromCID(tmpCID, ipfs);
setFileInfo(tmpFileInfo);
setCID(tmpCID);
return tmpCID;
};
useEffect(() => {
if (exists && type !== 'dir') {
getCID();
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [path]);
const IconComponent = iconComponent;
const rename = async (editNameValue) => {
try {
dispatch(setStatus({message: 'Renaming file'}));
await sharedFs.current.move(path, parentPath, editNameValue);
dispatch(setStatus({}));
} catch (e) {
console.log('Error moving!', e);
}
};
async function getBlob() {
let blob;
if (!fileBlob) {
dispatch(setStatus({message: 'Fetching download'}));
const handleUpdate = (currentIndex, totalCount) => {
dispatch(
setStatus({
message: `[${getPercent(currentIndex, totalCount)}%] Downloading`,
}),
);
};
blob = await getBlobFromPath(sharedFs.current, path, handleUpdate);
dispatch(setStatus({}));
} else {
blob = fileBlob;
}
return blob;
}
const saveAsFile = (blob, name) => {
if (type === 'dir') {
name = `${name}.zip`;
}
saveAs(blob, name);
};
const handleShare = () => {
setMobileActionsVisible(false);
dispatch(
setShareData({
name,
CID,
path,
pathType: type,
}),
);
};
const handleDownload = async () => {
setMobileActionsVisible(false);
const blob = await getBlob();
saveAsFile(blob, name);
};
const handleEdit = async () => {
setMobileActionsVisible(false);
setEditMode(true);
};
const handleDelete = async () => {
setMobileActionsVisible(false);
dispatch(
setStatus({
message: `Deleting ${type === 'dir' ? 'folder' : 'file'}`,
}),
);
await sharedFs.current.remove(path);
dispatch(setStatus({}));
};
const fetchPreview = async () => {
// Only fetch for audio on click now
if (!fileBlob && isFileExtensionAudio(fileExtension)) {
dispatch(setStatus({message: 'Fetching preview'}));
const blob = await getBlob();
dispatch(setStatus({}));
setFileBlob(blob);
} else {
setFileBlob(null);
}
};
const handleClick = async (event) => {
event.stopPropagation();
if (isTouchDevice && type !== 'dir') {
setMobileActionsVisible(true);
return;
}
if (onIconClicked) {
onIconClicked();
return;
}
if (editMode) {
return;
}
if (type === 'dir') {
setCurrentDirectory(path);
} else {
await fetchPreview();
}
};
let mobileActionItems = [
{
title: 'Download',
onClick: handleDownload,
iconComponent: FiDownload,
},
];
if (hasWrite) {
mobileActionItems = mobileActionItems.concat([
{
title: 'Rename',
onClick: handleEdit,
iconComponent: FiEdit,
},
{
title: 'Delete',
onClick: handleDelete,
iconComponent: FiTrash,
forceColor: lightErrorColor,
},
]);
}
if (!isUnsharable) {
mobileActionItems.unshift({
title: 'Share',
onClick: handleShare,
iconComponent: FiShare2,
});
}
if (type === 'dir') {
mobileActionItems.unshift({
title: 'Open folder',
onClick: () => setCurrentDirectory(path),
iconComponent: FaFolderOpen,
});
} else {
if ((!fileBlob && isFileExtensionAudio(fileExtension)) || onIconClicked) {
mobileActionItems.unshift({
title: 'Open preview',
onClick: () => {
setMobileActionsVisible(false);
if (onIconClicked) {
onIconClicked();
} else {
fetchPreview();
}
},
iconComponent: iconComponent,
});
}
}
const getContent = () => {
if (!snapshot) {
snapshot = {};
}
return (
<div
ref={hoverRef}
style={styles.paddingContainer}
className={`fileItem`}>
<MobileActionsDialog
isVisible={mobileActionsVisible}
name={name}
fileIcon={iconComponent}
onClose={() => setMobileActionsVisible(false)}
items={mobileActionItems}
/>
<div
onContextMenu={(event) => {
event.preventDefault();
contextMenu.show({
event,
id: isUnsharable ? contextNoShareID : contextID,
props: {
handleDelete,
handleDownload,
handleShare,
handleEdit,
},
});
}}
style={{
...styles.outer,
backgroundColor:
(isHovered ||
fileBlob ||
snapshot.isDragging ||
(snapshot.combineTargetFor && type === 'dir')) &&
!isTouchDevice
? primary15
: '#FFF',
}}>
<div style={styles.container} onClick={handleClick}>
<div
style={{
...styles.flexItem,
maxWidth: isSmallScreen ? null : '25%',
}}>
<IconComponent color={primary45} size={16} style={styles.icon} />
{editMode ? (
<>{InputComponent}</>
) : isParent ? (
'. . /'
) : (
<span ref={doubleClickRef} style={styles.filename}>
{name}
</span>
)}
</div>
<div style={{...styles.flexItem, justifyContent: 'flex-end'}}>
{type !== 'dir' && fileInfo ? humanFileSize(fileInfo.size) : null}
</div>
<div style={{...styles.flexItem, justifyContent: 'flex-end'}}>
{type !== 'dir' && (mtime || fileInfo?.mtime)
? getFileTime(mtime?.secs || fileInfo.mtime.secs)
: null}
</div>
<div style={styles.tools}>
<div>
<ToolItem
id={`Share-${type}`}
iconComponent={FiShare2}
changeColor={primary}
tooltip={
isUnsharable ? 'No encrypted folder sharing yet!' : 'Share'
}
onClick={handleShare}
disabled={isUnsharable}
/>
<ToolItem
id={`Download-${type}`}
iconComponent={FiDownload}
changeColor={primary}
tooltip={'Download'}
onClick={handleDownload}
/>
{!readOnly && hasWrite ? (
<>
<ToolItem
id={`Rename-${type}`}
iconComponent={FiEdit}
changeColor={primary}
tooltip={'Rename'}
onClick={handleEdit}
/>
<ToolItem
id={`Delete-${type}`}
iconComponent={FiTrash}
tooltip={'Delete'}
onClick={handleDelete}
/>
</>
) : null}
</div>
</div>
</div>
{fileBlob ? (
<div style={styles.preview}>
<FilePreview blob={fileBlob} filename={name} />
</div>
) : null}
</div>
</div>
);
};
return <>{getContent()}</>;
}