import { Label, Modal, TextInput, Button } from 'flowbite-react' import generator, { MegalodonInterface, OAuth, detector } from 'megalodon' import { useState } from 'react' import { db } from '@/db' import { FormattedMessage } from 'react-intl' type NewProps = { opened: boolean close: () => void } export default function New(props: NewProps) { const [sns, setSNS] = useState<'mastodon' | 'pleroma' | 'firefish' | 'friendica' | null>(null) const [domain, setDomain] = useState('') const [client, setClient] = useState() const [appData, setAppData] = useState() const close = () => { setSNS(null) setDomain('') setClient(undefined) setAppData(undefined) props.close() } const checkDomain = async () => { const input = document.getElementById('domain') as HTMLInputElement setDomain(input.value) const url = `https://${input.value}` const sns = await detector(url) setSNS(sns) const client = generator(sns, url) setClient(client) const appData = await client.registerApp('Whalebird', {}) setAppData(appData) global.ipc.invoke('open-browser', appData.url) } const authorize = async () => { if (!client || !appData) return const input = document.getElementById('authorization') as HTMLInputElement let authorizationCode = null if (appData.session_token) { authorizationCode = appData.session_token } else { authorizationCode = input.value } const tokenData = await client.fetchAccessToken(appData.client_id, appData.client_secret, authorizationCode) if (!sns) return const cli = generator(sns, `https://${domain}`, tokenData.access_token, 'Whalebird') const acct = await cli.verifyAccountCredentials() await db.accounts.add({ username: acct.data.username, account_id: acct.data.id, avatar: acct.data.avatar, client_id: appData.client_id, client_secret: appData.client_secret, access_token: tokenData.access_token, refresh_token: tokenData.refresh_token, url: `https://${domain}`, domain: domain, sns: sns }) close() } return ( <>
{sns === null && ( <>
)} {sns && appData && ( <> {appData.session_token ? ( <>
) : ( <>

)} )}
) }