| @@ -16,24 +16,28 @@ | ||
| 16 | 16 | }, |
| 17 | 17 | imageCredits: { |
| 18 | 18 | remaining: 10, |
| 19 | 19 | total: 10, |
| 20 | - refresh: undefined, | |
| 21 | 20 | }, |
| 22 | 21 | }; |
| 23 | -const store = (set) => ({ | |
| 22 | +const store = (set, get) => ({ | |
| 24 | 23 | ...startingState, |
| 25 | 24 | ...safeParseJson(window.extSharedData?.globalState)?.state, |
| 26 | - updateImageCredits({ remaining, total, refresh }) { | |
| 27 | - set((state) => ({ | |
| 28 | - imageCredits: { | |
| 29 | - ...state.imageCredits, | |
| 30 | - // Only update truthy values | |
| 31 | - ...(remaining && { remaining }), | |
| 32 | - ...(total && { total }), | |
| 33 | - ...(refresh && { refresh }), | |
| 34 | - }, | |
| 35 | - })); | |
| 25 | + updateImageCredits({ remaining, total }) { | |
| 26 | + const current = get().imageCredits; | |
| 27 | + const next = { | |
| 28 | + ...current, | |
| 29 | + // A reported 0 has to survive the merge. | |
| 30 | + ...(remaining != null && { remaining }), | |
| 31 | + ...(total != null && { total }), | |
| 32 | + }; | |
| 33 | + | |
| 34 | + // Every set() costs a WP option write through the persist adapter. | |
| 35 | + if (next.remaining === current.remaining && next.total === current.total) { | |
| 36 | + return; | |
| 37 | + } | |
| 38 | + | |
| 39 | + set({ imageCredits: next }); | |
| 36 | 40 | }, |
| 37 | 41 | subtractOneCredit() { |
| 38 | 42 | set((state) => ({ |
| 39 | 43 | imageCredits: { |
| @@ -38,15 +42,10 @@ | ||
| 38 | 42 | set((state) => ({ |
| 39 | 43 | imageCredits: { |
| 40 | 44 | ...state.imageCredits, |
| 41 | 45 | remaining: state.imageCredits.remaining - 1, |
| 42 | - // set to 24 hours from now (in ms) | |
| 43 | - refresh: new Date(Date.now() + 24 * 60 * 60 * 1000).getTime(), | |
| 44 | 46 | }, |
| 45 | 47 | })); |
| 46 | - }, | |
| 47 | - resetImageCredits() { | |
| 48 | - set({ imageCredits: startingState.imageCredits }); | |
| 49 | 48 | }, |
| 50 | 49 | setAiImageOption(option, value) { |
| 51 | 50 | set((state) => ({ |
| 52 | 51 | aiImageOptions: { ...state.aiImageOptions, [option]: value }, |