|
- "use client";
-
- import type { DoDetail as DoDetailType } from "@/app/api/do/actions";
- import { useRouter } from "next/navigation";
- import { useTranslation } from "react-i18next";
- import useUploadContext from "../UploadProvider/useUploadContext";
- import { FormProvider, SubmitErrorHandler, SubmitHandler, useForm } from "react-hook-form";
- import { useCallback, useState } from "react";
- import { Button, Stack, Typography, Box, Alert } from "@mui/material";
- import ArrowBackIcon from '@mui/icons-material/ArrowBack';
- import StartIcon from "@mui/icons-material/Start";
- import { releaseDo, assignPickOrderByStore, releaseAssignedPickOrderByStore } from "@/app/api/do/actions";
- import DoInfoCard from "./DoInfoCard";
- import DoLineTable from "./DoLineTable";
- import { useSession } from "next-auth/react";
- import { SessionWithTokens } from "@/config/authConfig"; // Import the correct session type
-
- type Props = {
- id?: number;
- defaultValues: Partial<DoDetailType> | undefined;
- }
-
- const DoDetail: React.FC<Props> = ({
- defaultValues,
- id,
- }) => {
- const { t } = useTranslation("do")
- const router = useRouter();
- const { setIsUploading } = useUploadContext();
- const [serverError, setServerError] = useState("");
- const [successMessage, setSuccessMessage] = useState("");
- const [isAssigning, setIsAssigning] = useState(false);
- const { data: session } = useSession() as { data: SessionWithTokens | null }; // Use correct session type
-
- const currentUserId = session?.id ? parseInt(session.id) : undefined; // Get user ID from session.id
- console.log("🔍 DoSearch - session:", session);
- console.log("🔍 DoSearch - currentUserId:", currentUserId);
- const formProps = useForm<DoDetailType>({
- defaultValues: defaultValues
- })
-
- const handleBack = useCallback(() => {
- router.replace(`/do`)
- }, [])
-
- const handleRelease = useCallback(async () => {
- try {
- setIsUploading(true)
- setServerError("")
- setSuccessMessage("")
-
- if (id) {
- // Get current user ID from session
- //const currentUserId = session?.id ? parseInt(session.id) : undefined;
-
- //if (!currentUserId) {
- // setServerError("User session not found. Please login again.");
- // return;
- //}
-
- const response = await releaseDo({
- id: id,
- //userId: currentUserId // Pass user ID from session
- })
-
- if (response) {
- formProps.setValue("status", response.entity.status)
- setSuccessMessage(t("DO released successfully! Pick orders created."))
- }
- }
- } catch (e) {
- setServerError(t("An error has occurred. Please try again later."));
- console.log(e);
- } finally {
- setIsUploading(false)
- }
- }, [id, formProps, t, setIsUploading, session]) // Add session to dependencies
-
- // UPDATE STORE-BASED ASSIGNMENT HANDLERS
- const handleAssignByStore = useCallback(async (storeId: string) => {
- try {
- setIsAssigning(true)
- setServerError("")
- setSuccessMessage("")
-
- // Get current user ID from session
- const currentUserId = session?.id ? parseInt(session.id) : undefined;
-
- if (!currentUserId) {
- setServerError("User session not found. Please login again.");
- return;
- }
-
- const response = await assignPickOrderByStore({
- storeId: storeId,
- assignTo: currentUserId
- })
-
- if (response) {
- setSuccessMessage(`Pick orders assigned to ${storeId} successfully!`)
- console.log("Assignment response:", response)
- }
-
- } catch (e) {
- setServerError(t("Failed to assign pick orders. Please try again later."));
- console.log(e);
- } finally {
- setIsAssigning(false)
- }
- }, [t, session]) // Add session to dependencies
-
- const handleReleaseByStore = useCallback(async (storeId: string) => {
- try {
- setIsAssigning(true)
- setServerError("")
- setSuccessMessage("")
-
- // Get current user ID from session
- const currentUserId = session?.id ? parseInt(session.id) : undefined;
-
- if (!currentUserId) {
- setServerError("User session not found. Please login again.");
- return;
- }
-
- const response = await releaseAssignedPickOrderByStore({
- storeId: storeId,
- assignTo: currentUserId
- })
-
- if (response) {
- setSuccessMessage(`Pick orders released for ${storeId} successfully!`)
- console.log("Release response:", response)
- }
-
- } catch (e) {
- setServerError(t("Failed to release pick orders. Please try again later."));
- console.log(e);
- } finally {
- setIsAssigning(false)
- }
- }, [t, session]) // Add session to dependencies
-
- const onSubmit = useCallback<SubmitHandler<DoDetailType>>(async (data, event) => {
- console.log(data)
- }, [t])
-
- const onSubmitError = useCallback<SubmitErrorHandler<DoDetailType>>((errors) => {
- console.log(errors)
- }, [t])
-
- return <>
- <FormProvider {...formProps}>
- <Stack
- spacing={2}
- component="form"
- onSubmit={formProps.handleSubmit(onSubmit, onSubmitError)}
- >
- {serverError && (
- <Alert severity="error" sx={{ mb: 2 }}>
- {serverError}
- </Alert>
- )}
-
- {successMessage && (
- <Alert severity="success" sx={{ mb: 2 }}>
- {successMessage}
- </Alert>
- )}
-
- {/*{
- formProps.watch("status")?.toLowerCase() === "pending" && (
- <Stack direction="row" justifyContent="flex-start" gap={1}>
- <Button
- variant="outlined"
- startIcon={<StartIcon />}
- onClick={handleRelease}
- disabled={isAssigning}
- >
- {t("Release")}
- </Button>
- </Stack>
- )}
- */}
- {/* ADD STORE-BASED ASSIGNMENT BUTTONS */}
- {
- formProps.watch("status")?.toLowerCase() === "released" && (
- <Box sx={{ mb: 2 }}>
- <Typography variant="h6" gutterBottom>
- {t("Pick Order Assignment")}
- </Typography>
- <Stack direction="row" spacing={2}>
- <Button
- variant="contained"
- color="primary"
- onClick={() => handleAssignByStore("2/F")}
- disabled={isAssigning}
- sx={{ minWidth: 120 }}
- >
- {t("Assign 2/F")}
- </Button>
- <Button
- variant="contained"
- color="secondary"
- onClick={() => handleAssignByStore("4/F")}
- disabled={isAssigning}
- sx={{ minWidth: 120 }}
- >
- {t("Assign 4/F")}
- </Button>
- </Stack>
-
- <Stack direction="row" spacing={2} sx={{ mt: 1 }}>
- <Button
- variant="outlined"
- color="primary"
- onClick={() => handleReleaseByStore("2/F")}
- disabled={isAssigning}
- sx={{ minWidth: 120 }}
- >
- {t("Release 2/F")}
- </Button>
- <Button
- variant="outlined"
- color="secondary"
- onClick={() => handleReleaseByStore("4/F")}
- disabled={isAssigning}
- sx={{ minWidth: 120 }}
- >
- {t("Release 4/F")}
- </Button>
- </Stack>
- </Box>
- )}
-
- <DoInfoCard />
- <DoLineTable />
- <Stack direction="row" justifyContent="flex-end" gap={1}>
- <Button
- variant="outlined"
- startIcon={<ArrowBackIcon />}
- onClick={handleBack}
- >
- {t("Back")}
- </Button>
- </Stack>
- </Stack>
- </FormProvider>
- </>
- }
-
- export default DoDetail;
|