Skip to content

Commit

Permalink
Merge pull request #2407 from Shopify/njo/pos-print
Browse files Browse the repository at this point in the history
Add PrintApi and PrintPreview to point-of-sale
  • Loading branch information
NathanJolly authored Oct 15, 2024
2 parents f6ad560 + 87761cb commit b81476d
Show file tree
Hide file tree
Showing 16 changed files with 234 additions and 6 deletions.
1 change: 1 addition & 0 deletions packages/ui-extensions-react/src/surfaces/point-of-sale.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ export type {
PinLength,
PinPadActionType,
PinPadProps,
PrintPreviewProps,
RadioButtonListProps,
ScreenPresentationProps,
SecondaryActionProps,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export {List} from './components/List/List';
export {Navigator} from './components/Navigator/Navigator';
export {NumberField} from './components/NumberField/NumberField';
export {PinPad} from './components/PinPad/PinPad';
export {PrintPreview} from './components/PrintPreview/PrintPreview';
export {POSBlock} from './components/POSBlock/POSBlock';
export {POSBlockRow} from './components/POSBlock/POSBlockRow';
export {RadioButtonList} from './components/RadioButtonList/RadioButtonList';
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import {
PrintPreview as BasePrintPreview,
PrintPreviewProps,
} from '@shopify/ui-extensions/point-of-sale';
import {createRemoteReactComponent} from '@remote-ui/react';

export const PrintPreview = createRemoteReactComponent<
typeof BasePrintPreview,
PrintPreviewProps
>(BasePrintPreview);
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import {ReferenceEntityTemplateSchema} from '@shopify/generate-docs';
import {generateCodeBlock} from '../helpers/generateCodeBlock';

const generateCodeBlockForPrintApi = (title: string, fileName: string) =>
generateCodeBlock(title, 'print-api', fileName);

const data: ReferenceEntityTemplateSchema = {
name: 'Print API',
description: `
The Print API provides access to printing functionality.
`,
isVisualComponent: false,
type: 'APIs',
definitions: [
{
title: 'PrintApi',
description: '',
type: 'PrintApiContent',
},
],
category: 'APIs',
related: [
{
name: 'PrintPreview Component',
subtitle: 'See how to use the Print API with a PrintPreview.',
url: '/api/pos-ui-extensions/components/printpreview',
},
],
examples: {
description: 'Examples of using the Print API',
examples: [
{
codeblock: generateCodeBlockForPrintApi(
'Print directly from the tile',
'print',
),
},
],
},
};

export default data;
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import {ReferenceEntityTemplateSchema} from '@shopify/generate-docs';
import {generateCodeBlock} from '../helpers/generateCodeBlock';

const generateCodeBlockForPrintPreview = (title: string, fileName: string) =>
generateCodeBlock(title, 'print-preview', fileName);

const data: ReferenceEntityTemplateSchema = {
name: 'PrintPreview',
description: 'Renders a `PrintPreview`.',
isVisualComponent: true,
type: 'component',
definitions: [
{
title: 'PrintPreview',
description: '',
type: 'PrintPreviewProps',
},
],
category: 'Components',
related: [
{
name: 'Print API',
subtitle: 'See how to use the Print API.',
url: '/api/pos-ui-extensions/apis/print-api',
},
],
defaultExample: {
codeblock: generateCodeBlockForPrintPreview(
'Render a PrintPreview and a button for printing',
'default.example',
),
},
};

export default data;
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import {Tile, extension} from '@shopify/ui-extensions/point-of-sale';

export default extension('pos.home.tile.render', (root, api) => {
const tile = root.createComponent(Tile, {
title: 'My app',
subtitle: 'Hello world!',
enabled: true,
onPress: () => {
api.print.print('/documents/test-print');
},
});

root.append(tile);
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import React from 'react';
import {
Tile,
reactExtension,
useApi,
} from '@shopify/ui-extensions-react/point-of-sale';

const TileComponent = () => {
const api = useApi();
return (
<Tile
title="My app"
subtitle="Hello world!"
onPress={() => {
api.print.print('documents/test-print');
}}
enabled
/>
);
};

export default reactExtension('pos.home.tile.render', () => {
return <TileComponent />;
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import {
Button,
PrintPreview,
Screen,
extension,
} from '@shopify/ui-extensions/point-of-sale';

export default extension(
'pos.home.modal.render',
(root, api) => {
const homeScreen = root.createComponent(
Screen,
{
name: 'Home',
title: 'Home',
},
);

const printButton = root.createComponent(
Button,
{
title: 'Print',
onPress: api.print.print,
},
);

const printPreview = root.createComponent(
PrintPreview,
{
src: '/documents/test-print',
},
);

homeScreen.append(printPreview);

root.append(homeScreen);
},
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import React from 'react';

import {
Screen,
reactExtension,
Button,
useApi,
} from '@shopify/ui-extensions-react/point-of-sale';

const Modal = () => {
const api = useApi<'pos.home.modal.render'>();

return (
<Screen name="Home" title="Home">
<Button
title="Print"
onPress={api.print.print}
/>
<PrintPreview src="/documents/test-print" />
</Screen>
);
};

export default reactExtension(
'pos.home.modal.render',
() => <Modal />,
);
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ Refer to the [migration guide](/docs/api/pos-ui-extensions/migrating) for more i
### Features
- Removed \`customValidator\` prop from the [FormattedTextField](/docs/api/pos-ui-extensions/apis/formatted-text-field) component.
- Added [PrintApi](/docs/api/pos-ui-extensions/apis/print-api) and a [PrintPreview](/docs/api/pos-ui-extensions/components/printpreview) component.
`,
},
{
Expand Down
2 changes: 2 additions & 0 deletions packages/ui-extensions/src/surfaces/point-of-sale/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ export type {
DraftOrderApiContent,
} from './api/draft-order-api/draft-order-api';

export type {PrintApi, PrintApiContent} from './api/print-api/print-api';

export type {
PaginationParams,
ProductSortType,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/**
* Access the print API for printing functionality
*/
export interface PrintApiContent {
/** Trigger a print dialog
* @param src the source to print. Omit to use the current PrintPreview contents.
*/
print(src?: string): void;
}

/**
* Interface for printing
*/
export interface PrintApi {
print: PrintApiContent;
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
import type {ConnectivityApi} from '../connectivity-api/connectivity-api';
import type {DeviceApi} from '../device-api/device-api';
import type {LocaleApi} from '../locale-api/locale-api';
import type {SessionApi} from '../session-api/session-api';
import type {ToastApi} from '../toast-api/toast-api';
import type {ProductSearchApi} from '../product-search-api/product-search-api';
import {ConnectivityApi} from '../connectivity-api/connectivity-api';
import {DeviceApi} from '../device-api/device-api';
import {LocaleApi} from '../locale-api/locale-api';
import {SessionApi} from '../session-api/session-api';
import {ToastApi} from '../toast-api/toast-api';
import {ProductSearchApi} from '../product-search-api/product-search-api';
import {PrintApi} from '../print-api/print-api';

export type StandardApi<T> = {[key: string]: any} & {
extensionPoint: T;
} & LocaleApi &
ToastApi &
SessionApi &
PrintApi &
ProductSearchApi &
DeviceApi &
ConnectivityApi;
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ export {POSBlock} from './components/POSBlock/POSBlock';
export type {POSBlockProps} from './components/POSBlock/POSBlock';
export {POSBlockRow} from './components/POSBlock/POSBlockRow';
export type {POSBlockRowProps} from './components/POSBlock/POSBlockRow';
export {PrintPreview} from './components/PrintPreview/PrintPreview';
export type {PrintPreviewProps} from './components/PrintPreview/PrintPreview';
export {RadioButtonList} from './components/RadioButtonList/RadioButtonList';
export type {RadioButtonListProps} from './components/RadioButtonList/RadioButtonList';
export {Screen} from './components/Screen/Screen';
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import {createRemoteComponent} from '@remote-ui/core';

export interface PrintPreviewProps {
/**
* The source to print.
*/
src: string;
}

export const PrintPreview = createRemoteComponent<
'PrintPreview',
PrintPreviewProps
>('PrintPreview');

0 comments on commit b81476d

Please sign in to comment.