diff --git a/app/[locale]/(protected)/notifications/components/notifications-table.tsx b/app/[locale]/(protected)/notifications/components/notifications-table.tsx index f079f739..05fda5df 100644 --- a/app/[locale]/(protected)/notifications/components/notifications-table.tsx +++ b/app/[locale]/(protected)/notifications/components/notifications-table.tsx @@ -83,7 +83,7 @@ const NotificationsList: React.FC = () => {
{notifications.length > 0 ? ( - notifications.map((notification) => ( + notifications?.map((notification) => (
{ loading(); const response = await getInfoProfile(); - // console.log(response?.data.data); + // console.log(response?.data?.data); setProfile(response?.data?.data); close(); } diff --git a/app/[locale]/(public)/content-management/galery/page.tsx b/app/[locale]/(public)/content-management/galery/page.tsx index cfecc7fa..797500b8 100644 --- a/app/[locale]/(public)/content-management/galery/page.tsx +++ b/app/[locale]/(public)/content-management/galery/page.tsx @@ -67,7 +67,7 @@ const Galery = (props: any) => { loading(); const response = await getInfoProfile(); - // console.log(response?.data.data); + // console.log(response?.data?.data); setProfile(response?.data?.data); close(); } diff --git a/app/[locale]/(public)/content-management/rewrite/create/[id]/page.tsx b/app/[locale]/(public)/content-management/rewrite/create/[id]/page.tsx index fd8fae94..55204a88 100644 --- a/app/[locale]/(public)/content-management/rewrite/create/[id]/page.tsx +++ b/app/[locale]/(public)/content-management/rewrite/create/[id]/page.tsx @@ -163,30 +163,30 @@ const page = (props: { states?: string }) => { setValue("title", response?.data?.data?.title); setValue("mainKeyword", response?.data?.data?.title); setValue("seo", response?.data?.data?.description); - setContent(response?.data.data); - setIsFromSPIT(response?.data.data?.isFromSPIT); + setContent(response?.data?.data); + setIsFromSPIT(response?.data?.data?.isFromSPIT); setListSuggestion(responseGet?.data?.data); console.log("data list file", response?.data?.data); - // const mainUrl = response?.data.data?.files[0]?.url; - // const ticket = response?.data.data?.files[0]?.ticket; + // const mainUrl = response?.data?.data?.files[0]?.url; + // const ticket = response?.data?.data?.files[0]?.ticket; // const urlBlob = await getBlobContent(mainUrl, ticket); setMain({ - id: response?.data.data?.files[0]?.id, - type: response?.data.data?.fileType.name, - url: Number(response?.data.data?.fileType?.id) == 4 ? response?.data.data?.files[0]?.secondaryUrl : response?.data.data?.files[0]?.url, - thumbnailFileUrl: response?.data.data?.files[0]?.thumbnailFileUrl, - names: response?.data.data?.files[0]?.fileName, - format: response?.data.data?.files[0]?.format, - widthPixel: response?.data.data?.files[0]?.widthPixel, - heightPixel: response?.data.data?.files[0]?.heightPixel, - size: response?.data.data?.files[0]?.size, - caption: response?.data.data?.files[0]?.caption, + id: response?.data?.data?.files[0]?.id, + type: response?.data?.data?.fileType.name, + url: Number(response?.data?.data?.fileType?.id) == 4 ? response?.data?.data?.files[0]?.secondaryUrl : response?.data?.data?.files[0]?.url, + thumbnailFileUrl: response?.data?.data?.files[0]?.thumbnailFileUrl, + names: response?.data?.data?.files[0]?.fileName, + format: response?.data?.data?.files[0]?.format, + widthPixel: response?.data?.data?.files[0]?.widthPixel, + heightPixel: response?.data?.data?.files[0]?.heightPixel, + size: response?.data?.data?.files[0]?.size, + caption: response?.data?.data?.files[0]?.caption, }); // Send Meta Data const metaData = { - title: response?.data.data?.title, - image: response?.data.data?.thumbnailLink, + title: response?.data?.data?.title, + image: response?.data?.data?.thumbnailLink, }; setCookiesEncrypt("meta_data", metaData); diff --git a/app/[locale]/(public)/content-management/rewrite/detail/[id]/page.tsx b/app/[locale]/(public)/content-management/rewrite/detail/[id]/page.tsx index 169843f9..b7fbe503 100644 --- a/app/[locale]/(public)/content-management/rewrite/detail/[id]/page.tsx +++ b/app/[locale]/(public)/content-management/rewrite/detail/[id]/page.tsx @@ -62,7 +62,7 @@ const page = (props: any) => { loading(); const response = await getInfoProfile(); - // console.log(response?.data.data); + // console.log(response?.data?.data); setProfile(response?.data?.data); close(); } diff --git a/app/[locale]/(public)/content-management/rewrite/page.tsx b/app/[locale]/(public)/content-management/rewrite/page.tsx index ae8e1f99..ec35c993 100644 --- a/app/[locale]/(public)/content-management/rewrite/page.tsx +++ b/app/[locale]/(public)/content-management/rewrite/page.tsx @@ -43,7 +43,7 @@ const page = (props: any) => { async function initState() { loading(); const response = await getInfoProfile(); - console.log(response?.data.data); + console.log(response?.data?.data); setProfile(response?.data?.data); close(); } diff --git a/components/form/blog/blog-form.tsx b/components/form/blog/blog-form.tsx index cfddf815..513e7401 100644 --- a/components/form/blog/blog-form.tsx +++ b/components/form/blog/blog-form.tsx @@ -147,7 +147,7 @@ export default function FormBlog() { // // setValue("categoryId", findCategory.id); // setSelectedCategory(findCategory.id); // Set the selected category // const response = await getTagsBySubCategoryId(findCategory.id); - // setTags(response?.data.data); + // setTags(response?.data?.data); // } // } // } catch (error) { @@ -176,7 +176,7 @@ export default function FormBlog() { return; } - const blogId = response?.data.data.id; + const blogId = response?.data?.data.id; if (blogId && thumbnail) { const formMedia = new FormData(); formMedia.append("file", thumbnail); diff --git a/components/form/content/audio-detail-form.tsx b/components/form/content/audio-detail-form.tsx index 952611d6..4eabe091 100644 --- a/components/form/content/audio-detail-form.tsx +++ b/components/form/content/audio-detail-form.tsx @@ -204,7 +204,7 @@ export default function FormAudioDetail() { // setValue("categoryId", findCategory.id); setSelectedCategory(findCategory.id); // Set the selected category const response = await getTagsBySubCategoryId(findCategory.id); - setTags(response?.data.data); + setTags(response?.data?.data); } } } catch (error) { diff --git a/components/form/content/audio-form.tsx b/components/form/content/audio-form.tsx index 4e1983d9..94d2e478 100644 --- a/components/form/content/audio-form.tsx +++ b/components/form/content/audio-form.tsx @@ -52,6 +52,7 @@ import Image from "next/image"; import { error, loading } from "@/config/swal"; import { Item } from "@radix-ui/react-dropdown-menu"; import dynamic from "next/dynamic"; +import { getCsrfToken } from "@/service/auth"; interface FileWithPreview extends File { preview: string; @@ -395,7 +396,7 @@ export default function FormAudio() { // setValue("categoryId", findCategory.id); setSelectedCategory(findCategory.id); // Set the selected category const response = await getTagsBySubCategoryId(findCategory.id); - setTags(response?.data.data); + setTags(response?.data?.data); } } } catch (error) { @@ -467,7 +468,7 @@ export default function FormAudio() { MySwal.fire("Error", response?.message, "error"); return; } - Cookies.set("idCreate", response?.data.data, { expires: 1 }); + Cookies.set("idCreate", response?.data?.data, { expires: 1 }); id = response?.data?.data; // Upload Thumbnail @@ -528,8 +529,16 @@ export default function FormAudio() { // const placements = getPlacement(file.placements); // console.log("Placementttt: : ", placements); + const resCsrf = await getCsrfToken(); + const csrfToken = resCsrf?.data?.token; + console.log("CSRF TOKEN : ", csrfToken); + const headers = { + "X-XSRF-TOKEN": csrfToken + }; + const upload = new Upload(file, { endpoint: `${process.env.NEXT_PUBLIC_API}/media/file/upload`, + headers: headers, retryDelays: [0, 3000, 6000, 12_000, 24_000], chunkSize: 20_000, metadata: { @@ -539,6 +548,10 @@ export default function FormAudio() { duration, isWatermark: "false", // hardcode }, + onBeforeRequest: function (req) { + var xhr = req.getUnderlyingObject() + xhr.withCredentials = true + }, onError: async (e: any) => { console.log("Error upload :", e); error(e); diff --git a/components/form/content/audio-update-form.tsx b/components/form/content/audio-update-form.tsx index af65d77a..0d441faa 100644 --- a/components/form/content/audio-update-form.tsx +++ b/components/form/content/audio-update-form.tsx @@ -163,7 +163,7 @@ export default function FormAudioUpdate() { // setValue("categoryId", findCategory.id); setSelectedCategory(findCategory.id); // Set the selected category const response = await getTagsBySubCategoryId(findCategory.id); - setTags(response?.data.data); + setTags(response?.data?.data); } } } catch (error) { diff --git a/components/form/content/image-ai-form.tsx b/components/form/content/image-ai-form.tsx index 2c206dc2..b8561915 100644 --- a/components/form/content/image-ai-form.tsx +++ b/components/form/content/image-ai-form.tsx @@ -312,7 +312,7 @@ export default function FormImageAI() { if (findCategory) { setSelectedCategory(findCategory.id); const response = await getTagsBySubCategoryId(findCategory.id); - setTags(response?.data.data); + setTags(response?.data?.data); } } } catch (error) { diff --git a/components/form/content/image-detail-form.tsx b/components/form/content/image-detail-form.tsx index b88f67dc..86bd37de 100644 --- a/components/form/content/image-detail-form.tsx +++ b/components/form/content/image-detail-form.tsx @@ -192,7 +192,7 @@ export default function FormImageDetail() { // setValue("categoryId", findCategory.id); setSelectedCategory(findCategory.id); // Set the selected category const response = await getTagsBySubCategoryId(findCategory.id); - setTags(response?.data.data); + setTags(response?.data?.data); } } } catch (error) { diff --git a/components/form/content/image-form.tsx b/components/form/content/image-form.tsx index a9736127..a429a018 100644 --- a/components/form/content/image-form.tsx +++ b/components/form/content/image-form.tsx @@ -54,6 +54,7 @@ import { Item } from "@radix-ui/react-dropdown-menu"; import { data } from "jquery"; import { options } from "@fullcalendar/core/preact.js"; import dynamic from "next/dynamic"; +import { getCsrfToken } from "@/service/auth"; interface FileWithPreview extends File { preview: string; @@ -401,7 +402,7 @@ export default function FormImage() { // setValue("categoryId", findCategory.id); setSelectedCategory(findCategory.id); // Set the selected category const response = await getTagsBySubCategoryId(findCategory.id); - setTags(response?.data.data); + setTags(response?.data?.data); } } } catch (error) { @@ -468,11 +469,11 @@ export default function FormImage() { const response = await createMedia(requestData); console.log("Form Data Submitted:", requestData); - if (response?.error) { - MySwal.fire("Error", response?.message, "error"); - return; - } - Cookies.set("idCreate", response?.data.data, { expires: 1 }); + // if (response?.error) { + // MySwal.fire("Error", response?.message, "error"); + // return; + // } + Cookies.set("idCreate", response?.data?.data, { expires: 1 }); id = response?.data?.data; // Upload Thumbnail @@ -537,9 +538,17 @@ export default function FormImage() { // const placements = getPlacement(file.placements); // console.log("Placementttt: : ", placements); + + const resCsrf = await getCsrfToken(); + const csrfToken = resCsrf?.data?.token; + console.log("CSRF TOKEN : ", csrfToken); + const headers = { + "X-XSRF-TOKEN": csrfToken + }; const upload = new Upload(file, { endpoint: `${process.env.NEXT_PUBLIC_API}/media/file/upload`, + headers: headers, retryDelays: [0, 3000, 6000, 12_000, 24_000], chunkSize: 20_000, metadata: { @@ -549,6 +558,10 @@ export default function FormImage() { duration, isWatermark: "true", // hardcode }, + onBeforeRequest: function (req) { + var xhr = req.getUnderlyingObject() + xhr.withCredentials = true + }, onError: async (e: any) => { console.log("Error upload :", e); error(e); diff --git a/components/form/content/image-update-form.tsx b/components/form/content/image-update-form.tsx index 98b75969..ae938971 100644 --- a/components/form/content/image-update-form.tsx +++ b/components/form/content/image-update-form.tsx @@ -168,7 +168,7 @@ export default function FormImageUpdate() { // setValue("categoryId", findCategory.id); setSelectedCategory(findCategory.id); // Set the selected category const response = await getTagsBySubCategoryId(findCategory.id); - setTags(response?.data.data); + setTags(response?.data?.data); } } } catch (error) { diff --git a/components/form/content/spit-convert-form.tsx b/components/form/content/spit-convert-form.tsx index 455d7ba1..33959df0 100644 --- a/components/form/content/spit-convert-form.tsx +++ b/components/form/content/spit-convert-form.tsx @@ -204,7 +204,7 @@ export default function FormConvertSPIT() { // setValue("categoryId", findCategory.id); setSelectedCategoryId(findCategory.id); // Set the selected category const response = await getTagsBySubCategoryId(findCategory.id); - setTags(response?.data.data); + setTags(response?.data?.data); } } } catch (error) { diff --git a/components/form/content/teks-detail-form.tsx b/components/form/content/teks-detail-form.tsx index 9e26a5e3..404f143d 100644 --- a/components/form/content/teks-detail-form.tsx +++ b/components/form/content/teks-detail-form.tsx @@ -202,7 +202,7 @@ export default function FormTeksDetail() { // setValue("categoryId", findCategory.id); setSelectedCategory(findCategory.id); // Set the selected category const response = await getTagsBySubCategoryId(findCategory.id); - setTags(response?.data.data); + setTags(response?.data?.data); } } } catch (error) { diff --git a/components/form/content/teks-form.tsx b/components/form/content/teks-form.tsx index 67ea85e0..fa587340 100644 --- a/components/form/content/teks-form.tsx +++ b/components/form/content/teks-form.tsx @@ -52,6 +52,7 @@ import Image from "next/image"; import { error, loading } from "@/config/swal"; import { Item } from "@radix-ui/react-dropdown-menu"; import dynamic from "next/dynamic"; +import { getCsrfToken } from "@/service/auth"; interface FileWithPreview extends File { preview: string; @@ -395,7 +396,7 @@ export default function FormTeks() { // setValue("categoryId", findCategory.id); setSelectedCategory(findCategory.id); // Set the selected category const response = await getTagsBySubCategoryId(findCategory.id); - setTags(response?.data.data); + setTags(response?.data?.data); } } } catch (error) { @@ -466,7 +467,7 @@ export default function FormTeks() { MySwal.fire("Error", response?.message, "error"); return; } - Cookies.set("idCreate", response?.data.data, { expires: 1 }); + Cookies.set("idCreate", response?.data?.data, { expires: 1 }); id = response?.data?.data; // Upload Thumbnail @@ -527,8 +528,16 @@ export default function FormTeks() { // const placements = getPlacement(file.placements); // console.log("Placementttt: : ", placements); + const resCsrf = await getCsrfToken(); + const csrfToken = resCsrf?.data?.token; + console.log("CSRF TOKEN : ", csrfToken); + const headers = { + "X-XSRF-TOKEN": csrfToken + }; + const upload = new Upload(file, { endpoint: `${process.env.NEXT_PUBLIC_API}/media/file/upload`, + headers: headers, retryDelays: [0, 3000, 6000, 12_000, 24_000], chunkSize: 20_000, metadata: { @@ -538,6 +547,10 @@ export default function FormTeks() { duration, isWatermark: "false", // hardcode }, + onBeforeRequest: function (req) { + var xhr = req.getUnderlyingObject() + xhr.withCredentials = true + }, onError: async (e: any) => { console.log("Error upload :", e); error(e); diff --git a/components/form/content/teks-update-form.tsx b/components/form/content/teks-update-form.tsx index 62940383..cfbffae7 100644 --- a/components/form/content/teks-update-form.tsx +++ b/components/form/content/teks-update-form.tsx @@ -159,7 +159,7 @@ export default function FormTeksUpdate() { // setValue("categoryId", findCategory.id); setSelectedCategory(findCategory.id); // Set the selected category const response = await getTagsBySubCategoryId(findCategory.id); - setTags(response?.data.data); + setTags(response?.data?.data); } } } catch (error) { diff --git a/components/form/content/video-detail-form.tsx b/components/form/content/video-detail-form.tsx index c6331988..39cb588c 100644 --- a/components/form/content/video-detail-form.tsx +++ b/components/form/content/video-detail-form.tsx @@ -204,7 +204,7 @@ export default function FormVideoDetail() { // setValue("categoryId", findCategory.id); setSelectedCategory(findCategory.id); // Set the selected category const response = await getTagsBySubCategoryId(findCategory.id); - setTags(response?.data.data); + setTags(response?.data?.data); } } } catch (error) { diff --git a/components/form/content/video-form.tsx b/components/form/content/video-form.tsx index 9b8ed41e..b48cae67 100644 --- a/components/form/content/video-form.tsx +++ b/components/form/content/video-form.tsx @@ -52,6 +52,7 @@ import Image from "next/image"; import { error, loading } from "@/config/swal"; import { Item } from "@radix-ui/react-dropdown-menu"; import dynamic from "next/dynamic"; +import { getCsrfToken } from "@/service/auth"; const CustomEditor = dynamic( () => { @@ -395,7 +396,7 @@ export default function FormVideo() { // setValue("categoryId", findCategory.id); setSelectedCategory(findCategory.id); // Set the selected category const response = await getTagsBySubCategoryId(findCategory.id); - setTags(response?.data.data); + setTags(response?.data?.data); } } } catch (error) { @@ -466,7 +467,7 @@ export default function FormVideo() { MySwal.fire("Error", response?.message, "error"); return; } - Cookies.set("idCreate", response?.data.data, { expires: 1 }); + Cookies.set("idCreate", response?.data?.data, { expires: 1 }); id = response?.data?.data; // Upload Thumbnail @@ -526,9 +527,16 @@ export default function FormVideo() { // const placements = getPlacement(file.placements); // console.log("Placementttt: : ", placements); + const resCsrf = await getCsrfToken(); + const csrfToken = resCsrf?.data?.token; + console.log("CSRF TOKEN : ", csrfToken); + const headers = { + "X-XSRF-TOKEN": csrfToken + }; const upload = new Upload(file, { endpoint: `${process.env.NEXT_PUBLIC_API}/media/file/upload`, + headers: headers, retryDelays: [0, 3000, 6000, 12_000, 24_000], chunkSize: 20_000, metadata: { @@ -538,6 +546,10 @@ export default function FormVideo() { duration, isWatermark: "false", // hardcode }, + onBeforeRequest: function (req) { + var xhr = req.getUnderlyingObject() + xhr.withCredentials = true + }, onError: async (e: any) => { console.log("Error upload :", e); error(e); diff --git a/components/form/content/video-update-form.tsx b/components/form/content/video-update-form.tsx index 0a40ed06..4ec5a31a 100644 --- a/components/form/content/video-update-form.tsx +++ b/components/form/content/video-update-form.tsx @@ -170,7 +170,7 @@ export default function FormVideoUpdate() { // setValue("categoryId", findCategory.id); setSelectedCategory(findCategory.id); // Set the selected category const response = await getTagsBySubCategoryId(findCategory.id); - setTags(response?.data.data); + setTags(response?.data?.data); } } } catch (error) { diff --git a/components/landing-page/header-management.tsx b/components/landing-page/header-management.tsx index d98c474d..1f2b57e1 100644 --- a/components/landing-page/header-management.tsx +++ b/components/landing-page/header-management.tsx @@ -25,14 +25,14 @@ const HeaderManagement = () => { async function getProvinces() { const response = await getListPorvinces(); - // console.log(response?.data.data); + // console.log(response?.data?.data); setProvince(response?.data?.data); } // async function getDisticts() { // const response = await getListDistricts(); - // console.log(response?.data.data); - // setDistrict(response?.data.data); + // console.log(response?.data?.data); + // setDistrict(response?.data?.data); // } initState(); getProvinces(); // getDisticts(); diff --git a/components/landing-page/sidebar-management.tsx b/components/landing-page/sidebar-management.tsx index e7b074e4..3175c533 100644 --- a/components/landing-page/sidebar-management.tsx +++ b/components/landing-page/sidebar-management.tsx @@ -26,14 +26,14 @@ const SidebarManagement = () => { async function getProvinces() { const response = await getListPorvinces(); - // console.log(response?.data.data); + // console.log(response?.data?.data); setProvince(response?.data?.data); } // async function getDisticts() { // const response = await getListDistricts(); - // console.log(response?.data.data); - // setDistrict(response?.data.data); + // console.log(response?.data?.data); + // setDistrict(response?.data?.data); // } initState(); getProvinces(); // getDisticts(); diff --git a/components/partials/auth/login-form.tsx b/components/partials/auth/login-form.tsx index cf70b15b..f6478ebe 100644 --- a/components/partials/auth/login-form.tsx +++ b/components/partials/auth/login-form.tsx @@ -11,7 +11,7 @@ import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { cn, setCookiesEncrypt } from "@/lib/utils"; import { Loader2 } from "lucide-react"; -import { getCsrfToken, getProfile, login } from "@/service/auth"; +import { getProfile, login } from "@/service/auth"; import { toast } from "sonner"; import { Link, useRouter } from "@/components/navigation"; import { warning } from "@/lib/swal"; diff --git a/components/partials/header/notifications.tsx b/components/partials/header/notifications.tsx index 20b03a4a..8ceb9e02 100644 --- a/components/partials/header/notifications.tsx +++ b/components/partials/header/notifications.tsx @@ -127,7 +127,7 @@ const Notifications = () => {
- {notifications.map((item: Notification, index: number) => ( + {notifications?.map((item: Notification, index: number) => ( { + console.log("Response interceptor : ", response); return response; }, async function (error) { + console.log("Error interceptor : ", error.response.status); const originalRequest = error.config; if (error.response.status === 401 && !originalRequest._retry) { originalRequest._retry = true; diff --git a/service/http-config/http-interceptor-service.ts b/service/http-config/http-interceptor-service.ts index 90979859..d553a743 100644 --- a/service/http-config/http-interceptor-service.ts +++ b/service/http-config/http-interceptor-service.ts @@ -1,6 +1,7 @@ import { useRouter } from "next/navigation"; import axiosInterceptorInstance from "./axios-interceptor-instance"; import Cookies from "js-cookie"; +import { getCsrfToken } from "../auth"; export async function httpGetInterceptor(pathUrl: any) { const pathname = window.location.pathname; @@ -35,8 +36,20 @@ export async function httpPostInterceptor( data?: any, headers?: any ) { + const resCsrf = await getCsrfToken(); + const csrfToken = resCsrf?.data?.token; + + const defaultHeaders = { + "Content-Type": "application/json", + }; + const mergedHeaders = { + ...defaultHeaders, + ...headers, + ...(csrfToken ? { "X-XSRF-TOKEN": csrfToken } : {}), + }; + const response = await axiosInterceptorInstance - .post(pathUrl, data, headers) + .post(pathUrl, data, { headers: mergedHeaders }) .catch((error) => error.response); console.log("Response interceptor : ", response); if (response?.status == 200 || response?.status == 201) { @@ -64,8 +77,20 @@ export async function httpPutInterceptor( data: any, headers?: any ) { + const resCsrf = await getCsrfToken(); + const csrfToken = resCsrf?.data?.token; + + const defaultHeaders = { + "Content-Type": "application/json", + }; + const mergedHeaders = { + ...defaultHeaders, + ...headers, + ...(csrfToken ? { "X-XSRF-TOKEN": csrfToken } : {}), + }; + const response = await axiosInterceptorInstance - .put(pathUrl, data, { headers }) + .put(pathUrl, data, { headers: mergedHeaders }) .catch((error) => error.response); console.log("Response interceptor : ", response); if (response?.status == 200 || response?.status == 201) { @@ -89,8 +114,19 @@ export async function httpPutInterceptor( } export async function httpDeleteInterceptor(pathUrl: any) { + const resCsrf = await getCsrfToken(); + const csrfToken = resCsrf?.data?.token; + + const defaultHeaders = { + "Content-Type": "application/json", + }; + const mergedHeaders = { + ...defaultHeaders, + ...(csrfToken ? { "X-XSRF-TOKEN": csrfToken } : {}), + }; + const response = await axiosInterceptorInstance - .delete(pathUrl) + .delete(pathUrl, { headers: mergedHeaders}) .catch((error) => error.response); console.log("Response interceptor : ", response); if (response?.status == 200 || response?.status == 201) {