diff --git a/src/components/ModCanvastools.jsx b/src/components/ModCanvastools.jsx index 7a43e9e..b701e8b 100644 --- a/src/components/ModCanvastools.jsx +++ b/src/components/ModCanvastools.jsx @@ -7,7 +7,7 @@ import { useSelector, shallowEqual } from 'react-redux'; import { t } from 'ttag'; import useInterval from './hooks/interval'; -import { getToday, dateToString, coordsFromUrl } from '../core/utils'; +import { getToday, dateToString, coordsFromString } from '../core/utils'; import { shardOrigin } from '../store/actions/fetch'; const keptState = { @@ -278,8 +278,11 @@ function ModCanvastools() { placeholder="X_Y or URL" onChange={(evt) => { let co = evt.target.value.trim(); - co = coordsFromUrl(co) || co; - evt.target.value = co; + co = coordsFromString(co); + if (co) { + co = co.join('_'); + evt.target.value = co; + } keptState.coords = co; }} /> @@ -343,8 +346,11 @@ function ModCanvastools() { placeholder="X_Y or URL" onChange={(evt) => { let co = evt.target.value.trim(); - co = coordsFromUrl(co) || co; - evt.target.value = co; + co = coordsFromString(co); + if (co) { + co = co.join('_'); + evt.target.value = co; + } keptState.tlcoords = co; }} /> @@ -362,8 +368,11 @@ function ModCanvastools() { placeholder="X_Y or URL" onChange={(evt) => { let co = evt.target.value.trim(); - co = coordsFromUrl(co) || co; - evt.target.value = co; + co = coordsFromString(co); + if (co) { + co = co.join('_'); + evt.target.value = co; + } keptState.brcoords = co; }} /> @@ -420,8 +429,11 @@ function ModCanvastools() { placeholder="X_Y or URL" onChange={(evt) => { let co = evt.target.value.trim(); - co = coordsFromUrl(co) || co; - evt.target.value = co; + co = coordsFromString(co); + if (co) { + co = co.join('_'); + evt.target.value = co; + } keptState.tlrcoords = co; }} /> @@ -439,8 +451,11 @@ function ModCanvastools() { placeholder="X_Y or URL" onChange={(evt) => { let co = evt.target.value.trim(); - co = coordsFromUrl(co) || co; - evt.target.value = co; + co = coordsFromString(co); + if (co) { + co = co.join('_'); + evt.target.value = co; + } keptState.brrcoords = co; }} /> @@ -507,8 +522,11 @@ function ModCanvastools() { placeholder="X_Y or URL" onChange={(evt) => { let co = evt.target.value.trim(); - co = coordsFromUrl(co) || co; - evt.target.value = co; + co = coordsFromString(co); + if (co) { + co = co.join('_'); + evt.target.value = co; + } keptState.tlccoords = co; }} /> @@ -526,8 +544,11 @@ function ModCanvastools() { placeholder="X_Y or URL" onChange={(evt) => { let co = evt.target.value.trim(); - co = coordsFromUrl(co) || co; - evt.target.value = co; + co = coordsFromString(co); + if (co) { + co = co.join('_'); + evt.target.value = co; + } keptState.brccoords = co; }} /> diff --git a/src/components/ModWatchtools.jsx b/src/components/ModWatchtools.jsx index 7f242bb..852e0d4 100644 --- a/src/components/ModWatchtools.jsx +++ b/src/components/ModWatchtools.jsx @@ -8,7 +8,7 @@ import { useSelector, shallowEqual } from 'react-redux'; import { t } from 'ttag'; import copyTextToClipboard from '../utils/clipboard'; -import { parseInterval, coordsFromUrl } from '../core/utils'; +import { parseInterval, coordsFromString } from '../core/utils'; import { shardOrigin } from '../store/actions/fetch'; const keepState = { @@ -185,8 +185,11 @@ function ModWatchtools() { placeholder="X_Y or URL" onChange={(evt) => { let co = evt.target.value.trim(); - co = coordsFromUrl(co) || co; - evt.target.value = co; + co = coordsFromString(co); + if (co) { + co = co.join('_'); + evt.target.value = co; + } keepState.tlcoords = co; }} /> @@ -204,8 +207,11 @@ function ModWatchtools() { placeholder="X_Y or URL" onChange={(evt) => { let co = evt.target.value.trim(); - co = coordsFromUrl(co) || co; - evt.target.value = co; + co = coordsFromString(co); + if (co) { + co = co.join('_'); + evt.target.value = co; + } keepState.brcoords = co; }} /> diff --git a/src/components/TemplateItemEdit.jsx b/src/components/TemplateItemEdit.jsx index ca6ca5d..169e3bc 100644 --- a/src/components/TemplateItemEdit.jsx +++ b/src/components/TemplateItemEdit.jsx @@ -9,7 +9,7 @@ import { useSelector, shallowEqual } from 'react-redux'; import { t } from 'ttag'; import templateLoader from '../ui/templateLoader'; -import { coordsFromUrl } from '../core/utils'; +import { coordsFromString } from '../core/utils'; const TemplateItemEdit = ({ title: initTitle, @@ -18,13 +18,13 @@ const TemplateItemEdit = ({ imageId, stopEditing, }) => { - const [initCoords, initDimensions] = useMemo(() => [ + const [initCoords] = useMemo(() => [ (Number.isNaN(parseInt(initX, 10)) || Number.isNaN(parseInt(initY, 10))) ? null : [initX, initY], ], [initX, initY]); const [coords, setCoords] = useState(initCoords); - const [dimensions, setDimensions] = useState(initDimensions); + const [dimensions, setDimensions] = useState(null); const [title, setTitle] = useState(initTitle || ''); const [file, setFile] = useState(null); const [titleUnique, setTitleUnique] = useState(true); @@ -148,14 +148,11 @@ const TemplateItemEdit = ({ }} placeholder="X_Y or URL" onChange={(evt) => { - let co = evt.target.value.trim(); - co = coordsFromUrl(co) || co; - evt.target.value = co; - const newCoords = co.split('_').map((z) => parseInt(z, 10)); - setCoords( - (!newCoords.some(Number.isNaN) && newCoords.length === 2) - ? newCoords : null, - ); + const co = coordsFromString(evt.target.value.trim()); + if (co) { + evt.target.value = co.join('_'); + } + setCoords(co); }} />

diff --git a/src/core/utils.js b/src/core/utils.js index da0f488..1789262 100644 --- a/src/core/utils.js +++ b/src/core/utils.js @@ -471,25 +471,31 @@ export function getDateTimeString(timestamp) { } /* - * get X_Y coordinates out of URL + * get X_Y coordinates out of url or x_y or x,y string * @param url url ending with #canas,x,y,z coords - * @return coordinates in X_Y form or null + * @return coordinates in [x,y] array or null */ -export function coordsFromUrl(url) { +export function coordsFromString(url) { let splitInd = url.lastIndexOf('#'); - if (splitInd === -1) { - return null; - } - let part = url.slice(splitInd + 1); - splitInd = part.indexOf('?'); + let coords = []; if (splitInd !== -1) { - part = part.slice(0, splitInd); + let part = url.slice(splitInd + 1); + splitInd = part.indexOf('?'); + if (splitInd !== -1) { + part = part.slice(0, splitInd); + } + coords = part.split(',').map((z) => parseInt(z, 10)).slice(1); } - const [, x, y] = part.split(','); - if (x && y) { - return `${x}_${y}`; + if (coords.length !== 2 || coords.some(Number.isNaN)) { + coords = url.split('_').map((z) => parseInt(z, 10)); } - return null; + if (coords.length !== 2 || coords.some(Number.isNaN)) { + coords = url.split(',').map((z) => parseInt(z, 10)); + } + if (coords.length !== 2 || coords.some(Number.isNaN)) { + coords = null; + } + return coords; } /*