Как проверить пункт в списке избранных - избыточность? - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть две функции,

1 - Добавить песню в список избранного: я отправляю запрос конечной точке, которая добавляет песню в список избранного пользователя, ее добавление песни основано на song_id, который я передал в запросе тела.

2 - Удалить композицию из списка избранных: как ранее, но удалить композицию из списка избранных на основе song_id.

Поэтому в компоненте проигрывателя у меня есть значок сердца, который называется функциями, это когда пользователь нажимает на нем я призываю добавить песню, иначе я призываю удалить песню.

Все эти вещи работают без излишеств!

Поэтому я хочу сохранить song_id и основываясь на нем, я хочу добавить проверка, существует ли этот song_id, означает ли это, что эта песня находится в списке избранного до того, как «значок сердца будет заполнен», когда пользователь щелкнет по нему, я хочу удалить эту песню из списка избранных, поэтому я вызываю вторую функцию, чтобы отправить запрос на сервер и так далее.

Так что я делаю действие / редуктор для этого случая, но я думаю, что это не очень хорошо.

Пользовательский интерфейс "Компонент проигрывателя" - "без приставки"

  addToFavorite = async () => {
    const {tunes, token, currentTrackIndex} = this.state;
    this.setState({isFavorite: true});
    let id = tunes[currentTrackIndex].id;
    try {
      let AuthStr = `Bearer ${token}`;
      const headers = {
        'Content-Type': 'application/json',
        Authorization: AuthStr,
      };
      let response = await API.post(
        '/btn_add_favourite',
        {
          id,
        },
        {
          headers: headers,
        },
      );
      if (response.data.status === 'success') {
        alert('added');
      } else {
        alert('already exist');
      }
    } catch (err) {
      this.setState({isFavorite: false});
      console.log(err);
    }
  };

  deleteFromFavorite = async () => {
    const {tunes, token, isFavorite, currentTrackIndex} = this.state;

    let id = tunes[currentTrackIndex].id;
    console.log(tunes[currentTrackIndex]);
    try {
      let AuthStr = `Bearer ${token}`;
      const headers = {
        'Content-Type': 'application/json',
        Authorization: AuthStr,
      };
      if (isFavorite) {
        let response = await API.post(
          '/favourite_delete',
          {
            tracks_id: id,
          },
          {
            headers: headers,
          },
        );
        if (response.status === 200) {
          alert('song deleted from your favorite list');
          this.setState({isFavorite: false});
        }
        console.log(response);
      }
    } catch (err) {
      console.log(err);
    }
  };



   <Button
              onPress={() =>
                this.state.isFavorite // Not using redux yet so by default false
                  ? this.deleteFromFavorite()
                  : this.addToFavorite()
              }
              transparent
              style={styles.btnTransparent}>
              <Icon
                style={styles.iconColor}
                type="MaterialIcons"
                name={this.state.isFavorite ? 'favorite' : 'favorite-border'}
              />
            </Button>

Красный ux Stuff

Действие / isFavoriteAction. js

import {ADD_TO_FAVORITE, REMOVE_FROM_FAVORITE} from './types';

export const addToFavoriteFunction = isFavorite => {
  return {
    type: ADD_TO_FAVORITE,
    payload: isFavorite,
  };
};

export const removeFromFavoriteFunction = isFavorite => {
  return {
    type: REMOVE_FROM_FAVORITE,
    payload: isFavorite,
  };
};

Редуктор / isFavorite. js

import {ADD_TO_FAVORITE, REMOVE_FROM_FAVORITE} from '../actions/types';

let initial_state = {
  isFavorite: false,
};

const isFavoriteReducer = (state = initial_state, action) => {
  switch (action.type) {
    case ADD_TO_FAVORITE:
      state = {
        ...state,
        isFavorite: true,
      };
      break;
    case REMOVE_FROM_FAVORITE:
      state = {
        ...state,
        isFavorite: false,
      };
      break;
    default:
      return state;
  }
  return state;
};

export default isFavoriteReducer;

1 Ответ

1 голос
/ 25 февраля 2020

Специально для части редуктора, я вижу, что вы создаете состояние для отдельной песни, я бы порекомендовал вам иметь полный список песен в Redux, тогда вы можете справиться с этим следующим образом:

import { ADD_TO_FAVORITE, REMOVE_FROM_FAVORITE } from "../actions/types";

let initialState = [];

/**
 *
 * @param {Array<Object>} songs A list of songs, this should be your state
 * @param {boolean} flag The boolean value, to fav or unfav a song
 * @return A new list of songs, with the updated isFavorite field for the song
 */
const updateSongFavoriteFlag = (songs, songId, flag) =>
    songs.map(song => {
        if (song.id === songId) {
            return { ...song, isFavorite: flag };
        }
        return song;
    });

const isFavoriteReducer = (state = initialState, action = {}) => {
    const { payload, type } = action;
    switch (action.type) {
        case ADD_TO_FAVORITE: {
            // Returning a new state instead of just altering the selected item
            // Where payload is the id of the song you want to mark as favorite
            return updateSongFavoriteFlag(state, payload, true);
        }
        case REMOVE_FROM_FAVORITE:
            return updateSongFavoriteFlag(state, payload, false);
        default:
            return state;
    }
    return state;
};

export default isFavoriteReducer;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...