• Почему не работает srcset?

    @awenn2015
    Веб-программист самоучка
    На сколько я понял эти атрибуты работают не так как мы ожидаем, мол если в srcset стоит 320w то будет браться эта картинка когда <= 320px, там учитываются всякие dpi которые нам как разрабам не особо интересны, по этому проще использовать picture в связке с source чем это го**но не рабочее, что бы хоть раз я его еще решил заюзать, час думал почему он не работает нормально
    Ответ написан
    Комментировать
  • Как реализовать вращение массива?

    @awenn2015
    Веб-программист самоучка
    Если кто-то будет гуглить и не найдет для себя ответа на вопрос, то вот универсальная реализация, перемещение элемента со смещением соседей по индексам whom и where, может быть полезно в ui где с помощью drag&drop перемещаются элементы в списке или карточки, для вывода сортируясь по полю order

    interface Todo {
      id: number
      order: number
      title: string
    }
    
    interface Test {
      whom: number
      where: number
      expected: number[]
    }
    
    const data: Todo[] = [
      { id: 1, order: 1, title: 'delectus aut autem' },
      { id: 2, order: 2, title: 'quis ut nam facilis et officia qui' },
      { id: 3, order: 3, title: 'fugiat veniam minus' },
      { id: 4, order: 4, title: 'et porro tempora' },
      { id: 5, order: 5, title: 'laboriosam mollitia et enim quasi adipisci quia provident illum' },
      { id: 6, order: 6, title: 'qui ullam ratione quibusdam voluptatem quia omnis' },
      { id: 7, order: 7, title: 'illo expedita consequatur quia in' },
      { id: 8, order: 8, title: 'quo adipisci enim quam ut ab' },
      { id: 9, order: 9, title: 'molestiae perspiciatis ipsa' },
      { id: 10, order: 10, title: 'illo est ratione doloremque quia maiores aut' },
    ]
    
    function swapTodos(todos: Todo[], whom: number, where: number) {
      if (whom === where) return todos
    
      const result = (() => {
        if (whom < where) {
          const start = todos.slice(0, whom)
          const neighbors = todos.slice(whom + 1, where + 1)
          const tail = todos.slice(where + 1, todos.length)
    
          return [...start, ...neighbors, todos[whom], ...tail]
        } else {
          const start = todos.slice(0, where)
          const neighbors = todos.slice(where, whom)
          const tail = todos.slice(whom + 1, todos.length)
    
          return [...start, todos[whom], ...neighbors, ...tail]
        }
      })()
    
      return result.map((it, i) => ({ ...it, order: i + 1 }))
    }
    
    const tests: Test[] = [
      { whom: 1, where: 5, expected: [1, 3, 4, 5, 6, 2, 7, 8, 9, 10] },
      { whom: 0, where: 9, expected: [2, 3, 4, 5, 6, 7, 8, 9, 10, 1] },
      { whom: 4, where: 9, expected: [1, 2, 3, 4, 6, 7, 8, 9, 10, 5] },
      { whom: 8, where: 3, expected: [1, 2, 3, 9, 4, 5, 6, 7, 8, 10] },
      { whom: 9, where: 0, expected: [10, 1, 2, 3, 4, 5, 6, 7, 8, 9] },
      { whom: 9, where: 4, expected: [1, 2, 3, 4, 10, 5, 6, 7, 8, 9] },
    ]
    
    function runTests() {
      console.log('-----------------')
    
      for (const [i, { expected: expect, whom, where }] of tests.entries()) {
        console.log(`[Test ${i + 1} start]`)
    
        const result = swapTodos(data, whom, where)
        const compare = result.map((it) => it.id)
    
        if (JSON.stringify(compare) !== JSON.stringify(expect)) {
          console.warn(`[Test ${i + 1} failed]: Результат не соответствует тому что ожидалось`)
          console.log('Result => ', JSON.stringify(compare))
          console.log('Expected => ', JSON.stringify(expect))
        } else {
          console.log(`[Test ${i + 1} passed]: Тест успешно пройден`)
        }
    
        console.log('-----------------')
      }
    }
    
    export default runTests


    Ps: Обновление сортировки было моим личным требованием, если нужно можно убрать
    Ответ написан
    Комментировать
  • Как сделать рассылку n-ым подключенным клиентам?

    @awenn2015 Автор вопроса
    Веб-программист самоучка
    Все оказалось куда проще, решение такого, при каждом подключении сохраняю uuid пользователя в массив, при отключении соответственно удаляю, так как слушатели это простой массив то список uuid будет работать так же как и список слушателей, то есть они по идее должны быть синхронизированы по индексам, соответственно вот сама реализация рассылки

    public broadcast(type: string, receivers: string[], msg?: any) {
        const events = this.emitter.eventNames()
    
        if (!events.includes(type)) {
          console.warn('Предупреждение: такое событие не добавлено!')
          return
        }
    
        const list = receivers.map(id => this._players.indexOf(id))
        const listeners = this.emitter.listeners(type)
    
        for (const index of list) {
          const fn = listeners[index]
    
          if (typeof fn === 'function')
            fn(msg)
          else
            console.error(`Ошибка, под индексом ${index} нет слушателя!`)
        }
      }
    Ответ написан
    Комментировать
  • Как поменять порядок элементов в массиве?

    @awenn2015
    Веб-программист самоучка
    Может быть немного корявый но рабочий вариант, можно сделать проще если просто поле order местами менять и сортировать по нему

    type MoveData = ((dir: "left" | "right", i: number) => void)
    
    type TestItemProps = {
      data: { name: string }, i: number, onMove: MoveData
    }
    
    const TestItem: FC<TestItemProps> = ({ data, i, onMove }) => {
      return (
        <div>
          <div style={{ display: "flex", justifyContent: "space-between" }}>
            <span
              style={{ cursor: "pointer" }}
              onClick={() => onMove("left", i)}
            >◀</span>
            <span
              style={{ cursor: "pointer" }}
              onClick={() => onMove("right", i)}
            >▶</span>
          </div>
          <span>{data.name}</span>
        </div>
      )
    }
    
    function Test() {
      const [state, setState] = useState([
        { name: "Petya", order: 0 },
        { name: "Nikita", order: 1 },
        { name: "Sasha", order: 2 },
        { name: "Valera", order: 3 },
      ])
    
      const onMoveHandle: MoveData = (dir, prev) => {
        const isLeftBlock = prev === 0 && dir === "left"
        const isRightBlock = prev === state.length - 1 && dir === "right"
    
        if (isLeftBlock || isRightBlock) return
    
        const next = dir === "left" ? prev - 1 : prev + 1
    
        setState((past) => past.reduce((acc: { name: string, order: number }[], it, i, arr) => {
          if (![prev, next].includes(i))
            acc.push(it)
          else {
            if (i === prev) acc.push(arr[next])
            else acc.push(arr[prev])
          }
    
          return acc
        }, []))
      }
    
      return (
        <div style={{ display: "flex", columnGap: "10px" }}>
          {state.map((it, i) => (
            <TestItem
              data={it} i={i} onMove={onMoveHandle} key={i}
            />
          ))}
        </div>
      )
    }
    Ответ написан
    Комментировать
  • Как создать функцию, которая может изменять передаваемую в неё глобальную перменную JS?

    @awenn2015
    Веб-программист самоучка
    Учитывая что в js нельзя передавать переменную по ссылке через & то сомневаюсь, хотя могу ошибаться
    Ответ написан
    Комментировать
  • Как добавить несколько get параметров в url без перезагрузки страницы?

    @awenn2015
    Веб-программист самоучка
    Понимаю что поздно но мне тоже нужна была похожая штука, так что я смастерил это

    const url = new URL(window.location.href)
    url.searchParams.append("afterSending", "1")
    window.history.pushState(null, null, url);
    
    // window.location.href = url.toString()
    // window.location.replace(url.toString())
    Ответ написан
    Комментировать
  • Почему при добавлении R::freeze() перестает находить таблицы?

    @awenn2015 Автор вопроса
    Веб-программист самоучка
    Решил достаточно банальным способом, просто переименовал таблицы, нет желания копаться в доках и искать решение для этого соглашения
    Ответ написан
    Комментировать
  • Как сгенерировать случайное число для кода подтверждения?

    @awenn2015 Автор вопроса
    Веб-программист самоучка
    Вариант 1:

    sprintf('%06d', random_int(0, 999999));

    Вариант 2:

    str_pad(mt_rand(0, 999999), 6, '0', STR_PAD_LEFT);
    Ответ написан
  • Как сделать так чтобы в input нельзя было вводить меньше 5?

    @awenn2015
    Веб-программист самоучка
    Можно через событие onBlur валидировать

    const Input = () => {
      const range = { min: 5, max: 50 }
      const [value, setValue] = useState<number | "">(range.min)
    
      function onBlurHandle(value: number) {
        if (value >= range.min && value < range.max) return;
        setValue(range.min)
      }
    
      return (
        <input
          type="number"
          value={value}
          onChange={({ target }) => setValue(target.value === "" ? "" : +target.value)}
          onBlur={({ target }) => onBlurHandle(+target.value)}
          min={range.min}
          max={range.max}
        />
      )
    }
    Ответ написан
    Комментировать
  • Как исправить ошибки при сборке scss в webpack?

    @awenn2015 Автор вопроса
    Веб-программист самоучка
    imko я может чего то не понимаю но почему он не может работать с двумя расширениями, поменял на scss теперь жалуется на sass, бред какой то, такие темы даже не по гуглишь нормально
    Ответ написан
  • Как ограничить вводимые ключи объекта в функцию по нужному типу T[keyof T]?

    @awenn2015 Автор вопроса
    Веб-программист самоучка
    Ответ написан
    Комментировать
  • Как использовать общие либы в create-react-app проектах?

    @awenn2015 Автор вопроса
    Веб-программист самоучка
    Попробовал просто в корне создать папку node_modules/brandname и в нее все что нужно перекинул, не знаю на сколько это правильный вариант но вроде рабочий


    • /node_modules

      • /@types

        • /brand
          • /index.d.ts





      • /brand
        • /utils.ts






    UPD: Вариант рабочий только для поставки типов, с прочим почему то выкидывает ошибку:

    Module parse failed: Unexpected token (3:27)
    File was processed with these loaders:
    * ./node_modules/source-map-loader/dist/cjs.js
    You may need an additional loader to handle the result of these loaders.
    Ответ написан
  • Как нормально перегрузить функцию?

    @awenn2015 Автор вопроса
    Веб-программист самоучка
    В таком случае проще вовсе разные функции сделать чем заниматься такой ерундой с проверками типов, это даже перегрузкой не назовешь
    Ответ написан
    Комментировать
  • Как добавить дополнительные условия в RewriteCond %{QUERY_STRING}?

    @awenn2015 Автор вопроса
    Веб-программист самоучка
    Порывшись в своих проектах нашел эту строку:

    RewriteCond %{REQUEST_FILENAME} !-f

    Так как я немного почитал про .htaccess сразу смекнул что это то что нужно, не идеальное но рабочее решение и в итоге получилось это, может кому пригодится

    RewriteCond %{QUERY_STRING} !path=
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ ?path=$1 [QSA,L]


    Скорее всего можно было бы поиграть с регулярками и %{REQUEST_URI} сравнив его с нужными строками но да ладно, главное что бы работало
    Ответ написан
    Комментировать
  • Почему не удается получить только что установленные cookie через fetch?

    @awenn2015 Автор вопроса
    Веб-программист самоучка
    Спасибо пользователю Lynn «Кофеман» за предложенный вариант (добавить 'credentials: "same-origin" ' в запрос получения), он оказался рабочий, плюс еще поправил путь для setcookie на "/" и все заработало как надо

    ИСПРАВЛЕНО:

    Для тех кому как и мне нужно хранить одну куку для множества поддоменов поменяйте credentials: "same-origin" на credentials: "include"
    Ответ написан
    Комментировать
  • Как прокинуть объект на основе интерфейса?

    @awenn2015 Автор вопроса
    Веб-программист самоучка
    А ну да, просто имплементируем класс от интерфейса и все в принципе
    Ответ написан
    Комментировать
  • Почему obj[key: keyof obj] возвращает any тип а не перечисление типов всех свойств обьекта?

    @awenn2015 Автор вопроса
    Веб-программист самоучка
    кажется понял в чем проблема, у некоторых полей из объекта тип any, может поэтому конечные данные определяются именно как any
    Ответ написан
    Комментировать
  • Почему typescript не видит перегрузку?

    @awenn2015 Автор вопроса
    Веб-программист самоучка
    Всем спасибо за ответы, решить проблему конечно в тот момент конечно пришлось банально просто объединив перегрузки с оператором ? но ваши ответы дали понять почему по другому не работало, спасибо
    Ответ написан
    Комментировать
  • Как получить название архивной страницы на странице ее таксономии?

    @awenn2015 Автор вопроса
    Веб-программист самоучка
    В общем пришлось подсмотреть как у камы все это реализовано и ответ оказался настолько прост что странно что в гугле (на подобных ресурсах) никто не мог дать внятного ответа, в общем само решение:
    global $post, $wp_post_types;
    $q_obj = get_queried_object();
    
    $ptype = null;
    
    if (!empty($post)) $ptype = &$wp_post_types[$post->post_type];
    else if (isset($q_obj->taxonomy)) $ptype = &$wp_post_types[get_taxonomy($q_obj->taxonomy)->object_type[0]];
    
    $post_title = $ptype->labels->name;

    Вот и все решение
    Ответ написан
  • Как передать значение переменной между файлами шаблона на wordpress?

    @awenn2015
    Веб-программист самоучка
    Смотрю вот ответы то хорошие, но что делать когда файл шаблона, например файл со script тегом который мы через хук wp_footer цепляем к странице, что бы не дублировать запросы к бд хорошей идей является как упомянул Mario62 передавать данные через $GLOBALS
    Ответ написан
    Комментировать