goobs-frontend 0.7.63 → 0.7.65

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "goobs-frontend",
3
- "version": "0.7.63",
3
+ "version": "0.7.65",
4
4
  "description": "A comprehensive React-based UI library built on Material-UI, offering a wide range of customizable components including grids, typography, buttons, cards, forms, navigation, pricing tables, steppers, tooltips, accordions, and more. Designed for building responsive and consistent user interfaces with advanced features like form validation, theming, and code syntax highlighting.",
5
5
  "license": "MIT",
6
6
  "main": "./src/index.ts",
@@ -22,32 +22,32 @@
22
22
  "react-dom": "^17.0.0 || ^18.0.0"
23
23
  },
24
24
  "dependencies": {
25
- "@emotion/cache": "^11.11.0",
26
- "@emotion/react": "^11.11.4",
27
- "@emotion/styled": "^11.11.5",
28
- "@mui/icons-material": "^5.16.0",
29
- "@mui/material": "^5.16.0",
30
- "@types/lodash": "^4.17.6",
31
- "goobs-cache": "^1.4.0",
25
+ "@emotion/cache": "^11.13.1",
26
+ "@emotion/react": "^11.13.0",
27
+ "@emotion/styled": "^11.13.0",
28
+ "@mui/icons-material": "^5.16.6",
29
+ "@mui/material": "^5.16.6",
30
+ "@types/lodash": "^4.17.7",
31
+ "goobs-cache": "^1.6.4",
32
32
  "highlight.js": "^11.10.0",
33
33
  "lodash": "^4.17.21",
34
34
  "next": "14.2.5"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@next/eslint-plugin-next": "^14.2.5",
38
- "@types/node": "^20.14.10",
38
+ "@types/node": "^22.1.0",
39
39
  "@types/react": "18.3.3",
40
40
  "@types/react-dom": "^18.3.0",
41
- "@typescript-eslint/eslint-plugin": "^7.16.0",
42
- "@typescript-eslint/parser": "^7.16.0",
41
+ "@typescript-eslint/eslint-plugin": "^8.0.1",
42
+ "@typescript-eslint/parser": "^8.0.1",
43
43
  "eslint": "^8.57.0",
44
44
  "eslint-config-next": "^14.2.5",
45
45
  "eslint-config-prettier": "^9.1.0",
46
- "eslint-plugin-prettier": "^5.1.3",
47
- "prettier": "^3.3.2",
46
+ "eslint-plugin-prettier": "^5.2.1",
47
+ "prettier": "^3.3.3",
48
48
  "react": "^18.3.1",
49
49
  "react-dom": "^18.3.1",
50
- "typescript": "^5.5.3"
50
+ "typescript": "^5.5.4"
51
51
  },
