1
0
mirror of https://github.com/XFox111/TabsAsideExtension.git synced 2026-04-22 07:58:01 +03:00

!feat: major 3.0 release candidate

This commit is contained in:
2025-05-03 23:59:43 +03:00
parent dbc8c7fd4d
commit 39793a38c3
143 changed files with 14277 additions and 0 deletions
@@ -0,0 +1,14 @@
import { CollectionItem } from "@/models/CollectionModels";
import { createContext } from "react";
const CollectionContext = createContext<CollectionContextType>(null!);
export default CollectionContext;
export type CollectionContextType =
{
collection: CollectionItem;
collectionIndex: number;
tabCount: number;
hasPinnedGroup: boolean;
};
@@ -0,0 +1,115 @@
import { CloudStorageIssueType, getCollections, graphics as graphicsStorage, saveCollections } from "@/features/collectionStorage";
import useSettings from "@/hooks/useSettings";
import { CollectionItem, GraphicsStorage, GroupItem } from "@/models/CollectionModels";
import getLogger from "@/utils/getLogger";
import { onMessage } from "@/utils/messaging";
import { createContext } from "react";
import mergePinnedGroups from "../utils/mergePinnedGroups";
const logger = getLogger("CollectionsProvider");
const CollectionsContext = createContext<CollectionsContextType>(null!);
export const useCollections = () => useContext<CollectionsContextType>(CollectionsContext);
export default function CollectionsProvider({ children }: React.PropsWithChildren): React.ReactElement
{
const [collections, setCollections] = useState<CollectionItem[]>(null!);
const [cloudIssue, setCloudIssue] = useState<CloudStorageIssueType | null>(null);
const [graphics, setGraphics] = useState<GraphicsStorage>({});
const [tilesView] = useSettings("tilesView");
useEffect(() =>
{
refreshCollections();
onMessage("refreshCollections", refreshCollections);
}, []);
const refreshCollections = async (): Promise<void> =>
{
const [result, issues] = await getCollections();
setCloudIssue(issues);
setCollections(result);
setGraphics(await graphicsStorage.getValue());
};
const updateStorage = async (collectionList: CollectionItem[]): Promise<void> =>
{
logger("save");
collectionList.forEach(mergePinnedGroups);
setCollections([...collectionList]);
await saveCollections(collectionList, cloudIssue === null);
setGraphics(await graphicsStorage.getValue());
};
const addCollection = (collection: CollectionItem): void =>
{
updateStorage([collection, ...collections]);
};
const removeItem = (...indices: number[]): void =>
{
if (indices.length > 2)
(collections[indices[0]].items[indices[1]] as GroupItem).items.splice(indices[2], 1);
else if (indices.length > 1)
collections[indices[0]].items.splice(indices[1], 1);
else
collections.splice(indices[0], 1);
updateStorage(collections);
};
const updateCollections = (collectionList: CollectionItem[]): void =>
{
updateStorage(collectionList);
};
const updateCollection = (collection: CollectionItem, index: number): void =>
{
collections[index] = collection;
updateStorage(collections);
};
const updateGroup = (group: GroupItem, collectionIndex: number, groupIndex: number): void =>
{
collections[collectionIndex].items[groupIndex] = group;
updateStorage(collections);
};
const ungroup = (collectionIndex: number, groupIndex: number): void =>
{
const group = collections[collectionIndex].items[groupIndex] as GroupItem;
collections[collectionIndex].items.splice(groupIndex, 1, ...group.items);
updateStorage(collections);
};
return (
<CollectionsContext.Provider
value={ {
collections, cloudIssue, graphics, tilesView: tilesView!,
refreshCollections, removeItem, ungroup,
updateCollections, updateCollection, updateGroup, addCollection
} }
>
{ children }
</CollectionsContext.Provider>
);
}
export type CollectionsContextType =
{
collections: CollectionItem[] | null;
cloudIssue: CloudStorageIssueType | null;
graphics: GraphicsStorage;
tilesView: boolean;
refreshCollections: () => Promise<void>;
addCollection: (collection: CollectionItem) => void;
updateCollections: (collections: CollectionItem[]) => void;
updateCollection: (collection: CollectionItem, index: number) => void;
updateGroup: (group: GroupItem, collectionIndex: number, groupIndex: number) => void;
ungroup: (collectionIndex: number, groupIndex: number) => void;
removeItem: (...indices: number[]) => void;
};
@@ -0,0 +1,12 @@
import { GroupItem } from "@/models/CollectionModels";
import { createContext } from "react";
const GroupContext = createContext<GroupContextType>(null!);
export default GroupContext;
export type GroupContextType =
{
group: GroupItem;
indices: number[];
};