Skip to content

Commit d125fe6

Browse files
authored
Enhance comments in Redux Store configuration for clarity (#425)
* Improve redux store and featureSettingSlice * Add the clarity of comments in the Redux store configuration * Fix store name, add comments
1 parent deac17a commit d125fe6

14 files changed

+159
-69
lines changed

frontend/src/components/editor/Editor.tsx

+5-5
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { useFormatUtils } from "../../hooks/useFormatUtils";
1414
import { useToolBar } from "../../hooks/useToolBar";
1515
import { CodeKeyType, selectConfig } from "../../store/configSlice";
1616
import { selectEditor, setCmView } from "../../store/editorSlice";
17-
import { selectSetting } from "../../store/settingSlice";
17+
import { selectFeatureSetting } from "../../store/featureSettingSlice";
1818
import { selectWorkspace } from "../../store/workspaceSlice";
1919
import { imageUploader } from "../../utils/imageUploader";
2020
import { intelligencePivot } from "../../utils/intelligence/intelligencePivot";
@@ -34,7 +34,7 @@ function Editor(props: EditorProps) {
3434
const [element, setElement] = useState<HTMLElement>();
3535
const editorStore = useSelector(selectEditor);
3636
const configStore = useSelector(selectConfig);
37-
const settingStore = useSelector(selectSetting);
37+
const featureSettingStore = useSelector(selectFeatureSetting);
3838
const workspaceStore = useSelector(selectWorkspace);
3939
const { mutateAsync: createUploadUrl } = useCreateUploadUrlMutation();
4040
const { mutateAsync: uploadFile } = useUploadFileMutation();
@@ -51,7 +51,7 @@ function Editor(props: EditorProps) {
5151
!element ||
5252
!editorStore.doc ||
5353
!editorStore.client ||
54-
typeof settingStore.fileUpload?.enable !== "boolean"
54+
typeof featureSettingStore.fileUpload?.enable !== "boolean"
5555
) {
5656
return;
5757
}
@@ -87,7 +87,7 @@ function Editor(props: EditorProps) {
8787
}),
8888
yorkieCodeMirror(editorStore.doc, editorStore.client),
8989
intelligencePivot,
90-
...(settingStore.fileUpload.enable
90+
...(featureSettingStore.fileUpload.enable
9191
? [imageUploader(handleUploadImage, editorStore.doc)]
9292
: []),
9393
urlHyperlinkInserter(editorStore.doc),
@@ -107,7 +107,7 @@ function Editor(props: EditorProps) {
107107
configStore.codeKey,
108108
themeMode,
109109
workspaceStore.data,
110-
settingStore.fileUpload?.enable,
110+
featureSettingStore.fileUpload?.enable,
111111
dispatch,
112112
createUploadUrl,
113113
uploadFile,

frontend/src/components/editor/YorkieIntelligence.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
import { Button, Typography } from "@mui/material";
22
import { useEffect, useState } from "react";
33
import { createPortal } from "react-dom";
4+
import { useSelector } from "react-redux";
45
import { INTELLIGENCE_FOOTER_ID } from "../../constants/intelligence";
6+
import { selectFeatureSetting } from "../../store/featureSettingSlice";
57
import YorkieIntelligenceFooter from "./YorkieIntelligenceFooter";
6-
import { useSelector } from "react-redux";
7-
import { selectSetting } from "../../store/settingSlice";
88

99
function YorkieIntelligence() {
1010
const [footerOpen, setFooterOpen] = useState(false);
1111
const [intelligenceFooterPivot, setIntelligenceFooterPivot] = useState<Element | null>(null);
1212

13-
const { yorkieIntelligence } = useSelector(selectSetting);
13+
const { yorkieIntelligence } = useSelector(selectFeatureSetting);
1414

1515
useEffect(() => {
1616
// initialize intelligence footer pivot

frontend/src/components/editor/YorkieIntelligenceFeatureList.tsx

+11-7
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,28 @@ import {
77
Stack,
88
TextField,
99
} from "@mui/material";
10-
import { useMemo, useState } from "react";
1110
import { matchSorter } from "match-sorter";
12-
import { selectSetting } from "../../store/settingSlice";
11+
import { useMemo, useState } from "react";
1312
import { useSelector } from "react-redux";
13+
import { selectFeatureSetting } from "../../store/featureSettingSlice";
1414

1515
interface YorkieIntelligenceFeatureListProps {
1616
onSelectFeature: (feature: string, title: string) => void;
1717
}
1818

1919
function YorkieIntelligenceFeatureList(props: YorkieIntelligenceFeatureListProps) {
2020
const { onSelectFeature } = props;
21-
const settingStore = useSelector(selectSetting);
21+
const featureSettingStore = useSelector(selectFeatureSetting);
2222
const [featureText, setFeatureText] = useState("");
2323
const filteredFeatureInfoList = useMemo(() => {
24-
return matchSorter(settingStore.yorkieIntelligence?.config.features ?? [], featureText, {
25-
keys: ["title", "feature"],
26-
});
27-
}, [featureText, settingStore.yorkieIntelligence?.config.features]);
24+
return matchSorter(
25+
featureSettingStore.yorkieIntelligence?.config.features ?? [],
26+
featureText,
27+
{
28+
keys: ["title", "feature"],
29+
}
30+
);
31+
}, [featureText, featureSettingStore.yorkieIntelligence?.config.features]);
2832

2933
const handleFeatureTextChange: React.ChangeEventHandler<
3034
HTMLInputElement | HTMLTextAreaElement

frontend/src/components/headers/DocumentHeader.tsx

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,34 @@
11
import ArrowBackIosNewIcon from "@mui/icons-material/ArrowBackIosNew";
22
import EditIcon from "@mui/icons-material/Edit";
3+
import MoreVertIcon from "@mui/icons-material/MoreVert";
34
import VerticalSplitIcon from "@mui/icons-material/VerticalSplit";
45
import VisibilityIcon from "@mui/icons-material/Visibility";
56
import {
67
AppBar,
8+
Grid2 as Grid,
79
IconButton,
810
Paper,
911
Stack,
1012
ToggleButton,
1113
ToggleButtonGroup,
1214
Toolbar,
1315
Tooltip,
14-
Grid2 as Grid,
1516
Typography,
1617
} from "@mui/material";
18+
import { useSnackbar } from "notistack";
1719
import { useEffect, useState } from "react";
1820
import { useDispatch, useSelector } from "react-redux";
1921
import { useNavigate } from "react-router-dom";
22+
import { useUpdateDocumentTitleMutation } from "../../hooks/api/workspaceDocument";
2023
import { useUserPresence } from "../../hooks/useUserPresence";
24+
import { selectDocument } from "../../store/documentSlice";
2125
import { EditorModeType, selectEditor, setMode } from "../../store/editorSlice";
2226
import { selectWorkspace } from "../../store/workspaceSlice";
2327
import { ShareRole } from "../../utils/share";
2428
import DownloadMenu from "../common/DownloadMenu";
2529
import ShareButton from "../common/ShareButton";
26-
import UserPresenceList from "./UserPresenceList";
27-
import { selectDocument } from "../../store/documentSlice";
28-
import { useUpdateDocumentTitleMutation } from "../../hooks/api/workspaceDocument";
29-
import { useSnackbar } from "notistack";
3030
import DocumentPopover from "../popovers/DocumentPopover";
31-
import MoreVertIcon from "@mui/icons-material/MoreVert";
31+
import UserPresenceList from "./UserPresenceList";
3232

3333
function DocumentHeader() {
3434
const dispatch = useDispatch();
@@ -43,7 +43,7 @@ function DocumentHeader() {
4343
);
4444
const isEditingDisabled = Boolean(editorState.shareRole);
4545
const { enqueueSnackbar } = useSnackbar();
46-
const [moreButtonanchorEl, setMoreButtonAnchorEl] = useState<HTMLButtonElement | null>(null);
46+
const [moreButtonAnchorEl, setMoreButtonAnchorEl] = useState<HTMLButtonElement | null>(null);
4747

4848
useEffect(() => {
4949
if (editorState.shareRole === ShareRole.READ) {
@@ -162,8 +162,8 @@ function DocumentHeader() {
162162
<MoreVertIcon />
163163
</IconButton>
164164
<DocumentPopover
165-
open={Boolean(moreButtonanchorEl)}
166-
anchorEl={moreButtonanchorEl}
165+
open={Boolean(moreButtonAnchorEl)}
166+
anchorEl={moreButtonAnchorEl}
167167
onClose={handleDocumentMenuClose}
168168
/>
169169
</Stack>

frontend/src/hooks/api/settings.ts

+11-5
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,26 @@
11
import { useQuery } from "@tanstack/react-query";
22
import axios from "axios";
3-
import { GetSettingsResponse } from "./types/settings";
4-
import { useDispatch, useSelector } from "react-redux";
5-
import { selectSetting, setFileUpload, setYorkieIntelligence } from "../../store/settingSlice";
63
import { useEffect } from "react";
4+
import { useDispatch, useSelector } from "react-redux";
5+
import {
6+
selectFeatureSetting,
7+
setFileUpload,
8+
setYorkieIntelligence,
9+
} from "../../store/featureSettingSlice";
10+
import { GetSettingsResponse } from "./types/settings";
711

812
export const generateGetSettingsQueryKey = () => {
913
return ["settings"];
1014
};
1115

1216
export const useGetSettingsQuery = () => {
1317
const dispatch = useDispatch();
14-
const settingStore = useSelector(selectSetting);
18+
const featureSettingStore = useSelector(selectFeatureSetting);
1519
const query = useQuery({
1620
queryKey: generateGetSettingsQueryKey(),
17-
enabled: settingStore.yorkieIntelligence === null && settingStore.fileUpload === null,
21+
enabled:
22+
featureSettingStore.yorkieIntelligence === null &&
23+
featureSettingStore.fileUpload === null,
1824
queryFn: async () => {
1925
const res = await axios.get<GetSettingsResponse>("/settings");
2026
return res.data;

frontend/src/main.tsx

+5-8
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,18 @@
1+
import { SnackbarProvider } from "notistack";
12
import React from "react";
23
import ReactDOM from "react-dom/client";
3-
import "./index.css";
4-
import App from "./App";
5-
import { store } from "./store/store";
4+
import ReactGA from "react-ga4";
65
import { Provider } from "react-redux";
76
import { PersistGate } from "redux-persist/integration/react";
8-
import { persistStore } from "redux-persist";
9-
import { SnackbarProvider } from "notistack";
10-
import ReactGA from "react-ga4";
7+
import App from "./App";
8+
import "./index.css";
9+
import { persistor, store } from "./store/store";
1110

1211
const trackingCode = `${import.meta.env.VITE_APP_GOOGLE_ANALYTICS}`;
1312
if (trackingCode) {
1413
ReactGA.initialize(trackingCode);
1514
}
1615

17-
const persistor = persistStore(store);
18-
1916
ReactDOM.createRoot(document.getElementById("root")!).render(
2017
<React.StrictMode>
2118
<Provider store={store}>

frontend/src/store/authSlice.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,13 @@ export const { setAccessToken, setRefreshToken, logout } = authSlice.actions;
3535

3636
export const selectAuth = (state: RootState) => state.auth;
3737

38-
export default authSlice.reducer;
38+
/**
39+
* Manages user authentication state, including login information and tokens.
40+
*
41+
* * This slice handles:
42+
* - `accessToken`: The user's access token for authenticated API requests.
43+
* - `refreshToken`: The user's refresh token for obtaining new access tokens.
44+
*/
45+
const reducer = authSlice.reducer;
46+
47+
export default reducer;

frontend/src/store/configSlice.ts

+12-1
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,15 @@ export const { setTheme, setDrawerOpen, setCodeKeyType, setDisableScrollSync } =
5151

5252
export const selectConfig = (state: RootState) => state.config;
5353

54-
export default configSlice.reducer;
54+
/**
55+
* Handles global application settings.
56+
*
57+
* * This slice handles:
58+
* - `theme`: The application theme (default, dark, or light).
59+
* - `drawerOpen`: Whether the application drawer (sidebar) is open.
60+
* - `codeKey`: The preferred keybinding type for code editing (Sublime, Vim, etc.).
61+
* - `disableScrollSync`: A flag to enable or disable scroll synchronization.
62+
*/
63+
const reducer = configSlice.reducer;
64+
65+
export default reducer;

frontend/src/store/documentSlice.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { createSlice } from "@reduxjs/toolkit";
21
import type { PayloadAction } from "@reduxjs/toolkit";
2+
import { createSlice } from "@reduxjs/toolkit";
33
import { RootState } from "./store";
44

55
export interface Document {
@@ -20,7 +20,7 @@ const initialState: DocumentState = {
2020
data: null,
2121
};
2222

23-
export const documentSlice = createSlice({
23+
const documentSlice = createSlice({
2424
name: "document",
2525
initialState,
2626
reducers: {
@@ -34,4 +34,10 @@ export const { setDocumentData } = documentSlice.actions;
3434

3535
export const selectDocument = (state: RootState) => state.document;
3636

37-
export default documentSlice.reducer;
37+
/**
38+
* Handles document management state.
39+
* This slice is designed to manage the currently active document, its metadata, and related state in the application.
40+
*/
41+
const reducer = documentSlice.reducer;
42+
43+
export default reducer;

frontend/src/store/editorSlice.ts

+13-1
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,16 @@ export const { setMode, setShareRole, setDoc, setClient, setCmView } = editorSli
5959

6060
export const selectEditor = (state: RootState) => state.editor;
6161

62-
export default editorSlice.reducer;
62+
/**
63+
* Manages the state of the collaborative code editor
64+
*
65+
* * This slice handles:
66+
* - `mode`: The editor's current mode (edit, read, or both).
67+
* - `shareRole`: The user's role in the session (e.g., viewer, editor).
68+
* - `doc`: The Yorkie document for real-time collaboration.
69+
* - `client`: The Yorkie client for syncing data with the server.
70+
* - `cmView`: The CodeMirror editor instance.
71+
*/
72+
const reducer = editorSlice.reducer;
73+
74+
export default reducer;

frontend/src/store/settingSlice.ts frontend/src/store/featureSettingSlice.ts

+16-7
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,18 @@ interface FileUploadSetting {
1717
enable: boolean;
1818
}
1919

20-
export interface SettingState {
20+
export interface FeatureSettingState {
2121
yorkieIntelligence: YorkieIntelligenceSetting | null;
2222
fileUpload: FileUploadSetting | null;
2323
}
2424

25-
const initialState: SettingState = {
25+
const initialState: FeatureSettingState = {
2626
yorkieIntelligence: null,
2727
fileUpload: null,
2828
};
2929

30-
export const settingSlice = createSlice({
31-
name: "setting",
30+
export const featureSettingSlice = createSlice({
31+
name: "featureSetting",
3232
initialState,
3333
reducers: {
3434
setYorkieIntelligence: (state, action: PayloadAction<YorkieIntelligenceSetting>) => {
@@ -40,8 +40,17 @@ export const settingSlice = createSlice({
4040
},
4141
});
4242

43-
export const { setYorkieIntelligence, setFileUpload } = settingSlice.actions;
43+
export const { setYorkieIntelligence, setFileUpload } = featureSettingSlice.actions;
4444

45-
export const selectSetting = (state: RootState) => state.setting;
45+
export const selectFeatureSetting = (state: RootState) => state.featureSetting;
4646

47-
export default settingSlice.reducer;
47+
/**
48+
* Manages settings for specific features (e.g., experimental feature toggles).
49+
*
50+
* * This slice handles:
51+
* - `yorkieIntelligence`: Settings for the Yorkie Intelligence feature
52+
* - `fileUpload`: Settings for file upload functionality
53+
*/
54+
const reducer = featureSettingSlice.reducer;
55+
56+
export default reducer;

0 commit comments

Comments
 (0)