AppFlowy-Cloud/libs/workspace-template/src/document/get_started.rs

61 lines
1.8 KiB
Rust

use crate::document::parser::JsonToDocumentParser;
use crate::hierarchy_builder::WorkspaceViewBuilder;
use crate::{TemplateData, WorkspaceTemplate};
use async_trait::async_trait;
use collab::core::collab::MutexCollab;
use collab::core::origin::CollabOrigin;
use collab_document::document::Document;
use collab_entity::CollabType;
use collab_folder::ViewLayout;
use std::sync::Arc;
use tokio::sync::RwLock;
/// This template generates a document containing a 'read me' guide.
/// It ensures that at least one view is created for the document.
pub struct GetStartedDocumentTemplate;
#[async_trait]
impl WorkspaceTemplate for GetStartedDocumentTemplate {
fn layout(&self) -> ViewLayout {
ViewLayout::Document
}
async fn create_workspace_view(
&self,
_uid: i64,
workspace_view_builder: Arc<RwLock<WorkspaceViewBuilder>>,
) -> anyhow::Result<TemplateData> {
let view_id = workspace_view_builder
.write()
.await
.with_view_builder(|view_builder| async {
view_builder
.with_name("Getting started")
.with_icon("⭐️")
.build()
})
.await;
// create a empty document
let data = tokio::task::spawn_blocking(|| {
let json_str = include_str!("../../assets/read_me.json");
let document_data = JsonToDocumentParser::json_str_to_document(json_str).unwrap();
let collab = Arc::new(MutexCollab::new(
CollabOrigin::Empty,
&view_id,
vec![],
false,
));
let document = Document::create_with_data(collab, document_data)?;
let data = document.encode_collab()?;
Ok::<_, anyhow::Error>(TemplateData {
object_id: view_id,
object_type: CollabType::Document,
object_data: data,
})
})
.await??;
Ok(data)
}
}