4.0.0-beta.22
Feb 13 2025

New Features

  • [Folders]: Added an API to fetch folder metadata and subfolders by organizationId, folderId with pagination.
// Get all folders for a specific organization
client.fetchFolders({
  organizationId: 'org1'
});

// Get a specific folder's metadata with its immediate subfolders
client.fetchFolders({
  organizationId: 'org1',
  folderId: 'folder1'
});

interface FetchFoldersRequest {
  organizationId?: string;
  folderId?: string;
}

interface FetchFoldersResponse {
  data: Record<string, FolderMetadata> | null;
  nextPageToken: string;
}
  • [Documents]: Added an API to fetch document metadata by organizationId, folderId or documentIds with pagination.
// Get all documents for a specific folder
client.fetchDocuments({
  organizationId: 'org1', 
  folderId: 'folder1',
  allDocuments: true
});

// Get specific documents by IDs
client.fetchDocuments({
  organizationId: 'org1',
  documentIds: ['doc1', 'doc2']
});

interface FetchDocumentsRequest {
  organizationId?: string;
  documentIds?: string[];
  folderId?: string;
  allDocuments?: boolean;
}

interface FetchDocumentsResponse {
  data: Record<string, DocumentMetadata> | null;
  nextPageToken: string;
}
  • [Comments]: Added a new API to fetch comment annotations by organizationId, folderId or documentIds with pagination and filtering options. This is different from the existing subscription API which susbcribes to realtime changes to the comments data.
// Get all annotations for a specific folder
const commentElement = client.getCommentElement();
commentElement.fetchCommentAnnotations({
  organizationId: 'org1', 
  folderId: 'folder1',
  allDocuments: true
});

// Get annotations for specific documents
const commentElement = client.getCommentElement();
commentElement.fetchCommentAnnotations({
  organizationId: 'org1',
  documentIds: ['doc1', 'doc2']
});

interface FetchCommentAnnotationsRequest {
  createdAfter?: number;
  createdBefore?: number;
  updatedAfter?: number;
  updatedBefore?: number;
  statusIds?: string[];
  order?: 'asc' | 'desc';
  pageToken?: string;
  allDocuments?: boolean;
  pageSize?: number;
  organizationId?: string;
  locationId?: string;
  documentIds?: string[];
  folderId?: string;
}

interface FetchCommentAnnotationsResponse {
  data: Record<string, CommentAnnotation[]> | null;
  nextPageToken: string;
}
4.0.0-beta.21
Feb 11 2025

New Features

  • [Folders]: Introducing Folders! Organize documents hierarchically with granular access control. Modeled after Google Drive’s folder structure.

    • Folders can contain documents and other folders.
    • Uses same permission model as Organizations and Documents.
    • APIs:
      • Frontend: Subscribe to folders and query by folderId.
      • Backend: CRUD operations for folders and access control. Learn More
      • Added folder support to existing relevant APIs.
  • [Folders]: API to subscribe to a particular folder and all its documents at the same time.

Using Hooks:

const { setDocuments } = useSetDocuments();

{/* Subscribe to a folder and all its documents */}
const rootDocument = [
  {
    id: 'document-1',
    metadata: {
      documentName: 'Document 1'
    }
  }
];

setDocuments(
  rootDocument,
  {
    folderId: 'folder1',
    allDocuments: true
  }
);


{/* Subscribe to a folder and some documents */}
const documents = [
  {
    id: 'document-1',
    metadata: {
      documentName: 'Document 1'
    }
  },
  {
    id: 'document-2',
    metadata: {
      documentName: 'Document 2'
    }
  }
];

setDocuments(
  documents,
  {
    folderId: 'folder1',
  }
);

Using API:

{/* Subscribe to a folder and all its documents */}
client.setDocuments(
  rootDocument,
  {
    folderId: 'folder1',
    allDocuments: true
  }
);

{/* Subscribe to a folder and some documents */}
client.setDocuments(
  documents,
  {
    folderId: 'folder1',
  }
);
  • [Locations]: API to subscribe to a particular location within a single or multiple documents. This will only fetch a filtered set of data associated with that location.

Using Hooks:

const { setDocuments } = useSetDocuments();

const documents = [
  {
    id: 'document-1',
    metadata: {
      documentName: 'Document 1'
    }
  },
  {
    id: 'document-2',
    metadata: {
      documentName: 'Document 2'
    }
  }
];

setDocuments(
  documents,
  { locationId: 'location123' }
);

Using API:


client.setDocuments(
  documents,
  { locationId: 'location123' }
);

Improvements

  • [Comments]: Paste image from clipboard as attachment in the comment composer.

