From c83dbc718e2b76336ea7e0062f02f20fdecaf4ca Mon Sep 17 00:00:00 2001 From: vchikalkin Date: Wed, 8 Nov 2023 16:40:48 +0300 Subject: [PATCH] apps/web: fetch data from server --- apps/web/.eslintignore | 2 +- apps/web/api/ius/query.ts | 19 +++ apps/web/api/ius/types.ts | 12 ++ apps/web/app/ius/[slug]/page.tsx | 49 +++++++ apps/web/app/page.tsx | 213 ------------------------------- apps/web/config/env.js | 17 +++ apps/web/config/env.ts | 3 - apps/web/config/schema/env.js | 8 ++ apps/web/config/schema/env.ts | 7 - apps/web/config/urls.ts | 11 ++ apps/web/constants/urls.js | 3 + apps/web/next.config.js | 13 ++ apps/web/package.json | 1 + apps/web/utils/common.ts | 1 + packages/ui/content.tsx | 2 +- packages/ui/header.tsx | 14 +- yarn.lock | 5 + 17 files changed, 153 insertions(+), 227 deletions(-) create mode 100644 apps/web/api/ius/query.ts create mode 100644 apps/web/api/ius/types.ts create mode 100644 apps/web/app/ius/[slug]/page.tsx delete mode 100644 apps/web/app/page.tsx create mode 100644 apps/web/config/env.js delete mode 100644 apps/web/config/env.ts create mode 100644 apps/web/config/schema/env.js delete mode 100644 apps/web/config/schema/env.ts create mode 100644 apps/web/config/urls.ts create mode 100644 apps/web/constants/urls.js create mode 100644 apps/web/utils/common.ts diff --git a/apps/web/.eslintignore b/apps/web/.eslintignore index a5a2165..37655aa 100644 --- a/apps/web/.eslintignore +++ b/apps/web/.eslintignore @@ -9,4 +9,4 @@ next-env.d.ts postcss.config.js tailwind.config.ts .eslintrc.js -next.config.js \ No newline at end of file +next.config.* \ No newline at end of file diff --git a/apps/web/api/ius/query.ts b/apps/web/api/ius/query.ts new file mode 100644 index 0000000..4976b09 --- /dev/null +++ b/apps/web/api/ius/query.ts @@ -0,0 +1,19 @@ +import type * as t from './types'; +import { urls } from '@/config/urls'; +import wretch from 'wretch'; + +const api = wretch(urls.URL_UIS) + .errorType('json') + .resolve(({ json }) => json()); + +export async function getData(params: t.Request) { + const url = `/${params.slug}?${new URLSearchParams(params.searchParams)}`; + + return api.get(url).then((res) => res as t.ResponseGetData); +} + +export async function getMetaData(params: t.Request) { + const url = `/${params.slug}/meta?${new URLSearchParams(params.searchParams)}`; + + return api.get(url).then((res) => res as t.ResponseMetaData); +} diff --git a/apps/web/api/ius/types.ts b/apps/web/api/ius/types.ts new file mode 100644 index 0000000..a50a956 --- /dev/null +++ b/apps/web/api/ius/types.ts @@ -0,0 +1,12 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +type MetaObject = { + disabled: boolean; + fieldType: string; + label: string; + required: boolean; + visible: boolean; +}; + +export type Request = { searchParams: any; slug: string }; +export type ResponseGetData = Record; +export type ResponseMetaData = Record; diff --git a/apps/web/app/ius/[slug]/page.tsx b/apps/web/app/ius/[slug]/page.tsx new file mode 100644 index 0000000..146f86d --- /dev/null +++ b/apps/web/app/ius/[slug]/page.tsx @@ -0,0 +1,49 @@ +import * as apiIUS from '@/api/ius/query'; +import type { Request } from '@/api/ius/types'; +import { Background, Button, Content, Input } from 'ui'; + +type Props = { + params: { slug: string }; + searchParams: { [key: string]: string | string[] | undefined }; +}; + +export default async function Page(props: Props) { + const { data, metaData } = await getData({ + searchParams: props.searchParams, + slug: props.params.slug, + }); + + return ( + + +
+ {Object.keys(data).map((name) => ( + + ))} +
+
+ + + +
+
+
+ ); +} + +async function getData(params: Request) { + const data = await apiIUS.getData(params); + const metaData = await apiIUS.getMetaData(params); + + return { + data, + metaData, + }; +} diff --git a/apps/web/app/page.tsx b/apps/web/app/page.tsx deleted file mode 100644 index d78fd73..0000000 --- a/apps/web/app/page.tsx +++ /dev/null @@ -1,213 +0,0 @@ -/* eslint-disable unicorn/no-unused-properties */ -import { Background, Button, Content, Input } from 'ui'; - -const mockMeta = { - accountName: { - disable: true, - fieldType: 'STRING', - label: 'Контраген', - required: false, - visible: true, - }, - ageDrivers: { - disable: true, - fieldType: 'STRING', - label: 'Ограничение лиц, допущенных к управлению', - required: false, - visible: true, - }, - comment: { - disable: true, - fieldType: 'STRING', - label: 'Комментарий', - required: false, - visible: true, - }, - dgoPrice: { - disable: true, - fieldType: 'DECIMAL', - label: 'ДГО', - required: false, - visible: true, - }, - enginePower: { - disable: true, - fieldType: 'DECIMAL', - label: 'л.с', - required: false, - visible: true, - }, - evokaskoPrice: { - disable: true, - fieldType: 'DECIMAL', - label: 'Evo_КАСКО', - required: false, - visible: true, - }, - expDrivers: { - disable: true, - fieldType: 'INT', - label: 'Наименьший стаж водителей', - required: false, - visible: true, - }, - franchise: { - disable: true, - fieldType: 'DECIMAL', - label: 'Франшиза', - required: false, - visible: true, - }, - inn: { - disable: true, - fieldType: 'STRING', - label: 'ИНН', - required: false, - visible: true, - }, - inspectionRequired: { - disable: true, - fieldType: 'CHECKBOX', - label: 'Требуется осмотр', - required: false, - visible: true, - }, - insurancePrice: { - disable: true, - fieldType: 'DECIMAL', - label: 'ФинGAP', - required: false, - visible: true, - }, - kaskoPrice: { - disable: false, - fieldType: 'DECIMAL', - label: 'КАСКО/СМР', - required: false, - visible: true, - }, - kpp: { - disable: true, - fieldType: 'STRING', - label: 'КПП', - required: false, - visible: true, - }, - leasingobjectCategory: { - disable: true, - fieldType: 'STRING', - label: 'Ктегория ТС', - required: false, - visible: true, - }, - leasingobjectYear: { - disable: true, - fieldType: 'INT', - label: 'Год выпуска', - required: false, - visible: true, - }, - newPolicy: { - disable: true, - fieldType: 'CHECKBOX', - label: 'Требуется оформление нового полиса', - required: false, - visible: true, - }, - nsPrice: { - disable: true, - fieldType: 'DECIMAL', - label: 'НС', - required: false, - visible: true, - }, - nsibPrice: { - disable: true, - fieldType: 'DECIMAL', - label: 'НСиБ', - required: false, - visible: true, - }, - osagoPrice: { - disable: true, - fieldType: 'DECIMAL', - label: 'ОСАГО', - required: false, - visible: true, - }, - passportBrandModel: { - disable: true, - fieldType: 'STRING', - label: 'ТС', - required: false, - visible: true, - }, - polisNumber: { - disable: true, - fieldType: 'STRING', - label: 'Полис', - required: false, - visible: true, - }, - risk: { - disable: true, - fieldType: 'STRING', - label: 'Риски', - required: false, - visible: true, - }, - territoryPrice: { - disable: true, - fieldType: 'DECIMAL', - label: 'Расширение', - required: false, - visible: true, - }, - vin: { - disable: true, - fieldType: 'STRING', - label: 'VIN/Заводской номер машины', - required: false, - visible: true, - }, -}; - -const mockData = { - accountName: 'ООО "КУПЕР"', - ageDrivers: 'Без ограничений', - enginePower: 149, - expDrivers: 0, - franchise: 0, - leasingobjectCategory: '100000001', - leasingobjectYear: 2021, - passportBrandModel: '3008A1', - polisNumber: '0002810-0000103/23ТЮЛ', - risk: 'КАСКО, ДГО, НС', - vin: 'XZV3008A1M0000016', -}; - -export default function Page() { - return ( - - -
- {Object.keys(mockData).map((name) => ( - - ))} -
-
- - - -
-
-
- ); -} diff --git a/apps/web/config/env.js b/apps/web/config/env.js new file mode 100644 index 0000000..2bf4c4a --- /dev/null +++ b/apps/web/config/env.js @@ -0,0 +1,17 @@ +const envSchema = require('./schema/env.js'); + +const env = envSchema.parse(process.env); + +const serverEnv = envSchema + .pick({ + URL_IUS_DIRECT: true, + }) + .parse(process.env); + +const clientEnv = envSchema + .pick({ + USE_DEV_COLORS: true, + }) + .parse(process.env); + +module.exports = { clientEnv, env, serverEnv }; diff --git a/apps/web/config/env.ts b/apps/web/config/env.ts deleted file mode 100644 index 6dfb5a2..0000000 --- a/apps/web/config/env.ts +++ /dev/null @@ -1,3 +0,0 @@ -import envSchema from './schema/env'; - -export const env = envSchema.parse(process.env); diff --git a/apps/web/config/schema/env.js b/apps/web/config/schema/env.js new file mode 100644 index 0000000..2966a3b --- /dev/null +++ b/apps/web/config/schema/env.js @@ -0,0 +1,8 @@ +const { z } = require('zod'); + +const envSchema = z.object({ + URL_IUS_DIRECT: z.string(), + USE_DEV_COLORS: z.string(), +}); + +module.exports = envSchema; diff --git a/apps/web/config/schema/env.ts b/apps/web/config/schema/env.ts deleted file mode 100644 index d313a10..0000000 --- a/apps/web/config/schema/env.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { z } from 'zod'; - -const envSchema = z.object({ - USE_DEV_COLORS: z.string(), -}); - -export default envSchema; diff --git a/apps/web/config/urls.ts b/apps/web/config/urls.ts new file mode 100644 index 0000000..4fe9480 --- /dev/null +++ b/apps/web/config/urls.ts @@ -0,0 +1,11 @@ +import { serverEnv } from './env'; +import proxyUrls from '@/constants/urls'; +import { isServer } from '@/utils/common'; + +export const urls = isServer + ? { + URL_UIS: serverEnv.URL_IUS_DIRECT, + } + : { + URL_UIS: proxyUrls.URL_IUS_PROXY, + }; diff --git a/apps/web/constants/urls.js b/apps/web/constants/urls.js new file mode 100644 index 0000000..c3e693d --- /dev/null +++ b/apps/web/constants/urls.js @@ -0,0 +1,3 @@ +module.exports = { + URL_IUS_PROXY: '/api/ius', +}; diff --git a/apps/web/next.config.js b/apps/web/next.config.js index c232478..03695a8 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -1,7 +1,20 @@ +const envSchema = require('./config/schema/env'); +const urls = require('./constants/urls'); + +const env = envSchema.parse(process.env); + /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, transpilePackages: ['ui'], + async rewrites() { + return [ + { + destination: env.URL_IUS_DIRECT + '/:path', + source: urls.URL_IUS_PROXY + '/:path', + }, + ]; + }, }; module.exports = nextConfig; diff --git a/apps/web/package.json b/apps/web/package.json index 7bfefc4..7b0c4e0 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -15,6 +15,7 @@ "tailwind-tints": "^1.1.0", "tsconfig": "*", "ui": "*", + "wretch": "^2.7.0", "zod": "^3.22.4" }, "devDependencies": { diff --git a/apps/web/utils/common.ts b/apps/web/utils/common.ts new file mode 100644 index 0000000..df6bd56 --- /dev/null +++ b/apps/web/utils/common.ts @@ -0,0 +1 @@ +export const isServer = typeof window === 'undefined'; diff --git a/packages/ui/content.tsx b/packages/ui/content.tsx index a1f2ee0..bfe1962 100644 --- a/packages/ui/content.tsx +++ b/packages/ui/content.tsx @@ -1,5 +1,5 @@ import type { PropsWithChildren } from 'react'; export function Content({ children }: PropsWithChildren) { - return
{children}
; + return
{children}
; } diff --git a/packages/ui/header.tsx b/packages/ui/header.tsx index 0ad249e..2c78814 100644 --- a/packages/ui/header.tsx +++ b/packages/ui/header.tsx @@ -6,8 +6,18 @@ type Props = { export function Header({ children }: Props) { return ( -
-
{children}
+
+
+ {children} +
); } diff --git a/yarn.lock b/yarn.lock index 1ec76cf..b7c4054 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5890,6 +5890,11 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +wretch@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/wretch/-/wretch-2.7.0.tgz#6ad1664e2ad827d878fc41f4100208f60b7c6cb8" + integrity sha512-IOjqi9SlQ8FEWp1X3KJ74wLNqpDVBoJIJvC7ZDHxPhzriNJd84+7RAhFBTl2sHiqnzBhzfqs1sznaB0Ik/3Ngw== + ws@8.13.0: version "8.13.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0"