Skip to content

Commit 76d81ed

Browse files
committed
Implemented action to rename project
1 parent 855e474 commit 76d81ed

File tree

4 files changed

+57
-7
lines changed

4 files changed

+57
-7
lines changed

apps/web/src/components/ProjectEditor.jsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export function ProjectEditor() {
2424
const renameInputReference = useRef(null);
2525

2626
const [renameDialogVisible, setRenameDialogVisible] = useState(false);
27-
const [newProjectName, setNewProjectName] = useState(undefined);
27+
const [newProjectName, setNewProjectName] = useState('');
2828

2929
const lang = useSelector(state => state?.project.lang);
3030
const code = useSelector(state => state?.project.code);
@@ -139,7 +139,7 @@ export function ProjectEditor() {
139139
label="Cancel"
140140
icon="pi pi-times"
141141
onClick={() => {
142-
setNewProjectName(undefined);
142+
setNewProjectName('');
143143
setRenameDialogVisible(false);
144144
}}
145145
className="p-button-text"
@@ -149,7 +149,7 @@ export function ProjectEditor() {
149149
icon="pi pi-check"
150150
onClick={() => {
151151
dispatch(renameProject(newProjectName));
152-
setNewProjectName(undefined);
152+
setNewProjectName('');
153153
setRenameDialogVisible(false);
154154
}}
155155
autoFocus
@@ -168,7 +168,7 @@ export function ProjectEditor() {
168168
onKeyDown={(e) => {
169169
if (e.key === 'Enter') {
170170
dispatch(renameProject(newProjectName));
171-
setNewProjectName(undefined);
171+
setNewProjectName('');
172172
setRenameDialogVisible(false);
173173
}
174174
}}

apps/web/src/redux/project/actions.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export const actionTypes = {
99
saveCodeChanges: 'project/saveCodeChanges',
1010
deleteProject: 'project/deleteProject',
1111
renameProject: 'project/renameProject',
12+
setProjectTitle: 'project/setProjectTitle',
1213
setErrorItems: 'project/setErrorItems',
1314
};
1415

@@ -54,8 +55,14 @@ export const deleteProject = () => ({
5455
type: actionTypes.deleteProject
5556
});
5657

57-
export const renameProject = () => ({
58-
type: actionTypes.renameProject
58+
export const renameProject = (title) => ({
59+
type: actionTypes.renameProject,
60+
title
61+
});
62+
63+
export const setProjectTitle = (title) => ({
64+
type: actionTypes.setProjectTitle,
65+
title
5966
});
6067

6168
export const setErrorItems = (errorItems) => ({

apps/web/src/redux/project/reducers.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,13 @@ function setErrorItems(state, action) {
7070
};
7171
}
7272

73+
function setProjectTitle(state, action) {
74+
return {
75+
...state,
76+
title: action.title,
77+
};
78+
}
79+
7380
// -----------------------------------------------------------------------------
7481
// Reducer
7582
// -----------------------------------------------------------------------------
@@ -83,6 +90,7 @@ const actionsMap = {
8390
[actionTypes.setCode]: setCode,
8491
[actionTypes.setSavedCode]: setSavedCode,
8592
[actionTypes.setErrorItems]: setErrorItems,
93+
[actionTypes.setProjectTitle]: setProjectTitle,
8694
};
8795

8896
export default function reducer(state = initialState, action) {

apps/web/src/redux/project/sagas.js

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import {takeLatest, put, select, call} from "redux-saga/effects";
22
import gql from "graphql-tag";
33
import {history} from "../store";
44
import {gqlFetch} from "../../graphql_fetch";
5-
import {actionTypes, reset, receiveLoadedProject, setSavedCode, setSelectedTabIndex} from "./actions";
5+
import {actionTypes, reset, receiveLoadedProject, setSavedCode, setSelectedTabIndex, setProjectTitle} from "./actions";
66
import {pause, reset as resetMachine} from "../jsspeccy/actions";
77
import {handleException} from "../../errors";
88

@@ -35,6 +35,11 @@ export function* watchForDeleteProjectActions() {
3535
yield takeLatest(actionTypes.deleteProject, handleDeleteProjectActions);
3636
}
3737

38+
// noinspection JSUnusedGlobalSymbols
39+
export function* watchForRenameProjectActions() {
40+
yield takeLatest(actionTypes.renameProject, handleRenameProjectActions);
41+
}
42+
3843
// -----------------------------------------------------------------------------
3944
// Action handlers
4045
// -----------------------------------------------------------------------------
@@ -180,3 +185,33 @@ function* handleDeleteProjectActions(_) {
180185
handleException(e);
181186
}
182187
}
188+
189+
function* handleRenameProjectActions(action) {
190+
try {
191+
const userId = yield select((state) => state.identity.userId);
192+
const projectId = yield select((state) => state.project.id);
193+
194+
const query = gql`
195+
mutation ($project_id: uuid!, $title: String!) {
196+
update_project_by_pk(pk_columns: {project_id: $project_id}, _set: {title: $title}) {
197+
project_id
198+
}
199+
}
200+
`;
201+
202+
const variables = {
203+
'project_id': projectId,
204+
'title': action.title
205+
};
206+
207+
// noinspection JSCheckFunctionSignatures
208+
const response = yield call(gqlFetch, userId, query, variables);
209+
210+
// noinspection JSUnresolvedVariable
211+
console.assert(response?.data?.update_project_by_pk?.project_id, response);
212+
213+
yield put(setProjectTitle(action.title));
214+
} catch (e) {
215+
handleException(e);
216+
}
217+
}

0 commit comments

Comments
 (0)