Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

dazai/mar-272-treat-url-paste-in-inbox-similar-to-reading-list #428

Merged
merged 8 commits into from
Oct 29, 2024

Conversation

deewakar-k
Copy link
Contributor

@deewakar-k deewakar-k commented Oct 29, 2024

Summary by CodeRabbit

  • New Features

    • Added a favicon display for each item in the inbox, enhancing visual representation.
    • Improved item title handling with URL validation and formatting when adding items to the inbox.
    • Enhanced the Custom Kanban interface with improved item submission logic and visual cues.
    • Streamlined the rendering process of the AddToSpace component by removing the loading state check for spaces.
  • Bug Fixes

    • Updated functionality to toggle item status between "done" and "null," with improved state management for accurate toggling.
  • Documentation

    • Updated type definitions to make the metadata property optional and include a new favicon property.

@deewakar-k deewakar-k added the wip label Oct 29, 2024
Copy link

coderabbitai bot commented Oct 29, 2024

Walkthrough

The changes involve modifications to the InboxItems component, the CycleItem interface, and the InboxAddItem component. A new Image component for displaying the favicon in the inbox items is introduced, alongside an update to the handleDone function for toggling item status. The CycleItem interface is adjusted to make the metadata property optional and to include a new favicon property. Additionally, enhancements are made to URL validation and item data structuring in the InboxAddItem component.

Changes

File Path Change Summary
apps/frontend/src/components/Inbox/InboxItems.tsx - Added an Image component to display favicon from item.metadata.
- Updated handleDone function to toggle item status between "done" and "null".
- Adjusted rendering logic for the new favicon display.
apps/frontend/src/lib/@types/Items/Cycle.ts - Made metadata property optional in CycleItem interface.
- Added favicon?: string property to the metadata object in CycleItem.
apps/frontend/src/components/Inbox/InboxAddItem.tsx - Added isValidUrl function to validate URLs.
- Introduced ItemData interface for item structure.
- Enhanced title processing in handleAddItemToInbox.
apps/frontend/src/components/ThisWeek/CustomKanban.tsx - Added ImageWithFallback import for displaying favicons.
- Enhanced title processing and link detection in AddCard component.
- Updated handleSubmit function to validate and format titles.
apps/frontend/src/components/AddToSpace.tsx - Removed loading state check for spaces, allowing direct rendering of the dropdown menu.

Possibly related PRs

  • fix: today, inbox, this-week items blink on state change #364: The changes in the InboxItems component's handleDone function to toggle item status are directly related to the modifications made in the same function in this PR, which also updates the status management logic.
  • feat: overdue items  #377: The updates to the InboxItems component's handleDone function to include a dueDate align with the changes in this PR that enhance the handling of item states and interactions.
  • fix: removed loader from inbox #420: The modifications to the handleDone function in the main PR are relevant as they also involve toggling item statuses, which is a key focus of this PR's changes.

Suggested labels

ready to be merged

Suggested reviewers

  • madhav-relish
  • sajdakabir

Poem

🐰 In the inbox, items gleam,
With favicons, they brightly beam.
Toggling done, a simple dance,
Each click brings a happy chance!
So hop along, let’s celebrate,
Changes made, oh, isn’t it great? 🌟


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 30d946c and b07eebd.

📒 Files selected for processing (1)
  • apps/frontend/src/components/AddToSpace.tsx (0 hunks)
💤 Files with no reviewable changes (1)
  • apps/frontend/src/components/AddToSpace.tsx

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Outside diff range and nitpick comments (4)
apps/frontend/src/lib/@types/Items/Cycle.ts (1)

15-15: Consider adding URL format validation for favicon.

While the type definition is correct, consider adding JSDoc comments to specify the expected URL format for the favicon (e.g., absolute URLs, data URLs, relative paths).

Add documentation like this:

  metadata?: {
    url: string
+   /** URL for the favicon image. Supports absolute URLs, data URLs, or relative paths */
    favicon: string
  }
apps/frontend/src/components/Inbox/InboxItems.tsx (3)

