import { useState, useEffect } from "@wordpress/element";
import { __ } from "@wordpress/i18n";
import Toggle from "react-toggle";
import Select from "react-select";
import { SelectField } from "../../../components";
import { saveSettingOptions, renderInfoText, SaveAndReset } from "./functions";
const jsToPhpBool = (val) => {
return val ? "1" : "0";
};
const phpToJsBool = {
0: false,
1: true,
};
export const SiteAvailability = ({ settingsOptions, setSettingsOptions }) => {
const [initialValues, setInitialValues] = useState({
siteMode: settingsOptions?.pcp_site_mode || "live",
selectPage: settingsOptions?.pcp_select_page || "",
});
const [siteMode, setSiteMode] = useState(initialValues.siteMode);
const [selectPage, setSelectPage] = useState(initialValues.selectPage);
const [pages, setPages] = useState([]);
const [isSaving, setIsSaving] = useState(false);
const isChanged = initialValues.siteMode !== siteMode || initialValues.selectPage !== selectPage;
const saveSiteAvailabilityOptions = (actionType = "save") => {
const updatedSettings = {
pcp_site_mode: siteMode,
pcp_select_page: selectPage,
};
setIsSaving(true);
saveSettingOptions(updatedSettings, actionType, setSettingsOptions).then(() => {
setInitialValues({
siteMode,
selectPage,
});
setIsSaving(false);
});
};
return (
{__("Site Mode", "post-carousel")}
{renderInfoText("siteMode")}
setSiteMode(val)}
items={[
{ label: __("Live", "post-carousel"), value: "live" },
{
label: __("Coming Soon (Pro)", "post-carousel"),
value: "coming_soon",
disabled: true,
},
{
label: __("Maintenance (Pro)", "post-carousel"),
value: "maintenance",
disabled: true,
},
]}
/>
{siteMode !== "live" && (
{__("Select Page", "post-carousel")}
setSelectPage(val)}
items={pages}
defaultOption={true}
/>
)}
saveSiteAvailabilityOptions("save")}
isChanged={isChanged}
isSaving={isSaving}
/>
);
};
export const Advanced = ({ settingsOptions, setSettingsOptions }) => {
const [initialValues, setInitialValues] = useState({
cleanDataOnDelete: phpToJsBool[settingsOptions?.pcp_delete_all_data] || false,
});
const [isSaving, setIsSaving] = useState(false);
const [cleanDataOnDelete, setCleanDataOnDelete] = useState(initialValues.cleanDataOnDelete);
const isChanged = initialValues.cleanDataOnDelete !== cleanDataOnDelete;
const saveAdvancedControls = (actionType = "save") => {
const newCleanOnDelete = cleanDataOnDelete;
const updatedSettings = {
pcp_delete_all_data: jsToPhpBool(newCleanOnDelete),
};
setIsSaving(true);
saveSettingOptions(updatedSettings, actionType, setSettingsOptions).then(() => {
setInitialValues({
cleanDataOnDelete: newCleanOnDelete,
});
setIsSaving(false);
});
};
return (
{__("Clean-up Data on Deletion", "post-carousel")}
{renderInfoText("cleanOnDeletion")}
setCleanDataOnDelete(!cleanDataOnDelete)}
/>
saveAdvancedControls("save")} isChanged={isChanged} isSaving={isSaving} />
);
};
export const Tools = ({ setPage }) => {
const [exportType, setExportType] = useState("all-shows");
const [selectedFile, setSelectedFile] = useState(null);
const [fileName, setFileName] = useState(__("No File Choosen", "post-carousel"));
const [shortcodeList, setShortcodeList] = useState([]);
const [selectedShortcodes, setSelectedShortcodes] = useState([]);
const [isImporting, setIsImporting] = useState(false);
const [isDragging, setIsDragging] = useState(false);
// Fetch shortcode list using AJAX
useEffect(() => {
const formData = new FormData();
formData.append("action", "pcp_get_shortcode_list_for_export");
fetch(ajaxurl, {
method: "POST",
body: formData,
})
.then((response) => response.json())
.then((data) => {
if (data.success && Array.isArray(data.data)) {
const list = data.data.map((post) => ({
label: post.title || `#${post.id}`,
value: post.id,
}));
setShortcodeList(list);
} else {
setShortcodeList([]);
}
})
.catch((error) => {
console.error("Error fetching shortcode list:", error);
setShortcodeList([]);
});
}, []);
const handleFileChange = (e) => {
const file = e.target.files[0];
if (file) {
setSelectedFile(file);
setFileName(file.name);
}
};
const handleDragEnter = (e) => {
e.preventDefault();
e.stopPropagation();
setIsDragging(true);
};
const handleDragLeave = (e) => {
e.preventDefault();
e.stopPropagation();
// Only set dragging to false if leaving the actual drop zone
if (e.target === e.currentTarget) {
setIsDragging(false);
}
};
const handleDragOver = (e) => {
e.preventDefault();
e.stopPropagation();
};
const handleDrop = (e) => {
e.preventDefault();
e.stopPropagation();
setIsDragging(false);
const files = e.dataTransfer.files;
if (files && files.length > 0) {
const file = files[0];
const acceptedExtensions = ['.json', '.csv'];
const fileExtension = file.name.substring(file.name.lastIndexOf('.')).toLowerCase();
if (acceptedExtensions.includes(fileExtension)) {
setSelectedFile(file);
setFileName(file.name);
} else {
alert(__("Please select a valid JSON or CSV file.", "post-carousel"));
}
}
};
const handleExport = () => {
// Export functionality
const exportValue = exportType === "all-shows" ? "all_shortcodes" : "selected_shortcodes";
const selectedShortcode = exportValue === "selected_shortcodes" ? selectedShortcodes.join(",") : "all_shortcodes";
if (
exportValue === "all_shortcodes" ||
(exportValue === "selected_shortcodes" && selectedShortcodes.length > 0)
) {
const formData = new FormData();
formData.append("action", "pcp_export_shortcodes");
formData.append("pcp_ids", selectedShortcode);
fetch(ajaxurl, {
method: "POST",
body: formData,
})
.then((response) => response.text())
.then((resp) => {
if (resp) {
// Convert JSON Array to string.
let json;
try {
const parsed = JSON.parse(resp);
json = JSON.stringify(parsed);
} catch {
json = JSON.stringify(resp);
}
// Convert JSON string to BLOB.
const blob = new Blob([json], { type: "application/json" });
const link = document.createElement("a");
const timestamp = Date.now();
link.href = window.URL.createObjectURL(blob);
link.download = "smart-post-show-" + timestamp + ".json";
link.click();
}
});
}
};
const handleImport = () => {
// Import functionality
if (selectedFile) {
setIsImporting(true);
const reader = new FileReader();
reader.onload = (e) => {
const fileContent = e.target.result;
const formData = new FormData();
formData.append("action", "pcp_import_shortcodes");
formData.append("shortcode", fileContent);
fetch(ajaxurl, {
method: "POST",
body: formData,
})
.then((response) => response.json())
.then((data) => {
setIsImporting(false);
if (data.success) {
// alert(__("Import successful!", "post-carousel"));
setSelectedFile(null);
setFileName(__("No File Choosen", "post-carousel"));
setPage("savedTemplate");
} else {
alert(data.data?.message || __("Import failed.", "post-carousel"));
}
})
.catch((error) => {
setIsImporting(false);
console.error("Import error:", error);
alert(__("Import failed.", "post-carousel"));
});
};
reader.readAsText(selectedFile);
}
};
return (
{__("Export", "post-carousel")}
{__("Import", "post-carousel")}
);
};