Bug Fixes

  • [Comments]: Fixed an issue where standalone comment composer was not working.
  • [Comments]: Fixed an issue where line breaks were not being preserved in comments.
  • [Comments]: Fixed an issue where image preview was not opening in sidebar.
  • [Comments]: Fixed an issue where inline comment threads had unnecessary scroll.
  • [Comments]: Fixed an issue where assign user component was not being removed after editing a comment.
4.0.0-beta.20
Feb 6 2025

Improvements

  • [Core]: Added support for additional regions.

Bug Fixes

  • [Core]: Fixed an issue where setting an avatar image URL would not update all the time.
  • [Comments]: Fixed URL parsing issues when editing comments.
4.0.0-beta.19
Feb 5 2025

New Features

  • [Core]: Added useUnsetDocuments hook to unsubscribe from all documents at once.
    useUnsetDocuments();

Bug Fixes

  • [Core]: Fixed performance issues in @mention autocomplete feature.
  • [Comments]: Fixed spacing around mentioned tags when editing comments.
4.0.0-beta.18
Feb 3 2025

Improvements

  • [Core]: Added unsetDocuments method to unsubscribe from all documents at once.
  client.unsetDocuments();
  • [Comments]: Added new props to customize inline comments section:
    • composerPosition: Position the comment composer at ‘top’ or ‘bottom’ of the section
    • sortBy: Sort comments by ‘createdAt’ or ‘lastUpdated’
    • sortOrder: Sort comments in ‘asc’ or ‘desc’ order
  <VeltInlineCommentsSection 
    composerPosition="top"
    sortBy="createdAt" 
    sortOrder="desc"
  />
  • [Core]: Flushed cached data for Notifications and Comments when the User signs out.
4.0.0-beta.17
Jan 31 2025

Bug Fixes

  • [Comments]: Fixed an issue where the comments data was not updated in the frontend local cache when all comments were deleted from the document using REST API.
4.0.0-beta.16
Jan 31 2025

Improvements

  • [Comments]: Removed extra margin appearing around @mention chips in comment text.
  • [Comments]: Improved the alignment of the inline assign dropdown menu.
  • [Notifications]: Removed the people tab by default in notification panel. You can enable it using custom props.

Bug Fixes

  • [Comments]: Fixed an issue where delete confirmation dialog was appearing behind the sidebar.
  • [Comments]: Fixed an issue where inline comments would disappear from the inline section when comment was clicked in the sidebar.
  • [UI]: Fixed dark mode styling issues in autocomplete tool and copy link button.
  • [Notifications]: Fixed an issue where loading skeleton was visible in notifications “For You” tab when no document was set.
4.0.0-beta.15
Jan 30 2025

Improvements

  • [REST API]: Added notificationId parameter to Add Notifications REST API so you can have more control on the ID being set and prevent duplicate notifications.
  • [REST API]: Added notifyAll parameter to Add Notifications REST API to target notifications to specific users. If its set to false, the notification will be sent to only the users specified in the request.

Bug Fixes

  • [UI Customization]: Fixed an issue where Velt Button was not returning context data in the callback.
  • [Comments]: Fixed an issue where getCommentAnnotationsCount and getCommentAnnotations APIs were first returning empty data before returning the actual data.
4.0.0-beta.14
Jan 29 2025

Known Issues

  • [UI Customization]: Velt Button component is missing context data in the callback.

Improvements

  • [Comments]: Added loading skeleton in inline comments section.
  • [Performance]: Improved SDK performance for apps with complex UI.

Bug Fixes

  • [Comments]: Fixed multiple documents subscription permission issue. It should now subscribe to 30 documents at a time.
  • [Comments]: Fixed an issue where selectCommentByAnnotationId API was not working when triggered after a comment was clicked in the sidebar.
  • [UI Customization]: Fixed an issue where Velt Button was not triggering callback when type was set to button.
  • [UI Customization]: Fixed an issue where Velt Button with type single-select was incorrectly toggling when clicked again.
4.0.0-beta.13
Jan 28 2025

New Features

  • [Live State]: Now you can broadcast events with any arbitrary data to any document using the new REST API.

Improvements

  • [UI Customization]: Simplified how UI can be customized using wireframes. React support pending.

    • Simplified component visibility control: conditionally show/hide any component directly without needing to specify parent or sibling wireframes.
    • Added direct class application: classes added to wireframes are automatically applied to the rendered components.
    • Full children support: all wireframe components can now contain nested child elements.

    Breaking change: This only affects you if you added CSS to wireframe component selectors.

    • Wireframe components are no longer rendered within Velt components. There were a few wireframe components that were rendered within Velt components.
    • CSS targeting wireframe component selectors needs to be updated to target Velt component selectors directly.
