import { useEntitySetContext } from "components/EntitySetProvider";
import { generateKeyBetween } from "fractional-indexing";
import { useCallback, useEffect, useState } from "react";
import { useEntity, useReplicache } from "src/replicache";
import { useUIState } from "src/useUIState";
import { BlockProps, BlockLayout } from "./Block";
import { v7 } from "uuid";
import { useSmoker } from "components/Toast";
import { Separator } from "components/Layout";
import { Input } from "components/Input";
import { isUrl } from "src/utils/isURL";
import { ButtonPrimary } from "components/Buttons";
import { BlockButtonSmall } from "components/Icons/BlockButtonSmall";
import { CheckTiny } from "components/Icons/CheckTiny";
import { LinkSmall } from "components/Icons/LinkSmall";
export const ButtonBlock = (props: BlockProps & { preview?: boolean }) => {
let { permissions } = useEntitySetContext();
let text = useEntity(props.entityID, "button/text");
let url = useEntity(props.entityID, "button/url");
let isSelected = useUIState((s) =>
s.selectedBlocks.find((b) => b.value === props.entityID),
);
if (!url) {
if (!permissions.write) return null;
return ;
}
return (
{text?.data.value}
);
};
const ButtonBlockSettings = (props: BlockProps) => {
let { rep } = useReplicache();
let smoker = useSmoker();
let entity_set = useEntitySetContext();
let isSelected = useUIState((s) =>
s.selectedBlocks.find((b) => b.value === props.entityID),
);
let isLocked = useEntity(props.entityID, "block/is-locked")?.data.value;
let [textValue, setTextValue] = useState("");
let [urlValue, setUrlValue] = useState("");
let text = textValue;
let url = urlValue;
let submit = async () => {
let entity = props.entityID;
if (!entity) {
entity = v7();
await rep?.mutate.addBlock({
permission_set: entity_set.set,
factID: v7(),
parent: props.parent,
type: "card",
position: generateKeyBetween(props.position, props.nextPosition),
newEntityID: entity,
});
}
// if no valid url prefix, default to https
if (
!urlValue.startsWith("http") &&
!urlValue.startsWith("mailto") &&
!urlValue.startsWith("tel:")
)
url = `https://${urlValue}`;
// these mutations = simpler subset of addLinkBlock
if (!rep) return;
await rep.mutate.assertFact({
entity: entity,
attribute: "block/type",
data: { type: "block-type-union", value: "button" },
});
await rep?.mutate.assertFact({
entity: entity,
attribute: "button/text",
data: {
type: "string",
value: text,
},
});
await rep?.mutate.assertFact({
entity: entity,
attribute: "button/url",
data: {
type: "string",
value: url,
},
});
};
return (
{text !== "" ? text : "Button"}
);
};