Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,32 @@
.arrow-container {
display: flex;
align-items: center;
}

[dir="ltr"] .arrow-container {
margin-right: -7px;
}

.arrow-container-left {
[dir="rtl"] .arrow-container {
margin-left: -7px;
}

[dir="ltr"] .arrow-container-left {
margin-right: -7px;
}

.arrow-container-right {
[dir="rtl"] .arrow-container-left {
margin-left: -7px;
}

[dir="ltr"] .arrow-container-right {
margin-left: -7px;
}

[dir="rtl"] .arrow-container-right {
margin-right: -7px;
}

.body {
padding: 1rem 1.5rem;
border-radius: 0.5rem;
Expand Down Expand Up @@ -55,14 +70,22 @@
margin: auto;
}

.button-row button.ok-button {
[dir="ltr"] .button-row button.ok-button {
margin-left: 0;
}

.button-row button.cancel-button {
[dir="rtl"] .button-row button.ok-button {
margin-right: 0;
}

[dir="ltr"] .button-row button.cancel-button {
margin-right: 0;
}

[dir="rtl"] .button-row button.cancel-button {
margin-left: 0;
}

.message {
margin-top: 0.25rem;
}
Expand All @@ -71,4 +94,3 @@
height: 1.5rem;
width: 1.5rem;
}

Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@
onOk,
modalPosition,
entityType,
relativeElemRef
relativeElemRef,
isRtl
}) => {
const intl = useIntl();
const modalPositionValues = calculateModalPosition(relativeElemRef, modalPosition);
Expand Down Expand Up @@ -119,12 +120,15 @@
contentLabel={intl.formatMessage(messages.confirmDeletionHeading)}
onRequestClose={onCancel}
>
<Box className={styles.modalContainer}>
{ modalPosition === 'right' ?
<Box
className={styles.modalContainer}
dir={isRtl ? 'rtl' : 'ltr'}
>
{((modalPosition === 'right' && !isRtl) || (modalPosition === 'left' && isRtl)) ?
<Box className={classNames(styles.arrowContainer, styles.arrowContainerLeft)}>
<img
className={styles.deleteIcon}
src={arrowLeftIcon}
src={isRtl ? arrowRightIcon : arrowLeftIcon}
/>
</Box> : null }
<Box className={styles.body}>
Expand Down Expand Up @@ -160,11 +164,11 @@
</button>
</Box>
</Box>
{modalPosition === 'left' ?
{((modalPosition === 'left' && !isRtl) || (modalPosition === 'right' && isRtl)) ?
<Box className={classNames(styles.arrowContainer, styles.arrowContainerRight)}>
<img
className={styles.deleteIcon}
src={arrowRightIcon}
src={isRtl ? arrowLeftIcon : arrowRightIcon}
/>
</Box> : null }
</Box>
Expand All @@ -174,9 +178,10 @@
DeleteConfirmationPrompt.propTypes = {
onOk: PropTypes.func.isRequired,
onCancel: PropTypes.func.isRequired,
relativeElemRef: PropTypes.object,

Check warning on line 181 in packages/scratch-gui/src/components/delete-confirmation-prompt/delete-confirmation-prompt.jsx

View workflow job for this annotation

GitHub Actions / Test scratch-gui

Prop type "object" is forbidden
entityType: PropTypes.string,
modalPosition: PropTypes.string
modalPosition: PropTypes.string,
isRtl: PropTypes.bool
};

export default DeleteConfirmationPrompt;
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ const SpriteList = function (props) {
ordering,
raised,
selectedId,
items
items,
isRtl
} = props;

const isSpriteDrag = draggingType === DragConstants.SPRITE;
Expand Down Expand Up @@ -95,7 +96,7 @@ const SpriteList = function (props) {
onDuplicateButtonClick={onDuplicateSprite}
onExportButtonClick={onExportSprite}
withDeleteConfirmation
deleteConfirmationModalPosition={'left'}
deleteConfirmationModalPosition={isRtl ? 'right' : 'left'}
/>
</SortableAsset>
);
Expand Down Expand Up @@ -134,7 +135,8 @@ SpriteList.propTypes = {
onSelectSprite: PropTypes.func,
ordering: PropTypes.arrayOf(PropTypes.number),
raised: PropTypes.bool,
selectedId: PropTypes.string
selectedId: PropTypes.string,
isRtl: PropTypes.bool
};

export default SortableHOC(SpriteList);
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ const SpriteSelectorComponent = function (props) {
onDuplicateSprite={onDuplicateSprite}
onExportSprite={onExportSprite}
onSelectSprite={onSelectSprite}
isRtl={isRtl(intl.locale)}
/>
<ActionMenu
className={styles.addButton}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import React from 'react';
import PropTypes from 'prop-types';
import {connect} from 'react-redux';

import DeleteConfirmationPromptComponent from '../components/delete-confirmation-prompt/delete-confirmation-prompt.jsx';

const DeleteConfirmationPrompt = props => (
<DeleteConfirmationPromptComponent {...props} />
);

DeleteConfirmationPrompt.propTypes = {
isRtl: PropTypes.bool,
onCancel: PropTypes.func.isRequired,
onOk: PropTypes.func.isRequired,
modalPosition: PropTypes.string,
entityType: PropTypes.string.isRequired,
relativeElemRef: PropTypes.object.isRequired
};

const mapStateToProps = state => ({
isRtl: state.locales.isRtl
});

export default connect(
mapStateToProps
)(DeleteConfirmationPrompt);
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import getCostumeUrl from '../lib/get-costume-url';
import DragRecognizer from '../lib/drag-recognizer';
import {getEventXY} from '../lib/touch-utils';
import {GUIStoragePropType} from '../gui-config';
import DeleteConfirmationPrompt from '../components/delete-confirmation-prompt/delete-confirmation-prompt.jsx';
import DeleteConfirmationPrompt from './delete-confirmation-prompt';

import SpriteSelectorItemComponent from '../components/sprite-selector-item/sprite-selector-item.jsx';

Expand Down Expand Up @@ -154,6 +154,7 @@ class SpriteSelectorItem extends React.PureComponent {
relativeElemRef={this.ref}
entityType={this.props.dragType}
modalPosition={deleteConfirmationModalPosition}
isRtl={this.props.isRtl}
/> : null}
<SpriteSelectorItemComponent
componentRef={this.setRef}
Expand Down Expand Up @@ -193,15 +194,17 @@ SpriteSelectorItem.propTypes = {
selected: PropTypes.bool,
withDeleteConfirmation: PropTypes.bool,
deleteConfirmationModalPosition: PropTypes.string,
vm: PropTypes.instanceOf(VM).isRequired
vm: PropTypes.instanceOf(VM).isRequired,
isRtl: PropTypes.bool
};

const mapStateToProps = (state, {id}) => ({
storage: state.scratchGui.config.storage,
dragging: state.scratchGui.assetDrag.dragging,
receivedBlocks: state.scratchGui.hoveredTarget.receivedBlocks &&
state.scratchGui.hoveredTarget.sprite === id,
vm: state.scratchGui.vm
vm: state.scratchGui.vm,
isRtl: state.locales.isRtl
});
const mapDispatchToProps = dispatch => ({
dispatchSetHoveredSprite: spriteId => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@ import VM from '@scratch/scratch-vm';

import SpriteSelectorItemContainer from '../../../src/containers/sprite-selector-item';
import {legacyConfig} from '../../../src/legacy-config';
import DeleteConfirmationPrompt from '../../../src/components/delete-confirmation-prompt/delete-confirmation-prompt.jsx';
import DeleteConfirmationPrompt from '../../../src/containers/delete-confirmation-prompt';
import {screen, fireEvent, waitFor} from '@testing-library/react';

global.MutationObserver = class {
disconnect () { }
observe () { }
};

jest.mock('../../../src/components/delete-confirmation-prompt/delete-confirmation-prompt.jsx', () => jest.fn(() => null));
jest.mock('../../../src/containers/delete-confirmation-prompt', () => jest.fn(() => null));
describe('SpriteSelectorItem Container', () => {
const mockStore = configureStore();
let className;
Expand Down Expand Up @@ -63,6 +63,9 @@ describe('SpriteSelectorItem Container', () => {
hoveredTarget: {receivedBlocks: false, sprite: null},
assetDrag: {dragging: false},
vm
},
locales: {
isRtl: false
}
});
});
Expand Down
Loading