Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Templates demo fixes #1168

Merged
merged 10 commits into from
Sep 20, 2024
74 changes: 35 additions & 39 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/snap-preact-demo/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
"@babel/preset-env": "^7.23.7",
"@babel/preset-react": "^7.23.3",
"@babel/runtime": "^7.23.7",
"@emotion/react": "11.13.0",
"@lhci/cli": "^0.13.0",
"@searchspring/browserslist-config-snap": "^1.0.6",
"babel-loader": "^9.1.2",
Expand Down
46 changes: 22 additions & 24 deletions packages/snap-preact-demo/snap/src/components/Content/Content.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { h, Component } from 'preact';
import { h } from 'preact';
import { observer } from 'mobx-react';

import { ThemeProvider, LoadingBar, defaultTheme, StoreProvider, ControllerProvider, SnapProvider } from '@searchspring/snap-preact/components';
Expand All @@ -11,29 +11,27 @@ type ContentProps = {
snap?: Snap;
};

@observer
export class Content extends Component<ContentProps> {
render() {
const store = this.props.controller.store;
const snap = this.props.snap;
const theme = snap?.templates?.themes.local.global.theme;
export const Content = observer(({ controller, snap }: ContentProps) => {
const store = controller.store;
const theme = snap?.templates?.themes.local.global.theme;

return (
<SnapProvider snap={snap}>
<ControllerProvider controller={this.props.controller}>
<ThemeProvider theme={theme || defaultTheme}>
<StoreProvider store={store}>
<div>
<LoadingBar active={store.loading} />
return (
<SnapProvider snap={snap}>
<ControllerProvider controller={controller}>
<ThemeProvider theme={theme || defaultTheme}>
<StoreProvider store={store}>
<div>
<LoadingBar active={store.loading} />

<Header />
<Header />

{store.pagination.totalResults ? <Results /> : store.pagination.totalResults === 0 && <NoResults />}
</div>
</StoreProvider>
</ThemeProvider>
</ControllerProvider>
</SnapProvider>
);
}
}
{store.pagination.totalResults ? <Results /> : store.pagination.totalResults === 0 && <NoResults />}
</div>
</StoreProvider>
</ThemeProvider>
</ControllerProvider>
</SnapProvider>
);
});

export default Content;
126 changes: 58 additions & 68 deletions packages/snap-preact-demo/snap/src/components/Finder/Finder.tsx
Original file line number Diff line number Diff line change
@@ -1,87 +1,77 @@
import { h, Component } from 'preact';
import { h } from 'preact';
import { observer } from 'mobx-react';

type FinderProps = {
controller?: FinderController;
};

@observer
export class Finder extends Component<FinderProps> {
render() {
const controller = this.props.controller;
const store = controller.store;
const { selections, loading, pagination } = store;
export const Finder = observer(({ controller }: FinderProps) => {
const store = controller.store;
const { selections, loading, pagination } = store;

return (
selections.length > 0 && (
<div className={`finder-container`}>
<div className="finder-wrapper">
{selections.map((selection) =>
controller.config.wrapSelect ? (
<div className="finder-column finder-dropdown form-select-wrapper">
<Dropdown selection={selection} store={store} loading={loading} />
</div>
) : (
return (
selections.length > 0 && (
<div className={`finder-container`}>
<div className="finder-wrapper">
{selections.map((selection) =>
controller.config.wrapSelect ? (
<div className="finder-column finder-dropdown form-select-wrapper" key={selection.id}>
<Dropdown selection={selection} store={store} loading={loading} />
)
)}
</div>
) : (
<Dropdown selection={selection} store={store} loading={loading} key={selection.id} />
)
)}

<span style={{ color: '#aaa', fontSize: '10px' }}>{` ${pagination.totalResults} results`}</span>
<span style={{ color: '#aaa', fontSize: '10px' }}>{` ${pagination.totalResults} results`}</span>

<div className="finder-column finder-button ss-shop">
<button
onClick={() => {
controller.find();
}}
disabled={loading}
className="button button--primary searchspring-finder_submit"
>
Shop Now
</button>
&nbsp;
<button
onClick={() => {
controller.reset();
}}
disabled={loading}
className="button button--primary searchspring-finder_reset"
>
Reset
</button>
</div>
<div className="finder-column finder-button ss-shop">
<button
onClick={() => {
controller.find();
}}
disabled={loading}
className="button button--primary searchspring-finder_submit"
>
Shop Now
</button>
&nbsp;
<button
onClick={() => {
controller.reset();
}}
disabled={loading}
className="button button--primary searchspring-finder_reset"
>
Reset
</button>
</div>
</div>
)
);
}
}
</div>
)
);
});

type DropdownProps = {
store: FinderController['store'];
selection: FinderController['store']['selections'][0];
loading: boolean;
};

@observer
class Dropdown extends Component<DropdownProps> {
render() {
const selection = this.props.selection;
const loading = this.props.loading;

return (
<select
className="form-input form-select form-input-short searchspring-finder_field"
onChange={(e: any) => {
selection.select(e.target.value);
}}
disabled={loading || selection.disabled}
>
{selection?.values?.map((value) => (
<option value={value.value} selected={selection.selected === value.value}>
{value.label} {value.count ? `(${value.count})` : ''}
</option>
))}
</select>
);
}
}
export const Dropdown = observer(({ selection, loading }: DropdownProps) => {
return (
<select
className="form-input form-select form-input-short searchspring-finder_field"
onChange={(e: any) => {
selection.select(e.target.value);
}}
disabled={loading || selection.disabled}
>
{selection?.values?.map((value) => (
<option value={value.value} selected={selection.selected === value.value} key={value.value}>
{value.label} {value.count ? `(${value.count})` : ''}
</option>
))}
</select>
);
});
16 changes: 7 additions & 9 deletions packages/snap-preact-demo/snap/src/components/Header/Header.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { h, Fragment, Component } from 'preact';
import { h, Fragment } from 'preact';
import { observer } from 'mobx-react';

import { withController } from '@searchspring/snap-preact/components';
Expand All @@ -7,13 +7,11 @@ type HeaderProps = {
controller?: SearchController;
};

@withController
@observer
export class Header extends Component<HeaderProps> {
render() {
const { pagination, search } = this.props.controller.store;
export const Header = withController(
observer(({ controller }: HeaderProps) => {
const { pagination, search } = controller.store;
const landingPage = controller.store.merchandising.landingPage;

const landingPage = this.props.controller.store.merchandising.landingPage;
return (
<header className="ss-header-container">
{landingPage ? (
Expand Down Expand Up @@ -60,5 +58,5 @@ export class Header extends Component<HeaderProps> {
)}
</header>
);
}
}
})
);
Loading
Loading