feat: ym sync

This commit is contained in:
2025-04-13 13:48:06 +03:00
parent 5487aab274
commit 69c5f1419f
9 changed files with 159 additions and 18 deletions

View File

@@ -281,6 +281,8 @@ export type { GetTimeTrackingRecordsResponse } from './models/GetTimeTrackingRec
export type { GetTransactionTagsResponse } from './models/GetTransactionTagsResponse'; export type { GetTransactionTagsResponse } from './models/GetTransactionTagsResponse';
export type { GetWorkShiftsPlanningDataRequest } from './models/GetWorkShiftsPlanningDataRequest'; export type { GetWorkShiftsPlanningDataRequest } from './models/GetWorkShiftsPlanningDataRequest';
export type { GetWorkShiftsResponse } from './models/GetWorkShiftsResponse'; export type { GetWorkShiftsResponse } from './models/GetWorkShiftsResponse';
export type { GetYandexMarketCampaignsRequest } from './models/GetYandexMarketCampaignsRequest';
export type { GetYandexMarketCampaignsResponse } from './models/GetYandexMarketCampaignsResponse';
export type { GroupBillRequestSchema } from './models/GroupBillRequestSchema'; export type { GroupBillRequestSchema } from './models/GroupBillRequestSchema';
export type { HTTPValidationError } from './models/HTTPValidationError'; export type { HTTPValidationError } from './models/HTTPValidationError';
export type { LoadMessagesResponse } from './models/LoadMessagesResponse'; export type { LoadMessagesResponse } from './models/LoadMessagesResponse';
@@ -449,6 +451,7 @@ export type { UserUpdate } from './models/UserUpdate';
export type { ValidationError } from './models/ValidationError'; export type { ValidationError } from './models/ValidationError';
export type { WorkShiftRowSchema } from './models/WorkShiftRowSchema'; export type { WorkShiftRowSchema } from './models/WorkShiftRowSchema';
export type { WorkShiftSchema } from './models/WorkShiftSchema'; export type { WorkShiftSchema } from './models/WorkShiftSchema';
export type { YandexMarketCampaignSchema } from './models/YandexMarketCampaignSchema';
export { AttributeService } from './services/AttributeService'; export { AttributeService } from './services/AttributeService';
export { AuthService } from './services/AuthService'; export { AuthService } from './services/AuthService';

View File

@@ -0,0 +1,8 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type GetYandexMarketCampaignsRequest = {
apiKey: string;
};

View File

@@ -0,0 +1,9 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
import type { YandexMarketCampaignSchema } from './YandexMarketCampaignSchema';
export type GetYandexMarketCampaignsResponse = {
campaigns: Array<YandexMarketCampaignSchema>;
};

View File

@@ -0,0 +1,9 @@
/* generated using openapi-typescript-codegen -- do not edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type YandexMarketCampaignSchema = {
id: number;
name: string;
};

View File

@@ -9,6 +9,8 @@ import type { DeleteMarketplaceResponse } from '../models/DeleteMarketplaceRespo
import type { GetAllBaseMarketplacesResponse } from '../models/GetAllBaseMarketplacesResponse'; import type { GetAllBaseMarketplacesResponse } from '../models/GetAllBaseMarketplacesResponse';
import type { GetClientMarketplacesRequest } from '../models/GetClientMarketplacesRequest'; import type { GetClientMarketplacesRequest } from '../models/GetClientMarketplacesRequest';
import type { GetClientMarketplacesResponse } from '../models/GetClientMarketplacesResponse'; import type { GetClientMarketplacesResponse } from '../models/GetClientMarketplacesResponse';
import type { GetYandexMarketCampaignsRequest } from '../models/GetYandexMarketCampaignsRequest';
import type { GetYandexMarketCampaignsResponse } from '../models/GetYandexMarketCampaignsResponse';
import type { UpdateMarketplaceRequest } from '../models/UpdateMarketplaceRequest'; import type { UpdateMarketplaceRequest } from '../models/UpdateMarketplaceRequest';
import type { UpdateMarketplaceResponse } from '../models/UpdateMarketplaceResponse'; import type { UpdateMarketplaceResponse } from '../models/UpdateMarketplaceResponse';
import type { CancelablePromise } from '../core/CancelablePromise'; import type { CancelablePromise } from '../core/CancelablePromise';
@@ -106,4 +108,24 @@ export class MarketplaceService {
}, },
}); });
} }
/**
* Get Yandex Market Campaigns
* @returns GetYandexMarketCampaignsResponse Successful Response
* @throws ApiError
*/
public static getYandexMarketCampaigns({
requestBody,
}: {
requestBody: GetYandexMarketCampaignsRequest,
}): CancelablePromise<GetYandexMarketCampaignsResponse> {
return __request(OpenAPI, {
method: 'POST',
url: '/marketplace/yandex-market/get-campaigns',
body: requestBody,
mediaType: 'application/json',
errors: {
422: `Validation Error`,
},
});
}
} }

