From b6a3b0cd532a598317e41bb4b5306ab84ccdc41f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=95=84=EB=A5=B4=ED=8E=98?= Date: Fri, 2 Feb 2024 01:35:17 +0900 Subject: [PATCH] style: use space indentation feat: no new users allowed fix: change base language to Korean fix: change gacha to random text from devs --- .editorconfig | 2 +- ormconfig.cjs | 24 ++-- src/backend/const.ts | 26 ---- src/backend/controllers/body/user-setting.ts | 2 +- src/backend/router.ts | 6 +- src/backend/services/worker.ts | 56 ++++---- src/backend/views/frontend.pug | 72 +++++----- src/backend/views/rescue.pug | 22 +-- src/common/functions/create-gacha.ts | 26 +--- src/common/functions/format.ts | 2 +- src/common/types/error-code.ts | 1 + src/common/types/visibility.ts | 2 +- src/frontend/GeneralLayout.tsx | 40 +++--- src/frontend/Header.tsx | 2 +- src/frontend/components/Card.tsx | 4 +- src/frontend/components/HashtagTimeline.tsx | 2 +- src/frontend/components/LogView.tsx | 2 +- src/frontend/components/LoginForm.tsx | 4 +- src/frontend/components/NavigationMenu.tsx | 2 +- src/frontend/components/Ranking.tsx | 16 +-- src/frontend/components/Skeleton.tsx | 4 +- src/frontend/components/Tab.tsx | 12 +- src/frontend/langs/en-US.json | 5 +- src/frontend/langs/index.ts | 12 +- src/frontend/langs/ja-JP.json | 3 +- src/frontend/langs/ko-KR.json | 1 + src/frontend/pages/account.tsx | 2 +- src/frontend/pages/admin.tsx | 26 ++-- src/frontend/pages/apps/misshai.tsx | 20 +-- src/frontend/pages/index.session.tsx | 4 +- src/frontend/pages/index.welcome.tsx | 104 +++++++------- src/frontend/pages/settings.tsx | 34 ++--- src/frontend/style.scss | 12 +- styles/style.scss | 10 +- webpack.config.cjs | 140 +++++++++---------- 35 files changed, 335 insertions(+), 367 deletions(-) diff --git a/.editorconfig b/.editorconfig index 74e4fbc..dbb3778 100644 --- a/.editorconfig +++ b/.editorconfig @@ -6,4 +6,4 @@ end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true -indent_size = 4 \ No newline at end of file +indent_size = 2 \ No newline at end of file diff --git a/ormconfig.cjs b/ormconfig.cjs index 4555057..af77319 100644 --- a/ormconfig.cjs +++ b/ormconfig.cjs @@ -5,16 +5,16 @@ const entities = require('./built/backend/services/db').entities; const config = Object.freeze(JSON.parse(fs.readFileSync(__dirname + '/config.json', 'utf-8'))); module.exports = { - type: 'postgres', - host: config.db.host, - port: config.db.port, - username: config.db.user, - password: config.db.pass, - database: config.db.db, - extra: config.db.extra, - entities: entities, - migrations: ['migration/*.ts'], - cli: { - migrationsDir: 'migration' - } + type: 'postgres', + host: config.db.host, + port: config.db.port, + username: config.db.user, + password: config.db.pass, + database: config.db.db, + extra: config.db.extra, + entities: entities, + migrations: ['migration/*.ts'], + cli: { + migrationsDir: 'migration' + } }; diff --git a/src/backend/const.ts b/src/backend/const.ts index d5db7bc..2a535d0 100644 --- a/src/backend/const.ts +++ b/src/backend/const.ts @@ -16,35 +16,9 @@ export const misskeyAppInfo = { permission: [ 'read:account', 'write:account', - 'read:blocks', - 'write:blocks', - 'read:drive', - 'write:drive', - 'read:favorites', - 'write:favorites', - 'read:following', - 'write:following', - 'read:messaging', - 'write:messaging', - 'read:mutes', - 'write:mutes', 'write:notes', 'read:notifications', 'write:notifications', - 'read:reactions', - 'write:reactions', - 'write:votes', - 'read:pages', - 'write:pages', - 'write:page-likes', - 'read:page-likes', - 'read:user-groups', - 'write:user-groups', 'read:channels', - 'write:channels', - 'read:gallery', - 'write:gallery', - 'read:gallery-likes', - 'write:gallery-likes', ], } as const; diff --git a/src/backend/controllers/body/user-setting.ts b/src/backend/controllers/body/user-setting.ts index dc2881e..ce3168a 100644 --- a/src/backend/controllers/body/user-setting.ts +++ b/src/backend/controllers/body/user-setting.ts @@ -24,5 +24,5 @@ export class UserSetting { useRanking?: boolean; @IsOptional() - appendHashtag?: boolean; + appendHashtag?: boolean; } diff --git a/src/backend/router.ts b/src/backend/router.ts index 2f80c00..8f75a53 100644 --- a/src/backend/router.ts +++ b/src/backend/router.ts @@ -180,8 +180,12 @@ router.get('(.*)', async (ctx) => { async function login(ctx: Context, user: Record, host: string, token: string) { const isNewcomer = !(await getUser(user.username as string, host)); - await upsertUser(user.username as string, host, token); + if (isNewcomer) { + await die(ctx, 'noNewUserAllowed', 403); + return; + } + await upsertUser(user.username as string, host, token); const u = await getUser(user.username as string, host); if (!u) { diff --git a/src/backend/services/worker.ts b/src/backend/services/worker.ts index 2005953..a99bdb9 100644 --- a/src/backend/services/worker.ts +++ b/src/backend/services/worker.ts @@ -38,23 +38,23 @@ export const work = async () => { await calculateAllRating(groupedUsers); } catch (e) { - printLog('Misskey Tools with LycheeBridge 레이팅 계산에 실패했습니다.', 'error'); - printLog(e instanceof Error ? errorToString(e) : JSON.stringify(e, null, ' '), 'error'); - Store.dispatch({ nowCalculating: false }); + printLog('Misskey Tools with LycheeBridge 레이팅 계산에 실패했습니다.', 'error'); + printLog(e instanceof Error ? errorToString(e) : JSON.stringify(e, null, ' '), 'error'); + Store.dispatch({ nowCalculating: false }); } finally { - Store.dispatch({ nowCalculating: false }); - printLog(`${users.length}개의 계정 레이팅 계산이 완료되었습니다.`); + Store.dispatch({ nowCalculating: false }); + printLog(`${users.length}개의 계정 레이팅 계산이 완료되었습니다.`); } try { - printLog(`${users.length}개의 계정에 알림을 전송하고 있습니다.`); + printLog(`${users.length}개의 계정에 알림을 전송하고 있습니다.`); await sendAllAlerts(groupedUsers); } catch (e) { printLog('Misskey Tools with LycheeBridge 알림 전송에 실패했습니다.', 'error'); printLog(e instanceof Error ? errorToString(e) : JSON.stringify(e, null, ' '), 'error'); } finally { - printLog('Misskey Tools with LycheeBridge 알림 전송이 완료되었습니다.'); + printLog('Misskey Tools with LycheeBridge 알림 전송이 완료되었습니다.'); } }; @@ -75,10 +75,10 @@ const calculateRating = async (host: string, users: User[]) => { // ユーザーが削除されている場合、レコードからも消してとりやめ printLog(`${toAcct(user)} 게정이 삭제, 정지, 또는 토큰이 제거된 것으로 보이며, 시스템에서 계정이 제거되었습니다.`, 'warn'); await deleteUser(user.username, user.host); - continue; + continue; } else { printLog(`Misskey 오류: ${JSON.stringify(e.error)}`, 'error'); - continue; + continue; } } else if (e instanceof TimedOutError) { printLog(`${user.host} 인스턴스로의 연결에 실패하여 레이팅 계산을 중단합니다.`, 'error'); @@ -105,7 +105,7 @@ const sendAlerts = async (host: string, users: User[]) => { .map(user => { const count = userScoreCache.get(toAcct(user)); if (count == null) return null; - if (count.notesCount - (user.prevNotesCount ?? 0) <= 1) return null; + if (count.notesCount - (user.prevNotesCount ?? 0) <= 1) return null; return { user, count, @@ -121,31 +121,31 @@ const sendAlerts = async (host: string, users: User[]) => { // 通知 for (const {user, count, message} of models.filter(m => m.user.alertMode === 'notification' || m.user.alertMode === 'both')) { - try { + try { await sendNotificationAlert(message, user); - } catch (e) { - printLog('Misskey Tools with LycheeBridge 알림 전송에 실패했습니다.', 'error'); + } catch (e) { + printLog('Misskey Tools with LycheeBridge 알림 전송에 실패했습니다.', 'error'); printLog(e instanceof Error ? errorToString(e) : JSON.stringify(e, null, ' '), 'error'); - } finally { - if (user.alertMode === 'notification') { - await updateScore(user, count); - } - } + } finally { + if (user.alertMode === 'notification') { + await updateScore(user, count); + } + } } // アラート for (const {user, count, message} of models.filter(m => m.user.alertMode === 'note' || m.user.alertMode === 'both')) { - try { + try { await sendNoteAlert(message, user); - } catch (e) { - printLog('Misskey Tools with LycheeBridge 알림 전송에 실패했습니다.', 'error'); - printLog(e instanceof Error ? errorToString(e) : JSON.stringify(e, null, ' '), 'error'); - } finally { - await Promise.all([ - updateScore(user, count), - delay(1000), - ]); - } + } catch (e) { + printLog('Misskey Tools with LycheeBridge 알림 전송에 실패했습니다.', 'error'); + printLog(e instanceof Error ? errorToString(e) : JSON.stringify(e, null, ' '), 'error'); + } finally { + await Promise.all([ + updateScore(user, count), + delay(1000), + ]); + } } printLog(`${host} 인스턴스의 사용자 ${users.length}명의 알림 전송이 완료되었습니다.`); diff --git a/src/backend/views/frontend.pug b/src/backend/views/frontend.pug index a04d5b7..c50394f 100644 --- a/src/backend/views/frontend.pug +++ b/src/backend/views/frontend.pug @@ -1,41 +1,41 @@ doctype html html - head - meta(charset="UTF-8") - meta(name="viewport", content="width=device-width, initial-scale=1.0") - block meta - - const title = t ? `${t} | Misskey Tools`: 'Misskey Tools with LycheeBridge'; - - const desc = d || '🌠 연합우주의 모든 Misskey 사용자를 위한 다양한 도구 모음집 🚀'; - title= title - meta(name='description' content=desc) - meta(property='og:title' content=title) - meta(property='og:site_name' content='Misskey Tools with LycheeBridge') - meta(property='og:description' content=desc) - meta(property='og:type' content='website') - meta(property='og:image' content="https://tools.phater.live/assets/misskey.png") - link(rel="icon", href="/assets/lcb.png", type="image/png") - link(rel="preload", href="/assets/otadesign_rounded.woff") - link(rel="preload", href="/assets/otadesign_rounded.woff2") - link(rel="preload", href="/assets/PretendardJPVariable.woff2") - script(src='https://kit.fontawesome.com/a4464bc6cd.js' crossorigin='anonymous') - link(rel="stylesheet", href="/assets/style.css") - body - #app: .loading 불러오는 중입니다... + head + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1.0") + block meta + - const title = t ? `${t} | Misskey Tools`: 'Misskey Tools with LycheeBridge'; + - const desc = d || '🌠 연합우주의 모든 Misskey 사용자를 위한 다양한 도구 모음집 🚀'; + title= title + meta(name='description' content=desc) + meta(property='og:title' content=title) + meta(property='og:site_name' content='Misskey Tools with LycheeBridge') + meta(property='og:description' content=desc) + meta(property='og:type' content='website') + meta(property='og:image' content="https://tools.phater.live/assets/misskey.png") + link(rel="icon", href="/assets/lcb.png", type="image/png") + link(rel="preload", href="/assets/otadesign_rounded.woff") + link(rel="preload", href="/assets/otadesign_rounded.woff2") + link(rel="preload", href="/assets/PretendardJPVariable.woff2") + script(src='https://kit.fontawesome.com/a4464bc6cd.js' crossorigin='anonymous') + link(rel="stylesheet", href="/assets/style.css") + body + #app: .loading 불러오는 중입니다... - if token - script. - const token = '#{token}'; - const previousToken = localStorage.getItem('token'); - const accounts = JSON.parse(localStorage.getItem('accounts') || '[]'); - if (previousToken && !accounts.includes(previousToken)) { - accounts.push(previousToken); - } - localStorage.setItem('accounts', JSON.stringify(accounts)); - localStorage.setItem('token', token); - history.replaceState(null, null, '/'); + if token + script. + const token = '#{token}'; + const previousToken = localStorage.getItem('token'); + const accounts = JSON.parse(localStorage.getItem('accounts') || '[]'); + if (previousToken && !accounts.includes(previousToken)) { + accounts.push(previousToken); + } + localStorage.setItem('accounts', JSON.stringify(accounts)); + localStorage.setItem('token', token); + history.replaceState(null, null, '/'); - if error - script. - window.__misshaialert = { error: '#{error}' }; + if error + script. + window.__misshaialert = { error: '#{error}' }; - script(src=`/assets/fe.${version}.js` async defer) + script(src=`/assets/fe.${version}.js` async defer) diff --git a/src/backend/views/rescue.pug b/src/backend/views/rescue.pug index 69665cc..87e6958 100644 --- a/src/backend/views/rescue.pug +++ b/src/backend/views/rescue.pug @@ -1,13 +1,13 @@ doctype html html - head - meta(charset="UTF-8") - body - p 클라이언트에 문제가 발생했습니다. 해결을 위해 브라우저에 있는 데이터를 제거했습니다. - p 3초 뒤에 메인 페이지로 자동으로 돌아갑니다... - hr - p There's a problem in client and deleted data on device to solve it. - p You will be redirected to the top in 3 seconds. - script. - localStorage.clear(); - setTimeout(() => location.href = '/', 3000); + head + meta(charset="UTF-8") + body + p 클라이언트에 문제가 발생했습니다. 해결을 위해 브라우저에 있는 데이터를 제거했습니다. + p 3초 뒤에 메인 페이지로 자동으로 돌아갑니다... + hr + p There's a problem in client and deleted data on device to solve it. + p You will be redirected to the top in 3 seconds. + script. + localStorage.clear(); + setTimeout(() => location.href = '/', 3000); diff --git a/src/common/functions/create-gacha.ts b/src/common/functions/create-gacha.ts index 2fa3040..d5fe223 100644 --- a/src/common/functions/create-gacha.ts +++ b/src/common/functions/create-gacha.ts @@ -1,25 +1,11 @@ -const allKatakana = [ - ...('アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨ'.split('')), - 'ウィ', 'ウェ', - 'キャ', 'キュ', 'キョ', - 'クァ', 'クォ', - 'シャ', 'シュ', 'ショ', - 'チャ', 'チュ', 'チョ', - 'ヒャ', 'ヒュ', 'ヒョ', - 'ミャ', 'ミュ', 'ミョ' +const allTexts: string[] = [ + '아무말 빔----', + '휴대폰용 보험은 가입하셨나요?', ]; -const allInfix = [ '', 'ー', 'ッ' ]; - -const getRandomKatakana = () => allKatakana[Math.floor(Math.random() * allKatakana.length)]; -const getRandomInfix = () => allInfix[Math.floor(Math.random() * allInfix.length)]; +const getRandomText = () => allTexts[Math.floor(Math.random() * allTexts.length)]; export const createGacha = () => { - return [ - getRandomKatakana(), - getRandomInfix(), - getRandomKatakana(), - getRandomInfix(), - ...(new Array(Math.floor(Math.random() * 2 + 1)).fill('').map(() => getRandomKatakana())) - ].join(''); + const result = getRandomText(); + return result; }; diff --git a/src/common/functions/format.ts b/src/common/functions/format.ts index a74d113..b392397 100644 --- a/src/common/functions/format.ts +++ b/src/common/functions/format.ts @@ -47,7 +47,7 @@ export const format = (user: IUser, count: Count): string => { return !v ? m : typeof v === 'function' ? v(score, user) : v; }); if (user.appendHashtag) { - result = result + '\n\n#misshaialert' + result = result + '\n\n#misshaialert'; } return result; }; diff --git a/src/common/types/error-code.ts b/src/common/types/error-code.ts index 855e6d8..9faa479 100644 --- a/src/common/types/error-code.ts +++ b/src/common/types/error-code.ts @@ -7,6 +7,7 @@ export const errorCodes = [ 'notAuthorized', 'hostNotFound', 'invalidHostFormat', + 'noNewUserAllowed', 'other', ] as const; diff --git a/src/common/types/visibility.ts b/src/common/types/visibility.ts index 4077c92..5f93423 100644 --- a/src/common/types/visibility.ts +++ b/src/common/types/visibility.ts @@ -5,4 +5,4 @@ export const visibilities = [ 'users' // ログインユーザー (Groundpolis 限定) ] as const; -export type Visibility = typeof visibilities[number]; \ No newline at end of file +export type Visibility = typeof visibilities[number]; diff --git a/src/frontend/GeneralLayout.tsx b/src/frontend/GeneralLayout.tsx index 9193dd4..2983ed4 100644 --- a/src/frontend/GeneralLayout.tsx +++ b/src/frontend/GeneralLayout.tsx @@ -10,36 +10,36 @@ import { useSelector } from './store'; import { setDrawerShown } from './store/slices/screen'; const Container = styled.div` - padding: var(--margin); - position: relative; + padding: var(--margin); + position: relative; `; const Sidebar = styled.nav` - width: 320px; - position: fixed; - top: var(--margin); - left: var(--margin); + width: 320px; + position: fixed; + top: var(--margin); + left: var(--margin); `; const Main = styled.main` - flex: 1; + flex: 1; margin-top: 80px; - margin-left: ${p => !p.isMobile ? `${320 + 16}px` : 0}; - min-width: 0; + margin-left: ${p => !p.isMobile ? `${320 + 16}px` : 0}; + min-width: 0; `; const MobileHeader = styled.header` - position: fixed; - top: 0; - left: 0; - right: 0; - height: 64px; - background: var(--panel); - z-index: 1000; - > h1 { - font-size: 1rem; - margin-bottom: 0; - } + position: fixed; + top: 0; + left: 0; + right: 0; + height: 64px; + background: var(--panel); + z-index: 1000; + > h1 { + font-size: 1rem; + margin-bottom: 0; + } `; export const GeneralLayout: React.FC = ({children}) => { diff --git a/src/frontend/Header.tsx b/src/frontend/Header.tsx index 28307c6..cf29f04 100644 --- a/src/frontend/Header.tsx +++ b/src/frontend/Header.tsx @@ -6,7 +6,7 @@ import { useGetSessionQuery } from './services/session'; import { useSelector } from './store'; export type HeaderProps = { - title?: string; + title?: string; }; export const Header: React.FC = ({title}) => { diff --git a/src/frontend/components/Card.tsx b/src/frontend/components/Card.tsx index 5e309d9..7f9b827 100644 --- a/src/frontend/components/Card.tsx +++ b/src/frontend/components/Card.tsx @@ -1,8 +1,8 @@ import React from 'react'; export type CardProps = { - className?: string; - bodyClassName?: string; + className?: string; + bodyClassName?: string; }; export const Card: React.FC = ({children, className, bodyClassName}) => { diff --git a/src/frontend/components/HashtagTimeline.tsx b/src/frontend/components/HashtagTimeline.tsx index 7f92426..2193d19 100644 --- a/src/frontend/components/HashtagTimeline.tsx +++ b/src/frontend/components/HashtagTimeline.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { useTranslation } from 'react-i18next'; export type HashtagTimelineProps = { - hashtag: string; + hashtag: string; }; export const HashtagTimeline: React.VFC = ({hashtag}) => { diff --git a/src/frontend/components/LogView.tsx b/src/frontend/components/LogView.tsx index fcc4ff6..2562f5f 100644 --- a/src/frontend/components/LogView.tsx +++ b/src/frontend/components/LogView.tsx @@ -7,7 +7,7 @@ const LogItem: React.FC<{log: Log}> = ({log}) => { return (
- [{time}] {log.text} + [{time}] {log.text}
); }; diff --git a/src/frontend/components/LoginForm.tsx b/src/frontend/components/LoginForm.tsx index d22774e..0521d72 100644 --- a/src/frontend/components/LoginForm.tsx +++ b/src/frontend/components/LoginForm.tsx @@ -3,8 +3,8 @@ import { useTranslation } from 'react-i18next'; import styled from 'styled-components'; const Input = styled.input` - width: auto; - flex: 1; + width: auto; + flex: 1; `; export const LoginForm: React.VFC = () => { diff --git a/src/frontend/components/NavigationMenu.tsx b/src/frontend/components/NavigationMenu.tsx index 5abf662..6fc6ab4 100644 --- a/src/frontend/components/NavigationMenu.tsx +++ b/src/frontend/components/NavigationMenu.tsx @@ -63,7 +63,7 @@ export const NavigationMenu: React.VFC = () => { {meta && (
- v{meta.version} {t('changelog')} + v{meta.version} {t('changelog')}
)} diff --git a/src/frontend/components/Ranking.tsx b/src/frontend/components/Ranking.tsx index d5bd3cc..f5e95c1 100644 --- a/src/frontend/components/Ranking.tsx +++ b/src/frontend/components/Ranking.tsx @@ -3,19 +3,19 @@ import { useTranslation } from 'react-i18next'; import { $get } from '../misc/api'; interface RankingResponse { - isCalculating: boolean; - userCount: number; - ranking: Ranking[]; + isCalculating: boolean; + userCount: number; + ranking: Ranking[]; } interface Ranking { - username?: string; - host?: string; - rating: number; + username?: string; + host?: string; + rating: number; } export type RankingProps = { - limit?: number; + limit?: number; }; export const Ranking: React.VFC = ({limit}) => { @@ -60,7 +60,7 @@ export const Ranking: React.VFC = ({limit}) => {
{i + 1}
- -------------
+ -------------
{t('_missHai.rating')}: {r.rating}
diff --git a/src/frontend/components/Skeleton.tsx b/src/frontend/components/Skeleton.tsx index e34ad29..1189ead 100644 --- a/src/frontend/components/Skeleton.tsx +++ b/src/frontend/components/Skeleton.tsx @@ -1,8 +1,8 @@ import React from 'react'; export type SkeletonProps = { - width?: string | number; - height?: string | number; + width?: string | number; + height?: string | number; }; export const Skeleton: React.VFC = (p) => { diff --git a/src/frontend/components/Tab.tsx b/src/frontend/components/Tab.tsx index d6e38a7..2aa5a65 100644 --- a/src/frontend/components/Tab.tsx +++ b/src/frontend/components/Tab.tsx @@ -1,15 +1,15 @@ import React from 'react'; export type TabItem = { - label: string; - key: string; - isNew?: boolean; + label: string; + key: string; + isNew?: boolean; }; export type TabProps = { - items: TabItem[]; - selected: string; - onSelect: (key: string) => void; + items: TabItem[]; + selected: string; + onSelect: (key: string) => void; }; // タブコンポーネント diff --git a/src/frontend/langs/en-US.json b/src/frontend/langs/en-US.json index 4fc063d..5fe3310 100644 --- a/src/frontend/langs/en-US.json +++ b/src/frontend/langs/en-US.json @@ -50,7 +50,7 @@ "update": "Update", "shareMisskeyTools": "Share #MisskeyTools", "shareMisskeyToolsNote": "Try #MisskeyTools !\n\nhttps://t.psec.dev", - "instanceUrlPlaceholder": "e.g. misskey.io", + "instanceUrlPlaceholder": "k.lapy.link, stella.place, psec.dev...", "settings": "Settings", "accentColor": "Accent Color", "changelog": "Changelog", @@ -156,7 +156,7 @@ } }, "_error": { - "sorry": "Something went wrong. Please retry again.", + "sorry": "We have some small problem. Please try again later.", "additionalInfo": "Additional Info: ", "hitorisskeyIsDenied": "You cannot integrate with hitorisskey.", "teapot": "I'm a teapot.", @@ -164,6 +164,7 @@ "tokenRequired": "Token is required.", "invalidParameter": "Invalid parameter.", "notAuthorized": "Not authorized.", + "noNewUserAllowed": "You cannot signup to this service for now.", "hostNotFound": "Could not connect to the instance. Make sure that the host name is correct and the instance is live.", "other": "None" }, diff --git a/src/frontend/langs/index.ts b/src/frontend/langs/index.ts index e900aca..1c31d33 100644 --- a/src/frontend/langs/index.ts +++ b/src/frontend/langs/index.ts @@ -10,19 +10,19 @@ const merge = (baseData: Record, newData: Record { accounts.map(account => ( )} @@ -174,22 +174,22 @@ export const AdminPage: React.VFC = () => { ) : (