Files
notesnook/packages/editor-mobile/src/utils/index.ts

150 lines
3.5 KiB
TypeScript
Raw Normal View History

2022-07-16 13:49:32 +05:00
import { ToolbarGroupDefinition } from "@streetwriters/editor";
import { Editor } from "@streetwriters/editor";
2022-06-23 19:14:55 +05:00
import { Dispatch, MutableRefObject, RefObject, SetStateAction } from "react";
import { useEditorController } from "../hooks/useEditorController";
export type SafeAreaType = {
top: number;
left: number;
bottom: number;
right: number;
};
export type Settings = {
readonly: boolean;
fullscreen: boolean;
deviceMode: "mobile" | "smallTablet" | "tablet";
premium: boolean;
2022-06-27 18:39:59 +05:00
tools: ToolbarGroupDefinition[];
2022-06-30 09:47:04 +05:00
noToolbar?: boolean;
noHeader?: boolean;
2022-07-18 16:27:11 +05:00
keyboardShown?: boolean;
2022-08-06 23:39:07 +05:00
doubleSpacedLines?: boolean;
2022-06-23 19:14:55 +05:00
};
declare global {
2022-06-30 09:47:04 +05:00
var readonly: boolean;
var noToolbar: boolean;
var noHeader: boolean;
2022-06-23 19:14:55 +05:00
/**
* Id of current session
*/
var sessionId: string;
/**
* Current tiptap instance
*/
var editor: Editor | null;
/**
* Current editor controller
*/
var editorController: ReturnType<typeof useEditorController>;
var settingsController: {
update: (settings: Settings) => void;
previous: Settings;
set?: Dispatch<SetStateAction<Settings>>;
};
var premiumController: {
update: (premium: boolean) => void;
previous: boolean;
set?: Dispatch<SetStateAction<boolean>>;
};
var safeAreaController: {
update: (insets: SafeAreaType) => void;
reset: () => void;
previous: SafeAreaType;
set?: Dispatch<
SetStateAction<{
top: number;
bottom: number;
left: number;
right: number;
}>
>;
};
var editorTitle: RefObject<HTMLInputElement>;
/**
* Global ref to manage tags in editor.
*/
var editorTags: MutableRefObject<{
setTags: React.Dispatch<
React.SetStateAction<{ title: string; alias: string }[]>
>;
}>;
function logger(type: "info" | "warn" | "error", ...logs: any[]): void;
/**
* Function to post message to react native
* @param type
* @param value
*/
function post(type: string, value?: unknown): void;
interface Window {
/**
* React Native WebView
*/
ReactNativeWebView: {
postMessage: (data: string) => void;
};
}
}
2022-07-20 23:15:04 +05:00
export const timerFn = (callback: () => void, duration: number) => {
// timer = setTimeout(callback, duration);
// return timer;
2022-06-23 19:14:55 +05:00
};
export const EventTypes = {
selection: "editor-event:selection",
content: "editor-event:content",
title: "editor-event:title",
scroll: "editor-event:scroll",
history: "editor-event:history",
newtag: "editor-event:newtag",
tag: "editor-event:tag",
filepicker: "editor-event:picker",
download: "editor-event:download-attachment",
logger: "native:logger",
back: "editor-event:back",
pro: "editor-event:pro",
monograph: "editor-event:monograph",
properties: "editor-event:properties",
2022-07-18 16:27:11 +05:00
fullscreen: "editor-event:fullscreen",
2022-06-23 19:14:55 +05:00
};
export function isReactNative(): boolean {
return !!window.ReactNativeWebView;
}
export function logger(type: "info" | "warn" | "error", ...logs: any[]) {
let logString = logs
.map((log) => {
return typeof log !== "string" ? JSON.stringify(log) : log;
})
.join(" ");
post(EventTypes.logger, `[${type}]: ` + logString);
}
export function post(type: string, value?: unknown) {
if (isReactNative()) {
window.ReactNativeWebView.postMessage(
JSON.stringify({
//@ts-ignore
type: EventTypes[type] || type,
value: value,
2022-07-18 16:27:11 +05:00
sessionId: global.sessionId,
2022-06-23 19:14:55 +05:00
})
);
} else {
console.log(type, value);
}
}
globalThis.logger = logger;
globalThis.post = post;