View File

@@ -0,0 +1,61 @@
import { Loader, Select, SelectProps } from "@mantine/core";
import {
MarketplaceAuthData,
} from "../../../pages/MarketplacesPage/modals/MarketplaceFormModal/MarketplaceFormModal.tsx";
import { omit } from "lodash";
import { useEffect, useState } from "react";
import { MarketplaceService, YandexMarketCampaignSchema } from "../../../client";
type RestProps = {
authData: MarketplaceAuthData;
onChange(value: YandexMarketCampaignSchema): void;
value?: string;
}
type Props = Omit<SelectProps, "data" | "value" | "onChange"> & RestProps;
const YandexMarketCampaignSelect = (props: Props) => {
const [isLoading, setIsLoading] = useState(false);
const [data, setData] = useState<{ label: string, value: string }[]>([]);
const restProps = omit(props, ["authData", "onChange", "value"]);
const { authData } = props;
const fetchData = async () => {
const apiKey = authData["Api-Key"];
if (!apiKey || !apiKey.startsWith("ACMA")) return;
setIsLoading(true);
MarketplaceService.getYandexMarketCampaigns({ requestBody: { apiKey: apiKey } }).then(response => {
const campaigns = response.campaigns;
const data = campaigns.map((campaign) => ({
value: campaign.id.toString(),
label: campaign.name,
}));
setData(data);
setIsLoading(false);
});
};
const onChange = (value: string | null) => {
const selected = data.find(item => item.value === value);
if (selected) {
props.onChange({ id: parseInt(selected.value), name: selected.label });
}
};
useEffect(() => {
fetchData();
}, [authData["Api-Key"]]);
return (
<Select
{...restProps}
disabled={isLoading}
rightSection={isLoading && <Loader size={16} />}
value={props.value?.toString()}
onChange={onChange}
data={data}
label="Магазин"
placeholder="Выберите магазин"
searchable
/>
);
};
export default YandexMarketCampaignSelect;

View File

