Files
T

87 lines
2.7 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* @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);
}
}