2016-10-03 18:00:50 -08:00
|
|
|
import rpc from '../rpc';
|
|
|
|
|
import {
|
|
|
|
|
DIRECTION,
|
|
|
|
|
TERM_GROUP_RESIZE,
|
|
|
|
|
TERM_GROUP_REQUEST,
|
|
|
|
|
TERM_GROUP_EXIT,
|
|
|
|
|
TERM_GROUP_EXIT_ACTIVE
|
2023-07-25 02:39:11 -08:00
|
|
|
} from '../../typings/constants/term-groups';
|
|
|
|
|
import {SESSION_REQUEST} from '../../typings/constants/sessions';
|
2016-10-25 04:53:15 -08:00
|
|
|
import findBySession from '../utils/term-groups';
|
2019-12-03 03:03:52 -09:00
|
|
|
import {getRootGroups} from '../selectors';
|
2016-10-03 18:00:50 -08:00
|
|
|
import {setActiveSession, ptyExitSession, userExitSession} from './sessions';
|
2023-07-25 01:39:51 -08:00
|
|
|
import type {ITermState, ITermGroup, HyperState, HyperDispatch, HyperActions} from '../../typings/hyper';
|
2016-10-03 18:00:50 -08:00
|
|
|
|
2020-03-07 05:38:46 -09:00
|
|
|
function requestSplit(direction: 'VERTICAL' | 'HORIZONTAL') {
|
2023-06-28 21:04:33 -08:00
|
|
|
return (_activeUid: string | undefined, _profile: string | undefined) =>
|
2021-05-10 04:54:21 -08:00
|
|
|
(dispatch: HyperDispatch, getState: () => HyperState): void => {
|
|
|
|
|
dispatch({
|
|
|
|
|
type: SESSION_REQUEST,
|
|
|
|
|
effect: () => {
|
|
|
|
|
const {ui, sessions} = getState();
|
2023-06-28 21:04:33 -08:00
|
|
|
const activeUid = _activeUid ? _activeUid : sessions.activeUid;
|
2023-06-30 11:07:04 -08:00
|
|
|
const profile = _profile ? _profile : activeUid ? sessions.sessions[activeUid].profile : window.profileName;
|
2021-05-10 04:54:21 -08:00
|
|
|
rpc.emit('new', {
|
|
|
|
|
splitDirection: direction,
|
|
|
|
|
cwd: ui.cwd,
|
2023-06-28 21:04:33 -08:00
|
|
|
activeUid,
|
|
|
|
|
profile
|
2021-05-10 04:54:21 -08:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
};
|
2016-10-03 18:00:50 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const requestVerticalSplit = requestSplit(DIRECTION.VERTICAL);
|
|
|
|
|
export const requestHorizontalSplit = requestSplit(DIRECTION.HORIZONTAL);
|
|
|
|
|
|
2020-03-07 05:38:46 -09:00
|
|
|
export function resizeTermGroup(uid: string, sizes: number[]): HyperActions {
|
2016-10-03 18:00:50 -08:00
|
|
|
return {
|
|
|
|
|
uid,
|
|
|
|
|
type: TERM_GROUP_RESIZE,
|
|
|
|
|
sizes
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-28 21:04:33 -08:00
|
|
|
export function requestTermGroup(_activeUid: string | undefined, _profile: string | undefined) {
|
2020-01-02 09:27:27 -09:00
|
|
|
return (dispatch: HyperDispatch, getState: () => HyperState) => {
|
2016-10-03 18:00:50 -08:00
|
|
|
dispatch({
|
|
|
|
|
type: TERM_GROUP_REQUEST,
|
|
|
|
|
effect: () => {
|
2022-01-08 01:47:38 -09:00
|
|
|
const {ui, sessions} = getState();
|
2019-10-10 11:20:26 -08:00
|
|
|
const {cwd} = ui;
|
2023-06-28 21:04:33 -08:00
|
|
|
const activeUid = _activeUid ? _activeUid : sessions.activeUid;
|
2023-06-30 11:07:04 -08:00
|
|
|
const profile = _profile ? _profile : activeUid ? sessions.sessions[activeUid].profile : window.profileName;
|
2016-10-03 18:00:50 -08:00
|
|
|
rpc.emit('new', {
|
|
|
|
|
isNewGroup: true,
|
2019-10-14 16:09:30 -08:00
|
|
|
cwd,
|
2023-06-28 21:04:33 -08:00
|
|
|
activeUid,
|
|
|
|
|
profile
|
2016-10-03 18:00:50 -08:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2019-10-19 08:59:56 -08:00
|
|
|
export function setActiveGroup(uid: string) {
|
2020-01-02 09:27:27 -09:00
|
|
|
return (dispatch: HyperDispatch, getState: () => HyperState) => {
|
2016-10-03 18:00:50 -08:00
|
|
|
const {termGroups} = getState();
|
|
|
|
|
dispatch(setActiveSession(termGroups.activeSessions[uid]));
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// When we've found the next group which we want to
|
|
|
|
|
// set as active (after closing something), we also need
|
|
|
|
|
// to find the first child group which has a sessionUid.
|
2021-03-05 07:03:35 -09:00
|
|
|
const findFirstSession = (state: ITermState, group: ITermGroup): string | undefined => {
|
2016-10-03 18:00:50 -08:00
|
|
|
if (group.sessionUid) {
|
|
|
|
|
return group.sessionUid;
|
|
|
|
|
}
|
|
|
|
|
|
2019-10-19 08:59:56 -08:00
|
|
|
for (const childUid of group.children.asMutable()) {
|
2016-10-03 18:00:50 -08:00
|
|
|
const child = state.termGroups[childUid];
|
|
|
|
|
// We want to find the *leftmost* session,
|
|
|
|
|
// even if it's nested deep down:
|
|
|
|
|
const sessionUid = findFirstSession(state, child);
|
|
|
|
|
if (sessionUid) {
|
|
|
|
|
return sessionUid;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2019-10-19 08:59:56 -08:00
|
|
|
const findPrevious = <T>(list: T[], old: T) => {
|
2016-10-03 18:00:50 -08:00
|
|
|
const index = list.indexOf(old);
|
|
|
|
|
// If `old` was the first item in the list,
|
|
|
|
|
// choose the other item available:
|
|
|
|
|
return index ? list[index - 1] : list[1];
|
|
|
|
|
};
|
|
|
|
|
|
2021-03-05 07:03:35 -09:00
|
|
|
const findNextSessionUid = (state: ITermState, group: ITermGroup) => {
|
2016-10-03 18:00:50 -08:00
|
|
|
// If we're closing a root group (i.e. a whole tab),
|
|
|
|
|
// the next group needs to be a root group as well:
|
|
|
|
|
if (state.activeRootGroup === group.uid) {
|
|
|
|
|
const rootGroups = getRootGroups({termGroups: state});
|
|
|
|
|
const nextGroup = findPrevious(rootGroups, group);
|
|
|
|
|
return findFirstSession(state, nextGroup);
|
|
|
|
|
}
|
|
|
|
|
|
2019-10-19 08:59:56 -08:00
|
|
|
const {children} = state.termGroups[group.parentUid!];
|
|
|
|
|
const nextUid = findPrevious(children.asMutable(), group.uid);
|
2021-03-28 09:07:04 -08:00
|
|
|
return findFirstSession(state, state.termGroups[nextUid]);
|
2016-10-03 18:00:50 -08:00
|
|
|
};
|
|
|
|
|
|
2019-10-19 08:59:56 -08:00
|
|
|
export function ptyExitTermGroup(sessionUid: string) {
|
2020-01-02 09:27:27 -09:00
|
|
|
return (dispatch: HyperDispatch, getState: () => HyperState) => {
|
2016-10-03 18:00:50 -08:00
|
|
|
const {termGroups} = getState();
|
|
|
|
|
const group = findBySession(termGroups, sessionUid);
|
|
|
|
|
// This might have already been closed:
|
|
|
|
|
if (!group) {
|
|
|
|
|
return dispatch(ptyExitSession(sessionUid));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dispatch({
|
|
|
|
|
type: TERM_GROUP_EXIT,
|
|
|
|
|
uid: group.uid,
|
|
|
|
|
effect: () => {
|
2019-10-19 08:59:56 -08:00
|
|
|
const activeSessionUid = termGroups.activeSessions[termGroups.activeRootGroup!];
|
2016-10-03 18:00:50 -08:00
|
|
|
if (Object.keys(termGroups.termGroups).length > 1 && activeSessionUid === sessionUid) {
|
|
|
|
|
const nextSessionUid = findNextSessionUid(termGroups, group);
|
2019-10-19 08:59:56 -08:00
|
|
|
dispatch(setActiveSession(nextSessionUid!));
|
2016-10-03 18:00:50 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dispatch(ptyExitSession(sessionUid));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2019-10-19 08:59:56 -08:00
|
|
|
export function userExitTermGroup(uid: string) {
|
2020-01-02 09:27:27 -09:00
|
|
|
return (dispatch: HyperDispatch, getState: () => HyperState) => {
|
2016-10-03 18:00:50 -08:00
|
|
|
const {termGroups} = getState();
|
|
|
|
|
dispatch({
|
|
|
|
|
type: TERM_GROUP_EXIT,
|
|
|
|
|
uid,
|
|
|
|
|
effect: () => {
|
|
|
|
|
const group = termGroups.termGroups[uid];
|
|
|
|
|
if (Object.keys(termGroups.termGroups).length <= 1) {
|
|
|
|
|
// No need to attempt finding a new active session
|
|
|
|
|
// if this is the last one we've got:
|
2019-10-19 08:59:56 -08:00
|
|
|
return dispatch(userExitSession(group.sessionUid!));
|
2016-10-03 18:00:50 -08:00
|
|
|
}
|
|
|
|
|
|
2019-10-19 08:59:56 -08:00
|
|
|
const activeSessionUid = termGroups.activeSessions[termGroups.activeRootGroup!];
|
2016-10-03 18:00:50 -08:00
|
|
|
if (termGroups.activeRootGroup === uid || activeSessionUid === group.sessionUid) {
|
|
|
|
|
const nextSessionUid = findNextSessionUid(termGroups, group);
|
2019-10-19 08:59:56 -08:00
|
|
|
dispatch(setActiveSession(nextSessionUid!));
|
2016-10-03 18:00:50 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (group.sessionUid) {
|
|
|
|
|
dispatch(userExitSession(group.sessionUid));
|
|
|
|
|
} else {
|
2020-03-25 02:15:08 -08:00
|
|
|
group.children.forEach((childUid) => {
|
2016-10-03 18:00:50 -08:00
|
|
|
dispatch(userExitTermGroup(childUid));
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function exitActiveTermGroup() {
|
2020-01-02 09:27:27 -09:00
|
|
|
return (dispatch: HyperDispatch, getState: () => HyperState) => {
|
2016-10-03 18:00:50 -08:00
|
|
|
dispatch({
|
|
|
|
|
type: TERM_GROUP_EXIT_ACTIVE,
|
|
|
|
|
effect() {
|
|
|
|
|
const {sessions, termGroups} = getState();
|
2019-10-19 08:59:56 -08:00
|
|
|
const {uid} = findBySession(termGroups, sessions.activeUid!)!;
|
2021-03-28 09:07:04 -08:00
|
|
|
dispatch(userExitTermGroup(uid));
|
2016-10-03 18:00:50 -08:00
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
}
|