about summary refs log tree commit diff
path: root/website/sandbox/contentful/src/store.ts
diff options
context:
space:
mode:
authorWilliam Carroll <wpcarro@gmail.com>2020-03-24T13·27+0000
committerWilliam Carroll <wpcarro@gmail.com>2020-03-24T13·27+0000
commit527aeeeced9fdcc2fc3a6a08c58ceb3a17ae2122 (patch)
tree0d7d31079c2b7e1791e4726ca47ff25a812e325e /website/sandbox/contentful/src/store.ts
parent57b58e9b2fe2a1b178f42bc16d7c5ab1f8da9cdd (diff)
Add sandbox project using Contentful CMS
I used the boilerplate/typescript project as a starting point. This project
fetches and renders books that I'm defining in a Contentful CMS that I created.
Diffstat (limited to 'website/sandbox/contentful/src/store.ts')
-rw-r--r--website/sandbox/contentful/src/store.ts36
1 files changed, 36 insertions, 0 deletions
diff --git a/website/sandbox/contentful/src/store.ts b/website/sandbox/contentful/src/store.ts
new file mode 100644
index 000000000000..c4396d681a17
--- /dev/null
+++ b/website/sandbox/contentful/src/store.ts
@@ -0,0 +1,36 @@
+import { createSlice, configureStore, PayloadAction } from "@reduxjs/toolkit";
+import { useSelector, TypedUseSelectorHook } from "react-redux";
+
+export interface Book {
+  title: string;
+  author: string;
+  // TODO(wpcarro): Prefer datetime type here.
+  publicationDate: string;
+}
+
+export interface State {
+  isLoading: boolean;
+  books: Book[];
+}
+
+const initialState: State = {
+  isLoading: true,
+  books: [],
+};
+
+export const { actions, reducer } = createSlice({
+  name: "application",
+  initialState,
+  reducers: {
+    toggleIsLoading: state => ({ ...state, isLoading: !state.isLoading }),
+    setBooks: (state, action) => ({ ... state, books: action.payload }),
+  }
+});
+
+/**
+ * Defining and consuming this allows us to avoid annotating State in all of our
+ * selectors.
+ */
+export const useTypedSelector: TypedUseSelectorHook<State> = useSelector;
+
+export default configureStore({ reducer });