diff --git a/src/api/getRecipe.ts b/src/api/getRecipe.ts index dd35498..bee63d6 100644 --- a/src/api/getRecipe.ts +++ b/src/api/getRecipe.ts @@ -1,33 +1,62 @@ import { AuthContextType } from '../auth' import { ApiError } from './ApiError' import ExpiredTokenError from './ExpiredTokenError' -import FullRecipeView, { RawFullRecipeView, toFullRecipeView } from './types/FullRecipeView' -import GetRecipeView, { RawGetRecipeView, toGetRecipeView } from './types/GetRecipeView' +import GetRecipeView, { + GetRecipeViewWithRawText, + RawGetRecipeView, + RawGetRecipeViewWithRawText, + toGetRecipeView, + toGetRecipeViewWithRawText +} from './types/GetRecipeView' -export interface GetRecipeDeps { +export interface GetRecipeCommonDeps { authContext: AuthContextType username: string slug: string abortSignal: AbortSignal } -const getRecipe = async ({ authContext, username, slug, abortSignal }: GetRecipeDeps): Promise => { +export interface GetRecipeDeps extends GetRecipeCommonDeps { + includeRawText?: false +} + +export interface GetRecipeDepsIncludeRawText extends GetRecipeCommonDeps { + includeRawText: true +} + +export interface GetRecipe { + (deps: GetRecipeDeps): Promise + (deps: GetRecipeDepsIncludeRawText): Promise +} + +const getRecipe = (async ({ + authContext, + username, + slug, + abortSignal, + includeRawText +}: GetRecipeDeps | GetRecipeDepsIncludeRawText): Promise => { const headers = new Headers() if (authContext.token !== null) { headers.set('Authorization', `Bearer ${authContext.token}`) } - const response = await fetch(import.meta.env.VITE_MME_API_URL + `/recipes/${username}/${slug}`, { + const query = includeRawText ? '?includeRawText=true' : '' + const response = await fetch(import.meta.env.VITE_MME_API_URL + `/recipes/${username}/${slug}${query}`, { signal: abortSignal, headers, mode: 'cors' }) if (response.ok) { - return toGetRecipeView((await response.json()) as RawGetRecipeView) + if (includeRawText) { + return toGetRecipeViewWithRawText((await response.json()) as RawGetRecipeViewWithRawText) + } else { + return toGetRecipeView((await response.json()) as RawGetRecipeView) + } } else if (response.status === 401) { throw new ExpiredTokenError() } else { throw new ApiError(response.status, response.statusText) } -} +}) as GetRecipe export default getRecipe diff --git a/src/api/types/FullRecipeView.ts b/src/api/types/FullRecipeView.ts index f4a519f..a252bd4 100644 --- a/src/api/types/FullRecipeView.ts +++ b/src/api/types/FullRecipeView.ts @@ -18,6 +18,10 @@ export interface RawFullRecipeView { isPublic: boolean } +export interface RawFullRecipeViewWithRawText extends RawFullRecipeView { + rawText: string +} + interface FullRecipeView { id: number created: Date @@ -35,6 +39,10 @@ interface FullRecipeView { isPublic: boolean } +export interface FullRecipeViewWithRawText extends FullRecipeView { + rawText: string +} + export const toFullRecipeView = ({ id, created: rawCreated, @@ -67,4 +75,9 @@ export const toFullRecipeView = ({ isPublic }) +export const toFullRecipeViewWithRawText = (raw: RawFullRecipeViewWithRawText): FullRecipeViewWithRawText => ({ + rawText: raw.rawText, + ...toFullRecipeView(raw) +}) + export default FullRecipeView diff --git a/src/api/types/GetRecipeView.ts b/src/api/types/GetRecipeView.ts index a54609b..cec3121 100644 --- a/src/api/types/GetRecipeView.ts +++ b/src/api/types/GetRecipeView.ts @@ -1,4 +1,10 @@ -import FullRecipeView, { RawFullRecipeView, toFullRecipeView } from './FullRecipeView' +import FullRecipeView, { + FullRecipeViewWithRawText, + RawFullRecipeView, + RawFullRecipeViewWithRawText, + toFullRecipeView, + toFullRecipeViewWithRawText +} from './FullRecipeView' export interface RawGetRecipeView { recipe: RawFullRecipeView @@ -6,16 +12,34 @@ export interface RawGetRecipeView { isOwner: boolean | null } +export interface RawGetRecipeViewWithRawText extends RawGetRecipeView { + recipe: RawFullRecipeViewWithRawText +} + interface GetRecipeView { recipe: FullRecipeView isStarred: boolean | null isOwner: boolean | null } +export interface GetRecipeViewWithRawText extends GetRecipeView { + recipe: FullRecipeViewWithRawText +} + export const toGetRecipeView = ({ recipe, isStarred, isOwner }: RawGetRecipeView): GetRecipeView => ({ recipe: toFullRecipeView(recipe), isStarred, isOwner }) +export const toGetRecipeViewWithRawText = ({ + recipe, + isStarred, + isOwner +}: RawGetRecipeViewWithRawText): GetRecipeViewWithRawText => ({ + recipe: toFullRecipeViewWithRawText(recipe), + isStarred, + isOwner +}) + export default GetRecipeView diff --git a/src/pages/edit-recipe/EditRecipe.tsx b/src/pages/edit-recipe/EditRecipe.tsx index c42aeac..5e776b3 100644 --- a/src/pages/edit-recipe/EditRecipe.tsx +++ b/src/pages/edit-recipe/EditRecipe.tsx @@ -101,7 +101,8 @@ const EditRecipe = ({ username, slug }: EditRecipeProps) => { authContext: auth, username, slug, - abortSignal: signal + abortSignal: signal, + includeRawText: true }) }, queryClient @@ -127,7 +128,7 @@ const EditRecipe = ({ username, slug }: EditRecipeProps) => { setPreparationTime(recipe.preparationTime) setCookingTime(recipe.cookingTime) setTotalTime(recipe.totalTime) - setRecipeText(recipe.text) + setRecipeText(recipe.rawText) } } }, [recipeQuery.isSuccess, recipeQuery.data])