export const TAB_DRAG_MIME = 'application/x-farmcontrol-tab' export const TAB_DRAG_TEXT_PREFIX = 'farmcontrol-tab:' export const hasExternalTabDrag = (event) => { const types = event?.dataTransfer?.types if (!types) return false const list = Array.from(types) return ( list.includes(TAB_DRAG_MIME) || list.includes('text/plain') || list.includes('text/uri-list') ) } export const writeTabDragData = (event, payload) => { const serialized = JSON.stringify(payload) try { event.dataTransfer.setData(TAB_DRAG_MIME, serialized) } catch { // Some engines only allow text/plain during dragstart. } event.dataTransfer.setData('text/plain', `${TAB_DRAG_TEXT_PREFIX}${serialized}`) } export const readTabDragData = (event) => { const transfer = event?.dataTransfer if (!transfer) return null const custom = (() => { try { return transfer.getData(TAB_DRAG_MIME) } catch { return '' } })() const plain = (() => { try { return transfer.getData('text/plain') } catch { return '' } })() const raw = custom ? custom : plain.startsWith(TAB_DRAG_TEXT_PREFIX) ? plain.slice(TAB_DRAG_TEXT_PREFIX.length) : '' if (!raw) return null try { const parsed = JSON.parse(raw) if (!parsed?.tab?.id) return null return parsed } catch { return null } }