payment info updates
This commit is contained in:
@@ -43,16 +43,28 @@ export const loader = async ({ request }: LoaderFunctionArgs) => {
|
|||||||
return cors(Response.json({ showPaymentInstructions: false, reason: "no-iban-or-disabled" }));
|
return cors(Response.json({ showPaymentInstructions: false, reason: "no-iban-or-disabled" }));
|
||||||
}
|
}
|
||||||
|
|
||||||
const { admin } = await unauthenticated.admin(shop);
|
|
||||||
let orderInfo: OrderInfo | null = null;
|
let orderInfo: OrderInfo | null = null;
|
||||||
try {
|
try {
|
||||||
|
const { admin } = await unauthenticated.admin(shop);
|
||||||
orderInfo = await fetchOrderInfo(admin, orderGid);
|
orderInfo = await fetchOrderInfo(admin, orderGid);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
const msg = (err as Error)?.message ?? String(err);
|
||||||
console.warn(`payment-info: failed to load order ${orderGid} for ${shop}:`, err);
|
console.warn(`payment-info: failed to load order ${orderGid} for ${shop}:`, err);
|
||||||
return cors(Response.json({ showPaymentInstructions: false, error: "order-load-failed" }, { status: 502 }));
|
return cors(
|
||||||
|
Response.json(
|
||||||
|
{ showPaymentInstructions: false, error: "order-load-failed", detail: msg.slice(0, 500) },
|
||||||
|
{ status: 502 },
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
if (!orderInfo || !orderInfo.isManual) {
|
if (!orderInfo || !orderInfo.isManual) {
|
||||||
return cors(Response.json({ showPaymentInstructions: false, reason: "not-manual-payment" }));
|
return cors(
|
||||||
|
Response.json({
|
||||||
|
showPaymentInstructions: false,
|
||||||
|
reason: "not-manual-payment",
|
||||||
|
debug: { shop, orderGid, hasOrder: !!orderInfo, txCount: orderInfo?.txCount ?? 0, manualFlags: orderInfo?.manualFlags ?? [] },
|
||||||
|
}),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const language = pickLanguage(orderInfo.customerLocale ?? settings.defaultLanguage);
|
const language = pickLanguage(orderInfo.customerLocale ?? settings.defaultLanguage);
|
||||||
@@ -113,6 +125,8 @@ interface OrderInfo {
|
|||||||
currency: string;
|
currency: string;
|
||||||
orderName: string;
|
orderName: string;
|
||||||
customerLocale?: string;
|
customerLocale?: string;
|
||||||
|
txCount: number;
|
||||||
|
manualFlags: Array<{ status?: string; manual?: boolean }>;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function fetchOrderInfo(
|
async function fetchOrderInfo(
|
||||||
@@ -161,5 +175,7 @@ async function fetchOrderInfo(
|
|||||||
currency: o.currencyCode ?? "EUR",
|
currency: o.currencyCode ?? "EUR",
|
||||||
orderName: o.name ?? "",
|
orderName: o.name ?? "",
|
||||||
customerLocale: o.customerLocale ?? undefined,
|
customerLocale: o.customerLocale ?? undefined,
|
||||||
|
txCount: txs.length,
|
||||||
|
manualFlags: txs.map((t) => ({ status: t.status, manual: t.manualPaymentGateway })),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ export default async () => {
|
|||||||
function Extension() {
|
function Extension() {
|
||||||
const shopify = (globalThis as any).shopify;
|
const shopify = (globalThis as any).shopify;
|
||||||
const [data, setData] = useState<PaymentInstructions | null>(null);
|
const [data, setData] = useState<PaymentInstructions | null>(null);
|
||||||
|
const [debug, setDebug] = useState<string>("init");
|
||||||
const [done, setDone] = useState(false);
|
const [done, setDone] = useState(false);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -49,21 +50,25 @@ function Extension() {
|
|||||||
async function load() {
|
async function load() {
|
||||||
try {
|
try {
|
||||||
const orderId: string | undefined = shopify?.orderConfirmation?.value?.order?.id;
|
const orderId: string | undefined = shopify?.orderConfirmation?.value?.order?.id;
|
||||||
|
setDebug(`orderId=${orderId ?? "(none)"}`);
|
||||||
if (!orderId) {
|
if (!orderId) {
|
||||||
setDone(true);
|
setDone(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const token: string = await shopify.sessionToken.get();
|
const token: string = await shopify.sessionToken.get();
|
||||||
const appUrl = resolveAppUrl(shopify);
|
const appUrl = resolveAppUrl(shopify);
|
||||||
|
setDebug(`fetch ${appUrl} orderId=${orderId} tokenLen=${token?.length ?? 0}`);
|
||||||
const res = await fetch(
|
const res = await fetch(
|
||||||
`${appUrl}/api/public/payment-info?orderId=${encodeURIComponent(orderId)}`,
|
`${appUrl}/api/public/payment-info?orderId=${encodeURIComponent(orderId)}`,
|
||||||
{ headers: { Authorization: `Bearer ${token}` } },
|
{ headers: { Authorization: `Bearer ${token}` } },
|
||||||
);
|
);
|
||||||
|
const text = await res.text();
|
||||||
|
setDebug(`status=${res.status} body=${text.slice(0, 300)}`);
|
||||||
if (!res.ok) {
|
if (!res.ok) {
|
||||||
setDone(true);
|
setDone(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const json = (await res.json()) as {
|
const json = JSON.parse(text) as {
|
||||||
showPaymentInstructions: boolean;
|
showPaymentInstructions: boolean;
|
||||||
payload?: PaymentInstructions;
|
payload?: PaymentInstructions;
|
||||||
};
|
};
|
||||||
@@ -71,8 +76,8 @@ function Extension() {
|
|||||||
if (json.showPaymentInstructions && json.payload) {
|
if (json.showPaymentInstructions && json.payload) {
|
||||||
setData(json.payload);
|
setData(json.payload);
|
||||||
}
|
}
|
||||||
} catch {
|
} catch (err) {
|
||||||
// ignore — render nothing on error
|
setDebug(`error: ${(err as Error)?.message ?? String(err)}`);
|
||||||
} finally {
|
} finally {
|
||||||
if (!cancelled) setDone(true);
|
if (!cancelled) setDone(true);
|
||||||
}
|
}
|
||||||
@@ -87,7 +92,11 @@ function Extension() {
|
|||||||
return <s-skeleton-paragraph />;
|
return <s-skeleton-paragraph />;
|
||||||
}
|
}
|
||||||
if (!data) {
|
if (!data) {
|
||||||
return null;
|
return (
|
||||||
|
<s-section heading="Invoice payment debug">
|
||||||
|
<s-paragraph>{debug}</s-paragraph>
|
||||||
|
</s-section>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
Reference in New Issue
Block a user