react-icons/fi#FiArrowRight TypeScript Examples
The following examples show how to use
react-icons/fi#FiArrowRight.
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: index.tsx From NextLevelWeek with MIT License | 6 votes |
Landing: React.FC = () => {
return (
<Container>
<Content>
<img src={logo} alt="Logo Happy" />
<main>
<h1>Leve felicidade para o mundo</h1>
<p>Visite orfanatos e mude o dia de muitas crianças.</p>
</main>
<div>
<strong>Natal</strong>
<span>Rio Grande do Norte</span>
</div>
<Link to="/app">
<FiArrowRight size={26} color="rgba(0, 0, 0, 0.6)" />
</Link>
</Content>
</Container>
);
}
Example #2
Source File: index.tsx From nlw-03-omnistack with MIT License | 6 votes |
export default function OrphanagesMap() {
return (
<div id="page-map">
<aside>
<header>
<img src={mapMarkerImg} alt="Happy" />
<h2>Escolha um orfanato no mapa</h2>
<p>Muitas crianças estão esperando a sua visita :)</p>
</header>
<footer>
<strong>Rio do Sul</strong>
<span>Santa Catarina</span>
</footer>
</aside>
<Map>
<Marker icon={happyMapIcon} position={[-27.2092052,-49.6401092]}>
<Popup closeButton={false} minWidth={240} maxWidth={240} className="map-popup">
Lar das meninas
<Link to={`/orphanages/1`}>
<FiArrowRight size={20} color="#fff" />
</Link>
</Popup>
</Marker>
</Map>
<Link to="/orphanages/create" className="create-orphanage">
<FiPlus size={32} color="#FFF" />
</Link>
</div>
);
}
Example #3
Source File: Landing.tsx From happy with MIT License | 6 votes |
function Landing() {
return (
<div id="page-landing">
<motion.div
className="wrapper-logo-happy"
initial={{ scale: 0 }}
animate={{ scale: 2 }}
transition={{ duration: 1.5, repeat: 1, repeatType: "reverse" }}
>
<img src={markerImg} alt="Logo happy" />
</motion.div>
<motion.div
className="content-wrapper"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ delay: 3, duration: 0.8 }}
>
<img src={logoImg} alt="Logo da plataforma Happy" />
<main>
<h1>Leve felicidade para o mundo</h1>
<p>Visite orfanatos e mude o dia de muitas crianças.</p>
</main>
<div className="location">
<strong>São Paulo</strong>
<span>São Paulo</span>
</div>
<Link to="/app" className="enter-app">
<FiArrowRight size={26} color="rgba(8, 0, 0, 0.6)" />
</Link>
</motion.div>
</div>
);
}
Example #4
Source File: Landing.tsx From happy with MIT License | 6 votes |
function Landing() {
return (
<div id="page-landing">
<div className="content-wrapper">
<img src={logoImg} alt="Happy"/>
<main>
<h1>Leve felicidade para o mundo</h1>
<p>Visite orfanatos e mude o dia de muitas crianças.</p>
</main>
<div className="location">
<strong>Rio do Sul</strong>
<span>Santa Catarina</span>
</div>
<Link to="/app" className="enter-app">
<FiArrowRight size={26} color="rgba(0, 0, 0, 0.6)" />
</Link>
</div>
</div>
);
}
Example #5
Source File: OrphanagesMap.tsx From NLW-3.0 with MIT License | 6 votes |
function OrphanagesMap() {
const [orphanages, setOrphanages] = useState<Orphanage[]>([]);
useEffect(() => {
api.get('orphanages').then(response => {
setOrphanages(response.data);
});
}, []);
return (
<div id="page-map">
<aside>
<header>
<img src={mapMarkerImg} alt="Happy" />
<h2>Escolha um orfanato no mapa</h2>
<p>Muitas crianças estão esperando a sua visita {':)'}</p>
</header>
<footer>
<strong>Meia Praia</strong>
<span>Santa Catarina</span>
</footer>
</aside>
<Map
center={[-27.1376523, -48.6087994]}
zoom={15}
style={{ width: '100%', height: '100%' }}
>
{/* <TileLayer url="https://a.tile.openstreetmap.org/{z}/{x}/{y}.png" /> */}
<TileLayer
url={`https://api.mapbox.com/styles/v1/mapbox/light-v10/tiles/256/{z}/{x}/{y}@2x?access_token=${process.env.REACT_APP_MAPBOX_TOKEN}`}
/>
{orphanages.map(orphanage => (
<Marker
key={orphanage.id}
icon={mapIcon}
position={[orphanage.latitude, orphanage.longitude]}
>
<Popup closeButton={false} minWidth={240} maxWidth={240} className="map-popup">
{orphanage.name}
<Link to={`/orphanages/${orphanage.id}`}>
<FiArrowRight size={20} color="#fff" />
</Link>
</Popup>
</Marker>
))}
</Map>
<Link to="/orphanages/create" className="create-orphanage">
<FiPlus size={32} color="#fff" />
</Link>
</div>
)
}
Example #6
Source File: Landing.tsx From NLW-3.0 with MIT License | 6 votes |
function Landing() {
return (
<div id="page-landing">
<div className="content-wrapper">
<img src={logoImg} alt="Happy" />
<main>
<h1>Leve felicidade para o mundo</h1>
<p>Visite orfanatos e mude o dia de muitas crianças.</p>
</main>
<div className="location">
<strong>Meia Praia</strong>
<span>Santa Catarina</span>
</div>
<Link to="/app" className="enter-app">
<FiArrowRight size={26} color="rgba(0, 0, 0, 0.6)" />
</Link>
</div>
</div>
);
}
Example #7
Source File: REPMintInfoLine.tsx From dxvote with GNU Affero General Public License v3.0 | 6 votes |
REPMintInfoLine: React.FC<ActionViewProps> = ({ decodedCall }) => {
const { parsedData } = useTotalSupply({ decodedCall });
const { tokenData } = useTokenData();
const totalSupply = useBigNumberToNumber(tokenData?.totalSupply, 18);
const { ensName, imageUrl } = useENSAvatar(parsedData?.toAddress, MAINNET_ID);
const roundedRepAmount = useBigNumberToNumber(parsedData?.amount, 16, 3);
const roundedRepPercent = roundedRepAmount / totalSupply;
return (
<>
<Segment>
<StyledMintIcon src={Mint} />
</Segment>
<Segment>Mint {roundedRepPercent} %</Segment>
<Segment>
<FiArrowRight />
</Segment>
<Segment>
<Avatar defaultSeed={parsedData?.toAddress} src={imageUrl} size={24} />
</Segment>
<Segment>{ensName || shortenAddress(parsedData?.toAddress)}</Segment>
</>
);
}
Example #8
Source File: OrphanagesMap.tsx From happy with MIT License | 5 votes |
function OrphanagesMap() {
const [orphanages, setOrphanages] = useState<Orphanage[]>([]);
useEffect(() => {
api.get('orphanages').then(response => {
setOrphanages(response.data);
});
}, []);
return (
<div id="page-map">
<aside>
<header>
<img src={mapMarkerImg} alt="Happy"/>
<h2>Escolha um orfanato no mapa</h2>
<p>Muitas crianças estão esperando a sua visita {':)'}</p>
</header>
<footer>
<strong>Rio do Sul</strong>
<span>Santa Catarina</span>
</footer>
</aside>
<Map
center={[-27.2092052, -49.6401092]}
zoom={15}
style={{ width: '100%', height: '100%'}}
>
<TileLayer url="https://a.tile.openstreetmap.org/{z}/{x}/{y}.png" />
{/* <TileLayer
url={`https://api.mapbox.com/styles/v1/mapbox/light-v10/tiles/256/{z}/{x}/{y}@2x?access_token=${process.env.REACT_APP_MAPBOX_TOKEN}`}
/> */}
{orphanages.map(orphanage => (
<Marker
key={orphanage.id}
icon={mapIcon}
position={[orphanage.latitude, orphanage.longitude]}
>
<Popup closeButton={false} minWidth={240} maxWidth={240} className="map-popup">
{orphanage.name}
<Link to={`/orphanages/${orphanage.id}`}>
<FiArrowRight size={20} color="#fff" />
</Link>
</Popup>
</Marker>
))}
</Map>
<Link to="/orphanages/create" className="create-orphanage">
<FiPlus size={32} color="#fff" />
</Link>
</div>
)
}
Example #9
Source File: ERC20TransferInfoLine.tsx From dxvote with GNU Affero General Public License v3.0 | 5 votes |
ERC20TransferInfoLine: React.FC<ActionViewProps> = ({ decodedCall }) => {
const parsedData = useMemo(() => {
if (!decodedCall) return null;
return {
tokenAddress: decodedCall.to,
amount: BigNumber.from(decodedCall.args._value),
source: decodedCall.from,
destination: decodedCall.args._to as string,
};
}, [decodedCall]);
const { data: tokenInfo } = useERC20Info(parsedData?.tokenAddress);
const roundedBalance = useBigNumberToNumber(
parsedData?.amount,
tokenInfo?.decimals,
4
);
const { ensName, imageUrl } = useENSAvatar(
parsedData?.destination,
MAINNET_ID
);
return (
<>
<Segment>
<FiNavigation size={16} />
</Segment>
<Segment>
Transfer {roundedBalance} {tokenInfo?.symbol}
</Segment>
<Segment>
<FiArrowRight />
</Segment>
<Segment>
<Avatar
defaultSeed={parsedData?.destination}
src={imageUrl}
size={24}
/>
</Segment>
<Segment>
{ensName || parsedData?.destination
? shortenAddress(parsedData?.destination)
: ''}
</Segment>
</>
);
}
Example #10
Source File: index.tsx From NextLevelWeek with MIT License | 5 votes |
OrphanagesMap: React.FC = () => {
const [orphanages, setOrphanages] = useState<IOpharnage[]>([]);
useEffect(() => {
api.get('/orphanages').then(res => {
// console.log(res.data);
setOrphanages(res.data);
});
}, []);
return (
<Container>
<SideBar>
<header>
<img src={mapMarkerImg} alt="" />
<h2>Escolha um orfanato no mapa</h2>
<p>Muitas crianças estão esperando a sua visita <span role="img" aria-label="happy">?</span></p>
</header>
<footer>
<strong>Natal</strong>
<span>Rio Grande do Norte</span>
</footer>
</SideBar>
<Map
center={[-5.8044209, -35.263095]}
zoom={12}
style={{ width: '100%', height: '100%' }}
>
<TileLayer url={`https://api.mapbox.com/styles/v1/mapbox/light-v10/tiles/256/{z}/{x}/{y}@2x?access_token=${process.env.REACT_APP_MAPBOX_TOKEN}`} />
{orphanages.map(orphanage => {
return (
<Marker
key={orphanage.id}
position={[orphanage.latitude, orphanage.longitude]}
icon={happyMapIcon}
>
<Popup closeButton={false} minWidth={240} maxHeight={240} className="map-popup">
{orphanage.name}
<Link to={`/orphanages/${orphanage.id}`}>
<FiArrowRight size={20} color="#fff" />
</Link>
</Popup>
</Marker>
);
})}
</Map>
<Link to="/orphanages/create">
<FiPlus size={32} color="#FFF" />
</Link>
</Container>
);
}
Example #11
Source File: OrphanagesMap.tsx From happy with MIT License | 5 votes |
function OrphanagesMap() {
const [orphanages, setOrphaanges] = useState<Orphanage[]>([]);
useEffect(() => {
api.get("/orphanages").then(res => {
setOrphaanges(res.data);
});
}, []);
return (
<div id="page-map">
<aside>
<header>
<img src={mapMakerImg} alt="Logo da plataforma Happy" />
<h2>Escolha um orfanato no mapa</h2>
<p>Muitas crianças estão esperando sua visita :)</p>
</header>
<footer>
<strong>São Paulo</strong>
<span>São Paulo</span>
</footer>
</aside>
<Map
center={[-23.6821604, -46.8754915]}
zoom={10}
style={{ width: "100%", height: "100%" }}
>
{/* Mapa alternativo: "https://a.tile.openstreetmap.org/{z}/{x}/{y}.png" */}
<TileLayer
url={
`https://api.mapbox.com/styles/v1/mapbox/light-v10/tiles/256/{z}/{x}/{y}@2x?access_token=${process.env.REACT_APP_MAPBOX_TOKEN}`
}
/>
{orphanages.map(orphanage => {
return (
<Marker
key={orphanage.id}
icon={mapIcon}
position={[orphanage.latitude, orphanage.longitude]}
>
<Popup
closeButton={false}
minWidth={240}
maxWidth={240}
className="map-popup"
>
{orphanage.name}
<Link to={`/orphanages/${orphanage.id}`}>
<FiArrowRight size={20} color="#FFF" />
</Link>
</Popup>
</Marker>
)
})}
</Map>
<Link to="/orphanages/create" className="create-orphanage">
<FiPlus size={32} color="#FFF" />
</Link>
</div>
);
}
Example #12
Source File: StakeTokens.tsx From dxvote with GNU Affero General Public License v3.0 | 4 votes |
StakeTokens = () => {
const [stakeAmount, setStakeAmount] = useState<string>('');
const { account: userAddress } = useWeb3React();
const { guild_id: guildAddress } = useParams<{ guild_id?: string }>();
const { data: guildConfig } = useGuildConfig(guildAddress);
const { data: tokenInfo } = useERC20Info(guildConfig?.token);
const { data: tokenBalance } = useERC20Balance(
guildConfig?.token,
userAddress
);
const roundedBalance = useBigNumberToNumber(
tokenBalance,
tokenInfo?.decimals,
4
);
const { data: tokenAllowance } = useERC20Allowance(
guildConfig?.token,
userAddress,
guildConfig?.tokenVault
);
const { data: userVotingPower } = useVotingPowerOf({
contractAddress: guildAddress,
userAddress,
});
const stakeAmountParsed = useStringToBigNumber(
stakeAmount,
tokenInfo.decimals
);
const isStakeAmountValid = useMemo(
() =>
stakeAmountParsed?.gt(0) &&
tokenInfo?.decimals &&
stakeAmountParsed.lte(tokenBalance),
[stakeAmountParsed, tokenBalance, tokenInfo]
);
const { createTransaction } = useTransactions();
const guildContract = useERC20Guild(guildAddress);
const lockTokens = async () => {
if (!isStakeAmountValid) return;
createTransaction(
`Lock ${formatUnits(stakeAmountParsed, tokenInfo?.decimals)} ${
tokenInfo?.symbol
} tokens`,
async () => guildContract.lockTokens(stakeAmountParsed)
);
};
const tokenContract = useERC20(guildConfig?.token);
const approveTokenSpending = async () => {
if (!isStakeAmountValid) return;
createTransaction(`Approve ${tokenInfo?.symbol} token spending`, async () =>
tokenContract.approve(guildConfig?.tokenVault, stakeAmountParsed)
);
};
const votingPowerPercent = useVotingPowerPercent(
userVotingPower,
guildConfig?.totalLocked,
3
);
const nextVotingPowerPercent = useVotingPowerPercent(
stakeAmountParsed?.add(userVotingPower),
stakeAmountParsed?.add(guildConfig?.totalLocked),
3
);
const history = useHistory();
const location = useLocation();
const { isRepGuild } = useGuildImplementationType(guildAddress);
return (
<GuestContainer>
<DaoBrand>
<DaoIcon src={dxIcon} alt={'DXdao Logo'} />
<DaoTitle>
{guildConfig?.name || (
<Loading text loading skeletonProps={{ width: 100 }} />
)}
</DaoTitle>
</DaoBrand>
{!isRepGuild && (
<InfoItem>
{guildConfig?.lockTime ? (
`${moment
.duration(guildConfig.lockTime.toNumber(), 'seconds')
.humanize()} staking period`
) : (
<Loading loading text skeletonProps={{ width: 200 }} />
)}{' '}
</InfoItem>
)}
{!isRepGuild && (
<BalanceWidget>
<InfoRow>
<InfoLabel>Balance:</InfoLabel>
<InfoValue>
{tokenBalance && tokenInfo ? (
roundedBalance
) : (
<Loading loading text skeletonProps={{ width: 30 }} />
)}{' '}
{tokenInfo?.symbol || (
<Loading loading text skeletonProps={{ width: 10 }} />
)}
</InfoValue>
</InfoRow>
<InfoRow>
<StakeAmountInput
value={stakeAmount}
onUserInput={setStakeAmount}
/>
<Button
onClick={() =>
setStakeAmount(formatUnits(tokenBalance, tokenInfo?.decimals))
}
>
Max
</Button>
</InfoRow>
</BalanceWidget>
)}
{isRepGuild && (
<InfoRow>
<InfoLabel>Balance</InfoLabel>
<InfoValue>
{tokenBalance && tokenInfo ? (
roundedBalance
) : (
<Loading loading text skeletonProps={{ width: 30 }} />
)}{' '}
{tokenInfo?.symbol || (
<Loading loading text skeletonProps={{ width: 10 }} />
)}
</InfoValue>
</InfoRow>
)}
<InfoRow>
<InfoLabel>Your voting power</InfoLabel>
<InfoValue>
{isStakeAmountValid ? (
<>
<InfoOldValue>
{votingPowerPercent != null ? (
`${votingPowerPercent}%`
) : (
<Loading loading text skeletonProps={{ width: 40 }} />
)}{' '}
<FiArrowRight />
</InfoOldValue>{' '}
<strong>
{nextVotingPowerPercent != null ? (
`${nextVotingPowerPercent}%`
) : (
<Loading loading text skeletonProps={{ width: 40 }} />
)}
</strong>
</>
) : (
'-'
)}
</InfoValue>
</InfoRow>
{!isRepGuild && (
<InfoRow>
<InfoLabel>Unlock Date</InfoLabel>
<InfoValue>
{isStakeAmountValid ? (
<>
<strong>
{moment()
.add(guildConfig.lockTime.toNumber(), 'seconds')
.format('MMM Do, YYYY - h:mm a')}
</strong>{' '}
<FiInfo />
</>
) : (
'-'
)}
</InfoValue>
</InfoRow>
)}
{!isRepGuild ? (
stakeAmountParsed && tokenAllowance?.gte(stakeAmountParsed) ? (
<ActionButton disabled={!isStakeAmountValid} onClick={lockTokens}>
Lock{' '}
{tokenInfo?.symbol || (
<Loading loading text skeletonProps={{ width: 10 }} />
)}
</ActionButton>
) : (
<ActionButton
disabled={!isStakeAmountValid}
onClick={approveTokenSpending}
>
Approve{' '}
{tokenInfo?.symbol || (
<Loading loading text skeletonProps={{ width: 10 }} />
)}{' '}
Spending
</ActionButton>
)
) : (
<ActionButton
onClick={() => history.push(location.pathname + '/proposalType')}
>
Mint Rep
</ActionButton>
)}
</GuestContainer>
);
}
Example #13
Source File: create-app-github.tsx From ledokku with MIT License | 4 votes |
CreateAppGithub = () => {
const history = useHistory();
const toast = useToast();
const { user } = useAuth();
const { data: dataApps } = useAppsQuery();
const [isNewWindowClosed, setIsNewWindowClosed] = useState(false);
const [selectedRepo, setSelectedRepo] = useState<Repository>();
const [selectedBranch, setSelectedBranch] = useState('');
const [isProceedModalOpen, setIsProceedModalOpen] = useState(false);
const {
data: installationData,
loading: installationLoading,
} = useGithubInstallationIdQuery({ fetchPolicy: 'network-only' });
const [
getRepos,
{ data: reposData, loading: reposLoading },
] = useRepositoriesLazyQuery({ fetchPolicy: 'network-only' });
const [
getBranches,
{ data: branchesData, loading: branchesLoading },
] = useBranchesLazyQuery({ fetchPolicy: 'network-only' });
const [arrayOfCreateAppLogs, setArrayOfCreateAppLogs] = useState<
RealTimeLog[]
>([]);
const [isTerminalVisible, setIsTerminalVisible] = useState(false);
const [isToastShown, setIsToastShown] = useState(false);
const [createAppGithubMutation, { loading }] = useCreateAppGithubMutation();
const [
isAppCreationSuccess,
setIsAppCreationSuccess,
] = useState<AppCreationStatus>();
useAppCreateLogsSubscription({
onSubscriptionData: (data) => {
const logsExist = data.subscriptionData.data?.appCreateLogs;
if (logsExist) {
setArrayOfCreateAppLogs((currentLogs) => {
return [...currentLogs, logsExist];
});
if (logsExist.type === 'end:success') {
setIsAppCreationSuccess(AppCreationStatus.SUCCESS);
} else if (logsExist.type === 'end:failure') {
setIsAppCreationSuccess(AppCreationStatus.FAILURE);
}
}
},
});
const createAppGithubSchema = yup.object().shape({
name: yup
.string()
.required('App name is required')
.matches(/^[a-z0-9-]+$/)
.test(
'Name exists',
'App with this name already exists',
(val) => !dataApps?.apps.find((app) => app.name === val)
),
repo: yup.object({
fullName: yup.string().required(),
id: yup.string().required(),
name: yup.string().required(),
}),
installationId: yup.string().required(),
gitBranch: yup.string().optional(),
});
const formik = useFormik<{
name: string;
repo: {
fullName: string;
id: string;
name: string;
};
installationId: string;
gitBranch: string;
}>({
initialValues: {
name: '',
repo: {
fullName: '',
id: '',
name: '',
},
installationId: '',
gitBranch: '',
},
validateOnChange: true,
validationSchema: createAppGithubSchema,
onSubmit: async (values) => {
if (installationData) {
try {
await createAppGithubMutation({
variables: {
input: {
name: values.name,
gitRepoFullName: values.repo.fullName,
branchName: values.gitBranch,
gitRepoId: values.repo.id,
githubInstallationId: values.installationId,
},
},
});
setIsTerminalVisible(true);
} catch (error) {
error.message === 'Not Found'
? toast.error(`Repository : ${values.repo.fullName} not found`)
: toast.error(error.message);
}
}
},
});
const handleNext = () => {
setIsTerminalVisible(false);
const appId = arrayOfCreateAppLogs[arrayOfCreateAppLogs.length - 1].message;
history.push(`app/${appId}`, 'new');
trackGoal(trackingGoals.createAppGithub, 0);
};
const handleOpen = () => {
const newWindow = window.open(
`https://github.com/apps/${config.githubAppName}/installations/new`,
'Install App',
'resizable=1, scrollbars=1, fullscreen=0, height=1000, width=1020,top=' +
window.screen.width +
', left=' +
window.screen.width +
', toolbar=0, menubar=0, status=0'
);
const timer = setInterval(async () => {
if (newWindow && newWindow.closed) {
setIsNewWindowClosed(true);
clearInterval(timer);
}
}, 100);
};
useEffect(() => {
if (!installationLoading && installationData && isNewWindowClosed) {
getRepos({
variables: {
installationId: installationData.githubInstallationId.id,
},
});
setIsNewWindowClosed(false);
}
}, [
installationData,
installationLoading,
isNewWindowClosed,
setIsNewWindowClosed,
getRepos,
]);
useEffect(() => {
if (
!installationLoading &&
installationData &&
!reposLoading &&
reposData &&
selectedRepo
) {
getBranches({
variables: {
installationId: installationData.githubInstallationId.id,
repositoryName: selectedRepo.name,
},
});
}
}, [
installationData,
installationLoading,
reposData,
reposLoading,
getBranches,
selectedRepo?.name,
selectedRepo,
]);
const handleChangeRepo = (active: RepoOption) => {
setSelectedRepo(active.value);
setSelectedBranch('');
if (installationData) {
formik.setValues({
name: active.value.name,
installationId: installationData?.githubInstallationId.id,
repo: {
fullName: active.value.fullName,
name: active.value.name,
id: active.value.id,
},
gitBranch: '',
});
}
};
const handleChangeBranch = (active: BranchOption) => {
setSelectedBranch(active.value.name);
formik.setFieldValue('gitBranch', active.value.name);
};
const repoOptions: RepoOption[] = [];
if (reposData && !reposLoading) {
reposData?.repositories.map((r) =>
repoOptions.push({ value: r, label: r.fullName })
);
}
let branchOptions: BranchOption[] = [];
if (branchesData && !branchesLoading) {
branchesData.branches.map((b) =>
branchOptions.push({ value: b, label: b.name })
);
}
useEffect(() => {
if (installationData && !installationLoading) {
getRepos({
variables: {
installationId: installationData?.githubInstallationId.id,
},
});
}
}, [installationLoading, getRepos, installationData]);
useEffect(() => {
if (selectedRepo && installationData) {
getBranches({
variables: {
installationId: installationData?.githubInstallationId.id,
repositoryName: selectedRepo.name,
},
});
}
}, [selectedRepo, getBranches, installationData]);
// Effect for app creation
useEffect(() => {
isAppCreationSuccess === AppCreationStatus.FAILURE && !isToastShown
? toast.error('Failed to create an app') && setIsToastShown(true)
: isAppCreationSuccess === AppCreationStatus.SUCCESS &&
!isToastShown &&
toast.success('App created successfully') &&
setIsToastShown(true);
}, [isToastShown, isAppCreationSuccess, toast]);
return (
<>
<HeaderContainer>
<Header />
</HeaderContainer>
<Container maxW="5xl" mt={10}>
{isTerminalVisible ? (
<>
<p className="mb-2 ">
Creating <b>{formik.values.name}</b> app from{' '}
<b>{formik.values.repo.name}</b>
</p>
<p className="text-gray-500 mb-2">
Creating app usually takes a couple of minutes. Breathe in,
breathe out, logs are about to appear below:
</p>
<Terminal className={'w-6/6'}>
{arrayOfCreateAppLogs.map((log) => (
<p
key={arrayOfCreateAppLogs.indexOf(log)}
className={'text-s leading-5'}
>
{log.message?.replaceAll('[1G', '')}
</p>
))}
</Terminal>
{!!isAppCreationSuccess &&
isAppCreationSuccess === AppCreationStatus.SUCCESS ? (
<div className="mt-12 flex justify-end">
<Button
onClick={() => handleNext()}
color="grey"
iconEnd={<FiArrowRight size={20} />}
>
Next
</Button>
</div>
) : !!isAppCreationSuccess &&
isAppCreationSuccess === AppCreationStatus.FAILURE ? (
<div className="mt-12 flex justify-start">
<Button
onClick={() => {
setIsTerminalVisible(false);
formik.resetForm();
}}
color="grey"
iconEnd={<FiArrowLeft size={20} />}
>
Back
</Button>
</div>
) : null}
</>
) : (
<>
<Heading as="h2" size="md">
Create a new GitHub application
</Heading>
{installationData &&
!installationLoading &&
reposData &&
!reposLoading ? (
<>
<Text color="gray.400">
When you push to Git, your application will be redeployed
automatically.
</Text>
<Grid
templateColumns={{
sm: 'repeat(1, 1fr)',
md: 'repeat(3, 1fr)',
}}
>
<GridItem colSpan={2}>
<Flex alignItems="center" mt="12">
<Avatar
size="sm"
name={user?.userName}
src={user?.avatarUrl}
/>
<Text ml="2" fontWeight="bold">
{user?.userName}
</Text>
</Flex>
<form onSubmit={formik.handleSubmit}>
<Box mt="8">
<FormLabel>Repository</FormLabel>
<Select
placeholder="Select repository"
isSearchable={false}
onChange={handleChangeRepo}
options={repoOptions}
/>
</Box>
<Text mt="1" color="gray.400" fontSize="sm">
Can't see your repo in the list?{' '}
<Link
onClick={() => setIsProceedModalOpen(true)}
textDecoration="underline"
>
Configure the GitHub app.
</Link>
</Text>
<Box mt="8">
<FormLabel>Branch to deploy</FormLabel>
<Select
placeholder="Select branch"
isSearchable={false}
disabled={
!branchesData ||
branchesLoading ||
reposLoading ||
!reposData
}
onChange={handleChangeBranch}
options={branchOptions}
/>
</Box>
<Box mt="8" display="flex" justifyContent="flex-end">
<Button
type="submit"
color="grey"
disabled={!selectedBranch || !selectedRepo}
isLoading={loading}
>
Create
</Button>
</Box>
</form>
</GridItem>
</Grid>
</>
) : !reposLoading && !installationLoading && !reposData ? (
<>
<Alert mb="4" mt="4" w="65%" status="info">
<AlertIcon />
<Box flex="1">
<AlertTitle>Set up repository permissions</AlertTitle>
<AlertDescription display="block">
First you will need to set up permissions for repositories
that you would like to use with Ledokku. Once that's done,
it's time to choose repo and branch that you would like to
create app from and off we go.
</AlertDescription>
</Box>
</Alert>
<Button
color="grey"
onClick={() => setIsProceedModalOpen(true)}
>
Set up permissions
</Button>
</>
) : (
<Spinner />
)}
</>
)}
<Modal
isOpen={isProceedModalOpen}
onClose={() => setIsProceedModalOpen(false)}
isCentered
>
<ModalOverlay />
<ModalContent>
<ModalHeader>Github setup info</ModalHeader>
<ModalCloseButton />
<ModalBody>
New window is about to open. After you are done selecting github
repos, close the window and refresh page.
</ModalBody>
<ModalFooter>
<Button
color="grey"
variant="outline"
className="mr-3"
onClick={() => setIsProceedModalOpen(false)}
>
Cancel
</Button>
<Button
color="grey"
onClick={() => {
handleOpen();
setIsProceedModalOpen(false);
}}
>
Proceed
</Button>
</ModalFooter>
</ModalContent>
</Modal>
</Container>
</>
);
}
Example #14
Source File: create-app.tsx From ledokku with MIT License | 4 votes |
CreateApp = () => {
const history = useHistory();
const toast = useToast();
const createAppSchema = yup.object({
type: yup
.string()
.oneOf(['GITHUB', 'GITLAB', 'DOCKER', 'DOKKU'])
.required(),
});
const formik = useFormik<{ type: AppTypes }>({
initialValues: {
type: AppTypes.GITHUB,
},
validateOnChange: true,
validationSchema: createAppSchema,
onSubmit: async (values) => {
try {
values.type === AppTypes.GITHUB
? history.push('/create-app-github')
: history.push('/create-app-dokku');
} catch (error) {
toast.error(error.message);
}
},
});
return (
<>
<HeaderContainer>
<Header />
</HeaderContainer>
<Container maxW="5xl" my="4">
<Heading py="2" as="h2" size="md">
App source
</Heading>
<Box mt="24">
<Box mt="4">
<form onSubmit={formik.handleSubmit}>
<Box mt="20">
<Text mb="5" color="gray.500">
Choose between creating app from a Github repository or
creating a standalone Dokku app.
</Text>
<Grid
templateColumns={{
base: 'repeat(2, minmax(0, 1fr))',
md: 'repeat(4, minmax(0, 1fr))',
}}
gap="4"
>
<SourceBox
selected={formik.values.type === AppTypes.GITHUB}
label="GitHub"
icon={<GithubIcon size={40} />}
onClick={() => formik.setFieldValue('type', 'GITHUB')}
/>
<SourceBox
selected={formik.values.type === AppTypes.DOKKU}
label="Dokku"
icon={
<Image
boxSize="48px"
objectFit="cover"
src="/dokku.png"
alt="dokkuLogo"
/>
}
onClick={() => formik.setFieldValue('type', 'DOKKU')}
/>
<SourceBox
selected={formik.values.type === AppTypes.GITLAB}
label="Gitlab"
icon={<GitlabIcon size={40} />}
badge={
<Badge ml="1" colorScheme="red">
Coming soon
</Badge>
}
// Uncomment this when we can handle docker deployments
// onClick={() => formik.setFieldValue('type', 'GITLAB')}
/>
<SourceBox
selected={formik.values.type === AppTypes.DOCKER}
label="Docker"
icon={<DockerIcon size={40} />}
badge={
<Badge ml="1" colorScheme="red">
Coming soon
</Badge>
}
// Uncomment this when we can handle docker deployments
// onClick={() => formik.setFieldValue('type', 'DOCKER')}
/>
</Grid>
</Box>
<Box mt="36" display="flex" justifyContent="flex-end">
<Button
isLoading={formik.isSubmitting}
disabled={!formik.values.type || !!formik.errors.type}
rightIcon={<FiArrowRight size={20} />}
type="submit"
>
Next
</Button>
</Box>
</form>
</Box>
</Box>
</Container>
</>
);
}
Example #15
Source File: create-database.tsx From ledokku with MIT License | 4 votes |
CreateDatabase = () => {
const location = useLocation();
const history = useHistory();
const toast = useToast();
const { data: dataDb } = useDatabaseQuery();
const [arrayOfCreateDbLogs, setArrayofCreateDbLogs] = useState<RealTimeLog[]>(
[]
);
const [isTerminalVisible, setIsTerminalVisible] = useState(false);
const [createDatabaseMutation] = useCreateDatabaseMutation();
const [
isDbCreationSuccess,
setIsDbCreationSuccess,
] = useState<DbCreationStatus>();
useCreateDatabaseLogsSubscription({
onSubscriptionData: (data) => {
const logsExist = data.subscriptionData.data?.createDatabaseLogs;
if (logsExist) {
setArrayofCreateDbLogs((currentLogs) => {
return [...currentLogs, logsExist];
});
if (logsExist.type === 'end:success') {
setIsDbCreationSuccess(DbCreationStatus.SUCCESS);
} else if (logsExist.type === 'end:failure') {
setIsDbCreationSuccess(DbCreationStatus.FAILURE);
}
}
},
});
const createDatabaseSchema = yup.object({
type: yup
.string()
.oneOf(['POSTGRESQL', 'MYSQL', 'MONGODB', 'REDIS'])
.required(),
name: yup.string().when('type', (type: DatabaseTypes) => {
return yup
.string()
.required('Database name is required')
.matches(/^[a-z0-9-]+$/)
.test(
'Name already exists',
`You already have created ${type} database with this name`,
(name) =>
!dataDb?.databases.find(
(db) => db.name === name && type === db.type
)
);
}),
});
const [
isDokkuPluginInstalled,
{ data, loading, error: isDokkuPluginInstalledError },
] = useIsPluginInstalledLazyQuery({
// we poll every 5 sec
pollInterval: 5000,
});
const formik = useFormik<{ name: string; type: DatabaseTypes }>({
initialValues: {
name: location.state ? (location.state as string) : '',
type: 'POSTGRESQL',
},
validateOnChange: true,
validationSchema: createDatabaseSchema,
onSubmit: async (values) => {
try {
await createDatabaseMutation({
variables: {
input: { name: values.name, type: values.type },
},
});
setIsTerminalVisible(true);
trackGoal(trackingGoals.createDatabase, 0);
} catch (error) {
toast.error(error.message);
}
},
});
const isPluginInstalled = data?.isPluginInstalled.isPluginInstalled;
const handleNext = () => {
setIsTerminalVisible(false);
const dbId = arrayOfCreateDbLogs[arrayOfCreateDbLogs.length - 1].message;
history.push(`database/${dbId}`);
};
// Effect for checking whether plugin is installed
useEffect(() => {
isDokkuPluginInstalled({
variables: {
pluginName: dbTypeToDokkuPlugin(formik.values.type),
},
});
}, [formik.values.type, isPluginInstalled, isDokkuPluginInstalled]);
// Effect for db creation
useEffect(() => {
isDbCreationSuccess === DbCreationStatus.FAILURE
? toast.error('Failed to create database')
: isDbCreationSuccess === DbCreationStatus.SUCCESS &&
toast.success('Database created successfully');
}, [isDbCreationSuccess, toast]);
return (
<>
<HeaderContainer>
<Header />
</HeaderContainer>
<Container maxW="5xl" my="4">
<Heading as="h2" size="md">
Create a new database
</Heading>
<Box mt="12">
{isTerminalVisible ? (
<>
<Text mb="2">
Creating <b>{formik.values.type}</b> database{' '}
<b>{formik.values.name}</b>
</Text>
<Text mb="2" color="gray.500">
Creating database usually takes a couple of minutes. Breathe in,
breathe out, logs are about to appear below:
</Text>
<Terminal>
{arrayOfCreateDbLogs.map((log) => (
<Text key={arrayOfCreateDbLogs.indexOf(log)} size="small">
{log.message}
</Text>
))}
</Terminal>
{!!isDbCreationSuccess &&
isDbCreationSuccess === DbCreationStatus.SUCCESS ? (
<Box mt="12" display="flex" justifyContent="flex-end">
<Button
onClick={() => handleNext()}
rightIcon={<FiArrowRight size={20} />}
>
Next
</Button>
</Box>
) : !!isDbCreationSuccess &&
isDbCreationSuccess === DbCreationStatus.FAILURE ? (
<Box mt="12" display="flex" justifyContent="flex-end">
<Button
onClick={() => {
setIsTerminalVisible(false);
formik.resetForm();
}}
rightIcon={<FiArrowLeft size={20} />}
>
Back
</Button>
</Box>
) : null}
</>
) : (
<Box mt="8">
<form onSubmit={formik.handleSubmit}>
<Box mt="12">
{loading && (
<Center>
<Spinner />
</Center>
)}
{isDokkuPluginInstalledError ? (
<Alert
status="error"
variant="top-accent"
flexDirection="column"
alignItems="flex-start"
borderBottomRadius="base"
boxShadow="md"
>
<AlertTitle mr={2}>Request failed</AlertTitle>
<AlertDescription>
{isDokkuPluginInstalledError.message}
</AlertDescription>
</Alert>
) : null}
{data?.isPluginInstalled.isPluginInstalled === false &&
!loading && (
<>
<Text mt="3">
Before creating a{' '}
<b>{formik.values.type.toLowerCase()}</b> database,
you will need to run this command on your dokku
server.
</Text>
<Terminal>{`sudo dokku plugin:install https://github.com/dokku/dokku-${dbTypeToDokkuPlugin(
formik.values.type
)}.git ${dbTypeToDokkuPlugin(
formik.values.type
)}`}</Terminal>
<Text mt="3">
Couple of seconds later you will be able to proceed
further.
</Text>
</>
)}
{data?.isPluginInstalled.isPluginInstalled === true &&
!loading && (
<SimpleGrid columns={{ sm: 1, md: 3 }}>
<FormControl
id="name"
isInvalid={Boolean(
formik.errors.name && formik.touched.name
)}
>
<FormLabel>Database name</FormLabel>
<Input
autoComplete="off"
id="name"
name="name"
value={formik.values.name}
onChange={formik.handleChange}
onBlur={formik.handleBlur}
/>
<FormErrorMessage>
{formik.errors.name}
</FormErrorMessage>
</FormControl>
</SimpleGrid>
)}
</Box>
<Box mt="12">
<Text mb="2">Choose your database</Text>
<Grid
templateColumns={{
base: 'repeat(2, minmax(0, 1fr))',
md: 'repeat(4, minmax(0, 1fr))',
}}
gap="4"
>
<DatabaseBox
selected={formik.values.type === 'POSTGRESQL'}
label="PostgreSQL"
icon={<PostgreSQLIcon size={40} />}
onClick={() => formik.setFieldValue('type', 'POSTGRESQL')}
/>
<DatabaseBox
selected={formik.values.type === 'MYSQL'}
label="MySQL"
icon={<MySQLIcon size={40} />}
onClick={() => formik.setFieldValue('type', 'MYSQL')}
/>
<DatabaseBox
selected={formik.values.type === 'MONGODB'}
label="Mongo"
icon={<MongoIcon size={40} />}
onClick={() => formik.setFieldValue('type', 'MONGODB')}
/>
<DatabaseBox
selected={formik.values.type === 'REDIS'}
label="Redis"
icon={<RedisIcon size={40} />}
onClick={() => formik.setFieldValue('type', 'REDIS')}
/>
</Grid>
</Box>
<Box mt="12" display="flex" justifyContent="flex-end">
<Button
isLoading={formik.isSubmitting}
disabled={
data?.isPluginInstalled.isPluginInstalled === false ||
!formik.values.name ||
!!formik.errors.name ||
!dataDb?.databases
}
rightIcon={<FiArrowRight size={20} />}
type="submit"
>
Create
</Button>
</Box>
</form>
</Box>
)}
</Box>
</Container>
</>
);
}
Example #16
Source File: index.tsx From dxvote with GNU Affero General Public License v3.0 | 4 votes |
ProposalCard: React.FC<ProposalCardProps> = ({ id, href }) => {
const { guild_id: guildId } = useParams<{ guild_id?: string }>();
const { data: proposal } = useProposal(guildId, id);
const votes = useVoteSummary(guildId, id);
const { imageUrl, ensName } = useENSAvatar(proposal?.creator, MAINNET_ID);
return (
<UnstyledLink to={href || '#'}>
<CardWrapper>
<CardHeader>
<IconDetailWrapper>
{proposal?.creator ? (
<Avatar src={imageUrl} defaultSeed={proposal.creator} size={24} />
) : (
<Loading
style={{ margin: 0 }}
loading
text
skeletonProps={{ circle: true, width: '24px', height: '24px' }}
/>
)}
<Detail>
{ensName ||
(proposal?.creator ? (
shortenAddress(proposal.creator)
) : (
<Loading style={{ margin: 0 }} loading text />
))}
</Detail>
</IconDetailWrapper>
<ProposalStatusWrapper>
<ProposalStatus
proposalId={id}
bordered={false}
showRemainingTime
/>
</ProposalStatusWrapper>
</CardHeader>
<CardContent>
<CardTitle size={2}>
<strong>
{proposal?.title || (
<Loading style={{ margin: 0 }} loading text />
)}
</strong>
</CardTitle>
</CardContent>
<CardFooter>
{proposal?.value ? (
<BorderedIconDetailWrapper>
<Detail>150 ETH</Detail>
{isDesktop && (
<>
<Icon as="div" spaceLeft spaceRight>
<FiArrowRight />
</Icon>{' '}
<Detail>geronimo.eth</Detail>
</>
)}
</BorderedIconDetailWrapper>
) : (
<Loading
style={{ margin: 0 }}
skeletonProps={{ width: '200px' }}
loading
text
/>
)}
{proposal?.totalVotes ? (
<BorderedIconDetailWrapper>
{votes
.sort((a, b) => b - a)
.map((vote, i) => {
if (i < 3 && !(i === votes.length - 1)) {
return (
<>
<Detail>{vote}%</Detail>
<Icon as="div" spaceLeft spaceRight>
<FiCircle />
</Icon>
</>
);
} else {
return <Detail>{vote}%</Detail>;
}
})}
</BorderedIconDetailWrapper>
) : (
<Loading
style={{ margin: 0 }}
loading
text
skeletonProps={{ width: '200px' }}
/>
)}
</CardFooter>
</CardWrapper>
</UnstyledLink>
);
}
Example #17
Source File: Logs.tsx From meshtastic-web with GNU General Public License v3.0 | 4 votes |
Logs = (): JSX.Element => {
const dispatch = useAppDispatch();
const meshtasticState = useAppSelector((state) => state.meshtastic);
const appState = useAppSelector((state) => state.app);
type lookupType = { [key: number]: string };
const emitterLookup: lookupType = {
[Types.Emitter.sendText]: 'text-rose-500',
[Types.Emitter.sendPacket]: 'text-pink-500',
[Types.Emitter.sendRaw]: 'text-fuchsia-500',
[Types.Emitter.setConfig]: 'text-purple-500',
[Types.Emitter.confirmSetConfig]: 'text-violet-500',
[Types.Emitter.setOwner]: 'text-indigo-500',
[Types.Emitter.setChannel]: 'text-blue-500',
[Types.Emitter.confirmSetChannel]: 'text-sky-500',
[Types.Emitter.deleteChannel]: 'text-cyan-500',
[Types.Emitter.getChannel]: 'text-teal-500',
[Types.Emitter.getAllChannels]: 'text-emerald-500',
[Types.Emitter.getConfig]: 'text-green-500',
[Types.Emitter.getOwner]: 'text-lime-500',
[Types.Emitter.configure]: 'text-yellow-500',
[Types.Emitter.handleFromRadio]: 'text-amber-500',
[Types.Emitter.handleMeshPacket]: 'text-orange-500',
[Types.Emitter.connect]: 'text-red-500',
[Types.Emitter.ping]: 'text-stone-500',
[Types.Emitter.readFromRadio]: 'text-zinc-500',
[Types.Emitter.writeToRadio]: 'text-gray-500',
[Types.Emitter.setDebugMode]: 'text-slate-500',
};
const levelLookup: lookupType = {
[Protobuf.LogRecord_Level.UNSET]: 'text-green-500',
[Protobuf.LogRecord_Level.CRITICAL]: 'text-purple-500',
[Protobuf.LogRecord_Level.ERROR]: 'text-red-500',
[Protobuf.LogRecord_Level.WARNING]: 'text-orange-500',
[Protobuf.LogRecord_Level.INFO]: 'text-blue-500',
[Protobuf.LogRecord_Level.DEBUG]: 'text-neutral-500',
[Protobuf.LogRecord_Level.TRACE]: 'text-slate-500',
};
return (
<div className="flex h-full flex-col gap-4 p-4">
<Card
title="Device Logs"
actions={
<IconButton
icon={<FiTrash />}
onClick={(): void => {
dispatch(clearLogs());
}}
/>
}
className="flex-grow overflow-y-auto"
>
<table className="table-cell flex-grow">
<tbody
className="
block h-full flex-col overflow-y-auto font-mono text-xs dark:text-gray-400"
>
<AnimatePresence>
{meshtasticState.logs.length === 0 && (
<div className="flex h-full w-full">
<m.img
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
className="m-auto h-64 w-64 text-green-500"
src={
appState.darkMode
? '/View_Code_Dark.svg'
: '/View_Code.svg'
}
/>
</div>
)}
{meshtasticState.logs.map((log, index) => (
<m.tr
key={index}
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
transition={{ duration: 0.3 }}
className="group hover:bg-gray-300 dark:hover:bg-secondaryDark"
>
<m.td
className="w-6 cursor-pointer"
whileHover={{ scale: 1.01 }}
whileTap={{ scale: 0.99 }}
>
<div className="m-auto pl-2 text-white group-hover:text-black dark:text-primaryDark dark:group-hover:text-gray-400">
<FiArrowRight />
</div>
</m.td>
<Wrapper>
{log.date
.toLocaleString(undefined, {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
})
.replaceAll('/', '-')
.replace(',', '')}
</Wrapper>
<Wrapper>
<div className={emitterLookup[log.emitter]}>
[{Types.EmitterScope[log.scope]}.
{Types.Emitter[log.emitter]}]
</div>
</Wrapper>
<Wrapper className={levelLookup[log.level]}>
[{Protobuf.LogRecord_Level[log.level]}]{/* </div> */}
</Wrapper>
<td
className={`m-auto ${
log.packet ? '' : 'dark:text-secondaryDark'
}`}
>
<FiPaperclip />
</td>
<td className="w-full truncate pl-1">{log.message}</td>
</m.tr>
// </ContextMenu>
))}
</AnimatePresence>
</tbody>
</table>
</Card>
</div>
);
}