@@ -3,19 +3,23 @@ import { BaseFormInputProps } from "../../../../types/utils.ts";
import { FC } from "react"; import { FC } from "react";
import { BaseMarketplaceSchema } from "../../../../client"; import { BaseMarketplaceSchema } from "../../../../client";
import { BaseMarketplaceType } from "../../../../shared/enums/BaseMarketplaceType.ts"; import { BaseMarketplaceType } from "../../../../shared/enums/BaseMarketplaceType.ts";
import { MarketplaceAuthData } from "./MarketplaceFormModal.tsx";
import YandexMarketCampaignSelect
from "../../../../components/Selects/YandexMarketCampaignSelect/YandexMarketCampaignSelect.tsx";
import { omit } from "lodash";
type RestProps = { type RestProps = {
baseMarketplace: BaseMarketplaceSchema; baseMarketplace: BaseMarketplaceSchema;
}; };
type Props = BaseFormInputProps<Record<string, string>> & RestProps; type Props = BaseFormInputProps<MarketplaceAuthData> & RestProps;
const MarketplaceAuthDataInput: FC<Props> = (props: Props) => { const MarketplaceAuthDataInput: FC<Props> = (props: Props) => {
console.log(props.baseMarketplace); const restProps = omit(props, ["baseMarketplace"]);
const getWildberriesInputs = () => { const getWildberriesInputs = () => {
// return input that sets record "Authorization" to value // return input that sets record "Authorization" to value
return ( return (
<TextInput <TextInput
{...props} {...restProps}
label={"Ключ авторизации"} label={"Ключ авторизации"}
placeholder={"Введите ключ авторизации"} placeholder={"Введите ключ авторизации"}
value={props.value["Authorization"] || ""} value={props.value["Authorization"] || ""}
@@ -32,7 +36,7 @@ const MarketplaceAuthDataInput: FC<Props> = (props: Props) => {
return ( return (
<> <>
<NumberInput <NumberInput
{...props} {...restProps}
label={"Client-Id"} label={"Client-Id"}
placeholder={"Введите Client-Id"} placeholder={"Введите Client-Id"}
value={props.value["Client-Id"] || undefined} value={props.value["Client-Id"] || undefined}
@@ -44,7 +48,7 @@ const MarketplaceAuthDataInput: FC<Props> = (props: Props) => {
} }
/> />
<TextInput <TextInput
{...props} {...restProps}
label={"Api-Key"} label={"Api-Key"}
placeholder={"Введите Api-Key"} placeholder={"Введите Api-Key"}
value={props.value["Api-Key"] || ""} value={props.value["Api-Key"] || ""}
@@ -59,6 +63,29 @@ const MarketplaceAuthDataInput: FC<Props> = (props: Props) => {
); );
}; };
const getYandexMarketInputs = () => { const getYandexMarketInputs = () => {
return (
<>
<TextInput
{...restProps}
label={"Api-Key"}
placeholder={"Введите Api-Key"}
value={props.value["Api-Key"] || ""}
onChange={value => {
props.onChange({
...props.value,
"Api-Key": value.target.value,
});
}}
/>
<YandexMarketCampaignSelect
value={props.value["CampaignId"] || ""}
onChange={value => props.onChange({
...props.value,
"CampaignId": value.id.toString(),
})}
authData={props.value} />
</>
);
}; };
const getInputs = () => { const getInputs = () => {

View File

@@ -1,7 +1,5 @@
import { ContextModalProps } from "@mantine/modals"; import { ContextModalProps } from "@mantine/modals";
import BaseFormModal, { import BaseFormModal, { CreateEditFormProps } from "../../../ClientsPage/modals/BaseFormModal/BaseFormModal.tsx";
CreateEditFormProps,
} from "../../../ClientsPage/modals/BaseFormModal/BaseFormModal.tsx";
import { MarketplaceSchema } from "../../../../client"; import { MarketplaceSchema } from "../../../../client";
import { useForm } from "@mantine/form"; import { useForm } from "@mantine/form";
import { Fieldset, Flex, rem, TextInput } from "@mantine/core"; import { Fieldset, Flex, rem, TextInput } from "@mantine/core";
@@ -9,21 +7,24 @@ import BaseMarketplaceSelect from "../../../../components/Selects/BaseMarketplac
import MarketplaceAuthDataInput from "./MarketplaceAuthDataInput.tsx"; import MarketplaceAuthDataInput from "./MarketplaceAuthDataInput.tsx";
type Props = CreateEditFormProps<MarketplaceSchema>; type Props = CreateEditFormProps<MarketplaceSchema>;
export type MarketplaceAuthData = Record<string, string>;
const MarketplaceFormModal = ({ const MarketplaceFormModal = ({
context, context,
id, id,
innerProps, innerProps,
}: ContextModalProps<Props>) => { }: ContextModalProps<Props>) => {
const isEditing = "element" in innerProps; const isEditing = "element" in innerProps;
const initialValue: Partial<MarketplaceSchema> = isEditing const initialValue: Partial<MarketplaceSchema> = isEditing
? innerProps.element ? innerProps.element
: { : {
authData: { authData: {
"Authorization": "", "Authorization": "",
"Client-Id": "", "Client-Id": "",
"Api-Key": "", "Api-Key": "",
}, "CampaignId": "",
}; },
};
const form = useForm<Partial<MarketplaceSchema>>({ const form = useForm<Partial<MarketplaceSchema>>({
initialValues: initialValue, initialValues: initialValue,
validate: { validate: {

View File

@@ -10,6 +10,7 @@ export default defineConfig({
strictPort: true, strictPort: true,
hmr: { hmr: {
port: 5173, port: 5173,
host: "127.0.0.1",
}, },
}, },
}); });