core/pages/calculator.tsx

128 lines
4.8 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 text-discord-blurple bg-gray-300 h-5 w-5 rounded' type='checkbox' checked={value[perm]} onChange={() => {
setValue({ ...value, [perm]: !value[perm] })
}} />
<span className={`ml-2.5 text-lg ${yellow ? 'text-yellow-500' : ''}`}>{name}</span>
</label>
</li>
}
return <Container paddingTop className='pb-10'>
<NextSeo title='봇 초대링크 생성기' description='디스코드 봇 초대링크를 간편하게 생성하세요' openGraph={{
title:'봇 초대링크 생성기',
description: '디스코드 봇 초대링크를 간편하게 생성하세요'
}} />
<h1 className='text-4xl font-bold mt-2 mb-4'> </h1>
<div className='text-2xl font-bold inline-flex items-center'>: {Object.keys(value).filter(el => value[el]).map(el => Number(el)).reduce((prev, curr) => prev | curr, 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='grid gap-2 grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-3 mt-2'>
<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-yellow-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