mirror of
https://github.com/MAKS-IT-COM/maksit-certs-ui.git
synced 2026-06-10 00:28:11 +02:00
194 lines
6.0 KiB
TypeScript
194 lines
6.0 KiB
TypeScript
'use client'
|
|
|
|
import { ApiRoutes, GetApiRoute } from '@/ApiRoutes'
|
|
import { httpService } from '@/services/HttpService'
|
|
import { FormEvent, useEffect, useRef, useState } from 'react'
|
|
import {
|
|
CustomButton,
|
|
CustomCheckbox,
|
|
CustomEnumSelect,
|
|
CustomInput,
|
|
CustomRadioGroup
|
|
} from '@/controls'
|
|
import {
|
|
GetAccountResponse,
|
|
toCacheAccount
|
|
} from '@/models/letsEncryptServer/account/responses/GetAccountResponse'
|
|
import { deepCopy, enumToArray } from '../functions'
|
|
import { CacheAccount } from '@/entities/CacheAccount'
|
|
import { ChallengeTypes } from '@/entities/ChallengeTypes'
|
|
import { FaPlus, FaTrash } from 'react-icons/fa'
|
|
import { PageContainer } from '@/components/pageContainer'
|
|
import { OffCanvas } from '@/components/offcanvas'
|
|
import { AccountEdit } from '@/partials/accoutEdit'
|
|
import { get } from 'http'
|
|
|
|
export default function Page() {
|
|
const [accounts, setAccounts] = useState<CacheAccount[]>([])
|
|
const [editingAccount, setEditingAccount] = useState<CacheAccount | null>(
|
|
null
|
|
)
|
|
|
|
const init = useRef(false)
|
|
|
|
useEffect(() => {
|
|
if (init.current) return
|
|
|
|
console.log('Fetching accounts')
|
|
|
|
const fetchAccounts = async () => {
|
|
const newAccounts: CacheAccount[] = []
|
|
const gatAccountsResult = await httpService.get<GetAccountResponse[]>(
|
|
GetApiRoute(ApiRoutes.ACCOUNTS)
|
|
)
|
|
|
|
if (!gatAccountsResult.isSuccess) return
|
|
|
|
gatAccountsResult.data?.forEach((account) => {
|
|
newAccounts.push(toCacheAccount(account))
|
|
})
|
|
|
|
setAccounts(newAccounts)
|
|
}
|
|
|
|
fetchAccounts()
|
|
init.current = true
|
|
}, [])
|
|
|
|
const handleAccountUpdate = (updatedAccount: CacheAccount) => {
|
|
setAccounts(
|
|
accounts.map((account) =>
|
|
account.accountId === updatedAccount.accountId
|
|
? updatedAccount
|
|
: account
|
|
)
|
|
)
|
|
}
|
|
|
|
const deleteAccount = (accountId: string) => {
|
|
setAccounts(accounts.filter((account) => account.accountId !== accountId))
|
|
setEditingAccount(null)
|
|
}
|
|
|
|
return (
|
|
<>
|
|
<PageContainer title="LetsEncrypt Auto Renew">
|
|
{accounts.map((account) => (
|
|
<div
|
|
key={account.accountId}
|
|
className="bg-white shadow-lg rounded-lg p-6 mb-6"
|
|
>
|
|
<div className="flex justify-between items-center mb-4">
|
|
<h2 className="text-2xl font-semibold">
|
|
Account: {account.accountId}
|
|
</h2>
|
|
<CustomButton
|
|
onClick={() => {
|
|
setEditingAccount(account)
|
|
}}
|
|
className="bg-blue-500 text-white px-3 py-1 rounded"
|
|
>
|
|
Edit
|
|
</CustomButton>
|
|
</div>
|
|
|
|
<div className="mb-4">
|
|
<h3 className="text-xl font-medium mb-2">
|
|
Description: {account.description}
|
|
</h3>
|
|
</div>
|
|
|
|
<div className="mb-4">
|
|
<CustomCheckbox
|
|
checked={account.isDisabled}
|
|
label="Disabled"
|
|
disabled={true}
|
|
/>
|
|
</div>
|
|
|
|
<div className="mb-4">
|
|
<h3 className="text-xl font-medium mb-2">Contacts:</h3>
|
|
<ul className="list-disc list-inside pl-4 mb-2">
|
|
{account.contacts.map((contact) => (
|
|
<li key={contact} className="text-gray-700 mb-2">
|
|
{contact}
|
|
</li>
|
|
))}
|
|
</ul>
|
|
</div>
|
|
<div className="mb-4">
|
|
<CustomEnumSelect
|
|
title="Challenge Type"
|
|
enumType={ChallengeTypes}
|
|
selectedValue={account.challengeType}
|
|
disabled={true}
|
|
/>
|
|
</div>
|
|
<div className="mb-4">
|
|
<h3 className="text-xl font-medium mb-2">Hostnames:</h3>
|
|
<ul className="list-disc list-inside pl-4 mb-2">
|
|
{account.hostnames?.map((hostname) => (
|
|
<li key={hostname.hostname} className="text-gray-700 mb-2">
|
|
<div className="inline-flex">
|
|
{hostname.hostname} - {hostname.expires.toDateString()} -
|
|
<span
|
|
className={`ml-2 px-2 py-1 rounded ${
|
|
hostname.isUpcomingExpire
|
|
? 'bg-yellow-200 text-yellow-800'
|
|
: 'bg-green-200 text-green-800'
|
|
}`}
|
|
>
|
|
{hostname.isUpcomingExpire
|
|
? 'Upcoming'
|
|
: 'Not Upcoming'}
|
|
</span>
|
|
<CustomCheckbox
|
|
checked={hostname.isDisabled}
|
|
label="Disabled"
|
|
disabled={true}
|
|
/>
|
|
</div>
|
|
</li>
|
|
))}
|
|
</ul>
|
|
</div>
|
|
|
|
<div className="mb-4">
|
|
<CustomRadioGroup
|
|
options={[
|
|
{ value: 'staging', label: 'Staging' },
|
|
{ value: 'production', label: 'Production' }
|
|
]}
|
|
initialValue={account.isStaging ? 'staging' : 'production'}
|
|
title="LetsEncrypt Environment"
|
|
className=""
|
|
radioClassName=""
|
|
errorClassName="text-red-500 text-sm mt-1"
|
|
disabled={true}
|
|
/>
|
|
</div>
|
|
</div>
|
|
))}
|
|
</PageContainer>
|
|
|
|
<OffCanvas
|
|
title="Edit Account"
|
|
isOpen={editingAccount !== null}
|
|
onClose={() => setEditingAccount(null)}
|
|
>
|
|
{editingAccount && (
|
|
<AccountEdit
|
|
account={editingAccount}
|
|
onCancel={() => setEditingAccount(null)}
|
|
onDelete={deleteAccount}
|
|
onSubmit={(account) => {
|
|
setEditingAccount(null)
|
|
handleAccountUpdate(account)
|
|
}}
|
|
/>
|
|
)}
|
|
</OffCanvas>
|
|
</>
|
|
)
|
|
}
|