From d6b452b73407d5a7436a510fc3683d0995370d99 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Frane=20Poli=C4=87?=
<16856471+fPolic@users.noreply.github.com>
Date: Sun, 6 Oct 2024 13:57:56 +0200
Subject: [PATCH] feat(dashboard, medusa) add metadata to pages (#9433)
**WIP**
- add metadata component and edit route to missing pages
- fix API issues around metadata in certain domains
---
FIXES CC-554
---
.../providers/router-provider/route-map.tsx | 30 +++++++
.../categories-metadata.tsx | 30 +++++++
.../categories/categories-metadata/index.ts | 1 +
.../category-detail/category-detail.tsx | 84 ++++++++++---------
.../inventory-item-general-section.tsx | 4 +-
.../inventory/inventory-metadata/index.ts | 1 +
.../inventory-metadata/inventory-metadata.tsx | 27 ++++++
.../regions/region-detail/region-detail.tsx | 17 +++-
.../routes/regions/region-metadata/index.ts | 1 +
.../region-metadata/region-metadata.tsx | 27 ++++++
.../reservation-detail/reservation-detail.tsx | 74 +++++++---------
.../reservation-metadata/index.ts | 1 +
.../reservation-metadata.tsx | 30 +++++++
.../sales-channel-detail.tsx | 16 +++-
.../sales-channel-metadata/index.ts | 1 +
.../sales-channel-metadata.tsx | 32 +++++++
.../tax-region-detail/tax-region-detail.tsx | 1 +
.../tax-regions/tax-region-metadata/index.ts | 1 +
.../tax-region-metadata.tsx | 31 +++++++
.../routes/users/user-detail/user-detail.tsx | 16 +++-
.../src/routes/users/user-metadata/index.ts | 1 +
.../users/user-metadata/user-metadata.tsx | 27 ++++++
.../types/src/http/user/admin/payloads.ts | 1 +
.../api/admin/sales-channels/query-config.ts | 1 +
.../medusa/src/api/admin/users/validators.ts | 1 +
25 files changed, 358 insertions(+), 98 deletions(-)
create mode 100644 packages/admin/dashboard/src/routes/categories/categories-metadata/categories-metadata.tsx
create mode 100644 packages/admin/dashboard/src/routes/categories/categories-metadata/index.ts
create mode 100644 packages/admin/dashboard/src/routes/inventory/inventory-metadata/index.ts
create mode 100644 packages/admin/dashboard/src/routes/inventory/inventory-metadata/inventory-metadata.tsx
create mode 100644 packages/admin/dashboard/src/routes/regions/region-metadata/index.ts
create mode 100644 packages/admin/dashboard/src/routes/regions/region-metadata/region-metadata.tsx
create mode 100644 packages/admin/dashboard/src/routes/reservations/reservation-metadata/index.ts
create mode 100644 packages/admin/dashboard/src/routes/reservations/reservation-metadata/reservation-metadata.tsx
create mode 100644 packages/admin/dashboard/src/routes/sales-channels/sales-channel-metadata/index.ts
create mode 100644 packages/admin/dashboard/src/routes/sales-channels/sales-channel-metadata/sales-channel-metadata.tsx
create mode 100644 packages/admin/dashboard/src/routes/tax-regions/tax-region-metadata/index.ts
create mode 100644 packages/admin/dashboard/src/routes/tax-regions/tax-region-metadata/tax-region-metadata.tsx
create mode 100644 packages/admin/dashboard/src/routes/users/user-metadata/index.ts
create mode 100644 packages/admin/dashboard/src/routes/users/user-metadata/user-metadata.tsx
diff --git a/packages/admin/dashboard/src/providers/router-provider/route-map.tsx b/packages/admin/dashboard/src/providers/router-provider/route-map.tsx
index 329dc57f08..38f38354bf 100644
--- a/packages/admin/dashboard/src/providers/router-provider/route-map.tsx
+++ b/packages/admin/dashboard/src/providers/router-provider/route-map.tsx
@@ -234,6 +234,11 @@ export const RouteMap: RouteObject[] = [
lazy: () =>
import("../../routes/categories/category-organize"),
},
+ {
+ path: "metadata/edit",
+ lazy: () =>
+ import("../../routes/categories/categories-metadata"),
+ },
],
},
],
@@ -623,6 +628,11 @@ export const RouteMap: RouteObject[] = [
"../../routes/reservations/reservation-detail/components/edit-reservation"
),
},
+ {
+ path: "metadata/edit",
+ lazy: () =>
+ import("../../routes/reservations/reservation-metadata"),
+ },
],
},
],
@@ -681,6 +691,11 @@ export const RouteMap: RouteObject[] = [
"../../routes/inventory/inventory-detail/components/adjust-inventory"
),
},
+ {
+ path: "metadata/edit",
+ lazy: () =>
+ import("../../routes/inventory/inventory-metadata"),
+ },
{
// TODO: create reservation
path: "reservations",
@@ -765,6 +780,10 @@ export const RouteMap: RouteObject[] = [
lazy: () =>
import("../../routes/regions/region-add-countries"),
},
+ {
+ path: "metadata/edit",
+ lazy: () => import("../../routes/regions/region-metadata"),
+ },
],
},
],
@@ -820,6 +839,10 @@ export const RouteMap: RouteObject[] = [
path: "edit",
lazy: () => import("../../routes/users/user-edit"),
},
+ {
+ path: "metadata/edit",
+ lazy: () => import("../../routes/users/user-metadata"),
+ },
],
},
],
@@ -867,6 +890,13 @@ export const RouteMap: RouteObject[] = [
"../../routes/sales-channels/sales-channel-add-products"
),
},
+ {
+ path: "metadata/edit",
+ lazy: () =>
+ import(
+ "../../routes/sales-channels/sales-channel-metadata"
+ ),
+ },
],
},
],
diff --git a/packages/admin/dashboard/src/routes/categories/categories-metadata/categories-metadata.tsx b/packages/admin/dashboard/src/routes/categories/categories-metadata/categories-metadata.tsx
new file mode 100644
index 0000000000..6678c5d3df
--- /dev/null
+++ b/packages/admin/dashboard/src/routes/categories/categories-metadata/categories-metadata.tsx
@@ -0,0 +1,30 @@
+import { useParams } from "react-router-dom"
+
+import {
+ useProductCategory,
+ useUpdateProductCategory,
+} from "../../../hooks/api"
+import { MetadataForm } from "../../../components/forms/metadata-form"
+import { RouteDrawer } from "../../../components/modals"
+
+export const CategoriesMetadata = () => {
+ const { id } = useParams()
+
+ const { product_category, isPending, isError, error } = useProductCategory(id)
+ const { mutateAsync, isPending: isMutating } = useUpdateProductCategory(id)
+
+ if (isError) {
+ throw error
+ }
+
+ return (
+
+
+
+ )
+}
diff --git a/packages/admin/dashboard/src/routes/categories/categories-metadata/index.ts b/packages/admin/dashboard/src/routes/categories/categories-metadata/index.ts
new file mode 100644
index 0000000000..9b97c2eb1d
--- /dev/null
+++ b/packages/admin/dashboard/src/routes/categories/categories-metadata/index.ts
@@ -0,0 +1 @@
+export { CategoriesMetadata as Component } from "./categories-metadata"
diff --git a/packages/admin/dashboard/src/routes/categories/category-detail/category-detail.tsx b/packages/admin/dashboard/src/routes/categories/category-detail/category-detail.tsx
index c37f26d2a2..7923435e7e 100644
--- a/packages/admin/dashboard/src/routes/categories/category-detail/category-detail.tsx
+++ b/packages/admin/dashboard/src/routes/categories/category-detail/category-detail.tsx
@@ -1,5 +1,4 @@
-import { Outlet, useLoaderData, useParams } from "react-router-dom"
-import { JsonViewSection } from "../../../components/common/json-view-section"
+import { useLoaderData, useParams } from "react-router-dom"
import { useProductCategory } from "../../../hooks/api/categories"
import { CategoryGeneralSection } from "./components/category-general-section"
import { CategoryOrganizeSection } from "./components/category-organize-section"
@@ -10,6 +9,7 @@ import after from "virtual:medusa/widgets/product_category/details/after"
import before from "virtual:medusa/widgets/product_category/details/before"
import sideAfter from "virtual:medusa/widgets/product_category/details/side/after"
import sideBefore from "virtual:medusa/widgets/product_category/details/side/before"
+import { TwoColumnPage } from "../../../components/layout/pages"
export const CategoryDetail = () => {
const { id } = useParams()
@@ -35,7 +35,18 @@ export const CategoryDetail = () => {
}
return (
-
+
{before.widgets.map((w, i) => {
return (
@@ -43,43 +54,34 @@ export const CategoryDetail = () => {
)
})}
-
-
-
-
- {after.widgets.map((w, i) => {
- return (
-
-
-
- )
- })}
-
-
-
-
-
- {sideBefore.widgets.map((w, i) => {
- return (
-
-
-
- )
- })}
-
- {sideAfter.widgets.map((w, i) => {
- return (
-
-
-
- )
- })}
-
-
-
-
-
-
-
+
+
+
+ {after.widgets.map((w, i) => {
+ return (
+
+
+
+ )
+ })}
+
+
+ {sideBefore.widgets.map((w, i) => {
+ return (
+
+
+
+ )
+ })}
+
+ {sideAfter.widgets.map((w, i) => {
+ return (
+
+
+
+ )
+ })}
+
+
)
}
diff --git a/packages/admin/dashboard/src/routes/inventory/inventory-detail/components/inventory-item-general-section.tsx b/packages/admin/dashboard/src/routes/inventory/inventory-detail/components/inventory-item-general-section.tsx
index 85e28f398a..b97362580b 100644
--- a/packages/admin/dashboard/src/routes/inventory/inventory-detail/components/inventory-item-general-section.tsx
+++ b/packages/admin/dashboard/src/routes/inventory/inventory-detail/components/inventory-item-general-section.tsx
@@ -1,10 +1,10 @@
import { Container, Heading } from "@medusajs/ui"
import { HttpTypes } from "@medusajs/types"
+import { PencilSquare } from "@medusajs/icons"
+import { useTranslation } from "react-i18next"
import { ActionMenu } from "../../../../components/common/action-menu"
-import { PencilSquare } from "@medusajs/icons"
import { SectionRow } from "../../../../components/common/section"
-import { useTranslation } from "react-i18next"
type InventoryItemGeneralSectionProps = {
inventoryItem: HttpTypes.AdminInventoryItemResponse["inventory_item"]
diff --git a/packages/admin/dashboard/src/routes/inventory/inventory-metadata/index.ts b/packages/admin/dashboard/src/routes/inventory/inventory-metadata/index.ts
new file mode 100644
index 0000000000..ccd3bba222
--- /dev/null
+++ b/packages/admin/dashboard/src/routes/inventory/inventory-metadata/index.ts
@@ -0,0 +1 @@
+export { InventoryItemMetadata as Component } from "./inventory-metadata"
diff --git a/packages/admin/dashboard/src/routes/inventory/inventory-metadata/inventory-metadata.tsx b/packages/admin/dashboard/src/routes/inventory/inventory-metadata/inventory-metadata.tsx
new file mode 100644
index 0000000000..6060911df3
--- /dev/null
+++ b/packages/admin/dashboard/src/routes/inventory/inventory-metadata/inventory-metadata.tsx
@@ -0,0 +1,27 @@
+import { useParams } from "react-router-dom"
+
+import { useInventoryItem, useUpdateInventoryItem } from "../../../hooks/api"
+import { MetadataForm } from "../../../components/forms/metadata-form"
+import { RouteDrawer } from "../../../components/modals"
+
+export const InventoryItemMetadata = () => {
+ const { id } = useParams()
+
+ const { inventory_item, isPending, isError, error } = useInventoryItem(id)
+ const { mutateAsync, isPending: isMutating } = useUpdateInventoryItem(id)
+
+ if (isError) {
+ throw error
+ }
+
+ return (
+
+
+
+ )
+}
diff --git a/packages/admin/dashboard/src/routes/regions/region-detail/region-detail.tsx b/packages/admin/dashboard/src/routes/regions/region-detail/region-detail.tsx
index 7a29358641..f07c54464a 100644
--- a/packages/admin/dashboard/src/routes/regions/region-detail/region-detail.tsx
+++ b/packages/admin/dashboard/src/routes/regions/region-detail/region-detail.tsx
@@ -9,6 +9,8 @@ import { regionLoader } from "./loader"
import after from "virtual:medusa/widgets/region/details/after"
import before from "virtual:medusa/widgets/region/details/before"
import { usePricePreferences } from "../../../hooks/api/price-preferences"
+import { SingleColumnPage } from "../../../components/layout/pages"
+import { UserGeneralSection } from "../../users/user-detail/components/user-general-section"
export const RegionDetail = () => {
const initialData = useLoaderData() as Awaited<
@@ -56,7 +58,16 @@ export const RegionDetail = () => {
}
return (
-
+
{before.widgets.map((w, i) => {
return (
@@ -76,8 +87,6 @@ export const RegionDetail = () => {
)
})}
-
-
-
+
)
}
diff --git a/packages/admin/dashboard/src/routes/regions/region-metadata/index.ts b/packages/admin/dashboard/src/routes/regions/region-metadata/index.ts
new file mode 100644
index 0000000000..3fd1357aa9
--- /dev/null
+++ b/packages/admin/dashboard/src/routes/regions/region-metadata/index.ts
@@ -0,0 +1 @@
+export { RegionMetadata as Component } from "./region-metadata.tsx"
diff --git a/packages/admin/dashboard/src/routes/regions/region-metadata/region-metadata.tsx b/packages/admin/dashboard/src/routes/regions/region-metadata/region-metadata.tsx
new file mode 100644
index 0000000000..7bffe30054
--- /dev/null
+++ b/packages/admin/dashboard/src/routes/regions/region-metadata/region-metadata.tsx
@@ -0,0 +1,27 @@
+import { useParams } from "react-router-dom"
+
+import { MetadataForm } from "../../../components/forms/metadata-form"
+import { RouteDrawer } from "../../../components/modals"
+import { useRegion, useUpdateRegion } from "../../../hooks/api"
+
+export const RegionMetadata = () => {
+ const { id } = useParams()
+
+ const { region, isPending, isError, error } = useRegion(id)
+ const { mutateAsync, isPending: isMutating } = useUpdateRegion(id)
+
+ if (isError) {
+ throw error
+ }
+
+ return (
+
+
+
+ )
+}
diff --git a/packages/admin/dashboard/src/routes/reservations/reservation-detail/reservation-detail.tsx b/packages/admin/dashboard/src/routes/reservations/reservation-detail/reservation-detail.tsx
index f3677f7877..d29977acfb 100644
--- a/packages/admin/dashboard/src/routes/reservations/reservation-detail/reservation-detail.tsx
+++ b/packages/admin/dashboard/src/routes/reservations/reservation-detail/reservation-detail.tsx
@@ -1,8 +1,6 @@
-import { Outlet, useLoaderData, useParams } from "react-router-dom"
+import { useLoaderData, useParams } from "react-router-dom"
-import { JsonViewSection } from "../../../components/common/json-view-section"
import { useReservationItem } from "../../../hooks/api/reservations"
-import { InventoryItemGeneralSection } from "../../inventory/inventory-detail/components/inventory-item-general-section"
import { ReservationGeneralSection } from "./components/reservation-general-section"
import { reservationItemLoader } from "./loader"
@@ -10,6 +8,8 @@ import after from "virtual:medusa/widgets/reservation/details/after"
import before from "virtual:medusa/widgets/reservation/details/before"
import sideAfter from "virtual:medusa/widgets/reservation/details/side/after"
import sideBefore from "virtual:medusa/widgets/reservation/details/side/before"
+import { TwoColumnPage } from "../../../components/layout/pages"
+import { InventoryItemGeneralSection } from "../../inventory/inventory-detail/components/inventory-item-general-section"
export const ReservationDetail = () => {
const { id } = useParams()
@@ -35,7 +35,18 @@ export const ReservationDetail = () => {
}
return (
-
+
{before.widgets.map((w, i) => {
return (
@@ -43,44 +54,21 @@ export const ReservationDetail = () => {
)
})}
-
-
-
- {after.widgets.map((w, i) => {
- return (
-
-
-
- )
- })}
-
-
-
-
-
- {sideBefore.widgets.map((w, i) => {
- return (
-
-
-
- )
- })}
-
- {sideAfter.widgets.map((w, i) => {
- return (
-
-
-
- )
- })}
-
-
-
-
-
-
-
+
+
+ {after.widgets.map((w, i) => {
+ return (
+
+
+
+ )
+ })}
+
+
+
+
+
)
}
diff --git a/packages/admin/dashboard/src/routes/reservations/reservation-metadata/index.ts b/packages/admin/dashboard/src/routes/reservations/reservation-metadata/index.ts
new file mode 100644
index 0000000000..b47c93fd28
--- /dev/null
+++ b/packages/admin/dashboard/src/routes/reservations/reservation-metadata/index.ts
@@ -0,0 +1 @@
+export { ReservationMetadata as Component } from "./reservation-metadata"
diff --git a/packages/admin/dashboard/src/routes/reservations/reservation-metadata/reservation-metadata.tsx b/packages/admin/dashboard/src/routes/reservations/reservation-metadata/reservation-metadata.tsx
new file mode 100644
index 0000000000..10fa77b6e3
--- /dev/null
+++ b/packages/admin/dashboard/src/routes/reservations/reservation-metadata/reservation-metadata.tsx
@@ -0,0 +1,30 @@
+import { useParams } from "react-router-dom"
+
+import {
+ useReservationItem,
+ useUpdateReservationItem,
+} from "../../../hooks/api"
+import { MetadataForm } from "../../../components/forms/metadata-form"
+import { RouteDrawer } from "../../../components/modals"
+
+export const ReservationMetadata = () => {
+ const { id } = useParams()
+
+ const { reservation, isPending, isError, error } = useReservationItem(id)
+ const { mutateAsync, isPending: isMutating } = useUpdateReservationItem(id)
+
+ if (isError) {
+ throw error
+ }
+
+ return (
+
+
+
+ )
+}
diff --git a/packages/admin/dashboard/src/routes/sales-channels/sales-channel-detail/sales-channel-detail.tsx b/packages/admin/dashboard/src/routes/sales-channels/sales-channel-detail/sales-channel-detail.tsx
index bc3d3ae4c0..8065884249 100644
--- a/packages/admin/dashboard/src/routes/sales-channels/sales-channel-detail/sales-channel-detail.tsx
+++ b/packages/admin/dashboard/src/routes/sales-channels/sales-channel-detail/sales-channel-detail.tsx
@@ -8,6 +8,7 @@ import { salesChannelLoader } from "./loader"
import after from "virtual:medusa/widgets/sales_channel/details/after"
import before from "virtual:medusa/widgets/sales_channel/details/before"
+import { SingleColumnPage } from "../../../components/layout/pages"
export const SalesChannelDetail = () => {
const initialData = useLoaderData() as Awaited<
@@ -24,7 +25,16 @@ export const SalesChannelDetail = () => {
}
return (
-
+
{before.widgets.map((w, i) => {
return (
@@ -41,8 +51,6 @@ export const SalesChannelDetail = () => {
)
})}
-
-
-
+
)
}
diff --git a/packages/admin/dashboard/src/routes/sales-channels/sales-channel-metadata/index.ts b/packages/admin/dashboard/src/routes/sales-channels/sales-channel-metadata/index.ts
new file mode 100644
index 0000000000..c04bbc819e
--- /dev/null
+++ b/packages/admin/dashboard/src/routes/sales-channels/sales-channel-metadata/index.ts
@@ -0,0 +1 @@
+export { SalesChannelMetadata as Component } from "./sales-channel-metadata"
diff --git a/packages/admin/dashboard/src/routes/sales-channels/sales-channel-metadata/sales-channel-metadata.tsx b/packages/admin/dashboard/src/routes/sales-channels/sales-channel-metadata/sales-channel-metadata.tsx
new file mode 100644
index 0000000000..75f3ac8957
--- /dev/null
+++ b/packages/admin/dashboard/src/routes/sales-channels/sales-channel-metadata/sales-channel-metadata.tsx
@@ -0,0 +1,32 @@
+import { useParams } from "react-router-dom"
+
+import { RouteDrawer } from "../../../components/modals"
+import { MetadataForm } from "../../../components/forms/metadata-form"
+import { useSalesChannel, useUpdateSalesChannel } from "../../../hooks/api"
+
+export const SalesChannelMetadata = () => {
+ const { id } = useParams()
+
+ const {
+ sales_channel: salesChannel,
+ isPending,
+ isError,
+ error,
+ } = useSalesChannel(id)
+ const { mutateAsync, isPending: isMutating } = useUpdateSalesChannel(id)
+
+ if (isError) {
+ throw error
+ }
+
+ return (
+
+
+
+ )
+}
diff --git a/packages/admin/dashboard/src/routes/tax-regions/tax-region-detail/tax-region-detail.tsx b/packages/admin/dashboard/src/routes/tax-regions/tax-region-detail/tax-region-detail.tsx
index f89fc04682..741306dc22 100644
--- a/packages/admin/dashboard/src/routes/tax-regions/tax-region-detail/tax-region-detail.tsx
+++ b/packages/admin/dashboard/src/routes/tax-regions/tax-region-detail/tax-region-detail.tsx
@@ -40,6 +40,7 @@ export const TaxRegionDetail = () => {
data={taxRegion}
showJSON
hasOutlet
+ // showMetadata // TOOD -> enable when tax region update is added to the API
widgets={{
after,
before,
diff --git a/packages/admin/dashboard/src/routes/tax-regions/tax-region-metadata/index.ts b/packages/admin/dashboard/src/routes/tax-regions/tax-region-metadata/index.ts
new file mode 100644
index 0000000000..f5ec5b2992
--- /dev/null
+++ b/packages/admin/dashboard/src/routes/tax-regions/tax-region-metadata/index.ts
@@ -0,0 +1 @@
+export { TaxRegionMetadata as Component } from "./tax-region-metadata.tsx"
diff --git a/packages/admin/dashboard/src/routes/tax-regions/tax-region-metadata/tax-region-metadata.tsx b/packages/admin/dashboard/src/routes/tax-regions/tax-region-metadata/tax-region-metadata.tsx
new file mode 100644
index 0000000000..d66f489b9a
--- /dev/null
+++ b/packages/admin/dashboard/src/routes/tax-regions/tax-region-metadata/tax-region-metadata.tsx
@@ -0,0 +1,31 @@
+import { useParams } from "react-router-dom"
+
+import { useTaxRegion } from "../../../hooks/api"
+import { MetadataForm } from "../../../components/forms/metadata-form"
+import { RouteDrawer } from "../../../components/modals"
+
+/**
+ * TODO: Tax region update endpoint is missing
+ */
+
+export const TaxRegionMetadata = () => {
+ const { id } = useParams()
+
+ const { tax_region, isPending, isError, error } = useTaxRegion(id)
+ const { mutateAsync, isPending: isMutating } = {} // useUpdateTaxRegion(id)
+
+ if (isError) {
+ throw error
+ }
+
+ return (
+
+
+
+ )
+}
diff --git a/packages/admin/dashboard/src/routes/users/user-detail/user-detail.tsx b/packages/admin/dashboard/src/routes/users/user-detail/user-detail.tsx
index c4d554da59..0aa6fe28f6 100644
--- a/packages/admin/dashboard/src/routes/users/user-detail/user-detail.tsx
+++ b/packages/admin/dashboard/src/routes/users/user-detail/user-detail.tsx
@@ -7,6 +7,7 @@ import { userLoader } from "./loader"
import after from "virtual:medusa/widgets/user/details/after"
import before from "virtual:medusa/widgets/user/details/before"
+import { SingleColumnPage } from "../../../components/layout/pages"
export const UserDetail = () => {
const initialData = useLoaderData() as Awaited>
@@ -34,7 +35,16 @@ export const UserDetail = () => {
}
return (
-
+
{before.widgets.map((w, i) => (
@@ -46,8 +56,6 @@ export const UserDetail = () => {
))}
-
-
-
+
)
}
diff --git a/packages/admin/dashboard/src/routes/users/user-metadata/index.ts b/packages/admin/dashboard/src/routes/users/user-metadata/index.ts
new file mode 100644
index 0000000000..2788dc4b68
--- /dev/null
+++ b/packages/admin/dashboard/src/routes/users/user-metadata/index.ts
@@ -0,0 +1 @@
+export { UserMetadata as Component } from "./user-metadata"
diff --git a/packages/admin/dashboard/src/routes/users/user-metadata/user-metadata.tsx b/packages/admin/dashboard/src/routes/users/user-metadata/user-metadata.tsx
new file mode 100644
index 0000000000..6c64330f1e
--- /dev/null
+++ b/packages/admin/dashboard/src/routes/users/user-metadata/user-metadata.tsx
@@ -0,0 +1,27 @@
+import { useParams } from "react-router-dom"
+
+import { MetadataForm } from "../../../components/forms/metadata-form"
+import { RouteDrawer } from "../../../components/modals"
+import { useUpdateUser, useUser } from "../../../hooks/api"
+
+export const UserMetadata = () => {
+ const { id } = useParams()
+
+ const { user, isPending, isError, error } = useUser(id)
+ const { mutateAsync, isPending: isMutating } = useUpdateUser(id)
+
+ if (isError) {
+ throw error
+ }
+
+ return (
+
+
+
+ )
+}
diff --git a/packages/core/types/src/http/user/admin/payloads.ts b/packages/core/types/src/http/user/admin/payloads.ts
index dc1d55c998..a40f739683 100644
--- a/packages/core/types/src/http/user/admin/payloads.ts
+++ b/packages/core/types/src/http/user/admin/payloads.ts
@@ -9,4 +9,5 @@ export interface AdminUpdateUser {
first_name?: string | null
last_name?: string | null
avatar_url?: string | null
+ metadata?: Record | null
}
diff --git a/packages/medusa/src/api/admin/sales-channels/query-config.ts b/packages/medusa/src/api/admin/sales-channels/query-config.ts
index 72857723de..2d4d710885 100644
--- a/packages/medusa/src/api/admin/sales-channels/query-config.ts
+++ b/packages/medusa/src/api/admin/sales-channels/query-config.ts
@@ -6,6 +6,7 @@ export const defaultAdminSalesChannelFields = [
"created_at",
"updated_at",
"deleted_at",
+ "metadata",
]
export const retrieveTransformQueryConfig = {
diff --git a/packages/medusa/src/api/admin/users/validators.ts b/packages/medusa/src/api/admin/users/validators.ts
index 49b6430af3..a44b651122 100644
--- a/packages/medusa/src/api/admin/users/validators.ts
+++ b/packages/medusa/src/api/admin/users/validators.ts
@@ -37,4 +37,5 @@ export const AdminUpdateUser = z.object({
first_name: z.string().nullish(),
last_name: z.string().nullish(),
avatar_url: z.string().nullish(),
+ metadata: z.record(z.unknown()).nullish().optional(),
})