У меня есть две функции,
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;