This client-side implementation provides a deterministic reference for customer login status in Shopify. Open the flems example by pressing the badge to see it in action:
https://flems.io/#0=N4IgtglgJlA2CmIBcB2AzAOgEwBoQDMIEBnZAbVADsBDMRJEDAK1LwGMB7SgF3h+RCdKxbgAJqABwmiAvKIAUASlkA+UcAA6lUaIRiATvGIBXWGLkByC1p17dHalAiUA5rNEWAMg6euM-621deDFOWA59YncyC0MoCxwPF0M+BIsJZwBrNIAjWGN4NIBPeFhwgHc0iOpXQsSLNiKahKT9aiKWiwALDm4Mymz67g4wamG02AgXLu5k+FT6qGp9TLyCiwBdLRtRAHpd0TAMQwBHApF5C13jfVgLRQxuLr55QyiZNTfTc1E3xR2hCJRM5ePoAG7UWDuYghACSPHg4Mh8iUqnUOx0OjCEWIGGIXQg+G4qIxmKOcTa5SUOwAvoksABWAAMigA3NsgjDuAAVCB0DjGYmoj7ooK2HzONyWACCsDAHBE-gCrNEpPJ8CglOpQTpogAjMyWRydFzefzBSjlCLNGLRGwEMt4aCIbB5CDES7-ravmZ3BYAOocDg9DgAQgsKvVmuoVK9Ol1aCZSa9O0M3Bu2htmNEYIg8HKSAUVpUpJ0oZ93FLmIA-IdLl09S1gKIREUEIXm9j9IWu8QyEyNqIaUPEuFHJK49nMYWwPXG4kK5OaVpl5QtEd5cYePIoBw2MY6DwMDkOFAiolJBIvSA8DCEGxuBAuKQGHq0Eg9QAWEA0jZ4SYDC+FAgDQdACJATz6EQAACsBjEY3A3iANywAIMx9MQSD7FuEiZC4GCcGAuwQV0UGwLB8EiEh3BFBI9AgMQbBQRIiG-jSQA |
https://flems.io/#0=N4IgtglgJlA2CmIBcA2FA6AzJgNCAzvAgMYAu8UyI6AFqWLCHgGYQL7IDaoAdgIZhESanQZMQxAPY9yMqgB58ANwDmAAmKw++fAF4AOiAhSea49IC0AJ3jMb+GobX5SATwQGQFixHxI1AKwADAAOAB4A3N7G-jZQEYYAfPqmavIAroRqYbAQPADWSDQ2zJ4AxCX2jiBqAPTJPPK1yioNiqoaWjqe5qa9FjSSgkkpammZ8Nm5BUUl5YPDNXVtzaptLZ3aeoa9ZiYWxDTwxPlgfFb5I6kZWTl5hcW25YfHp+eXNfUpTS0N38V-RoAQm8agAEgBRABKELUAEkAMpqACCADl4ajIVC4QAVCEAETUAGEAPIAGRJULU3jafDUj1KhjKTiksEkVk8ACNYOl4Fcxu11Jotj0TPyxuNbtMHnMmZV4A4nF9rqtWt9anxAfIQRZwdDYYi1CSAKpUhEABWxeOpFjaUAgSmcbg8hgA7tBSDQkEEIkcICo6N6IiFJPgIKQINIkHxOfhJDzyBFJEp4FZmGzXUVoFB4DxxYK1O6oJ7PEEnH6A6RS04XO54J4Q2GI1GY3GE3yQA0JWl8K4wJz406rJJ8vXDMR0lYbDIifH2U4lBB4K6AEKSMKltRBNQAJgALLu905oJ55YqamEGDxtiA6KQQkharVXS-0K7MOh2Spajugn-VeK3byCEfCemoUCeAAsjumBqHuSgoDQFgoJBACMu5BEoyE0CgaiQR+AToQAnHwRFqGR27buhqF7ugAAcAQWB+mAoGSMFqKhQRoRxe6wLRKAHrRLHImRFFbuJv7oHuZGoQEhjKkBzR9gOsBdhKijKYOLjDqOngTlOuakLObJWAuS6ruum7bvuh7HhBhgLB22RXjed4Pk+L6um+H5fj+f5BABnajN2aQgWB9kgPh5GwERFgAOzkWocVKKhqF8Duu7iVRFgZTuYIBOlmWURxOU5QAXnhZE7juABqqE7jhKVliACnqUp-bxmpAq9h1 |
import { | |
createHash, | |
createDecipheriv, | |
createCipheriv, | |
getHashes, | |
CipherCCMOptions | |
} from 'crypto'; | |
export declare type Algorithm = ( | |
'aes-256-cbc' | |
https://flems.io/#0=N4IgtglgJlA2CmIBcBGADGgNCAZhBAzsgNqgB2AhmIkiAHQAWALmLCNgMYD2ZT8vyECAC+mclRr0AVkU48+A2jgCuZDkwg8ABEy4ApAMoB5AHJaAFBDIAHZUwCUW4AB0yrrToBOATyev3HlrcZARMWjLaALxaVrZMAYFadJ7w1rAUHPDmAPTOec4A5AA+BdkA5phaYFqRAHxVxGgAujWR0QX5hVoA-FVaSFodIAX2CYHJqemZOc4g5t1InXRFxAB6+SBN9gBUs+WV1XVVE2kZWbmu+4OdZCOjZIkeJ1PnecQrq8R5TU3bRd9XPpHbLEL7OH7ZOh8ULmMCOHp9frHAhpCBMcwFTAjOhgCjWcwANwosGU8Bq9SJJPgY0eSRSp2m2VW5jyAHcANT2AAk2UqQy5KFmIxpj2eZxy6zmYKgdCanNmPIqgwFdzoUi4VgxWPs91pYsZ5mIFAAtAAvACCxoAWmhjQBOAD6xrlo2cBG2SEB-MFyGFD1F9JeOUWbu2hq5bOd8tDhsw32EWyuBUWIAFCoATH69YHxbyWaGwU0E-YkyrdQHJrnDSaLdanS68u7MF6FT7tSL9edDfG426Xd1ZuYmJ5SUUcMSCPBRlLG2JhN8XaWUFz01yAMxZx4i4IELgIOiwLhlcwRMjljwpJjKTwPQymOjWCieScn3dn-z+4RBChMDgMCxTn4-oeGMO57vAdDwJ4nhcJ45jwJUd4mHQoSeFYZQQDg3iWDYdiVGQyiwLAlTpjqADcYyXteDyxHYFHAVoATzmQzEfjuYTQkwBA1FoXz+tk2xaAAogAGuaACyAAKAAyQlaCgWjGloRgAEZSPA6haNsuT+gABsAOBcFwAyoehlQoOma4DAArAAbAA7JUKlGQgFBkEgw6kpUOCHj+qBoHQFlrpUXBqRpTADMA1gwdYSAFKZZBlJihnGeOsCTpgw4UPg6FINwYC4pgwjCLpcb8YJokSTJcnpopWjmtBFC+AAknwYDcayaL-s54 |
This is a basic client~side wishlist in around 2kb-ish for usage within Shopify themes (though it can be appropriated outside of that context). It uses localstorage to keep track of liked products and allows for shared URL to be generated for cross device support.
Open the flems example (click the badge) to see a live demo of it and play around.
{"r-b1b6f74f-dbde-42ad-bff3-e84eb77f3589":"N4IgNghgdg5grhGBTEAuUBnALhLLUCMANCFAPYAm+wAviQMZwBOTSUWa4AlgI5xcUQJKnnodUWJnCR0QXKAAc440ADcIYaZwA6UYAFIABGF78Ku3YcMQMGLjCiGMEALYKwSQwF5DAMw0YSBaOhly+hgqISAB0zGDePgDkAPSJllbWtvaOXBgA+mQKbN6Gif5ggWkhVjZ2DoYAFgJUjknllek1WfUQYlyqnklVVkgVQdWZdTn5hcVJktLDGbXZjc1zpQtIS11T1n0DJYkUTBAA7khMALS9WP3b6WwUYcG7q-J5Uh4YJe3j6WEIlFYkx4vQyOwIPIfikvkgMDtDHAoN8fpFkCCwRCcNDSsk4M5kIi3vUPnCfj4tp1DE9kajHlBnr5dPoaMEDIYAMSGcEuFxsLCGVnsoy8-nsIVsqDpAASozAZBFNMZYoFwulemA6TIACMAFZIMTRBRMQoAbUS6k02wAumaAAw242mhTpAA+fi4YDwTFQhgI9vt7s93sufsS2CY8hgSw9vi9Pr9VJCcYTYcMWHDvjIZCqNClwQAPA0kBAqEweZBbF5tCBwZD5Jcrr5NAJDFAIKodRAKzqdbWAHy6QvPVShCg10id7tMWuV2qT01naxcK70AWXQw6mBXM5NPCGM5XAP2iLXIMgIchQsQakNVi+SfJWvU+hVjCT8FgG7KMihHAmPQfj0Lu+6eL4GBXGAMARN+AAsZ5XBe1LYAAnh4k7Zuwu5IPYDSZoYAAcgYANyDtSABjADKAAqMoAKI0QAkgAwukhbJBAV5WIWGAuBoYLvp+ZDfhAv6wUh5ETLxkgQjBb4LrWX4-lgf4QVcfGGC41wAKxSRkGT2tEBDREG0nJJGcncYYHF8QJV7pBy3KSq8hgcqwjKbhGUBcAoRRYIiRBAqcLjhpG0aBVuOYeNAfp-NSQVQHALg6umJ4uRqVgcmhHgZQZ0QKbYbnUlYWFYBpXAAF5IH6J4KA |
EXPORT FROM DISCORD
Original score with help from the talented Dave Warrington.
I may have very well solved the version control paradigm for themes. It’s not possible in CI but publishing from local machines to your store/s is now roughly a 15s task. Quick little breakdown here:
As I’ve touched on before, I went down the versioning rabbit hole in an attempt to bring some sanity to this nexus. What I’ve come out on I think is pretty lean and does not get in the way. I’ve gone over a dozen ways to approach this but it feels as if this is now the final solution. Appropriating via CI shouldn’t be too difficult to apply. There are a couple commands which have relation to theme versioning and releases or better put “operations” for theme releases and publishing.
{% liquid | |
# ASSIGN CURRENCY CODE IF NOT PASSED | |
unless currency_code | |
assign currency_code = ' ' | append: cart.currency.iso_code | |
endunless | |
# ASSIGN CURRENCY SYMBOL IF NOT PASSED | |
unless currency_symbol | |
if cart.currency.iso_code != shop.currency.iso_code and currency_symbol contains '.' |
Shopify offers a rather fustrating solution for localization on the front-end and developers are likely at the behest of their slop served up as the "Geo" app... We are not animals. Anyway, this is a tiny little url parser to extract subfolder prefixes and provides determination for cases where you are employing your own solution and have a webshop operating multiple domains and/or targeting different markets using subfolders.
The typings will explain in rich detail each value in the closure. If you don't use TypeScript then maybe try acting like an adult.
Usage is simple, and only configuration required is setting you main domain, by default the function assumed your main domain is using a .com
extension, change this if it differs.