feat: support get datasource status (#3645)

This commit is contained in:
Alex Yang
2023-08-10 01:05:34 -04:00
committed by GitHub
parent 05144abd6a
commit dafd5619e6
34 changed files with 836 additions and 46 deletions
+5
View File
@@ -0,0 +1,5 @@
# AFFiNE Prototype
> This is a prototype of the AFFiNE system to test the feasibility of the approach.
>
> It is not intended for production use.
+15
View File
@@ -0,0 +1,15 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>AFFiNE Prototype</title>
</head>
<body>
<ul>
<li>
<a href="suite/provider-status.html">Provider status test</a>
</li>
</ul>
</body>
</html>
+40
View File
@@ -0,0 +1,40 @@
{
"name": "@affine/prototype",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite --host --port 3003",
"build": "tsc -b && vite build",
"preview": "vite preview --host --port 3003"
},
"dependencies": {
"@affine-test/fixtures": "workspace:*",
"@affine/component": "workspace:*",
"@affine/debug": "workspace:*",
"@affine/env": "workspace:*",
"@affine/graphql": "workspace:*",
"@affine/i18n": "workspace:*",
"@affine/jotai": "workspace:*",
"@affine/templates": "workspace:*",
"@affine/workspace": "workspace:*",
"@blocksuite/block-std": "0.0.0-20230809030546-32e6e21d-nightly",
"@blocksuite/blocks": "0.0.0-20230809030546-32e6e21d-nightly",
"@blocksuite/editor": "0.0.0-20230809030546-32e6e21d-nightly",
"@blocksuite/global": "0.0.0-20230809030546-32e6e21d-nightly",
"@blocksuite/icons": "^2.1.31",
"@blocksuite/lit": "0.0.0-20230809030546-32e6e21d-nightly",
"@blocksuite/store": "0.0.0-20230809030546-32e6e21d-nightly",
"@toeverything/hooks": "workspace:*",
"@toeverything/y-indexeddb": "workspace:*",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"devDependencies": {
"@types/react": "^18.2.20",
"@types/react-dom": "^18.2.7",
"@vitejs/plugin-react-swc": "^3.3.2",
"typescript": "^5.1.6",
"vite": "^4.4.9"
}
}
+16
View File
@@ -0,0 +1,16 @@
{
"name": "prototype",
"$schema": "../../node_modules/nx/schemas/project-schema.json",
"projectType": "application",
"sourceRoot": "apps/prototype/src",
"targets": {
"build": {
"executor": "nx:run-script",
"dependsOn": ["^build"],
"options": {
"script": "build"
},
"outputs": ["{projectRoot}/dist"]
}
}
}
+57
View File
@@ -0,0 +1,57 @@
import type { LocalIndexedDBBackgroundProvider } from '@affine/env/workspace';
import { createIndexedDBBackgroundProvider } from '@affine/workspace/providers';
import { assertExists } from '@blocksuite/global/utils';
import { useDataSourceStatus } from '@toeverything/hooks/use-data-source-status';
import React, { useCallback, useRef } from 'react';
import ReactDOM from 'react-dom/client';
import { Awareness } from 'y-protocols/awareness';
import { Doc } from 'yjs';
const doc = new Doc();
const map = doc.getMap();
const awareness = new Awareness(doc);
const indexeddbProvider = createIndexedDBBackgroundProvider('test', doc, {
awareness,
}) as LocalIndexedDBBackgroundProvider;
indexeddbProvider.connect();
const App = () => {
const counterRef = useRef(0);
const disposeRef = useRef<number>(0);
const status = useDataSourceStatus(indexeddbProvider);
return (
<div>
<button
data-testid="start-button"
onClick={useCallback(() => {
disposeRef.current = setInterval(() => {
const counter = counterRef.current;
map.set('counter', counter + 1);
counterRef.current = counter + 1;
}, 0) as any;
}, [])}
>
start writing
</button>
<button
data-testid="stop-button"
onClick={useCallback(() => {
clearInterval(disposeRef.current);
}, [])}
>
stop writing
</button>
<div data-testid="status">{status.type}</div>
</div>
);
};
const root = document.getElementById('root');
assertExists(root);
ReactDOM.createRoot(root).render(
<React.StrictMode>
<App />
</React.StrictMode>
);
+1
View File
@@ -0,0 +1 @@
/// <reference types="vite/client" />
+12
View File
@@ -0,0 +1,12 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Provider status test</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="../src/provider-status.tsx"></script>
</body>
</html>
+40
View File
@@ -0,0 +1,40 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"moduleResolution": "bundler",
"outDir": "./lib"
},
"include": ["./src"],
"references": [
{
"path": "../../packages/component"
},
{
"path": "../../packages/debug"
},
{
"path": "../../packages/env"
},
{
"path": "../../packages/graphql"
},
{
"path": "../../packages/hooks"
},
{
"path": "../../packages/i18n"
},
{
"path": "../../packages/jotai"
},
{
"path": "../../packages/y-indexeddb"
},
{
"path": "../../packages/workspace"
},
{
"path": "./tsconfig.node.json"
}
]
}
+11
View File
@@ -0,0 +1,11 @@
{
"compilerOptions": {
"composite": true,
"skipLibCheck": true,
"module": "ESNext",
"moduleResolution": "bundler",
"outDir": "./lib",
"allowSyntheticDefaultImports": true
},
"include": ["vite.config.ts"]
}
+22
View File
@@ -0,0 +1,22 @@
import { resolve } from 'node:path';
import react from '@vitejs/plugin-react-swc';
import { defineConfig } from 'vite';
// https://vitejs.dev/config/
export default defineConfig({
build: {
target: 'ES2022',
sourcemap: true,
rollupOptions: {
input: {
'suite/provider-status': resolve(
__dirname,
'suite',
'provider-status.html'
),
},
},
},
plugins: [react()],
});