Add meme-adding logic

Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
2023-07-21 09:46:13 +03:00
parent 1b2ce96c5e
commit 4b601872bc
40 changed files with 1037 additions and 324 deletions

View File

@@ -1,87 +0,0 @@
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
import { MEME_SORT, SORT_DIRECTION, VIEW } from '../types';
import { MEME_TYPE } from '../database';
interface HomeState {
sort: MEME_SORT;
sortDirection: SORT_DIRECTION;
view: VIEW;
favoritesOnly: boolean;
filter: MEME_TYPE | undefined;
}
const initialState: HomeState = {
sort: MEME_SORT.TITLE,
sortDirection: SORT_DIRECTION.ASCENDING,
view: VIEW.MASONRY,
favoritesOnly: false,
filter: undefined,
};
const homeSlice = createSlice({
name: 'home',
initialState,
reducers: {
setHomeSort: (state, action: PayloadAction<MEME_SORT>) => {
state.sort = action.payload;
},
setHomeSortDirection: (state, action: PayloadAction<SORT_DIRECTION>) => {
state.sortDirection = action.payload;
},
toggleHomeSortDirection: state => {
state.sortDirection ^= 1;
},
setHomeView: (state, action: PayloadAction<VIEW>) => {
state.view = action.payload;
},
cycleHomeView: state => {
switch (state.view) {
case VIEW.MASONRY: {
state.view = VIEW.GRID;
break;
}
case VIEW.GRID: {
state.view = VIEW.LIST;
break;
}
case VIEW.LIST: {
state.view = VIEW.MASONRY;
break;
}
}
},
setHomeFavoritesOnly: (state, action: PayloadAction<boolean>) => {
state.favoritesOnly = action.payload;
},
toggleHomeFavoritesOnly: state => {
state.favoritesOnly = !state.favoritesOnly;
},
setHomeFilter: (state, action: PayloadAction<MEME_TYPE | undefined>) => {
state.filter = action.payload;
},
},
});
const {
setHomeSort,
setHomeSortDirection,
toggleHomeSortDirection,
setHomeView,
cycleHomeView,
setHomeFavoritesOnly,
toggleHomeFavoritesOnly,
setHomeFilter,
} = homeSlice.actions;
export {
type HomeState,
setHomeSort,
setHomeSortDirection,
toggleHomeSortDirection,
setHomeView,
cycleHomeView,
setHomeFavoritesOnly,
toggleHomeFavoritesOnly,
setHomeFilter,
};
export default homeSlice.reducer;

View File

@@ -11,20 +11,20 @@ import {
} from 'redux-persist';
import { createRealmPersistStorage } from '@bankify/redux-persist-realm';
import settingsReducer from './settings';
import homeReducer from './home';
import memesReducer from './memes';
import tagsReducer from './tags';
import navigationReducer from './navigation';
const rootReducer = combineReducers({
settings: settingsReducer,
home: homeReducer,
memes: memesReducer,
tags: tagsReducer,
navigation: navigationReducer,
});
interface RootState {
settings: ReturnType<typeof settingsReducer>;
home: ReturnType<typeof homeReducer>;
memes: ReturnType<typeof memesReducer>;
tags: ReturnType<typeof tagsReducer>;
navigation: ReturnType<typeof navigationReducer>;
}
@@ -57,16 +57,16 @@ export {
validateSettings,
} from './settings';
export {
type HomeState,
setHomeSort,
setHomeSortDirection,
toggleHomeSortDirection,
setHomeView,
cycleHomeView,
setHomeFavoritesOnly,
toggleHomeFavoritesOnly,
setHomeFilter,
} from './home';
type MemesState,
setMemesSort,
setMemesSortDirection,
toggleMemesSortDirection,
setMemesView,
cycleMemesView,
setMemesFavoritesOnly,
toggleMemesFavoritesOnly,
setMemesFilter,
} from './memes';
export {
type TagsState,
setTagsSort,

83
src/state/memes.ts Normal file
View File

@@ -0,0 +1,83 @@
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
import { MEME_SORT, SORT_DIRECTION, VIEW } from '../types';
import { MEME_TYPE } from '../database';
interface MemesState {
sort: MEME_SORT;
sortDirection: SORT_DIRECTION;
view: VIEW;
favoritesOnly: boolean;
filter: MEME_TYPE | undefined;
}
const initialState: MemesState = {
sort: MEME_SORT.TITLE,
sortDirection: SORT_DIRECTION.ASCENDING,
view: VIEW.MASONRY,
favoritesOnly: false,
filter: undefined,
};
const memesSlice = createSlice({
name: 'memes',
initialState,
reducers: {
setMemesSort: (state, action: PayloadAction<MEME_SORT>) => {
state.sort = action.payload;
},
setMemesSortDirection: (state, action: PayloadAction<SORT_DIRECTION>) => {
state.sortDirection = action.payload;
},
toggleMemesSortDirection: state => {
state.sortDirection ^= 1;
},
setMemesView: (state, action: PayloadAction<VIEW>) => {
state.view = action.payload;
},
cycleMemesView: state => {
switch (state.view) {
case VIEW.MASONRY: {
state.view = VIEW.LIST;
break;
}
case VIEW.LIST: {
state.view = VIEW.MASONRY;
break;
}
}
},
setMemesFavoritesOnly: (state, action: PayloadAction<boolean>) => {
state.favoritesOnly = action.payload;
},
toggleMemesFavoritesOnly: state => {
state.favoritesOnly = !state.favoritesOnly;
},
setMemesFilter: (state, action: PayloadAction<MEME_TYPE | undefined>) => {
state.filter = action.payload;
},
},
});
const {
setMemesSort,
setMemesSortDirection,
toggleMemesSortDirection,
setMemesView,
cycleMemesView,
setMemesFavoritesOnly,
toggleMemesFavoritesOnly,
setMemesFilter,
} = memesSlice.actions;
export {
type MemesState,
setMemesSort,
setMemesSortDirection,
toggleMemesSortDirection,
setMemesView,
cycleMemesView,
setMemesFavoritesOnly,
toggleMemesFavoritesOnly,
setMemesFilter,
};
export default memesSlice.reducer;