浏览代码

chore: [Idle detection] Deal with users on systems that don't handle emoji (#2941)

* Deal with users on systems that don't handle emoji

* Leave no trailing space

* Move function to utils, and actually call it 🤣
Chapeau, TypeScript!

* Use grinning face instead of koala

* Tweak globalAlpha
Thomas Steiner 4 年之前
父节点
当前提交
1a67642fd1
共有 2 个文件被更改,包括 39 次插入9 次删除
  1. 22 9
      src/renderer/renderScene.ts
  2. 17 0
      src/utils.ts

+ 22 - 9
src/renderer/renderScene.ts

@@ -47,9 +47,11 @@ import {
   TransformHandles,
   TransformHandles,
   TransformHandleType,
   TransformHandleType,
 } from "../element/transformHandles";
 } from "../element/transformHandles";
-import { viewportCoordsToSceneCoords } from "../utils";
+import { viewportCoordsToSceneCoords, supportsEmoji } from "../utils";
 import { UserIdleState } from "../excalidraw-app/collab/types";
 import { UserIdleState } from "../excalidraw-app/collab/types";
 
 
+const hasEmojiSupport = supportsEmoji();
+
 const strokeRectWithRotation = (
 const strokeRectWithRotation = (
   context: CanvasRenderingContext2D,
   context: CanvasRenderingContext2D,
   x: number,
   x: number,
@@ -449,7 +451,7 @@ export const renderScene = (
 
 
     const userState = sceneState.remotePointerUserStates[clientId];
     const userState = sceneState.remotePointerUserStates[clientId];
     if (isOutOfBounds || userState === UserIdleState.AWAY) {
     if (isOutOfBounds || userState === UserIdleState.AWAY) {
-      context.globalAlpha = 0.2;
+      context.globalAlpha = 0.48;
     }
     }
 
 
     if (
     if (
@@ -481,13 +483,24 @@ export const renderScene = (
     context.stroke();
     context.stroke();
 
 
     const username = sceneState.remotePointerUsernames[clientId];
     const username = sceneState.remotePointerUsernames[clientId];
-    const usernameAndIdleState = `${username ? `${username} ` : ""}${
-      userState === UserIdleState.AWAY
-        ? "⚫️"
-        : userState === UserIdleState.IDLE
-        ? "💤"
-        : "🟢"
-    }`;
+    let usernameAndIdleState;
+    if (hasEmojiSupport) {
+      usernameAndIdleState = `${username ? `${username} ` : ""}${
+        userState === UserIdleState.AWAY
+          ? "⚫️"
+          : userState === UserIdleState.IDLE
+          ? "💤"
+          : "🟢"
+      }`;
+    } else {
+      usernameAndIdleState = `${username ? `${username}` : ""}${
+        userState === UserIdleState.AWAY
+          ? ` (${UserIdleState.AWAY})`
+          : userState === UserIdleState.IDLE
+          ? ` (${UserIdleState.IDLE})`
+          : ""
+      }`;
+    }
 
 
     if (!isOutOfBounds && usernameAndIdleState) {
     if (!isOutOfBounds && usernameAndIdleState) {
       const offsetX = x + width;
       const offsetX = x + width;

+ 17 - 0
src/utils.ts

@@ -369,3 +369,20 @@ export const getVersion = () => {
     DEFAULT_VERSION
     DEFAULT_VERSION
   );
   );
 };
 };
+
+// Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js
+export const supportsEmoji = () => {
+  const canvas = document.createElement("canvas");
+  const ctx = canvas.getContext("2d");
+  if (!ctx) {
+    return false;
+  }
+  const offset = 12;
+  ctx.fillStyle = "#f00";
+  ctx.textBaseline = "top";
+  ctx.font = "32px Arial";
+  // Modernizr used 🐨, but it is sort of supported on Windows 7.
+  // Luckily 😀 isn't supported.
+  ctx.fillText("😀", 0, 0);
+  return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;
+};