From b07b597d2e7013606fbd9fb82528c5c2e276446b Mon Sep 17 00:00:00 2001 From: Yasuaki Uechi Date: Sun, 1 Sep 2019 00:00:24 +0900 Subject: [PATCH] feat: add nta --- api/services/nta.ts | 94 +++++++++++++++++++++++ now.json | 5 +- web/public/locales/en/translation.json | 6 +- web/public/locales/ja/translation.json | 6 +- web/src/App.js | 7 +- web/src/components/Welcome.js | 4 + web/src/components/cards/appstore.js | 2 +- web/src/components/cards/github-search.js | 3 +- web/src/components/cards/nta.js | 40 ++++++++++ web/src/util/i18n.js | 2 +- 10 files changed, 160 insertions(+), 9 deletions(-) create mode 100644 api/services/nta.ts create mode 100644 web/src/components/cards/nta.js 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' }, }, ], },