Line range hint 62-86: Add error handling and cleanup for status updates.

The current implementation of handleDone has potential issues:

  1. No error handling for failed status updates
  2. Possible race conditions with setTimeout
  3. Animation states might persist if component unmounts during animation

Consider this improved implementation:

 const handleDone = useCallback(
   (event: React.MouseEvent, id: string, currentStatus: string | undefined) => {
     event.stopPropagation()
     if (id) {
       const newStatus = currentStatus === "done" ? "null" : "done"
       setAnimatingItems((prev) => new Set(prev).add(id))
       setOptimisticDoneItems((prev) => {
         const newSet = new Set(prev)
         if (newStatus === "done") {
           newSet.add(id)
         } else {
           newSet.delete(id)
         }
         return newSet
       })

       const today = new Date().toISOString()

-      setTimeout(() => {
-        updateItem(session, { status: newStatus, dueDate: today }, id)
+      const timeoutId = setTimeout(async () => {
+        try {
+          await updateItem(session, { status: newStatus, dueDate: today }, id)
+        } catch (error) {
+          console.error('Failed to update item status:', error)
+          // Revert optimistic updates on failure
+          setOptimisticDoneItems((prev) => {
+            const newSet = new Set(prev)
+            newSet.delete(id)
+            return newSet
+          })
+        } finally {
           setAnimatingItems((prev) => {
             const newSet = new Set(prev)
             newSet.delete(id)
             return newSet
           })
-        }, 400)
+        }
+      }, 400)
+
+      return () => clearTimeout(timeoutId)
     }
   },
   [updateItem, session]
 )

Line range hint 147-153: Uncomment and implement loading state UI.

The loading state UI is commented out but the isLoading state is still being tracked. This could lead to a poor user experience during data fetching.

Consider uncommenting and improving the loading state:

-  /*  if (isLoading) {
-    return (
-      <div className="flex flex-col gap-4">
-        <p>loading...</p>
-      </div>
-    )
-  } */
+  if (isLoading) {
+    return (
+      <div className="flex flex-col gap-4" role="status" aria-busy="true">
+        <div className="animate-pulse space-y-4">
+          {[...Array(3)].map((_, i) => (
+            <div key={i} className="h-20 rounded-lg bg-muted/50" />
+          ))}
+        </div>
+        <span className="sr-only">Loading inbox items...</span>
+      </div>
+    )
+  }

Error handling implementation should follow existing pattern in ItemsList.tsx

Looking at the codebase, there's an existing implementation of deleteItem in ItemsList.tsx that properly handles errors:

const deleteItem = async (itemId: string) => {
  try {
    await deleteItemFromStore(session, spaceId, blockId, itemId)
  } catch (error) {
    console.error("Error deleting item:", error)
  }
}

The commented-out implementation in InboxItems.tsx should be uncommented and updated to follow this pattern:

-  /* const handleDelete = useCallback(
-    (id: string) => {
-      if (id) {
-        deleteItem(session, id)
-      }
-    },
-    [deleteItem, session]
-  ) */
+  const handleDelete = useCallback(
+    async (id: string) => {
+      if (id) {
+        try {
+          await deleteItem(session, id)
+        } catch (error) {
+          console.error("Error deleting item:", error)
+        }
+      }
+    },
+    [deleteItem, session]
+  )
🔗 Analysis chain

Line range hint 37-44: Implement error handling for delete operation.

The delete operation's error handling is commented out. This should be implemented to ensure proper user feedback and state management.

Let's check if delete functionality is used elsewhere in the codebase:

Consider implementing proper error handling:

-  /* const handleDelete = useCallback(
-    (id: string) => {
-      if (id) {
-        deleteItem(session, id)
-      }
-    },
-    [deleteItem, session]
-  ) */
+  const handleDelete = useCallback(
+    async (id: string) => {
+      if (id) {
+        try {
+          await deleteItem(session, id)
+        } catch (error) {
+          console.error('Failed to delete item:', error)
+          // Add user feedback for failed deletion
+        }
+      }
+    },
+    [deleteItem, session]
+  )