// Old
<velt-comment-dialog-header-wireframe>
  <velt-if condition="{annotation.status.id} === 'OPEN'" >
      <velt-comment-dialog-status-wireframe>
      </velt-comment-dialog-status-wireframe>
  </velt-if>
</velt-comment-dialog-header-wireframe>


// New
<velt-comment-dialog-status-wireframe>
	velt-if="{annotation.status.id} === 'OPEN'" >
</velt-comment-dialog-status-wireframe>
  • [Comments]: Improved comment dialog positioning to be more stable when near screen edges, providing a smoother user experience.

Bug Fixes

  • [Comments]: Fixed an issue where custom lists were extending out of the comment dialog.
4.0.0-beta.12
Jan 27 2025

Bug Fixes

  • [Comments]: Fixed an issue where comments was not working for fresh documents if the advanced queries option wasn’t enabled. Note this is mandatory for all versions of v4 SDK.
  • [Comments]: Fixed an issue where updateContactList was not working.
  • [Comments]: Fixed an issue where in inline comments, the resolve button was visible for all messages in a thread.
4.0.0-beta.11
Jan 24 2025

Features

  • [Security] You can now self-host your user PII metadata.
    • Send only userId instead of full user object and a client side data provider.
    • Components will automatically fetch the user details from the provider and hydrate the user object.
    • The metadata will not be sent to Velt servers.

const fetchUsersFromDB = async (userIds) => {
    // Fetch users from your DB
    const usersData = await getUsersFromYourDB(userIds);
    return formatUsersToRecord(usersData);
};

const formatUsersToRecord = (users) => {
    // Format users array into a Record object with userId as key and user data as value
    return users.reduce((record, user) => {
        record[user.userId] = {
            userId: user.userId,
            name: user.name,
            // any other fields
        };
        return record;
    }, {});
};

<VeltProvider 
    apiKey='YOUR_API_KEY'
    userDataProvider={{
        getUsers: fetchUsersFromDB
    }}
>
</VeltProvider>

Improvements

  • [Core]: Added core performance improvements throughout the SDK.
  • [Recorder]: Added new API methods to get the recorded data.
const recorderElement = client.getRecorderElement();
await recorderElement.getRecordingData({
    recorderIds: ['RECORDER_ID']
});
  • [Recorder] Added missing props to disable shadow DOM for recorder components in React SDK.
<VeltRecorderNotes shadowDom={false} />
<VeltRecorderTool shadowDom={false} />
<VeltRecorderPlayer shadowDom={false} />
4.0.0-beta.10
Jan 20 2025

Bug Fixes

  • [Recording]: Fixed Safari recording compatibility issues across some macOS versions.
4.0.0-beta.9
Jan 13 2025

Features

  • [Core]: Added support for React v19 in sdk-react library.

Improvements

  • [Authentication]: Made organizationId mandatory in identify method.
  • [New Accounts]: New accounts or API keys will have advanced queries turned on by default.

Bug Fixes

  • [Notifications]: Fixed an issue where notifications were not working when organizationId was not set.
  • [REST API]: Fixed an issue where the REST API for adding or updating organizations and documents did not allow custom fields in metadata.
4.0.0-beta.8
Jan 10 2025

Improvements

  • [Comments]: Improved comments performance with optimistic local-first reads and writes.
  • [Notifications]: Added documentMetadata object in the properties that are sent to SendGrid for emails.

Bug Fixes

  • [Comments]: Fixed an issue where custom metadata added to a comment using addContext was not sent to the first notification event (newlyAdded).
4.0.0-beta.7
Jan 10 2025

Features

  • [Comments]: Added a transcriptionDone event callback when recording transcription is done.

Using Hooks:

const onTranscriptionDone = useRecorderEventCallback('transcriptionDone');

useEffect(() => {
    console.log(onTranscriptionDone);
}, [onTranscriptionDone])

Using API:

const recorderElement = client.getRecorderElement();

recorderElement.on('transcriptionDone').subscribe((data) => {
	console.log('transcriptionDone', data);
});

Improvements

  • [Comments]: Disabled @here in the contacts dropdown by default. You can turn it on using this.

Bug Fixes

  • [Comments]: Removed virtual scroll from autocomplete panel and removed fixed height. This was causing weird UI issues. We are rewriting the autocomplete panel with virtual scroll.
  • [Comments]: Fixed an issue where horizontal scroll was visible on sidebar in some scenarios.
  • [Comments]: Fixed an issue where the shadowDom prop was not passed down to page mode composer in comment sidebar.
  • [Comments]: Fixed an issue where sortData prop was not working in comments sidebar.
