Skip to content

Commit b15487d

Browse files
author
Marcin Kwiatkowski
committed
refactor: m2-528. refactored useUrlResolver to use the route query
1 parent 6969faf commit b15487d

File tree

8 files changed

+79
-15
lines changed

8 files changed

+79
-15
lines changed

packages/api-client/src/api/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,5 +60,6 @@ export { default as updateCustomerAddress } from './updateCustomerAddress';
6060
export { default as updateCustomerEmail } from './updateCustomerEmail';
6161
export { default as upsellProduct } from './upsellProduct';
6262
export { default as urlResolver } from './urlResolver';
63+
export { default as route } from './route';
6364
export { default as wishlist } from './wishlist';
6465
export { default as wishlistItemsCount } from './wishlistItemsCount';
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import type { ApolloQueryResult } from '@apollo/client/core';
2+
import type { CustomQuery } from '@vue-storefront/core';
3+
import type { QueryRouteArgs, RoutableInterface } from '../../types/GraphQL';
4+
import routeQuery from './route';
5+
import type { Context } from '../../types/context';
6+
7+
export type RouteQuery<ROUTE_TYPE> = {
8+
route: ROUTE_TYPE
9+
};
10+
11+
/**
12+
* Returns the canonical URL for a specified product, category, or CMS page
13+
*
14+
* @param context VSF Context
15+
* @param url the URL to be resolved
16+
* @param [customQuery] (optional) - custom GraphQL query that extends the default one
17+
*/
18+
export default async function route<ROUTE_TYPE extends RoutableInterface>(
19+
context: Context,
20+
url: string,
21+
customQuery: CustomQuery = { route: 'route' },
22+
): Promise<ApolloQueryResult<RouteQuery<ROUTE_TYPE>>> {
23+
const { route: routeGQL } = context.extendQuery(customQuery, {
24+
route: {
25+
query: routeQuery,
26+
variables: { url },
27+
},
28+
});
29+
30+
return context.client.query<RouteQuery<ROUTE_TYPE>, QueryRouteArgs>({
31+
query: routeGQL.query,
32+
variables: routeGQL.variables,
33+
});
34+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import gql from 'graphql-tag';
2+
3+
/** GraphQL Query that fetches the resolver for received URL. */
4+
export default gql`
5+
query route($url: String!) {
6+
route(url: $url) {
7+
relative_url
8+
redirect_code
9+
type
10+
... on CategoryTree {
11+
uid
12+
id
13+
}
14+
}
15+
}
16+
`;

packages/api-client/src/api/urlResolver/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import type { Context } from '../../types/context';
1010
* @param context VSF Context
1111
* @param url the URL to be resolved
1212
* @param [customQuery] (optional) - custom GraphQL query that extends the default one
13+
* @deprecated - use route instead
1314
*/
1415
export default async function urlResolver(
1516
context: Context,

packages/api-client/src/types/API.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ import {
112112
import { SetPaymentMethodOnCartInputs } from '../api/setPaymentMethodOnCart';
113113
import { CustomerProductReviewParams } from '../api/customerProductReview';
114114
import { AddProductsToCartInput } from '../api/addProductsToCart';
115+
import type { RouteQuery } from '../api/route';
115116

116117
export interface Product extends ProductInterface, ConfigurableProduct, Omit<BundleProduct, 'items'>, Omit<GroupedProduct, 'items'>, Omit<DownloadableProduct, 'items'>, Omit<VirtualProduct, 'items'> {
117118
}
@@ -440,6 +441,11 @@ export interface MagentoApiMethods {
440441
customQuery?: CustomQuery
441442
): Promise<ApolloQueryResult<UrlResolverQuery>>;
442443

444+
route<ROUTE_TYPE>(
445+
url: string,
446+
customQuery?: CustomQuery
447+
): Promise<ApolloQueryResult<RouteQuery<ROUTE_TYPE>>>;
448+
443449
wishlist(
444450
searchParams: WishlistQueryVariables,
445451
customQuery?: CustomQuery,

packages/theme/composables/useUrlResolver/UseUrlResolver.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { DeepReadonly, Ref } from '@nuxtjs/composition-api';
2-
import type { EntityUrl } from '~/modules/GraphQL/types';
2+
import { RoutableInterface } from '@vue-storefront/magento-api';
33

44
/**
55
* Errors that occured in the {@link UseUrlResolverErrors|UseUrlResolverErrors()} composable
@@ -12,9 +12,14 @@ export interface UseUrlResolverErrors {
1212
}
1313

1414
/**
15-
* Data and methods returned from the {@link useUrlResolver|useUrlResolver()} composable
15+
* Data and methods returned from the {@link useUrlResolver|useUrlResolver()} composable.
16+
*
17+
* @remarks
18+
*
19+
* `ROUTE_TYPE` is a generic type and can be one of: `CategoryTree`, `CmsPage`, `VirtualProduct`, `SimpleProduct`,
20+
* `DownloadableProduct`, `BundleProduct`, `GroupedProduct` or `ConfigurableProduct`
1621
*/
17-
export interface UseUrlResolverInterface {
22+
export interface UseUrlResolverInterface<ROUTE_TYPE extends RoutableInterface> {
1823
/**
1924
* The current route path
2025
*/
@@ -33,5 +38,5 @@ export interface UseUrlResolverInterface {
3338
/**
3439
* Searches the resolver for current route URL
3540
*/
36-
search(): Promise<EntityUrl | {}>;
41+
search(): Promise<ROUTE_TYPE>;
3742
}

packages/theme/composables/useUrlResolver/index.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@ import {
44
useRoute,
55
useContext,
66
} from '@nuxtjs/composition-api';
7+
import type { RoutableInterface } from '@vue-storefront/magento-api';
78
import { Logger } from '~/helpers/logger';
8-
import type { EntityUrl } from '~/modules/GraphQL/types';
9-
import type { UseUrlResolverErrors, UseUrlResolverInterface } from './UseUrlResolver';
9+
import type { UseUrlResolverErrors, UseUrlResolverInterface } from '~/composables';
1010

1111
/**
1212
* Allows searching the resolver for current
1313
* route path (URL).
1414
*
1515
* See the {@link UseUrlResolverInterface} for a list of methods and values available in this composable.
1616
*/
17-
export function useUrlResolver(): UseUrlResolverInterface {
17+
export function useUrlResolver<ROUTE_TYPE extends RoutableInterface>(): UseUrlResolverInterface<ROUTE_TYPE> {
1818
const route = useRoute();
1919
const { error: nuxtError, app } = useContext();
2020
const context = app.$vsf;
@@ -24,15 +24,16 @@ export function useUrlResolver(): UseUrlResolverInterface {
2424
search: null,
2525
});
2626

27-
const search = async (): Promise<EntityUrl | {}> => {
27+
const search = async (): Promise<ROUTE_TYPE> => {
2828
loading.value = true;
29-
let results: EntityUrl = {};
29+
let results: ROUTE_TYPE | null = null;
3030

3131
try {
3232
const clearUrl = path.replace(/[a-z]+\/[cp|]\//gi, '');
3333
Logger.debug('[Magento] Find information based on URL', { clearUrl });
34-
const { data } = await context.$magento.api.urlResolver(clearUrl);
35-
results = data.urlResolver;
34+
const { data } = await context.$magento.api.route(clearUrl);
35+
// @ts-ignore
36+
results = data.route;
3637

3738
if (!results) nuxtError({ statusCode: 404 });
3839

packages/theme/modules/catalog/pages/category.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ import {
111111
defineComponent, onMounted, ref, ssrRef, useFetch,
112112
} from '@nuxtjs/composition-api';
113113
import { CacheTagPrefix, useCache } from '@vue-storefront/cache';
114+
import type { CategoryTree } from '~/modules/GraphQL/types';
114115
import { facetGetters } from '~/getters';
115116
import {
116117
useFacet,
@@ -125,7 +126,6 @@ import { useAddToCart } from '~/helpers/cart/addToCart';
125126
import { useCategoryContent } from '~/modules/catalog/category/components/cms/useCategoryContent';
126127
import { usePrice } from '~/modules/catalog/pricing/usePrice';
127128
import CategoryNavbar from '~/modules/catalog/category/components/navbar/CategoryNavbar.vue';
128-
import type { EntityUrl } from '~/modules/GraphQL/types';
129129
import { useTraverseCategory } from '~/modules/catalog/category/helpers/useTraverseCategory';
130130
import CategoryBreadcrumbs from '~/modules/catalog/category/components/breadcrumbs/CategoryBreadcrumbs.vue';
131131
@@ -158,7 +158,7 @@ export default defineComponent({
158158
159159
const productContainerElement = ref<HTMLElement | null>(null);
160160
161-
const { search: resolveUrl } = useUrlResolver();
161+
const { search: resolveUrl } = useUrlResolver<CategoryTree>();
162162
const {
163163
toggleFilterSidebar,
164164
changeToCategoryListView,
@@ -190,13 +190,13 @@ export default defineComponent({
190190
191191
const { activeCategory } = useTraverseCategory();
192192
const activeCategoryName = computed(() => activeCategory.value?.name ?? '');
193-
const routeData = ref<EntityUrl>({});
193+
const routeData = ref<CategoryTree | null>(null);
194194
195195
const { fetch } = useFetch(async () => {
196196
routeData.value = await resolveUrl();
197197
198198
const [content] = await Promise.all([
199-
getContentData(routeData.value?.entity_uid),
199+
getContentData(routeData.value?.uid),
200200
searchCategoryProduct(routeData.value?.id),
201201
]);
202202

0 commit comments

Comments
 (0)