[FEATURE] Create Feed Page - DRAFT#121
Conversation
|
The latest updates on your projects. Learn more about Vercel for Git ↗︎
|
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the WalkthroughThis pull request introduces a new "create feed" feature. It adds several dependencies to support form handling and schema validation, new React components for building the feed creation interface, and updates to the route configuration. The changes include both UI component additions (including multi-step forms and various UI elements) and navigation updates to link to the new feed page. Changes
Sequence Diagram(s)sequenceDiagram
participant U as User
participant H as Header
participant CFP as CreateFeedPage
participant CFS as CurationFormSteps
participant BI as BasicInformationForm
U->>H: Click "Submit Content"
H->>CFP: Redirect to /create-feed/
CFP->>H: Render updated Header
CFP->>CFP: Render CreateFeedHero section
CFP->>CFS: Mount multi-step form
CFS->>BI: Render BasicInformationForm (Step 1)
U->>CFS: Fill form & navigate steps
CFS->>U: Display progress and validation feedback
Assessment against linked issues
Possibly related PRs
Poem
🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
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)
Other keywords and placeholders
CodeRabbit Configuration File (
|
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
There was a problem hiding this comment.
Actionable comments posted: 5
🔭 Outside diff range comments (1)
frontend/package.json (1)
13-44: 💡 Verification agent🧩 Analysis chain
Appropriate dependencies for form handling and UI components
The added dependencies align with the new UI components being introduced in this PR. This includes form handling libraries (react-hook-form, @hookform/resolvers, zod) and Radix UI components for labels, progress bars, and tabs.
🌐 Web query:
Are there any known compatibility issues between react-hook-form 7.55.0 and zod 3.24.2?💡 Result:
Yes, there are known compatibility issues between react-hook-form 7.55.0 and zod 3.24.2, primarily related to type inference and compilation errors in TypeScript projects. Here's a breakdown of the key issues:
1. Type System Inconsistencies
- Problem: When using
zodResolver, Zod applies schema transformations after validation, but react-hook-form's type system infers the input type (z.input) instead of the transformed output type (z.output) for submission handlers[1][4]. This creates a mismatch between runtime data (transformed) and TypeScript’s inferred types (untransformed).
- Example: If a Zod schema transforms a string to a number, the submit handler’s parameter will still be typed as
string, even though the runtime value is a number[1].- Workaround: Manually assert the type in the submit handler or adjust the schema to avoid transformations that conflict with type inference.
2. TypeScript Compilation Failures
- Problem: Zod 3.24.2 introduced changes that cause TypeScript to throw
Type instantiation is excessively deep and possibly infiniteerrors when used with react-hook-form’s resolvers[3][7]. This occurs in projects where dependencies use differing Zod versions (e.g., a library uses Zod 3.23.x while the main project uses 3.24.x)[3].- Root Cause: Zod’s type definitions in 3.24.2 are incompatible with older versions of
@hookform/resolvers, leading to recursive type errors[3][7].- Fix: Downgrade to Zod 3.24.1 or ensure all dependencies use the same Zod version. This resolves the infinite recursion issue[3][7].
3. Best Practices for Compatibility
- Version Alignment:
- Use
zod@3.24.1instead of3.24.2to avoid compilation crashes[3][7].- Ensure
@hookform/resolversis updated to the latest version compatible with your Zod version.- Schema Design:
- Avoid complex transformations in Zod schemas if type mismatches in submit handlers are problematic[1][4].
- Use
z.inferto manually align types where necessary:const formSchema = z.object({ field: z.string().transform(/* ... */) }); type FormData = z.infer<typeof formSchema>; // Explicitly infer output type
Key Takeaways
- The issues stem primarily from Zod’s type system changes in 3.24.2 and react-hook-form’s reliance on input types for validation.
- Downgrading to Zod 3.24.1 is the most reliable solution for now[3][7].
- Monitor GitHub issues (#12446, #4027) for updates on fixes.
Citations:
- 1: react-hook-form/react-hook-form#12446
- 2: https://www.wisp.blog/blog/how-to-use-zod-validation-for-react-hook-forms-with-shadcns-form-component
- 3: colinhacks/zod#4027
- 4: https://www.freecodecamp.org/news/react-form-validation-zod-react-hook-form/
- 5: https://www.youtube.com/watch?v=WlR1p8DCdNY
- 6: https://github.com/colinhacks/zod/releases
- 7: react-hook-form/resolvers#675
- 8: https://github.com/orgs/react-hook-form/discussions/8091
- 9: https://security.snyk.io/package/npm/zod
- 10: https://www.contentful.com/blog/react-hook-form-validation-zod/
Important: Adjust Zod version to avoid react-hook-form compatibility issues
- The dependencies generally align with the new UI and form handling libraries introduced in this PR.
- However, our verification confirms that using react-hook-form 7.55.0 with zod 3.24.2 is known to cause type inference and TypeScript compilation issues.
- Action Required: Consider downgrading Zod to version 3.24.1 to prevent these errors, or ensure you have robust type assertions and workarounds in place if you wish to retain 3.24.2.
Diff Suggestion (if opting for a downgrade):
- "zod": "^3.24.2", + "zod": "^3.24.1",
🧹 Nitpick comments (17)
frontend/src/components/CreateFeedHero.tsx (1)
2-2: Remove or complete the commented codeThere's a comment "Import as a static asset" but no actual import statement follows it. Either complete the import or remove the comment to keep the code clean.
- // Import as a static assetfrontend/src/components/ui/textarea.tsx (1)
3-3: Consider using relative importsThe import for
cnuses an absolute path (src/lib/utils). Consider using a relative path (e.g.,../../../lib/utils) for consistency with other imports in the codebase and to prevent potential issues with path resolution in different environments.-import { cn } from "src/lib/utils"; +import { cn } from "../../../lib/utils";frontend/src/components/ui/input.tsx (1)
5-19: Well-implemented Input component with robust stylingThis component is a well-structured wrapper around an HTML input element with comprehensive styling using Tailwind CSS. It correctly uses React.forwardRef and properly handles className composition with the cn utility.
Consider adding a default value for the
typeprop to improve usage clarity:- const Input = React.forwardRef<HTMLInputElement, React.ComponentProps<"input">>( - ({ className, type, ...props }, ref) => { + const Input = React.forwardRef<HTMLInputElement, React.ComponentProps<"input">>( + ({ className, type = "text", ...props }, ref) => {frontend/src/components/ui/label.tsx (1)
7-9: Consider future extensibility with cva variantsThe labelVariants is currently defined without any actual variants, which is unusual for cva usage. This works, but you might want to consider defining variants if you plan to extend this component in the future.
If no variants are needed, you could simplify by using a constant string instead:
- const labelVariants = cva( - "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70", - ); + const labelClasses = "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70";Or keep cva for future extensibility by defining actual variants:
- const labelVariants = cva( - "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70", - ); + const labelVariants = cva( + "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70", + { + variants: { + size: { + default: "", + sm: "text-xs", + lg: "text-base", + }, + }, + defaultVariants: { + size: "default", + }, + } + );frontend/src/components/ui/progress.tsx (1)
6-23: Well-implemented Progress component with dynamic indicatorThe Progress component provides a well-structured wrapper around Radix UI's ProgressPrimitive with good styling defaults and dark mode support. The transform logic for the indicator is correct, calculating the visible portion based on the provided value.
Consider adding a validation or constraint for the
valueprop to ensure it stays within the expected 0-100 range:- <ProgressPrimitive.Indicator - className="h-full w-full flex-1 bg-neutral-900 transition-all dark:bg-neutral-50" - style={{ transform: `translateX(-${100 - (value || 0)}%)` }} - /> + <ProgressPrimitive.Indicator + className="h-full w-full flex-1 bg-neutral-900 transition-all dark:bg-neutral-50" + style={{ transform: `translateX(-${100 - (Math.max(0, Math.min(100, value || 0)))}%)` }} + />This ensures that even if the component receives values outside the expected range, it will still render correctly.
frontend/src/components/CurationSettingsForm.tsx (2)
20-20: Remove empty lines within step objectsThere are unnecessary empty lines within the step objects. These should be removed to maintain consistent formatting.
Also applies to: 27-27, 34-34
64-74: Implement placeholder componentsThe components
PublishingIntegrations,ContentApprovers, andSubmissionRulesare currently just stubs. Consider implementing them with at least basic UI elements consistent with the design system.Would you like suggestions for implementation of these components?
frontend/src/components/CurationFormSteps.tsx (4)
7-12: Consider adding an id field to Step typeThe Step type could benefit from having an id field for better tracking, similar to how it's implemented in CurationSettingsForm.tsx. This would provide a more stable key for React elements than the array index.
// Define step content types type Step = { title: string; description: string; + id: number; component: React.ReactNode; };
59-68: Consider making steps clickable for navigationThe step titles are displayed at the top, but they can't be clicked to navigate directly to that step. Consider enhancing UX by making them clickable.
{steps.map((step, index) => ( <div key={index} className="flex flex-col items-center"> <span - className={`text-sm ${index === currentStep ? "font-bold" : ""}`} + className={`text-sm ${index === currentStep ? "font-bold" : ""} cursor-pointer`} + onClick={() => setCurrentStep(index)} > {step.title} </span> </div> ))}
101-101: Remove unnecessary commentThe comment
{/* Navigation buttons */}is redundant since the navigation buttons are already defined above. Consider removing this comment.
106-108: Implement FeedReviewForm componentThis placeholder component needs to be implemented with actual review functionality that displays the form data entered in previous steps.
Would you like me to help you implement a more complete version of this component?
frontend/src/components/BasicInformationForm.tsx (3)
48-48: Remove console.log statementsRemove debugging console.log statements before merging to production.
- console.log("User Info:", info);
91-91: Remove commented-out codeThere are multiple instances of commented-out code (FormLabel and icon elements) which should either be used or removed entirely.
- {/* <FormLabel>Profile Image</FormLabel> */}- {/* <Upload className="h-4 w-4" /> */}Also applies to: 122-122
88-89: Consider a cleaner approach for field destructuringUsing
eslint-disable-next-lineto avoid unused variable warnings is not ideal. A better approach would be to use proper destructuring syntax.- // eslint-disable-next-line @typescript-eslint/no-unused-vars - render={({ field: { onChange, value, ...rest } }) => ( + render={({ field: { onChange, _value, ...rest } }) => (Or if the value isn't used at all:
- // eslint-disable-next-line @typescript-eslint/no-unused-vars - render={({ field: { onChange, value, ...rest } }) => ( + render={({ field: { onChange, ...rest } }) => (frontend/src/components/ContentProgress.tsx (2)
56-56: Improve JSON editor placeholderThe current JSON editor placeholder is just
{, which might be confusing for users. Consider providing a more helpful placeholder with sample JSON structure.- <Textarea className="min-h-[200px] font-mono" placeholder="{" /> + <Textarea className="min-h-[200px] font-mono" placeholder="{ + // Enter your JSON here + \"key\": \"value\" + }" />
67-69: Implement placeholder functionalityThe "Advanced Content Mapper" and "AI Content Enhancer" steps contain placeholder text. Consider implementing basic UI elements for these features to make the PR more complete.
Would you like me to suggest implementation details for these components?
Also applies to: 77-79
frontend/src/components/UserMenu.tsx (1)
43-79: Consider making the profile image loading less aggressive.
YourProfileImagecomponent is robust, but usingloading="eager"may harm performance on slow connections. Consider making it optional or switching toloading="lazy"for better user experience—particularly if these images aren’t critical-path content.- loading="eager" + loading="lazy"
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (3)
backend/bun.lockis excluded by!**/*.lockfrontend/bun.lockis excluded by!**/*.lockfrontend/public/grid.pngis excluded by!**/*.png
📒 Files selected for processing (16)
frontend/package.json(2 hunks)frontend/src/components/BasicInformationForm.tsx(1 hunks)frontend/src/components/ContentProgress.tsx(1 hunks)frontend/src/components/CreateFeedHero.tsx(1 hunks)frontend/src/components/CurationFormSteps.tsx(1 hunks)frontend/src/components/CurationSettingsForm.tsx(1 hunks)frontend/src/components/Header.tsx(2 hunks)frontend/src/components/UserMenu.tsx(4 hunks)frontend/src/components/ui/form.tsx(1 hunks)frontend/src/components/ui/input.tsx(1 hunks)frontend/src/components/ui/label.tsx(1 hunks)frontend/src/components/ui/progress.tsx(1 hunks)frontend/src/components/ui/tabs.tsx(1 hunks)frontend/src/components/ui/textarea.tsx(1 hunks)frontend/src/routeTree.gen.ts(13 hunks)frontend/src/routes/create-feed/index.tsx(1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (10)
frontend/src/routes/create-feed/index.tsx (2)
frontend/src/components/CreateFeedHero.tsx (1)
CreateFeedHero(1-13)frontend/src/components/CurationFormSteps.tsx (1)
CurationFormSteps(14-104)
frontend/src/components/ui/label.tsx (1)
frontend/src/lib/utils.ts (1)
cn(4-6)
frontend/src/components/ui/input.tsx (1)
frontend/src/lib/utils.ts (1)
cn(4-6)
frontend/src/components/ContentProgress.tsx (3)
frontend/src/components/ui/tabs.tsx (4)
Tabs(53-53)TabsList(53-53)TabsTrigger(53-53)TabsContent(53-53)frontend/src/components/ui/textarea.tsx (1)
Textarea(22-22)frontend/src/components/ui/button.tsx (1)
Button(58-58)
frontend/src/components/ui/textarea.tsx (1)
frontend/src/lib/utils.ts (1)
cn(4-6)
frontend/src/components/CurationFormSteps.tsx (3)
frontend/src/components/BasicInformationForm.tsx (1)
BasicInformationForm(28-209)frontend/src/components/ui/progress.tsx (1)
Progress(26-26)frontend/src/components/ui/button.tsx (1)
Button(58-58)
frontend/src/components/ui/progress.tsx (1)
frontend/src/lib/utils.ts (1)
cn(4-6)
frontend/src/components/CurationSettingsForm.tsx (2)
frontend/src/components/ContentProgress.tsx (1)
ContentProgress(15-139)frontend/src/components/CurationFormSteps.tsx (1)
CurationFormSteps(14-104)
frontend/src/components/ui/tabs.tsx (1)
frontend/src/lib/utils.ts (1)
cn(4-6)
frontend/src/components/ui/form.tsx (2)
frontend/src/lib/utils.ts (1)
cn(4-6)frontend/src/components/ui/label.tsx (1)
Label(24-24)
🪛 Biome (1.9.4)
frontend/src/components/ContentProgress.tsx
[error] 6-6: Do not shadow the global "Map" property.
Consider renaming this variable. It's easy to confuse the origin of variables when they're named after a known global.
(lint/suspicious/noShadowRestrictedNames)
🔇 Additional comments (29)
frontend/src/routes/create-feed/index.tsx (2)
1-9: Well structured route declaration!The file correctly uses
createFileRoutefrom @tanstack/react-router to define a new route at/create-feed/. The import statements are appropriately organized, and the route is properly configured with its component.
10-18: Clean component implementation!The
RouteComponentfollows a logical structure by rendering the header, hero section, and form steps in sequence. The component organization makes sense for a multi-step form flow.frontend/src/components/CreateFeedHero.tsx (1)
4-12: Component structure looks good!The hero section is well-designed with appropriate heading and descriptive text. The Tailwind classes provide a clean, centered layout with proper spacing.
frontend/src/components/Header.tsx (2)
81-83: Link destination correctly updated!The desktop navigation link has been appropriately updated to point to the new
/create-feedroute, maintaining consistency with the new feature.
162-172: Mobile navigation link properly updated!The mobile navigation link has been correctly updated to point to the
/create-feedroute, ensuring consistent navigation across all device sizes.frontend/src/components/ui/textarea.tsx (3)
5-19: Well-implemented reusable component!The
Textareacomponent is properly implemented usingReact.forwardRefto allow ref forwarding, which is essential for form library integration. The component correctly spreads props to the underlying textarea element and properly merges custom className with the default styles.
11-14: Comprehensive styling for different statesThe component includes proper styling for various states (default, focus, disabled) and accommodates both light and dark themes. The use of the
cnutility for class merging ensures proper composition of styles.
20-22: Setting display name is good practice!Setting the display name is important for debugging and DevTools identification. Good job including this detail.
frontend/src/components/ui/label.tsx (1)
11-21: Well-structured Label component implementationThe Label component is correctly implemented using React.forwardRef and properly integrates with Radix UI's LabelPrimitive. The proper TypeScript types ensure type safety throughout the component.
frontend/src/components/CurationSettingsForm.tsx (1)
1-1: Validate the import is neededThis component imports
ContentProgressbut doesn't explicitly use it in any props or function parameters. Ensure it's being used directly within the component rendering.frontend/src/components/ui/tabs.tsx (5)
1-5: Imports and utility usage look solid.
All imports appear correctly declared, and thecnutility fromsrc/lib/utilsis properly integrated, promoting consistent styling.
6-22:TabsandTabsListdefinitions are clean and idiomatic.
Good use ofTabsPrimitive.Rootand a properly forwarded ref inTabsList. The styling classes are concise and maintainable.
23-37:TabsTriggerimplementation looks good.
The ref-forwarding pattern and conditional classes for active states are well handled. This aligns with Radix UI best practices.
38-52:TabsContentforwarding ref is well-structured.
The component's approach for focus visibility and ring offset is coherent, ensuring strong accessibility features.
53-53: File export is straightforward.
Exporting all tab components together provides a convenient API surface for consumers of this module.frontend/src/components/UserMenu.tsx (4)
14-18: Initialization ofimageErrorstate is appropriate.
Storing the image loading error state inimageErrorensures the UI can gracefully handle broken or missing images.
28-29: Resetting theimageErrorupon fetching new user info is a good pattern.
This logic avoids stale error flags when profile image URLs change.
87-87: Usage of<ProfileImage size="small" />is correct.
Calling the new component for the small avatar scenario nicely encapsulates your logic.
103-103: Rendering<ProfileImage />in the dropdown is consistent.
Semantically, the fallback and error handling remains coherent across multiple contexts.frontend/src/components/ui/form.tsx (5)
1-14: Imports and foundational setup are well-organized.
Bringing inreact-hook-formand@radix-ui/react-labelensures seamless integration for form management and labels.
16-41:FormandFormFieldcomponents adhere to standard patterns.
UsingFormProviderandControlleris a straightforward approach, and the context-basedFormFielddesign fosters maintainable form structures.
42-63:useFormFieldhook is properly scoped.
Your error handling for out-of-context usage is clear, safeguarding unexpected integrations.
65-172: Form item components effectively separate concerns.
FormItem,FormLabel,FormControl,FormDescription, andFormMessagecollectively provide a coherent, accessible, and flexible form structure. Great approach using unique IDs and aria attributes.
174-184: Exports provide a cohesive API surface.
The consolidated export block makes it straightforward for consumers to adopt form utilities in a consistent manner.frontend/src/routeTree.gen.ts (5)
22-22: The import statement for the new Create Feed route looks good.The import follows the same pattern as other route imports in the file.
74-78: Route definition is properly structured.The CreateFeedIndexRoute is correctly defined with the appropriate id, path, and parent route configuration.
144-150: Note path inconsistency in FileRoutesByPath interface.The id property has a trailing slash ("/create-feed/") while the path and fullPath properties don't have it ("/create-feed"). While this may be intentional based on how TanStack Router works, verify that this inconsistency doesn't cause routing issues.
190-190: Route integration is complete and consistent.The new route has been properly added to all necessary interfaces and objects: FileRoutesByFullPath, FileRoutesByTo, FileRoutesById, route lists, RootRouteChildren interface, rootRouteChildren object, and the route manifest.
Also applies to: 202-202, 215-215, 229-229, 240-240, 251-251, 264-264, 275-275, 295-295, 325-327
1-9: Generated file warning.Be careful with manual edits to this file as it's automatically generated by TanStack Router. According to the file comments, changes may be overwritten when the router regenerates the file. Ensure this file was regenerated properly after adding the new route definition.
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
There was a problem hiding this comment.
Actionable comments posted: 15
♻️ Duplicate comments (3)
frontend/src/components/CurationSettingsForm.tsx (1)
35-63: Duplicate descriptions in steps array.All steps except for the first one have the exact same description: "Define how content is processed before being published". Each step should have a unique description that explains its specific purpose.
{ title: "Publishing Integrations", - description: "Define how content is processed before being published", + description: "Configure where and how your content will be published", id: 2, component: <PublishingIntegrations />, }, { title: "Content Approvers", - description: "Define how content is processed before being published", + description: "Set up who can approve content submissions", id: 3, component: <ContentApprovers />, }, { title: "Submission Rules", - description: "Define how content is processed before being published", + description: "Define rules for content submissions and moderation", id: 4, component: <SubmissionRules />, },frontend/src/components/content-progress/data.ts (1)
2-2:⚠️ Potential issueRename Map import to avoid shadowing global Map
The imported
Mapcomponent from lucide-react shadows the globalMapobject, which could lead to confusion in your codebase.- import { Map, Newspaper, Sparkles } from "lucide-react"; + import { Map as MapIcon, Newspaper, Sparkles } from "lucide-react";And update its usage:
- icon: Map, + icon: MapIcon,🧰 Tools
🪛 Biome (1.9.4)
[error] 2-2: Do not shadow the global "Map" property.
Consider renaming this variable. It's easy to confuse the origin of variables when they're named after a known global.
(lint/suspicious/noShadowRestrictedNames)
frontend/src/components/ContentProgress.tsx (1)
155-155: 🛠️ Refactor suggestionImprove layout responsiveness
The fixed padding value of
px-64might cause layout issues on smaller screens. Consider using responsive utilities or relative units.- className={`${!showSteps ? "py-14 px-64 bg-gray-50" : "p-0 bg-white"}`} + className={`${!showSteps ? "py-14 px-8 md:px-16 lg:px-32 xl:px-64 bg-gray-50" : "p-0 bg-white"}`}
🧹 Nitpick comments (20)
frontend/src/components/Icons.tsx (1)
3-16: Add accessibility attributes to the SVG iconThe SVG icon lacks accessibility attributes like
aria-hiddenandrole, which are important for screen readers.<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" + aria-hidden="true" + role="img" + aria-label="Arrow down icon" > <path d="M4 22H20C20.5304 22 21.0391 21.7893 21.4142 21.4142C21.7893 21.0391 22 20.5304 22 20V4C22 3.46957 21.7893 2.96086 21.4142 2.58579C21.0391 2.21071 20.5304 2 20 2H8C7.46957 2 6.96086 2.21071 6.58579 2.58579C6.21071 2.96086 6 3.46957 6 4V20C6 20.5304 5.78929 21.0391 5.41421 21.4142C5.03914 21.7893 4.53043 22 4 22ZM4 22C3.46957 22 2.96086 21.7893 2.58579 21.4142C2.21071 21.0391 2 20.5304 2 20V11C2 9.9 2.9 9 4 9H6M18 14H10M15 18H10M10 6H18V10H10V6Z" stroke="#020617" strokeLinecap="round" strokeLinejoin="round" /> </svg>frontend/src/components/ContentApprovers.tsx (4)
5-13: Add TypeScript interface for approver data structureThe approver data structure is used without a TypeScript interface, which reduces type safety.
+interface Approver { + id: number; + name: string; + handle: string; +} export default function ContentApprovers() { - const [approvers, setApprovers] = useState([ + const [approvers, setApprovers] = useState<Approver[]>([ { id: 1, name: "Cuppy Cupperson", handle: "djcuppy" }, { id: 2, name: "John Smith", handle: "jsmith" }, ]); const handleDeleteApprover = (id: number) => { setApprovers(approvers.filter((approver) => approver.id !== id)); };
46-59: Add accessibility attributes to the Twitter icon SVGThe Twitter icon SVG lacks accessibility attributes, which makes it less accessible for users with screen readers.
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14" fill="none" + aria-hidden="true" + role="img" + aria-label="Twitter icon" > <path d="M10.3494 1.75H12.1299L8.24098 6.22457L12.8327 12.2922H9.22492L6.41367 8.61412L3.18074 12.2922H1.40029L5.5703 7.51305L1.16602 1.75H4.86749L7.42104 5.12349L10.3494 1.75ZM9.71689 11.2145H10.7008L4.32867 2.75736H3.25102L9.71689 11.2145Z" fill="#020617" /> </svg>
61-81: Consider adding confirmation dialog before deletionThe delete functionality currently doesn't include a confirmation dialog, which could lead to accidental deletions.
Consider adding a confirmation step before deleting an approver:
<Button variant="ghost" size="default" className="text-gray-400 hover:text-red-500" - onClick={() => handleDeleteApprover(approver.id)} + onClick={() => { + if (confirm(`Are you sure you want to remove ${approver.name}?`)) { + handleDeleteApprover(approver.id); + } + }} >
16-85: Consider extracting approver card into a separate componentThe JSX for rendering each approver is quite lengthy and could be extracted into a separate component to improve readability and maintainability.
Create a new component like
ApproverCard:interface ApproverCardProps { approver: Approver; onDelete: (id: number) => void; } function ApproverCard({ approver, onDelete }: ApproverCardProps) { return ( <div key={approver.id} className="flex items-center justify-between py-3 px-4 border border-neutral-400 rounded-lg bg-neutral-50" > {/* Component content... */} </div> ); }Then use it in the main component:
<div className="space-y-3 mt-6"> {approvers.map((approver) => ( - <div - key={approver.id} - className="flex items-center justify-between py-3 px-4 border border-neutral-400 rounded-lg bg-neutral-50" - > - {/* ... all the approver card content ... */} - </div> + <ApproverCard + key={approver.id} + approver={approver} + onDelete={handleDeleteApprover} + /> ))} </div>frontend/src/components/content-progress/JsonEditor.tsx (2)
12-12: Default value logic could be improvedThe current implementation uses the OR operator to provide a default value, but this approach doesn't handle empty strings correctly.
- value={jsonContent || `{\n "template": ""\n}`} + value={jsonContent?.trim() ? jsonContent : `{\n "template": ""\n}`}
1-17: Consider using a more feature-rich JSON editorFor editing JSON, consider using a dedicated library like
react-json-editor-ajrmormonaco-editorthat provides syntax highlighting, error checking, and auto-formatting.This would improve the user experience significantly when working with complex JSON structures.
frontend/src/components/content-progress/EmptyState.tsx (1)
1-28: LGTM, just a few styling suggestions for consistencyThe
EmptyStatecomponent is well-structured and follows React's functional component pattern with proper props typing. The overall implementation is clean.A few minor suggestions:
- Consider replacing hardcoded color values like
text-[#a3a3a3]with Tailwind's built-in text colors (e.g.,text-neutral-400) for better theming consistency- There's some inconsistency between using
font-basein one paragraph andfont-normalin another- <p className="text-[#a3a3a3] text-center font-base font-bold leading-7"> + <p className="text-neutral-400 text-center font-bold leading-7"> No Processing Steps Added </p> - <p className="text-center text-base font-normal leading-7 text-[#a3a3a3]"> + <p className="text-center text-base font-normal leading-7 text-neutral-400"> Processing steps transform your content before publishing </p>frontend/src/components/PublishIntegrations.tsx (4)
44-44: Fix empty font classThere's an empty
font-class that should be removed.- <p className="text-lg font-semibold font-">Telegram</p> + <p className="text-lg font-semibold">Telegram</p>
37-38: React JSX attribute naming conventionIn React JSX, SVG attributes should use camelCase naming convention.
- <stop stop-color="#37AEE2" /> - <stop offset="1" stop-color="#1E96C8" /> + <stop stopColor="#37AEE2" /> + <stop offset="1" stopColor="#1E96C8" />
58-64: React JSX attribute naming conventionThe
clip-pathand related attributes should use camelCase in React JSX.- <g clip-path="url(#clip0_2539_9441)"> + <g clipPath="url(#clip0_2539_9441)"> <path d="M12.0607 6.91406C12.6909 7.14901 13.2517 7.53908 13.6912 8.0482C14.1307 8.55731 14.4348 9.16902 14.5752 9.82677C14.7157 10.4845 14.688 11.1671 14.4947 11.8113C14.3015 12.4555 13.9489 13.0406 13.4697 13.5125C12.9904 13.9843 12.3999 14.3277 11.7527 14.5109C11.1055 14.694 10.4226 14.7111 9.76717 14.5604C9.11169 14.4097 8.50479 14.0961 8.0026 13.6487C7.5004 13.2013 7.11913 12.6345 6.89404 12.0007M4.66732 4.00065H5.33398V6.66732M11.1407 9.25391L11.6074 9.72724L9.72738 11.6072M9.33398 5.33398C9.33398 7.54312 7.54312 9.33398 5.33398 9.33398C3.12485 9.33398 1.33398 7.54312 1.33398 5.33398C1.33398 3.12485 3.12485 1.33398 5.33398 1.33398C7.54312 1.33398 9.33398 3.12485 9.33398 5.33398Z" - stroke="#525252" - stroke-linecap="round" - stroke-linejoin="round" + stroke="#525252" + strokeLinecap="round" + strokeLinejoin="round"
83-83: Remove empty classNameThere's an empty className property that can be removed.
- <div className=" "> + <div>frontend/src/components/content-progress/TemplateElement.tsx (1)
1-34: LGTM, consider adding accessibility improvementsThe
TemplateElementcomponent is well-structured with proper TypeScript typing and follows React best practices. The implementation is clean and the component has a clear single responsibility.To enhance accessibility, consider adding a few ARIA attributes and ensuring the keyboard interaction is optimal.
<Checkbox id={element.id} checked={isSelected} onCheckedChange={() => onToggle(element.id)} - className="w-4 h-4 fill-black opacity-50" + className="w-4 h-4 fill-black opacity-50" + aria-label={`Select ${element.title}`} />frontend/src/components/ui/switch.tsx (1)
4-4: Consider using relative imports for better reliabilityThe import is using an absolute path which might cause issues depending on the project's import configuration.
-import { cn } from "src/lib/utils"; +import { cn } from "../../lib/utils";frontend/src/components/ui/checkbox.tsx (1)
7-25: Consider breaking down the long className for better readability.The className on line 14 contains many Tailwind classes in a single line. Consider breaking this into multiple lines or using a more structured approach with Tailwind variants to improve readability and maintainability.
className={cn( - "peer h-4 w-4 shrink-0 rounded-sm border border-neutral-200 border-neutral-900 shadow focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-neutral-950 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-neutral-900 data-[state=checked]:text-neutral-50 dark:border-neutral-800 dark:border-neutral-50 dark:focus-visible:ring-neutral-300 dark:data-[state=checked]:bg-neutral-50 dark:data-[state=checked]:text-neutral-900", + "peer h-4 w-4 shrink-0 rounded-sm border border-neutral-200 border-neutral-900 shadow", + "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-neutral-950", + "disabled:cursor-not-allowed disabled:opacity-50", + "data-[state=checked]:bg-neutral-900 data-[state=checked]:text-neutral-50", + "dark:border-neutral-800 dark:border-neutral-50 dark:focus-visible:ring-neutral-300", + "dark:data-[state=checked]:bg-neutral-50 dark:data-[state=checked]:text-neutral-900", className, )}frontend/src/components/CurationSettingsForm.tsx (1)
44-46: Remove unnecessary empty lines.There are empty lines within the step objects that can be removed for better readability and consistency.
{ title: "Publishing Integrations", description: "Define how content is processed before being published", - id: 2, component: <PublishingIntegrations />, }, { title: "Content Approvers", description: "Define how content is processed before being published", - id: 3, component: <ContentApprovers />, }, { title: "Submission Rules", description: "Define how content is processed before being published", - id: 4, component: <SubmissionRules />, },Also applies to: 51-53, 58-60
frontend/src/components/content-progress/StepItem.tsx (2)
32-32: Fix missing space in className.There's a missing space in the className value.
- <div className="p-2rounded-md">{icon}</div> + <div className="p-2 rounded-md">{icon}</div>
38-38: Fix typo in className.There's a typo in the className value.
- <p className="text-sm text-[#525252] leadiong-5">{description}</p> + <p className="text-sm text-[#525252] leading-5">{description}</p>frontend/src/components/content-progress/VisualEditor.tsx (2)
19-27: Add error handling to preview generationThe preview generation doesn't handle the case where a selected element ID might not exist in
templateElements. Consider adding a fallback.return selectedElements - .map((id) => templateElements.find((el) => el.id === id)?.template || "") + .map((id) => { + const template = templateElements.find((el) => el.id === id)?.template; + if (!template) { + console.warn(`Template element with id "${id}" not found`); + return ""; + } + return template; + }) .join("\n");
56-58: Add a minimum height for empty previewsWhen no elements are selected, the preview container might appear too small. Consider adding a minimum height for better user experience.
- <div className="bg-neutral-100 border-neutral-300 border py-[6px] px-[14px] rounded-lg min-h-fit whitespace-pre-line font-mono text-sm"> + <div className="bg-neutral-100 border-neutral-300 border py-[6px] px-[14px] rounded-lg min-h-[100px] whitespace-pre-line font-mono text-sm">
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
frontend/bun.lockis excluded by!**/*.lock
📒 Files selected for processing (16)
frontend/package.json(2 hunks)frontend/src/components/ContentApprovers.tsx(1 hunks)frontend/src/components/ContentProgress.tsx(1 hunks)frontend/src/components/CurationFormSteps.tsx(1 hunks)frontend/src/components/CurationSettingsForm.tsx(1 hunks)frontend/src/components/Icons.tsx(1 hunks)frontend/src/components/PublishIntegrations.tsx(1 hunks)frontend/src/components/content-progress/EmptyState.tsx(1 hunks)frontend/src/components/content-progress/JsonEditor.tsx(1 hunks)frontend/src/components/content-progress/StepItem.tsx(1 hunks)frontend/src/components/content-progress/TemplateElement.tsx(1 hunks)frontend/src/components/content-progress/VisualEditor.tsx(1 hunks)frontend/src/components/content-progress/data.ts(1 hunks)frontend/src/components/content-progress/types.ts(1 hunks)frontend/src/components/ui/checkbox.tsx(1 hunks)frontend/src/components/ui/switch.tsx(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- frontend/src/components/CurationFormSteps.tsx
🧰 Additional context used
🧬 Code Graph Analysis (8)
frontend/src/components/content-progress/types.ts (2)
frontend/src/components/content-progress/TemplateElement.tsx (1)
TemplateElement(10-34)frontend/src/components/content-progress/data.ts (2)
TemplateElement(5-10)Step(53-57)
frontend/src/components/PublishIntegrations.tsx (2)
frontend/src/components/ui/switch.tsx (1)
Switch(27-27)frontend/src/components/ui/button.tsx (1)
Button(58-58)
frontend/src/components/ui/switch.tsx (1)
frontend/src/lib/utils.ts (1)
cn(4-6)
frontend/src/components/content-progress/data.ts (2)
frontend/src/components/content-progress/TemplateElement.tsx (1)
TemplateElement(10-34)frontend/src/components/content-progress/types.ts (2)
TemplateElement(3-8)Step(10-15)
frontend/src/components/ContentProgress.tsx (5)
frontend/src/components/content-progress/data.ts (2)
templateElements(13-50)stepDefinitions(60-78)frontend/src/components/content-progress/VisualEditor.tsx (1)
VisualEditor(13-69)frontend/src/components/content-progress/JsonEditor.tsx (1)
JsonEditor(8-17)frontend/src/components/content-progress/EmptyState.tsx (1)
EmptyState(8-28)frontend/src/components/content-progress/StepItem.tsx (1)
StepItem(14-47)
frontend/src/components/ui/checkbox.tsx (1)
frontend/src/lib/utils.ts (1)
cn(4-6)
frontend/src/components/content-progress/JsonEditor.tsx (1)
frontend/src/components/ui/textarea.tsx (1)
Textarea(22-22)
frontend/src/components/ContentApprovers.tsx (1)
frontend/src/components/ui/button.tsx (1)
Button(58-58)
🪛 Biome (1.9.4)
frontend/src/components/content-progress/data.ts
[error] 2-2: Do not shadow the global "Map" property.
Consider renaming this variable. It's easy to confuse the origin of variables when they're named after a known global.
(lint/suspicious/noShadowRestrictedNames)
🔇 Additional comments (12)
frontend/src/components/Icons.tsx (1)
1-18: LGTM! Organization of icons in a single object is a good practiceThe approach of organizing icons in a centralized object is a good practice for maintainability and consistency. This structure will make it easy to add more icons in the future.
frontend/src/components/content-progress/types.ts (2)
3-8: LGTM! Clear and well-structured interface definitionThe
TemplateElementinterface is well-defined with clear property names and appropriate types.
10-15:Details
❓ Verification inconclusive
Inconsistency in Step interface definition compared to other files
The
Stepinterface definesiconasReactNode, but according to the relevant code snippets, it's defined asReact.ComponentTypein other files. Additionally, thecontentproperty here is not present in the other implementation.Consider reviewing and aligning these interfaces to ensure consistency across the codebase:
🏁 Script executed:
#!/bin/bash # Check for inconsistent Step interface usage rg -A 2 -B 2 "interface Step" --type typescript rg -A 5 -B 0 "Step.*{" --type typescriptLength of output: 205
Action Required: Verify and Align Step Interface Definition
It appears that the Step interface in
frontend/src/components/content-progress/types.ts
defines theiconproperty asReactNodeand includes acontentproperty—whereas other parts of the codebase useReact.ComponentTypeforiconand do not include acontentproperty. Our initial verification attempt using ripgrep encountered regex errors. To gather clearer evidence, please re-run the following corrected shell scripts and manually verify the consistency of the Step interface across your files:#!/bin/bash # Search for all Step interface definitions in TS and TSX files rg -A 2 -B 2 "export interface Step" -g "*.ts" -g "*.tsx" echo "-------------" # Check usage of the 'icon' property to inspect type differences rg -n "icon:" -g "*.ts" -g "*.tsx"Next Steps:
- In
frontend/src/components/content-progress/types.ts, consider changingicon: ReactNodetoicon: React.ComponentTypeif that aligns with the other implementations.- Evaluate whether the extra
contentproperty is necessary; if it’s not part of the standard interface, remove it to maintain consistency.Please verify these points and adjust accordingly.
frontend/src/components/ContentApprovers.tsx (1)
20-22: Description text doesn't match functionalityThe description text "Generate Twitter threads from curated content" doesn't appear to match the functionality of managing content approvers.
Please verify if this description accurately reflects the purpose of content approvers or if it should be updated to better describe their role.
frontend/src/components/content-progress/JsonEditor.tsx (1)
3-6: LGTM! Well-defined TypeScript interfaceThe props interface is clearly defined with appropriate types.
frontend/src/components/ui/switch.tsx (1)
6-24: Well-implemented Switch component with comprehensive state handlingThe Switch component implementation is solid, following React's forwardRef pattern correctly and properly handling all the UI states (checked, unchecked, disabled, focused). The component leverages Radix UI's accessible foundation which ensures good keyboard navigation and screen reader support.
frontend/src/components/ui/checkbox.tsx (1)
1-28: Well-structured Checkbox component that follows best practices.This implementation of a Checkbox component using Radix UI primitives is well-structured. It properly uses React.forwardRef, handles component props appropriately, and sets the displayName for better debugging.
frontend/package.json (1)
13-46: Good selection of dependencies for form handling and UI components.The added dependencies are appropriate for creating form-based UIs with validation:
@hookform/resolversandzodfor form validation- Various Radix UI components for accessible UI elements
react-hook-formfor form state managementThese are well-maintained libraries that will help create a robust Feed Page interface.
frontend/src/components/CurationSettingsForm.tsx (2)
83-85: SubmissionRules component is a placeholder.The SubmissionRules component is currently a minimal placeholder. Ensure you implement the actual functionality for this component to match the requirements for the Feed Page feature.
Is there a ticket or design document that specifies what should be included in the SubmissionRules component?
6-26: Well-extracted StepHeader component.Good job extracting the StepHeader into a separate component. This promotes reusability and keeps the main component clean.
frontend/src/components/content-progress/data.ts (1)
13-50: Template elements look goodThe template elements array is well structured with clear identifiers and templates that use a consistent formatting style.
frontend/src/components/content-progress/VisualEditor.tsx (1)
13-17: Good use of memoizationThe use of
memohere is appropriate for optimizing component rendering, especially since the component might re-render frequently as selections change.
* Get basic working (#109) * Get basic working * adds rss feeds * added stablewatch founder and stablecoin intern from messaria as approvers on stablecoins feed * fixes to config for grants, sui, and telegram channels (#102) * add query param for selective processing (#103) * adds query param to process * add query param for processing * simplify * add tags * Feat: implement frontend leaderboard (#93) * feat: implement frontend leaderboard * feat: implement a leaderboard in frontend * feat: implemented leaderboard * fix: rebuild implement leaderboard * fix: prettier * fix: prettier * fix: reimplement frontend leaderboard * fix: implement frontend leaderboard * approval rate * sets approval rate and hides curator --------- Co-authored-by: Elliot Braem <elliot@ejlbraem.com> * remove tailwind-scrollbar * added bob to desci feed * Get basic working * set .env.example * nitpicks --------- Co-authored-by: Elliot Braem <elliot@ejlbraem.com> Co-authored-by: codingshot <45281667+codingshot@users.noreply.github.com> Co-authored-by: Elliot Braem <elliot@everything.dev> Co-authored-by: Louis <112561517+louisdevzz@users.noreply.github.com> * fix polyfills * Explore Page (#108) * Explore Page - commit-1 * Explore Page - commit-2 * explore page - commit-3 * explore page - commit - 4 * explore page - commit - prettier * explore page responsiveness + code Rabbit Comments * code Rabbit Comments resolved * css updates * css changes 2 * header update + mobile responsive * conflicts resolved * Rebase and changes * Fix fmt * Header + Explore Page Style (#113) * Explore Page - commit-1 * Explore Page - commit-2 * explore page - commit-3 * explore page - commit - 4 * explore page - commit - prettier * explore page responsiveness + code Rabbit Comments * code Rabbit Comments resolved * css updates * css changes 2 * header update + mobile responsive * conflicts resolved * Rebase and changes * Fix fmt * Header Updates + Web3Auth getUserInfo + Explore Page changes * fmt * coderabbit comments resolved * Profile page (#120) * Update the FE to have the profile page (header and tabs init) * Move tabs to it's own component * Add stats and top badges to overview * Finish the overview tab * Update overview page and init content page * feat(profile-page): add Content and My Feed tags * feat(profile-page): finish profile page static UI * refactor: fmt * [FEATURE] Create Feed Page - DRAFT (#121) * Curate Engine Step 1 * content-progress-configuration step-1 * Curation Settings Part 2 and 3 * CodeRabbit Comments Resolved + Mobile Responsive * Responsiveness: empty State, JSON check --------- Co-authored-by: Elliot Braem <elliot@everything.dev> * update to main * fmt * Feat/submissions page (#127) * Submissions Page + Feed Page + Mobile Responsiveness * fixes * craete-feed authenticated user condition * fmt * remove sqlite --------- Co-authored-by: Elliot Braem <elliot@ejlbraem.com> * Feed Page Tabs (#130) * set tanstack routes (#132) * [Task]: Add connect button to feed page (#131) * feat: Add connect button to feed page * fix: recommit * added back to stablecoins feed since stablewatch forked their own * fix packages, update pg, and ignore cloudflare sockets * fmt --------- Co-authored-by: ethnclark <ethanclark1310@gmail.com> Co-authored-by: codingshot <45281667+codingshot@users.noreply.github.com> Co-authored-by: Elliot Braem <elliot@ejlbraem.com> * uses prod data * Update changes to latest staging * Revert "Update changes to latest staging" This reverts commit cd12908. * Fix Sort By Oldest (#136) * fix: Sort By Oldest * fix: Sort By Oldest * fix: Fix RecentSubmissions Sort Order Update * fix: All feed should be hidden, remove double title --------- Co-authored-by: vohuunhan1310@gmail.com <ethanclark1310@gmail.com> * UI fixes (#138) * UI fixes * fmt --------- Co-authored-by: Elliot Braem <elliot@everything.dev> * Fix: Leaderboard improvements (#140) * fix: Leaderboard improvements * fix: fmt * reorganize * remove unused * rename * clean up * fmt --------- Co-authored-by: Elliot Braem <elliot@ejlbraem.com> * clean up * wallet wip * todo * auth flow, wip * types clean up * fix types * login modal wip * modals * controller, service, successful create account * clean with data, metadata, and pattern, validation, and json schema * add migration doc * add activity and delete user * fix migration * add seed remote method * fix naming * fix script call * file extension * remove build schema * proper build time * fix Dockerfile * rsbuild * Standard Header Component + Responsivenss Fixes (#146) * Standard Header Component + Responsivenss Fixes * fmt * rename Hero --------- Co-authored-by: Elliot Braem <elliot@ejlbraem.com> * fix broken link * don't distribute on staging * fix path * env log * comment out * railway env * fix: Profile adjustments (#153) * fix: Leaderboard improvements * fix: fmt * fix: Profile adjustments * fix: resolve conversation * Login Modal Fixes (#154) * Login Modal Fixes * Resolve Comments * container * container fixes --------- Co-authored-by: Elliot Braem <elliot@everything.dev> * organize * fmt * update feeds (#156) * Leaderboard width fixes * feat: save profile image to pinata (#158) * feat(fe): save profile image to pinata * fix: fix comment * Feat Integrate NEAR Solana, Ethereum wallet selection (#159) * fix: Leaderboard improvements * fix: fmt * fix: Profile adjustments * fix: resolve conversation * feat: Integrate NEAR wallet selection * fix: run fmt * fix: add function create accesstokenpayload use wallet selector near * fix: resolve conversation * Feed Submission + Feed Review Page (#160) * Feed Review Page and Feed Creation * fmt * coderabbit comments resolved * comments resolved * comments resolved * reset routeTree * minor fixes (#164) * minor fixes * fmt * remove node-compile-cache * reuse user menu * header clean up * remove how it works * clean up * set submissions at root route * fmt * clean * create is coming soon * clean up * user link * Adds caddyfile and frontend clean up (#165) * removes serve static from backend * fmt * fix build * adds caddyfile * clean up submission feed * pnpm lock * fix turbo * fix build * db migration * without time zone * cleans up submission list * Adds shared-db, types package, initial migration (#166) * init * upgrade tsconfigs * shared-db build * shared-db wip * transfer getAllSubmissions * hooked up * moves to shared-db * fmt * update dockerfile * monorepo * working build * migration service * turbo * install pnpm * temp proxy * no include request headers * clean up * proper path * renaming * fmt * update caddyfile * different strategy * use route * fix BACKEND to API * ignore temp * temp remove * back to orig * turn on auto https * disable * route block * clean up * configure host * favicon * add staging domain * http: * set domain adn host * correct bash * matching host * Adds edit feed and image upload (#168) * adds page * image upload and edit feed * update pnpm lock * CSR * vercel json * move * temp disable auth * set image * fix query * submisison service running * Migrates submission service, is running (#169) * init * wip * clean up * feed list clean up * break up functions * fix config path * adds plugins route and integrates with plugin service * remote curate.config.json * plugins table * adds plugin pages * set type * fix feed types * plguin errors * env injection * fix queries * fix migration * fix migration * fix migration * redo migration * decouples moderation * fix status * fix feeds * hide moderation actions --------- Co-authored-by: Zeeshan Ahmad <itexpert120@outlook.com> Co-authored-by: codingshot <45281667+codingshot@users.noreply.github.com> Co-authored-by: Louis <112561517+louisdevzz@users.noreply.github.com> Co-authored-by: Muhammad Saad Iqbal <saadiqbal.dev@outlook.com> Co-authored-by: ethnclark <ethanclark1310@gmail.com> Co-authored-by: dungpt82 <69756171+dungpt99@users.noreply.github.com>
* Get basic working (#109) * Get basic working * adds rss feeds * added stablewatch founder and stablecoin intern from messaria as approvers on stablecoins feed * fixes to config for grants, sui, and telegram channels (#102) * add query param for selective processing (#103) * adds query param to process * add query param for processing * simplify * add tags * Feat: implement frontend leaderboard (#93) * feat: implement frontend leaderboard * feat: implement a leaderboard in frontend * feat: implemented leaderboard * fix: rebuild implement leaderboard * fix: prettier * fix: prettier * fix: reimplement frontend leaderboard * fix: implement frontend leaderboard * approval rate * sets approval rate and hides curator --------- Co-authored-by: Elliot Braem <elliot@ejlbraem.com> * remove tailwind-scrollbar * added bob to desci feed * Get basic working * set .env.example * nitpicks --------- Co-authored-by: Elliot Braem <elliot@ejlbraem.com> Co-authored-by: codingshot <45281667+codingshot@users.noreply.github.com> Co-authored-by: Elliot Braem <elliot@everything.dev> Co-authored-by: Louis <112561517+louisdevzz@users.noreply.github.com> * fix polyfills * Explore Page (#108) * Explore Page - commit-1 * Explore Page - commit-2 * explore page - commit-3 * explore page - commit - 4 * explore page - commit - prettier * explore page responsiveness + code Rabbit Comments * code Rabbit Comments resolved * css updates * css changes 2 * header update + mobile responsive * conflicts resolved * Rebase and changes * Fix fmt * Header + Explore Page Style (#113) * Explore Page - commit-1 * Explore Page - commit-2 * explore page - commit-3 * explore page - commit - 4 * explore page - commit - prettier * explore page responsiveness + code Rabbit Comments * code Rabbit Comments resolved * css updates * css changes 2 * header update + mobile responsive * conflicts resolved * Rebase and changes * Fix fmt * Header Updates + Web3Auth getUserInfo + Explore Page changes * fmt * coderabbit comments resolved * Profile page (#120) * Update the FE to have the profile page (header and tabs init) * Move tabs to it's own component * Add stats and top badges to overview * Finish the overview tab * Update overview page and init content page * feat(profile-page): add Content and My Feed tags * feat(profile-page): finish profile page static UI * refactor: fmt * [FEATURE] Create Feed Page - DRAFT (#121) * Curate Engine Step 1 * content-progress-configuration step-1 * Curation Settings Part 2 and 3 * CodeRabbit Comments Resolved + Mobile Responsive * Responsiveness: empty State, JSON check --------- Co-authored-by: Elliot Braem <elliot@everything.dev> * update to main * fmt * Feat/submissions page (#127) * Submissions Page + Feed Page + Mobile Responsiveness * fixes * craete-feed authenticated user condition * fmt * remove sqlite --------- Co-authored-by: Elliot Braem <elliot@ejlbraem.com> * Feed Page Tabs (#130) * set tanstack routes (#132) * [Task]: Add connect button to feed page (#131) * feat: Add connect button to feed page * fix: recommit * added back to stablecoins feed since stablewatch forked their own * fix packages, update pg, and ignore cloudflare sockets * fmt --------- Co-authored-by: ethnclark <ethanclark1310@gmail.com> Co-authored-by: codingshot <45281667+codingshot@users.noreply.github.com> Co-authored-by: Elliot Braem <elliot@ejlbraem.com> * uses prod data * Update changes to latest staging * Revert "Update changes to latest staging" This reverts commit cd12908. * Fix Sort By Oldest (#136) * fix: Sort By Oldest * fix: Sort By Oldest * fix: Fix RecentSubmissions Sort Order Update * fix: All feed should be hidden, remove double title --------- Co-authored-by: vohuunhan1310@gmail.com <ethanclark1310@gmail.com> * UI fixes (#138) * UI fixes * fmt --------- Co-authored-by: Elliot Braem <elliot@everything.dev> * Fix: Leaderboard improvements (#140) * fix: Leaderboard improvements * fix: fmt * reorganize * remove unused * rename * clean up * fmt --------- Co-authored-by: Elliot Braem <elliot@ejlbraem.com> * clean up * wallet wip * todo * auth flow, wip * types clean up * fix types * login modal wip * modals * controller, service, successful create account * clean with data, metadata, and pattern, validation, and json schema * add migration doc * add activity and delete user * fix migration * add seed remote method * fix naming * fix script call * file extension * remove build schema * proper build time * fix Dockerfile * rsbuild * Standard Header Component + Responsivenss Fixes (#146) * Standard Header Component + Responsivenss Fixes * fmt * rename Hero --------- Co-authored-by: Elliot Braem <elliot@ejlbraem.com> * fix broken link * don't distribute on staging * fix path * env log * comment out * railway env * fix: Profile adjustments (#153) * fix: Leaderboard improvements * fix: fmt * fix: Profile adjustments * fix: resolve conversation * Login Modal Fixes (#154) * Login Modal Fixes * Resolve Comments * container * container fixes --------- Co-authored-by: Elliot Braem <elliot@everything.dev> * organize * fmt * update feeds (#156) * Leaderboard width fixes * feat: save profile image to pinata (#158) * feat(fe): save profile image to pinata * fix: fix comment * Feat Integrate NEAR Solana, Ethereum wallet selection (#159) * fix: Leaderboard improvements * fix: fmt * fix: Profile adjustments * fix: resolve conversation * feat: Integrate NEAR wallet selection * fix: run fmt * fix: add function create accesstokenpayload use wallet selector near * fix: resolve conversation * Feed Submission + Feed Review Page (#160) * Feed Review Page and Feed Creation * fmt * coderabbit comments resolved * comments resolved * comments resolved * reset routeTree * minor fixes (#164) * minor fixes * fmt * remove node-compile-cache * reuse user menu * header clean up * remove how it works * clean up * set submissions at root route * fmt * clean * create is coming soon * clean up * user link * Adds caddyfile and frontend clean up (#165) * removes serve static from backend * fmt * fix build * adds caddyfile * clean up submission feed * pnpm lock * fix turbo * fix build * db migration * without time zone * cleans up submission list * Adds shared-db, types package, initial migration (#166) * init * upgrade tsconfigs * shared-db build * shared-db wip * transfer getAllSubmissions * hooked up * moves to shared-db * fmt * update dockerfile * monorepo * working build * migration service * turbo * install pnpm * temp proxy * no include request headers * clean up * proper path * renaming * fmt * update caddyfile * different strategy * use route * fix BACKEND to API * ignore temp * temp remove * back to orig * turn on auto https * disable * route block * clean up * configure host * favicon * add staging domain * http: * set domain adn host * correct bash * matching host * Adds edit feed and image upload (#168) * adds page * image upload and edit feed * update pnpm lock * CSR * vercel json * move * temp disable auth * set image * fix query * submisison service running * Migrates submission service, is running (#169) * init * wip * clean up * feed list clean up * break up functions * fix config path * adds plugins route and integrates with plugin service * remote curate.config.json * plugins table * adds plugin pages * set type * fix feed types * plguin errors * env injection * fix queries * fix migration * fix migration * fix migration * redo migration * decouples moderation * fix status * fix feeds * hide moderation actions * adds overwrite script * migrate timestamps * better date handling --------- Co-authored-by: Zeeshan Ahmad <itexpert120@outlook.com> Co-authored-by: codingshot <45281667+codingshot@users.noreply.github.com> Co-authored-by: Louis <112561517+louisdevzz@users.noreply.github.com> Co-authored-by: Muhammad Saad Iqbal <saadiqbal.dev@outlook.com> Co-authored-by: ethnclark <ethanclark1310@gmail.com> Co-authored-by: dungpt82 <69756171+dungpt99@users.noreply.github.com>
* Get basic working (#109) * Get basic working * adds rss feeds * added stablewatch founder and stablecoin intern from messaria as approvers on stablecoins feed * fixes to config for grants, sui, and telegram channels (#102) * add query param for selective processing (#103) * adds query param to process * add query param for processing * simplify * add tags * Feat: implement frontend leaderboard (#93) * feat: implement frontend leaderboard * feat: implement a leaderboard in frontend * feat: implemented leaderboard * fix: rebuild implement leaderboard * fix: prettier * fix: prettier * fix: reimplement frontend leaderboard * fix: implement frontend leaderboard * approval rate * sets approval rate and hides curator --------- Co-authored-by: Elliot Braem <elliot@ejlbraem.com> * remove tailwind-scrollbar * added bob to desci feed * Get basic working * set .env.example * nitpicks --------- Co-authored-by: Elliot Braem <elliot@ejlbraem.com> Co-authored-by: codingshot <45281667+codingshot@users.noreply.github.com> Co-authored-by: Elliot Braem <elliot@everything.dev> Co-authored-by: Louis <112561517+louisdevzz@users.noreply.github.com> * fix polyfills * Explore Page (#108) * Explore Page - commit-1 * Explore Page - commit-2 * explore page - commit-3 * explore page - commit - 4 * explore page - commit - prettier * explore page responsiveness + code Rabbit Comments * code Rabbit Comments resolved * css updates * css changes 2 * header update + mobile responsive * conflicts resolved * Rebase and changes * Fix fmt * Header + Explore Page Style (#113) * Explore Page - commit-1 * Explore Page - commit-2 * explore page - commit-3 * explore page - commit - 4 * explore page - commit - prettier * explore page responsiveness + code Rabbit Comments * code Rabbit Comments resolved * css updates * css changes 2 * header update + mobile responsive * conflicts resolved * Rebase and changes * Fix fmt * Header Updates + Web3Auth getUserInfo + Explore Page changes * fmt * coderabbit comments resolved * Profile page (#120) * Update the FE to have the profile page (header and tabs init) * Move tabs to it's own component * Add stats and top badges to overview * Finish the overview tab * Update overview page and init content page * feat(profile-page): add Content and My Feed tags * feat(profile-page): finish profile page static UI * refactor: fmt * [FEATURE] Create Feed Page - DRAFT (#121) * Curate Engine Step 1 * content-progress-configuration step-1 * Curation Settings Part 2 and 3 * CodeRabbit Comments Resolved + Mobile Responsive * Responsiveness: empty State, JSON check --------- Co-authored-by: Elliot Braem <elliot@everything.dev> * update to main * fmt * Feat/submissions page (#127) * Submissions Page + Feed Page + Mobile Responsiveness * fixes * craete-feed authenticated user condition * fmt * remove sqlite --------- Co-authored-by: Elliot Braem <elliot@ejlbraem.com> * Feed Page Tabs (#130) * set tanstack routes (#132) * [Task]: Add connect button to feed page (#131) * feat: Add connect button to feed page * fix: recommit * added back to stablecoins feed since stablewatch forked their own * fix packages, update pg, and ignore cloudflare sockets * fmt --------- Co-authored-by: ethnclark <ethanclark1310@gmail.com> Co-authored-by: codingshot <45281667+codingshot@users.noreply.github.com> Co-authored-by: Elliot Braem <elliot@ejlbraem.com> * uses prod data * Update changes to latest staging * Revert "Update changes to latest staging" This reverts commit cd12908. * Fix Sort By Oldest (#136) * fix: Sort By Oldest * fix: Sort By Oldest * fix: Fix RecentSubmissions Sort Order Update * fix: All feed should be hidden, remove double title --------- Co-authored-by: vohuunhan1310@gmail.com <ethanclark1310@gmail.com> * UI fixes (#138) * UI fixes * fmt --------- Co-authored-by: Elliot Braem <elliot@everything.dev> * Fix: Leaderboard improvements (#140) * fix: Leaderboard improvements * fix: fmt * reorganize * remove unused * rename * clean up * fmt --------- Co-authored-by: Elliot Braem <elliot@ejlbraem.com> * clean up * wallet wip * todo * auth flow, wip * types clean up * fix types * login modal wip * modals * controller, service, successful create account * clean with data, metadata, and pattern, validation, and json schema * add migration doc * add activity and delete user * fix migration * add seed remote method * fix naming * fix script call * file extension * remove build schema * proper build time * fix Dockerfile * rsbuild * Standard Header Component + Responsivenss Fixes (#146) * Standard Header Component + Responsivenss Fixes * fmt * rename Hero --------- Co-authored-by: Elliot Braem <elliot@ejlbraem.com> * fix broken link * don't distribute on staging * fix path * env log * comment out * railway env * fix: Profile adjustments (#153) * fix: Leaderboard improvements * fix: fmt * fix: Profile adjustments * fix: resolve conversation * Login Modal Fixes (#154) * Login Modal Fixes * Resolve Comments * container * container fixes --------- Co-authored-by: Elliot Braem <elliot@everything.dev> * organize * fmt * update feeds (#156) * Leaderboard width fixes * feat: save profile image to pinata (#158) * feat(fe): save profile image to pinata * fix: fix comment * Feat Integrate NEAR Solana, Ethereum wallet selection (#159) * fix: Leaderboard improvements * fix: fmt * fix: Profile adjustments * fix: resolve conversation * feat: Integrate NEAR wallet selection * fix: run fmt * fix: add function create accesstokenpayload use wallet selector near * fix: resolve conversation * Feed Submission + Feed Review Page (#160) * Feed Review Page and Feed Creation * fmt * coderabbit comments resolved * comments resolved * comments resolved * reset routeTree * minor fixes (#164) * minor fixes * fmt * remove node-compile-cache * reuse user menu * header clean up * remove how it works * clean up * set submissions at root route * fmt * clean * create is coming soon * clean up * user link * Adds caddyfile and frontend clean up (#165) * removes serve static from backend * fmt * fix build * adds caddyfile * clean up submission feed * pnpm lock * fix turbo * fix build * db migration * without time zone * cleans up submission list * Adds shared-db, types package, initial migration (#166) * init * upgrade tsconfigs * shared-db build * shared-db wip * transfer getAllSubmissions * hooked up * moves to shared-db * fmt * update dockerfile * monorepo * working build * migration service * turbo * install pnpm * temp proxy * no include request headers * clean up * proper path * renaming * fmt * update caddyfile * different strategy * use route * fix BACKEND to API * ignore temp * temp remove * back to orig * turn on auto https * disable * route block * clean up * configure host * favicon * add staging domain * http: * set domain adn host * correct bash * matching host * Adds edit feed and image upload (#168) * adds page * image upload and edit feed * update pnpm lock * CSR * vercel json * move * temp disable auth * set image * fix query * submisison service running * Migrates submission service, is running (#169) * init * wip * clean up * feed list clean up * break up functions * fix config path * adds plugins route and integrates with plugin service * remote curate.config.json * plugins table * adds plugin pages * set type * fix feed types * plguin errors * env injection * fix queries * fix migration * fix migration * fix migration * redo migration * decouples moderation * fix status * fix feeds * hide moderation actions * adds overwrite script * migrate timestamps * better date handling * fix --------- Co-authored-by: Zeeshan Ahmad <itexpert120@outlook.com> Co-authored-by: codingshot <45281667+codingshot@users.noreply.github.com> Co-authored-by: Louis <112561517+louisdevzz@users.noreply.github.com> Co-authored-by: Muhammad Saad Iqbal <saadiqbal.dev@outlook.com> Co-authored-by: ethnclark <ethanclark1310@gmail.com> Co-authored-by: dungpt82 <69756171+dungpt99@users.noreply.github.com>
* Get basic working (#109) * Get basic working * adds rss feeds * added stablewatch founder and stablecoin intern from messaria as approvers on stablecoins feed * fixes to config for grants, sui, and telegram channels (#102) * add query param for selective processing (#103) * adds query param to process * add query param for processing * simplify * add tags * Feat: implement frontend leaderboard (#93) * feat: implement frontend leaderboard * feat: implement a leaderboard in frontend * feat: implemented leaderboard * fix: rebuild implement leaderboard * fix: prettier * fix: prettier * fix: reimplement frontend leaderboard * fix: implement frontend leaderboard * approval rate * sets approval rate and hides curator --------- Co-authored-by: Elliot Braem <elliot@ejlbraem.com> * remove tailwind-scrollbar * added bob to desci feed * Get basic working * set .env.example * nitpicks --------- Co-authored-by: Elliot Braem <elliot@ejlbraem.com> Co-authored-by: codingshot <45281667+codingshot@users.noreply.github.com> Co-authored-by: Elliot Braem <elliot@everything.dev> Co-authored-by: Louis <112561517+louisdevzz@users.noreply.github.com> * fix polyfills * Explore Page (#108) * Explore Page - commit-1 * Explore Page - commit-2 * explore page - commit-3 * explore page - commit - 4 * explore page - commit - prettier * explore page responsiveness + code Rabbit Comments * code Rabbit Comments resolved * css updates * css changes 2 * header update + mobile responsive * conflicts resolved * Rebase and changes * Fix fmt * Header + Explore Page Style (#113) * Explore Page - commit-1 * Explore Page - commit-2 * explore page - commit-3 * explore page - commit - 4 * explore page - commit - prettier * explore page responsiveness + code Rabbit Comments * code Rabbit Comments resolved * css updates * css changes 2 * header update + mobile responsive * conflicts resolved * Rebase and changes * Fix fmt * Header Updates + Web3Auth getUserInfo + Explore Page changes * fmt * coderabbit comments resolved * Profile page (#120) * Update the FE to have the profile page (header and tabs init) * Move tabs to it's own component * Add stats and top badges to overview * Finish the overview tab * Update overview page and init content page * feat(profile-page): add Content and My Feed tags * feat(profile-page): finish profile page static UI * refactor: fmt * [FEATURE] Create Feed Page - DRAFT (#121) * Curate Engine Step 1 * content-progress-configuration step-1 * Curation Settings Part 2 and 3 * CodeRabbit Comments Resolved + Mobile Responsive * Responsiveness: empty State, JSON check --------- Co-authored-by: Elliot Braem <elliot@everything.dev> * update to main * fmt * Feat/submissions page (#127) * Submissions Page + Feed Page + Mobile Responsiveness * fixes * craete-feed authenticated user condition * fmt * remove sqlite --------- Co-authored-by: Elliot Braem <elliot@ejlbraem.com> * Feed Page Tabs (#130) * set tanstack routes (#132) * [Task]: Add connect button to feed page (#131) * feat: Add connect button to feed page * fix: recommit * added back to stablecoins feed since stablewatch forked their own * fix packages, update pg, and ignore cloudflare sockets * fmt --------- Co-authored-by: ethnclark <ethanclark1310@gmail.com> Co-authored-by: codingshot <45281667+codingshot@users.noreply.github.com> Co-authored-by: Elliot Braem <elliot@ejlbraem.com> * uses prod data * Update changes to latest staging * Revert "Update changes to latest staging" This reverts commit cd12908. * Fix Sort By Oldest (#136) * fix: Sort By Oldest * fix: Sort By Oldest * fix: Fix RecentSubmissions Sort Order Update * fix: All feed should be hidden, remove double title --------- Co-authored-by: vohuunhan1310@gmail.com <ethanclark1310@gmail.com> * UI fixes (#138) * UI fixes * fmt --------- Co-authored-by: Elliot Braem <elliot@everything.dev> * Fix: Leaderboard improvements (#140) * fix: Leaderboard improvements * fix: fmt * reorganize * remove unused * rename * clean up * fmt --------- Co-authored-by: Elliot Braem <elliot@ejlbraem.com> * clean up * wallet wip * todo * auth flow, wip * types clean up * fix types * login modal wip * modals * controller, service, successful create account * clean with data, metadata, and pattern, validation, and json schema * add migration doc * add activity and delete user * fix migration * add seed remote method * fix naming * fix script call * file extension * remove build schema * proper build time * fix Dockerfile * rsbuild * Standard Header Component + Responsivenss Fixes (#146) * Standard Header Component + Responsivenss Fixes * fmt * rename Hero --------- Co-authored-by: Elliot Braem <elliot@ejlbraem.com> * fix broken link * don't distribute on staging * fix path * env log * comment out * railway env * fix: Profile adjustments (#153) * fix: Leaderboard improvements * fix: fmt * fix: Profile adjustments * fix: resolve conversation * Login Modal Fixes (#154) * Login Modal Fixes * Resolve Comments * container * container fixes --------- Co-authored-by: Elliot Braem <elliot@everything.dev> * organize * fmt * update feeds (#156) * Leaderboard width fixes * feat: save profile image to pinata (#158) * feat(fe): save profile image to pinata * fix: fix comment * Feat Integrate NEAR Solana, Ethereum wallet selection (#159) * fix: Leaderboard improvements * fix: fmt * fix: Profile adjustments * fix: resolve conversation * feat: Integrate NEAR wallet selection * fix: run fmt * fix: add function create accesstokenpayload use wallet selector near * fix: resolve conversation * Feed Submission + Feed Review Page (#160) * Feed Review Page and Feed Creation * fmt * coderabbit comments resolved * comments resolved * comments resolved * reset routeTree * minor fixes (#164) * minor fixes * fmt * remove node-compile-cache * reuse user menu * header clean up * remove how it works * clean up * set submissions at root route * fmt * clean * create is coming soon * clean up * user link * Adds caddyfile and frontend clean up (#165) * removes serve static from backend * fmt * fix build * adds caddyfile * clean up submission feed * pnpm lock * fix turbo * fix build * db migration * without time zone * cleans up submission list * Adds shared-db, types package, initial migration (#166) * init * upgrade tsconfigs * shared-db build * shared-db wip * transfer getAllSubmissions * hooked up * moves to shared-db * fmt * update dockerfile * monorepo * working build * migration service * turbo * install pnpm * temp proxy * no include request headers * clean up * proper path * renaming * fmt * update caddyfile * different strategy * use route * fix BACKEND to API * ignore temp * temp remove * back to orig * turn on auto https * disable * route block * clean up * configure host * favicon * add staging domain * http: * set domain adn host * correct bash * matching host * Adds edit feed and image upload (#168) * adds page * image upload and edit feed * update pnpm lock * CSR * vercel json * move * temp disable auth * set image * fix query * submisison service running * Migrates submission service, is running (#169) * init * wip * clean up * feed list clean up * break up functions * fix config path * adds plugins route and integrates with plugin service * remote curate.config.json * plugins table * adds plugin pages * set type * fix feed types * plguin errors * env injection * fix queries * fix migration * fix migration * fix migration * redo migration * decouples moderation * fix status * fix feeds * hide moderation actions * adds overwrite script * migrate timestamps * better date handling * fix * Adds auth (#174) * adds fastintear auth, init * auth flow * fmt * adds fastintear auth, init * auth flow * fmt * frontend auth * auth middleware * feed protection * fmt * moderation wip * update lock * migration * moderation actions * hide moderation actions * hack * fix flow * enable hosted service * adds user identities and connect platform * create profile * ensureUserExists * set network for staging * near account id * auth provider id not null * init near * fix monorepo build * fmt * user clean up * update moderation * switch to crosspost connected * fix user id and error * server side * moderation hooks * cleaner logs * Update apps/api/src/services/moderation.service.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update apps/app/src/lib/near.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update apps/app/src/lib/near.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * adds feature flags and moderation service clean up --------- Co-authored-by: Zeeshan Ahmad <itexpert120@outlook.com> Co-authored-by: codingshot <45281667+codingshot@users.noreply.github.com> Co-authored-by: Louis <112561517+louisdevzz@users.noreply.github.com> Co-authored-by: Muhammad Saad Iqbal <saadiqbal.dev@outlook.com> Co-authored-by: ethnclark <ethanclark1310@gmail.com> Co-authored-by: dungpt82 <69756171+dungpt99@users.noreply.github.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Resolves: #117
Summary by CodeRabbit