Let me search with different patterns to find delete-related functionality in the codebase. This will help us verify if there are existing implementations we should align with or if this is the only instance requiring error handling.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for delete item implementations
rg -A 5 "deleteItem.*session.*id"

Length of output: 57


Script:

#!/bin/bash
# Let's try a broader search for delete-related functionality
rg -i "delete.*item" -A 5

# Also search for the specific function name
ast-grep --pattern 'const deleteItem = $_'

# Look for any delete-related hooks or functions
rg -i "usedelete|handledelete" -A 5

Length of output: 7319

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 7d9cce1 and 8900f68.

📒 Files selected for processing (2)
  • apps/frontend/src/components/Inbox/InboxItems.tsx (1 hunks)
  • apps/frontend/src/lib/@types/Items/Cycle.ts (1 hunks)
🔇 Additional comments (2)
apps/frontend/src/lib/@types/Items/Cycle.ts (1)

13-13: Verify the impact of making metadata optional.

Making metadata optional is a breaking change that could affect type checking across the codebase. Ensure that all consumers properly handle the case when metadata is undefined.

Let's verify the usage:

✅ Verification successful

Let me gather more context about the usage of metadata to ensure we have a complete picture.


Making metadata optional is safe and properly handled

The codebase already handles the optional metadata property correctly:

  • All direct accesses to metadata use optional chaining (?.)
  • Fallback values are provided using the OR operator (||)
  • Type definitions in multiple files (Reading.ts, reading.store.ts) already declare metadata as optional
  • Assignments to metadata are done safely within controlled contexts

The change aligns with existing patterns in the codebase and doesn't introduce any breaking changes.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for direct access to metadata properties to ensure proper null checks
ast-grep --pattern 'item.metadata.$_'

# Search for metadata property assignments
ast-grep --pattern '$_.metadata = $_'

Length of output: 1456


Script:

#!/bin/bash
# Search for type references and interface extensions
ast-grep --pattern 'interface $_ extends Cycle'
ast-grep --pattern 'type $_ = Cycle'

# Search for null checks on metadata
rg 'metadata\?' -A 2 -B 2

# Search for optional chaining with metadata
ast-grep --pattern 'item?.metadata'
ast-grep --pattern '$_?.metadata'

Length of output: 4377

apps/frontend/src/components/Inbox/InboxItems.tsx (1)

Line range hint 1-248: Add missing ARIA labels and roles for better accessibility.

Several interactive elements lack proper ARIA labels and roles:

  1. Context menu items don't indicate their current state
  2. Action buttons don't have descriptive labels

Consider these accessibility improvements:

 <ContextMenu key={item._id}>
-  <ContextMenuTrigger asChild>
+  <ContextMenuTrigger asChild aria-label={`Actions for ${item.title}`}>

 // ... and for action buttons:
 <button 
   className="invisible focus:outline-none focus:ring-0 group-hover:visible"
+  aria-label={`Schedule ${item.title}`}
 >
   <Icon icon="humbleicons:clock" className="mt-0.5 text-[18px]" />
 </button>

Let's check if there are any accessibility testing tools in the project:

#!/bin/bash
# Search for accessibility testing setup
rg -g "package.json" "jest-axe|@testing-library/jest-dom"

Comment on lines 189 to 191
<span className="mt-1.5 size-2 rounded bg-white">
{item.metadata?.favicon}
</span>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Improve favicon implementation for better security and accessibility.

The current favicon implementation has several issues:

  1. Direct rendering of favicon content without proper sanitization could pose security risks
  2. Missing fallback UI for cases where favicon is undefined
  3. No alt text or aria-label for screen readers

Consider this safer implementation:

