diff --git a/src/bookmarks.tsx b/src/bookmarks.tsx
index ce24ff3e..e3a6e7f4 100644
--- a/src/bookmarks.tsx
+++ b/src/bookmarks.tsx
@@ -143,6 +143,9 @@ class BookmarksView extends React.Component<{}, {}> {
render() {
let isHidden = (GlobalModel.activeMainView.get() != "bookmarks");
+ if (isHidden) {
+ return null;
+ }
let bookmarks = GlobalModel.bookmarksModel.bookmarks;
let idx : number = 0;
let bookmark : BookmarkType = null;
diff --git a/src/main.tsx b/src/main.tsx
index 0b15fe85..5e3d3175 100644
--- a/src/main.tsx
+++ b/src/main.tsx
@@ -15,6 +15,7 @@ import {GlobalModel, GlobalCommandRunner, Session, Cmd, ScreenLines, Screen, riT
import {windowWidthToCols, windowHeightToRows, termHeightFromRows, termWidthFromCols, getMonoFontSize} from "./textmeasure";
import {isModKeyPress, boundInt, sortAndFilterRemotes, makeExternLink, isBlank} from "./util";
import {BookmarksView} from "./bookmarks";
+import {WebShareView} from "./webshare-client-view";
import {HistoryView} from "./history";
import {Line, Prompt} from "./linecomps";
import {ScreenSettingsModal, SessionSettingsModal, LineSettingsModal, ClientSettingsModal} from "./settings";
@@ -1496,7 +1497,7 @@ class MainSideBar extends React.Component<{}, {}> {
- Private Sessions
+ Sessions
-
- Shared Sessions
-
-
@@ -1967,6 +1962,7 @@ class Main extends React.Component<{}, {}> {
+
diff --git a/src/model.ts b/src/model.ts
index 922cd551..47b552fe 100644
--- a/src/model.ts
+++ b/src/model.ts
@@ -1958,6 +1958,12 @@ class HistoryViewModel {
this.selectedItems.clear();
})();
}
+
+ showWebShareView() : void {
+ mobx.action(() => {
+ GlobalModel.activeMainView.set("webshare");
+ })();
+ }
}
class BookmarksModel {
@@ -2399,7 +2405,7 @@ class Model {
localServerRunning : OV;
authKey : string;
isDev : boolean;
- activeMainView : OV<"session" | "history" | "bookmarks"> = mobx.observable.box("session", {name: "activeMainView"});
+ activeMainView : OV<"session" | "history" | "bookmarks" | "webshare"> = mobx.observable.box("session", {name: "activeMainView"});
termFontSize : CV;
alertMessage : OV = mobx.observable.box(null, {name: "alertMessage"});
alertPromiseResolver : (result : boolean) => void;
@@ -2409,6 +2415,7 @@ class Model {
clientSettingsModal : OV = mobx.observable.box(false, {name: "clientSettingsModal"});
lineSettingsModal : OV = mobx.observable.box(null, {name: "lineSettingsModal"});
remotesModalModel : RemotesModalModel;
+
inputModel : InputModel;
bookmarksModel : BookmarksModel;
@@ -2589,6 +2596,10 @@ class Model {
}
if (e.code == "Escape") {
e.preventDefault();
+ if (this.activeMainView.get() == "webshare") {
+ this.showSessionView();
+ return;
+ }
if (this.clearModals()) {
return;
}
@@ -3121,7 +3132,7 @@ class Model {
})();
return {success: true};
}).catch((err) => {
- this.errorHandler("calling run-command", err, true);
+ this.errorHandler("calling run-command", err, interactive);
let errMessage = "error running command";
if (err != null && !isBlank(err.message)) {
errMessage = err.message;
diff --git a/src/settings.tsx b/src/settings.tsx
index 75d5f487..3f30bad9 100644
--- a/src/settings.tsx
+++ b/src/settings.tsx
@@ -24,12 +24,14 @@ const VERSION = __PROMPT_VERSION__;
// @ts-ignore
const BUILD = __PROMPT_BUILD__;
-const WebShareMarkdown = `
+const WebShareConfirmMarkdown = `
You are about to share a terminal tab on the web. Please make sure that you do
NOT share any private information, keys, passwords, or other sensitive information.
You are responsible for what you are sharing, be smart.
+`.trim();
-See [Terms of Service](https://www.getprompt.dev/tos.html) for more details.
+const WebStopShareConfirmMarkdown = `
+Are you sure you want to stop web-sharing this screen?
`.trim();
function commandRtnHandler(prtn : Promise, errorMessage : OV) {
@@ -102,8 +104,15 @@ class ScreenSettingsModal extends React.Component<{sessionId : string, screenId
if (screen.isWebShared() == val) {
return;
}
- let prtn = GlobalCommandRunner.screenWebShare(screen.screenId, val);
- commandRtnHandler(prtn, this.errorMessage);
+ let message = (val ? WebShareConfirmMarkdown : WebStopShareConfirmMarkdown);
+ let alertRtn = GlobalModel.showAlert({message: message, confirm: true, markdown: true});
+ alertRtn.then((result) => {
+ if (!result) {
+ return;
+ }
+ let prtn = GlobalCommandRunner.screenWebShare(screen.screenId, val);
+ commandRtnHandler(prtn, this.errorMessage);
+ });
}
@boundMethod
diff --git a/src/sh2.less b/src/sh2.less
index 88dcdd92..2a18426f 100644
--- a/src/sh2.less
+++ b/src/sh2.less
@@ -51,7 +51,9 @@
html, body, #app, #main {
background-color: #000;
height: 100vh;
+}
+.content {
a:hover {
color: #485fc7;
}
@@ -981,6 +983,10 @@ body::-webkit-scrollbar {
.bottom-spacer {
height: 10px;
}
+
+ a:hover {
+ color: white;
+ }
}
.menu-label {
@@ -1041,7 +1047,8 @@ body::-webkit-scrollbar {
align-items: center;
.session-num {
- width: 14px;
+ width: 24px;
+ margin-left: -12px;
}
.session-gear {
diff --git a/src/webshare-client-view.tsx b/src/webshare-client-view.tsx
new file mode 100644
index 00000000..a4c20033
--- /dev/null
+++ b/src/webshare-client-view.tsx
@@ -0,0 +1,32 @@
+import * as React from "react";
+import * as mobxReact from "mobx-react";
+import * as mobx from "mobx";
+import {sprintf} from "sprintf-js";
+import {boundMethod} from "autobind-decorator";
+import {v4 as uuidv4} from "uuid";
+import dayjs from "dayjs";
+import {If, For, When, Otherwise, Choose} from "tsx-control-statements/components";
+import cn from "classnames";
+import {GlobalModel, GlobalCommandRunner} from "./model";
+
+@mobxReact.observer
+class WebShareView extends React.Component<{}, {}> {
+ @boundMethod
+ closeView() : void {
+ GlobalModel.showSessionView();
+ }
+
+ render() {
+ let isHidden = (GlobalModel.activeMainView.get() != "bookmarks");
+ if (isHidden) {
+ return null;
+ }
+ return (
+
+
+ );
+ }
+}
+
+export {WebShareView};
+