mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-23 21:38:44 +08:00
chore(editor): reorg packages (#10702)
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
class RandomPicker<T> {
|
||||
private _copyArray: T[];
|
||||
|
||||
private readonly _originalArray: T[];
|
||||
|
||||
constructor(array: T[]) {
|
||||
this._originalArray = [...array];
|
||||
this._copyArray = [...array];
|
||||
}
|
||||
|
||||
private randomIndex(max: number): number {
|
||||
return Math.floor(Math.random() * max);
|
||||
}
|
||||
|
||||
pick(): T {
|
||||
if (this._copyArray.length === 0) {
|
||||
this._copyArray = [...this._originalArray];
|
||||
}
|
||||
|
||||
const index = this.randomIndex(this._copyArray.length);
|
||||
const item = this._copyArray[index];
|
||||
this._copyArray.splice(index, 1);
|
||||
return item;
|
||||
}
|
||||
}
|
||||
|
||||
export const multiPlayersColor = new RandomPicker([
|
||||
'var(--affine-multi-players-purple)',
|
||||
'var(--affine-multi-players-magenta)',
|
||||
'var(--affine-multi-players-red)',
|
||||
'var(--affine-multi-players-orange)',
|
||||
'var(--affine-multi-players-green)',
|
||||
'var(--affine-multi-players-blue)',
|
||||
'var(--affine-multi-players-brown)',
|
||||
'var(--affine-multi-players-grey)',
|
||||
]);
|
||||
@@ -0,0 +1,42 @@
|
||||
import { EditPropsStore } from '@blocksuite/affine-shared/services';
|
||||
import type { BlockStdScope } from '@blocksuite/block-std';
|
||||
|
||||
import { multiPlayersColor } from './color-picker';
|
||||
|
||||
export class RemoteColorManager {
|
||||
private get awarenessStore() {
|
||||
return this.std.store.awarenessStore;
|
||||
}
|
||||
|
||||
constructor(readonly std: BlockStdScope) {
|
||||
const sessionColor = this.std.get(EditPropsStore).getStorage('remoteColor');
|
||||
if (sessionColor) {
|
||||
this.awarenessStore.awareness.setLocalStateField('color', sessionColor);
|
||||
return;
|
||||
}
|
||||
|
||||
const pickColor = multiPlayersColor.pick();
|
||||
this.awarenessStore.awareness.setLocalStateField('color', pickColor);
|
||||
this.std.get(EditPropsStore).setStorage('remoteColor', pickColor);
|
||||
}
|
||||
|
||||
get(id: number) {
|
||||
const awarenessColor = this.awarenessStore.getStates().get(id)?.color;
|
||||
if (awarenessColor) {
|
||||
return awarenessColor;
|
||||
}
|
||||
|
||||
if (id !== this.awarenessStore.awareness.clientID) return null;
|
||||
|
||||
const sessionColor = this.std.get(EditPropsStore).getStorage('remoteColor');
|
||||
if (sessionColor) {
|
||||
this.awarenessStore.awareness.setLocalStateField('color', sessionColor);
|
||||
return sessionColor;
|
||||
}
|
||||
|
||||
const pickColor = multiPlayersColor.pick();
|
||||
this.awarenessStore.awareness.setLocalStateField('color', pickColor);
|
||||
this.std.get(EditPropsStore).setStorage('remoteColor', pickColor);
|
||||
return pickColor;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user