Skip to content

Commit 6339bbc

Browse files
authored
Merge pull request #410 from smalruby/feature/load-from-url-222
feat: add Load from URL menu item to File menu
2 parents d2fb8e9 + 1091bfb commit 6339bbc

File tree

14 files changed

+730
-8
lines changed

14 files changed

+730
-8
lines changed

src/components/gui/gui.jsx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import DragLayer from '../../containers/drag-layer.jsx';
3232
import ConnectionModal from '../../containers/connection-modal.jsx';
3333
import TelemetryModal from '../telemetry-modal/telemetry-modal.jsx';
3434
import BlockDisplayModal from '../../containers/block-display-modal.jsx';
35+
import URLLoaderModal from '../url-loader-modal/url-loader-modal.jsx';
3536

3637
import layout, {STAGE_SIZE_MODES} from '../../lib/layout-constants';
3738
import {resolveStageSize} from '../../lib/screen-utils';
@@ -121,6 +122,7 @@ const GUIComponent = props => {
121122
onShare,
122123
onShowPrivacyPolicy,
123124
onStartSelectingFileUpload,
125+
onStartSelectingUrlLoad,
124126
onTelemetryModalCancel,
125127
onTelemetryModalOptIn,
126128
onTelemetryModalOptOut,
@@ -132,6 +134,9 @@ const GUIComponent = props => {
132134
telemetryModalVisible,
133135
theme,
134136
tipsLibraryVisible,
137+
urlLoaderModalVisible,
138+
closeUrlLoaderModal,
139+
onUrlLoaderSubmit,
135140
vm,
136141
// Exclude Redux-related props from being passed to DOM
137142
setSelectedBlocks: _setSelectedBlocks,
@@ -187,6 +192,12 @@ const GUIComponent = props => {
187192
onShowPrivacyPolicy={onShowPrivacyPolicy}
188193
/>
189194
) : null}
195+
{urlLoaderModalVisible ? (
196+
<URLLoaderModal
197+
onRequestClose={closeUrlLoaderModal}
198+
onLoadUrl={onUrlLoaderSubmit}
199+
/>
200+
) : null}
190201
{loading ? (
191202
<Loader />
192203
) : null}
@@ -260,6 +271,7 @@ const GUIComponent = props => {
260271
onSeeCommunity={onSeeCommunity}
261272
onShare={onShare}
262273
onStartSelectingFileUpload={onStartSelectingFileUpload}
274+
onStartSelectingUrlLoad={onStartSelectingUrlLoad}
263275
onToggleLoginOpen={onToggleLoginOpen}
264276
/>
265277
<Box className={styles.bodyWrapper}>
@@ -466,6 +478,7 @@ GUIComponent.propTypes = {
466478
onShare: PropTypes.func,
467479
onShowPrivacyPolicy: PropTypes.func,
468480
onStartSelectingFileUpload: PropTypes.func,
481+
onStartSelectingUrlLoad: PropTypes.func,
469482
onTabSelect: PropTypes.func,
470483
onTelemetryModalCancel: PropTypes.func,
471484
onTelemetryModalOptIn: PropTypes.func,
@@ -480,6 +493,9 @@ GUIComponent.propTypes = {
480493
telemetryModalVisible: PropTypes.bool,
481494
theme: PropTypes.string,
482495
tipsLibraryVisible: PropTypes.bool,
496+
urlLoaderModalVisible: PropTypes.bool,
497+
closeUrlLoaderModal: PropTypes.func,
498+
onUrlLoaderSubmit: PropTypes.func,
483499
vm: PropTypes.instanceOf(VM).isRequired
484500
};
485501
GUIComponent.defaultProps = {

src/components/menu-bar/menu-bar.jsx

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,8 @@ class MenuBar extends React.Component {
188188
'handleKeyPress',
189189
'handleRestoreOption',
190190
'getSaveToComputerHandler',
191-
'restoreOptionMessage'
191+
'restoreOptionMessage',
192+
'handleClickLoadFromUrl'
192193
]);
193194
}
194195
componentDidMount () {
@@ -277,6 +278,11 @@ class MenuBar extends React.Component {
277278
}
278279
};
279280
}
281+
handleClickLoadFromUrl () {
282+
if (this.props.onStartSelectingUrlLoad) {
283+
this.props.onStartSelectingUrlLoad();
284+
}
285+
}
280286
restoreOptionMessage (deletedItem) {
281287
switch (deletedItem) {
282288
case 'Sprite':
@@ -504,6 +510,15 @@ class MenuBar extends React.Component {
504510
/>
505511
</MenuItem>
506512
)}</SB3Downloader>
513+
<MenuItem
514+
onClick={this.handleClickLoadFromUrl}
515+
>
516+
<FormattedMessage
517+
defaultMessage="Load from URL"
518+
description="Menu bar item for loading from URL"
519+
id="gui.menuBar.loadFromUrl"
520+
/>
521+
</MenuItem>
507522
</MenuSection>
508523
</MenuBarMenu>
509524
</div>
@@ -931,6 +946,7 @@ MenuBar.propTypes = {
931946
onSetTimeTravelMode: PropTypes.func,
932947
onShare: PropTypes.func,
933948
onStartSelectingFileUpload: PropTypes.func,
949+
onStartSelectingUrlLoad: PropTypes.func,
934950
onToggleLoginOpen: PropTypes.func,
935951
projectTitle: PropTypes.string,
936952
renderLogin: PropTypes.func,
Lines changed: 25 additions & 0 deletions
Loading
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
@import "../../css/colors.css";
2+
@import "../../css/units.css";
3+
4+
.modal-content {
5+
width: 500px;
6+
height: auto;
7+
line-height: 1.75;
8+
}
9+
10+
.header {
11+
background-color: $motion-primary;
12+
}
13+
14+
.body {
15+
background: $ui-white;
16+
padding: 1.5rem;
17+
display: flex;
18+
flex-direction: column;
19+
gap: 1.5rem;
20+
}
21+
22+
.promptSection {
23+
text-align: left;
24+
}
25+
26+
.promptText {
27+
font-size: 0.875rem;
28+
color: $text-primary;
29+
line-height: 1.5;
30+
}
31+
32+
.inputSection {
33+
display: flex;
34+
flex-direction: column;
35+
}
36+
37+
.urlInput {
38+
width: 100%;
39+
padding: 0.75rem;
40+
border: 2px solid $ui-black-transparent;
41+
border-radius: 0.25rem;
42+
font-size: 0.875rem;
43+
font-family: inherit;
44+
outline: none;
45+
box-sizing: border-box;
46+
}
47+
48+
.urlInput:focus {
49+
border-color: $motion-primary;
50+
box-shadow: 0 0 0 1px $motion-primary;
51+
}
52+
53+
.urlInput::placeholder {
54+
color: $text-primary-transparent;
55+
}
56+
57+
.urlInput.inputError {
58+
border-color: $error-primary;
59+
box-shadow: 0 0 0 1px $error-primary;
60+
}
61+
62+
.errorMessage {
63+
margin-top: 0.5rem;
64+
font-size: 0.75rem;
65+
color: $error-primary;
66+
line-height: 1.4;
67+
}
68+
69+
.buttonSection {
70+
display: flex;
71+
justify-content: flex-end;
72+
gap: 0.75rem;
73+
margin-top: 0.5rem;
74+
}
75+
76+
.cancelButton,
77+
.openButton {
78+
padding: 0.5rem 1rem;
79+
border: none;
80+
border-radius: 0.25rem;
81+
font-size: 0.875rem;
82+
font-weight: bold;
83+
cursor: pointer;
84+
transition: background-color 0.1s ease;
85+
min-width: 80px;
86+
}
87+
88+
.cancelButton {
89+
background: $ui-white;
90+
color: $text-primary;
91+
border: 1px solid $ui-black-transparent;
92+
}
93+
94+
.cancelButton:hover {
95+
background: $ui-secondary;
96+
}
97+
98+
.cancelButton:active {
99+
background: $ui-black-transparent;
100+
}
101+
102+
.openButton {
103+
background: $motion-primary;
104+
color: $ui-white;
105+
}
106+
107+
.openButton:hover:not(.disabled) {
108+
background: $motion-tertiary;
109+
}
110+
111+
.openButton:active:not(.disabled) {
112+
background: $motion-tertiary;
113+
}
114+
115+
.openButton.disabled {
116+
background: $ui-black-transparent;
117+
color: $text-primary-transparent;
118+
cursor: not-allowed;
119+
}

0 commit comments

Comments
 (0)