App bridge modal conditional loading Polaris web component issues

Hey,

I’m trying to replicate the customer segment picker modal. I’ve been using the new Polaris web components where possible.

If I conditionally render a Polaris web component it doesn’t seem to mount properly so loses all of its slot/styling.

The components is effectively something like this:

export function CustomerSegmentPickerModal () {
  const fetcher = useFetcher()
  
  return (
    <s-box>
      <Scrollable>
        {typeof fetcher.data !== "undefined" && fetcher.data.segments.length > 0 && (
          <s-box>
            {fetcher.data.segments.map(segment => {
              return (
                <s-clickable
                  key={segment.id}
                  inlineSize="100%"
                  onClick={() => {
                    setDraftSelectedCustomerSegments(draftSelectedCustomerSegments => {
                      if (draftSelectedCustomerSegments.some(draftSegment => draftSegment.id === segment.id)) {
                        return draftSelectedCustomerSegments.filter(draftSegment => draftSegment.id !== segment.id);
                      }

                      return [
                        ...draftSelectedCustomerSegments,
                        segment,
                      ];
                    });
                  }}
                >
                  <s-box
                    padding="small-200 base"
                    borderWidth="none none base none"
                    borderColor="subdued"
                  >
                    <InlineStack wrap={false} gap="300">
                      <Checkbox
                        label={segment.name}
                        labelHidden
                        checked={draftSelectedCustomerSegments.some(draftSegment => draftSegment.id === segment.id)}
                      />

                      <Text as="p">{segment.name}</Text>
                    </InlineStack>
                  </s-box>
                </s-clickable>
              );
            })}
          </s-box>
        )}

        {typeof fetcher.data !== "undefined" && fetcher.data.segments.length === 0 && query !== "" && (
          <s-box padding="base" inlineSize="100%">
            <Text as="p" tone="subdued">No results found for "<Text as="span" tone="base">{query}</Text>"</Text>
          </s-box>
        )}
      </Scrollable>
    </s-box> 
  )
}

On mount:

After search:

After clearing search:

hey just use the picker ressource instead of building a custom one.

Thats missing a ton of functionality like being able to have the items be refetched on search amongst other things

1 Like

Yes, this limitation to refetch elements based on search make the native picker unusable on many cases. Could this be improved? :slight_smile: