@myflags/react
Version:
React bindings for MyFlags feature flag management
1 lines • 9.72 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/Provider.tsx","../src/hooks/useIndexedDB.ts","../src/hooks/useFlag.ts","../src/components/FeatureFlag.tsx","../src/hooks/useFlags.ts"],"sourcesContent":["export { type Flag, type MyFlagsConfig } from \"@myflags/core\";\nexport { FeatureFlag } from \"./components/FeatureFlag\";\nexport { default as useFlags } from \"./hooks/useFlags\";\nexport { default as useFlag } from \"./hooks/useFlag\";\nexport { MyFlagsProvider } from \"./Provider\";\n","import React, { createContext, useContext, useEffect, useState } from \"react\";\nimport { Flag, MyFlagsConfig, MyFlagsSDK } from \"@myflags/core\";\nimport { useIndexedDB } from \"./hooks/useIndexedDB\";\n\ninterface MyFlagsProviderProps {\n config: MyFlagsConfig;\n children: React.ReactNode;\n}\n\nexport const MyFlagsContext = createContext<Flag | null>(null);\n\nexport function MyFlagsProvider(props: MyFlagsProviderProps): JSX.Element {\n const [flags, setFlags] = useIndexedDB<Flag>(\"flags\", {});\n const [client] = useState(() => new MyFlagsSDK(props.config));\n\n useEffect(() => {\n const unsubscribe = client.subscribe(setFlags);\n return () => unsubscribe();\n }, [client]);\n\n return (\n <MyFlagsContext.Provider value={flags}>\n {props.children}\n </MyFlagsContext.Provider>\n );\n}\n\nexport function useMyFlagsContext(): Flag {\n const context = useContext(MyFlagsContext);\n if (!context) throw new Error(\"MyFlagsContext not found\");\n\n return context;\n}\n","import { useState, useCallback, useEffect, useRef } from \"react\";\n\nconst DB_NAME = \"myflags\";\nconst DB_VERSION = 1;\nconst STORE_NAME = \"flags\";\n\nexport function useIndexedDB<T>(\n key: string,\n initialValue: T\n): [T, (value: T) => void] {\n const [storedValue, setStoredValue] = useState<T>(initialValue);\n const [isDbReady, setIsDbReady] = useState<boolean>(false);\n const pendingWrites = useRef<T[]>([]);\n\n const openDB = useCallback(() => {\n return new Promise<IDBDatabase>((resolve, reject) => {\n if (typeof window === \"undefined\" || !window.indexedDB) {\n reject(\"IndexedDB not supported\");\n return;\n }\n\n const request = window.indexedDB.open(DB_NAME, DB_VERSION);\n\n request.onerror = () => {\n reject(\"Error opening IndexedDB\");\n };\n\n request.onsuccess = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n resolve(db);\n };\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n db.createObjectStore(STORE_NAME, { keyPath: \"id\" });\n }\n };\n });\n }, []);\n\n // Function to get value from IndexedDB\n const getValueFromDB = useCallback(async () => {\n if (typeof window === \"undefined\" || !window.indexedDB) {\n return initialValue;\n }\n\n try {\n const db = await openDB();\n return new Promise<T>((resolve) => {\n const transaction = db.transaction(STORE_NAME, \"readonly\");\n const store = transaction.objectStore(STORE_NAME);\n const request = store.get(key);\n\n request.onerror = () => {\n resolve(initialValue);\n };\n\n request.onsuccess = () => {\n const result = request.result;\n db.close();\n if (result) {\n resolve(result.value);\n } else {\n resolve(initialValue);\n }\n };\n });\n } catch {\n return initialValue;\n }\n }, [key, initialValue, openDB]);\n\n // Function to set value in IndexedDB\n const setValueInDB = useCallback(\n async (valueToStore: T) => {\n if (typeof window === \"undefined\" || !window.indexedDB) {\n console.warn(\"[MyFlags] IndexedDB not supported in this environment\");\n return;\n }\n\n try {\n const db = await openDB();\n const transaction = db.transaction(STORE_NAME, \"readwrite\");\n const store = transaction.objectStore(STORE_NAME);\n store.put({ id: key, value: valueToStore });\n\n transaction.oncomplete = () => {\n db.close();\n };\n\n transaction.onerror = () => {\n db.close();\n };\n } catch (error) {\n console.error(\"[MyFlags] Error in setValueInDB:\", error);\n }\n },\n [key, openDB]\n );\n\n useEffect(() => {\n const initializeDB = async () => {\n try {\n const value = await getValueFromDB();\n setStoredValue(value);\n setIsDbReady(true);\n \n // Process any pending writes\n if (pendingWrites.current.length > 0) {\n for (const value of pendingWrites.current) {\n await setValueInDB(value);\n }\n pendingWrites.current = [];\n }\n } catch {\n setIsDbReady(true);\n }\n };\n\n initializeDB();\n }, [getValueFromDB, setValueInDB]);\n\n const setValue = useCallback(\n (value: T) => {\n try {\n const valueToStore =\n value instanceof Function ? value(storedValue) : value;\n\n setStoredValue(valueToStore);\n\n if (isDbReady) {\n setValueInDB(valueToStore);\n } else {\n pendingWrites.current.push(valueToStore);\n }\n } catch (error) {\n console.error(\"[MyFlags] Error in setValue:\", error);\n }\n },\n [storedValue, isDbReady, setValueInDB]\n );\n\n return [storedValue, setValue];\n}\n","import { useMyFlagsContext } from \"../Provider\";\n\nexport default function useFlag(\n name: string,\n defaultValue: boolean = false\n): boolean {\n const context = useMyFlagsContext();\n return context[name] || defaultValue;\n}\n","import React from 'react';\nimport useFlag from '../hooks/useFlag';\n\ninterface FeatureFlagProps {\n name: string;\n children: (enabled: boolean) => React.ReactNode;\n defaultValue?: boolean;\n}\n\nexport const FeatureFlag: React.FC<FeatureFlagProps> = ({\n name,\n children,\n defaultValue = false,\n}) => {\n const isEnabled = useFlag(name, defaultValue);\n return <>{children(isEnabled)}</>;\n}; ","import { Flag } from \"@myflags/core\";\nimport { useMyFlagsContext } from \"../Provider\";\n\nexport default function useFlags(): Flag {\n const context = useMyFlagsContext();\n return context;\n}\n"],"mappings":"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","names":["import_react","value","import_jsx_runtime"]}