diff --git a/api/services/nta.ts b/api/services/nta.ts
new file mode 100644
index 0000000..4d2a4b5
--- /dev/null
+++ b/api/services/nta.ts
@@ -0,0 +1,94 @@
+import { send, sendError, fetch, NowRequest, NowResponse } from '../util/http'
+
+const APPLICATION_ID = process.env.NTA_APPLICATION_ID
+
+export default async function handler(
+ req: NowRequest<{ query: string; country: string }>,
+ res: NowResponse
+) {
+ const { query } = req.query
+
+ if (!query) {
+ return sendError(res, new Error('no query given'))
+ }
+
+ const encodedQuery = encodeURIComponent(
+ query.replace(/[A-Za-z0-9]/g, (str) =>
+ String.fromCharCode(str.charCodeAt(0) + 0xfee0)
+ )
+ )
+
+ try {
+ const response = await fetch(
+ `https://api.houjin-bangou.nta.go.jp/4/name?id=${APPLICATION_ID}&name=${encodedQuery}&mode=1&target=1&type=02`,
+ 'GET'
+ )
+ const body: string[] = (await response.text()).split('\n').slice(0, -1)
+ const header = body.shift()!.split(',')
+ const result = body.map((csv) => {
+ const entry = csv.split(',').map((item) =>
+ item
+ .replace(/(^"|"$)/g, '')
+ .replace(/[A-Za-z0-9]/g, (str) =>
+ String.fromCharCode(str.charCodeAt(0) - 0xfee0)
+ )
+ .replace(/ /g, ' ')
+ )
+
+ return {
+ index: entry[0],
+ orgID: entry[1],
+ name: entry[6],
+ englishName: entry[24],
+ phoneticName: entry[28],
+ type: entry[8],
+ created: entry[22],
+ lastUpdate: entry[4],
+ lastModified: entry[5],
+ imageID: entry[7],
+ location: {
+ pref: entry[9],
+ city: entry[10],
+ address: entry[11],
+ imageID: entry[12],
+ prefCode: entry[13],
+ cityCode: entry[14],
+ postalCode: entry[15],
+ englishPref: entry[25],
+ englishAddress: entry[26],
+ },
+ foreignLocation: {
+ address: entry[16],
+ imageID: entry[17],
+ englishForeignLocation: entry[27],
+ },
+ historyCount: entry[23],
+ closedAt: entry[18],
+ closedReason: entry[19],
+ successorOrgID: entry[20],
+ memo: entry[21],
+ excluded: entry[29],
+ processSection: entry[2],
+ modifiedSection: entry[3],
+ }
+ })
+ console.log(header)
+
+ send(res, {
+ meta: {
+ lastUpdate: header[0],
+ count: parseInt(header[1]),
+ cursor: parseInt(header[2]),
+ pages: parseInt(header[3]),
+ },
+ result:
+ result.map((entry) => ({
+ name: entry.name,
+ phoneticName: entry.phoneticName,
+ englishName: entry.englishName,
+ })) || [],
+ })
+ } catch (err) {
+ sendError(res, err)
+ }
+}
diff --git a/now.json b/now.json
index b35f7a7..4562b14 100644
--- a/now.json
+++ b/now.json
@@ -22,5 +22,8 @@
"src": "/(.*)",
"dest": "/web/$1"
}
- ]
+ ],
+ "env": {
+ "NTA_APPLICATION_ID": "@namae-nta-application-id"
+ }
}
diff --git a/web/public/locales/en/translation.json b/web/public/locales/en/translation.json
index 05ab0d5..9a9c416 100644
--- a/web/public/locales/en/translation.json
+++ b/web/public/locales/en/translation.json
@@ -20,9 +20,11 @@
"google": "Google Search",
"spectrum": "Spectrum",
"heroku": "Heroku",
- "now": "ZEIT Now"
+ "now": "ZEIT Now",
+ "nta": "Company (JP)"
},
"countryCode": "us",
"try": "suggestions",
- "showMore": "show more"
+ "showMore": "show more",
+ "noResult": "No Result"
}
diff --git a/web/public/locales/ja/translation.json b/web/public/locales/ja/translation.json
index 3a6e119..96c5c03 100644
--- a/web/public/locales/ja/translation.json
+++ b/web/public/locales/ja/translation.json
@@ -20,9 +20,11 @@
"google": "Google 検索",
"spectrum": "Spectrum",
"heroku": "Heroku",
- "now": "ZEIT Now"
+ "now": "ZEIT Now",
+ "nta": "法人"
},
"countryCode": "jp",
"try": "全自動名前考え機",
- "showMore": "もっと見る"
+ "showMore": "もっと見る",
+ "noResult": "該当なし"
}
diff --git a/web/src/App.js b/web/src/App.js
index 14ee574..f0ceef0 100644
--- a/web/src/App.js
+++ b/web/src/App.js
@@ -20,6 +20,7 @@ import GithubSearchCard from './components/cards/github-search'
import AppStoreCard from './components/cards/appstore'
import HerokuCard from './components/cards/heroku'
import NowCard from './components/cards/now'
+import NtaCard from './components/cards/nta'
import Welcome from './components/Welcome'
import Footer from './components/Footer'
@@ -34,7 +35,10 @@ export default function App() {
const [inputValue, setInputValue] = useState('')
const [suggested, setSuggested] = useState(false)
const inputRef = useRef()
- const { t } = useTranslation()
+ const {
+ t,
+ i18n: { language },
+ } = useTranslation()
const queryGiven = query && query.length > 0
@@ -114,6 +118,7 @@ export default function App() {
+ {language === 'ja' ? : null}
) : (
diff --git a/web/src/components/Welcome.js b/web/src/components/Welcome.js
index def312e..029590c 100644
--- a/web/src/components/Welcome.js
+++ b/web/src/components/Welcome.js
@@ -14,6 +14,7 @@ import {
FaSlack,
FaAws,
FaJsSquare,
+ FaBuilding,
} from 'react-icons/fa'
import { IoIosBeer } from 'react-icons/io'
import { DiRust, DiHeroku } from 'react-icons/di'
@@ -82,6 +83,9 @@ export default function Welcome() {
{t('providers.appStore')}
+
+ {t('providers.nta')}
+
)
diff --git a/web/src/components/cards/appstore.js b/web/src/components/cards/appstore.js
index eb9ab42..a91b956 100644
--- a/web/src/components/cards/appstore.js
+++ b/web/src/components/cards/appstore.js
@@ -26,7 +26,7 @@ function Search({ query }) {
/>
))
) : (
- } />
+ } />
)}
>
)
diff --git a/web/src/components/cards/github-search.js b/web/src/components/cards/github-search.js
index fd0e18e..7ccefb1 100644
--- a/web/src/components/cards/github-search.js
+++ b/web/src/components/cards/github-search.js
@@ -6,6 +6,7 @@ import { FaGithub, FaInfoCircle } from 'react-icons/fa'
import { Card, Result } from '../Cards'
function Search({ query }) {
+ const { t } = useTranslation()
const searchQuery = encodeURIComponent(`${query} in:name`)
const limit = 10
const response = useFetch(
@@ -28,7 +29,7 @@ function Search({ query }) {
/>
))
) : (
- } />
+ } />
)}
>
)
diff --git a/web/src/components/cards/nta.js b/web/src/components/cards/nta.js
new file mode 100644
index 0000000..46ce98f
--- /dev/null
+++ b/web/src/components/cards/nta.js
@@ -0,0 +1,40 @@
+import React from 'react'
+import useFetch from 'fetch-suspense'
+import { useTranslation } from 'react-i18next'
+import { FaBuilding, FaInfoCircle } from 'react-icons/fa'
+
+import { Card, Result } from '../Cards'
+
+function Search({ query }) {
+ const { t } = useTranslation()
+ const term = encodeURIComponent(query)
+ const response = useFetch(`/availability/nta/${term}`)
+ const apps = response.result
+
+ return (
+ <>
+ {apps.length > 0 ? (
+ apps.map((app, i) => (
+ }
+ key={i}
+ />
+ ))
+ ) : (
+ } />
+ )}
+ >
+ )
+}
+
+export default function NtaCard({ query }) {
+ const { t } = useTranslation()
+
+ return (
+
+
+
+ )
+}
diff --git a/web/src/util/i18n.js b/web/src/util/i18n.js
index ab86d18..d0e1eeb 100644
--- a/web/src/util/i18n.js
+++ b/web/src/util/i18n.js
@@ -14,7 +14,7 @@ i18n
backends: [LocalStorageBackend, XHR],
backendOptions: [
{
- versions: { en: '1.3', ja: '1.3' },
+ versions: { en: '1.5', ja: '1.5' },
},
],
},