@@ -11,13 +11,16 @@ type MiniBrowserStep = {
11
11
loadUrl ?: string
12
12
children : React . ReactNode
13
13
zoom ?: number
14
+ prependOrigin ?: boolean
14
15
}
15
16
16
17
type MiniBrowserProps = {
17
18
progress ?: number
18
19
backward ?: boolean
19
20
url ?: string
20
21
children : React . ReactNode
22
+ loadUrl ?: string
23
+ prependOrigin ?: boolean
21
24
zoom ?: number
22
25
steps ?: MiniBrowserStep [ ]
23
26
} & React . PropsWithoutRef < JSX . IntrinsicElements [ "div" ] >
@@ -35,11 +38,20 @@ function MiniBrowserWithRef(
35
38
backward = false ,
36
39
zoom = 1 ,
37
40
steps : ogSteps ,
41
+ loadUrl,
42
+ prependOrigin,
38
43
...props
39
44
} : MiniBrowserProps ,
40
45
ref : React . Ref < HTMLIFrameElement >
41
46
) {
42
- const steps = useSteps ( ogSteps , { url, children, zoom } )
47
+ const steps = useSteps ( ogSteps , {
48
+ url,
49
+ children,
50
+ zoom,
51
+ loadUrl,
52
+ prependOrigin,
53
+ } )
54
+
43
55
const stepIndex = backward
44
56
? Math . floor ( progress )
45
57
: Math . ceil ( progress )
@@ -49,7 +61,12 @@ function MiniBrowserWithRef(
49
61
{ ...props }
50
62
zoom = { currentStep . zoom }
51
63
className = { `ch-mini-browser ${ props . className || "" } ` }
52
- titleBar = { < Bar url = { currentStep . url ! } /> }
64
+ titleBar = {
65
+ < Bar
66
+ url = { currentStep . url ! }
67
+ linkUrl = { currentStep . loadUrl ! }
68
+ />
69
+ }
53
70
>
54
71
{ currentStep . children || (
55
72
< iframe
@@ -64,34 +81,70 @@ function MiniBrowserWithRef(
64
81
65
82
function useSteps (
66
83
ogSteps : MiniBrowserStep [ ] | undefined ,
67
- { zoom , url , children , loadUrl = url } : MiniBrowserStep
84
+ ogDefaults : MiniBrowserStep
68
85
) {
86
+ const defaults = transformStep ( ogDefaults )
87
+ const {
88
+ zoom,
89
+ url,
90
+ children,
91
+ loadUrl,
92
+ prependOrigin,
93
+ } = defaults
94
+
69
95
return React . useMemo ( ( ) => {
70
96
if ( ! ogSteps ) {
71
- return [ { zoom , url , children , loadUrl } ]
97
+ return [ defaults ]
72
98
} else {
73
- return ogSteps . map ( s => ( {
74
- zoom,
75
- url,
76
- children,
77
- loadUrl : s . loadUrl || loadUrl || s . url || url ,
78
- ...s ,
79
- } ) )
99
+ return ogSteps . map ( s => {
100
+ const step = transformStep ( {
101
+ prependOrigin : prependOrigin ,
102
+ ...s ,
103
+ } )
104
+ return {
105
+ zoom,
106
+ url,
107
+ children,
108
+ ...step ,
109
+ loadUrl : step . loadUrl || step . url || loadUrl ,
110
+ }
111
+ } )
80
112
}
81
- } , [ ogSteps , zoom , url , children , loadUrl ] )
113
+ } , [ ogSteps , zoom , url , children , loadUrl , prependOrigin ] )
82
114
}
83
115
84
- function Bar ( { url } : { url : string } ) {
116
+ function Bar ( {
117
+ url,
118
+ linkUrl,
119
+ } : {
120
+ url : string
121
+ linkUrl : string
122
+ } ) {
85
123
return (
86
124
< >
87
125
< FrameButtons />
88
126
< Back />
89
127
< Forward />
90
128
{ /* <Refresh /> */ }
91
129
< input value = { url } readOnly />
92
- < Open href = { url } />
130
+ < Open href = { linkUrl } />
93
131
</ >
94
132
)
95
133
}
96
134
135
+ function transformStep ( step : MiniBrowserStep ) {
136
+ const currentOrigin =
137
+ typeof window !== "undefined" ? window . origin : ""
138
+ const url =
139
+ step . url && step . prependOrigin === true
140
+ ? currentOrigin + step . url
141
+ : step . url
142
+ const loadUrl = step . loadUrl || url
143
+ return {
144
+ ...step ,
145
+ url,
146
+ loadUrl,
147
+ }
148
+ }
149
+
97
150
export { MiniBrowser }
0 commit comments