diff --git a/src/backend/index.tsx b/src/backend/index.tsx index de1a1ca5b5..3411761ac9 100644 --- a/src/backend/index.tsx +++ b/src/backend/index.tsx @@ -326,8 +326,21 @@ export async function uploadLift( return parseInt(resp.toString()); } +// Tell the backend to create a LIFT file for the project export async function exportLift(projectId?: string) { let projectIdToExport = projectId ? projectId : LocalStorage.getProjectId(); + // ToDo: Once the create and download functions are split in the backend, + // call the create function here (fetching the project is an async placeholder) + let resp = await backendServer.get(`projects/${projectIdToExport}`, { + headers: authHeader(), + }); + return resp.data; +} +// After the backend confirms that a LIFT file is ready, download it +export async function downloadLift(projectId?: string) { + let projectIdToExport = projectId ? projectId : LocalStorage.getProjectId(); + // ToDo: Once the create and download functions are split in the backend, + // call the download function here (for now, both are done here) let resp = await backendServer.get( `projects/${projectIdToExport}/words/download`, { diff --git a/src/components/App/DefaultState.tsx b/src/components/App/DefaultState.tsx index 9dc6bd127d..efe12214be 100644 --- a/src/components/App/DefaultState.tsx +++ b/src/components/App/DefaultState.tsx @@ -1,54 +1,62 @@ -import { simpleWord, Word } from "../../types/word"; +import { defaultState as characterInventoryState } from "../../goals/CharInventoryCreation/CharacterInventoryReducer"; +import { defaultState as mergeDuplicateGoal } from "../../goals/MergeDupGoal/MergeDupStep/MergeDupStepReducer"; +import { defaultState as reviewEntriesState } from "../../goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesReducer"; +import { defaultProject } from "../../types/project"; +import { defaultState as loginState } from "../Login/LoginReducer"; import { defaultState as goalTimelineState } from "../GoalTimeline/DefaultState"; -import { defaultState as createProjectState } from "../ProjectScreen/CreateProject/CreateProjectReducer"; import { defaultState as goalSelectorState } from "../GoalTimeline/GoalSwitcher/GoalSelectorScroll/GoalSelectorReducer"; import { defaultState as passwordResetState } from "../PasswordReset/reducer"; -import { defaultState as reviewEntriesState } from "../../goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesReducer"; +import { defaultState as createProjectState } from "../ProjectScreen/CreateProject/CreateProjectReducer"; +import { defaultState as exportProjectState } from "../ProjectSettings/ProjectExport/ExportProjectReducer"; import { defaultState as treeViewState } from "../TreeView/TreeViewReducer"; -import { defaultProject } from "../../types/project"; export const defaultState = { - draggedWordState: { - draggedWord: simpleWord("Ye", "You"), - }, - mergeDupStepProps: { - parentWords: [ - { - id: 1, - senses: [ - { - id: 2, - dups: [simpleWord("Thee", "You"), simpleWord("Yes", "No")], - }, - ], - }, - ], - addParent: (word: Word) => word, - dropWord: () => null, - clearMerges: () => null, - draggedWord: simpleWord("Thou", "You"), - }, - treeViewState: { - ...treeViewState, + //login + loginState: { + ...loginState, }, - goalsState: { - ...goalTimelineState, + passwordResetState: { + ...passwordResetState, }, + + //project createProjectState: { ...createProjectState, name: "Test", success: true, }, + currentProject: { + ...defaultProject, + name: "Project", + }, + exportProjectState: { + ...exportProjectState, + }, + + //data entry + treeViewState: { + ...treeViewState, + }, + + //general cleanup tools goalSelectorState: { ...goalSelectorState, }, - passwordResetState: { - ...passwordResetState, + goalsState: { + ...goalTimelineState, }, - currentProject: { - ...defaultProject, - name: "Project", + + //merge duplicates goal + mergeDuplicateGoal: { + ...mergeDuplicateGoal, + }, + + //character inventory goal + characterInventoryState: { + ...characterInventoryState, }, + + //review entries goal reviewEntriesState: { ...reviewEntriesState, }, diff --git a/src/components/ProjectSettings/ProjectExport/ExportProjectActions.tsx b/src/components/ProjectSettings/ProjectExport/ExportProjectActions.tsx new file mode 100644 index 0000000000..c6252bb238 --- /dev/null +++ b/src/components/ProjectSettings/ProjectExport/ExportProjectActions.tsx @@ -0,0 +1,69 @@ +import { ThunkDispatch } from "redux-thunk"; + +import { downloadLift, exportLift } from "../../../backend"; +import { StoreState } from "../../../types"; + +export enum ExportStatus { + Default = "DEFAULT", + InProgress = "IN_PROGRESS", + Success = "SUCCESS", + Failure = "FAILURE", +} + +export interface ExportProjectAction { + type: ExportStatus; + projectId?: string; +} + +export function asyncExportProject(projectId?: string) { + return async ( + dispatch: ThunkDispatch + ) => { + dispatch(inProgress(projectId)); + exportLift(projectId).catch(() => { + dispatch(failure(projectId)); + }); + }; +} + +export function asyncDownloadExport(projectId?: string) { + return async ( + dispatch: ThunkDispatch + ) => { + return downloadLift(projectId) + .then((fileString) => { + return fetch(fileString) + .then((file) => { + dispatch(success(projectId)); + return file.blob(); + }) + .catch(() => { + dispatch(failure(projectId)); + }); + }) + .catch(() => { + dispatch(failure(projectId)); + }); + }; +} + +export function inProgress(projectId?: string): ExportProjectAction { + return { + type: ExportStatus.InProgress, + projectId, + }; +} + +export function success(projectId?: string): ExportProjectAction { + return { + type: ExportStatus.Success, + projectId, + }; +} + +export function failure(projectId?: string): ExportProjectAction { + return { + type: ExportStatus.Failure, + projectId, + }; +} diff --git a/src/components/ProjectSettings/ProjectExport/ExportProjectButton.tsx b/src/components/ProjectSettings/ProjectExport/ExportProjectButton.tsx index d237ce6ade..36648be7d0 100644 --- a/src/components/ProjectSettings/ProjectExport/ExportProjectButton.tsx +++ b/src/components/ProjectSettings/ProjectExport/ExportProjectButton.tsx @@ -2,11 +2,16 @@ import { ButtonProps } from "@material-ui/core/Button"; import React, { useEffect } from "react"; import { Translate } from "react-localize-redux"; -import { exportLift, getProjectName } from "../../../backend"; +import { getProjectName } from "../../../backend"; import { getNowDateTimeString } from "../../../utilities"; import LoadingButton from "../../Buttons/LoadingButton"; +import { ExportStatus } from "./ExportProjectActions"; +import { ExportProjectState } from "./ExportProjectReducer"; interface ExportProjectButtonProps { + exportProject: (projectId?: string) => void; + downloadLift: (projectId?: string) => Promise; + exportResult: ExportProjectState; projectId?: string; } @@ -18,17 +23,14 @@ export default function ExportProjectButton( ) { const [fileName, setFileName] = React.useState(null); const [fileUrl, setFileUrl] = React.useState(null); - const [loading, setLoading] = React.useState(false); let downloadLink = React.createRef(); async function getFile() { - setLoading(true); + props.exportProject(props.projectId); const projectName = await getProjectName(props.projectId); - setFileName(`${projectName}_${getNowDateTimeString()}`); - const fileString = await exportLift(props.projectId); - const file = await fetch(fileString).then(async (res) => res.blob()); + setFileName(`${projectName}_${getNowDateTimeString()}.zip`); + const file = await props.downloadLift(props.projectId); setFileUrl(URL.createObjectURL(file)); - setLoading(false); } useEffect(() => { @@ -44,7 +46,7 @@ export default function ExportProjectButton( diff --git a/src/components/ProjectSettings/ProjectExport/ExportProjectReducer.tsx b/src/components/ProjectSettings/ProjectExport/ExportProjectReducer.tsx new file mode 100644 index 0000000000..f8a899226c --- /dev/null +++ b/src/components/ProjectSettings/ProjectExport/ExportProjectReducer.tsx @@ -0,0 +1,42 @@ +import { StoreAction, StoreActions } from "../../../rootActions"; +import { ExportProjectAction, ExportStatus } from "./ExportProjectActions"; + +export interface ExportProjectState { + projectId: string; + status: ExportStatus; +} + +export const defaultState: ExportProjectState = { + projectId: "", + status: ExportStatus.Default, +}; + +export const exportProjectReducer = ( + state: ExportProjectState = defaultState, + action: StoreAction | ExportProjectAction +): ExportProjectState => { + switch (action.type) { + case ExportStatus.InProgress: + return { + ...defaultState, + projectId: action.projectId ?? "", + status: action.type, + }; + case ExportStatus.Success: + return { + ...defaultState, + projectId: action.projectId ?? "", + status: action.type, + }; + case ExportStatus.Failure: + return { + ...defaultState, + projectId: action.projectId ?? "", + status: action.type, + }; + case StoreActions.RESET: + return defaultState; + default: + return state; + } +}; diff --git a/src/components/ProjectSettings/ProjectExport/index.tsx b/src/components/ProjectSettings/ProjectExport/index.tsx new file mode 100644 index 0000000000..444fefed5e --- /dev/null +++ b/src/components/ProjectSettings/ProjectExport/index.tsx @@ -0,0 +1,34 @@ +import { connect } from "react-redux"; +import { ThunkDispatch } from "redux-thunk"; + +import { StoreState } from "../../../types"; +import { + asyncDownloadExport, + asyncExportProject, + ExportProjectAction, +} from "./ExportProjectActions"; +import ExportProjectButton from "./ExportProjectButton"; + +function mapStateToProps(state: StoreState) { + return { + exportResult: state.exportProjectState, + }; +} + +function mapDispatchToProps( + dispatch: ThunkDispatch +) { + return { + exportProject: (projectId?: string) => { + dispatch(asyncExportProject(projectId)); + }, + downloadLift: (projectId?: string) => { + return dispatch(asyncDownloadExport(projectId)); + }, + }; +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(ExportProjectButton); diff --git a/src/components/ProjectSettings/ProjectSettingsComponent.tsx b/src/components/ProjectSettings/ProjectSettingsComponent.tsx index 40fbe6699a..9223779855 100644 --- a/src/components/ProjectSettings/ProjectSettingsComponent.tsx +++ b/src/components/ProjectSettings/ProjectSettingsComponent.tsx @@ -27,7 +27,7 @@ import { AutoComplete } from "../../types/AutoComplete"; import { Project } from "../../types/project"; import { UserRole } from "../../types/userRole"; import BaseSettingsComponent from "../BaseSettings/BaseSettingsComponent"; -import ExportProjectButton from "./ProjectExport/ExportProjectButton"; +import ExportProjectButton from "./ProjectExport"; import ProjectImport from "./ProjectImport"; import ProjectLanguages from "./ProjectLanguages/ProjectLanguages"; import ProjectName from "./ProjectName"; diff --git a/src/components/SiteSettings/ProjectManagement/ProjectManagement.tsx b/src/components/SiteSettings/ProjectManagement/ProjectManagement.tsx index d9068446a9..adac408d00 100644 --- a/src/components/SiteSettings/ProjectManagement/ProjectManagement.tsx +++ b/src/components/SiteSettings/ProjectManagement/ProjectManagement.tsx @@ -5,7 +5,7 @@ import { LocalizeContextProps, withLocalize } from "react-localize-redux"; import { getAllProjects } from "../../../backend"; import { Project } from "../../../types/project"; import theme from "../../../types/theme"; -import ExportProjectButton from "../../ProjectSettings/ProjectExport/ExportProjectButton"; +import ExportProjectButton from "../../ProjectSettings/ProjectExport"; import ProjectButtonWithConfirmation from "./ProjectButtonWithConfirmation"; interface ProjectManagementState { diff --git a/src/goals/DefaultGoal/BaseGoalScreen/tests/BaseGoalScreen.test.tsx b/src/goals/DefaultGoal/BaseGoalScreen/tests/BaseGoalScreen.test.tsx index ed848c54a3..90e20323ef 100644 --- a/src/goals/DefaultGoal/BaseGoalScreen/tests/BaseGoalScreen.test.tsx +++ b/src/goals/DefaultGoal/BaseGoalScreen/tests/BaseGoalScreen.test.tsx @@ -13,18 +13,13 @@ import BaseGoalScreen from "../BaseGoalScreen"; const createMockStore = configureMockStore([thunk]); const mockStoreState = { mergeDuplicateGoal: { - mergeTreeState: { - data: { - words: {}, - senses: {}, - }, - tree: { - senses: {}, - words: {}, - }, + data: { + words: {}, + senses: {}, }, - wordDragState: { - draggedWord: undefined, + tree: { + senses: {}, + words: {}, }, }, goalsState: { diff --git a/src/goals/MergeDupGoal/MergeDupStep/MergeDupStepActions.tsx b/src/goals/MergeDupGoal/MergeDupStep/MergeDupStepActions.tsx index 0508a5ba83..d636b735b7 100644 --- a/src/goals/MergeDupGoal/MergeDupStep/MergeDupStepActions.tsx +++ b/src/goals/MergeDupGoal/MergeDupStep/MergeDupStepActions.tsx @@ -232,9 +232,9 @@ export async function mergeWord( mapping: Hash<{ srcWord: string; order: number }> ): Promise> { // find and build MergeWord[] - const word = getState().mergeDuplicateGoal.mergeTreeState.tree.words[wordID]; + const word = getState().mergeDuplicateGoal.tree.words[wordID]; if (word) { - const data = getState().mergeDuplicateGoal.mergeTreeState.data; + const data = getState().mergeDuplicateGoal.data; // create a list of all senses and add merge type tags slit by src word let senses: Hash = {}; @@ -394,7 +394,7 @@ export function mergeAll() { ) => { // generate blacklist const wordIDs: string[] = Object.keys( - getState().mergeDuplicateGoal.mergeTreeState.data.words + getState().mergeDuplicateGoal.data.words ); const hash: string = wordIDs .sort() @@ -404,9 +404,7 @@ export function mergeAll() { LocalStorage.setMergeDupsBlacklist(blacklist); // merge words let mapping: Hash<{ srcWord: string; order: number }> = {}; - const words = Object.keys( - getState().mergeDuplicateGoal.mergeTreeState.tree.words - ); + const words = Object.keys(getState().mergeDuplicateGoal.tree.words); for (const wordID of words) { mapping = await mergeWord(wordID, getState, mapping); } diff --git a/src/goals/MergeDupGoal/MergeDupStep/MergeDupStepReducer.tsx b/src/goals/MergeDupGoal/MergeDupStep/MergeDupStepReducer.tsx index d7f15d2365..7e3499e3ee 100644 --- a/src/goals/MergeDupGoal/MergeDupStep/MergeDupStepReducer.tsx +++ b/src/goals/MergeDupGoal/MergeDupStep/MergeDupStepReducer.tsx @@ -22,7 +22,7 @@ export interface MergeTreeState { tree: MergeTree; } -const mergeDupStepReducer = ( +export const mergeDupStepReducer = ( state: MergeTreeState = defaultState, //createStore() calls each reducer with undefined state action: StoreAction | MergeTreeAction ): MergeTreeState => { @@ -190,5 +190,3 @@ const mergeDupStepReducer = ( } } }; - -export default mergeDupStepReducer; diff --git a/src/goals/MergeDupGoal/MergeDupStep/MergeRow/index.tsx b/src/goals/MergeDupGoal/MergeDupStep/MergeRow/index.tsx index 883dfdb916..3edad8dd8f 100644 --- a/src/goals/MergeDupGoal/MergeDupStep/MergeRow/index.tsx +++ b/src/goals/MergeDupGoal/MergeDupStep/MergeRow/index.tsx @@ -6,8 +6,8 @@ import MergeRowComponent from "./MergeRowComponent"; export function mapStateToProps(state: StoreState) { return { - words: state.mergeDuplicateGoal.mergeTreeState.tree.words, - data: state.mergeDuplicateGoal.mergeTreeState.data, + words: state.mergeDuplicateGoal.tree.words, + data: state.mergeDuplicateGoal.data, }; } diff --git a/src/goals/MergeDupGoal/MergeDupStep/MergeStack/index.tsx b/src/goals/MergeDupGoal/MergeDupStep/MergeStack/index.tsx index be2fd7781d..29b2e80657 100644 --- a/src/goals/MergeDupGoal/MergeDupStep/MergeStack/index.tsx +++ b/src/goals/MergeDupGoal/MergeDupStep/MergeStack/index.tsx @@ -6,7 +6,7 @@ import { MergeTreeAction } from "../MergeDupStepActions"; export function mapStateToProps(state: StoreState) { return { - senses: state.mergeDuplicateGoal.mergeTreeState.data.senses, + senses: state.mergeDuplicateGoal.data.senses, }; } diff --git a/src/goals/MergeDupGoal/MergeDupStep/index.tsx b/src/goals/MergeDupGoal/MergeDupStep/index.tsx index fd74ce07fd..26000e5c4f 100644 --- a/src/goals/MergeDupGoal/MergeDupStep/index.tsx +++ b/src/goals/MergeDupGoal/MergeDupStep/index.tsx @@ -15,7 +15,7 @@ import { MergeTreeReference } from "./MergeDupsTree"; export function mapStateToProps(state: StoreState) { return { - words: state.mergeDuplicateGoal.mergeTreeState.tree.words, + words: state.mergeDuplicateGoal.tree.words, }; } diff --git a/src/goals/MergeDupGoal/MergeDupStep/tests/MergeDupStepActions.test.tsx b/src/goals/MergeDupGoal/MergeDupStep/tests/MergeDupStepActions.test.tsx index b51f140d28..0873846dad 100644 --- a/src/goals/MergeDupGoal/MergeDupStep/tests/MergeDupStepActions.test.tsx +++ b/src/goals/MergeDupGoal/MergeDupStep/tests/MergeDupStepActions.test.tsx @@ -106,7 +106,7 @@ const mockStoreState = { allPossibleGoals: [], suggestionsState: { suggestions: [] }, }, - mergeDuplicateGoal: { mergeTreeState: { data: {}, tree: {} } }, + mergeDuplicateGoal: { data: {}, tree: {} }, }; const data: { data: MergeData } = { @@ -148,7 +148,7 @@ const tree1: { tree: MergeTree } = { test("no merge", async () => { const mockStore = createMockStore({ ...mockStoreState, - mergeDuplicateGoal: { mergeTreeState: { ...data, ...tree1 } }, + mergeDuplicateGoal: { ...data, ...tree1 }, }); await mockStore.dispatch(mergeAll()); @@ -171,7 +171,7 @@ const tree2: { tree: MergeTree } = { test("merge senses from different words", async () => { const mockStore = createMockStore({ ...mockStoreState, - mergeDuplicateGoal: { mergeTreeState: { ...data, ...tree2 } }, + mergeDuplicateGoal: { ...data, ...tree2 }, }); await mockStore.dispatch(mergeAll()); @@ -206,7 +206,7 @@ const tree3: { tree: MergeTree } = { test("move sense between words", async () => { const mockStore = createMockStore({ ...mockStoreState, - mergeDuplicateGoal: { mergeTreeState: { ...data, ...tree3 } }, + mergeDuplicateGoal: { ...data, ...tree3 }, }); await mockStore.dispatch(mergeAll()); @@ -241,7 +241,7 @@ const tree4: { tree: MergeTree } = { test("merge senses within a word", async () => { const mockStore = createMockStore({ ...mockStoreState, - mergeDuplicateGoal: { mergeTreeState: { ...data, ...tree4 } }, + mergeDuplicateGoal: { ...data, ...tree4 }, }); await mockStore.dispatch(mergeAll()); diff --git a/src/goals/MergeDupGoal/MergeDupStep/tests/MergeDupStepReducer.test.tsx b/src/goals/MergeDupGoal/MergeDupStep/tests/MergeDupStepReducer.test.tsx index 54ead36cb7..273429f43c 100644 --- a/src/goals/MergeDupGoal/MergeDupStep/tests/MergeDupStepReducer.test.tsx +++ b/src/goals/MergeDupGoal/MergeDupStep/tests/MergeDupStepReducer.test.tsx @@ -2,8 +2,9 @@ import { StoreAction, StoreActions } from "../../../../rootActions"; import { testWordList } from "../../../../types/word"; import { randElement, uuid } from "../../../../utilities"; import { clearTree, moveSense, setWordData } from "../MergeDupStepActions"; -import mergeDupStepReducer, { +import { defaultState, + mergeDupStepReducer, MergeTreeState, } from "../MergeDupStepReducer"; import { diff --git a/src/goals/MergeDupGoal/mergeDuplicateReducer.tsx b/src/goals/MergeDupGoal/mergeDuplicateReducer.tsx deleted file mode 100644 index 74d912a23c..0000000000 --- a/src/goals/MergeDupGoal/mergeDuplicateReducer.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { combineReducers, Reducer } from "redux"; -import mergeStepReducer, { - MergeTreeState, -} from "./MergeDupStep/MergeDupStepReducer"; - -export interface MergeDuplicateState { - mergeTreeState: MergeTreeState; -} - -export const mergeDuplicateReducer: Reducer = combineReducers< - MergeDuplicateState ->({ - mergeTreeState: mergeStepReducer, -}); - -export default mergeDuplicateReducer; diff --git a/src/rootReducer.tsx b/src/rootReducer.tsx index d6d722ace2..e853be9cc7 100644 --- a/src/rootReducer.tsx +++ b/src/rootReducer.tsx @@ -1,44 +1,47 @@ +import { localizeReducer } from "react-localize-redux"; import { combineReducers, Reducer } from "redux"; -import { StoreState } from "./types"; -import { tempReducer } from "./components/Temp/TempReducer"; import { goalsReducer } from "./components/GoalTimeline/GoalsReducer"; -import { localizeReducer } from "react-localize-redux"; -import { loginReducer } from "./components/Login/LoginReducer"; -import { createProjectReducer } from "./components/ProjectScreen/CreateProject/CreateProjectReducer"; -import { characterInventoryReducer } from "./goals/CharInventoryCreation/CharacterInventoryReducer"; import { goalSelectReducer } from "./components/GoalTimeline/GoalSwitcher/GoalSelectorScroll/GoalSelectorReducer"; +import { loginReducer } from "./components/Login/LoginReducer"; +import { passwordResetReducer } from "./components/PasswordReset/reducer"; import { projectReducer } from "./components/Project/ProjectReducer"; -import mergeDuplicateReducer from "./goals/MergeDupGoal/mergeDuplicateReducer"; +import { createProjectReducer } from "./components/ProjectScreen/CreateProject/CreateProjectReducer"; +import { exportProjectReducer } from "./components/ProjectSettings/ProjectExport/ExportProjectReducer"; +import { tempReducer } from "./components/Temp/TempReducer"; import { treeViewReducer } from "./components/TreeView/TreeViewReducer"; +import { characterInventoryReducer } from "./goals/CharInventoryCreation/CharacterInventoryReducer"; +import { mergeDupStepReducer } from "./goals/MergeDupGoal/MergeDupStep/MergeDupStepReducer"; import { reviewEntriesReducer } from "./goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesReducer"; -import { passwordResetReducer } from "./components/PasswordReset/reducer"; +import { StoreState } from "./types"; export const rootReducer: Reducer = combineReducers({ //handles localization through react-localize-redux utilities localize: localizeReducer, - //intro windows + //login loginState: loginReducer, + passwordResetState: passwordResetReducer, + + //project createProjectState: createProjectReducer, - treeViewState: treeViewReducer, + currentProject: projectReducer, + exportProjectState: exportProjectReducer, - // Password Reset - passwordResetState: passwordResetReducer, + //data entry + treeViewState: treeViewReducer, //general cleanup tools goalSelectorState: goalSelectReducer, goalsState: goalsReducer, //merge duplicates goal - mergeDuplicateGoal: mergeDuplicateReducer, + mergeDuplicateGoal: mergeDupStepReducer, //character inventory goal characterInventoryState: characterInventoryReducer, - currentProject: projectReducer, - - // View Final goal + //review entries goal reviewEntriesState: reviewEntriesReducer, //temporary diff --git a/src/types/index.tsx b/src/types/index.tsx index deed176059..60cefbe790 100644 --- a/src/types/index.tsx +++ b/src/types/index.tsx @@ -1,23 +1,32 @@ -import { TempState } from "../components/Temp/TempReducer"; import { LocalizeState } from "react-localize-redux"; + import { LoginState } from "../components/Login/LoginReducer"; +import { PasswordResetState } from "../components/PasswordReset/reducer"; import { CreateProjectState } from "../components/ProjectScreen/CreateProject/CreateProjectReducer"; -import { GoalsState, GoalSelectorState } from "./goals"; -import { CharacterInventoryState } from "../goals/CharInventoryCreation/CharacterInventoryReducer"; -import { Project } from "./project"; -import { MergeDuplicateState } from "../goals/MergeDupGoal/mergeDuplicateReducer"; +import { ExportProjectState } from "../components/ProjectSettings/ProjectExport/ExportProjectReducer"; +import { TempState } from "../components/Temp/TempReducer"; import { TreeViewState } from "../components/TreeView/TreeViewReducer"; +import { CharacterInventoryState } from "../goals/CharInventoryCreation/CharacterInventoryReducer"; +import { MergeTreeState } from "../goals/MergeDupGoal/MergeDupStep/MergeDupStepReducer"; import { ReviewEntriesState } from "../goals/ReviewEntries/ReviewEntriesComponent/ReviewEntriesReducer"; -import { PasswordResetState } from "../components/PasswordReset/reducer"; +import { GoalsState, GoalSelectorState } from "./goals"; +import { Project } from "./project"; //root store structure export interface StoreState { //handles localization through react-localize-redux utilities localize: LocalizeState; - //intro windows + //login loginState: LoginState; + passwordResetState: PasswordResetState; + + //project createProjectState: CreateProjectState; + currentProject: Project; + exportProjectState: ExportProjectState; + + //data entry treeViewState: TreeViewState; //general cleanup tools @@ -25,19 +34,14 @@ export interface StoreState { goalsState: GoalsState; //merge duplicates goal - mergeDuplicateGoal: MergeDuplicateState; + mergeDuplicateGoal: MergeTreeState; //character inventory goal characterInventoryState: CharacterInventoryState; - currentProject: Project; - - // View Final goal + //review entries goal reviewEntriesState: ReviewEntriesState; - // Password Reset - passwordResetState: PasswordResetState; - //temporary tempState: TempState; }