Проблема с VK Bridge: VKWebAppStorageSet и VKWebAppStorageGet

    У меня возникла сложность с функциями VK Bridge, а именно с VKWebAppStorageSet и VKWebAppStorageGet. Я пытаюсь сохранить и затем получить значение переменной, но получаю ошибку.

    Вот мой код для сохранения значения при нажатии на кнопку:

    function go() {
      bridge.send('VKWebAppStorageSet', {
        key: 'test',
        value: 'yes'
      })
      .then((data) => { 
        if (data.result) {
          // Значение переменной задано
        }
      })
      .catch((error) => {
        // Ошибка
        console.log(error);
      });
    }

    После нажатия кажется, что переменная записывается. Однако, когда я пытаюсь её получить и записать в состояние React:

    const [test, setTest] = useState('');
    
    async function zapis() {
      bridge.send('VKWebAppStorageGet', {
        keys: ['test']
      })
      .then((data) => { 
        if (data.keys) {
          setTest(data.value);
        }
      })
      .catch((error) => {
        // Ошибка
        console.log(error);
      });
    }

    Я получаю ошибку User Denied. В чем проблема?

    Основные замечания

    • Неправильный доступ к данным: В ответе на VKWebAppStorageGet данные находятся в свойстве data.keys (массив объектов), а не data.value. Вам нужно перебрать массив или обратиться к первому элементу.
    • Проверка разрешений: Ошибка User Denied может возникать, если пользователь не предоставил приложению доступ к хранилищу. Убедитесь, что у вас есть необходимые права в настройках приложения VK.
    • Вызов в правильном контексте: Функция zapis должна вызываться после успешной установки значения, иначе запись могла не завершиться.

    Пример исправленного кода

    const [test, setTest] = useState('');
    
    async function zapis() {
      try {
        const data = await bridge.send('VKWebAppStorageGet', {
          keys: ['test']
        });
        if (data.keys && data.keys.length > 0) {
          setTest(data.keys[0].value); // Обращаемся к первому ключу
        }
      } catch (error) {
        console.log('Ошибка получения данных:', error);
      }
    }

    Также проверьте, что вы вызываете zapis после успешного завершения go, например, в цепочке промисов.