Skip to content

Commit 8ec9976

Browse files
committed
PEER-234: Add line num extension
Signed-off-by: SeeuSim <[email protected]>
1 parent 069e3cb commit 8ec9976

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

frontend/src/components/blocks/interview/editor.tsx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,17 @@ type EditorProps = {
2727
export const Editor = ({ room }: EditorProps) => {
2828
const { height } = useWindowSize();
2929
const [theme, setTheme] = useState<IEditorTheme>('vscodeDark');
30-
const { editorRef, extensions, language, setLanguage, code, setCode, members, isLoading } =
31-
useCollab(room);
30+
const {
31+
editorRef,
32+
extensions,
33+
language,
34+
setLanguage,
35+
code,
36+
setCode,
37+
cursorPosition,
38+
members,
39+
isLoading,
40+
} = useCollab(room);
3241
const themePreset = useMemo(() => {
3342
return getTheme(theme);
3443
}, [theme]);
@@ -122,6 +131,11 @@ export const Editor = ({ room }: EditorProps) => {
122131
readOnly={isLoading}
123132
extensions={extensions}
124133
/>
134+
<div className='bg-secondary text-secondary-foreground z-10 flex w-full translate-y-[-0.5px] border-none py-1 text-xs'>
135+
<span className='ml-auto mr-2'>
136+
Ln {cursorPosition.lineNum}, Col {cursorPosition.colNum}
137+
</span>
138+
</div>
125139
</div>
126140
</div>
127141
);

frontend/src/lib/hooks/use-collab.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { EditorView } from '@codemirror/view';
12
import type { LanguageName } from '@uiw/codemirror-extensions-langs';
23
import type { Extension, ReactCodeMirrorRef } from '@uiw/react-codemirror';
34
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
@@ -38,6 +39,7 @@ export const useCollab = (roomId: string) => {
3839
const [code, setCode] = useState('');
3940
const [language, _setLanguage] = useState<LanguageName>('python');
4041
const [members, _setMembers] = useState<Array<IYjsUserState['user']>>([]);
42+
const [cursorPosition, setCursorPosition] = useState({ lineNum: 1, colNum: 0 });
4143
const setMembers = useCallback(_setMembers, [members]);
4244
const setLanguage = useCallback(
4345
(lang: LanguageName) => {
@@ -92,9 +94,19 @@ export const useCollab = (roomId: string) => {
9294
};
9395
awareness.setLocalStateField('user', userState);
9496

97+
const lNumExt = EditorView.updateListener.of((up) => {
98+
if (up.selectionSet) {
99+
const { head } = up.state.selection.main;
100+
const curline = up.state.doc.lineAt(head);
101+
const lineNum = Math.max(curline.number, 1);
102+
const colNum = head - curline.from;
103+
setCursorPosition({ lineNum, colNum });
104+
}
105+
});
106+
95107
const collabExt = yCollab(yText, awareness, { undoManager });
96108
setCode(yText.toString());
97-
setExtensions([...extensions, collabExt]);
109+
setExtensions([...extensions, collabExt, lNumExt]);
98110

99111
// Initialise room preferences
100112
const yState = doc.getMap('state');
@@ -127,5 +139,6 @@ export const useCollab = (roomId: string) => {
127139
setCode,
128140
members,
129141
isLoading,
142+
cursorPosition,
130143
};
131144
};

0 commit comments

Comments
 (0)