diff --git a/src/store.test.tsx b/src/store.test.tsx new file mode 100644 index 0000000..29dc896 --- /dev/null +++ b/src/store.test.tsx @@ -0,0 +1,38 @@ +import { entries, createEntries, fetchEntries } from './store'; + +import * as EteSync from './api/EteSync'; + +it('Entries reducer', () => { + const jId = '24324324324'; + let state = {}; + + let entry = new EteSync.Entry(); + entry.deserialize({ + content: 'someContent', + uid: '6355209e2a2c26a6c1e6e967c2032737d538f602cf912474da83a2902f8a0a83' + }); + + let action = { + type: fetchEntries.toString(), + meta: {journal: jId, prevUid: null}, + payload: [entry], + }; + + state = entries(state, action as any); + expect(state[jId].value[0].serialize()).toEqual(entry.serialize()); + + // We replace if there's no prevUid + state = entries(state, action as any); + expect(state[jId].value[0].serialize()).toEqual(entry.serialize()); + expect(state[jId].value.length).toBe(1); + + // We extend if prevUid is set + action.meta.prevUid = entry.uid; + state = entries(state, action as any); + expect(state[jId].value.length).toBe(2); + + // Creating entries should also work the same + action.type = createEntries.toString(); + state = entries(state, action as any); + expect(state[jId].value.length).toBe(3); +}); diff --git a/src/store.tsx b/src/store.tsx index 6ab10ec..3b67d95 100644 --- a/src/store.tsx +++ b/src/store.tsx @@ -92,7 +92,7 @@ export const { fetchCredentials, logout } = createActions({ LOGOUT: () => undefined, }); -export const { fetchJournals, fetchEntries } = createActions({ +export const { fetchJournals } = createActions({ FETCH_JOURNALS: (etesync: CredentialsData) => { const creds = etesync.credentials; const apiBase = etesync.serviceApiUrl; @@ -100,17 +100,32 @@ export const { fetchJournals, fetchEntries } = createActions({ return journalManager.list(); }, +}); + +export const { fetchEntries, createEntries } = createActions({ FETCH_ENTRIES: [ (etesync: CredentialsData, journalUid: string, prevUid: string | null) => { const creds = etesync.credentials; const apiBase = etesync.serviceApiUrl; let entryManager = new EteSync.EntryManager(creds, apiBase, journalUid); - return entryManager.list(prevUid) as any; + return entryManager.list(prevUid); }, (etesync: CredentialsData, journalUid: string, prevUid: string | null) => { return { journal: journalUid, prevUid }; } + ], + CREATE_ENTRIES: [ + (etesync: CredentialsData, journalUid: string, newEntries: Array, prevUid: string | null) => { + const creds = etesync.credentials; + const apiBase = etesync.serviceApiUrl; + let entryManager = new EteSync.EntryManager(creds, apiBase, journalUid); + + return entryManager.create(newEntries, prevUid).then(response => newEntries); + }, + (etesync: CredentialsData, journalUid: string, newEntries: Array, prevUid: string | null) => { + return { journal: journalUid, entries: newEntries, prevUid }; + } ] }); @@ -124,8 +139,8 @@ const credentials = handleActions( {value: null} ); -const entries = handleAction( - fetchEntries, +export const entries = handleAction( + combineActions(fetchEntries, createEntries), (state: EntriesType, action: any) => { const prevState = state[action.meta.journal]; const extend = action.meta.prevUid != null;