52
52
  "files": [
53
53
  "src"
@@ -0,0 +1,224 @@
1
+ import { useCallback, useMemo } from 'react'
2
+ import { session } from 'goobs-cache'
3
+
4
+ export interface HelperFooterMessage {
5
+ status: 'error' | 'success' | 'emptyAndRequired'
6
+ statusMessage: string
7
+ spreadMessage: string
8
+ spreadMessagePriority: number
9
+ required: boolean
10
+ hasInput?: boolean
11
+ }
12
+
13
+ const useHelperFooter = (initialFormname?: string) => {
14
+ console.log(
15
+ 'useHelperFooter: Hook called with initialFormname:',
16
+ initialFormname
17
+ )
18
+
19
+ const helperFooterAtom = session.atom<Record<
20
+ string,
21
+ HelperFooterMessage
22
+ > | null>(null)
23
+ const currentErrorIndexAtom = session.atom<number>(0)
24
+
25
+ const fetchHelperFooters = useCallback(async (): Promise<Record<
26
+ string,
27
+ HelperFooterMessage
28
+ > | null> => {
29
+ console.log('useHelperFooter: fetchHelperFooters called')
30
+ if (!initialFormname) {
31
+ console.log('useHelperFooter: No formname provided, returning null')
32
+ return null
33
+ }
34
+
35
+ const [helperFooters, setHelperFooters] = session.useAtom(helperFooterAtom)
36
+
37
+ if (helperFooters === null) {
38
+ const [helperFooterResult] = session.useAtom(
39
+ session.atom(`helperfooter:${initialFormname}`)
40
+ )
41
+ console.log('useHelperFooter: helperFooterResult:', helperFooterResult)
42
+
43
+ if (
44
+ helperFooterResult &&
45
+ typeof helperFooterResult === 'object' &&
46
+ helperFooterResult !== null
47
+ ) {
48
+ const fetchedHelperFooters: Record<string, HelperFooterMessage> = {}
49
+
50
+ for (const [key, value] of Object.entries(helperFooterResult)) {
51
+ if (
52
+ typeof value === 'object' &&
53
+ value !== null &&
54
+ 'status' in value &&
55
+ 'statusMessage' in value &&
56
+ 'spreadMessage' in value &&
57
+ 'spreadMessagePriority' in value &&
58
+ 'required' in value &&
59
+ 'hasInput' in value
60
+ ) {
61
+ fetchedHelperFooters[key] = {
62
+ status: value.status as 'error' | 'success' | 'emptyAndRequired',
63
+ statusMessage: String(value.statusMessage),
64
+ spreadMessage: String(value.spreadMessage),
65
+ spreadMessagePriority: Number(value.spreadMessagePriority),
66
+ required: Boolean(value.required),
67
+ hasInput: Boolean(value.hasInput),
68
+ }
69
+ }
70
+ }
71
+
72
+ console.log(
73
+ 'useHelperFooter: Fetched helper footers:',
74
+ fetchedHelperFooters
75
+ )
76
+ setHelperFooters(fetchedHelperFooters)
77
+ return fetchedHelperFooters
78
+ }
79
+
80
+ console.log(
81
+ 'useHelperFooter: Invalid helper footer result, returning null'
82
+ )
83
+ return null
84
+ }
85
+
86
+ return helperFooters
87
+ }, [initialFormname, helperFooterAtom])
88
+
89
+ const updateFormValidation = useCallback(async (): Promise<boolean> => {
90
+ console.log('useHelperFooter: updateFormValidation called')
91
+ const fetchedHelperFooters = await fetchHelperFooters()
92
+
93
+ if (fetchedHelperFooters) {
94
+ const errorFooters = Object.values(fetchedHelperFooters).filter(
95
+ footer =>
96
+ (footer.status === 'error' || footer.status === 'emptyAndRequired') &&
97
+ footer.required
98
+ )
99
+
100
+ console.log('useHelperFooter: Error footers:', errorFooters)
101
+
102
+ if (errorFooters.length === 0) {
103
+ const [, setCurrentErrorIndex] = session.useAtom(currentErrorIndexAtom)
104
+ setCurrentErrorIndex(0)
105
+ console.log('useHelperFooter: No errors found, returning true')
106
+ return true
107
+ }
108
+
109
+ errorFooters.sort(
110
+ (a, b) => a.spreadMessagePriority - b.spreadMessagePriority
111
+ )
112
+
113
+ const [currentErrorIndex, setCurrentErrorIndex] = session.useAtom(
114
+ currentErrorIndexAtom
115
+ )
116
+ if (currentErrorIndex >= errorFooters.length) {
117
+ setCurrentErrorIndex(0)
118
+ }
119
+
120
+ console.log('useHelperFooter: Errors found, returning false')
121
+ return false
122
+ }
123
+
124
+ console.log('useHelperFooter: No helper footers, returning true')
125
+ return true
126
+ }, [fetchHelperFooters, currentErrorIndexAtom])
127
+
128
+ const checkFormStatus = useCallback(async () => {
129
+ console.log('useHelperFooter: checkFormStatus called')
130
+ const fetchedHelperFooters = await fetchHelperFooters()
131
+ const status = fetchedHelperFooters
132
+ ? Object.values(fetchedHelperFooters).every(
133
+ value => !value.required || (value.required && value.hasInput)
134
+ )
135
+ : true
136
+ console.log('useHelperFooter: Form status:', status)
137
+ return status
138
+ }, [fetchHelperFooters])
139
+
140
+ const getEmptyRequiredFields = useCallback(async () => {
141
+ console.log('useHelperFooter: getEmptyRequiredFields called')
142
+ const fetchedHelperFooters = await fetchHelperFooters()
143
+ if (!fetchedHelperFooters) return []
144
+ const emptyFields = Object.entries(fetchedHelperFooters)
145
+ .filter(([, value]) => value.required && !value.hasInput)
146
+ .map(([key]) => key)
147
+ console.log('useHelperFooter: Empty required fields:', emptyFields)
148
+ return emptyFields
149
+ }, [fetchHelperFooters])
150
+
151
+ const getCurrentErrorMessage = useCallback(async () => {
152
+ console.log('useHelperFooter: getCurrentErrorMessage called')
153
+ const fetchedHelperFooters = await fetchHelperFooters()
154
+ if (!fetchedHelperFooters) return undefined
155
+ const errorFooters = Object.values(fetchedHelperFooters).filter(
156
+ footer =>
157
+ (footer.status === 'error' || footer.status === 'emptyAndRequired') &&
158
+ footer.required
159
+ )
160
+ if (errorFooters.length === 0) return undefined
161
+ const [currentErrorIndex] = session.useAtom(currentErrorIndexAtom)
162
+ const message = errorFooters[currentErrorIndex]?.spreadMessage
163
+ console.log('useHelperFooter: Current error message:', message)
164
+ return message
165
+ }, [fetchHelperFooters, currentErrorIndexAtom])
166
+
167
+ const isFormValid = useCallback(async () => {
168
+ const fetchedHelperFooters = await fetchHelperFooters()
169
+ if (!fetchedHelperFooters) return true
170
+ const valid = Object.values(fetchedHelperFooters).every(
171
+ footer =>
172
+ footer.status !== 'error' && footer.status !== 'emptyAndRequired'
173
+ )
174
+ console.log('useHelperFooter: isFormValid:', valid)
175
+ return valid
176
+ }, [fetchHelperFooters])
177
+
178
+ const nextError = useCallback(async () => {
179
+ console.log('useHelperFooter: nextError called')
180
+ const fetchedHelperFooters = await fetchHelperFooters()
181
+ if (!fetchedHelperFooters) return
182
+ const errorFooters = Object.values(fetchedHelperFooters).filter(
183
+ footer =>
184
+ (footer.status === 'error' || footer.status === 'emptyAndRequired') &&
185
+ footer.required
186
+ )
187
+ if (errorFooters.length > 0) {
188
+ const [currentErrorIndex, setCurrentErrorIndex] = session.useAtom(
189
+ currentErrorIndexAtom
190
+ )
191
+ setCurrentErrorIndex((currentErrorIndex + 1) % errorFooters.length)
192
+ console.log(
193
+ 'useHelperFooter: New error index:',
194
+ (currentErrorIndex + 1) % errorFooters.length
195
+ )
196
+ }
197
+ }, [fetchHelperFooters, currentErrorIndexAtom])
198
+
199
+ const result = useMemo(
200
+ () => ({
201
+ errorMessage: getCurrentErrorMessage,
202
+ isFormValid,
203
+ updateFormValidation,
204
+ fetchHelperFooters,
205
+ nextError,
206
+ checkFormStatus,
207
+ getEmptyRequiredFields,
208
+ }),
209
+ [
210
+ getCurrentErrorMessage,
211
+ isFormValid,
212
+ updateFormValidation,
213
+ fetchHelperFooters,
214
+ nextError,
215
+ checkFormStatus,
216
+ getEmptyRequiredFields,
217
+ ]
218
+ )
219
+
220
+ console.log('useHelperFooter: Returning result:', result)
221
+ return result
222
+ }
223
+
224
+ export default useHelperFooter