Files
mnote/luckysheet-crdt-master/src/main.ts
T

87 lines
2.7 KiB
TypeScript
Raw Normal View History

/**
* @author https://gitee.com/wfeng0/luckysheet-crdt
* @description Luckysheet CRDT 协同全功能实现 - Web App
* @license Apache 2.0
* @copyright Copyright (c) 2025 https://gitee.com/wfeng0/luckysheet-crdt
* @time 2024年12月05日
*/
import "./style/index.css";
import { API_getWorkerBook } from "./axios";
import { defaultSheetData, WS_SERVER_URL } from "./config";
import { uploadImage, imageUrlHandle, getRandom, getLoadUrl, registerPlugins } from "./utils";
window.onload = initLuckysheet;
const luckysheet = Reflect.get(window, "luckysheet");
/**
* 需要监听刷新、退出浏览器事件,关闭socket 连接,避免协同异常
*/
window.onbeforeunload = () => luckysheet && luckysheet.closeWebSocket();
/**
* 初始化前台 Luckysheet
* 请注意,目前前台仅为展示,并无其他能力,因此加载的是默认协同演示 worker books 数据,gridkey = gridkey_demo
* 常理来说,当前工作簿的数据,都应该通过 fileid (gridkey 请求得来
*/
async function initLuckysheet() {
const id = getRandom();
const username = encodeURIComponent(`用户_${id}`);
const gridKey = "gridkey_demo"; // 请注意大小写哈~
const options = {
lang: "zh",
title: "Luckysheet",
container: "luckysheetContainer",
// showinfobar: false, // 隐藏顶部的信息栏
// showlogo: false, // 隐藏顶部的 logo
allowUpdate: false, // 配置协同功能
loadUrl: "",
updateUrl: "", // 协同服务转发服务
plugins: registerPlugins(),
menuHandler: {
customs: [
{
label: "测试",
value: "demo",
},
],
},
};
// 是否开启协同模式
const isCollaboration = true;
if (!isCollaboration) return luckysheet.create(options);
try {
// 根据 gridkey 请求当前 workerbook 数据
const { data } = await API_getWorkerBook(gridKey);
// 定义请求是否成功
const isSuccess = data.code === 200;
/**
* 兼容无数据库服务场景
* 1. 如果请求成功,则使用数据库配置的 workerbook 数据
* 2. 如果请求失败,则使用默认配置的 workerbook 数据
*/
options.lang = isSuccess ? data.data.lang : "zh";
options.title = isSuccess ? data.data.title : "未命名工作簿";
// 协同场景下,才进行图片优化
Reflect.set(options, "uploadImage", uploadImage);
Reflect.set(options, "imageUrlHandle", imageUrlHandle);
options.allowUpdate = true;
options.loadUrl = getLoadUrl(gridKey);
options.updateUrl = `${WS_SERVER_URL}?type=luckysheet&userid=${id}&username=${username}&gridkey=${gridKey}`;
luckysheet.create(options);
} catch (error) {
console.error("==> 协同服务异常", error);
// 不然初始化普通模式,避免页面空白
Reflect.set(options, "data", defaultSheetData);
luckysheet.create(options);
}
}