@vygruppen/spor-react 9.10.1 → 9.11.1

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.
@@ -0,0 +1,58 @@
1
+ // PrideContext.tsx
2
+ import React, { createContext, useContext, useEffect, useState } from "react";
3
+
4
+ interface PrideContextProps {
5
+ isPride: boolean;
6
+ togglePride: () => void;
7
+ }
8
+
9
+ const PrideContext = createContext<PrideContextProps | undefined>(undefined);
10
+
11
+ export const PrideProvider: React.FC<React.PropsWithChildren<{}>> = ({
12
+ children,
13
+ }) => {
14
+ const isBrowser = typeof window !== "undefined";
15
+
16
+ const key = "spor__isPride";
17
+
18
+ const [isPride, setIsPride] = useState<boolean>(() => {
19
+ if (isBrowser) {
20
+ const savedState = localStorage.getItem(key);
21
+ return savedState ? JSON.parse(savedState) : true;
22
+ }
23
+ return true;
24
+ });
25
+
26
+ const togglePride = () => {
27
+ setIsPride((prev) => {
28
+ const newState = !prev;
29
+ if (isBrowser) {
30
+ localStorage.setItem(key, JSON.stringify(newState));
31
+ }
32
+ return newState;
33
+ });
34
+ };
35
+
36
+ useEffect(() => {
37
+ if (isBrowser) {
38
+ const savedState = localStorage.getItem(key);
39
+ if (savedState) {
40
+ setIsPride(JSON.parse(savedState));
41
+ }
42
+ }
43
+ }, [isBrowser]);
44
+
45
+ return (
46
+ <PrideContext.Provider value={{ isPride, togglePride }}>
47
+ {children}
48
+ </PrideContext.Provider>
49
+ );
50
+ };
51
+
52
+ export const usePride = (): PrideContextProps => {
53
+ const context = useContext(PrideContext);
54
+ if (context === undefined) {
55
+ throw new Error("usePride must be used within a PrideProvider");
56
+ }
57
+ return context;
58
+ };
@@ -0,0 +1,23 @@
1
+ // TogglePride.tsx
2
+ import React from "react";
3
+ import { usePride } from "./PrideProvider";
4
+ import { FormControl, FormLabel, Switch } from "../input";
5
+
6
+ type TogglePrideProps = {
7
+ label: string;
8
+ };
9
+
10
+ export const TogglePride = ({ label }: TogglePrideProps) => {
11
+ const { isPride, togglePride } = usePride();
12
+
13
+ return (
14
+ <FormControl display="flex" alignItems="center" gap={3}>
15
+ <FormLabel margin="0">{label}</FormLabel>
16
+ <Switch
17
+ size="sm"
18
+ onChange={() => togglePride()}
19
+ defaultChecked={isPride}
20
+ />
21
+ </FormControl>
22
+ );
23
+ };
@@ -0,0 +1,2 @@
1
+ export * from "./PrideProvider";
2
+ export * from "./TogglePride";
@@ -4,6 +4,7 @@ import deepmerge from "deepmerge";
4
4
  import React from "react";
5
5
  import { Language, LanguageProvider } from "..";
6
6
  import { Brand, brandTheme, theme as defaultSporTheme, fontFaces } from "../";
7
+ import { PrideProvider } from "../pride/PrideProvider";
7
8
 
8
9
  type SporProviderProps = ChakraProviderProps & {
9
10
  language?: Language;
@@ -59,10 +60,12 @@ export const SporProvider = ({
59
60
 
60
61
  return (
61
62
  <LanguageProvider language={language}>
62
- <ChakraProvider theme={extendedTheme} {...props}>
63
- <Global styles={fontFaces} />
64
- {children}
65
- </ChakraProvider>
63
+ <PrideProvider>
64
+ <ChakraProvider theme={extendedTheme} {...props}>
65
+ <Global styles={fontFaces} />
66
+ {children}
67
+ </ChakraProvider>
68
+ </PrideProvider>
66
69
  </LanguageProvider>
67
70
  );
68
71
  };
@@ -1 +1,2 @@
1
1
  export * from "./SporProvider";
2
+ export * from "../pride/PrideProvider";
package/types.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ declare module "@vygruppen/spor-loader";
2
+ declare module "@vygruppen/spor-design-tokens";
3
+ declare module "@vygruppen/spor-icon-react";