refactor(column): use context for manage column

This commit is contained in:
2023-12-29 13:12:37 +07:00
parent e1edba8a78
commit be333260f2
13 changed files with 125 additions and 176 deletions

View File

@@ -9,7 +9,7 @@ import {
import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
import { useQueryClient } from "@tanstack/react-query";
import { ReactNode } from "react";
import { useWidget } from "../../hooks/useWidget";
import { useColumnContext } from "./provider";
export function ColumnHeader({
id,
@@ -23,22 +23,22 @@ export function ColumnHeader({
icon?: ReactNode;
}) {
const queryClient = useQueryClient();
const { removeWidget } = useWidget();
const { removeColumn } = useColumnContext();
const refresh = async () => {
if (queryKey) await queryClient.refetchQueries({ queryKey });
};
const moveLeft = async () => {
removeWidget.mutate(id);
removeColumn(id);
};
const moveRight = async () => {
removeWidget.mutate(id);
removeColumn(id);
};
const deleteWidget = async () => {
removeWidget.mutate(id);
removeColumn(id);
};
return (

View File

@@ -11,3 +11,5 @@ export const Column = {
Content: ColumnContent,
Route: Route,
};
export * from "./provider";

View File

@@ -0,0 +1,81 @@
import { IColumn } from "@lume/types";
import { WIDGET_KIND } from "@lume/utils";
import { NDKEvent } from "@nostr-dev-kit/ndk";
import {
ReactNode,
createContext,
useCallback,
useContext,
useEffect,
useState,
} from "react";
import { useStorage } from "../../provider";
type ColumnContext = {
columns: IColumn[];
addColumn: (column: IColumn) => void;
removeColumn: (id: string) => void;
loadAllColumns: () => void;
};
const ColumnContext = createContext<ColumnContext>(null);
export function ColumnProvider({ children }: { children: ReactNode }) {
const storage = useStorage();
const [columns, setColumns] = useState<IColumn[]>([
{
id: "9999",
title: "Newsfeed",
content: "",
kind: WIDGET_KIND.newsfeed,
},
]);
const loadAllColumns = useCallback(async () => {
return await storage.getWidgets();
}, []);
const addColumn = useCallback(async (column: IColumn) => {
const result = await storage.createWidget(
column.kind,
column.title,
column.content,
);
if (result) setColumns((prev) => [...prev, column]);
}, []);
const removeColumn = useCallback(async (id: string) => {
await storage.removeWidget(id);
setColumns((prev) => prev.filter((t) => t.id !== id));
}, []);
useEffect(() => {
let isMounted = true;
loadAllColumns().then((data) => {
if (isMounted) setColumns((prev) => [...prev, ...data]);
});
return () => {
isMounted = false;
};
}, []);
return (
<ColumnContext.Provider
value={{ columns, addColumn, removeColumn, loadAllColumns }}
>
{children}
</ColumnContext.Provider>
);
}
export function useColumnContext() {
const context = useContext(ColumnContext);
if (!context) {
throw new Error(
"Please import Column Provider to use useColumnContext() hook",
);
}
return context;
}

View File

@@ -2,11 +2,11 @@ import { PinIcon } from "@lume/icons";
import { WIDGET_KIND } from "@lume/utils";
import * as Tooltip from "@radix-ui/react-tooltip";
import { useNoteContext } from "..";
import { useWidget } from "../../../hooks/useWidget";
import { useColumnContext } from "../../column";
export function NotePin() {
const event = useNoteContext();
const { addWidget } = useWidget();
const { addColumn } = useColumnContext();
return (
<Tooltip.Provider>
@@ -15,7 +15,7 @@ export function NotePin() {
<button
type="button"
onClick={() =>
addWidget.mutate({
addColumn({
kind: WIDGET_KIND.thread,
title: "Thread",
content: event.id,

View File

@@ -1,14 +1,14 @@
import { WIDGET_KIND } from "@lume/utils";
import { useWidget } from "../../../hooks/useWidget";
import { useColumnContext } from "../../column";
export function Hashtag({ tag }: { tag: string }) {
const { addWidget } = useWidget();
const { addColumn } = useColumnContext();
return (
<button
type="button"
onClick={() =>
addWidget.mutate({
addColumn({
kind: WIDGET_KIND.hashtag,
title: tag,
content: tag.replace("#", ""),

View File

@@ -3,13 +3,13 @@ import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
import { memo } from "react";
import { Link } from "react-router-dom";
import { useProfile } from "../../../hooks/useProfile";
import { useWidget } from "../../../hooks/useWidget";
import { useColumnContext } from "../../column";
export const MentionUser = memo(function MentionUser({
pubkey,
}: { pubkey: string }) {
const { user } = useProfile(pubkey);
const { addWidget } = useWidget();
const { addColumn } = useColumnContext();
return (
<DropdownMenu.Root>
@@ -29,7 +29,7 @@ export const MentionUser = memo(function MentionUser({
<button
type="button"
onClick={() =>
addWidget.mutate({
addColumn({
kind: WIDGET_KIND.user,
title: user?.name || user?.displayName || "",
content: pubkey,