4
0
forked from crowetic/commerce

Simplify configs

This commit is contained in:
Luis Alvarez 2020-09-29 18:07:21 -05:00
parent 9c3cb31b49
commit 40cdb2f6d7
4 changed files with 21 additions and 73 deletions

View File

@ -2,7 +2,8 @@ import {
CartProvider as CommerceCartProvider,
useCart as useCommerceCart,
} from '../commerce/cart';
import { Cart } from './index';
export type Cart = any;
export function CartProvider({ children }) {
return <CommerceCartProvider>{children}</CommerceCartProvider>;

View File

@ -1,12 +1,9 @@
import {
CommerceProvider,
CommerceProvider as CoreCommerceProvider,
Connector,
HookResolver,
useCommerce as useComm,
useCommerce as useCoreCommerce,
} from '../commerce';
export type Cart = any;
async function getText(res: Response) {
try {
return (await res.text()) || res.statusText;
@ -23,11 +20,7 @@ async function getError(res: Response) {
return { message: await getText(res) };
}
async function fetcher(
url: string,
query: string,
resolver: HookResolver<Cart>
) {
async function fetcher(url: string, query: string) {
const res = await fetch(url);
if (res.ok) {
@ -37,42 +30,18 @@ async function fetcher(
throw await getError(res);
}
export const bigcommerce: Connector<Cart> = {
hooks: {
useCart: {
query: '',
resolver() {
return;
},
},
useAddItem: {
query: '',
resolver() {
return;
},
},
useUpdateItem: {
query: '',
resolver() {
return;
},
},
useRemoveItem: {
query: '',
resolver() {
return;
},
},
},
export const bigcommerce: Connector = {
locale: 'en-us',
fetcher,
};
// TODO: The connector should be extendable when a developer is using it
export function BigcommerceProvider({ children }) {
export function CommerceProvider({ children }) {
return (
<CommerceProvider connector={bigcommerce}>{children}</CommerceProvider>
<CoreCommerceProvider connector={bigcommerce}>
{children}
</CoreCommerceProvider>
);
}
export const useCommerce = () => useComm<Cart>();
export const useCommerce = () => useCoreCommerce();

View File

@ -1,6 +1,8 @@
import { createContext, useContext } from 'react';
import useSWR, { responseInterface } from 'swr';
import { Cart, useCommerce } from '.';
import { useCommerce } from '.';
export type Cart = any;
export type CartResponse<C extends Cart> = responseInterface<C, Error> & {
isEmpty: boolean;

View File

@ -1,44 +1,20 @@
import { createContext, ReactNode, useContext } from 'react';
const Commerce = createContext<Connector<any>>(null);
const Commerce = createContext<Connector>(null);
export type Cart = any;
export type CommerceProps<C extends Cart> = {
export type CommerceProps = {
children?: ReactNode;
connector: Connector<C>;
connector: Connector;
};
export type Connector<C extends Cart> = {
hooks: {
useCart: Hook<C>;
useAddItem: Hook<C>;
useUpdateItem: Hook<C>;
useRemoveItem: Hook<C>;
};
export type Connector = {
fetcher: Fetcher<any>;
locale: string;
};
export type Hook<T extends any> = {
query?: string;
url?: string;
resolver: HookResolver<T>;
};
export type HookResolver<T> = (
fetcher: Fetcher<T>,
context: ResolverContext
) => T | Promise<T>;
export type Fetcher<T> = (...args: any) => T | Promise<T>;
export type ResolverContext = {
query?: string;
locale: string;
};
export function CommerceProvider({ children, connector }: CommerceProps<Cart>) {
export function CommerceProvider({ children, connector }: CommerceProps) {
if (!connector) {
throw new Error(
'CommerceProvider requires a valid headless commerce connector'
@ -48,6 +24,6 @@ export function CommerceProvider({ children, connector }: CommerceProps<Cart>) {
return <Commerce.Provider value={connector}>{children}</Commerce.Provider>;
}
export function useCommerce<C extends Cart>() {
return useContext(Commerce) as Connector<C>;
export function useCommerce<T extends Connector>() {
return useContext(Commerce) as T;
}