cryptoProvider.tsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. 'use client';
  2. import { createContext, useContext, useState, useCallback } from 'react';
  3. import type { TickerData, TickerMeta } from '@/types/crypto';
  4. interface CryptoContextType {
  5. selectedMarket: string;
  6. setSelectedMarket: (market: string) => void;
  7. quoteMarket: string;
  8. setQuoteMarket: (quote: string) => void;
  9. tickers: Map<string, TickerData>;
  10. setTickers: (tickers: Map<string, TickerData>) => void;
  11. tickerMeta: Map<string, TickerMeta>;
  12. setTickerMeta: (meta: Map<string, TickerMeta>) => void;
  13. }
  14. const CryptoContext = createContext<CryptoContextType>({
  15. selectedMarket: 'KRW-BTC',
  16. setSelectedMarket: () => {},
  17. quoteMarket: 'KRW',
  18. setQuoteMarket: () => {},
  19. tickers: new Map(),
  20. setTickers: () => {},
  21. tickerMeta: new Map(),
  22. setTickerMeta: () => {},
  23. });
  24. type Props = {
  25. children: React.ReactNode;
  26. initialMarket?: string;
  27. };
  28. export function CryptoProvider({ children, initialMarket = 'KRW-BTC' }: Props) {
  29. const [selectedMarket, setSelectedMarketState] = useState(initialMarket);
  30. const [quoteMarket, setQuoteMarketState] = useState('KRW');
  31. const [tickers, setTickersState] = useState<Map<string, TickerData>>(new Map());
  32. const [tickerMeta, setTickerMetaState] = useState<Map<string, TickerMeta>>(new Map());
  33. const setSelectedMarket = useCallback((market: string) => {
  34. setSelectedMarketState(market);
  35. }, []);
  36. const setQuoteMarket = useCallback((quote: string) => {
  37. setQuoteMarketState(quote);
  38. }, []);
  39. const setTickers = useCallback((t: Map<string, TickerData>) => {
  40. setTickersState(t);
  41. }, []);
  42. const setTickerMeta = useCallback((m: Map<string, TickerMeta>) => {
  43. setTickerMetaState(m);
  44. }, []);
  45. return (
  46. <CryptoContext.Provider value={{
  47. selectedMarket, setSelectedMarket,
  48. quoteMarket, setQuoteMarket,
  49. tickers, setTickers,
  50. tickerMeta, setTickerMeta,
  51. }}>
  52. {children}
  53. </CryptoContext.Provider>
  54. );
  55. }
  56. export function useCryptoContext() {
  57. return useContext(CryptoContext);
  58. }