fix
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
const TAG_MIME_TYPES = ['application/x-papercrate-tag', 'text/papercrate-tag'];
|
||||
const TAG_TEXT_MIME_TYPE = 'text/plain';
|
||||
|
||||
const serializePayload = (payload) => {
|
||||
try {
|
||||
return JSON.stringify(payload);
|
||||
} catch (error) {
|
||||
console.warn('[tagTransfer] Failed to serialize payload', error);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
export const createTagTransferPayload = (tag, sourceDocId = null) => {
|
||||
if (!tag || !tag.id) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return {
|
||||
id: tag.id,
|
||||
label: tag.label || '',
|
||||
sourceDocId: sourceDocId ?? null,
|
||||
};
|
||||
};
|
||||
|
||||
export const writeTagTransferData = (dataTransfer, tag, sourceDocId = null) => {
|
||||
if (!dataTransfer) {
|
||||
return;
|
||||
}
|
||||
|
||||
const payload = createTagTransferPayload(tag, sourceDocId);
|
||||
if (!payload) {
|
||||
return;
|
||||
}
|
||||
|
||||
const serialized = serializePayload(payload);
|
||||
if (!serialized) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
dataTransfer.setData(TAG_MIME_TYPES[0], serialized);
|
||||
dataTransfer.setData(TAG_MIME_TYPES[1], serialized);
|
||||
if (payload.label) {
|
||||
dataTransfer.setData(TAG_TEXT_MIME_TYPE, payload.label);
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn('[tagTransfer] Failed to write drag data', error);
|
||||
}
|
||||
};
|
||||
|
||||
export const readTagTransferData = (dataTransfer) => {
|
||||
if (!dataTransfer) {
|
||||
return null;
|
||||
}
|
||||
|
||||
for (let index = 0; index < TAG_MIME_TYPES.length; index += 1) {
|
||||
const type = TAG_MIME_TYPES[index];
|
||||
try {
|
||||
const raw = dataTransfer.getData(type);
|
||||
if (raw) {
|
||||
return raw;
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn('[tagTransfer] Failed to read drag data for type', type, error);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
export const parseTagTransferPayload = (input) => {
|
||||
const dataTransfer = input && 'dataTransfer' in input ? input.dataTransfer : input;
|
||||
const raw = readTagTransferData(dataTransfer);
|
||||
if (!raw) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return JSON.parse(raw);
|
||||
} catch (error) {
|
||||
console.warn('[tagTransfer] Failed to parse drag payload', error);
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
export const isTagTransferEvent = (event) => {
|
||||
const types = event?.dataTransfer?.types;
|
||||
if (!types) {
|
||||
return false;
|
||||
}
|
||||
const typeList = Array.isArray(types) ? types : Array.from(types);
|
||||
return TAG_MIME_TYPES.some((type) => typeList.includes(type));
|
||||
};
|
||||
|
||||
export { TAG_MIME_TYPES };
|
||||
Reference in New Issue
Block a user