@c-rex/components 0.1.18 → 0.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@c-rex/components",
3
- "version": "0.1.18",
3
+ "version": "0.1.20",
4
4
  "files": [
5
5
  "src"
6
6
  ],
@@ -48,7 +48,7 @@ export const BookmarkButton: FC<{ markersList: Favorite[], trigger?: ReactNode }
48
48
  <FaRegBookmark className={cn("w-5", `text-${item.color}`)} />
49
49
  </TableCell>
50
50
  <TableCell>
51
- <Link href={`./${item.id}`}>
51
+ <Link href={`${window.location.origin}/topics/${item.id}`}>
52
52
  {item.label}
53
53
  </Link>
54
54
  </TableCell>
@@ -26,7 +26,7 @@ interface BreadcrumbProps {
26
26
  export const Breadcrumb: FC<BreadcrumbProps> = ({ items, loading, lang }) => {
27
27
  const t = useTranslations("breadcrumbs");
28
28
  const device = useBreakpoint();
29
- const isMobile = (device === DEVICE_OPTIONS.MOBILE || device === DEVICE_OPTIONS.TABLET);
29
+ const isMobile = device !== null && (device === DEVICE_OPTIONS.MOBILE || device === DEVICE_OPTIONS.TABLET);
30
30
 
31
31
  if (!items) return null
32
32
 
@@ -21,6 +21,8 @@ import { Flag } from "../flag";
21
21
  import { Button } from "@c-rex/ui/button";
22
22
  import { useLanguageStore } from "../stores/language-store";
23
23
  import { FileIcon } from "../file-icon";
24
+ import { BookmarkButton } from "../bookmark-button";
25
+ import { FaRegBookmark } from "react-icons/fa6";
24
26
 
25
27
  type Props = {
26
28
  title: string;
@@ -31,7 +33,7 @@ type Props = {
31
33
  }
32
34
 
33
35
 
34
- export const InfoTable: FC<Props> = ({ title, items, files, availableVersions }) => {
36
+ export const InfoTable: FC<Props> = ({ title, items, files, availableVersions, markersList }) => {
35
37
  const t = useTranslations();
36
38
  const uiLang = useLanguageStore(state => state.uiLang);
37
39
  const newItems = filteredItems(items)
@@ -39,8 +41,24 @@ export const InfoTable: FC<Props> = ({ title, items, files, availableVersions })
39
41
  return (
40
42
  <Card className="p-0 !pt-4">
41
43
  <CardHeader>
42
- <CardTitle className="text-lg flex justify-between">
44
+ <CardTitle className="text-lg flex justify-between items-end">
43
45
  {title}
46
+
47
+ {(markersList && markersList.length > 0) && (
48
+ <BookmarkButton
49
+ markersList={markersList.filter(item => item.label.length > 0)}
50
+ trigger={
51
+ <Button variant="outline" size="icon" className="relative">
52
+ <FaRegBookmark className="!w-5 color-primary" />
53
+ <span
54
+ className="absolute -top-[10px] -right-[10px] min-w-5 min-h-5 bg-primary text-white rounded-full"
55
+ >
56
+ {markersList.length}
57
+ </span>
58
+ </Button>
59
+ }
60
+ />
61
+ )}
44
62
  </CardTitle>
45
63
  </CardHeader>
46
64
  <CardContent className="space-y-3 !p-0">
@@ -14,7 +14,6 @@ import {
14
14
  } from "@c-rex/ui/sidebar";
15
15
  import { Skeleton } from "@c-rex/ui/skeleton";
16
16
  import { TreeOfContent } from "@c-rex/interfaces";
17
- import { useTranslations } from "next-intl";
18
17
  import { cn } from "@c-rex/utils";
19
18
 
20
19
  interface SidebarProps extends ComponentProps<typeof Sidebar> {
@@ -23,7 +22,6 @@ interface SidebarProps extends ComponentProps<typeof Sidebar> {
23
22
  }
24
23
 
25
24
  export function LeftSidebar({ data, loading, className, lang, ...props }: SidebarProps) {
26
- const t = useTranslations();
27
25
 
28
26
  const tableOfContentGroup = (): JSX.Element | null => {
29
27
  if (loading) {
@@ -2,13 +2,14 @@
2
2
 
3
3
  import { startTransition } from "react";
4
4
  import { SharedLanguageSwitch } from "./shared";
5
- import { BLOG_TYPE_AND_LINK, DOCUMENTS_TYPE_AND_LINK, TOPICS_TYPE_AND_LINK } from "@c-rex/constants";
5
+ import { BLOG_TYPE_AND_LINK, CONTENT_LANG_KEY, DOCUMENTS_TYPE_AND_LINK, TOPICS_TYPE_AND_LINK } from "@c-rex/constants";
6
6
  import { useQueryState } from "nuqs"
7
7
  import { useAppConfig } from "@c-rex/contexts/config-provider";
8
8
  import { useTranslations } from "next-intl";
9
9
  import { toast } from "sonner"
10
10
  import { useLanguageStore } from "../../stores/language-store";
11
11
  import { useSearchSettingsStore } from "../../stores/search-settings-store";
12
+ import { setCookie } from "@c-rex/utils/cookies";
12
13
 
13
14
  export const ContentLanguageSwitch = () => {
14
15
  const t = useTranslations();
@@ -41,6 +42,7 @@ export const ContentLanguageSwitch = () => {
41
42
  const changeContentLanguage = (locale: string) => {
42
43
  startTransition(() => {
43
44
  setContentLang(locale)
45
+ setCookie(CONTENT_LANG_KEY, locale);
44
46
  updatePreferences({ language: [locale] })
45
47
 
46
48
  if (queryLanguage != null) {
@@ -2,8 +2,9 @@
2
2
 
3
3
  import React, { FC, startTransition } from "react";
4
4
  import { SharedLanguageSwitch } from "./shared";
5
- import { UI_LANG_OPTIONS } from "@c-rex/constants";
6
- import { getCountryCodeByLang } from "@c-rex/utils";
5
+ import { UI_LANG_KEY, UI_LANG_OPTIONS } from "@c-rex/constants";
6
+ import { getCountryCodeByLang, } from "@c-rex/utils";
7
+ import { setCookie } from "@c-rex/utils/cookies";
7
8
  import { useLanguageStore } from "../../stores/language-store";
8
9
 
9
10
  export const UILanguageSwitch: FC = () => {
@@ -21,6 +22,7 @@ export const UILanguageSwitch: FC = () => {
21
22
  const setUILanguage = (locale: string) => {
22
23
  startTransition(() => {
23
24
  setUiLang(locale)
25
+ setCookie(UI_LANG_KEY, locale);
24
26
 
25
27
  window.location.reload()
26
28
  });
@@ -32,10 +32,10 @@ export function RightSidebar({
32
32
  const t = useTranslations();
33
33
  const favoritesDocuments = useFavoritesStore((state) => state.documents);
34
34
  const isFavoriteDocument = Object.keys(favoritesDocuments).some((docId) => docId === documentId);
35
- let topicList: Favorite[] = []
35
+ let favoritesList: Favorite[] = []
36
36
 
37
- if (isFavoriteDocument && favoritesDocuments[documentId]) {
38
- topicList = favoritesDocuments[documentId].topics
37
+ if (Object.keys(favoritesDocuments).some(docId => docId === documentId)) {
38
+ favoritesList = favoritesDocuments[documentId]?.topics || []
39
39
  }
40
40
 
41
41
  return (
@@ -50,7 +50,7 @@ export function RightSidebar({
50
50
  items={documentInfo}
51
51
  files={files}
52
52
  availableVersions={documentAvailableVersions}
53
- markersList={isFavoriteDocument ? topicList : []}
53
+ markersList={isFavoriteDocument ? favoritesList : []}
54
54
  />
55
55
  )}
56
56
 
@@ -44,8 +44,14 @@ export const useFavoritesStore = create<FavoritesStore>()(
44
44
  unfavoriteDocument: (id: string) =>
45
45
  set((state) => {
46
46
  const documentsCopy = { ...state.documents };
47
+ if (!documentsCopy[id]) {
48
+ return state;
49
+ }
50
+
51
+ const favoritesToRemove = documentsCopy[id]?.topics.map(topic => topic.id) || [];
52
+ const newFavorites = state.favorites.filter(fav => fav.id !== id && !favoritesToRemove.includes(fav.id));
47
53
  delete documentsCopy[id];
48
- return { documents: documentsCopy };
54
+ return { documents: documentsCopy, favorites: newFavorites };
49
55
  }),
50
56
  }), {
51
57
  name: "c-rex-favorites",
@@ -1,8 +1,4 @@
1
- import { UI_LANG_KEY } from "@c-rex/constants";
2
- import { AVAILABLE_CONTENT_LANG_KEY } from "@c-rex/constants";
3
- import { CONTENT_LANG_KEY } from "@c-rex/constants";
4
1
  import { LanguageAndCountries } from "@c-rex/interfaces";
5
- import { getCookieFromDocument, setCookie } from "@c-rex/utils";
6
2
  import { create } from "zustand";
7
3
 
8
4
  type LanguageStoreType = {
@@ -12,7 +8,6 @@ type LanguageStoreType = {
12
8
  setContentLang: (v: string) => void;
13
9
  setUiLang: (v: string) => void;
14
10
  setAvailableLanguages: (list: LanguageAndCountries[]) => void;
15
- hydrate: () => void;
16
11
  };
17
12
 
18
13
  export const useLanguageStore = create<LanguageStoreType>((set) => ({
@@ -21,28 +16,11 @@ export const useLanguageStore = create<LanguageStoreType>((set) => ({
21
16
  availableLanguages: [],
22
17
  setContentLang: (v) => {
23
18
  set({ contentLang: v });
24
- setCookie(CONTENT_LANG_KEY, v, 7);
25
19
  },
26
20
  setUiLang: (v) => {
27
21
  set({ uiLang: v });
28
- setCookie(UI_LANG_KEY, v, 7);
29
22
  },
30
23
  setAvailableLanguages: (list) => {
31
24
  set({ availableLanguages: list });
32
- setCookie(AVAILABLE_CONTENT_LANG_KEY, JSON.stringify(list), 7);
33
- },
34
- hydrate: () => {
35
- set({
36
- uiLang: getCookieFromDocument(UI_LANG_KEY),
37
- contentLang: getCookieFromDocument(CONTENT_LANG_KEY),
38
- availableLanguages: (() => {
39
- const raw = getCookieFromDocument(AVAILABLE_CONTENT_LANG_KEY);
40
- try {
41
- return raw ? JSON.parse(raw) : [];
42
- } catch {
43
- return [];
44
- }
45
- })(),
46
- });
47
25
  },
48
26
  }));