import { EmailSubscriptionType, MenuItemType, WidgetResultType, WidgetSchemaType, DynamicWidgetResultType } from '../../types'; import { buildClientRequestUrl } from '../../utils'; import { misc, widgets } from '../urls'; import { api } from './api'; type CategoryExtraType = { category_id: number; parent_categories: Array; }; type ProductExtraType = { image: string; price: number; product_type: string; retail_price: number; }; export interface AutocompleteResponse { groups: Array<{ entries: Array<{ extra: CategoryExtraType & ProductExtraType; label: string; suggestion_type: string; url: string; }>; suggestion_type: 'Category' | 'Product'; }>; } export interface GetMenuParams { depth: number; parent?: string; } export interface GetLanguageResponse { active_language: string; default_language: string; available_languages: { [key: string]: string; }; } export interface SetLanguageResponse { success: boolean; } export const miscApi = api.injectEndpoints({ endpoints: (builder) => ({ autocomplete: builder.query({ query: (query: string) => ({ url: buildClientRequestUrl(`${misc.autocomplete}?search_text=${query}`) }) }), emailSubscription: builder.mutation({ query: (body) => ({ url: buildClientRequestUrl(misc.emailSubscription, { contentType: 'application/json' }), method: 'POST', body }) }), setLanguage: builder.mutation({ query: (body) => ({ url: buildClientRequestUrl('/i18n/setlang', { useFormData: true, responseType: 'text' }), method: 'POST', body }), transformResponse: (response, meta) => { return { success: meta.response.status === 200, osessionid: meta.response.headers.get('osessionid') }; } }), // change any type getWidget: builder.query, string>({ query: (slug: string) => ({ url: buildClientRequestUrl(widgets.getWidget(slug)) }) }), getWidgetSchema: builder.query< WidgetSchemaType, string >({ query: (widgetSlug: string) => ({ url: buildClientRequestUrl(widgets.getWidgetSchema(widgetSlug)) }) }), getMenu: builder.query({ query: ({ depth, parent }) => ({ url: buildClientRequestUrl(misc.menus(depth, parent)) }), transformResponse: (response: { menu: MenuItemType[] }) => { return response.menu; } }), getBukalemunImageUrl: builder.query< any, { current_chapter: string; sku: string; selected_attributes: any } >({ query: ({ current_chapter, sku, selected_attributes }) => { const data = { ...selected_attributes, current_chapter, sku }; const params = new URLSearchParams(data); return { url: buildClientRequestUrl( misc.bukalemunImageUrl(params.toString()), { responseType: 'json' } ) }; } }) }), overrideExisting: true }); export const { useAutocompleteQuery, useEmailSubscriptionMutation, useSetLanguageMutation, useGetWidgetQuery, useGetWidgetSchemaQuery, useGetMenuQuery, useGetBukalemunImageUrlQuery } = miscApi;