4.0.0-beta.6
Jan 6 2025

Bug Fixes

  • [Comments]: Fixed an issue with getCommentAnnotationsCount API when filtering by specific document IDs in the query.
4.0.0-beta.5
Dec 24 2024

Improvements

  • [Security]: Merged security patch in the React package

Bug Fixes

  • [Recording]: Fixed an issue where the floating recording player was visible for threaded recorder notes
  • [Comments]: Fixed an issue where the sidebar button border color was using light mode colors in dark mode
4.0.0-beta.4
Dec 19 2024

New APIs

1. setDocuments

  • Set multiple documents at the same time. You can specify 30 documents at a time.

  • The first document in the list will be considered as the root document.

  • For features like comments, notifications, recorder, reactions etc. you will be able to read and write to multiple documents at the same time.

  • For features like cursors, presence, huddle, live state sync etc. it will default to the root document.

  • Sidebar will automatically show data from all the documents.

  • Params:

Using Hooks:

const documents = [
  {
    id: 'document-1',
    metadata: {
      documentName: 'Document 1'
    }
  },
  {
    id: 'document-2',
    metadata: {
      documentName: 'Document 2'
    }
  }
];
const { setDocuments } = useSetDocuments();
setDocuments(documents);

Using API:

const documents = [
  {
    id: 'document-1',
    metadata: {
      documentName: 'Document 1'
    }
  },
  {
    id: 'document-2',
    metadata: {
      documentName: 'Document 2'
    }
  }
];
client.setDocuments(documents);

2. getCommentAnnotations

  • Get all the comment annotations for all the specified documents.
  • You can specify 30 documents at a time.
  • If you don’t specify any query, it will return data from the documents specified in the setDocuments method.

Using Hooks:

const { data } = useGetCommentAnnotations(query);
// initial data value will be null while the request is in progress

Using API:

const commentElement = client.getCommentElement();
commentElement.getCommentAnnotations(query).subscribe((response) => {
  console.log(response.data);
  // initial data value will be null while the request is in progress
});
CommentRequestQuery {
  documentIds!: string[],
  locationIds!: string[],
  statusIds!: string[]
};

GetCommentAnnotationsResponse {
  data: Record<string, CommentAnnotation[]> | null; // Key: documentId, Value: CommentAnnotation[]
};

3. getCommentAnnotationsCount

  • Get the total and unread comment annotations count of all the comment annotations for all the specified documents.
  • You can specify 30 documents at a time.
  • If you don’t specify any query, it will return data from the documents specified in the setDocuments method.

Using Hooks:

const { data } = useCommentAnnotationsCount(query);
// initial data value will be null while the request is in progress

Using API:

const commentElement = client.getCommentElement();
commentElement.getCommentAnnotationsCount(query).subscribe((response) => {
  console.log(response.data);
  // initial data value will be null while the request is in progress
});
CommentRequestQuery {
  documentIds!: string[],
  locationIds!: string[],
  statusIds!: string[]
};

GetCommentAnnotationsCountResponse {
  data: Record<string, CommentAnnotationsCount> | null; // Key: documentId, Value: CommentAnnotationsCount
};

CommentAnnotationsCount {
  unread: number,
  total: number
}

4. Read/Write data from multiple documents on the same page

  • If you want to display data (eg: comments) from multiple documents on the same page, you can add data-velt-document-id attribute to the container that contains the document.
  • It will be used to identify which part of the DOM belongs to which document.
<div class="document-container" data-velt-document-id="document-1">
  ...
</div>

<div class="document-container" data-velt-document-id="document-2">
  ...
</div>

<div class="document-container" data-velt-document-id="document-3">
  ...
</div>

Other updates

New Features

  • [Comments]: Added support for Status Filter in Comments Sidebar’s main filter menu:
    • By default, the status filter is disabled in the main filter menu.
    • Currently, it doesn’t support grouping.
    • Added Wireframe support for this. Learn more.
    • If you were using wireframes before, you will add this to your wireframes.
const filterConfig = {
  status: {
    enable: true,
    name: "Status",
    multiSelection: true,
  }
};

<VeltCommentsSidebar filterConfig={filterConfig} />

Bug Fixes

  • [Comments]: Fixed an issue where empty state visibility was not visible when filter is applied and grouping was disabled.
  • [Comments]: Fixed an issue where users could click on the comment in the sidebar and navigate to comments when they shouldn’t.