Viewing File: /home/maglabs/marco/wp-content/plugins/extendify/src/Draft/Draft.jsx

import { BaseControl, Panel, PanelBody } from '@wordpress/components';
import { useSelect } from '@wordpress/data';
import { useEffect, useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
import { updateUserMeta } from '@draft/api/WPApi';
import { Completion } from '@draft/components/Completion';
import { DraftMenu } from '@draft/components/DraftMenu';
import { EditMenu } from '@draft/components/EditMenu';
import { Input } from '@draft/components/Input';
import { InsertMenu } from '@draft/components/InsertMenu';
import { useCompletion } from '@draft/hooks/useCompletion';

export const Draft = () => {
	const [inputText, setInputText] = useState('');
	const [ready, setReady] = useState(false);
	const [prompt, setPrompt] = useState({
		text: '',
		promptType: '',
		systemMessageKey: '',
	});
	const { completion, loading, error } = useCompletion(
		prompt.text,
		prompt.promptType,
		prompt.systemMessageKey,
	);
	const selectedBlockClientIds = useSelect(
		(select) => select('core/block-editor').getSelectedBlockClientIds(),
		[],
	);
	const { getBlock } = useSelect((select) => select('core/block-editor'), []);
	const {
		userId,
		showAIConsent,
		consentTermsUrl,
		userGaveConsent: gaveBefore,
	} = window.extDraftData;
	// TODO: move to global state
	const [userGaveConsent, setUserGaveConsent] = useState(gaveBefore === '1');
	const needsConsent = showAIConsent && !userGaveConsent;

	const userAcceptsTerms = async () => {
		setUserGaveConsent(true);
		window.extDraftData.userGaveConsent = '1';
		await updateUserMeta(userId, 'extendify_ai_consent', true);
	};
	// TODO: When doing a rewrite, make this global state
	useEffect(() => {
		// Allow for external udpates
		const handle = (event) => {
			if (needsConsent) return;
			setPrompt(event.detail);
		};
		window.addEventListener('extendify-draft:set-prompt', handle);
		return () =>
			window.removeEventListener('extendify-draft:set-prompt', handle);
	}, [needsConsent]);

	// Reset input text when an error occurs
	useEffect(() => {
		if (!error) return;
		setInputText(prompt.text);
	}, [error, prompt.text]);

	const canEditContent = () => {
		if (selectedBlockClientIds.length === 0) {
			return false;
		}
		const targetBlock = getBlock(selectedBlockClientIds[0]);
		if (!targetBlock) {
			return false;
		}
		return (
			typeof targetBlock?.attributes?.content !== 'undefined' &&
			targetBlock?.attributes?.content !== ''
		);
	};

	return (
		<>
			<Panel>
				<PanelBody>
					<div className="rounded-sm border-none bg-gray-100 overflow-hidden mb-4">
						<Input
							inputText={inputText}
							setInputText={setInputText}
							ready={ready}
							setReady={setReady}
							setPrompt={setPrompt}
							loading={loading}
						/>
						{completion && (
							<>
								<hr className="mx-5 my-0 border-gray-300" />
								<Completion completion={completion} />
							</>
						)}
						{error && (
							<div className="px-4 mb-4 mt-2">
								<p className="m-0 text-xs font-semibold text-red-500">
									{error.message}
								</p>
							</div>
						)}
					</div>
					{(completion || loading) && !error && (
						<InsertMenu
							prompt={prompt}
							completion={completion}
							setPrompt={setPrompt}
							setInputText={setInputText}
							loading={loading}
						/>
					)}
					{!loading && !completion && canEditContent() && (
						<BaseControl label={__('Edit or review', 'extendify-local')}>
							<EditMenu
								completion={completion}
								disabled={loading}
								setInputText={setInputText}
								setPrompt={setPrompt}
							/>
						</BaseControl>
					)}
					{!loading && !completion && !canEditContent() && (
						<BaseControl label={__('Draft with AI', 'extendify-local')}>
							<DraftMenu
								disabled={loading}
								setInputText={setInputText}
								setReady={setReady}
							/>
						</BaseControl>
					)}
					{needsConsent && (
						<div className="bg-black/75 rounded w-full h-full p-6 absolute inset-0 items-center justify-center">
							<div className="bg-white p-4 rounded">
								<h2 className="text-lg mt-0 mb-2">
									{__('Terms of Use', 'extendify-local')}
								</h2>
								<p className="m-0">
									{
										// translators: at the end of the sentence, there is a link to the terms of use
										__(
											'In order to use the AI-powered content drafting tool, you must agree to the terms of use. For more information, click on this link:',
											'extendify-local',
										)
									}{' '}
									<a href={consentTermsUrl} target="_blank" rel="noreferrer">
										{__('Terms of Use', 'extendify-local')}
									</a>
								</p>
								<button
									className="mt-4 bg-wp-theme-500 text-white rounded px-4 py-2 border-0 text-center w-full cursor-pointer"
									type="button"
									onClick={() => userAcceptsTerms()}>
									{__('Accept', 'extendify-local')}
								</button>
							</div>
						</div>
					)}
				</PanelBody>
			</Panel>
			{window.extendifyData?.devbuild && (
				<Panel>
					<PanelBody title="Debug" initialOpen={false}>
						<label>prompt text:</label>
						<pre className="whitespace-pre-wrap">{prompt.text}</pre>
						<label>prompt system message:</label>
						<pre className="whitespace-pre-wrap">{prompt.systemMessageKey}</pre>
						<label>completion:</label>
						<pre className="whitespace-pre-wrap">{completion}</pre>
						<label>error:</label>
						<pre className="whitespace-pre-wrap">{error?.message ?? ''}</pre>
						<label>
							loading: {loading ? <span>true</span> : <span>false</span>}
						</label>
					</PanelBody>
				</Panel>
			)}
		</>
	);
};
Back to Directory File Manager