-<span className="mt-1.5 size-2 rounded bg-white">
-  {item.metadata?.favicon}
-</span>
+<span 
+  className="mt-1.5 size-2 rounded bg-white flex items-center justify-center"
+  aria-hidden="true"
+>
+  {item.metadata?.favicon ? (
+    <img 
+      src={item.metadata.favicon} 
+      alt="" 
+      className="size-full object-contain"
+      onError={(e) => {
+        e.currentTarget.src = '/default-favicon.ico'
+      }}
+    />
+  ) : (
+    <Icon icon="material-symbols:link" className="text-[12px] text-muted" />
+  )}
+</span>

Committable suggestion was skipped due to low confidence.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 8900f68 and d598a4b.

📒 Files selected for processing (3)
  • apps/frontend/src/components/Inbox/InboxAddItem.tsx (2 hunks)
  • apps/frontend/src/components/Inbox/InboxItems.tsx (2 hunks)
  • apps/frontend/src/lib/@types/Items/Cycle.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • apps/frontend/src/components/Inbox/InboxItems.tsx
  • apps/frontend/src/lib/@types/Items/Cycle.ts
🔇 Additional comments (1)
apps/frontend/src/components/Inbox/InboxAddItem.tsx (1)

10-10: LGTM: Import statement is appropriate

The addition of the isLink utility import aligns with the PR's objective of handling URL pastes.

