45 lines
1.2 KiB
TypeScript
45 lines
1.2 KiB
TypeScript
import { useMemo } from "react";
|
|
import { create } from "zustand";
|
|
import { createJSONStorage, persist } from "zustand/middleware";
|
|
import {
|
|
type CurrencyCode,
|
|
convertFromUsd,
|
|
formatMoneyFromUsd,
|
|
isCurrencyCode,
|
|
} from "@/lib/currency";
|
|
|
|
type CurrencyState = {
|
|
currency: CurrencyCode;
|
|
setCurrency: (c: CurrencyCode) => void;
|
|
};
|
|
|
|
export const useCurrencyStore = create<CurrencyState>()(
|
|
persist(
|
|
(set) => ({
|
|
currency: "USD",
|
|
setCurrency: (currency) => set({ currency: isCurrencyCode(currency) ? currency : "USD" }),
|
|
}),
|
|
{
|
|
name: "shitaye-currency",
|
|
storage: createJSONStorage(() => localStorage),
|
|
partialize: (s) => ({ currency: s.currency }),
|
|
skipHydration: true,
|
|
},
|
|
),
|
|
);
|
|
|
|
export function useCurrency() {
|
|
const currency = useCurrencyStore((s) => s.currency);
|
|
const setCurrency = useCurrencyStore((s) => s.setCurrency);
|
|
return useMemo(
|
|
() => ({
|
|
currency,
|
|
setCurrency,
|
|
formatUsd: (amountUsd: number, maximumFractionDigits: 0 | 1 | 2 = 2) =>
|
|
formatMoneyFromUsd(amountUsd, currency, maximumFractionDigits),
|
|
convertUsd: (amountUsd: number) => convertFromUsd(amountUsd, currency),
|
|
}),
|
|
[currency, setCurrency],
|
|
);
|
|
}
|