Webhooks for the AT Protocol airglow.run
atproto atprotocol automation webhook
12
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: better placeholders logic

Hugo 5042e72e d1d19ae0

+64 -70
+1
app/islands/AutomationForm.css.ts
··· 566 566 export const collapsibleDetails = style({ 567 567 border: `1px solid ${vars.color.border}`, 568 568 borderRadius: radii.md, 569 + backgroundColor: vars.color.surface, 569 570 minWidth: 0, 570 571 }); 571 572
+63 -70
app/islands/AutomationForm.tsx
··· 1342 1342 [previewPayload, isEdit], 1343 1343 ); 1344 1344 1345 - const actionResultPlaceholders = actions.flatMap((a, i) => 1346 - isRecordProducingAction(a.type) 1347 - ? [ 1348 - `action${i + 1}.uri`, 1349 - `action${i + 1}.cid`, 1350 - `action${i + 1}.did`, 1351 - `action${i + 1}.collection`, 1352 - `action${i + 1}.rkey`, 1353 - ] 1354 - : [], 1355 - ); 1356 - 1357 1345 // Catalogue-tile identity: follows split into follow-<target> so per-tile 1358 1346 // "#N" counters don't collapse the three tiles into one group. 1359 1347 const actionTypeKeys = actions.map((a) => ··· 1376 1364 `${f.name}.rkey`, 1377 1365 `${f.name}.record.*`, 1378 1366 ]), 1379 - ...actionResultPlaceholders, 1367 + ...actions.flatMap((a, i) => 1368 + isRecordProducingAction(a.type) 1369 + ? [ 1370 + `action${i + 1}.uri`, 1371 + `action${i + 1}.cid`, 1372 + `action${i + 1}.did`, 1373 + `action${i + 1}.collection`, 1374 + `action${i + 1}.rkey`, 1375 + ] 1376 + : [], 1377 + ), 1380 1378 ]; 1381 1379 1382 1380 const conditionFields = [...BUILTIN_CONDITION_FIELDS, ...fields]; ··· 1551 1549 <span class={s.hint}>Run this automation when a record is...</span> 1552 1550 </div> 1553 1551 1554 - {allPlaceholders.length > 0 && ( 1552 + {NSID_RE.test(lexicon) && ( 1555 1553 <details class={s.collapsibleDetails}> 1556 1554 <summary class={s.collapsibleSummary}>Available placeholders</summary> 1557 1555 <div class={s.collapsibleContent}> ··· 1595 1593 </div> 1596 1594 )} 1597 1595 1598 - {fetches.some((f) => f.name) && ( 1599 - <div class={s.placeholderGroup}> 1600 - <div class={s.placeholderGroupTitle}>Data sources</div> 1601 - {fetches 1602 - .filter((f) => f.name) 1603 - .flatMap((f) => [ 1604 - <CopyPlaceholder key={`${f.name}.uri`} value={`${f.name}.uri`} />, 1605 - <CopyPlaceholder key={`${f.name}.cid`} value={`${f.name}.cid`} />, 1606 - <CopyPlaceholder key={`${f.name}.did`} value={`${f.name}.did`}> 1607 - <span class={s.placeholderDesc}>owner DID</span> 1608 - </CopyPlaceholder>, 1609 - <CopyPlaceholder 1610 - key={`${f.name}.collection`} 1611 - value={`${f.name}.collection`} 1612 - />, 1613 - <CopyPlaceholder key={`${f.name}.rkey`} value={`${f.name}.rkey`} />, 1614 - <CopyPlaceholder key={`${f.name}.record`} value={`${f.name}.record.*`}> 1615 - <span class={s.placeholderDesc}>access nested fields</span> 1616 - </CopyPlaceholder>, 1617 - ])} 1618 - </div> 1619 - )} 1620 - 1621 - {actionResultPlaceholders.length > 0 && ( 1622 - <div class={s.placeholderGroup}> 1623 - <div class={s.placeholderGroupTitle}>Action results</div> 1624 - <span class={s.hint}> 1625 - Results from preceding actions (available in subsequent actions). 1626 - </span> 1627 - {actions.map((a, i) => 1628 - isRecordProducingAction(a.type) ? ( 1629 - <div key={i}> 1630 - <CopyPlaceholder value={`action${i + 1}.uri`}> 1631 - <span class={s.placeholderDesc}>AT URI from Action {i + 1}</span> 1632 - </CopyPlaceholder> 1633 - <CopyPlaceholder value={`action${i + 1}.cid`}> 1634 - <span class={s.placeholderDesc}>Content hash from Action {i + 1}</span> 1635 - </CopyPlaceholder> 1636 - <CopyPlaceholder value={`action${i + 1}.did`}> 1637 - <span class={s.placeholderDesc}>Owner DID from Action {i + 1}</span> 1638 - </CopyPlaceholder> 1639 - <CopyPlaceholder value={`action${i + 1}.collection`}> 1640 - <span class={s.placeholderDesc}>Collection from Action {i + 1}</span> 1641 - </CopyPlaceholder> 1642 - <CopyPlaceholder value={`action${i + 1}.rkey`}> 1643 - <span class={s.placeholderDesc}>Record key from Action {i + 1}</span> 1644 - </CopyPlaceholder> 1645 - </div> 1646 - ) : null, 1647 - )} 1648 - </div> 1649 - )} 1650 - 1651 1596 <div class={s.placeholderGroup}> 1652 1597 <div class={s.placeholderGroupTitle}>Automation</div> 1653 1598 <CopyPlaceholder value="automation.id"> ··· 1820 1765 <input 1821 1766 class={s.input} 1822 1767 type="text" 1823 - placeholder="e.g. alreadyFollow" 1768 + placeholder="e.g. likedPost, publication, alreadyFollow, ..." 1824 1769 value={f.name} 1825 1770 onInput={(e: Event) => 1826 1771 updateFetch(i, "name", (e.target as HTMLInputElement).value) ··· 1872 1817 /> 1873 1818 <span class={s.hint}> 1874 1819 Supports <code class={s.inlineCode}>{"{{event.*}}"}</code>,{" "} 1875 - <code class={s.inlineCode}>{"{{self}}"}</code>, and{" "} 1876 - <code class={s.inlineCode}>{"{{now}}"}</code>. 1820 + <code class={s.inlineCode}>{"{{self}}"}</code>. 1877 1821 </span> 1878 1822 </div> 1879 1823 </div> ··· 2080 2024 } 2081 2025 /> 2082 2026 </div> 2027 + 2028 + {f.name && ( 2029 + <details class={s.collapsibleDetails}> 2030 + <summary class={s.collapsibleSummary}> 2031 + Placeholders from <code class={s.inlineCode}>{f.name}</code> 2032 + </summary> 2033 + <div class={s.collapsibleContent}> 2034 + <div class={s.placeholderGroup}> 2035 + <CopyPlaceholder value={`${f.name}.uri`} /> 2036 + <CopyPlaceholder value={`${f.name}.cid`} /> 2037 + <CopyPlaceholder value={`${f.name}.did`}> 2038 + <span class={s.placeholderDesc}>owner DID</span> 2039 + </CopyPlaceholder> 2040 + <CopyPlaceholder value={`${f.name}.collection`} /> 2041 + <CopyPlaceholder value={`${f.name}.rkey`} /> 2042 + <CopyPlaceholder value={`${f.name}.record.*`}> 2043 + <span class={s.placeholderDesc}>access nested fields</span> 2044 + </CopyPlaceholder> 2045 + </div> 2046 + </div> 2047 + </details> 2048 + )} 2083 2049 </div> 2084 2050 ))} 2085 2051 <button type="button" class={s.addBtn} onClick={addFetch}> ··· 2146 2112 }) 2147 2113 } 2148 2114 /> 2115 + {isRecordProducingAction(action.type) && ( 2116 + <details class={s.collapsibleDetails}> 2117 + <summary class={s.collapsibleSummary}> 2118 + Placeholders from <code class={s.inlineCode}>action{i + 1}</code>{" "} 2119 + <span class={s.hint}>(available in following actions)</span> 2120 + </summary> 2121 + <div class={s.collapsibleContent}> 2122 + <div class={s.placeholderGroup}> 2123 + <CopyPlaceholder value={`action${i + 1}.uri`}> 2124 + <span class={s.placeholderDesc}>AT URI</span> 2125 + </CopyPlaceholder> 2126 + <CopyPlaceholder value={`action${i + 1}.cid`}> 2127 + <span class={s.placeholderDesc}>Content hash</span> 2128 + </CopyPlaceholder> 2129 + <CopyPlaceholder value={`action${i + 1}.did`}> 2130 + <span class={s.placeholderDesc}>Owner DID</span> 2131 + </CopyPlaceholder> 2132 + <CopyPlaceholder value={`action${i + 1}.collection`}> 2133 + <span class={s.placeholderDesc}>Collection NSID</span> 2134 + </CopyPlaceholder> 2135 + <CopyPlaceholder value={`action${i + 1}.rkey`}> 2136 + <span class={s.placeholderDesc}>Record key</span> 2137 + </CopyPlaceholder> 2138 + </div> 2139 + </div> 2140 + </details> 2141 + )} 2149 2142 </div> 2150 2143 ); 2151 2144 })}