@lonelyplanet/dotcom-core
Version:
This package is meant to house some of our more common UI and shared libs across dotcom applications.
99 lines (90 loc) • 2.18 kB
text/typescript
import { IBookmark } from "@lonelyplanet/open-planet-node/dist/resources/bookmark";
import { IBookmarkList } from "@lonelyplanet/open-planet-node/dist/resources/bookmarkList";
import { Action, handleActions } from "redux-actions";
import { IUpdateBookmarkDoneAction } from "../actions/bookmark";
import {
ADD_BOOKMARK_DONE,
LIST_CREATE_DONE,
LIST_UPDATE_DONE,
UPDATE_BOOKMARK_DONE,
} from "../constants/bookmark";
const initialState: IBookmarkReducerState = {
lists: [],
};
export interface IBookmarkReducerState {
lists: IBookmarkList[];
}
export interface IBookmarkActionsPayload extends IBookmarkList {
id?: string;
listId?: string;
bookmark?: any;
entries?: any;
}
export const bookmark = handleActions<
IBookmarkReducerState,
IBookmarkActionsPayload
>
({
[ADD_BOOKMARK_DONE]: (state, action) => {
return {
...state,
lists: state.lists.map((list) => {
if (list.id === action.payload.listId) {
return {
...list,
entries: [
...list.entries,
{
...action.payload.bookmark,
},
],
};
}
return list;
}),
};
},
[UPDATE_BOOKMARK_DONE]: (state, action) => ({
...state,
lists: state.lists.map((list) => {
if (list.id === action.payload.listId) {
const entries = list.entries.map((entry) => {
if (entry.id === action.payload.bookmark.id) {
return {
...action.payload.bookmark,
};
}
return entry;
});
return {
...list,
entries,
};
}
return list;
}),
}),
[LIST_CREATE_DONE]: (state, action) => ({
...state,
lists: [
...state.lists,
{
...action.payload,
},
],
}),
[LIST_UPDATE_DONE]: (state, action) => ({
...state,
lists: state.lists.map((list) => {
if (list.id === action.payload.id) {
return {
...list,
...action.payload,
entries: list.entries,
};
}
return list;
}),
}),
}, initialState);
export default bookmark;