mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
refactor: database row and cell notification (#5237)
* refactor: database row and cell notification * chore: clippy * chore: fix test
This commit is contained in:
parent
e1e8747f15
commit
7831d8d4ab
@ -64,7 +64,7 @@ class DatabaseViewListener {
|
|||||||
(error) => _rowsVisibility?.value = FlowyResult.failure(error),
|
(error) => _rowsVisibility?.value = FlowyResult.failure(error),
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case DatabaseNotification.DidUpdateViewRows:
|
case DatabaseNotification.DidUpdateRow:
|
||||||
result.fold(
|
result.fold(
|
||||||
(payload) => _rowsNotifier?.value =
|
(payload) => _rowsNotifier?.value =
|
||||||
FlowyResult.success(RowsChangePB.fromBuffer(payload)),
|
FlowyResult.success(RowsChangePB.fromBuffer(payload)),
|
||||||
|
@ -175,10 +175,10 @@ class AppFlowyGridCellTest {
|
|||||||
context.makeSelectOptionCellController(fieldType, rowIndex);
|
context.makeSelectOptionCellController(fieldType, rowIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> gridResponseFuture({int milliseconds = 200}) {
|
Future<void> gridResponseFuture({int milliseconds = 400}) {
|
||||||
return Future.delayed(gridResponseDuration(milliseconds: milliseconds));
|
return Future.delayed(gridResponseDuration(milliseconds: milliseconds));
|
||||||
}
|
}
|
||||||
|
|
||||||
Duration gridResponseDuration({int milliseconds = 200}) {
|
Duration gridResponseDuration({int milliseconds = 400}) {
|
||||||
return Duration(milliseconds: milliseconds);
|
return Duration(milliseconds: milliseconds);
|
||||||
}
|
}
|
||||||
|
29
frontend/appflowy_tauri/src-tauri/Cargo.lock
generated
29
frontend/appflowy_tauri/src-tauri/Cargo.lock
generated
@ -860,7 +860,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab"
|
name = "collab"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
@ -884,7 +884,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab-database"
|
name = "collab-database"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
@ -914,7 +914,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab-document"
|
name = "collab-document"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"collab",
|
"collab",
|
||||||
@ -933,7 +933,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab-entity"
|
name = "collab-entity"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"bytes",
|
"bytes",
|
||||||
@ -948,7 +948,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab-folder"
|
name = "collab-folder"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"chrono",
|
"chrono",
|
||||||
@ -986,7 +986,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab-plugins"
|
name = "collab-plugins"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-stream",
|
"async-stream",
|
||||||
@ -1064,7 +1064,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab-user"
|
name = "collab-user"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"collab",
|
"collab",
|
||||||
@ -1293,7 +1293,7 @@ dependencies = [
|
|||||||
"cssparser-macros",
|
"cssparser-macros",
|
||||||
"dtoa-short",
|
"dtoa-short",
|
||||||
"itoa 1.0.6",
|
"itoa 1.0.6",
|
||||||
"phf 0.8.0",
|
"phf 0.11.2",
|
||||||
"smallvec",
|
"smallvec",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -1384,12 +1384,12 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dashmap"
|
name = "dashmap"
|
||||||
version = "5.4.0"
|
version = "5.5.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc"
|
checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"hashbrown 0.12.3",
|
"hashbrown 0.14.3",
|
||||||
"lock_api",
|
"lock_api",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"parking_lot_core 0.9.8",
|
"parking_lot_core 0.9.8",
|
||||||
@ -2103,12 +2103,15 @@ name = "flowy-notification"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes",
|
"bytes",
|
||||||
|
"dashmap",
|
||||||
"flowy-codegen",
|
"flowy-codegen",
|
||||||
"flowy-derive",
|
"flowy-derive",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"lib-dispatch",
|
"lib-dispatch",
|
||||||
"protobuf",
|
"protobuf",
|
||||||
"serde",
|
"serde",
|
||||||
|
"tokio",
|
||||||
|
"tokio-util",
|
||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -4722,7 +4725,7 @@ checksum = "c55e02e35260070b6f716a2423c2ff1c3bb1642ddca6f99e1f26d06268a0e2d2"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes",
|
"bytes",
|
||||||
"heck 0.4.1",
|
"heck 0.4.1",
|
||||||
"itertools 0.10.5",
|
"itertools 0.11.0",
|
||||||
"log",
|
"log",
|
||||||
"multimap",
|
"multimap",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
@ -4743,7 +4746,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e"
|
checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"itertools 0.10.5",
|
"itertools 0.11.0",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.47",
|
"syn 2.0.47",
|
||||||
|
@ -97,10 +97,10 @@ client-api = { git = "https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "af7
|
|||||||
# To switch to the local path, run:
|
# To switch to the local path, run:
|
||||||
# scripts/tool/update_collab_source.sh
|
# scripts/tool/update_collab_source.sh
|
||||||
# ⚠️⚠️⚠️️
|
# ⚠️⚠️⚠️️
|
||||||
collab = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
|
17
frontend/appflowy_web/wasm-libs/Cargo.lock
generated
17
frontend/appflowy_web/wasm-libs/Cargo.lock
generated
@ -632,7 +632,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab"
|
name = "collab"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
@ -656,7 +656,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab-document"
|
name = "collab-document"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"collab",
|
"collab",
|
||||||
@ -675,7 +675,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab-entity"
|
name = "collab-entity"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"bytes",
|
"bytes",
|
||||||
@ -690,7 +690,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab-folder"
|
name = "collab-folder"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"chrono",
|
"chrono",
|
||||||
@ -728,7 +728,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab-plugins"
|
name = "collab-plugins"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-stream",
|
"async-stream",
|
||||||
@ -805,7 +805,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab-user"
|
name = "collab-user"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"collab",
|
"collab",
|
||||||
@ -1417,12 +1417,15 @@ name = "flowy-notification"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes",
|
"bytes",
|
||||||
|
"dashmap",
|
||||||
"flowy-codegen",
|
"flowy-codegen",
|
||||||
"flowy-derive",
|
"flowy-derive",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"lib-dispatch",
|
"lib-dispatch",
|
||||||
"protobuf",
|
"protobuf",
|
||||||
"serde",
|
"serde",
|
||||||
|
"tokio",
|
||||||
|
"tokio-util",
|
||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -4981,4 +4984,4 @@ dependencies = [
|
|||||||
[[patch.unused]]
|
[[patch.unused]]
|
||||||
name = "collab-database"
|
name = "collab-database"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
|
@ -65,10 +65,10 @@ client-api = { git = "https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "af7
|
|||||||
# To switch to the local path, run:
|
# To switch to the local path, run:
|
||||||
# scripts/tool/update_collab_source.sh
|
# scripts/tool/update_collab_source.sh
|
||||||
# ⚠️⚠️⚠️️
|
# ⚠️⚠️⚠️️
|
||||||
collab = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
|
17
frontend/appflowy_web_app/src-tauri/Cargo.lock
generated
17
frontend/appflowy_web_app/src-tauri/Cargo.lock
generated
@ -843,7 +843,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab"
|
name = "collab"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
@ -867,7 +867,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab-database"
|
name = "collab-database"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
@ -897,7 +897,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab-document"
|
name = "collab-document"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"collab",
|
"collab",
|
||||||
@ -916,7 +916,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab-entity"
|
name = "collab-entity"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"bytes",
|
"bytes",
|
||||||
@ -931,7 +931,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab-folder"
|
name = "collab-folder"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"chrono",
|
"chrono",
|
||||||
@ -969,7 +969,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab-plugins"
|
name = "collab-plugins"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-stream",
|
"async-stream",
|
||||||
@ -1047,7 +1047,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab-user"
|
name = "collab-user"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"collab",
|
"collab",
|
||||||
@ -2140,12 +2140,15 @@ name = "flowy-notification"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes",
|
"bytes",
|
||||||
|
"dashmap",
|
||||||
"flowy-codegen",
|
"flowy-codegen",
|
||||||
"flowy-derive",
|
"flowy-derive",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"lib-dispatch",
|
"lib-dispatch",
|
||||||
"protobuf",
|
"protobuf",
|
||||||
"serde",
|
"serde",
|
||||||
|
"tokio",
|
||||||
|
"tokio-util",
|
||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -96,10 +96,10 @@ client-api = { git = "https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "af7
|
|||||||
# To switch to the local path, run:
|
# To switch to the local path, run:
|
||||||
# scripts/tool/update_collab_source.sh
|
# scripts/tool/update_collab_source.sh
|
||||||
# ⚠️⚠️⚠️️
|
# ⚠️⚠️⚠️️
|
||||||
collab = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
|
17
frontend/rust-lib/Cargo.lock
generated
17
frontend/rust-lib/Cargo.lock
generated
@ -785,7 +785,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab"
|
name = "collab"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
@ -809,7 +809,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab-database"
|
name = "collab-database"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
@ -839,7 +839,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab-document"
|
name = "collab-document"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"collab",
|
"collab",
|
||||||
@ -858,7 +858,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab-entity"
|
name = "collab-entity"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"bytes",
|
"bytes",
|
||||||
@ -873,7 +873,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab-folder"
|
name = "collab-folder"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"chrono",
|
"chrono",
|
||||||
@ -911,7 +911,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab-plugins"
|
name = "collab-plugins"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-stream",
|
"async-stream",
|
||||||
@ -989,7 +989,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "collab-user"
|
name = "collab-user"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=542ab275eae087f7be7207ada311c769ed1808b4#542ab275eae087f7be7207ada311c769ed1808b4"
|
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff#29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"collab",
|
"collab",
|
||||||
@ -2077,12 +2077,15 @@ name = "flowy-notification"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes",
|
"bytes",
|
||||||
|
"dashmap",
|
||||||
"flowy-codegen",
|
"flowy-codegen",
|
||||||
"flowy-derive",
|
"flowy-derive",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"lib-dispatch",
|
"lib-dispatch",
|
||||||
"protobuf",
|
"protobuf",
|
||||||
"serde",
|
"serde",
|
||||||
|
"tokio",
|
||||||
|
"tokio-util",
|
||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -125,10 +125,10 @@ client-api = { git = " https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "af
|
|||||||
# To switch to the local path, run:
|
# To switch to the local path, run:
|
||||||
# scripts/tool/update_collab_source.sh
|
# scripts/tool/update_collab_source.sh
|
||||||
# ⚠️⚠️⚠️️
|
# ⚠️⚠️⚠️️
|
||||||
collab = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "542ab275eae087f7be7207ada311c769ed1808b4" }
|
collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "29475f0ec00dc06b42da68bc54efa5b7c1bcd0ff" }
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use flowy_derive::ProtoBuf_Enum;
|
use flowy_derive::ProtoBuf_Enum;
|
||||||
use flowy_notification::NotificationBuilder;
|
use flowy_notification::NotificationBuilder;
|
||||||
|
|
||||||
const DATABASE_OBSERVABLE_SOURCE: &str = "Database";
|
pub(crate) const DATABASE_OBSERVABLE_SOURCE: &str = "Database";
|
||||||
|
|
||||||
#[derive(ProtoBuf_Enum, Debug, Default)]
|
#[derive(ProtoBuf_Enum, Debug, Default)]
|
||||||
pub enum DatabaseNotification {
|
pub enum DatabaseNotification {
|
||||||
@ -11,7 +11,7 @@ pub enum DatabaseNotification {
|
|||||||
/// storage.
|
/// storage.
|
||||||
DidFetchRow = 19,
|
DidFetchRow = 19,
|
||||||
/// Trigger after inserting/deleting/updating a row
|
/// Trigger after inserting/deleting/updating a row
|
||||||
DidUpdateViewRows = 20,
|
DidUpdateRow = 20,
|
||||||
/// Trigger when the visibility of the row was changed. For example, updating the filter will trigger the notification
|
/// Trigger when the visibility of the row was changed. For example, updating the filter will trigger the notification
|
||||||
DidUpdateViewRowsVisibility = 21,
|
DidUpdateViewRowsVisibility = 21,
|
||||||
/// Trigger after inserting/deleting/updating a field
|
/// Trigger after inserting/deleting/updating a field
|
||||||
@ -64,7 +64,7 @@ impl std::convert::From<i32> for DatabaseNotification {
|
|||||||
fn from(notification: i32) -> Self {
|
fn from(notification: i32) -> Self {
|
||||||
match notification {
|
match notification {
|
||||||
19 => DatabaseNotification::DidFetchRow,
|
19 => DatabaseNotification::DidFetchRow,
|
||||||
20 => DatabaseNotification::DidUpdateViewRows,
|
20 => DatabaseNotification::DidUpdateRow,
|
||||||
21 => DatabaseNotification::DidUpdateViewRowsVisibility,
|
21 => DatabaseNotification::DidUpdateViewRowsVisibility,
|
||||||
22 => DatabaseNotification::DidUpdateFields,
|
22 => DatabaseNotification::DidUpdateFields,
|
||||||
40 => DatabaseNotification::DidUpdateCell,
|
40 => DatabaseNotification::DidUpdateCell,
|
||||||
|
@ -4,7 +4,6 @@ use crate::services::calculations::Calculation;
|
|||||||
use crate::services::cell::{apply_cell_changeset, get_cell_protobuf, CellCache};
|
use crate::services::cell::{apply_cell_changeset, get_cell_protobuf, CellCache};
|
||||||
use crate::services::database::database_observe::*;
|
use crate::services::database::database_observe::*;
|
||||||
use crate::services::database::util::database_view_setting_pb_from_view;
|
use crate::services::database::util::database_view_setting_pb_from_view;
|
||||||
use crate::services::database::UpdatedRow;
|
|
||||||
use crate::services::database_view::{
|
use crate::services::database_view::{
|
||||||
DatabaseViewChanged, DatabaseViewEditor, DatabaseViewOperation, DatabaseViews, EditorByViewId,
|
DatabaseViewChanged, DatabaseViewEditor, DatabaseViewOperation, DatabaseViews, EditorByViewId,
|
||||||
};
|
};
|
||||||
@ -27,6 +26,7 @@ use collab_database::views::{
|
|||||||
DatabaseLayout, DatabaseView, FilterMap, LayoutSetting, OrderObjectPosition,
|
DatabaseLayout, DatabaseView, FilterMap, LayoutSetting, OrderObjectPosition,
|
||||||
};
|
};
|
||||||
use flowy_error::{internal_error, ErrorCode, FlowyError, FlowyResult};
|
use flowy_error::{internal_error, ErrorCode, FlowyError, FlowyResult};
|
||||||
|
use flowy_notification::DebounceNotificationSender;
|
||||||
use lib_infra::box_any::BoxAny;
|
use lib_infra::box_any::BoxAny;
|
||||||
use lib_infra::future::{to_fut, Fut, FutureResult};
|
use lib_infra::future::{to_fut, Fut, FutureResult};
|
||||||
use lib_infra::priority_task::TaskDispatcher;
|
use lib_infra::priority_task::TaskDispatcher;
|
||||||
@ -41,6 +41,9 @@ pub struct DatabaseEditor {
|
|||||||
database: Arc<MutexDatabase>,
|
database: Arc<MutexDatabase>,
|
||||||
pub cell_cache: CellCache,
|
pub cell_cache: CellCache,
|
||||||
database_views: Arc<DatabaseViews>,
|
database_views: Arc<DatabaseViews>,
|
||||||
|
#[allow(dead_code)]
|
||||||
|
/// Used to send notification to the frontend.
|
||||||
|
notification_sender: Arc<DebounceNotificationSender>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DatabaseEditor {
|
impl DatabaseEditor {
|
||||||
@ -48,6 +51,7 @@ impl DatabaseEditor {
|
|||||||
database: Arc<MutexDatabase>,
|
database: Arc<MutexDatabase>,
|
||||||
task_scheduler: Arc<RwLock<TaskDispatcher>>,
|
task_scheduler: Arc<RwLock<TaskDispatcher>>,
|
||||||
) -> FlowyResult<Self> {
|
) -> FlowyResult<Self> {
|
||||||
|
let notification_sender = Arc::new(DebounceNotificationSender::new(200));
|
||||||
let cell_cache = AnyTypeCache::<u64>::new();
|
let cell_cache = AnyTypeCache::<u64>::new();
|
||||||
let database_id = database.lock().get_database_id();
|
let database_id = database.lock().get_database_id();
|
||||||
|
|
||||||
@ -55,7 +59,7 @@ impl DatabaseEditor {
|
|||||||
observe_sync_state(&database_id, &database).await;
|
observe_sync_state(&database_id, &database).await;
|
||||||
// observe_view_change(&database_id, &database).await;
|
// observe_view_change(&database_id, &database).await;
|
||||||
// observe_field_change(&database_id, &database).await;
|
// observe_field_change(&database_id, &database).await;
|
||||||
// observe_rows_change(&database_id, &database).await;
|
observe_rows_change(&database_id, &database, ¬ification_sender).await;
|
||||||
// observe_block_event(&database_id, &database).await;
|
// observe_block_event(&database_id, &database).await;
|
||||||
|
|
||||||
// Used to cache the view of the database for fast access.
|
// Used to cache the view of the database for fast access.
|
||||||
@ -81,6 +85,7 @@ impl DatabaseEditor {
|
|||||||
database,
|
database,
|
||||||
cell_cache,
|
cell_cache,
|
||||||
database_views,
|
database_views,
|
||||||
|
notification_sender,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -154,7 +159,7 @@ impl DatabaseEditor {
|
|||||||
|
|
||||||
if !changes.is_empty() {
|
if !changes.is_empty() {
|
||||||
for view in self.database_views.editors().await {
|
for view in self.database_views.editors().await {
|
||||||
send_notification(&view.view_id, DatabaseNotification::DidUpdateViewRows)
|
send_notification(&view.view_id, DatabaseNotification::DidUpdateRow)
|
||||||
.payload(changes.clone())
|
.payload(changes.clone())
|
||||||
.send();
|
.send();
|
||||||
}
|
}
|
||||||
@ -497,7 +502,7 @@ impl DatabaseEditor {
|
|||||||
let insert_row = InsertedRowPB::new(RowMetaPB::from(row_detail)).with_index(index as i32);
|
let insert_row = InsertedRowPB::new(RowMetaPB::from(row_detail)).with_index(index as i32);
|
||||||
let changes = RowsChangePB::from_move(vec![delete_row_id], vec![insert_row]);
|
let changes = RowsChangePB::from_move(vec![delete_row_id], vec![insert_row]);
|
||||||
|
|
||||||
send_notification(view_id, DatabaseNotification::DidUpdateViewRows)
|
send_notification(view_id, DatabaseNotification::DidUpdateRow)
|
||||||
.payload(changes)
|
.payload(changes)
|
||||||
.send();
|
.send();
|
||||||
}
|
}
|
||||||
@ -788,10 +793,6 @@ impl DatabaseEditor {
|
|||||||
.v_did_update_row(&Some(row_detail.clone()), &row_detail, None)
|
.v_did_update_row(&Some(row_detail.clone()), &row_detail, None)
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
|
||||||
self
|
|
||||||
.notify_update_row(view_id, row_detail.row.id, vec![])
|
|
||||||
.await;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Update a cell in the database.
|
/// Update a cell in the database.
|
||||||
@ -851,15 +852,6 @@ impl DatabaseEditor {
|
|||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let changeset = CellChangesetNotifyPB {
|
|
||||||
view_id: view_id.to_string(),
|
|
||||||
row_id: row_id.clone().into_inner(),
|
|
||||||
field_id: field_id.to_string(),
|
|
||||||
};
|
|
||||||
self
|
|
||||||
.notify_update_row(view_id, row_id, vec![changeset])
|
|
||||||
.await;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_auto_updated_fields_changesets(
|
pub fn get_auto_updated_fields_changesets(
|
||||||
@ -1082,13 +1074,6 @@ impl DatabaseEditor {
|
|||||||
self.database.lock().update_row(&row_detail.row.id, |row| {
|
self.database.lock().update_row(&row_detail.row.id, |row| {
|
||||||
row.set_cells(Cells::from(row_changeset.cell_by_field_id.clone()));
|
row.set_cells(Cells::from(row_changeset.cell_by_field_id.clone()));
|
||||||
});
|
});
|
||||||
|
|
||||||
let changesets = cell_changesets_from_cell_by_field_id(
|
|
||||||
view_id,
|
|
||||||
row_changeset.row_id,
|
|
||||||
row_changeset.cell_by_field_id,
|
|
||||||
);
|
|
||||||
self.notify_update_row(view_id, from_row, changesets).await;
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1337,58 +1322,6 @@ impl DatabaseEditor {
|
|||||||
pub fn get_mutex_database(&self) -> &MutexDatabase {
|
pub fn get_mutex_database(&self) -> &MutexDatabase {
|
||||||
&self.database
|
&self.database
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn notify_update_row(
|
|
||||||
&self,
|
|
||||||
view_id: &str,
|
|
||||||
row: RowId,
|
|
||||||
extra_changesets: Vec<CellChangesetNotifyPB>,
|
|
||||||
) {
|
|
||||||
let mut changesets = self.get_auto_updated_fields_changesets(view_id, row);
|
|
||||||
changesets.extend(extra_changesets);
|
|
||||||
|
|
||||||
notify_did_update_cell(changesets.clone()).await;
|
|
||||||
notify_did_update_row(changesets).await;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) async fn notify_did_update_cell(changesets: Vec<CellChangesetNotifyPB>) {
|
|
||||||
for changeset in changesets {
|
|
||||||
let id = format!("{}:{}", changeset.row_id, changeset.field_id);
|
|
||||||
send_notification(&id, DatabaseNotification::DidUpdateCell).send();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn notify_did_update_row(changesets: Vec<CellChangesetNotifyPB>) {
|
|
||||||
let row_id = changesets[0].row_id.clone();
|
|
||||||
let view_id = changesets[0].view_id.clone();
|
|
||||||
|
|
||||||
let field_ids = changesets
|
|
||||||
.iter()
|
|
||||||
.map(|changeset| changeset.field_id.to_string())
|
|
||||||
.collect();
|
|
||||||
let update_row = UpdatedRow::new(&row_id).with_field_ids(field_ids);
|
|
||||||
let update_changeset = RowsChangePB::from_update(update_row.into());
|
|
||||||
|
|
||||||
send_notification(&view_id, DatabaseNotification::DidUpdateViewRows)
|
|
||||||
.payload(update_changeset)
|
|
||||||
.send();
|
|
||||||
}
|
|
||||||
|
|
||||||
fn cell_changesets_from_cell_by_field_id(
|
|
||||||
view_id: &str,
|
|
||||||
row_id: RowId,
|
|
||||||
cell_by_field_id: HashMap<String, Cell>,
|
|
||||||
) -> Vec<CellChangesetNotifyPB> {
|
|
||||||
let row_id = row_id.into_inner();
|
|
||||||
cell_by_field_id
|
|
||||||
.into_keys()
|
|
||||||
.map(|field_id| CellChangesetNotifyPB {
|
|
||||||
view_id: view_id.to_string(),
|
|
||||||
row_id: row_id.clone(),
|
|
||||||
field_id,
|
|
||||||
})
|
|
||||||
.collect()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct DatabaseViewOperationImpl {
|
struct DatabaseViewOperationImpl {
|
||||||
|
@ -1,14 +1,16 @@
|
|||||||
use crate::entities::{DatabaseSyncStatePB, DidFetchRowPB};
|
use crate::entities::{DatabaseSyncStatePB, DidFetchRowPB, RowsChangePB};
|
||||||
use crate::notification::{send_notification, DatabaseNotification};
|
use crate::notification::{send_notification, DatabaseNotification, DATABASE_OBSERVABLE_SOURCE};
|
||||||
|
use crate::services::database::UpdatedRow;
|
||||||
use collab_database::blocks::BlockEvent;
|
use collab_database::blocks::BlockEvent;
|
||||||
use collab_database::database::MutexDatabase;
|
use collab_database::database::MutexDatabase;
|
||||||
use collab_database::fields::FieldChange;
|
use collab_database::fields::FieldChange;
|
||||||
use collab_database::rows::RowChange;
|
use collab_database::rows::{RowChange, RowId};
|
||||||
use collab_database::views::DatabaseViewChange;
|
use collab_database::views::DatabaseViewChange;
|
||||||
|
use flowy_notification::{DebounceNotificationSender, NotificationBuilder};
|
||||||
use futures::StreamExt;
|
use futures::StreamExt;
|
||||||
use lib_dispatch::prelude::af_spawn;
|
use lib_dispatch::prelude::af_spawn;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use tracing::trace;
|
use tracing::{trace, warn};
|
||||||
|
|
||||||
pub(crate) async fn observe_sync_state(database_id: &str, database: &Arc<MutexDatabase>) {
|
pub(crate) async fn observe_sync_state(database_id: &str, database: &Arc<MutexDatabase>) {
|
||||||
let weak_database = Arc::downgrade(database);
|
let weak_database = Arc::downgrade(database);
|
||||||
@ -31,7 +33,12 @@ pub(crate) async fn observe_sync_state(database_id: &str, database: &Arc<MutexDa
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
pub(crate) async fn observe_rows_change(database_id: &str, database: &Arc<MutexDatabase>) {
|
pub(crate) async fn observe_rows_change(
|
||||||
|
database_id: &str,
|
||||||
|
database: &Arc<MutexDatabase>,
|
||||||
|
notification_sender: &Arc<DebounceNotificationSender>,
|
||||||
|
) {
|
||||||
|
let notification_sender = notification_sender.clone();
|
||||||
let database_id = database_id.to_string();
|
let database_id = database_id.to_string();
|
||||||
let weak_database = Arc::downgrade(database);
|
let weak_database = Arc::downgrade(database);
|
||||||
let mut row_change = database.lock().subscribe_row_change();
|
let mut row_change = database.lock().subscribe_row_change();
|
||||||
@ -47,15 +54,24 @@ pub(crate) async fn observe_rows_change(database_id: &str, database: &Arc<MutexD
|
|||||||
row_change
|
row_change
|
||||||
);
|
);
|
||||||
match row_change {
|
match row_change {
|
||||||
RowChange::DidUpdateVisibility { .. } => {},
|
RowChange::DidUpdateCell {
|
||||||
RowChange::DidUpdateHeight { .. } => {},
|
field_id,
|
||||||
RowChange::DidUpdateCell { .. } => {},
|
row_id,
|
||||||
RowChange::DidUpdateRowComment { .. } => {},
|
value: _,
|
||||||
|
} => {
|
||||||
|
let cell_id = format!("{}:{}", row_id, field_id);
|
||||||
|
notify_cell(¬ification_sender, &cell_id);
|
||||||
|
// In the old logic, it will notify the row when the cell is updated. But in the new logic,
|
||||||
|
// it will notify the cell only. Enable the following code if needed.
|
||||||
|
// notify_row(¬ification_sender, &database_id, field_id, &row_id);
|
||||||
|
},
|
||||||
|
_ => {
|
||||||
|
warn!("unhandled row change: {:?}", row_change);
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
pub(crate) async fn observe_field_change(database_id: &str, database: &Arc<MutexDatabase>) {
|
pub(crate) async fn observe_field_change(database_id: &str, database: &Arc<MutexDatabase>) {
|
||||||
let database_id = database_id.to_string();
|
let database_id = database_id.to_string();
|
||||||
@ -148,3 +164,32 @@ pub(crate) async fn observe_block_event(database_id: &str, database: &Arc<MutexD
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
fn notify_row(
|
||||||
|
notification_sender: &Arc<DebounceNotificationSender>,
|
||||||
|
_database_id: &str,
|
||||||
|
field_id: String,
|
||||||
|
row_id: &RowId,
|
||||||
|
) {
|
||||||
|
let update_row = UpdatedRow::new(row_id).with_field_ids(vec![field_id]);
|
||||||
|
let update_changeset = RowsChangePB::from_update(update_row.into());
|
||||||
|
let subject = NotificationBuilder::new(
|
||||||
|
row_id,
|
||||||
|
DatabaseNotification::DidUpdateRow,
|
||||||
|
DATABASE_OBSERVABLE_SOURCE,
|
||||||
|
)
|
||||||
|
.payload(update_changeset)
|
||||||
|
.build();
|
||||||
|
notification_sender.send_subject(subject);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn notify_cell(notification_sender: &Arc<DebounceNotificationSender>, cell_id: &str) {
|
||||||
|
let subject = NotificationBuilder::new(
|
||||||
|
cell_id,
|
||||||
|
DatabaseNotification::DidUpdateCell,
|
||||||
|
DATABASE_OBSERVABLE_SOURCE,
|
||||||
|
)
|
||||||
|
.build();
|
||||||
|
notification_sender.send_subject(subject);
|
||||||
|
}
|
||||||
|
@ -86,7 +86,7 @@ impl DatabaseViewChangedReceiverRunner {
|
|||||||
is_new: true,
|
is_new: true,
|
||||||
};
|
};
|
||||||
let changes = RowsChangePB::from_insert(inserted_row);
|
let changes = RowsChangePB::from_insert(inserted_row);
|
||||||
send_notification(&result.view_id, DatabaseNotification::DidUpdateViewRows)
|
send_notification(&result.view_id, DatabaseNotification::DidUpdateRow)
|
||||||
.payload(changes)
|
.payload(changes)
|
||||||
.send();
|
.send();
|
||||||
},
|
},
|
||||||
|
@ -173,7 +173,7 @@ impl DatabaseViewEditor {
|
|||||||
pub async fn v_did_update_row_meta(&self, row_id: &RowId, row_detail: &RowDetail) {
|
pub async fn v_did_update_row_meta(&self, row_id: &RowId, row_detail: &RowDetail) {
|
||||||
let update_row = UpdatedRow::new(row_id.as_str()).with_row_meta(row_detail.clone());
|
let update_row = UpdatedRow::new(row_id.as_str()).with_row_meta(row_detail.clone());
|
||||||
let changeset = RowsChangePB::from_update(update_row.into());
|
let changeset = RowsChangePB::from_update(update_row.into());
|
||||||
send_notification(&self.view_id, DatabaseNotification::DidUpdateViewRows)
|
send_notification(&self.view_id, DatabaseNotification::DidUpdateRow)
|
||||||
.payload(changeset)
|
.payload(changeset)
|
||||||
.send();
|
.send();
|
||||||
}
|
}
|
||||||
@ -223,7 +223,7 @@ impl DatabaseViewEditor {
|
|||||||
}
|
}
|
||||||
let changes = RowsChangePB::from_delete(row.id.clone().into_inner());
|
let changes = RowsChangePB::from_delete(row.id.clone().into_inner());
|
||||||
|
|
||||||
send_notification(&self.view_id, DatabaseNotification::DidUpdateViewRows)
|
send_notification(&self.view_id, DatabaseNotification::DidUpdateRow)
|
||||||
.payload(changes)
|
.payload(changes)
|
||||||
.send();
|
.send();
|
||||||
|
|
||||||
@ -1031,7 +1031,7 @@ impl DatabaseViewEditor {
|
|||||||
} => RowsChangePB::from_move(vec![deleted_row_id.into_inner()], vec![inserted_row.into()]),
|
} => RowsChangePB::from_move(vec![deleted_row_id.into_inner()], vec![inserted_row.into()]),
|
||||||
};
|
};
|
||||||
|
|
||||||
send_notification(&self.view_id, DatabaseNotification::DidUpdateViewRows)
|
send_notification(&self.view_id, DatabaseNotification::DidUpdateRow)
|
||||||
.payload(changeset)
|
.payload(changeset)
|
||||||
.send();
|
.send();
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,9 @@ protobuf.workspace = true
|
|||||||
tracing.workspace = true
|
tracing.workspace = true
|
||||||
bytes.workspace = true
|
bytes.workspace = true
|
||||||
serde = { workspace = true, features = ["derive"] }
|
serde = { workspace = true, features = ["derive"] }
|
||||||
|
dashmap = "5.5"
|
||||||
|
tokio-util = "0.7"
|
||||||
|
tokio = { workspace = true, features = ["time"] }
|
||||||
|
|
||||||
flowy-derive.workspace = true
|
flowy-derive.workspace = true
|
||||||
lib-dispatch = { workspace = true }
|
lib-dispatch = { workspace = true }
|
||||||
|
94
frontend/rust-lib/flowy-notification/src/builder.rs
Normal file
94
frontend/rust-lib/flowy-notification/src/builder.rs
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
use crate::entities::SubscribeObject;
|
||||||
|
use crate::NOTIFICATION_SENDER;
|
||||||
|
use bytes::Bytes;
|
||||||
|
use lib_dispatch::prelude::ToBytes;
|
||||||
|
|
||||||
|
pub struct NotificationBuilder {
|
||||||
|
/// This identifier is used to uniquely distinguish each notification. For instance, if the
|
||||||
|
/// notification relates to a folder's view, the identifier could be the view's ID. The frontend
|
||||||
|
/// uses this ID to link the notification with the relevant observable entity.
|
||||||
|
id: String,
|
||||||
|
payload: Option<Bytes>,
|
||||||
|
error: Option<Bytes>,
|
||||||
|
source: String,
|
||||||
|
ty: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl NotificationBuilder {
|
||||||
|
pub fn new<T: Into<i32>>(id: &str, ty: T, source: &str) -> Self {
|
||||||
|
Self {
|
||||||
|
id: id.to_owned(),
|
||||||
|
ty: ty.into(),
|
||||||
|
payload: None,
|
||||||
|
error: None,
|
||||||
|
source: source.to_owned(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn payload<T>(mut self, payload: T) -> Self
|
||||||
|
where
|
||||||
|
T: ToBytes,
|
||||||
|
{
|
||||||
|
match payload.into_bytes() {
|
||||||
|
Ok(bytes) => self.payload = Some(bytes),
|
||||||
|
Err(e) => {
|
||||||
|
tracing::error!("Set observable payload failed: {:?}", e);
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn error<T>(mut self, error: T) -> Self
|
||||||
|
where
|
||||||
|
T: ToBytes,
|
||||||
|
{
|
||||||
|
match error.into_bytes() {
|
||||||
|
Ok(bytes) => self.error = Some(bytes),
|
||||||
|
Err(e) => {
|
||||||
|
tracing::error!("Set observable error failed: {:?}", e);
|
||||||
|
},
|
||||||
|
}
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn build(self) -> SubscribeObject {
|
||||||
|
let payload = self.payload.map(|bytes| bytes.to_vec());
|
||||||
|
let error = self.error.map(|bytes| bytes.to_vec());
|
||||||
|
SubscribeObject {
|
||||||
|
source: self.source,
|
||||||
|
ty: self.ty,
|
||||||
|
id: self.id,
|
||||||
|
payload,
|
||||||
|
error,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn send(self) {
|
||||||
|
let payload = self.payload.map(|bytes| bytes.to_vec());
|
||||||
|
let error = self.error.map(|bytes| bytes.to_vec());
|
||||||
|
let subject = SubscribeObject {
|
||||||
|
source: self.source,
|
||||||
|
ty: self.ty,
|
||||||
|
id: self.id,
|
||||||
|
payload,
|
||||||
|
error,
|
||||||
|
};
|
||||||
|
|
||||||
|
send_subject(subject);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn send_subject(subject: SubscribeObject) {
|
||||||
|
match NOTIFICATION_SENDER.read() {
|
||||||
|
Ok(read_guard) => read_guard.iter().for_each(|sender| {
|
||||||
|
if let Err(e) = sender.send_subject(subject.clone()) {
|
||||||
|
tracing::error!("Post notification failed: {}", e);
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
Err(err) => {
|
||||||
|
tracing::error!("Read notification sender failed: {}", err);
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
54
frontend/rust-lib/flowy-notification/src/debounce.rs
Normal file
54
frontend/rust-lib/flowy-notification/src/debounce.rs
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
use crate::entities::SubscribeObject;
|
||||||
|
use crate::{send_subject, NotificationBuilder};
|
||||||
|
use dashmap::mapref::entry::Entry;
|
||||||
|
use dashmap::DashMap;
|
||||||
|
use lib_dispatch::prelude::ToBytes;
|
||||||
|
use tokio_util::sync::CancellationToken;
|
||||||
|
|
||||||
|
pub struct DebounceNotificationSender {
|
||||||
|
debounce_in_millis: u64,
|
||||||
|
cancel_token_by_subject: DashMap<String, CancellationToken>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DebounceNotificationSender {
|
||||||
|
pub fn new(debounce_in_millis: u64) -> Self {
|
||||||
|
Self {
|
||||||
|
debounce_in_millis,
|
||||||
|
cancel_token_by_subject: DashMap::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn send<T: Into<i32>, P: ToBytes>(&self, id: &str, ty: T, source: &str, payload: P) {
|
||||||
|
let subject = NotificationBuilder::new(id, ty, source)
|
||||||
|
.payload(payload)
|
||||||
|
.build();
|
||||||
|
self.send_subject(subject);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn send_subject(&self, subject: SubscribeObject) {
|
||||||
|
let subject_key = format!("{}-{}-{}", subject.source, subject.id, subject.ty);
|
||||||
|
// remove the old cancel token and call cancel to stop the old task
|
||||||
|
if let Entry::Occupied(entry) = self.cancel_token_by_subject.entry(subject_key.clone()) {
|
||||||
|
let cancel_token = entry.get();
|
||||||
|
cancel_token.cancel();
|
||||||
|
entry.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
// insert a new cancel token
|
||||||
|
let cancel_token = CancellationToken::new();
|
||||||
|
self
|
||||||
|
.cancel_token_by_subject
|
||||||
|
.insert(subject_key.clone(), cancel_token.clone());
|
||||||
|
let debounce_in_millis = self.debounce_in_millis;
|
||||||
|
tokio::spawn(async move {
|
||||||
|
if debounce_in_millis > 0 {
|
||||||
|
tokio::time::sleep(std::time::Duration::from_millis(debounce_in_millis)).await;
|
||||||
|
}
|
||||||
|
|
||||||
|
if cancel_token.is_cancelled() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
send_subject(subject);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -1,11 +1,12 @@
|
|||||||
use std::sync::RwLock;
|
use std::sync::RwLock;
|
||||||
|
|
||||||
use bytes::Bytes;
|
|
||||||
use lazy_static::lazy_static;
|
|
||||||
|
|
||||||
use lib_dispatch::prelude::ToBytes;
|
|
||||||
|
|
||||||
use crate::entities::SubscribeObject;
|
use crate::entities::SubscribeObject;
|
||||||
|
use lazy_static::lazy_static;
|
||||||
|
mod builder;
|
||||||
|
pub use builder::*;
|
||||||
|
|
||||||
|
mod debounce;
|
||||||
|
pub use debounce::*;
|
||||||
|
|
||||||
pub mod entities;
|
pub mod entities;
|
||||||
mod protobuf;
|
mod protobuf;
|
||||||
@ -36,73 +37,3 @@ pub fn unregister_all_notification_sender() {
|
|||||||
pub trait NotificationSender: Send + Sync + 'static {
|
pub trait NotificationSender: Send + Sync + 'static {
|
||||||
fn send_subject(&self, subject: SubscribeObject) -> Result<(), String>;
|
fn send_subject(&self, subject: SubscribeObject) -> Result<(), String>;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct NotificationBuilder {
|
|
||||||
id: String,
|
|
||||||
payload: Option<Bytes>,
|
|
||||||
error: Option<Bytes>,
|
|
||||||
source: String,
|
|
||||||
ty: i32,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl NotificationBuilder {
|
|
||||||
pub fn new<T: Into<i32>>(id: &str, ty: T, source: &str) -> Self {
|
|
||||||
Self {
|
|
||||||
id: id.to_owned(),
|
|
||||||
ty: ty.into(),
|
|
||||||
payload: None,
|
|
||||||
error: None,
|
|
||||||
source: source.to_owned(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn payload<T>(mut self, payload: T) -> Self
|
|
||||||
where
|
|
||||||
T: ToBytes,
|
|
||||||
{
|
|
||||||
match payload.into_bytes() {
|
|
||||||
Ok(bytes) => self.payload = Some(bytes),
|
|
||||||
Err(e) => {
|
|
||||||
tracing::error!("Set observable payload failed: {:?}", e);
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn error<T>(mut self, error: T) -> Self
|
|
||||||
where
|
|
||||||
T: ToBytes,
|
|
||||||
{
|
|
||||||
match error.into_bytes() {
|
|
||||||
Ok(bytes) => self.error = Some(bytes),
|
|
||||||
Err(e) => {
|
|
||||||
tracing::error!("Set observable error failed: {:?}", e);
|
|
||||||
},
|
|
||||||
}
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn send(self) {
|
|
||||||
let payload = self.payload.map(|bytes| bytes.to_vec());
|
|
||||||
let error = self.error.map(|bytes| bytes.to_vec());
|
|
||||||
let subject = SubscribeObject {
|
|
||||||
source: self.source,
|
|
||||||
ty: self.ty,
|
|
||||||
id: self.id,
|
|
||||||
payload,
|
|
||||||
error,
|
|
||||||
};
|
|
||||||
|
|
||||||
match NOTIFICATION_SENDER.read() {
|
|
||||||
Ok(read_guard) => read_guard.iter().for_each(|sender| {
|
|
||||||
if let Err(e) = sender.send_subject(subject.clone()) {
|
|
||||||
tracing::error!("Post notification failed: {}", e);
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
Err(err) => {
|
|
||||||
tracing::error!("Read notification sender failed: {}", err);
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user