import { useEffect, useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
import apiFetch from '@wordpress/api-fetch';
import {
Button,
TextControl,
ToggleControl,
ToolbarDropdownMenu,
} from '@wordpress/components';
import { DropdownOption } from '@wordpress/components/build-types/dropdown-menu/types';
import { truncateString } from '@utils/strings';
import PageIcon from 'blockbite-icons/dist/Pencil1';
import { Icon as IconComp } from '@components/ui/Icon';
interface LinkPickerProps {
linkUrl: string;
linkTitle: string;
linkTarget: string;
linkTile: string;
showLinkTile: boolean;
parentCallback: (inlineSvg: any) => void;
}
interface Link {
id: number;
post_type: string;
title: string;
label?: string;
url: string;
}
function LinkList({
linkData,
onActiveLink,
}: {
linkData: Link[];
onActiveLink: (l: Link) => void;
}) {
const list: DropdownOption[] = [];
if (linkData == null) return [];
linkData.forEach((l) => {
// let usedIcon: IconType = () => ;
let title = `${l.label || l.title} – ${l.url}`;
/*
switch (l.post_type) {
case 'page':
usedIcon = PageIcon;
break;
case 'post':
usedIcon = PageIcon;
break;
case 'blockbites':
usedIcon = PageIcon;
break;
case 'custom':
usedIcon = PageIcon;
break;
default:
usedIcon = PageIcon;
}
*/
// truncate title if too long
title = truncateString(title, 72);
list.push({
title,
onClick: () => onActiveLink(l),
});
});
return list;
}
export default function LinkPicker({
linkUrl,
linkTitle,
linkTarget,
linkTile,
showLinkTile,
parentCallback,
}: LinkPickerProps) {
const [isError] = useState(false);
const [isEditing, setIsEditing] = useState(true);
const [stateUrl, setStateUrl] = useState('');
const [stateTitle, setStateTitle] = useState('');
const [stateTarget, setStateTarget] = useState(false);
const [stateTile, setStateTile] = useState(false);
const [activeKeyword, setActiveKeyword] = useState('');
const [linkData, setLinkData] = useState([]);
const [activeLink, setActiveLink] = useState(null);
useEffect(() => {
if (linkTarget === '_blank') {
setStateTarget(true);
}
if (linkTile) {
setStateTile(true);
}
if (linkUrl) {
setStateUrl(linkUrl);
setIsEditing(false);
}
if (linkTitle) {
setStateTitle(linkTitle);
}
}, []);
// get link object
const getLinkObject = () => {
const link = {
linkTile: '',
linkTarget: '_self',
} as {
linkTitle?: string;
linkUrl?: string;
linkTile?: string;
linkTarget?: string;
};
if (stateTitle) {
link['linkTitle'] = stateTitle;
}
if (stateUrl) {
link['linkUrl'] = stateUrl;
}
link.linkTile = linkTile;
link.linkTarget = stateTarget ? '_blank' : '_self';
return link;
};
useEffect(() => {
let newLink = { ...getLinkObject() };
parentCallback(newLink);
}, [stateTitle, stateUrl, stateTarget, stateTile]);
useEffect(() => {
if (activeKeyword === '') return;
setLinkData(null);
apiFetch({
path: `/blockbite/v1/block-helpers/get-links/${activeKeyword}`,
}).then((links: Link[]) => {
if (links.length) {
setLinkData([...links]);
} else {
setLinkData([]);
}
});
}, [activeKeyword]);
useEffect(() => {
if (activeLink?.url != null && activeLink?.url !== '') {
const newLink = { ...getLinkObject() };
newLink.linkTitle = activeLink.title;
newLink.linkUrl = activeLink.url;
setStateTitle(activeLink.title);
setStateUrl(activeLink.url);
parentCallback(newLink);
}
}, [activeLink]);
const linksList = [
...LinkList({
linkData: [
...(linkData ? linkData : []),
...(activeKeyword
? [
{
id: 0,
post_type: 'custom',
title: '',
label: 'Custom link',
url: activeKeyword,
},
]
: []),
],
onActiveLink: (link) => {
setActiveLink({ ...link });
setIsEditing(false);
setActiveKeyword('');
},
}),
];
return (
}
label="Change link"
controls={isEditing ? linksList : []}
children={() => {
return (
{isError &&
{isError}}
{isEditing ? (
setActiveKeyword(value)}
help={__('Type a post, page, title', 'blockbitelinks')}
autoComplete="off"
/>
) : (
{stateTitle}
{stateTitle && stateUrl &&
}
{stateUrl}
)}
{showLinkTile && (
setStateTile(value)}
/>
)}
);
}}
/>
);
}