client/src/drop.ts (30 lines of code) (raw):
import { CSSObject } from "@emotion/react";
import { palette } from "@guardian/source-foundations";
import React from "react";
import { buildPayloadAndType, PayloadAndType } from "./types/PayloadAndType";
export interface IsDropTargetProps {
isDropTarget: boolean;
}
const GRID_DATA_TRANSFER_TYPE = "application/vnd.asset-handle+json";
export const isGridDragEvent = (event: React.DragEvent<HTMLElement>) =>
event?.dataTransfer?.types?.includes(GRID_DATA_TRANSFER_TYPE);
export const convertGridDragEventToPayload = (
event: React.DragEvent<HTMLElement>
): PayloadAndType | null => {
const { source, sourceType, ...payload } = JSON.parse(
event?.dataTransfer?.getData(GRID_DATA_TRANSFER_TYPE)
);
return buildPayloadAndType(`${source}-${sourceType}`, payload) || null;
};
export const dropTargetCss: CSSObject = {
background: palette.neutral["60"],
color: palette.neutral["20"],
opacity: "80%",
position: "absolute",
top: 0,
bottom: 0,
left: 0,
right: 0,
zIndex: 9999999,
border: `4px dashed ${palette.neutral["20"]}`,
};