/*
This file is part of GNU Taler
(C) 2021 Taler Systems S.A.
GNU Taler is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation; either version 3, or (at your option) any later version.
GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
GNU Taler; see the file COPYING. If not, see
*/
/**
*
* @author Sebastian Javier Marchano (sebasjm)
*/
import { h, VNode, Fragment } from 'preact';
import { useState } from 'preact/hooks';
import { Loading } from "../../../../components/exception/loading.js";
import { NotificationCard } from "../../../../components/menu.js";
import { MerchantBackend, WithId } from "../../../../declaration.js";
import { HttpError } from "../../../../hooks/backend.js";
import { InstanceOrderFilter, useInstanceOrders, useOrderAPI, useOrderDetails } from "../../../../hooks/order.js";
import { useTranslator } from '../../../../i18n';
import { Notification } from "../../../../utils/types.js";
import { RefundModal } from "./Table.js";
import { ListPage } from "./ListPage.js";
interface Props {
onUnauthorized: () => VNode;
onLoadError: (error: HttpError) => VNode;
onNotFound: () => VNode;
onSelect: (id: string) => void;
onCreate: () => void;
}
export default function ({ onUnauthorized, onLoadError, onCreate, onSelect, onNotFound }: Props): VNode {
const [filter, setFilter] = useState({})
const [orderToBeRefunded, setOrderToBeRefunded] = useState(undefined)
const setNewDate = (date?: Date) => setFilter(prev => ({ ...prev, date }))
const result = useInstanceOrders(filter, setNewDate)
const { refundOrder, getPaymentURL } = useOrderAPI()
const [notif, setNotif] = useState(undefined)
if (result.clientError && result.isUnauthorized) return onUnauthorized()
if (result.clientError && result.isNotfound) return onNotFound()
if (result.loading) return
if (!result.ok) return onLoadError(result)
const isPaidActive = filter.paid === 'yes' ? "is-active" : ''
const isRefundedActive = filter.refunded === 'yes' ? "is-active" : ''
const isNotWiredActive = filter.wired === 'no' ? "is-active" : ''
const isAllActive = filter.paid === undefined && filter.refunded === undefined && filter.wired === undefined ? 'is-active' : ''
const i18n = useTranslator()
const [errorOrderId, setErrorOrderId] = useState(undefined)
async function testIfOrderExistAndSelect(orderId: string) {
if (!orderId) {
setErrorOrderId(i18n`Enter an order id`)
return;
}
try {
await getPaymentURL(orderId)
onSelect(orderId)
setErrorOrderId(undefined)
} catch {
setErrorOrderId(i18n`order not found`)
}
}
return
({ ...o, id: o.order_id }))}
onLoadMoreBefore={result.loadMorePrev} hasMoreBefore={!result.isReachingStart}
onLoadMoreAfter={result.loadMore} hasMoreAfter={!result.isReachingEnd}
onSelectOrder={(order) => onSelect(order.id)}
onRefundOrder={(value) => setOrderToBeRefunded(value)}
errorOrderId={errorOrderId}
isAllActive={isAllActive}
isNotWiredActive={isNotWiredActive}
isPaidActive={isPaidActive}
isRefundedActive={isRefundedActive}
jumpToDate={filter.date}
onCopyURL={(id) => getPaymentURL(id).then((resp) => copyToClipboard(resp.data))}
onCreate={onCreate}
onSearchOrderById={testIfOrderExistAndSelect}
onSelectDate={setNewDate}
onShowAll={() => setFilter({})}
onShowPaid={() => setFilter({ paid: 'yes' })}
onShowRefunded={() => setFilter({ refunded: 'yes' })}
onShowNotWired={() => setFilter({ wired: 'no' })}
/>
{orderToBeRefunded && setOrderToBeRefunded(undefined)}
onConfirm={(value) => refundOrder(orderToBeRefunded.order_id, value)
.then(() => setNotif({
message: i18n`refund created successfully`,
type: "SUCCESS"
}))
.catch((error) => setNotif({
message: i18n`could not create the refund`,
type: "ERROR",
description: error.message
}))
.then(() => setOrderToBeRefunded(undefined))}
onLoadError={(error) => {
setNotif({
message: i18n`could not create the refund`,
type: "ERROR",
description: error.message
});
setOrderToBeRefunded(undefined);
return ;
}}
onUnauthorized={onUnauthorized}
onNotFound={() => {
setNotif({
message: i18n`could not get the order to refund`,
type: "ERROR",
// description: error.message
});
setOrderToBeRefunded(undefined);
return ;
}} />}
}
interface RefundProps {
id: string;
onUnauthorized: () => VNode;
onLoadError: (error: HttpError) => VNode;
onNotFound: () => VNode;
onCancel: () => void;
onConfirm: (m: MerchantBackend.Orders.RefundRequest) => void;
}
function RefundModalForTable({ id, onUnauthorized, onLoadError, onNotFound, onConfirm, onCancel }: RefundProps) {
const result = useOrderDetails(id);
if (result.clientError && result.isUnauthorized) return onUnauthorized()
if (result.clientError && result.isNotfound) return onNotFound()
if (result.loading) return
if (!result.ok) return onLoadError(result)
return
}
async function copyToClipboard(text: string) {
return navigator.clipboard.writeText(text)
}