mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-18 10:36:22 +08:00
1fe07410c0
#### PR Dependency Tree * **PR #13122** 👈 This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Inline comments now visually distinguish between unresolved, resolved, and deleted states. * Only unresolved inline comments are interactive and highlighted in the editor. * **Bug Fixes** * Improved accuracy in fetching and displaying all comments, including resolved ones, during initialization. * **Refactor** * Enhanced handling of comment resolution and deletion to provide clearer differentiation in both behavior and appearance. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
60 lines
1.8 KiB
TypeScript
60 lines
1.8 KiB
TypeScript
import { type CommentId } from '@blocksuite/affine-shared/services';
|
|
import type { AffineTextAttributes } from '@blocksuite/affine-shared/types';
|
|
import { dynamicSchema, InlineSpecExtension } from '@blocksuite/std/inline';
|
|
import { html, nothing } from 'lit-html';
|
|
import { when } from 'lit-html/directives/when.js';
|
|
import { z } from 'zod';
|
|
|
|
import { extractCommentIdFromDelta } from './utils';
|
|
|
|
type InlineCommendId = `comment-${CommentId}`;
|
|
function isInlineCommendId(key: string): key is InlineCommendId {
|
|
return key.startsWith('comment-');
|
|
}
|
|
|
|
export const CommentInlineSpecExtension =
|
|
InlineSpecExtension<AffineTextAttributes>({
|
|
name: 'comment',
|
|
schema: dynamicSchema(
|
|
isInlineCommendId,
|
|
z.boolean().optional().nullable().catch(undefined)
|
|
),
|
|
match: delta => {
|
|
if (!delta.attributes) return false;
|
|
const comments = Object.keys(delta.attributes).filter(isInlineCommendId);
|
|
return comments.length > 0;
|
|
},
|
|
renderer: ({ delta, children }) => {
|
|
if (!delta.attributes) return html`${nothing}`;
|
|
|
|
const unresolved = Object.entries(delta.attributes).some(
|
|
([key, value]) => isInlineCommendId(key) && value === true
|
|
);
|
|
return html`<inline-comment
|
|
.unresolved=${unresolved}
|
|
.commentIds=${extractCommentIdFromDelta(delta)}
|
|
>${when(
|
|
children,
|
|
() => html`${children}`,
|
|
() => nothing
|
|
)}</inline-comment
|
|
>`;
|
|
},
|
|
wrapper: true,
|
|
});
|
|
|
|
export const NullCommentInlineSpecExtension =
|
|
InlineSpecExtension<AffineTextAttributes>({
|
|
name: 'comment',
|
|
schema: dynamicSchema(
|
|
isInlineCommendId,
|
|
z.boolean().optional().nullable().catch(undefined)
|
|
),
|
|
match: () => false,
|
|
renderer: () => html``,
|
|
});
|
|
|
|
// reuse the same identifier
|
|
NullCommentInlineSpecExtension.identifier =
|
|
CommentInlineSpecExtension.identifier;
|