Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(core-flows,dashboard,medusa): ability to add and remove items to claim inbound #8480

Merged
merged 12 commits into from
Aug 7, 2024
22 changes: 14 additions & 8 deletions packages/admin-next/dashboard/src/hooks/api/claims.tsx
Original file line number Diff line number Diff line change
@@ -1,25 +1,30 @@
import { HttpTypes } from "@medusajs/types"
import {
QueryKey,
useMutation,
UseMutationOptions,
useQuery,
UseQueryOptions,
} from "@tanstack/react-query"
import { HttpTypes } from "@medusajs/types"

import { sdk } from "../../lib/client"
import { queryClient } from "../../lib/query-client"
import { ordersQueryKeys } from "./orders"
import { queryKeysFactory } from "../../lib/query-key-factory"
import { ordersQueryKeys } from "./orders"

const CLAIMS_QUERY_KEY = "claims" as const
export const claimsQueryKeys = queryKeysFactory(CLAIMS_QUERY_KEY)

export const useClaim = (
id: string,
query?: Record<string, any>,
query?: HttpTypes.AdminClaimListParams,
options?: Omit<
UseQueryOptions<any, Error, any, QueryKey>,
UseQueryOptions<
HttpTypes.AdminClaimResponse,
Error,
HttpTypes.AdminClaimResponse,
QueryKey
>,
"queryFn" | "queryKey"
>
) => {
Expand Down Expand Up @@ -56,10 +61,7 @@ export const useClaims = (
export const useCreateClaim = (
orderId: string,
options?: UseMutationOptions<
{
claim: HttpTypes.AdminClaimResponse
order: HttpTypes.AdminOrderResponse
},
HttpTypes.AdminClaimResponse,
Error,
HttpTypes.AdminCreateClaim
>
Expand Down Expand Up @@ -278,6 +280,10 @@ export const useRemoveClaimInboundItem = (
queryClient.invalidateQueries({
queryKey: ordersQueryKeys.preview(orderId),
})
queryClient.invalidateQueries({
queryKey: ordersQueryKeys.all,
})

options?.onSuccess?.(data, variables, context)
},
...options,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
import { useEffect, useMemo, useState } from "react"
import { toast } from "@medusajs/ui"
import { useEffect, useState } from "react"
import { useTranslation } from "react-i18next"
import { useNavigate, useParams } from "react-router-dom"

import { toast } from "@medusajs/ui"

import { RouteFocusModal } from "../../../components/modals"
import { ClaimCreateForm } from "./components/claim-create-form"

import { useClaim, useCreateClaim } from "../../../hooks/api/claims"
import { useOrder, useOrderPreview } from "../../../hooks/api/orders"
import { useClaims, useCreateClaim } from "../../../hooks/api/claims"
import { DEFAULT_FIELDS } from "../order-detail/constants"
import { ClaimCreateForm } from "./components/claim-create-form"

let IS_REQUEST_RUNNING = false

Expand All @@ -23,28 +21,13 @@ export const ClaimCreate = () => {
})

const { order: preview } = useOrderPreview(id!)

const [activeClaimId, setActiveClaimId] = useState()

const [activeClaimId, setActiveClaimId] = useState<string>()
const { mutateAsync: createClaim } = useCreateClaim(order.id)

// TODO: GET /claims/:id is not implemented
// const { claim } = useClaim(activeClaimId, undefined, {
// enabled: !!activeClaimId,
// })

// TEMP HACK: until the endpoint above is implemented
const { claims } = useClaims(undefined, {
const { claim } = useClaim(activeClaimId!, undefined, {
enabled: !!activeClaimId,
limit: 999,
})

const claim = useMemo(() => {
if (claims) {
return claims.find((c) => c.id === activeClaimId)
}
}, [claims, activeClaimId])

useEffect(() => {
async function run() {
if (IS_REQUEST_RUNNING || !preview) {
Expand All @@ -65,14 +48,15 @@ export const ClaimCreate = () => {
IS_REQUEST_RUNNING = true

try {
const { claim } = await createClaim({
const { claim: createdClaim } = await createClaim({
order_id: preview.id,
type: "replace",
})
setActiveClaimId(claim.id)

setActiveClaimId(createdClaim.id)
} catch (e) {
navigate(`/orders/${preview.id}`, { replace: true })
toast.error(e.message)
navigate(`/orders/${preview.id}`, { replace: true })
} finally {
IS_REQUEST_RUNNING = false
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
import { OnChangeFn, RowSelectionState } from "@tanstack/react-table"
import { useMemo, useState } from "react"

import {
AdminOrderLineItem,
DateComparisonOperator,
NumericalComparisonOperator,
} from "@medusajs/types"
import { AdminOrderLineItem } from "@medusajs/types"
import { OnChangeFn, RowSelectionState } from "@tanstack/react-table"
import { useMemo, useState } from "react"

import { useClaimItemTableColumns } from "./use-claim-item-table-columns"
import { useClaimItemTableFilters } from "./use-claim-item-table-filters"
import { useClaimItemTableQuery } from "./use-claim-item-table-query"
import { useDataTable } from "../../../../../hooks/use-data-table"
import { DataTable } from "../../../../../components/table/data-table"
import { useDataTable } from "../../../../../hooks/use-data-table"
import { getStylizedAmount } from "../../../../../lib/money-amount-helpers"
import { getReturnableQuantity } from "../../../../../lib/rma"
import { useClaimItemTableColumns } from "./use-claim-item-table-columns"
import { useClaimItemTableFilters } from "./use-claim-item-table-filters"
import { useClaimItemTableQuery } from "./use-claim-item-table-query"

const PAGE_SIZE = 50
const PREFIX = "rit"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import React, { useEffect, useMemo, useState } from "react"
import { zodResolver } from "@hookform/resolvers/zod"
import { PencilSquare } from "@medusajs/icons"
import { AdminClaim, AdminOrder, InventoryLevelDTO } from "@medusajs/types"
import {
Alert,
Button,
Expand All @@ -10,10 +11,9 @@ import {
Text,
toast,
} from "@medusajs/ui"
import { useEffect, useMemo, useState } from "react"
import { useFieldArray, useForm } from "react-hook-form"
import { useTranslation } from "react-i18next"
import { AdminClaim, AdminOrder, InventoryLevelDTO } from "@medusajs/types"
import { PencilSquare } from "@medusajs/icons"

import {
RouteFocusModal,
Expand All @@ -22,33 +22,35 @@ import {
useStackedModal,
} from "../../../../../components/modals"

import { ClaimCreateSchema, ReturnCreateSchemaType } from "./schema"
import { AddClaimItemsTable } from "../add-claim-items-table"
import { Form } from "../../../../../components/common/form"
import { ClaimInboundItem } from "./claim-inbound-item.tsx"
import { Combobox } from "../../../../../components/inputs/combobox"
import { useStockLocations } from "../../../../../hooks/api/stock-locations"
import { useShippingOptions } from "../../../../../hooks/api/shipping-options"
import { useStockLocations } from "../../../../../hooks/api/stock-locations"
import { getStylizedAmount } from "../../../../../lib/money-amount-helpers"
import { AddClaimItemsTable } from "../add-claim-items-table"
import { ClaimInboundItem } from "./claim-inbound-item.tsx"
import { ClaimCreateSchema, ReturnCreateSchemaType } from "./schema"

import { currencies } from "../../../../../lib/data/currencies"
import { sdk } from "../../../../../lib/client"
import {
useAddClaimInboundItems,
useAddClaimInboundShipping,
useCancelClaimRequest,
useDeleteClaimInboundShipping,
useRemoveClaimInboundItem,
useUpdateClaimInboundItem,
useUpdateClaimInboundShipping,
} from "../../../../../hooks/api/claims"
import { sdk } from "../../../../../lib/client"
import { currencies } from "../../../../../lib/data/currencies"

type ReturnCreateFormProps = {
order: AdminOrder
claim: AdminClaim
preview: AdminOrder
}

let selectedItems: string[] = []
let itemsToAdd: string[] = []
let itemsToRemove: string[] = []

let IS_CANCELING = false

Expand Down Expand Up @@ -87,7 +89,8 @@ export const ClaimCreateForm = ({
*/
const { mutateAsync: confirmClaimRequest, isPending: isConfirming } = {} // useConfirmClaimRequest(claim.id, order.id)

const { mutateAsync: cancelClaimRequest, isPending: isCanceling } = {} // useCancelClaimRequest(claim.id, order.id)
const { mutateAsync: cancelClaimRequest, isPending: isCanceling } =
useCancelClaimRequest(claim.id, order.id)

const { mutateAsync: updateClaimRequest, isPending: isUpdating } = {} // useUpdateClaim(claim.id, order.id)

Expand Down Expand Up @@ -244,13 +247,24 @@ export const ClaimCreateForm = ({
}
})

const onItemsSelected = () => {
addInboundItem({
items: selectedItems.map((id) => ({
id,
quantity: 1,
})),
})
const onItemsSelected = async () => {
itemsToAdd.length &&
(await addInboundItem({
items: itemsToAdd.map((id) => ({
id,
quantity: 1,
})),
}))

for (const itemToRemove of itemsToRemove) {
const actionId = previewItems
.find((i) => i.id === itemToRemove)
?.actions?.find((a) => a.action === "RETURN_ITEM")?.id

if (actionId) {
await removeInboundItem(actionId)
}
}

setIsOpen("items", false)
}
Expand Down Expand Up @@ -393,8 +407,18 @@ export const ClaimCreateForm = ({
items={order.items!}
selectedItems={items.map((i) => i.item_id)}
currencyCode={order.currency_code}
onSelectionChange={(s) => (selectedItems = s)}
onSelectionChange={(finalSelection) => {
const alreadySelected = items.map((i) => i.item_id)

itemsToAdd = finalSelection.filter(
(selection) => !alreadySelected.includes(selection)
)
itemsToRemove = alreadySelected.filter(
(selection) => !finalSelection.includes(selection)
)
}}
/>

<StackedFocusModal.Footer>
<div className="flex w-full items-center justify-end gap-x-4">
<div className="flex items-center justify-end gap-x-2">
Expand All @@ -413,7 +437,7 @@ export const ClaimCreateForm = ({
variant="primary"
size="small"
role="button"
onClick={() => onItemsSelected()}
onClick={async () => await onItemsSelected()}
>
{t("actions.save")}
</Button>
Expand All @@ -423,6 +447,7 @@ export const ClaimCreateForm = ({
</StackedFocusModal.Content>
</StackedFocusModal>
</div>

{showPlaceholder && (
<div
style={{
Expand All @@ -432,34 +457,39 @@ export const ClaimCreateForm = ({
className="bg-ui-bg-field mt-4 block h-[56px] w-full rounded-lg border border-dashed"
/>
)}
{items.map((item, index) => (
<ClaimInboundItem
key={item.id}
item={itemsMap.get(item.item_id)!}
previewItem={previewItemsMap.get(item.item_id)!}
currencyCode={order.currency_code}
form={form}
onRemove={() => {
const actionId = previewItems
.find((i) => i.id === item.item_id)
?.actions?.find((a) => a.action === "RETURN_ITEM")?.id

if (actionId) {
removeInboundItem(actionId)
}
}}
onUpdate={(payload) => {
const actionId = previewItems
.find((i) => i.id === item.item_id)
?.actions?.find((a) => a.action === "RETURN_ITEM")?.id

if (actionId) {
updateInboundItem({ ...payload, actionId })
}
}}
index={index}
/>
))}

{items.map(
(item, index) =>
previewItemsMap.get(item.item_id) && (
<ClaimInboundItem
key={item.id}
item={itemsMap.get(item.item_id)!}
previewItem={previewItemsMap.get(item.item_id)!}
currencyCode={order.currency_code}
form={form}
onRemove={() => {
const actionId = previewItems
.find((i) => i.id === item.item_id)
?.actions?.find((a) => a.action === "RETURN_ITEM")?.id

if (actionId) {
removeInboundItem(actionId)
}
}}
onUpdate={(payload) => {
const actionId = previewItems
.find((i) => i.id === item.item_id)
?.actions?.find((a) => a.action === "RETURN_ITEM")?.id

if (actionId) {
updateInboundItem({ ...payload, actionId })
}
}}
index={index}
/>
)
)}

{!showPlaceholder && (
<div className="mt-8 flex flex-col gap-y-4">
{/*LOCATION*/}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ const DEFAULT_PROPERTIES = [
"shipping_tax_total",
"tax_total",
"refundable_total",
"order_change",
]

const DEFAULT_RELATIONS = [
Expand Down
Loading
Loading