|
| 1 | +import { createContext, useContext, createMemo, type Component, Accessor } from 'solid-js' |
| 2 | +import { createStore, produce } from 'solid-js/store' |
| 3 | +import type { Context } from '@static/types' |
| 4 | +import { UiStore, MenuOpen } from '@src/static/types/interfaces' |
| 5 | +import { loaderType } from '@static/types/enums' |
| 6 | + |
| 7 | +interface AppUIContext { |
| 8 | + connectingStatus: Accessor<boolean | undefined> |
| 9 | + loaderStatus: Accessor<Record<loaderType, boolean> | undefined> |
| 10 | + openModalStatus: Accessor<boolean | undefined> |
| 11 | + menuOpenStatus: Accessor<MenuOpen | null | undefined> |
| 12 | + connectedUserName: Accessor<string> |
| 13 | + showCameraView: Accessor<boolean | undefined> |
| 14 | + showNotifications: Accessor<boolean | undefined> |
| 15 | + hideHeaderButtons: Accessor<boolean> |
| 16 | + setMenu: (menuOpen: MenuOpen | null) => void |
| 17 | + setHideHeaderButtons: (flag: boolean) => void |
| 18 | + setConnecting: (connecting: boolean) => void |
| 19 | + setOpenModal: (openModal: boolean) => void |
| 20 | + setConnectedUser: (userName: string) => void |
| 21 | + setLoader: (type: loaderType, value: boolean) => void |
| 22 | + setShowCameraView: (showCameraView: boolean) => void |
| 23 | +} |
| 24 | + |
| 25 | +const AppUIContext = createContext<AppUIContext>() |
| 26 | +export const AppUIProvider: Component<Context> = (props) => { |
| 27 | + const defaultState = { |
| 28 | + loader: { [loaderType.MDNS_CONNECTING]: false, [loaderType.REST_CLIENT]: false }, |
| 29 | + connecting: false, |
| 30 | + openModal: false, |
| 31 | + menuOpen: null, |
| 32 | + connectedUser: '', |
| 33 | + showCameraView: false, |
| 34 | + showNotifications: true, |
| 35 | + hideHeaderButtons: false, |
| 36 | + } |
| 37 | + |
| 38 | + const [state, setState] = createStore<UiStore>(defaultState) |
| 39 | + |
| 40 | + const setMenu = (menuOpen: MenuOpen | null) => { |
| 41 | + setState( |
| 42 | + produce((s) => { |
| 43 | + s.menuOpen = menuOpen || null |
| 44 | + }), |
| 45 | + ) |
| 46 | + } |
| 47 | + |
| 48 | + const setHideHeaderButtons = (flag: boolean) => { |
| 49 | + setState( |
| 50 | + produce((s) => { |
| 51 | + s.hideHeaderButtons = flag |
| 52 | + }), |
| 53 | + ) |
| 54 | + } |
| 55 | + |
| 56 | + const setConnecting = (connecting: boolean) => { |
| 57 | + setState( |
| 58 | + produce((s) => { |
| 59 | + s.connecting = connecting |
| 60 | + }), |
| 61 | + ) |
| 62 | + } |
| 63 | + |
| 64 | + const setOpenModal = (openModal: boolean) => { |
| 65 | + setState( |
| 66 | + produce((s) => { |
| 67 | + s.openModal = openModal |
| 68 | + }), |
| 69 | + ) |
| 70 | + } |
| 71 | + |
| 72 | + const setConnectedUser = (userName: string) => { |
| 73 | + setState( |
| 74 | + produce((s) => { |
| 75 | + s.connectedUser = userName |
| 76 | + }), |
| 77 | + ) |
| 78 | + } |
| 79 | + |
| 80 | + const setLoader = (type: loaderType, value: boolean) => { |
| 81 | + setState( |
| 82 | + produce((s) => { |
| 83 | + if (s.loader) s.loader[type] = value |
| 84 | + }), |
| 85 | + ) |
| 86 | + } |
| 87 | + |
| 88 | + const setShowCameraView = (showCameraView: boolean) => { |
| 89 | + setState( |
| 90 | + produce((s) => { |
| 91 | + s.showCameraView = showCameraView |
| 92 | + }), |
| 93 | + ) |
| 94 | + } |
| 95 | + |
| 96 | + const uiState = createMemo(() => state) |
| 97 | + |
| 98 | + const connectingStatus = createMemo(() => uiState().connecting) |
| 99 | + const loaderStatus = createMemo(() => uiState().loader) |
| 100 | + const openModalStatus = createMemo(() => uiState().openModal) |
| 101 | + const menuOpenStatus = createMemo(() => uiState().menuOpen) |
| 102 | + const connectedUserName = createMemo(() => uiState().connectedUser) |
| 103 | + const showCameraView = createMemo(() => uiState().showCameraView) |
| 104 | + const showNotifications = createMemo(() => uiState().showNotifications) |
| 105 | + const hideHeaderButtons = createMemo(() => uiState().hideHeaderButtons) |
| 106 | + |
| 107 | + return ( |
| 108 | + <AppUIContext.Provider |
| 109 | + value={{ |
| 110 | + connectingStatus, |
| 111 | + loaderStatus, |
| 112 | + openModalStatus, |
| 113 | + menuOpenStatus, |
| 114 | + connectedUserName, |
| 115 | + showCameraView, |
| 116 | + showNotifications, |
| 117 | + hideHeaderButtons, |
| 118 | + setMenu, |
| 119 | + setHideHeaderButtons, |
| 120 | + setConnecting, |
| 121 | + setOpenModal, |
| 122 | + setConnectedUser, |
| 123 | + setLoader, |
| 124 | + setShowCameraView, |
| 125 | + }}> |
| 126 | + {props.children} |
| 127 | + </AppUIContext.Provider> |
| 128 | + ) |
| 129 | +} |
| 130 | + |
| 131 | +export const useAppUIContext = () => { |
| 132 | + const context = useContext(AppUIContext) |
| 133 | + if (context === undefined) { |
| 134 | + throw new Error('useAppUIContext must be used within an AppUIProvider') |
| 135 | + } |
| 136 | + return context |
| 137 | +} |
0 commit comments