feat: add freelancer dashboard UI with earnings and escrow summary #7
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Issue Linking Validation | |
| on: | |
| pull_request: | |
| types: [opened, edited, synchronize] | |
| permissions: | |
| pull-requests: write | |
| contents: read | |
| jobs: | |
| validate-issue-linking: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Validate Issue Linking | |
| uses: actions/github-script@v7 | |
| with: | |
| script: | | |
| const pr = context.payload.pull_request; | |
| const body = pr.body || ''; | |
| // Check for issue references in multiple formats | |
| // Matches: #123, fixes #123, closes #123, resolves #123 | |
| const issuePattern = /(fixes|closes|resolves|fix|close|resolve)?\s*#\d+/gi; | |
| const matches = body.match(issuePattern); | |
| if (!matches || matches.length === 0) { | |
| core.setFailed(' PR must reference at least one issue'); | |
| return; | |
| } | |
| // Extract issue numbers | |
| const issueNumbers = [...new Set( | |
| body.match(/#\d+/g).map(m => m.substring(1)) | |
| )]; | |
| // Verify issues exist | |
| for (const issueNum of issueNumbers) { | |
| try { | |
| await github.rest.issues.get({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| issue_number: issueNum | |
| }); | |
| } catch (error) { | |
| core.setFailed(` Issue #${issueNum} does not exist or is not accessible`); | |
| return; | |
| } | |
| } | |
| core.info(` PR correctly links to issue(s): ${issueNumbers.map(n => '#' + n).join(', ')}`); | |
| // Add linked issues as comment | |
| github.rest.issues.createComment({ | |
| issue_number: context.issue.number, | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| body: ` Issue linking validated! This PR references: ${issueNumbers.map(n => '#' + n).join(', ')}` | |
| }); | |
| - name: Comment on linking validation failure | |
| if: failure() | |
| uses: actions/github-script@v7 | |
| with: | |
| script: | | |
| const body = '### Issue Linking Validation Failed \n\n' + | |
| 'This PR must reference at least one issue from the repository.\n\n' + | |
| '**How to Link Issues:**\n\n' + | |
| 'Add one of these keywords followed by the issue number in your PR description:\n' + | |
| '- `fixes #123`\n' + | |
| '- `closes #123`\n' + | |
| '- `resolves #123`\n' + | |
| '- `fix #123`\n' + | |
| '- `close #123`\n' + | |
| '- `resolve #123`\n\n' + | |
| '**Examples:**\n' + | |
| '```\n' + | |
| '## What\n' + | |
| 'This PR adds user authentication feature.\n\n' + | |
| '## Why\n' + | |
| 'Resolves #42 - Users need a secure login system\n\n' + | |
| '## How\n' + | |
| 'Implemented JWT-based authentication using...\n' + | |
| '```\n\n' + | |
| '**Multiple Issues:**\n' + | |
| 'You can reference multiple issues:\n' + | |
| '```\n' + | |
| 'Fixes #42, #43 and resolves #45\n' + | |
| '```\n\n' + | |
| 'Please update your PR description to include an issue reference.'; | |
| github.rest.issues.createComment({ | |
| issue_number: context.issue.number, | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| body: body | |
| }); |