Comment on lines +12 to +19
function isValidUrl(url: string): boolean {
try {
new URL(url)
return true
} catch (error) {
return false
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Remove unused utility function

The isValidUrl function is defined but never used in the component. If it's intended for future use, consider adding a TODO comment or remove it to maintain clean code.

-function isValidUrl(url: string): boolean {
-  try {
-    new URL(url)
-    return true
-  } catch (error) {
-    return false
-  }
-}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
function isValidUrl(url: string): boolean {
try {
new URL(url)
return true
} catch (error) {
return false
}
}

Comment on lines +21 to +28
interface ItemData {
title: string
type: string
description?: string
metadata?: {
url: string
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Consider removing redundant interface

The ItemData interface is not being used in the component, as CycleItem is used instead. Having two similar interfaces might lead to confusion and maintenance issues.

-interface ItemData {
-  title: string
-  type: string
-  description?: string
-  metadata?: {
-    url: string
-  }
-}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
interface ItemData {
title: string
type: string
description?: string
metadata?: {
url: string
}
}

Comment on lines 65 to 88
const trimmedTitle = title.trim()

if (!trimmedTitle) {
return
}

const linkDetected = isLink(trimmedTitle)

// Prepare the final URL if it's a link
const finalTitle =
linkDetected && !/^https:\/\//i.test(trimmedTitle)
? `https://${trimmedTitle}`
: trimmedTitle

// Prepare the item data
const data: Partial<CycleItem> = {
title,
title: finalTitle,
type: linkDetected ? "link" : "text",
}

if (linkDetected) {
data.metadata = {
url: finalTitle,
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Enhance URL validation and error handling

While the URL handling logic has been improved, consider these enhancements:

  1. Validate the URL structure before setting it
  2. Add error handling for invalid URLs
  3. Consider handling both http:// and https:// protocols

Here's a suggested improvement:

      const trimmedTitle = title.trim()

      if (!trimmedTitle) {
        return
      }

      const linkDetected = isLink(trimmedTitle)

-      // Prepare the final URL if it's a link
-      const finalTitle =
-        linkDetected && !/^https:\/\//i.test(trimmedTitle)
-          ? `https://${trimmedTitle}`
-          : trimmedTitle
+      let finalTitle = trimmedTitle
+      if (linkDetected) {
+        try {
+          // Handle URLs without protocol
+          if (!/^https?:\/\//i.test(trimmedTitle)) {
+            finalTitle = `https://${trimmedTitle}`
+          }
+          // Validate the URL
+          new URL(finalTitle)
+        } catch (error) {
+          console.error("Invalid URL:", error)
+          return
+        }
+      }

      // Prepare the item data
      const data: Partial<CycleItem> = {
        title: finalTitle,
        type: linkDetected ? "link" : "text",
      }

      if (linkDetected) {
        data.metadata = {
          url: finalTitle,
        }
      }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const trimmedTitle = title.trim()
if (!trimmedTitle) {
return
}
const linkDetected = isLink(trimmedTitle)
// Prepare the final URL if it's a link
const finalTitle =
linkDetected && !/^https:\/\//i.test(trimmedTitle)
? `https://${trimmedTitle}`
: trimmedTitle
// Prepare the item data
const data: Partial<CycleItem> = {
title,
title: finalTitle,
type: linkDetected ? "link" : "text",
}
if (linkDetected) {
data.metadata = {
url: finalTitle,
}
const trimmedTitle = title.trim()
if (!trimmedTitle) {
return
}
const linkDetected = isLink(trimmedTitle)
let finalTitle = trimmedTitle
if (linkDetected) {
try {
// Handle URLs without protocol
if (!/^https?:\/\//i.test(trimmedTitle)) {
finalTitle = `https://${trimmedTitle}`
}
// Validate the URL
new URL(finalTitle)
} catch (error) {
console.error("Invalid URL:", error)
return
}
}
// Prepare the item data
const data: Partial<CycleItem> = {
title: finalTitle,
type: linkDetected ? "link" : "text",
}
if (linkDetected) {
data.metadata = {
url: finalTitle,
}
}

@deewakar-k deewakar-k removed the wip label Oct 29, 2024
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Outside diff range and nitpick comments (2)
apps/frontend/src/components/ThisWeek/CustomKanban.tsx (2)

206-217: LGTM with a minor suggestion for the favicon alt text.

The favicon implementation looks good with proper null checks and flex layout. Consider adding a more descriptive alt text for better accessibility.

-              alt=""
+              alt={`Favicon for ${title}`}

258-261: Optimize the trim operation.

The title is being trimmed twice - once in the initial check and again in the trimmedTitle variable.

-      if (!text.trim().length) return
-
-      const trimmedTitle = text.trim()
-
-      if (!trimmedTitle) return
+      const trimmedTitle = text.trim()
+      if (!trimmedTitle) return
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 1771d9c and 30d946c.

📒 Files selected for processing (2)
  • apps/frontend/src/components/Inbox/InboxAddItem.tsx (2 hunks)
  • apps/frontend/src/components/ThisWeek/CustomKanban.tsx (3 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • apps/frontend/src/components/Inbox/InboxAddItem.tsx
🔇 Additional comments (1)
apps/frontend/src/components/ThisWeek/CustomKanban.tsx (1)

262-279: 🛠️ Refactor suggestion

Enhance URL validation and error handling.

The current URL validation could be improved to handle edge cases and provide better user feedback:

  1. The URL validation is basic and might accept invalid URLs
  2. No error handling or user feedback for invalid URLs
  3. The metadata structure isn't validated

Let's verify the URL validation implementation:

Consider implementing a more robust solution:

const validateAndFormatUrl = (url: string): { isValid: boolean; formattedUrl: string } => {
  try {
    // Add https:// if missing
    const urlWithProtocol = !/^https?:\/\//i.test(url) ? `https://${url}` : url;
    // Validate URL format
    new URL(urlWithProtocol);
    return { isValid: true, formattedUrl: urlWithProtocol };
  } catch {
    return { isValid: false, formattedUrl: url };
  }
};

// Usage in handleSubmit:
const { isValid, formattedUrl } = validateAndFormatUrl(trimmedTitle);
if (linkDetected && !isValid) {
  // Show error to user
  return;
}

const data: Partial<CycleItem> = {
  title: formattedUrl,
  type: linkDetected ? "link" : "Issue",
  status: column,
};

if (linkDetected) {
  data.metadata = {
    url: formattedUrl,
  };
}

@oliursahin oliursahin linked an issue Oct 29, 2024 that may be closed by this pull request
1 task
@sajdakabir sajdakabir merged commit 2183b65 into preview Oct 29, 2024
3 checks passed
@deewakar-k deewakar-k deleted the feat/inbox-url branch October 31, 2024 07:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

treat url paste in inb and wk similar to reading list
2 participants