@@ -11,13 +11,16 @@ type MiniBrowserStep = {
1111 loadUrl ?: string
1212 children : React . ReactNode
1313 zoom ?: number
14+ prependOrigin ?: boolean
1415}
1516
1617type MiniBrowserProps = {
1718 progress ?: number
1819 backward ?: boolean
1920 url ?: string
2021 children : React . ReactNode
22+ loadUrl ?: string
23+ prependOrigin ?: boolean
2124 zoom ?: number
2225 steps ?: MiniBrowserStep [ ]
2326} & React . PropsWithoutRef < JSX . IntrinsicElements [ "div" ] >
@@ -35,11 +38,20 @@ function MiniBrowserWithRef(
3538 backward = false ,
3639 zoom = 1 ,
3740 steps : ogSteps ,
41+ loadUrl,
42+ prependOrigin,
3843 ...props
3944 } : MiniBrowserProps ,
4045 ref : React . Ref < HTMLIFrameElement >
4146) {
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+
4355 const stepIndex = backward
4456 ? Math . floor ( progress )
4557 : Math . ceil ( progress )
@@ -49,7 +61,12 @@ function MiniBrowserWithRef(
4961 { ...props }
5062 zoom = { currentStep . zoom }
5163 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+ }
5370 >
5471 { currentStep . children || (
5572 < iframe
@@ -64,34 +81,70 @@ function MiniBrowserWithRef(
6481
6582function useSteps (
6683 ogSteps : MiniBrowserStep [ ] | undefined ,
67- { zoom , url , children , loadUrl = url } : MiniBrowserStep
84+ ogDefaults : MiniBrowserStep
6885) {
86+ const defaults = transformStep ( ogDefaults )
87+ const {
88+ zoom,
89+ url,
90+ children,
91+ loadUrl,
92+ prependOrigin,
93+ } = defaults
94+
6995 return React . useMemo ( ( ) => {
7096 if ( ! ogSteps ) {
71- return [ { zoom , url , children , loadUrl } ]
97+ return [ defaults ]
7298 } 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+ } )
80112 }
81- } , [ ogSteps , zoom , url , children , loadUrl ] )
113+ } , [ ogSteps , zoom , url , children , loadUrl , prependOrigin ] )
82114}
83115
84- function Bar ( { url } : { url : string } ) {
116+ function Bar ( {
117+ url,
118+ linkUrl,
119+ } : {
120+ url : string
121+ linkUrl : string
122+ } ) {
85123 return (
86124 < >
87125 < FrameButtons />
88126 < Back />
89127 < Forward />
90128 { /* <Refresh /> */ }
91129 < input value = { url } readOnly />
92- < Open href = { url } />
130+ < Open href = { linkUrl } />
93131 </ >
94132 )
95133}
96134
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+
97150export { MiniBrowser }
0 commit comments