jrs-react 1.0.1 → 1.0.3

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": "jrs-react",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "",
5
5
  "main": "build/index.js",
6
6
  "module": "build/index.es.js",
@@ -12,8 +12,11 @@
12
12
  "license": "MIT",
13
13
  "dependencies": {
14
14
  "@rollup/plugin-commonjs": "^28.0.3",
15
+ "@rollup/plugin-json": "^6.1.0",
16
+ "axios": "^1.8.3",
15
17
  "react": "^19.0.0",
16
- "react-dom": "^19.0.0"
18
+ "react-dom": "^19.0.0",
19
+ "styled-components": "^6.1.15"
17
20
  },
18
21
  "devDependencies": {
19
22
  "@babel/core": "^7.26.10",
@@ -1,12 +1,296 @@
1
- import React from "react";
1
+ import React from 'react'
2
+ import axios from 'axios'
3
+ import { colonValueString, flexType, po } from './JRUtils'
4
+ // import { displaySpinner } from '../jrx/LoadingBar'
5
+ // import msg from '../jrx/IMessage'
6
+ import styled from 'styled-components'
7
+
8
+
9
+ const axiosSubmit = axios.create({
10
+ authorization: `Bearer ${localStorage.getItem("accessToken")}`
11
+ ,timeout: 120000
12
+ ,maxBodyLength: 104857600 //100mb 104857600
13
+ ,maxContentLength: 104857600 //100mb
14
+ })
15
+
16
+ const StyledCover=styled.div`
17
+ border:2px solid red;
18
+ `
19
+ const Cover=({children})=>{
20
+ return <StyledCover>{children}</StyledCover>
21
+ }
2
22
 
3
23
  export default class JRSubmit extends React.Component {
4
- render(){
5
- return 'JRSubmit'
24
+ #methods = ['get', 'post', 'put','patch','delete','download']
25
+
26
+ constructor(props) {
27
+ super(props)
28
+ if(this.props.value===undefined && this.props.initValue!==undefined ){
29
+ if(this.props.onChange===undefined){
30
+ this.state={
31
+ value:props.initValue
32
+ ,rawValue:JSON.parse(JSON.stringify(props.initValue))
33
+ }
34
+ }
35
+ }
36
+ }
37
+ componentDidMount() {
38
+ this.#methods
39
+ .filter((method) => this[method] && this.props[method] && this.props[method].autoRun)
40
+ .forEach((method) => {
41
+ this[method]()
42
+ })
43
+ }
44
+ get(_config = {}) {
45
+ const config = Object.assign(
46
+ {
47
+ method:'get'
48
+ ,updateValue:true
49
+ // ,updateRawValue:true
50
+ }
51
+ ,this.props['get']
52
+ ,_config
53
+ )
54
+ this.submit(config)
55
+ }
56
+
57
+ post(config = {}) {
58
+ config = Object.assign(
59
+ {
60
+ method:'post'
61
+ ,updateValue:false
62
+ }
63
+ ,this.props['post']
64
+ ,config
65
+ )
66
+ this.submit(config)
6
67
  }
7
- }
8
68
 
9
-
10
- // function Test(){
11
- // return <div>AAAAAAAAA</div>
12
- // }
69
+ put(config = {}) {
70
+ config = Object.assign(
71
+ {
72
+ method:'put'
73
+ ,updateValue:false
74
+ }
75
+ ,this.props['put']
76
+ ,config
77
+ )
78
+ this.submit(config)
79
+ }
80
+
81
+ delete(config = {}) {
82
+ config = Object.assign(
83
+ {
84
+ method:'delete'
85
+ ,updateValue:false
86
+ }
87
+ ,this.props['delete']
88
+ ,config
89
+ )
90
+ this.submit(config)
91
+ }
92
+
93
+ get from(){
94
+ return this.props.value===undefined?'state':'props'
95
+ }
96
+
97
+ get isDirty(){
98
+ return this.state?.isDirty
99
+ }
100
+ set isDirty(isDirty){
101
+ this.setState({isDirty})
102
+ }
103
+ get rawValue(){
104
+ return this.state?.rawValue
105
+ }
106
+ setRawValue(rawValue){
107
+ this.setState({rawValue:JSON.parse(JSON.stringify(rawValue??''))})
108
+ }
109
+ reset(){
110
+ this.setValue(this.rawValue,true)
111
+ }
112
+ setValue(value,reset=false){
113
+ if(this.props.onChange){
114
+ this.props.onChange(value)
115
+ }else{
116
+ this.setState({value})
117
+ }
118
+
119
+ if(reset){
120
+ this.setRawValue(value)
121
+ }
122
+ this.isDirty=!reset
123
+ }
124
+ setRes(isSuccess,response,config){
125
+ if (isSuccess && config.updateValue) {
126
+ const value=config.formatValue?.bind(this)(response.data)??response.data
127
+ response.data=value
128
+ this.setValue(value,true)
129
+ } else if(config.updateValue){
130
+ this.setValue(null,true)
131
+ }
132
+ }
133
+ #getValueByName(fullnamList,record){
134
+ const name=fullnamList.shift()
135
+ if(fullnamList.length==0){
136
+ return record?.[name]
137
+ }else if(record?.[name]!=null){
138
+ return this.#getValueByName(fullnamList,record[name])
139
+ }
140
+ }
141
+
142
+ getValue(fullname){
143
+ if(fullname){
144
+ const fullnamList=fullname.split('.')
145
+ return this.#getValueByName(fullnamList,this[this.from]?.value)
146
+ }else{
147
+ return flexType(this[this.from]?.value,this,null,null)
148
+ }
149
+ }
150
+
151
+ getSubmitValue(){
152
+ return this.getValue()
153
+ }
154
+
155
+ getAxiosParams({url,method,value,extraValue,sendValue,transformValue,...params}){
156
+ const _extraValue=extraValue?.bind?.(this)() ?? extraValue
157
+ // let payload=typeof value === 'function'
158
+ // ?value.bind(this)({
159
+ // ...this.getSubmitValue()
160
+ // ,..._extraValue
161
+ // })
162
+ // :value==null
163
+ // ?{
164
+ // ...this.getSubmitValue()
165
+ // ,..._extraValue
166
+ // }
167
+ // :{
168
+ // ...value
169
+ // ,..._extraValue
170
+ // }
171
+ let payload=value?.bind?.(this)({
172
+ ...this.getSubmitValue()
173
+ ,..._extraValue
174
+ })
175
+ ?? value==null
176
+ ?{
177
+ ...this.getSubmitValue()
178
+ ,..._extraValue
179
+ }
180
+ :{
181
+ ...value
182
+ ,..._extraValue
183
+ }
184
+
185
+ if(transformValue){
186
+ payload=transformValue.bind(this)(payload)
187
+ }
188
+ const headers={
189
+ authorization: `Bearer ${localStorage.getItem("accessToken")}`
190
+ }
191
+ let params1={}
192
+ const params2={}
193
+ if(method=='get'){
194
+ if(sendValue==null || sendValue)params1.params=payload
195
+ params1.headers=headers
196
+ }else if(method=='delete'){
197
+ if(sendValue==null || sendValue)params1.data=payload
198
+ params1.headers=headers
199
+ }else{
200
+ if(sendValue==null || sendValue){
201
+ params1=payload
202
+ }else{
203
+ params1=null
204
+ }
205
+ params2.headers=headers
206
+ }
207
+ return {
208
+ url:colonValueString(url,payload)
209
+ ,method
210
+ ,params1
211
+ ,params2
212
+ ,payload
213
+ }
214
+ }
215
+
216
+ reload(){
217
+ po('reload 還沒有做 ')
218
+ }
219
+
220
+ submit(config){
221
+ const me=this
222
+ // displaySpinner({mask:config.mask})++++++++++++++
223
+ this.setState({loading:true})
224
+ let _payload
225
+ ;(()=>{
226
+ if (Array.isArray(config.url)) {
227
+ _payload=[]
228
+ return Promise.allSettled(
229
+ config.url.map((_url) => {
230
+ const urlParams=typeof _url === 'object'
231
+ ?_url
232
+ :{url: _url}
233
+ const finalConfig=Object.assign(config,urlParams)
234
+ const {url,method,params1,params2,payload}=this.getAxiosParams(finalConfig)
235
+ _payload.push(payload)
236
+ return axiosSubmit[method](url,params1,params2)
237
+ })
238
+ )
239
+ }else{
240
+ const {url,method,params1,params2,payload}=this.getAxiosParams(config)
241
+ _payload=payload
242
+ return axiosSubmit[method](url,params1,params2)
243
+ }
244
+ })()
245
+ .then((res)=>{
246
+ this.handleResponse(res,_payload,config)
247
+ })
248
+ .catch((res)=>{
249
+ this.handleResponse(res,_payload,config)
250
+ })
251
+ .finally(function (a,b,c) {
252
+ me.setState({loading:false})
253
+ // displaySpinner({mask:false})+++++++++++++++++++++++
254
+ })
255
+ }
256
+
257
+ handleResponse=(response,payload,config)=>{
258
+ if(Array.isArray(response)){
259
+ response=response.map((re,index)=>{
260
+ if(re.value){
261
+ re.value.payload=payload[index]
262
+ }else if(re.reason){
263
+ re.reason.payload=payload[index]
264
+ }
265
+ return re
266
+ })
267
+ }else{
268
+ response.payload=payload
269
+ }
270
+
271
+ response = config?.response?.bind(this)(response,payload) ?? response
272
+ const isSuccess = response.status >= 200 && response.status <= 299
273
+
274
+ this.setRes(isSuccess,response,config)
275
+ if (isSuccess) {
276
+ if (config.successMessage) {
277
+ // msg.success({ message:config.successMessage });+++++++++++++++++++++
278
+ }
279
+ } else {
280
+ if (config.failedMessage) {
281
+ // msg.error({ message:config.failedMessage });+++++++++++++++++++++++
282
+ }
283
+ }
284
+ config.callback?.bind(this)(isSuccess,response,payload)
285
+ }
286
+
287
+ renderer(){
288
+ return
289
+ }
290
+
291
+ render() {
292
+ return this.props.cover!=null && this.state?.lodaing
293
+ ?<Cover>{flexType(this.props.cover,this,null,null)}</Cover>
294
+ :this.renderer()
295
+ }
296
+ }
@@ -0,0 +1,79 @@
1
+ import React from "react"
2
+
3
+ export const po=console.debug
4
+
5
+ export const colonValueString=(string,value)=>{
6
+ const get=typeof value.get ==='function'
7
+ ? (value,name)=>{
8
+ return value?.get(name.slice(1)) ?? name
9
+ }
10
+ : (value,name)=>{
11
+ return value?.[name.slice(1)] ?? name
12
+ }
13
+ return Array.from(string.match(/\:\w+/g)??[])
14
+ .reduce((aco,name)=>{
15
+ return aco.replace(new RegExp(name, "g"), get(value,name) );
16
+ },string)
17
+ ;
18
+ }
19
+
20
+ export const genData=()=>{
21
+ const fa=1
22
+ // const gData=Array(10).fill(9).map((ff,fa,fd)=>{
23
+ const data=Array(50).fill(9).reduce((acc,f,a,d)=>{
24
+ po(acc,f,a,d)
25
+ acc.push({
26
+ id:a
27
+ ,name:`Name ${a}`
28
+ ,age:a+28+fa//dayjs//dayjs().add(-a,'day')
29
+ ,fullName:{
30
+ firstName:`First Name ${fa}`
31
+ ,lastName:`Last Name ${a}`
32
+ }
33
+ ,items:Array(5).fill(3).map((f1,a1,d1)=>{
34
+ return {
35
+ id:`IT${a}-${a1}`
36
+ ,name:`ITN ${a} ${a1}`
37
+ }
38
+ })
39
+ })
40
+ return acc
41
+ },[])
42
+ po(data)
43
+ return data
44
+ // })
45
+
46
+ // po(gData)
47
+ }
48
+
49
+
50
+ export const flexType=(type,me,payload,doElse)=>{
51
+ const result=typeof type==='function'
52
+ ?type?.bind(me)(payload)
53
+ :type??doElse
54
+ return result
55
+ }
56
+
57
+ export const whatType=(
58
+ {type,typeStyle:_typeStyle,render,...config}
59
+ ,me
60
+ ,doElse
61
+ )=>{
62
+ if(type){
63
+ // const style=flexType(typeStyle,me,{},{})
64
+ // return 'type'
65
+ const typeStyle=typeof _typeStyle==='function'
66
+ ?_typeStyle?.bind(me)()
67
+ :_typeStyle
68
+
69
+ return React.createElement(type,{
70
+ style:typeStyle
71
+
72
+ })
73
+ }else if(render){
74
+ return render.bind(me)()
75
+ }else {
76
+ return doElse
77
+ }
78
+ return 'what type'
79
+ }