mirror of
https://github.com/vercel/commerce.git
synced 2025-05-12 20:57:51 +00:00
revert lib/utils refactoring
This commit is contained in:
parent
f90da11e31
commit
b47f13e2d8
@ -1,7 +1,7 @@
|
|||||||
import Banner from 'components/banner';
|
import Banner from 'components/banner';
|
||||||
import Navbar from 'components/layout/navbar';
|
import Navbar from 'components/layout/navbar';
|
||||||
import { GeistSans } from 'geist/font/sans';
|
import { GeistSans } from 'geist/font/sans';
|
||||||
import { ensureStartsWith } from 'lib/shopify/utils';
|
import { ensureStartsWith } from 'lib/utils';
|
||||||
import { ReactNode, Suspense } from 'react';
|
import { ReactNode, Suspense } from 'react';
|
||||||
import './globals.css';
|
import './globals.css';
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { getCollections, getPages, getProducts } from 'lib/shopify';
|
import { getCollections, getPages, getProducts } from 'lib/shopify';
|
||||||
import { validateEnvironmentVariables } from 'lib/shopify/utils';
|
import { validateEnvironmentVariables } from 'lib/utils';
|
||||||
import { MetadataRoute } from 'next';
|
import { MetadataRoute } from 'next';
|
||||||
|
|
||||||
type Route = {
|
type Route = {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { ChevronRightIcon, EllipsisHorizontalIcon } from '@heroicons/react/16/solid';
|
import { ChevronRightIcon, EllipsisHorizontalIcon } from '@heroicons/react/16/solid';
|
||||||
import { cn } from 'lib/shopify/utils';
|
import { cn } from 'lib/utils';
|
||||||
import Link, { LinkProps } from 'next/link';
|
import Link, { LinkProps } from 'next/link';
|
||||||
import { ComponentPropsWithoutRef, ReactNode, forwardRef } from 'react';
|
import { ComponentPropsWithoutRef, ReactNode, forwardRef } from 'react';
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ import {
|
|||||||
BreadcrumbPage,
|
BreadcrumbPage,
|
||||||
BreadcrumbSeparator
|
BreadcrumbSeparator
|
||||||
} from './breadcrumb-list';
|
} from './breadcrumb-list';
|
||||||
import { findParentCollection } from 'lib/shopify/utils';
|
import { findParentCollection } from 'lib/utils';
|
||||||
|
|
||||||
type BreadcrumbProps = {
|
type BreadcrumbProps = {
|
||||||
type: 'product' | 'collection';
|
type: 'product' | 'collection';
|
||||||
|
@ -2,7 +2,7 @@ import { PlusIcon } from '@heroicons/react/16/solid';
|
|||||||
import Price from 'components/price';
|
import Price from 'components/price';
|
||||||
import { DEFAULT_OPTION } from 'lib/constants';
|
import { DEFAULT_OPTION } from 'lib/constants';
|
||||||
import { CartItem } from 'lib/shopify/types';
|
import { CartItem } from 'lib/shopify/types';
|
||||||
import { createUrl } from 'lib/shopify/utils';
|
import { createUrl } from 'lib/utils';
|
||||||
import Image from 'next/image';
|
import Image from 'next/image';
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
import { DeleteItemButton } from './delete-item-button';
|
import { DeleteItemButton } from './delete-item-button';
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
import { CheckIcon } from '@heroicons/react/24/outline';
|
import { CheckIcon } from '@heroicons/react/24/outline';
|
||||||
import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
|
import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
|
||||||
import { cn } from 'lib/shopify/utils';
|
import { cn } from 'lib/utils';
|
||||||
import { forwardRef } from 'react';
|
import { forwardRef } from 'react';
|
||||||
|
|
||||||
const Checkbox = forwardRef<
|
const Checkbox = forwardRef<
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
import { Button } from '@headlessui/react';
|
import { Button } from '@headlessui/react';
|
||||||
import { MAKE_FILTER_ID, MODEL_FILTER_ID, PART_TYPES, YEAR_FILTER_ID } from 'lib/constants';
|
import { MAKE_FILTER_ID, MODEL_FILTER_ID, PART_TYPES, YEAR_FILTER_ID } from 'lib/constants';
|
||||||
import { Menu, Metaobject } from 'lib/shopify/types';
|
import { Menu, Metaobject } from 'lib/shopify/types';
|
||||||
import { createUrl, findParentCollection } from 'lib/shopify/utils';
|
import { createUrl, findParentCollection } from 'lib/utils';
|
||||||
import get from 'lodash.get';
|
import get from 'lodash.get';
|
||||||
import { useParams, useRouter, useSearchParams } from 'next/navigation';
|
import { useParams, useRouter, useSearchParams } from 'next/navigation';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import { MagnifyingGlassIcon } from '@heroicons/react/24/outline';
|
import { MagnifyingGlassIcon } from '@heroicons/react/24/outline';
|
||||||
import { createUrl } from 'lib/shopify/utils';
|
import { createUrl } from 'lib/utils';
|
||||||
import { useRouter, useSearchParams } from 'next/navigation';
|
import { useRouter, useSearchParams } from 'next/navigation';
|
||||||
|
|
||||||
export default function Search() {
|
export default function Search() {
|
||||||
|
@ -3,7 +3,7 @@ import { Disclosure, DisclosureButton, DisclosurePanel } from '@headlessui/react
|
|||||||
import { ChevronDownIcon } from '@heroicons/react/24/outline';
|
import { ChevronDownIcon } from '@heroicons/react/24/outline';
|
||||||
import clsx from 'clsx';
|
import clsx from 'clsx';
|
||||||
import { Filter, FilterType } from 'lib/shopify/types';
|
import { Filter, FilterType } from 'lib/shopify/types';
|
||||||
import { createUrl } from 'lib/shopify/utils';
|
import { createUrl } from 'lib/utils';
|
||||||
import { usePathname, useRouter, useSearchParams } from 'next/navigation';
|
import { usePathname, useRouter, useSearchParams } from 'next/navigation';
|
||||||
import PriceRange from './price-range';
|
import PriceRange from './price-range';
|
||||||
import SelectedList from './selected-list';
|
import SelectedList from './selected-list';
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
import Price from 'components/price';
|
import Price from 'components/price';
|
||||||
import { useDebounce } from 'hooks';
|
import { useDebounce } from 'hooks';
|
||||||
import { Filter } from 'lib/shopify/types';
|
import { Filter } from 'lib/shopify/types';
|
||||||
import { createUrl } from 'lib/shopify/utils';
|
import { createUrl } from 'lib/utils';
|
||||||
import get from 'lodash.get';
|
import get from 'lodash.get';
|
||||||
import { usePathname, useRouter, useSearchParams } from 'next/navigation';
|
import { usePathname, useRouter, useSearchParams } from 'next/navigation';
|
||||||
import { useCallback, useEffect, useRef, useState } from 'react';
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
import { XMarkIcon } from '@heroicons/react/16/solid';
|
import { XMarkIcon } from '@heroicons/react/16/solid';
|
||||||
import { Filter } from 'lib/shopify/types';
|
import { Filter } from 'lib/shopify/types';
|
||||||
import { createUrl } from 'lib/shopify/utils';
|
import { createUrl } from 'lib/utils';
|
||||||
import { usePathname, useRouter, useSearchParams } from 'next/navigation';
|
import { usePathname, useRouter, useSearchParams } from 'next/navigation';
|
||||||
|
|
||||||
const SelectedList = ({ filters }: { filters: Filter[] }) => {
|
const SelectedList = ({ filters }: { filters: Filter[] }) => {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import clsx from 'clsx';
|
import clsx from 'clsx';
|
||||||
import { SortFilterItem } from 'lib/constants';
|
import { SortFilterItem } from 'lib/constants';
|
||||||
import { createUrl } from 'lib/shopify/utils';
|
import { createUrl } from 'lib/utils';
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
import { usePathname, useSearchParams } from 'next/navigation';
|
import { usePathname, useSearchParams } from 'next/navigation';
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
import { ArrowRightIcon } from '@heroicons/react/16/solid';
|
import { ArrowRightIcon } from '@heroicons/react/16/solid';
|
||||||
import { MAKE_FILTER_ID } from 'lib/constants';
|
import { MAKE_FILTER_ID } from 'lib/constants';
|
||||||
import { Metaobject } from 'lib/shopify/types';
|
import { Metaobject } from 'lib/shopify/types';
|
||||||
import { createUrl } from 'lib/shopify/utils';
|
import { createUrl } from 'lib/utils';
|
||||||
import { useRouter, useSearchParams } from 'next/navigation';
|
import { useRouter, useSearchParams } from 'next/navigation';
|
||||||
|
|
||||||
const ButtonGroup = ({ manufacturer }: { manufacturer: Metaobject }) => {
|
const ButtonGroup = ({ manufacturer }: { manufacturer: Metaobject }) => {
|
||||||
|
@ -6,7 +6,7 @@ import Price from 'components/price';
|
|||||||
import SideDialog from 'components/side-dialog';
|
import SideDialog from 'components/side-dialog';
|
||||||
import { CORE_VARIANT_ID_KEY, CORE_WAIVER } from 'lib/constants';
|
import { CORE_VARIANT_ID_KEY, CORE_WAIVER } from 'lib/constants';
|
||||||
import { CoreChargeOption, ProductVariant } from 'lib/shopify/types';
|
import { CoreChargeOption, ProductVariant } from 'lib/shopify/types';
|
||||||
import { cn, createUrl } from 'lib/shopify/utils';
|
import { cn, createUrl } from 'lib/utils';
|
||||||
import { usePathname, useRouter, useSearchParams } from 'next/navigation';
|
import { usePathname, useRouter, useSearchParams } from 'next/navigation';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
import { ArrowLeftIcon, ArrowRightIcon } from '@heroicons/react/24/outline';
|
import { ArrowLeftIcon, ArrowRightIcon } from '@heroicons/react/24/outline';
|
||||||
import { TileImage } from 'components/grid/tile';
|
import { TileImage } from 'components/grid/tile';
|
||||||
import { createUrl } from 'lib/shopify/utils';
|
import { createUrl } from 'lib/utils';
|
||||||
import Image from 'next/image';
|
import Image from 'next/image';
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
import { usePathname, useSearchParams } from 'next/navigation';
|
import { usePathname, useSearchParams } from 'next/navigation';
|
||||||
|
@ -6,7 +6,7 @@ import clsx from 'clsx';
|
|||||||
import Price from 'components/price';
|
import Price from 'components/price';
|
||||||
import { CORE_VARIANT_ID_KEY, CORE_WAIVER } from 'lib/constants';
|
import { CORE_VARIANT_ID_KEY, CORE_WAIVER } from 'lib/constants';
|
||||||
import { CoreChargeOption, Money, ProductOption, ProductVariant } from 'lib/shopify/types';
|
import { CoreChargeOption, Money, ProductOption, ProductVariant } from 'lib/shopify/types';
|
||||||
import { createUrl } from 'lib/shopify/utils';
|
import { createUrl } from 'lib/utils';
|
||||||
import { usePathname, useRouter, useSearchParams } from 'next/navigation';
|
import { usePathname, useRouter, useSearchParams } from 'next/navigation';
|
||||||
import { Fragment, useEffect, useState } from 'react';
|
import { Fragment, useEffect, useState } from 'react';
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import Price from 'components/price';
|
import Price from 'components/price';
|
||||||
import { cn } from 'lib/shopify/utils';
|
import { cn } from 'lib/utils';
|
||||||
import { ReactNode, useState } from 'react';
|
import { ReactNode, useState } from 'react';
|
||||||
|
|
||||||
const options = ['Included', 'Premium Labor', '+1 Year'] as const;
|
const options = ['Included', 'Premium Labor', '+1 Year'] as const;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import { cn } from 'lib/shopify/utils';
|
import { cn } from 'lib/utils';
|
||||||
import { ITooltip, Tooltip as ReactTooltip } from 'react-tooltip';
|
import { ITooltip, Tooltip as ReactTooltip } from 'react-tooltip';
|
||||||
|
|
||||||
const Tooltip = ({ id, children, className }: ITooltip) => {
|
const Tooltip = ({ id, children, className }: ITooltip) => {
|
||||||
|
@ -12,7 +12,7 @@ import {
|
|||||||
YEAR_FILTER_ID
|
YEAR_FILTER_ID
|
||||||
} from 'lib/constants';
|
} from 'lib/constants';
|
||||||
import { isShopifyError } from 'lib/type-guards';
|
import { isShopifyError } from 'lib/type-guards';
|
||||||
import { ensureStartsWith, normalizeUrl, parseJSON, parseMetaFieldValue } from 'lib/shopify/utils';
|
import { ensureStartsWith, normalizeUrl, parseJSON, parseMetaFieldValue } from 'lib/utils';
|
||||||
import { revalidatePath, revalidateTag } from 'next/cache';
|
import { revalidatePath, revalidateTag } from 'next/cache';
|
||||||
import { headers } from 'next/headers';
|
import { headers } from 'next/headers';
|
||||||
import { NextRequest, NextResponse } from 'next/server';
|
import { NextRequest, NextResponse } from 'next/server';
|
||||||
|
89
lib/utils.ts
Normal file
89
lib/utils.ts
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
import clsx, { ClassValue } from 'clsx';
|
||||||
|
import { ReadonlyURLSearchParams } from 'next/navigation';
|
||||||
|
import { twMerge } from 'tailwind-merge';
|
||||||
|
import { Menu } from './types';
|
||||||
|
|
||||||
|
export const createUrl = (pathname: string, params: URLSearchParams | ReadonlyURLSearchParams) => {
|
||||||
|
const paramsString = params.toString();
|
||||||
|
const queryString = `${paramsString.length ? '?' : ''}${paramsString}`;
|
||||||
|
|
||||||
|
return `${pathname}${queryString}`;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const ensureStartsWith = (stringToCheck: string, startsWith: string) =>
|
||||||
|
stringToCheck.startsWith(startsWith) ? stringToCheck : `${startsWith}${stringToCheck}`;
|
||||||
|
|
||||||
|
export const validateEnvironmentVariables = () => {
|
||||||
|
const requiredEnvironmentVariables = [
|
||||||
|
'SHOPIFY_STORE_DOMAIN',
|
||||||
|
'SHOPIFY_STOREFRONT_ACCESS_TOKEN',
|
||||||
|
'SHOPIFY_CUSTOMER_ACCOUNT_API_CLIENT_ID',
|
||||||
|
'SHOPIFY_CUSTOMER_ACCOUNT_API_URL',
|
||||||
|
'SHOPIFY_CUSTOMER_API_VERSION',
|
||||||
|
'SHOPIFY_ORIGIN_URL'
|
||||||
|
];
|
||||||
|
const missingEnvironmentVariables = [] as string[];
|
||||||
|
|
||||||
|
requiredEnvironmentVariables.forEach((envVar) => {
|
||||||
|
if (!process.env[envVar]) {
|
||||||
|
missingEnvironmentVariables.push(envVar);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (missingEnvironmentVariables.length) {
|
||||||
|
throw new Error(
|
||||||
|
`The following environment variables are missing. Your site will not work without them. Read more: https://vercel.com/docs/integrations/shopify#configure-environment-variables\n\n${missingEnvironmentVariables.join(
|
||||||
|
'\n'
|
||||||
|
)}\n`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
process.env.SHOPIFY_STORE_DOMAIN?.includes('[') ||
|
||||||
|
process.env.SHOPIFY_STORE_DOMAIN?.includes(']')
|
||||||
|
) {
|
||||||
|
throw new Error(
|
||||||
|
'Your `SHOPIFY_STORE_DOMAIN` environment variable includes brackets (ie. `[` and / or `]`). Your site will not work with them there. Please remove them.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export function cn(...inputs: ClassValue[]) {
|
||||||
|
return twMerge(clsx(inputs));
|
||||||
|
}
|
||||||
|
|
||||||
|
export function normalizeUrl(domain: string, url: string) {
|
||||||
|
return url.replace(domain, '').replace('/collections', '/search').replace('/pages', '');
|
||||||
|
}
|
||||||
|
|
||||||
|
export const parseMetaFieldValue = <T>(field: { value: string } | null): T | null => {
|
||||||
|
try {
|
||||||
|
return field?.value ? JSON.parse(field.value) : null;
|
||||||
|
} catch (error) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const findParentCollection = (menu: Menu[], collection: string): Menu | null => {
|
||||||
|
let parentCollection: Menu | null = null;
|
||||||
|
for (const item of menu) {
|
||||||
|
if (item.items.length) {
|
||||||
|
const hasParent = item.items.some((subItem) => subItem.path.includes(collection));
|
||||||
|
if (hasParent) {
|
||||||
|
return item;
|
||||||
|
} else {
|
||||||
|
parentCollection = findParentCollection(item.items, collection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return parentCollection;
|
||||||
|
};
|
||||||
|
|
||||||
|
export function parseJSON(json: any) {
|
||||||
|
if (String(json).includes('__proto__')) return JSON.parse(json, noproto);
|
||||||
|
return JSON.parse(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
function noproto(k: string, v: string) {
|
||||||
|
if (k !== '__proto__') return v;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user