2021-03-05 07:03:35 -09:00
|
|
|
import Immutable from 'seamless-immutable';
|
2016-09-21 06:27:11 -08:00
|
|
|
import {decorateSessionsReducer} from '../utils/plugins';
|
2016-07-13 12:44:24 -08:00
|
|
|
import {
|
|
|
|
|
SESSION_ADD,
|
|
|
|
|
SESSION_PTY_EXIT,
|
|
|
|
|
SESSION_USER_EXIT,
|
|
|
|
|
SESSION_PTY_DATA,
|
|
|
|
|
SESSION_SET_ACTIVE,
|
|
|
|
|
SESSION_CLEAR_ACTIVE,
|
2016-10-03 18:00:50 -08:00
|
|
|
SESSION_RESIZE,
|
2017-01-15 13:40:47 -09:00
|
|
|
SESSION_SET_XTERM_TITLE,
|
2019-09-23 09:37:22 -08:00
|
|
|
SESSION_SET_CWD,
|
2022-01-08 20:35:57 -09:00
|
|
|
SESSION_SEARCH
|
2016-07-13 12:44:24 -08:00
|
|
|
} from '../constants/sessions';
|
2021-03-05 07:03:35 -09:00
|
|
|
import {sessionState, session, Mutable, ISessionReducer} from '../hyper';
|
2016-07-13 12:44:24 -08:00
|
|
|
|
2021-03-05 07:03:35 -09:00
|
|
|
const initialState: sessionState = Immutable<Mutable<sessionState>>({
|
|
|
|
|
sessions: {},
|
2016-07-13 12:44:24 -08:00
|
|
|
activeUid: null
|
|
|
|
|
});
|
|
|
|
|
|
2019-10-20 00:08:48 -08:00
|
|
|
function Session(obj: Immutable.DeepPartial<session>) {
|
|
|
|
|
const x: session = {
|
2016-07-13 12:44:24 -08:00
|
|
|
uid: '',
|
|
|
|
|
title: '',
|
2016-10-03 18:00:50 -08:00
|
|
|
cols: null,
|
|
|
|
|
rows: null,
|
2016-07-13 12:44:24 -08:00
|
|
|
url: null,
|
2016-07-14 15:40:15 -08:00
|
|
|
cleared: false,
|
2019-09-23 09:37:22 -08:00
|
|
|
search: false,
|
2016-07-16 14:41:13 -08:00
|
|
|
shell: '',
|
|
|
|
|
pid: null
|
2019-10-20 00:08:48 -08:00
|
|
|
};
|
|
|
|
|
return Immutable(x).merge(obj);
|
2016-07-13 12:44:24 -08:00
|
|
|
}
|
|
|
|
|
|
2021-03-05 07:03:35 -09:00
|
|
|
function deleteSession(state: sessionState, uid: string) {
|
2023-02-14 05:17:52 -09:00
|
|
|
return state.updateIn(['sessions'], (sessions: (typeof state)['sessions']) => {
|
2019-10-19 08:59:56 -08:00
|
|
|
const sessions_ = sessions.asMutable();
|
|
|
|
|
delete sessions_[uid];
|
|
|
|
|
return sessions_;
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-05 07:03:35 -09:00
|
|
|
const reducer: ISessionReducer = (state = initialState, action) => {
|
2016-07-13 12:44:24 -08:00
|
|
|
switch (action.type) {
|
|
|
|
|
case SESSION_ADD:
|
2017-09-10 05:35:10 -08:00
|
|
|
return state.set('activeUid', action.uid).setIn(
|
|
|
|
|
['sessions', action.uid],
|
|
|
|
|
Session({
|
2016-10-03 18:00:50 -08:00
|
|
|
cols: action.cols,
|
|
|
|
|
rows: action.rows,
|
|
|
|
|
uid: action.uid,
|
2019-10-14 16:09:30 -08:00
|
|
|
shell: action.shell ? action.shell.split('/').pop() : null,
|
2016-10-03 18:00:50 -08:00
|
|
|
pid: action.pid
|
2017-09-10 05:35:10 -08:00
|
|
|
})
|
|
|
|
|
);
|
2016-07-13 12:44:24 -08:00
|
|
|
|
|
|
|
|
case SESSION_SET_ACTIVE:
|
|
|
|
|
return state.set('activeUid', action.uid);
|
|
|
|
|
|
2019-09-23 09:37:22 -08:00
|
|
|
case SESSION_SEARCH:
|
2022-01-08 20:35:57 -09:00
|
|
|
return state.setIn(['sessions', action.uid, 'search'], action.value);
|
2019-09-23 09:37:22 -08:00
|
|
|
|
2016-07-13 12:44:24 -08:00
|
|
|
case SESSION_CLEAR_ACTIVE:
|
2017-09-10 05:35:10 -08:00
|
|
|
return state.merge(
|
|
|
|
|
{
|
|
|
|
|
sessions: {
|
2019-10-19 08:59:56 -08:00
|
|
|
[state.activeUid!]: {
|
2017-09-10 05:35:10 -08:00
|
|
|
cleared: true
|
|
|
|
|
}
|
2016-07-13 12:44:24 -08:00
|
|
|
}
|
2017-09-10 05:35:10 -08:00
|
|
|
},
|
|
|
|
|
{deep: true}
|
|
|
|
|
);
|
2016-07-13 12:44:24 -08:00
|
|
|
|
|
|
|
|
case SESSION_PTY_DATA:
|
2017-02-23 02:10:05 -09:00
|
|
|
// we avoid a direct merge for perf reasons
|
|
|
|
|
// as this is the most common action
|
2020-07-13 05:05:34 -08:00
|
|
|
if (state.sessions[action.uid]?.cleared) {
|
2017-09-10 05:35:10 -08:00
|
|
|
return state.merge(
|
|
|
|
|
{
|
2017-02-23 02:10:05 -09:00
|
|
|
sessions: {
|
|
|
|
|
[action.uid]: {
|
|
|
|
|
cleared: false
|
|
|
|
|
}
|
2016-07-29 12:40:46 -08:00
|
|
|
}
|
2017-09-10 05:35:10 -08:00
|
|
|
},
|
|
|
|
|
{deep: true}
|
|
|
|
|
);
|
2017-02-23 02:10:05 -09:00
|
|
|
}
|
|
|
|
|
return state;
|
2016-07-13 12:44:24 -08:00
|
|
|
|
|
|
|
|
case SESSION_PTY_EXIT:
|
|
|
|
|
if (state.sessions[action.uid]) {
|
|
|
|
|
return deleteSession(state, action.uid);
|
|
|
|
|
}
|
2016-09-21 06:27:11 -08:00
|
|
|
console.log('ignore pty exit: session removed by user');
|
|
|
|
|
return state;
|
2016-07-13 12:44:24 -08:00
|
|
|
|
|
|
|
|
case SESSION_USER_EXIT:
|
|
|
|
|
return deleteSession(state, action.uid);
|
|
|
|
|
|
|
|
|
|
case SESSION_SET_XTERM_TITLE:
|
2017-08-02 11:05:47 -08:00
|
|
|
return state.setIn(
|
|
|
|
|
['sessions', action.uid, 'title'],
|
|
|
|
|
// we need to trim the title because `cmd.exe`
|
|
|
|
|
// likes to report ' ' as the title
|
|
|
|
|
action.title.trim()
|
|
|
|
|
);
|
2016-07-13 12:44:24 -08:00
|
|
|
|
2016-10-03 18:00:50 -08:00
|
|
|
case SESSION_RESIZE:
|
2017-09-10 05:35:10 -08:00
|
|
|
return state.setIn(
|
|
|
|
|
['sessions', action.uid],
|
|
|
|
|
state.sessions[action.uid].merge({
|
|
|
|
|
rows: action.rows,
|
|
|
|
|
cols: action.cols,
|
2017-10-05 10:48:08 -08:00
|
|
|
resizeAt: action.now
|
2017-09-10 05:35:10 -08:00
|
|
|
})
|
|
|
|
|
);
|
2016-10-03 18:00:50 -08:00
|
|
|
|
2017-01-15 13:40:47 -09:00
|
|
|
case SESSION_SET_CWD:
|
2017-09-11 05:06:44 -08:00
|
|
|
if (state.activeUid) {
|
|
|
|
|
return state.setIn(['sessions', state.activeUid, 'cwd'], action.cwd);
|
|
|
|
|
}
|
|
|
|
|
return state;
|
2017-01-15 13:40:47 -09:00
|
|
|
|
2016-07-13 12:44:24 -08:00
|
|
|
default:
|
|
|
|
|
return state;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default decorateSessionsReducer(reducer);
|