import type { Point } from "@/entities/geodata";
import type { EventPlaceForm } from "@/features/place-form";
import { apiClient } from "@/shared/api";
import type { SendTx } from "@/shared/hooks";
import { parseUsdt } from "@/shared/lib/money/usdt";
import { submitEventPlaceRequest, updatePlace } from "@/shared/lib/web3";
import type { Account } from "thirdweb/wallets";
export const upsertPlaceW3 = async (
sendTx: SendTx<unknown>,
place: EventPlaceForm,
account?: Account,
editPlaceId?: number,
) => {
if (!account) throw "Account should be defined";
const {
maxTickets,
minPrice,
minTickets,
minDays,
daysBeforeCancel,
title,
geometry,
available,
eventDepositSize,
} = place;
if (!geometry) {
throw Error("Missing coordinates for the event place");
}
const formatedGeodata: Point = {
type: "point",
name: title,
coordinates: [geometry],
iconUrl: "",
};
const placeForm = new FormData();
placeForm.append("title", title);
placeForm.append("description", "foo");
placeForm.append("geometry", JSON.stringify(formatedGeodata));
const depositUnits = parseUsdt(eventDepositSize);
placeForm.append("eventDepositSize", depositUnits.toString());
const { data } = await apiClient.PUT("/api/ipfs/places/meta", {
// @ts-ignore
body: placeForm,
});
if (!data || !data.cid) throw new Error("No cid was recieved");
const minPriceUnits = parseUsdt(minPrice);
let promise: Promise<unknown>;
if (editPlaceId != null) {
console.log("editing existing event place with id", editPlaceId);
promise = updatePlace(
account,
BigInt(editPlaceId),
maxTickets,
minTickets,
minPriceUnits,
daysBeforeCancel,
minDays,
available,
data.cid,
depositUnits,
);
} else {
promise = submitEventPlaceRequest(
account,
maxTickets,
minTickets,
minPriceUnits,
daysBeforeCancel,
minDays,
available,
data.cid,
depositUnits,
);
}
sendTx(promise);
await promise;
};