core/pages/calculator.tsx
SKINMAKER b421d1ab64
chore: apply prettier (#637)
* chore: apply prettier

* chore: edit ready comment

* chore: move ts comment
2023-11-29 22:04:33 +09:00

182 lines
5.3 KiB
TypeScript

import { GetServerSideProps, NextPage } from 'next'
import { useState } from 'react'
import dynamic from 'next/dynamic'
import { NextSeo } from 'next-seo'
import { Formik, Form } from 'formik'
import { ParsedUrlQuery } from 'querystring'
import { DiscordEnpoints, GuildPermissions } from '@utils/Constants'
const Container = dynamic(() => import('@components/Container'))
const Input = dynamic(() => import('@components/Form/Input'))
const Calculator: NextPage<CalculatorProps> = ({ query }) => {
const [value, setValue] = useState<{ [perm: string]: boolean }>({})
const Perm = ({ name, perm, yellow }: { name: string; perm: number; yellow?: boolean }) => {
return (
<li>
<label className='inline-flex items-center py-1'>
<input
className='form-checkbox h-5 w-5 rounded bg-gray-300 text-discord-blurple'
type='checkbox'
checked={value[perm]}
onChange={() => {
setValue({ ...value, [perm]: !value[perm] })
}}
/>
<span className={`ml-2.5 text-lg ${yellow ? 'text-amber-500' : ''}`}>{name}</span>
</label>
</li>
)
}
return (
<Container paddingTop className='pb-10'>
<NextSeo
title='봇 초대링크 생성기'
description='디스코드 봇 초대링크를 간편하게 생성하세요'
openGraph={{
title: '봇 초대링크 생성기',
description: '디스코드 봇 초대링크를 간편하게 생성하세요',
}}
/>
<h1 className='mb-4 mt-2 text-4xl font-bold'> </h1>
<div className='inline-flex items-center text-2xl font-bold'>
:{' '}
{String(
Object.keys(value)
.filter((el) => value[el])
.map((el) => Number(el))
.reduce((prev, curr) => BigInt(prev) | BigInt(curr), BigInt(0))
)}
<span className='ml-2 text-lg font-semibold'>
={' '}
{Object.keys(value)
.filter((el) => value[el])
.map((el) => `0x${Number(el).toString(16)}`)
.join(' | ')}
</span>
</div>
<div className='mt-2 grid grid-cols-1 gap-2 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-3'>
<div>
<h2 className='text-2xl font-bold'> </h2>
<ul>
{GuildPermissions.general.map((el) => (
<Perm key={el.name} name={el.name} perm={el.flag} yellow={el.twofactor} />
))}
</ul>
</div>
<div>
<h2 className='text-2xl font-bold'> </h2>
<ul>
{GuildPermissions.membership.map((el) => (
<Perm key={el.name} name={el.name} perm={el.flag} yellow={el.twofactor} />
))}
</ul>
</div>
<div>
<h2 className='text-2xl font-bold'> </h2>
<ul>
{GuildPermissions.channel.map((el) => (
<Perm key={el.name} name={el.name} perm={el.flag} yellow={el.twofactor} />
))}
</ul>
</div>
<div>
<h2 className='text-2xl font-bold'> </h2>
<ul>
{GuildPermissions.voice.map((el) => (
<Perm key={el.name} name={el.name} perm={el.flag} />
))}
</ul>
</div>
<div>
<h2 className='text-2xl font-bold'> </h2>
<ul>
{GuildPermissions.advanced.map((el) => (
<Perm key={el.name} name={el.name} perm={el.flag} yellow={el.twofactor} />
))}
</ul>
</div>
</div>
<div className='py-10'>
<span className='text-amber-500'>
= 2 , {' '}
<a href='https://support.discord.com/hc/ko/articles/219576828-2단계-인증-설정하기'>
2
</a>
.
</span>
</div>
<Formik
onSubmit={() => console.log('Pong?')}
initialValues={{
id: query.id?.toString() || '',
scope: 'bot',
redirect: '',
}}
>
{({ values, setFieldValue }) => (
<Form>
<div className='grid gap-3 lg:grid-cols-4'>
<div>
<h6> ID</h6>
<span className='text-gray-400'> .</span>
<Input name='id' placeholder='653534001742741552' />
</div>
<div>
<h6> (Scope)</h6>
<button
onClick={() => setFieldValue('scope', 'bot applications.commands')}
className='text-blue-500 hover:text-blue-400'
>
(Slash Command) ?
</button>
<Input name='scope' placeholder='bot' />
</div>
<div>
<h6> URL</h6>
<span className='text-gray-400'> URL입니다.</span>
<Input name='redirect' placeholder='(선택사항)' />
</div>
</div>
<div className='mt-2'>
:{' '}
<a
rel='noreferrer'
target='_blank'
href={
values.id
? DiscordEnpoints.InviteApplication(
values.id,
value,
values.scope,
values.redirect
)
: null
}
className='cursor-pointer text-blue-500 hover:text-blue-400'
>
{DiscordEnpoints.InviteApplication(values.id, value, values.scope, values.redirect)}
</a>
</div>
</Form>
)}
</Formik>
</Container>
)
}
export const getServerSideProps: GetServerSideProps = async (ctx) => {
return {
props: {
query: ctx.query,
},
}
}
interface CalculatorProps {
query: ParsedUrlQuery
}
export default Calculator